playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
161 lines (160 loc) • 2.82 kB
JavaScript
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
};