UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

161 lines (160 loc) 2.82 kB
import { DEFAULT_LOCALE, DEFAULT_LOCALE_FALLBACKS } from "./constants.js"; const PLURALS = {}; function definePluralFn(locales, fn) { for (let i = 0, len = locales.length; i < len; i++) { PLURALS[locales[i]] = fn; } } function getLang(locale) { const idx = locale.indexOf("-"); if (idx !== -1) { return locale.substring(0, idx); } return locale; } function replaceLang(locale, desiredLang) { const idx = locale.indexOf("-"); if (idx !== -1) { return desiredLang + locale.substring(idx); } return desiredLang; } function findAvailableLocale(desiredLocale, availableLocales) { if (availableLocales[desiredLocale]) { return desiredLocale; } let fallback = DEFAULT_LOCALE_FALLBACKS[desiredLocale]; if (fallback && availableLocales[fallback]) { return fallback; } const lang = getLang(desiredLocale); fallback = DEFAULT_LOCALE_FALLBACKS[lang]; if (availableLocales[fallback]) { return fallback; } if (availableLocales[lang]) { return lang; } return DEFAULT_LOCALE; } definePluralFn([ "ja", "ko", "th", "vi", "zh", "id" ], (n) => { return 0; }); definePluralFn([ "fa", "hi" ], (n) => { if (n >= 0 && n <= 1) { return 0; } return 1; }); definePluralFn([ "fr", "pt" ], (n) => { if (n >= 0 && n < 2) { return 0; } return 1; }); definePluralFn([ "da" ], (n) => { if (n === 1 || !Number.isInteger(n) && n >= 0 && n <= 1) { return 0; } return 1; }); definePluralFn([ "de", "en", "it", "el", "es", "tr", "fi", "sv", "nb", "no", "ur" ], (n) => { if (n === 1) { return 0; } return 1; }); definePluralFn([ "ru", "uk" ], (n) => { if (Number.isInteger(n)) { const mod10 = n % 10; const mod100 = n % 100; if (mod10 === 1 && mod100 !== 11) { return 0; } else if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) { return 1; } else if (mod10 === 0 || mod10 >= 5 && mod10 <= 9 || mod100 >= 11 && mod100 <= 14) { return 2; } } return 3; }); definePluralFn([ "pl" ], (n) => { if (Number.isInteger(n)) { if (n === 1) { return 0; } const mod10 = n % 10; const mod100 = n % 100; if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) { return 1; } else if (mod10 >= 0 && mod10 <= 1 || mod10 >= 5 && mod10 <= 9 || mod100 >= 12 && mod100 <= 14) { return 2; } } return 3; }); definePluralFn([ "ar" ], (n) => { if (n === 0) { return 0; } else if (n === 1) { return 1; } else if (n === 2) { return 2; } if (Number.isInteger(n)) { const mod100 = n % 100; if (mod100 >= 3 && mod100 <= 10) { return 3; } else if (mod100 >= 11 && mod100 <= 99) { return 4; } } return 5; }); const DEFAULT_PLURAL_FN = PLURALS[getLang(DEFAULT_LOCALE)]; function getPluralFn(lang) { return PLURALS[lang] || DEFAULT_PLURAL_FN; } export { findAvailableLocale, getLang, getPluralFn, replaceLang };