UNPKG

react-native-localize

Version:

A toolbox for your React Native app localization.

189 lines (188 loc) 6.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.usesMetricSystem = exports.usesAutoTimeZone = exports.usesAutoDateAndTime = exports.uses24HourClock = exports.useLocalize = exports.openAppLanguageSettings = exports.getTimeZone = exports.getTemperatureUnit = exports.getNumberFormatSettings = exports.getLocales = exports.getCurrencies = exports.getCountry = exports.getCalendar = exports.findBestLanguageTag = exports.ServerLanguagesProvider = void 0; var _react = require("react"); var _constants = require("./constants"); var _utils = require("./utils"); const dateTimeFormatters = new Map(); const numberFormatters = new Map(); const extractLanguageTag = languageTag => { const [language = "en", country] = languageTag.split("-"); return { languageCode: language.toLowerCase(), countryCode: country ? (country === "419" ? "UN" : country).toUpperCase() : undefined }; }; const convertLanguageTagToLocale = (languageTag, countryFallback) => { const { languageCode, countryCode = countryFallback } = extractLanguageTag(languageTag); return { languageCode, countryCode, languageTag: `${languageCode}-${countryCode}`, isRTL: _constants.USES_RTL_LAYOUT.has(languageCode) }; }; const getCountryImpl = languages => { for (const language of languages) { const { countryCode } = extractLanguageTag(language); if (countryCode) { return countryCode; } } return "US"; }; const getCurrenciesImpl = languages => { const currencies = []; for (const language of languages) { const { countryCode } = extractLanguageTag(language); if (countryCode) { const currency = _constants.CURRENCIES[countryCode]; if (currency && !currencies.includes(currency)) { currencies.push(currency); } } } if (currencies.length === 0) { currencies.push("USD"); } return currencies; }; const getLocalesImpl = (languages, country) => { const seen = new Set(); const locales = []; for (const language of languages) { const locale = convertLanguageTagToLocale(language, country); if (!seen.has(locale.languageTag)) { locales.push(locale); seen.add(locale.languageTag); } } return locales; }; const getNumberFormatSettingsImpl = language => { let formatter = numberFormatters.get(language); if (formatter == null) { formatter = new Intl.NumberFormat(language); numberFormatters.set(language, formatter); } const separators = formatter.format(1000000.1).replace(/\d/g, ""); return { decimalSeparator: separators[separators.length - 1] || ".", groupingSeparator: separators[0] || "," }; }; const getTemperatureUnitImpl = country => _constants.USES_FAHRENHEIT.has(country) ? "fahrenheit" : "celsius"; const getTimeZoneImpl = language => { let formatter = dateTimeFormatters.get(language); if (formatter == null) { formatter = new Intl.DateTimeFormat(language, { hour: "numeric" }); dateTimeFormatters.set(language, formatter); } return formatter.resolvedOptions().timeZone || "Etc/UTC"; }; const uses24HourClockImpl = language => { let formatter = dateTimeFormatters.get(language); if (formatter == null) { formatter = new Intl.DateTimeFormat(language, { hour: "numeric" }); dateTimeFormatters.set(language, formatter); } return !formatter.format(new Date(2000, 0, 1, 20)).match(/am|pm/i); }; const usesMetricSystemImpl = country => !_constants.USES_IMPERIAL.has(country); const getCalendar = () => "gregorian"; exports.getCalendar = getCalendar; const getCountry = () => getCountryImpl(navigator.languages); exports.getCountry = getCountry; const getCurrencies = () => getCurrenciesImpl(navigator.languages); exports.getCurrencies = getCurrencies; const getLocales = () => { const { languages } = navigator; return getLocalesImpl(languages, getCountryImpl(languages)); }; exports.getLocales = getLocales; const getNumberFormatSettings = () => getNumberFormatSettingsImpl(navigator.language); exports.getNumberFormatSettings = getNumberFormatSettings; const getTemperatureUnit = () => getTemperatureUnitImpl(getCountryImpl(navigator.languages)); exports.getTemperatureUnit = getTemperatureUnit; const getTimeZone = () => getTimeZoneImpl(navigator.language); exports.getTimeZone = getTimeZone; const uses24HourClock = () => uses24HourClockImpl(navigator.language); exports.uses24HourClock = uses24HourClock; const usesMetricSystem = () => usesMetricSystemImpl(getCountryImpl(navigator.languages)); exports.usesMetricSystem = usesMetricSystem; const usesAutoDateAndTime = () => undefined; exports.usesAutoDateAndTime = usesAutoDateAndTime; const usesAutoTimeZone = () => undefined; exports.usesAutoTimeZone = usesAutoTimeZone; const findBestLanguageTag = exports.findBestLanguageTag = (0, _utils.getFindBestLanguageTag)(getLocales()); const openAppLanguageSettings = async () => { throw new Error("openAppLanguageSettings is supported only on Android 13+"); }; exports.openAppLanguageSettings = openAppLanguageSettings; const ServerLanguagesContext = /*#__PURE__*/(0, _react.createContext)(null); const ServerLanguagesProvider = ({ children, value }) => typeof window === "undefined" ? /*#__PURE__*/(0, _react.createElement)(ServerLanguagesContext.Provider, { children, value }) : children; exports.ServerLanguagesProvider = ServerLanguagesProvider; const api = { getCalendar, getCountry, getCurrencies, getLocales, getNumberFormatSettings, getTemperatureUnit, getTimeZone, uses24HourClock, usesMetricSystem, usesAutoDateAndTime, usesAutoTimeZone, findBestLanguageTag, openAppLanguageSettings }; const useLocalize = () => { const languages = (0, _react.useContext)(ServerLanguagesContext); return (0, _react.useState)(() => { if (languages == null) { return api; } const [language = "en"] = languages; const country = getCountryImpl(languages); const locales = getLocalesImpl(languages, country); return { getCalendar, getCountry: () => country, getCurrencies: () => getCurrenciesImpl(languages), getLocales: () => locales, getNumberFormatSettings: () => getNumberFormatSettingsImpl(language), getTemperatureUnit: () => getTemperatureUnitImpl(country), getTimeZone: () => getTimeZoneImpl(language), uses24HourClock: () => uses24HourClockImpl(language), usesMetricSystem: () => usesMetricSystemImpl(country), usesAutoDateAndTime, usesAutoTimeZone, findBestLanguageTag: (0, _utils.getFindBestLanguageTag)(locales), openAppLanguageSettings }; })[0]; }; exports.useLocalize = useLocalize; //# sourceMappingURL=module.js.map