-
Notifications
You must be signed in to change notification settings - Fork 177
/
Copy pathlocale.js
114 lines (94 loc) · 2.29 KB
/
locale.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
(function($, $$) {
var _ = Mavo.Locale = $.Class({
constructor: function(lang, phrases) {
this.lang = lang;
this.phrases = {};
this.extend(phrases);
},
get fallback() {
// TODO should we fallback to other dialects? I.e. should en-US fallback to en-GB if en didn't exist?
if (_.all[this.baseLang]) {
return _.all[this.baseLang];
}
if (this !== _.default) {
return _.default;
}
},
extend: function(phrases) {
$.extend(this.phrases, phrases);
},
phrase: function(id, vars) {
var key = id.toLowerCase();
var phrase = this.phrases[key];
if (phrase === undefined && this.fallback) {
phrase = this.fallback.phrase(key);
}
if (phrase === undefined) {
// Everything failed, use id
phrase = key.replace(/\b-\b/g, " ");
}
else if (vars) {
var keys = phrase.match(/\{\w+(?=\})/g)?.map(v => v.slice(1)) ?? [];
Mavo.Functions.unique(keys).forEach(name => {
if (name in vars) {
phrase = phrase.replace(RegExp(`{${name}}`, "gi"), vars[name]);
}
});
}
return phrase;
},
live: {
lang: function(lang) {
this.baseLang = _.getBaseLang(lang);
if (lang == this.baseLang) {
this.baseLang = null;
}
}
},
static: {
all: {},
/**
* Register new locale or extend existing locale
*/
register: function(lang, phrases) {
if (_.all[lang]) {
_.all[lang].extend(phrases);
}
else {
_.all[lang] = new _(lang, phrases);
}
},
// Get locale for a given language, use its base as fallback
match: function(lang = "") {
return _.all[lang] || _.all[_.getBaseLang(lang)];
},
// Get locale for a given language, use its base as fallback, and the default locale if nothing exists
get: function(lang) {
return _.match(lang) || _.default;
},
getBaseLang: function(lang) {
return lang.split("-")[0];
},
lazy: {
default: () => {
return _.match(Mavo.locale) || _.all.en;
}
}
}
});
/**
* Use phrase
*/
Mavo.prototype._ = function(id, vars) {
return this.locale && id? this.locale.phrase(id, vars) : id;
};
Mavo.ready.then(() => {
$$("datalist.mv-phrases[lang]").forEach(datalist => {
var phrases = $$("option", datalist).reduce((o, option) => {
o[option.value] = option.textContent.trim();
return o;
}, {});
Mavo.Locale.register(datalist.lang, phrases);
});
});
})(Bliss, Bliss.$);