ilingo
Version:
This is a lightweight library for translation.
535 lines (526 loc) • 11 kB
JavaScript
import { isObject, hasOwnProperty } from 'smob';
import { getPathValue, setPathValue } from 'pathtrace';
/*
* Copyright (c) 2023.
* Author Peter Placzek (tada5hi)
* For the full copyright and license information,
* view the LICENSE file that was distributed with this source code.
*/ const LOCALE_DEFAULT = 'en';
function isLineRecord(value) {
if (!isObject(value)) {
return false;
}
const ob = value;
const keys = Object.keys(ob);
for(let i = 0; i < keys.length; i++){
/* istanbul ignore next */ if (typeof ob[keys[i]] !== 'string' && !isLineRecord(ob[keys[i]])) {
return false;
}
}
return true;
}
var aa = "Afar";
var ab = "Abkhazian";
var ae = "Avestan";
var af = "Afrikaans";
var ak = "Akan";
var am = "Amharic";
var an = "Aragonese";
var ar = "Arabic";
var as = "Assamese";
var av = "Avaric";
var ay = "Aymara";
var az = "Azerbaijani";
var ba = "Bashkir";
var be = "Belarusian";
var bg = "Bulgarian";
var bh = "Bihari languages";
var bi = "Bislama";
var bm = "Bambara";
var bn = "Bengali";
var bo = "Tibetan";
var br = "Breton";
var bs = "Bosnian";
var ca = "Catalan";
var ce = "Chechen";
var ch = "Chamorro";
var co = "Corsican";
var cr = "Cree";
var cs = "Czech";
var cu = "Church Slavic";
var cv = "Chuvash";
var cy = "Welsh";
var da = "Danish";
var de = "German";
var dv = "Maldivian";
var dz = "Dzongkha";
var ee = "Ewe";
var el = "Greek";
var en = "English";
var eo = "Esperanto";
var es = "Spanish";
var et = "Estonian";
var eu = "Basque";
var fa = "Persian";
var ff = "Fulah";
var fi = "Finnish";
var fj = "Fijian";
var fo = "Faroese";
var fr = "French";
var fy = "Western Frisian";
var ga = "Irish";
var gd = "Gaelic";
var gl = "Galician";
var gn = "Guarani";
var gu = "Gujarati";
var gv = "Manx";
var ha = "Hausa";
var he = "Hebrew";
var hi = "Hindi";
var ho = "Hiri Motu";
var hr = "Croatian";
var ht = "Haitian";
var hu = "Hungarian";
var hy = "Armenian";
var hz = "Herero";
var ia = "Interlingua";
var id = "Indonesian";
var ie = "Interlingue";
var ig = "Igbo";
var ii = "Sichuan Yi";
var ik = "Inupiaq";
var io = "Ido";
var is = "Icelandic";
var it = "Italian";
var iu = "Inuktitut";
var ja = "Japanese";
var jv = "Javanese";
var ka = "Georgian";
var kg = "Kongo";
var ki = "Kikuyu";
var kj = "Kuanyama";
var kk = "Kazakh";
var kl = "Kalaallisut";
var km = "Central Khmer";
var kn = "Kannada";
var ko = "Korean";
var kr = "Kanuri";
var ks = "Kashmiri";
var ku = "Kurdish";
var kv = "Komi";
var kw = "Cornish";
var ky = "Kirghiz";
var la = "Latin";
var lb = "Luxembourgish";
var lg = "Ganda";
var li = "Limburgan";
var ln = "Lingala";
var lo = "Lao";
var lt = "Lithuanian";
var lu = "Luba-Katanga";
var lv = "Latvian";
var mg = "Malagasy";
var mh = "Marshallese";
var mi = "Maori";
var mk = "Macedonian";
var ml = "Malayalam";
var mn = "Mongolian";
var mr = "Marathi";
var ms = "Malay";
var mt = "Maltese";
var my = "Burmese";
var na = "Nauru";
var nb = "Norwegian";
var nd = "North Ndebele";
var ne = "Nepali";
var ng = "Ndonga";
var nl = "Dutch";
var nn = "Norwegian";
var no = "Norwegian";
var nr = "South Ndebele";
var nv = "Navajo";
var ny = "Chichewa";
var oc = "Occitan";
var oj = "Ojibwa";
var om = "Oromo";
var or = "Oriya";
var os = "Ossetic";
var pa = "Panjabi";
var pi = "Pali";
var pl = "Polish";
var ps = "Pushto";
var pt = "Portuguese";
var qu = "Quechua";
var rm = "Romansh";
var rn = "Rundi";
var ro = "Romanian";
var ru = "Russian";
var rw = "Kinyarwanda";
var sa = "Sanskrit";
var sc = "Sardinian";
var sd = "Sindhi";
var se = "Northern Sami";
var sg = "Sango";
var si = "Sinhala";
var sk = "Slovak";
var sl = "Slovenian";
var sm = "Samoan";
var sn = "Shona";
var so = "Somali";
var sq = "Albanian";
var sr = "Serbian";
var ss = "Swati";
var st = "Sotho, Southern";
var su = "Sundanese";
var sv = "Swedish";
var sw = "Swahili";
var ta = "Tamil";
var te = "Telugu";
var tg = "Tajik";
var th = "Thai";
var ti = "Tigrinya";
var tk = "Turkmen";
var tl = "Tagalog";
var tn = "Tswana";
var to = "Tonga";
var tr = "Turkish";
var ts = "Tsonga";
var tt = "Tatar";
var tw = "Twi";
var ty = "Tahitian";
var ug = "Uighur";
var uk = "Ukrainian";
var ur = "Urdu";
var uz = "Uzbek";
var ve = "Venda";
var vi = "Vietnamese";
var vo = "Volapük";
var wa = "Walloon";
var wo = "Wolof";
var xh = "Xhosa";
var yi = "Yiddish";
var yo = "Yoruba";
var za = "Zhuang";
var zh = "Chinese";
var zu = "Zulu";
var codes = {
aa: aa,
ab: ab,
ae: ae,
af: af,
ak: ak,
am: am,
an: an,
ar: ar,
as: as,
av: av,
ay: ay,
az: az,
ba: ba,
be: be,
bg: bg,
bh: bh,
bi: bi,
bm: bm,
bn: bn,
bo: bo,
br: br,
bs: bs,
ca: ca,
ce: ce,
ch: ch,
co: co,
cr: cr,
cs: cs,
cu: cu,
cv: cv,
cy: cy,
da: da,
de: de,
dv: dv,
dz: dz,
ee: ee,
el: el,
en: en,
eo: eo,
es: es,
et: et,
eu: eu,
fa: fa,
ff: ff,
fi: fi,
fj: fj,
fo: fo,
fr: fr,
fy: fy,
ga: ga,
gd: gd,
gl: gl,
gn: gn,
gu: gu,
gv: gv,
ha: ha,
he: he,
hi: hi,
ho: ho,
hr: hr,
ht: ht,
hu: hu,
hy: hy,
hz: hz,
ia: ia,
id: id,
ie: ie,
ig: ig,
ii: ii,
ik: ik,
io: io,
is: is,
it: it,
iu: iu,
ja: ja,
jv: jv,
ka: ka,
kg: kg,
ki: ki,
kj: kj,
kk: kk,
kl: kl,
km: km,
kn: kn,
ko: ko,
kr: kr,
ks: ks,
ku: ku,
kv: kv,
kw: kw,
ky: ky,
la: la,
lb: lb,
lg: lg,
li: li,
ln: ln,
lo: lo,
lt: lt,
lu: lu,
lv: lv,
mg: mg,
mh: mh,
mi: mi,
mk: mk,
ml: ml,
mn: mn,
mr: mr,
ms: ms,
mt: mt,
my: my,
na: na,
nb: nb,
nd: nd,
ne: ne,
ng: ng,
nl: nl,
nn: nn,
no: no,
nr: nr,
nv: nv,
ny: ny,
oc: oc,
oj: oj,
om: om,
or: or,
os: os,
pa: pa,
pi: pi,
pl: pl,
ps: ps,
pt: pt,
qu: qu,
rm: rm,
rn: rn,
ro: ro,
ru: ru,
rw: rw,
sa: sa,
sc: sc,
sd: sd,
se: se,
sg: sg,
si: si,
sk: sk,
sl: sl,
sm: sm,
sn: sn,
so: so,
sq: sq,
sr: sr,
ss: ss,
st: st,
su: su,
sv: sv,
sw: sw,
ta: ta,
te: te,
tg: tg,
th: th,
ti: ti,
tk: tk,
tl: tl,
tn: tn,
to: to,
tr: tr,
ts: ts,
tt: tt,
tw: tw,
ty: ty,
ug: ug,
uk: uk,
ur: ur,
uz: uz,
ve: ve,
vi: vi,
vo: vo,
wa: wa,
wo: wo,
xh: xh,
yi: yi,
yo: yo,
za: za,
zh: zh,
zu: zu
};
function isISO639LanguageCode(input) {
return hasOwnProperty(codes, input);
}
function isBCP47LanguageCode(input) {
const hyphenIndex = input.indexOf('-');
if (hyphenIndex !== -1) {
input = input.substring(0, hyphenIndex);
}
return isISO639LanguageCode(input);
}
/*
* Copyright (c) 2023.
* Author Peter Placzek (tada5hi)
* For the full copyright and license information,
* view the LICENSE file that was distributed with this source code.
*/ function template(str, data, regex = /\{\{(.+?)\}\}/g) {
return Array.from(str.matchAll(regex)).reduce((acc, match)=>{
if (typeof data[match[1]] !== 'undefined') {
return acc.replace(match[0], data[match[1]]);
}
return acc;
}, str);
}
class Ilingo {
// ----------------------------------------------------
merge(instance) {
const ownEntries = Array.from(this.stores.values());
const foreignEntries = Array.from(instance.stores.values());
let foreignEntriesIndex = -1;
for(let i = 0; i < foreignEntries.length; i++){
foreignEntriesIndex = -1;
for(let j = 0; j < ownEntries.length; j++){
if (ownEntries[j] === foreignEntries[i]) {
foreignEntriesIndex = j;
break;
}
}
if (foreignEntriesIndex === -1) {
this.stores.add(foreignEntries[i]);
}
}
}
// ----------------------------------------------------
setLocale(key) {
this.locale = key;
}
resetLocale() {
this.locale = LOCALE_DEFAULT;
}
getLocale() {
return this.locale;
}
// ----------------------------------------------------
async getLocales() {
const locales = [];
const entries = this.stores.values();
// eslint-disable-next-line no-constant-condition
while(true){
const store = entries.next();
if (store.done) {
break;
}
locales.push(...await store.value.getLocales());
}
return Array.from(new Set(locales));
}
// ----------------------------------------------------
async get(ctx) {
let message;
const entries = this.stores.values();
// eslint-disable-next-line no-constant-condition
while(true){
const store = entries.next();
if (store.done) {
break;
}
message = await store.value.get({
locale: ctx.locale || this.getLocale(),
group: ctx.group,
key: ctx.key
});
if (message) {
break;
}
}
if (!message) {
return undefined;
}
return this.format(message, ctx.data || {});
}
// ----------------------------------------------------
format(input, data) {
return template(input, data || {});
}
// ----------------------------------------------------
constructor(input = {}){
this.locale = input.locale || LOCALE_DEFAULT;
this.stores = new Set();
if (input.store) {
this.stores.add(input.store);
}
}
}
class MemoryStore {
async get(context) {
if (!this.data[context.locale] || !this.data[context.locale][context.group]) {
return undefined;
}
const output = getPathValue(this.data[context.locale][context.group], context.key);
if (typeof output === 'string') {
return output;
}
return undefined;
}
async set(context) {
this.initLines(context.group, context.locale);
setPathValue(this.data[context.locale][context.group], context.key, context.value);
}
initLines(group, locale) {
if (typeof this.data[locale] === 'undefined') {
this.data[locale] = {};
}
if (typeof this.data[locale][group] === 'undefined') {
this.data[locale][group] = {};
}
}
async getLocales() {
return Object.keys(this.data);
}
constructor(options){
this.data = options.data;
}
}
export { Ilingo, MemoryStore, isBCP47LanguageCode, isISO639LanguageCode, isLineRecord, template };
//# sourceMappingURL=index.mjs.map