((exports) => {
// @TODO: DRY hotkey helpers
// & defines accelerators (hotkeys) in menus and buttons and things, which get underlined in the UI.
// & can be escaped by doubling it, e.g. "&Taskbar && Start Menu"
function index_of_hotkey(text) {
// Returns the index of the ampersand that defines a hotkey, or -1 if not present.
// return english_text.search(/(?${text.replace(/([^&]|^)&([^&\s])/, "$1").replace(/&&/g, "&")}`;
}
function get_hotkey(text) {
return text[index_of_hotkey(text) + 1].toUpperCase();
}
let localizations = {};
function localize(english_text, ...interpolations) {
function find_localization(english_text) {
const amp_index = index_of_hotkey(english_text);
if (amp_index > -1) {
const without_hotkey = remove_hotkey(english_text);
if (localizations[without_hotkey]) {
const hotkey_def = english_text.slice(amp_index, amp_index + 2);
if (localizations[without_hotkey].toUpperCase().indexOf(hotkey_def.toUpperCase()) > -1) {
return localizations[without_hotkey];
} else {
if (has_hotkey(localizations[without_hotkey])) {
// window.console && console.warn(`Localization has differing accelerator (hotkey) hint: '${localizations[without_hotkey]}' vs '${english_text}'`);
// @TODO: detect differing accelerator more generally
return `${remove_hotkey(localizations[without_hotkey])} (${hotkey_def})`;
}
return `${localizations[without_hotkey]} (${hotkey_def})`;
}
}
}
if (localizations[english_text]) {
return localizations[english_text];
}
return english_text;
}
function interpolate(text, interpolations) {
for (let i = 0; i < interpolations.length; i++) {
text = text.replace(`%${i + 1}`, interpolations[i]);
}
return text;
}
return interpolate(find_localization(english_text), interpolations);
}
const language_storage_key = "jspaint language";
const accepted_languages = Array.from(navigator.languages || [navigator.language || navigator.userLanguage]);
try {
if (localStorage[language_storage_key]) {
accepted_languages.unshift(localStorage[language_storage_key]);
}
} catch (error) {
// if there's no localStorage access, you can still configure the language via system settings, theoretically
// TODO: also via URL?
}
var language_to_default_region = {
aa: 'ET',
ab: 'GE',
abr: 'GH',
ace: 'ID',
ach: 'UG',
ada: 'GH',
ady: 'RU',
ae: 'IR',
aeb: 'TN',
af: 'ZA',
agq: 'CM',
aho: 'IN',
ak: 'GH',
akk: 'IQ',
aln: 'XK',
alt: 'RU',
am: 'ET',
amo: 'NG',
aoz: 'ID',
apd: 'TG',
ar: 'EG',
arc: 'IR',
'arc-Nbat': 'JO',
'arc-Palm': 'SY',
arn: 'CL',
aro: 'BO',
arq: 'DZ',
ary: 'MA',
arz: 'EG',
as: 'IN',
asa: 'TZ',
ase: 'US',
ast: 'ES',
atj: 'CA',
av: 'RU',
awa: 'IN',
ay: 'BO',
az: 'AZ',
'az-Arab': 'IR',
ba: 'RU',
bal: 'PK',
ban: 'ID',
bap: 'NP',
bar: 'AT',
bas: 'CM',
bax: 'CM',
bbc: 'ID',
bbj: 'CM',
bci: 'CI',
be: 'BY',
bej: 'SD',
bem: 'ZM',
bew: 'ID',
bez: 'TZ',
bfd: 'CM',
bfq: 'IN',
bft: 'PK',
bfy: 'IN',
bg: 'BG',
bgc: 'IN',
bgn: 'PK',
bgx: 'TR',
bhb: 'IN',
bhi: 'IN',
bhk: 'PH',
bho: 'IN',
bi: 'VU',
bik: 'PH',
bin: 'NG',
bjj: 'IN',
bjn: 'ID',
bjt: 'SN',
bkm: 'CM',
bku: 'PH',
blt: 'VN',
bm: 'ML',
bmq: 'ML',
bn: 'BD',
bo: 'CN',
bpy: 'IN',
bqi: 'IR',
bqv: 'CI',
br: 'FR',
bra: 'IN',
brh: 'PK',
brx: 'IN',
bs: 'BA',
bsq: 'LR',
bss: 'CM',
bto: 'PH',
btv: 'PK',
bua: 'RU',
buc: 'YT',
bug: 'ID',
bum: 'CM',
bvb: 'GQ',
byn: 'ER',
byv: 'CM',
bze: 'ML',
ca: 'ES',
cch: 'NG',
ccp: 'BD',
ce: 'RU',
ceb: 'PH',
cgg: 'UG',
ch: 'GU',
chk: 'FM',
chm: 'RU',
cho: 'US',
chp: 'CA',
chr: 'US',
cja: 'KH',
cjm: 'VN',
ckb: 'IQ',
co: 'FR',
cop: 'EG',
cps: 'PH',
cr: 'CA',
crh: 'UA',
crj: 'CA',
crk: 'CA',
crl: 'CA',
crm: 'CA',
crs: 'SC',
cs: 'CZ',
csb: 'PL',
csw: 'CA',
ctd: 'MM',
cu: 'RU',
'cu-Glag': 'BG',
cv: 'RU',
cy: 'GB',
da: 'DK',
dak: 'US',
dar: 'RU',
dav: 'KE',
dcc: 'IN',
de: 'DE',
den: 'CA',
dgr: 'CA',
dje: 'NE',
dnj: 'CI',
doi: 'IN',
dsb: 'DE',
dtm: 'ML',
dtp: 'MY',
dty: 'NP',
dua: 'CM',
dv: 'MV',
dyo: 'SN',
dyu: 'BF',
dz: 'BT',
ebu: 'KE',
ee: 'GH',
efi: 'NG',
egl: 'IT',
egy: 'EG',
eky: 'MM',
el: 'GR',
en: 'US',
'en-Shaw': 'GB',
es: 'ES',
esu: 'US',
et: 'EE',
ett: 'IT',
eu: 'ES',
ewo: 'CM',
ext: 'ES',
fa: 'IR',
fan: 'GQ',
ff: 'SN',
'ff-Adlm': 'GN',
ffm: 'ML',
fi: 'FI',
fia: 'SD',
fil: 'PH',
fit: 'SE',
fj: 'FJ',
fo: 'FO',
fon: 'BJ',
fr: 'FR',
frc: 'US',
frp: 'FR',
frr: 'DE',
frs: 'DE',
fub: 'CM',
fud: 'WF',
fuf: 'GN',
fuq: 'NE',
fur: 'IT',
fuv: 'NG',
fvr: 'SD',
fy: 'NL',
ga: 'IE',
gaa: 'GH',
gag: 'MD',
gan: 'CN',
gay: 'ID',
gbm: 'IN',
gbz: 'IR',
gcr: 'GF',
gd: 'GB',
gez: 'ET',
ggn: 'NP',
gil: 'KI',
gjk: 'PK',
gju: 'PK',
gl: 'ES',
glk: 'IR',
gn: 'PY',
gom: 'IN',
gon: 'IN',
gor: 'ID',
gos: 'NL',
got: 'UA',
grc: 'CY',
'grc-Linb': 'GR',
grt: 'IN',
gsw: 'CH',
gu: 'IN',
gub: 'BR',
guc: 'CO',
gur: 'GH',
guz: 'KE',
gv: 'IM',
gvr: 'NP',
gwi: 'CA',
ha: 'NG',
hak: 'CN',
haw: 'US',
haz: 'AF',
he: 'IL',
hi: 'IN',
hif: 'FJ',
hil: 'PH',
hlu: 'TR',
hmd: 'CN',
hnd: 'PK',
hne: 'IN',
hnj: 'LA',
hnn: 'PH',
hno: 'PK',
ho: 'PG',
hoc: 'IN',
hoj: 'IN',
hr: 'HR',
hsb: 'DE',
hsn: 'CN',
ht: 'HT',
hu: 'HU',
hy: 'AM',
hz: 'NA',
ia: 'FR',
iba: 'MY',
ibb: 'NG',
id: 'ID',
ife: 'TG',
ig: 'NG',
ii: 'CN',
ik: 'US',
ikt: 'CA',
ilo: 'PH',
in: 'ID',
inh: 'RU',
is: 'IS',
it: 'IT',
iu: 'CA',
iw: 'IL',
izh: 'RU',
ja: 'JP',
jam: 'JM',
jgo: 'CM',
ji: 'UA',
jmc: 'TZ',
jml: 'NP',
jut: 'DK',
jv: 'ID',
jw: 'ID',
ka: 'GE',
kaa: 'UZ',
kab: 'DZ',
kac: 'MM',
kaj: 'NG',
kam: 'KE',
kao: 'ML',
kbd: 'RU',
kby: 'NE',
kcg: 'NG',
kck: 'ZW',
kde: 'TZ',
kdh: 'TG',
kdt: 'TH',
kea: 'CV',
ken: 'CM',
kfo: 'CI',
kfr: 'IN',
kfy: 'IN',
kg: 'CD',
kge: 'ID',
kgp: 'BR',
kha: 'IN',
khb: 'CN',
khn: 'IN',
khq: 'ML',
kht: 'IN',
khw: 'PK',
ki: 'KE',
kiu: 'TR',
kj: 'NA',
kjg: 'LA',
kk: 'KZ',
'kk-Arab': 'CN',
kkj: 'CM',
kl: 'GL',
kln: 'KE',
km: 'KH',
kmb: 'AO',
kn: 'IN',
knf: 'SN',
ko: 'KR',
koi: 'RU',
kok: 'IN',
kos: 'FM',
kpe: 'LR',
krc: 'RU',
kri: 'SL',
krj: 'PH',
krl: 'RU',
kru: 'IN',
ks: 'IN',
ksb: 'TZ',
ksf: 'CM',
ksh: 'DE',
ku: 'TR',
'ku-Arab': 'IQ',
kum: 'RU',
kv: 'RU',
kvr: 'ID',
kvx: 'PK',
kw: 'GB',
kxm: 'TH',
kxp: 'PK',
ky: 'KG',
'ky-Arab': 'CN',
'ky-Latn': 'TR',
la: 'VA',
lab: 'GR',
lad: 'IL',
lag: 'TZ',
lah: 'PK',
laj: 'UG',
lb: 'LU',
lbe: 'RU',
lbw: 'ID',
lcp: 'CN',
lep: 'IN',
lez: 'RU',
lg: 'UG',
li: 'NL',
lif: 'NP',
'lif-Limb': 'IN',
lij: 'IT',
lis: 'CN',
ljp: 'ID',
lki: 'IR',
lkt: 'US',
lmn: 'IN',
lmo: 'IT',
ln: 'CD',
lo: 'LA',
lol: 'CD',
loz: 'ZM',
lrc: 'IR',
lt: 'LT',
ltg: 'LV',
lu: 'CD',
lua: 'CD',
luo: 'KE',
luy: 'KE',
luz: 'IR',
lv: 'LV',
lwl: 'TH',
lzh: 'CN',
lzz: 'TR',
mad: 'ID',
maf: 'CM',
mag: 'IN',
mai: 'IN',
mak: 'ID',
man: 'GM',
'man-Nkoo': 'GN',
mas: 'KE',
maz: 'MX',
mdf: 'RU',
mdh: 'PH',
mdr: 'ID',
men: 'SL',
mer: 'KE',
mfa: 'TH',
mfe: 'MU',
mg: 'MG',
mgh: 'MZ',
mgo: 'CM',
mgp: 'NP',
mgy: 'TZ',
mh: 'MH',
mi: 'NZ',
min: 'ID',
mis: 'IQ',
mk: 'MK',
ml: 'IN',
mls: 'SD',
mn: 'MN',
'mn-Mong': 'CN',
mni: 'IN',
mnw: 'MM',
moe: 'CA',
moh: 'CA',
mos: 'BF',
mr: 'IN',
mrd: 'NP',
mrj: 'RU',
mro: 'BD',
ms: 'MY',
mt: 'MT',
mtr: 'IN',
mua: 'CM',
mus: 'US',
mvy: 'PK',
mwk: 'ML',
mwr: 'IN',
mwv: 'ID',
mxc: 'ZW',
my: 'MM',
myv: 'RU',
myx: 'UG',
myz: 'IR',
mzn: 'IR',
na: 'NR',
nan: 'CN',
nap: 'IT',
naq: 'NA',
nb: 'NO',
nch: 'MX',
nd: 'ZW',
ndc: 'MZ',
nds: 'DE',
ne: 'NP',
new: 'NP',
ng: 'NA',
ngl: 'MZ',
nhe: 'MX',
nhw: 'MX',
nij: 'ID',
niu: 'NU',
njo: 'IN',
nl: 'NL',
nmg: 'CM',
nn: 'NO',
nnh: 'CM',
no: 'NO',
nod: 'TH',
noe: 'IN',
non: 'SE',
nqo: 'GN',
nr: 'ZA',
nsk: 'CA',
nso: 'ZA',
nus: 'SS',
nv: 'US',
nxq: 'CN',
ny: 'MW',
nym: 'TZ',
nyn: 'UG',
nzi: 'GH',
oc: 'FR',
om: 'ET',
or: 'IN',
os: 'GE',
osa: 'US',
otk: 'MN',
pa: 'IN',
'pa-Arab': 'PK',
pag: 'PH',
pal: 'IR',
'pal-Phlp': 'CN',
pam: 'PH',
pap: 'AW',
pau: 'PW',
pcd: 'FR',
pcm: 'NG',
pdc: 'US',
pdt: 'CA',
peo: 'IR',
pfl: 'DE',
phn: 'LB',
pka: 'IN',
pko: 'KE',
pl: 'PL',
pms: 'IT',
pnt: 'GR',
pon: 'FM',
pra: 'PK',
prd: 'IR',
ps: 'AF',
pt: 'PT',//'BR',
puu: 'GA',
qu: 'PE',
quc: 'GT',
qug: 'EC',
raj: 'IN',
rcf: 'RE',
rej: 'ID',
rgn: 'IT',
ria: 'IN',
rif: 'MA',
rjs: 'NP',
rkt: 'BD',
rm: 'CH',
rmf: 'FI',
rmo: 'CH',
rmt: 'IR',
rmu: 'SE',
rn: 'BI',
rng: 'MZ',
ro: 'RO',
rob: 'ID',
rof: 'TZ',
rtm: 'FJ',
ru: 'RU',
rue: 'UA',
rug: 'SB',
rw: 'RW',
rwk: 'TZ',
ryu: 'JP',
sa: 'IN',
saf: 'GH',
sah: 'RU',
saq: 'KE',
sas: 'ID',
sat: 'IN',
sav: 'SN',
saz: 'IN',
sbp: 'TZ',
sc: 'IT',
sck: 'IN',
scn: 'IT',
sco: 'GB',
scs: 'CA',
sd: 'PK',
'sd-Deva': 'IN',
'sd-Khoj': 'IN',
'sd-Sind': 'IN',
sdc: 'IT',
sdh: 'IR',
se: 'NO',
sef: 'CI',
seh: 'MZ',
sei: 'MX',
ses: 'ML',
sg: 'CF',
sga: 'IE',
sgs: 'LT',
shi: 'MA',
shn: 'MM',
si: 'LK',
sid: 'ET',
sk: 'SK',
skr: 'PK',
sl: 'SI',
sli: 'PL',
sly: 'ID',
sm: 'WS',
sma: 'SE',
smj: 'SE',
smn: 'FI',
smp: 'IL',
sms: 'FI',
sn: 'ZW',
snk: 'ML',
so: 'SO',
sou: 'TH',
sq: 'AL',
sr: 'RS',
srb: 'IN',
srn: 'SR',
srr: 'SN',
srx: 'IN',
ss: 'ZA',
ssy: 'ER',
st: 'ZA',
stq: 'DE',
su: 'ID',
suk: 'TZ',
sus: 'GN',
sv: 'SE',
sw: 'TZ',
swb: 'YT',
swc: 'CD',
swg: 'DE',
swv: 'IN',
sxn: 'ID',
syl: 'BD',
syr: 'IQ',
szl: 'PL',
ta: 'IN',
taj: 'NP',
tbw: 'PH',
tcy: 'IN',
tdd: 'CN',
tdg: 'NP',
tdh: 'NP',
te: 'IN',
tem: 'SL',
teo: 'UG',
tet: 'TL',
tg: 'TJ',
'tg-Arab': 'PK',
th: 'TH',
thl: 'NP',
thq: 'NP',
thr: 'NP',
ti: 'ET',
tig: 'ER',
tiv: 'NG',
tk: 'TM',
tkl: 'TK',
tkr: 'AZ',
tkt: 'NP',
tl: 'PH',
tly: 'AZ',
tmh: 'NE',
tn: 'ZA',
to: 'TO',
tog: 'MW',
tpi: 'PG',
tr: 'TR',
tru: 'TR',
trv: 'TW',
ts: 'ZA',
tsd: 'GR',
tsf: 'NP',
tsg: 'PH',
tsj: 'BT',
tt: 'RU',
ttj: 'UG',
tts: 'TH',
ttt: 'AZ',
tum: 'MW',
tvl: 'TV',
twq: 'NE',
txg: 'CN',
ty: 'PF',
tyv: 'RU',
tzm: 'MA',
udm: 'RU',
ug: 'CN',
'ug-Cyrl': 'KZ',
uga: 'SY',
uk: 'UA',
uli: 'FM',
umb: 'AO',
und: 'US',
unr: 'IN',
'unr-Deva': 'NP',
unx: 'IN',
ur: 'PK',
uz: 'UZ',
'uz-Arab': 'AF',
vai: 'LR',
ve: 'ZA',
vec: 'IT',
vep: 'RU',
vi: 'VN',
vic: 'SX',
vls: 'BE',
vmf: 'DE',
vmw: 'MZ',
vot: 'RU',
vro: 'EE',
vun: 'TZ',
wa: 'BE',
wae: 'CH',
wal: 'ET',
war: 'PH',
wbp: 'AU',
wbq: 'IN',
wbr: 'IN',
wls: 'WF',
wni: 'KM',
wo: 'SN',
wtm: 'IN',
wuu: 'CN',
xav: 'BR',
xcr: 'TR',
xh: 'ZA',
xlc: 'TR',
xld: 'TR',
xmf: 'GE',
xmn: 'CN',
xmr: 'SD',
xna: 'SA',
xnr: 'IN',
xog: 'UG',
xpr: 'IR',
xsa: 'YE',
xsr: 'NP',
yao: 'MZ',
yap: 'FM',
yav: 'CM',
ybb: 'CM',
yo: 'NG',
yrl: 'BR',
yua: 'MX',
yue: 'HK',
'yue-Hans': 'CN',
za: 'CN',
zag: 'SD',
zdj: 'KM',
zea: 'NL',
zgh: 'MA',
zh: 'CN',
'zh-Bopo': 'TW',
'zh-Hanb': 'TW',
'zh-Hant': 'TW',
zlm: 'TG',
zmi: 'MY',
zu: 'ZA',
zza: 'TR',
};
function get_language_emoji(locale) {
var split = locale.toUpperCase().split(/-|_/);
var lang = split.shift();
var code = split.pop();
if (!/^[A-Z]{2}$/.test(code)) {
code = language_to_default_region[lang.toLowerCase()];
}
if (!code) {
return '';
}
const a = String.fromCodePoint(code.codePointAt(0) - 0x41 + 0x1F1E6);
const b = String.fromCodePoint(code.codePointAt(1) - 0x41 + 0x1F1E6);
return a + b;
}
const base_language = "en";
const available_languages = ["ar", "cs", "da", "de", "el", "en", "es", "fi", "fr", "he", "hu", "it", "ja", "ko", "nl", "no", "pl", "pt", "pt-br", "ru", "sk", "sl", "sv", "tr", "zh", "zh-simplified"];
// spell-checker:disable
const language_names = {
// "639-1": [["ISO language name"], ["Native name (endonym)"]],
ab: [["Abkhazian"], ["Аҧсуа Бызшәа", "Аҧсшәа"]],
aa: [["Afar"], ["Afaraf"]],
af: [["Afrikaans"], ["Afrikaans"]],
ak: [["Akan"], ["Akan"]],
sq: [["Albanian"], ["Shqip"]],
am: [["Amharic"], ["አማርኛ"]],
ar: [["Arabic"], ["العربية"]],
an: [["Aragonese"], ["Aragonés"]],
hy: [["Armenian"], ["Հայերեն"]],
as: [["Assamese"], ["অসমীয়া"]],
av: [["Avaric"], ["Авар МацӀ", "МагӀарул МацӀ"]],
ae: [["Avestan"], ["Avesta"]],
ay: [["Aymara"], ["Aymar Aru"]],
az: [["Azerbaijani"], ["Azərbaycan Dili"]],
bm: [["Bambara"], ["Bamanankan"]],
ba: [["Bashkir"], ["Башҡорт Теле"]],
eu: [["Basque"], ["Euskara", "Euskera"]],
be: [["Belarusian"], ["Беларуская Мова"]],
bn: [["Bengali"], ["বাংলা"]],
bh: [["Bihari Languages"], ["भोजपुरी"]],
bi: [["Bislama"], ["Bislama"]],
bs: [["Bosnian"], ["Bosanski Jezik"]],
br: [["Breton"], ["Brezhoneg"]],
bg: [["Bulgarian"], ["Български Език"]],
my: [["Burmese"], ["ဗမာစာ"]],
ca: [["Catalan", "Valencian"], ["Català", "Valencià"]],
ch: [["Chamorro"], ["Chamoru"]],
ce: [["Chechen"], ["Нохчийн Мотт"]],
ny: [["Chichewa", "Chewa", "Nyanja"], ["ChiCheŵa", "Chinyanja"]],
// zh: [["Chinese"], ["中文", "Zhōngwén", "汉语", "漢語"]],
// The ISO 639-1 code "zh" doesn't refer to Traditional Chinese specifically,
// but we want to show the distinction between Chinese varieties in the Language menu,
// so this is overly specific for now.
// @TODO: do this cleaner by establishing a mapping between ISO codes (such as "zh") and default language IDs (such as "zh-traditional")
zh: [["Traditional Chinese"], ["繁體中文", "傳統中文", "正體中文", "繁体中文"]],
"zh-traditional": [["Traditional Chinese"], ["繁體中文", "傳統中文", "正體中文", "繁体中文"]], // made-up ID, not real ISO 639-1
"zh-simplified": [["Simple Chinese"], ["简体中文"]], // made-up ID, not real ISO 639-1
cv: [["Chuvash"], ["Чӑваш Чӗлхи"]],
kw: [["Cornish"], ["Kernewek"]],
co: [["Corsican"], ["Corsu", "Lingua Corsa"]],
cr: [["Cree"], ["ᓀᐦᐃᔭᐍᐏᐣ"]],
hr: [["Croatian"], ["Hrvatski Jezik"]],
cs: [["Czech"], ["Čeština", "Český Jazyk"]],
da: [["Danish"], ["Dansk"]],
dv: [["Divehi", "Dhivehi", "Maldivian"], ["ދިވެހި"]],
nl: [["Dutch", "Flemish"], ["Nederlands", "Vlaams"]],
dz: [["Dzongkha"], ["རྫོང་ཁ"]],
en: [["English"], ["English"]],
eo: [["Esperanto"], ["Esperanto"]],
et: [["Estonian"], ["Eesti", "Eesti Keel"]],
ee: [["Ewe"], ["Eʋegbe"]],
fo: [["Faroese"], ["Føroyskt"]],
fj: [["Fijian"], ["Vosa Vakaviti"]],
fi: [["Finnish"], ["Suomi", "Suomen Kieli"]],
fr: [["French"], ["Français", "Langue Française"]],
ff: [["Fulah"], ["Fulfulde", "Pulaar", "Pular"]],
gl: [["Galician"], ["Galego"]],
ka: [["Georgian"], ["ქართული"]],
de: [["German"], ["Deutsch"]],
el: [["Greek"], ["Ελληνικά"]],
gn: [["Guarani"], ["Avañe'ẽ"]],
gu: [["Gujarati"], ["ગુજરાતી"]],
ht: [["Haitian", "Haitian Creole"], ["Kreyòl Ayisyen"]],
ha: [["Hausa"], ["هَوُسَ"]],
he: [["Hebrew"], ["עברית"]],
hz: [["Herero"], ["Otjiherero"]],
hi: [["Hindi"], ["हिन्दी", "हिंदी"]],
ho: [["Hiri Motu"], ["Hiri Motu"]],
hu: [["Hungarian"], ["Magyar"]],
ia: [["Interlingua"], ["Interlingua"]],
id: [["Indonesian"], ["Bahasa Indonesia"]],
ie: [["Interlingue", "Occidental"], ["Interlingue", "Occidental"]],
ga: [["Irish"], ["Gaeilge"]],
ig: [["Igbo"], ["Asụsụ Igbo"]],
ik: [["Inupiaq"], ["Iñupiaq", "Iñupiatun"]],
io: [["Ido"], ["Ido"]],
is: [["Icelandic"], ["Íslenska"]],
it: [["Italian"], ["Italiano"]],
iu: [["Inuktitut"], ["ᐃᓄᒃᑎᑐᑦ"]],
ja: [["Japanese"], ["日本語", "にほんご"]],
jv: [["Javanese"], ["ꦧꦱꦗꦮ", "Basa Jawa"]],
kl: [["Kalaallisut", "Greenlandic"], ["Kalaallisut", "Kalaallit Oqaasii"]],
kn: [["Kannada"], ["ಕನ್ನಡ"]],
kr: [["Kanuri"], ["Kanuri"]],
ks: [["Kashmiri"], ["कश्मीरी", "كشميري"]],
kk: [["Kazakh"], ["Қазақ Тілі"]],
km: [["Central Khmer"], ["ខ្មែរ", "ខេមរភាសា", "ភាសាខ្មែរ"]],
ki: [["Kikuyu", "Gikuyu"], ["Gĩkũyũ"]],
rw: [["Kinyarwanda"], ["Ikinyarwanda"]],
ky: [["Kirghiz", "Kyrgyz"], ["Кыргызча", "Кыргыз Тили"]],
kv: [["Komi"], ["Коми Кыв"]],
kg: [["Kongo"], ["Kikongo"]],
ko: [["Korean"], ["한국어"]],
ku: [["Kurdish"], ["Kurdî", "کوردی"]],
kj: [["Kuanyama", "Kwanyama"], ["Kuanyama"]],
la: [["Latin"], ["Latine", "Lingua Latina"]],
lb: [["Luxembourgish", "Letzeburgesch"], ["Lëtzebuergesch"]],
lg: [["Ganda"], ["Luganda"]],
li: [["Limburgan", "Limburger", "Limburgish"], ["Limburgs"]],
ln: [["Lingala"], ["Lingála"]],
lo: [["Lao"], ["ພາສາລາວ"]],
lt: [["Lithuanian"], ["Lietuvių Kalba"]],
lu: [["Luba-Katanga"], ["Kiluba"]],
lv: [["Latvian"], ["Latviešu Valoda"]],
gv: [["Manx"], ["Gaelg", "Gailck"]],
mk: [["Macedonian"], ["Македонски Јазик"]],
mg: [["Malagasy"], ["Fiteny Malagasy"]],
ms: [["Malay"], ["Bahasa Melayu", "بهاس ملايو"]],
ml: [["Malayalam"], ["മലയാളം"]],
mt: [["Maltese"], ["Malti"]],
mi: [["Maori"], ["Te Reo Māori"]],
mr: [["Marathi"], ["मराठी"]],
mh: [["Marshallese"], ["Kajin M̧ajeļ"]],
mn: [["Mongolian"], ["Монгол Хэл"]],
na: [["Nauru"], ["Dorerin Naoero"]],
nv: [["Navajo", "Navaho"], ["Diné Bizaad"]],
nd: [["North Ndebele"], ["IsiNdebele"]],
ne: [["Nepali"], ["नेपाली"]],
ng: [["Ndonga"], ["Owambo"]],
nb: [["Norwegian Bokmål"], ["Norsk Bokmål"]],
nn: [["Norwegian Nynorsk"], ["Norsk Nynorsk"]],
no: [["Norwegian"], ["Norsk"]],
ii: [["Sichuan Yi", "Nuosu"], ["ꆈꌠ꒿", "Nuosuhxop"]],
nr: [["South Ndebele"], ["IsiNdebele"]],
oc: [["Occitan"], ["Occitan", "Lenga d'Òc"]],
oj: [["Ojibwa"], ["ᐊᓂᔑᓈᐯᒧᐎᓐ"]],
cu: [["Church Slavic", "Old Slavonic", "Church Slavonic", "Old Bulgarian", "Old Church Slavonic"], ["Ѩзыкъ Словѣньскъ"]],
om: [["Oromo"], ["Afaan Oromoo"]],
or: [["Oriya"], ["ଓଡ଼ିଆ"]],
os: [["Ossetian", "Ossetic"], ["Ирон Æвзаг"]],
pa: [["Punjabi", "Panjabi"], ["ਪੰਜਾਬੀ", "پنجابی"]],
pi: [["Pali"], ["पालि", "पाळि"]],
fa: [["Persian"], ["فارسی"]],
pl: [["Polish"], ["Język Polski", "Polszczyzna"]],
ps: [["Pashto", "Pushto"], ["پښتو"]],
pt: [["Portuguese"], ["Português"]],
"pt-br": [["Brazilian Portuguese"], ["Português Brasileiro"]],
"pt-pt": [["Portuguese (Portugal)"], ["Português De Portugal"]],
qu: [["Quechua"], ["Runa Simi", "Kichwa"]],
rm: [["Romansh"], ["Rumantsch Grischun"]],
rn: [["Rundi"], ["Ikirundi"]],
ro: [["Romanian", "Moldavian", "Moldovan"], ["Română"]],
ru: [["Russian"], ["Русский"]],
sa: [["Sanskrit"], ["संस्कृतम्"]],
sc: [["Sardinian"], ["Sardu"]],
sd: [["Sindhi"], ["सिन्धी", "سنڌي، سندھی"]],
se: [["Northern Sami"], ["Davvisámegiella"]],
sm: [["Samoan"], ["Gagana Fa'a Samoa"]],
sg: [["Sango"], ["Yângâ Tî Sängö"]],
sr: [["Serbian"], ["Српски Језик"]],
gd: [["Gaelic", "Scottish Gaelic"], ["Gàidhlig"]],
sn: [["Shona"], ["ChiShona"]],
si: [["Sinhala", "Sinhalese"], ["සිංහල"]],
sk: [["Slovak"], ["Slovenčina", "Slovenský Jazyk"]],
sl: [["Slovenian"], ["Slovenski Jezik", "Slovenščina"]],
so: [["Somali"], ["Soomaaliga", "Af Soomaali"]],
st: [["Southern Sotho"], ["Sesotho"]],
es: [["Spanish", "Castilian"], ["Español"]],
su: [["Sundanese"], ["Basa Sunda"]],
sw: [["Swahili"], ["Kiswahili"]],
ss: [["Swati"], ["SiSwati"]],
sv: [["Swedish"], ["Svenska"]],
ta: [["Tamil"], ["தமிழ்"]],
te: [["Telugu"], ["తెలుగు"]],
tg: [["Tajik"], ["Тоҷикӣ", "Toçikī", "تاجیکی"]],
th: [["Thai"], ["ไทย"]],
ti: [["Tigrinya"], ["ትግርኛ"]],
bo: [["Tibetan"], ["བོད་ཡིག"]],
tk: [["Turkmen"], ["Türkmen", "Түркмен"]],
tl: [["Tagalog"], ["Wikang Tagalog"]],
tn: [["Tswana"], ["Setswana"]],
to: [["Tonga"], ["Faka Tonga"]],
tr: [["Turkish"], ["Türkçe"]],
ts: [["Tsonga"], ["Xitsonga"]],
tt: [["Tatar"], ["Татар Теле", "Tatar Tele"]],
tw: [["Twi"], ["Twi"]],
ty: [["Tahitian"], ["Reo Tahiti"]],
ug: [["Uighur", "Uyghur"], ["ئۇيغۇرچە", "Uyghurche"]],
uk: [["Ukrainian"], ["Українська"]],
ur: [["Urdu"], ["اردو"]],
uz: [["Uzbek"], ["Oʻzbek", "Ўзбек", "أۇزبېك"]],
ve: [["Venda"], ["Tshivenḓa"]],
vi: [["Vietnamese"], ["Tiếng Việt"]],
vo: [["Volapük"], ["Volapük"]],
wa: [["Walloon"], ["Walon"]],
cy: [["Welsh"], ["Cymraeg"]],
wo: [["Wolof"], ["Wollof"]],
fy: [["Western Frisian"], ["Frysk"]],
xh: [["Xhosa"], ["IsiXhosa"]],
yi: [["Yiddish"], ["ייִדיש"]],
yo: [["Yoruba"], ["Yorùbá"]],
za: [["Zhuang", "Chuang"], ["Saɯ Cueŋƅ", "Saw Cuengh"]],
zu: [["Zulu"], ["IsiZulu"]],
};
// spell-checker:enable
function get_iso_language_name(language) {
return language_names[language][0][0];
}
function get_language_endonym(language) {
return language_names[language][1][0];
}
let current_language = base_language;
for (const accepted_language of accepted_languages) {
if (available_languages.indexOf(accepted_language) !== -1) {
current_language = accepted_language;
break;
}
}
function get_language() {
return current_language;
}
function get_direction(language = current_language) {
return language.match(/^(ar|dv|fa|ha|he|ks|ku|ms|pa|ps|sd|ug|yi)\b/i) ? "rtl" : "ltr";
}
function load_language(language) {
// const prev_language = current_language;
const stylesheets = [...document.querySelectorAll(".flippable-layout-stylesheet")];
for (const stylesheet of stylesheets) {
let href = stylesheet.getAttribute("href");
if (get_direction(language) === "rtl") {
if (href.indexOf(".rtl.css") === -1) {
href = href.replace(/\.css$/i, ".rtl.css");
}
} else {
if (href.indexOf(".rtl.css") > -1) {
href = href.replace(/\.rtl\.css$/i, ".css");
}
}
stylesheet.setAttribute("href", href);
// hack to wait for stylesheet to load
const img = document.createElement("img");
img.onerror = () => {
$(() => {
$G.triggerHandler("theme-load"); // signal layout change
});
};
img.src = href;
}
if (language === base_language) {
localizations = {};
current_language = base_language;
return;
}
// fetch(`localization/${language}/localizations.json`)
// .then((response)=> response.json())
// .then((new_localizations)=> {
// localizations = new_localizations;
// current_language = language;
// }).catch((error)=> {
// show_error_message(`Failed to load localizations for ${language_names[language]}.`, error);
// current_language = prev_language;
// });
const src = `localization/${language}/localizations.js`;
document.write(`