UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

155 lines (152 loc) 2.96 kB
import { DEFAULT_LOCALE_FALLBACKS, DEFAULT_LOCALE } 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 };