react-native-localize
Version:
A toolbox for your React Native app localization.
189 lines (188 loc) • 6.73 kB
JavaScript
;
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