/
i18n.js
132 lines (119 loc) · 4.03 KB
/
i18n.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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* i18n integration. This is forked from jarn.jsi18n
*
* This is a singleton.
* Configuration is done on the body tag data-i18ncatalogurl attribute
* <body data-i18ncatalogurl="/plonejsi18n">
*
* Or, it'll default to "/plonejsi18n"
*/
import $ from "jquery";
const i18n = function () {
var self = this;
self.baseUrl = $("body").attr("data-i18ncatalogurl");
self.currentLanguage = $("html").attr("lang") || "en";
// Fix for country specific languages
if (self.currentLanguage.split("-").length > 1) {
self.currentLanguage =
self.currentLanguage.split("-")[0] +
"_" +
self.currentLanguage.split("-")[1].toUpperCase();
}
self.storage = null;
self.catalogs = {};
self.ttl = 24 * 3600 * 1000;
// Internet Explorer 8 does not know Date.now() which is used in e.g. loadCatalog, so we "define" it
if (!Date.now) {
Date.now = function () {
return new Date().valueOf();
};
}
try {
if (
"localStorage" in window &&
window.localStorage !== null &&
"JSON" in window &&
window.JSON !== null
) {
self.storage = window.localStorage;
}
} catch (e) {
console.log("Failed to set local storage");
}
self.configure = function (config) {
for (var key in config) {
self[key] = config[key];
}
};
self._setCatalog = function (domain, language, catalog) {
if (domain in self.catalogs) {
self.catalogs[domain][language] = catalog;
} else {
self.catalogs[domain] = {};
self.catalogs[domain][language] = catalog;
}
};
self._storeCatalog = function (domain, language, catalog) {
var key = domain + "-" + language;
if (self.storage !== null && catalog !== null) {
self.storage.setItem(key, JSON.stringify(catalog));
self.storage.setItem(key + "-updated", Date.now());
}
};
self.getUrl = function (domain, language) {
return self.baseUrl + "?domain=" + domain + "&language=" + language;
};
self.loadCatalog = function (domain, language) {
if (language === undefined) {
language = self.currentLanguage;
}
if (self.storage !== null) {
var key = domain + "-" + language;
if (key in self.storage) {
if (
Date.now() - parseInt(self.storage.getItem(key + "-updated"), 10) <
self.ttl
) {
var catalog = JSON.parse(self.storage.getItem(key));
self._setCatalog(domain, language, catalog);
return;
}
}
}
if (!self.baseUrl) {
return;
}
$.getJSON(self.getUrl(domain, language), function (catalog) {
if (catalog === null) {
return;
}
self._setCatalog(domain, language, catalog);
self._storeCatalog(domain, language, catalog);
});
};
self.MessageFactory = function (domain, language) {
language = language || self.currentLanguage;
return function translate(msgid, keywords) {
var msgstr;
if (
domain in self.catalogs &&
language in self.catalogs[domain] &&
msgid in self.catalogs[domain][language]
) {
msgstr = self.catalogs[domain][language][msgid];
} else {
msgstr = msgid;
}
if (keywords) {
var regexp, keyword;
for (keyword in keywords) {
if (Object.prototype.hasOwnProperty.call(keywords, keyword)) {
regexp = new RegExp("\\$\\{" + keyword + "\\}", "g");
msgstr = msgstr.replace(regexp, keywords[keyword]);
}
}
}
return msgstr;
};
};
};
export default i18n;