b28-cli 1.7.1 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +13 -13
- package/README.MD +470 -466
- package/TestFile/output/lang/BRPT.json +24 -0
- package/TestFile/output/lang/CN.json +24 -0
- package/TestFile/output/lang/CS.json +24 -0
- package/TestFile/output/lang/DE.json +24 -0
- package/TestFile/output/lang/EN.json +24 -0
- package/TestFile/output/lang/ES.json +24 -0
- package/TestFile/output/lang/FR.json +24 -0
- package/TestFile/output/lang/HU.json +24 -0
- package/TestFile/output/lang/IT.json +24 -0
- package/TestFile/output/lang/KO.json +24 -0
- package/TestFile/output/lang/LAES.json +24 -0
- package/TestFile/output/lang/NL.json +24 -0
- package/TestFile/output/lang/PL.json +24 -0
- package/TestFile/output/lang/PT.json +24 -0
- package/TestFile/output/lang/RO.json +24 -0
- package/TestFile/output/lang/RU.json +24 -0
- package/TestFile/output/lang/TR.json +24 -0
- package/TestFile/output/lang/UK.json +24 -0
- package/TestFile/output/lang/ZH.json +24 -0
- package/TestFile/output/lang/brpt/translate.json +23 -0
- package/TestFile/output/lang/cn/translate.json +23 -0
- package/TestFile/output/lang/cs/translate.json +23 -0
- package/TestFile/output/lang/de/translate.json +23 -0
- package/TestFile/output/lang/es/translate.json +23 -0
- package/TestFile/output/lang/fr/translate.json +23 -0
- package/TestFile/output/lang/hu/translate.json +23 -0
- package/TestFile/output/lang/it/translate.json +23 -0
- package/TestFile/output/lang/ko/translate.json +23 -0
- package/TestFile/output/lang/laes/translate.json +23 -0
- package/TestFile/output/lang/nl/translate.json +23 -0
- package/TestFile/output/lang/pl/translate.json +23 -0
- package/TestFile/output/lang/pt/translate.json +23 -0
- package/TestFile/output/lang/ro/translate.json +23 -0
- package/TestFile/output/lang/ru/translate.json +23 -0
- package/TestFile/output/lang/tr/translate.json +23 -0
- package/TestFile/output/lang/uk/translate.json +23 -0
- package/TestFile/output/lang/zh/translate.json +23 -0
- package/TestFile/output/lang.json +25 -0
- package/b28n.js +739 -739
- package/b28nPigeonhole/11ac_ecos_b28n.js +677 -677
- package/b28nPigeonhole/11ac_linux_b28n_async.js +709 -709
- package/b28nPigeonhole/4G03_b28n_async.js +708 -708
- package/b28nPigeonhole/G5310P_b28n.js +650 -650
- package/b28nPigeonhole/es5b28n.js +711 -711
- package/b28nPigeonhole/es6b28n.js +857 -857
- package/b28nPigeonhole/readMe.md +20 -20
- package/b28nPigeonhole//345/276/256/344/274/201/350/267/257/347/224/261b28n.js +916 -916
- package/dist/ExtractLangExcel.js +138 -45
- package/dist/cmd.js +14 -9
- package/dist/excel2json.js +215 -54
- package/dist/extract/extract-html.js +2 -2
- package/dist/extract/extract-js.js +2 -2
- package/dist/extract/extract-regexp.js +2 -2
- package/dist/extract/extract-vue.js +9 -9
- package/dist/extract/extract.js +4 -4
- package/dist/extract/extractRegexp/index.js +6 -6
- package/dist/extract/vue/html-parser.js +16 -16
- package/dist/extract/vue/util.js +2 -2
- package/dist/extract/vue/vue-compiler.js +2 -2
- package/dist/extractOrigin/extract.js +2 -2
- package/dist/extractOrigin/extract_html_ori.js +2 -2
- package/dist/extractOrigin/extract_js_ori.js +2 -2
- package/dist/handle.js +57 -7
- package/dist/index.js +36 -7
- package/dist/mergeExcel.js +407 -0
- package/dist/mergeJson.js +423 -2
- package/dist/util/config.js +90 -32
- package/dist/util/index.js +48 -41
- package/index.js +5 -5
- package/package.json +63 -62
- package/result.txt +53 -53
- package/test.js +182 -182
|
@@ -1,709 +1,709 @@
|
|
|
1
|
-
// "New Butterfat internationalization" (b28new.js)
|
|
2
|
-
// Released under the MIT License
|
|
3
|
-
// versions 3.0.0
|
|
4
|
-
// $Id: b28new.js 2014-12-23 ETw $
|
|
5
|
-
/***********************************************************************************************
|
|
6
|
-
************************************************************************************************/
|
|
7
|
-
|
|
8
|
-
(function (window, document) {
|
|
9
|
-
|
|
10
|
-
//定义保存翻译的字典和配置
|
|
11
|
-
var MSG = {},
|
|
12
|
-
b28Cfg = {},
|
|
13
|
-
dateObj = new Date();
|
|
14
|
-
|
|
15
|
-
MSG.extend = function (obj) {
|
|
16
|
-
var name;
|
|
17
|
-
|
|
18
|
-
for (name in obj) {
|
|
19
|
-
if (obj.hasOwnProperty(name)) {
|
|
20
|
-
MSG[name] = obj[name];
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
// var configLang = CONFIG_MULTI_LANGUAGE_SORFWARE;
|
|
26
|
-
// var lang = configLang.split(",");
|
|
27
|
-
/*********翻译配置***********/
|
|
28
|
-
//配置翻译支持的所有语言,如果不支持某种语言,则以默认语言显示
|
|
29
|
-
//使用前请添加所有已支持的语言到此数组中
|
|
30
|
-
var configLang = top.CONFIG_MULTI_LANGUAGE_SORFWARE;
|
|
31
|
-
var lang = configLang.split(",");
|
|
32
|
-
b28Cfg.supportLang = lang;
|
|
33
|
-
//id语言
|
|
34
|
-
b28Cfg.idLang = "en";
|
|
35
|
-
//配置语言包文件类型 within ["xml", "json"]
|
|
36
|
-
b28Cfg.fileType = "json";
|
|
37
|
-
//是否对要翻译文字进行trim
|
|
38
|
-
b28Cfg.trimText = true;
|
|
39
|
-
//默认替换节点中的文字,将其设为true可插入html
|
|
40
|
-
b28Cfg.insertHTML = true;
|
|
41
|
-
|
|
42
|
-
//是否初始化下拉框
|
|
43
|
-
b28Cfg.initSelect = true;
|
|
44
|
-
|
|
45
|
-
//时间字符串
|
|
46
|
-
b28Cfg.dateStr = dateObj.getDay() + "" + dateObj.getHours() + "" + dateObj.getMinutes();
|
|
47
|
-
|
|
48
|
-
//获取默认语言
|
|
49
|
-
/**
|
|
50
|
-
* [getDefaultLang 根据宏值及浏览器语言获取设备显示的默认语言]
|
|
51
|
-
*
|
|
52
|
-
* @param {[type]} lang [功能宏中指定的支持语言]
|
|
53
|
-
*
|
|
54
|
-
* @return {[type]} [浏览器默认显示的设备语言]
|
|
55
|
-
*/
|
|
56
|
-
function getDefaultLang(lang) {
|
|
57
|
-
var special = {
|
|
58
|
-
"zh": "cn",
|
|
59
|
-
"zh-chs": "cn",
|
|
60
|
-
"zh-cn": "cn",
|
|
61
|
-
"zh-cht": "cn",
|
|
62
|
-
"zh-hk": "zh",
|
|
63
|
-
"zh-mo": "zh",
|
|
64
|
-
"zh-tw": "zh",
|
|
65
|
-
"zh-sg": "zh",
|
|
66
|
-
"es-419":"laes",
|
|
67
|
-
"pt-br":"brpt"
|
|
68
|
-
},
|
|
69
|
-
navLang;
|
|
70
|
-
//获取浏览器语言
|
|
71
|
-
navLang = (window.navigator.language || window.navigator.userLanguage || window.navigator.browserLanguage || window.navigator.systemLanguage).toLowerCase();
|
|
72
|
-
navLang = special[navLang] || navLang.split("-")[0].toString();
|
|
73
|
-
|
|
74
|
-
//宏值中包含浏览器语言,则将其作为默认语言
|
|
75
|
-
for (var i = 0; i<lang.length; i++) {
|
|
76
|
-
if (lang[i] === navLang) {
|
|
77
|
-
return lang[i];
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
//宏值中不包含浏览器语言,则把宏值中第一项作为默认语言
|
|
81
|
-
return lang[0];
|
|
82
|
-
}
|
|
83
|
-
//页面初始化后默认显示的语言
|
|
84
|
-
b28Cfg.defaultLang = getDefaultLang(lang) || b28Cfg.idLang;
|
|
85
|
-
|
|
86
|
-
var win = window,
|
|
87
|
-
doc = document,
|
|
88
|
-
core_version = "3.0.0",
|
|
89
|
-
core_trim = core_version.trim,
|
|
90
|
-
|
|
91
|
-
//获取语言文件相对路径
|
|
92
|
-
js = document.scripts,
|
|
93
|
-
langPath = js[js.length-1].src.substring(0,js[js.length-1].src.lastIndexOf("/")+1),
|
|
94
|
-
|
|
95
|
-
// JSON RegExp
|
|
96
|
-
rvalidchars = /^[\],:{}\s]*$/,
|
|
97
|
-
rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
|
|
98
|
-
rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
|
|
99
|
-
rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
|
|
100
|
-
|
|
101
|
-
// 语言包文件是否加载完成标志
|
|
102
|
-
b28Loaded = false,
|
|
103
|
-
|
|
104
|
-
// Define until function
|
|
105
|
-
domReady, loadScript, ajaxLoadScript, loadJSON, loadXML, innerText, trim, _trim, parseJSON, createXHR,
|
|
106
|
-
|
|
107
|
-
// Define a local copy of Butterlate
|
|
108
|
-
Butterlate;
|
|
109
|
-
|
|
110
|
-
trim = core_trim && !core_trim.call("\uFEFF\xA0") ?
|
|
111
|
-
function (text) {
|
|
112
|
-
return text == null ?
|
|
113
|
-
"" :
|
|
114
|
-
core_trim.call(text);
|
|
115
|
-
} :
|
|
116
|
-
|
|
117
|
-
// Otherwise use our own trimming function
|
|
118
|
-
function (text) {
|
|
119
|
-
if(text == null) {
|
|
120
|
-
return "";
|
|
121
|
-
} else {
|
|
122
|
-
text += "";
|
|
123
|
-
}
|
|
124
|
-
var str = text.replace(/^\s+/, ""),
|
|
125
|
-
end = str.length - 1,
|
|
126
|
-
ws = /\s/;
|
|
127
|
-
|
|
128
|
-
while (ws.test(str.charAt(end))) {
|
|
129
|
-
end--;
|
|
130
|
-
}
|
|
131
|
-
return str.slice(0, end + 1);
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
_trim = function (str) {
|
|
135
|
-
if(b28Cfg.trimText) {
|
|
136
|
-
return trim(str)
|
|
137
|
-
} else {
|
|
138
|
-
return str;
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
parseJSON = function (data) {
|
|
143
|
-
if (window.JSON && window.JSON.parse) {
|
|
144
|
-
return window.JSON.parse(data);
|
|
145
|
-
}
|
|
146
|
-
if (data === null) {
|
|
147
|
-
return data;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (typeof data === "string") {
|
|
151
|
-
|
|
152
|
-
// Make sure leading/trailing whitespace is removed (IE can't handle it)
|
|
153
|
-
data = trim(data);
|
|
154
|
-
|
|
155
|
-
if (data) {
|
|
156
|
-
// Make sure the incoming data is actual JSON
|
|
157
|
-
// Logic borrowed from http://json.org/json2.js
|
|
158
|
-
if (rvalidchars.test(data.replace(rvalidescape, "@")
|
|
159
|
-
.replace(rvalidtokens, "]")
|
|
160
|
-
.replace(rvalidbraces, ""))) {
|
|
161
|
-
|
|
162
|
-
return (new Function("return " + data))();
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
createXHR = function () {
|
|
169
|
-
try {
|
|
170
|
-
//return function() {
|
|
171
|
-
return new XMLHttpRequest();
|
|
172
|
-
//}
|
|
173
|
-
} catch (e1) {
|
|
174
|
-
try {
|
|
175
|
-
//return function() {
|
|
176
|
-
return new ActiveXObject("Msxml2.XMLHTTP");
|
|
177
|
-
//}
|
|
178
|
-
} catch (e2) {
|
|
179
|
-
try {
|
|
180
|
-
//return function() {
|
|
181
|
-
return new ActiveXObject("Microsoft.XMLHTTP");
|
|
182
|
-
//}
|
|
183
|
-
} catch (e3) {
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
innerText = (function () {
|
|
191
|
-
if(b28Cfg.insertHTML) {
|
|
192
|
-
return function(elem, str) {
|
|
193
|
-
if(str) {
|
|
194
|
-
elem.innerHTML = str;
|
|
195
|
-
return elem;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
var element = doc.createElement('p');
|
|
201
|
-
element.innerHTML = core_version;
|
|
202
|
-
return element.textContent ? function (elem, str) {
|
|
203
|
-
if (str) {
|
|
204
|
-
elem.textContent = str;
|
|
205
|
-
return elem;
|
|
206
|
-
}
|
|
207
|
-
return elem.textContent;
|
|
208
|
-
|
|
209
|
-
} : function (elem, str) {
|
|
210
|
-
if (str) {
|
|
211
|
-
elem.innerText = str;
|
|
212
|
-
return elem;
|
|
213
|
-
}
|
|
214
|
-
return elem.innerText;
|
|
215
|
-
};
|
|
216
|
-
}());
|
|
217
|
-
|
|
218
|
-
function assertElement(elem) {
|
|
219
|
-
//支持HTMLElement
|
|
220
|
-
if(typeof HTMLElement === 'object' && elem instanceof HTMLElement) {
|
|
221
|
-
return true;
|
|
222
|
-
}
|
|
223
|
-
//ie等
|
|
224
|
-
if(typeof elem === 'object' && (elem.nodeType === 1 || elem.nodeType === 9) &&
|
|
225
|
-
typeof elem.nodeName === 'string') {
|
|
226
|
-
return true;
|
|
227
|
-
}
|
|
228
|
-
return false;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
function transTitle() {
|
|
232
|
-
doc.title = Butterlate.gettext(_trim(doc.title));
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
function replaceTextNodeValue(element) {
|
|
236
|
-
if (!element) {
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
var firstChild = element.firstChild,
|
|
240
|
-
nextSibling = element.nextSibling,
|
|
241
|
-
nodeType = element.nodeType,
|
|
242
|
-
btnStr = "submit,reset,button",
|
|
243
|
-
curValue, isInputButton;
|
|
244
|
-
|
|
245
|
-
//handle element node
|
|
246
|
-
if (nodeType === 1) {
|
|
247
|
-
|
|
248
|
-
// Hander elements common attribute need to replace
|
|
249
|
-
curValue = element.getAttribute("alt");
|
|
250
|
-
if (curValue && /\S/.test(curValue)) {
|
|
251
|
-
curValue = _trim(curValue);
|
|
252
|
-
element.setAttribute("alt", Butterlate.gettext(curValue));
|
|
253
|
-
}
|
|
254
|
-
curValue = element.getAttribute("placeholder");
|
|
255
|
-
if (curValue && /\S/.test(curValue)) {
|
|
256
|
-
curValue = _trim(curValue);
|
|
257
|
-
element.setAttribute("placeholder", Butterlate.gettext(curValue));
|
|
258
|
-
}
|
|
259
|
-
curValue = element.getAttribute("title");
|
|
260
|
-
if (curValue && /\S/.test(curValue)) {
|
|
261
|
-
curValue = _trim(curValue);
|
|
262
|
-
element.setAttribute("title", Butterlate.gettext(curValue));
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
isInputButton = element.nodeName.toLowerCase() == "input" &&
|
|
266
|
-
(btnStr.indexOf(element.getAttribute("type")) !== -1);
|
|
267
|
-
if (isInputButton) {
|
|
268
|
-
|
|
269
|
-
//data-lang属性具有较高优先级
|
|
270
|
-
curValue = element.getAttribute("data-lang") || element.value;
|
|
271
|
-
} else {
|
|
272
|
-
curValue = element.getAttribute("data-lang");
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
if (curValue && /\S/.test(curValue)) {
|
|
276
|
-
curValue = _trim(curValue);
|
|
277
|
-
if (curValue) {
|
|
278
|
-
if (isInputButton) {
|
|
279
|
-
element.setAttribute("value", Butterlate.gettext(curValue));
|
|
280
|
-
} else {
|
|
281
|
-
innerText(element, Butterlate.gettext(curValue));
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
//handle textNode
|
|
287
|
-
} else if (nodeType === 3 && /\S/.test(element.nodeValue)) {
|
|
288
|
-
curValue = _trim(element.nodeValue);
|
|
289
|
-
element.nodeValue = Butterlate.gettext(curValue);
|
|
290
|
-
}
|
|
291
|
-
//translate siblings
|
|
292
|
-
if (nextSibling) {
|
|
293
|
-
replaceTextNodeValue(nextSibling);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
//translate firstChild
|
|
297
|
-
//stop handle elem.child if elem has attr data-lang
|
|
298
|
-
if(firstChild && !element.getAttribute("data-lang")) {
|
|
299
|
-
replaceTextNodeValue(firstChild);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
domReady = (function () {
|
|
304
|
-
var funcs = [],
|
|
305
|
-
already = false,
|
|
306
|
-
len,
|
|
307
|
-
i;
|
|
308
|
-
|
|
309
|
-
function handler(e) {
|
|
310
|
-
e = e || win.event;
|
|
311
|
-
if (already) {
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
if (e.type === 'readystatechange' && doc.readyState !== 'complete') {
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
for (i = 0, len = funcs.length; i < len; i++) {
|
|
320
|
-
funcs[i].call(doc);
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
already = true;
|
|
324
|
-
funcs = null;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
if (doc.addEventListener) {
|
|
328
|
-
doc.addEventListener("DOMContentLoaded", handler, false);
|
|
329
|
-
doc.addEventListener("onreadystatechange", handler, false);
|
|
330
|
-
win.addEventListener("load", handler, false);
|
|
331
|
-
} else if (doc.attachEvent) {
|
|
332
|
-
doc.attachEvent('onreadystatechange', handler);
|
|
333
|
-
win.attachEvent('onload', handler);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
// return ready() function
|
|
337
|
-
return function ready(f) {
|
|
338
|
-
if (already) {
|
|
339
|
-
f.call(doc);
|
|
340
|
-
} else {
|
|
341
|
-
funcs.push(f);
|
|
342
|
-
}
|
|
343
|
-
};
|
|
344
|
-
}());
|
|
345
|
-
|
|
346
|
-
loadScript = (function () {
|
|
347
|
-
var scripts = doc.createElement("script"),
|
|
348
|
-
hasReadyState = scripts.readyState;
|
|
349
|
-
|
|
350
|
-
return hasReadyState ? function (url, callBack) {
|
|
351
|
-
var scripts = doc.createElement("script");
|
|
352
|
-
|
|
353
|
-
scripts.onreadystatechange = function () {
|
|
354
|
-
if (scripts.readyState === 'loaded' ||
|
|
355
|
-
scripts.readyState === 'complete') {
|
|
356
|
-
scripts.onreadystatechange = null;
|
|
357
|
-
|
|
358
|
-
if (typeof callBack === "function") {
|
|
359
|
-
callBack();
|
|
360
|
-
callBack = null;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
};
|
|
364
|
-
scripts.src = url;
|
|
365
|
-
doc.getElementsByTagName("head")[0].appendChild(scripts);
|
|
366
|
-
|
|
367
|
-
} : function (url, callBack) {
|
|
368
|
-
var scripts = doc.createElement("script");
|
|
369
|
-
|
|
370
|
-
scripts.onload = function () {
|
|
371
|
-
if (typeof callBack === "function") {
|
|
372
|
-
callBack();
|
|
373
|
-
callBack = null;
|
|
374
|
-
}
|
|
375
|
-
};
|
|
376
|
-
scripts.src = url;
|
|
377
|
-
doc.getElementsByTagName("head")[0].appendChild(scripts);
|
|
378
|
-
};
|
|
379
|
-
})();
|
|
380
|
-
|
|
381
|
-
loadJSON = function (url, callBack) {
|
|
382
|
-
var request = createXHR();
|
|
383
|
-
request.open("GET", url + "?" + Math.random(), false);
|
|
384
|
-
//request.setRequestHeader("If-Modified-Since", "1");
|
|
385
|
-
//request.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01");
|
|
386
|
-
request.send(null);
|
|
387
|
-
|
|
388
|
-
if (request.status >= 200 && request.status < 300 || request.status === 304) {
|
|
389
|
-
MSG.extend(parseJSON(request.responseText));
|
|
390
|
-
|
|
391
|
-
if (typeof callBack === "function") {
|
|
392
|
-
callBack();
|
|
393
|
-
callBack = null;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
loadXML = function (url, callBack) {
|
|
399
|
-
var request,
|
|
400
|
-
i,
|
|
401
|
-
pos,
|
|
402
|
-
posLen;
|
|
403
|
-
|
|
404
|
-
request = createXHR();
|
|
405
|
-
request.open("GET", url + "?" + Math.random(), false);
|
|
406
|
-
//request.setRequestHeader("If-Modified-Since", "1");
|
|
407
|
-
request.send(null);
|
|
408
|
-
|
|
409
|
-
if (request.status >= 200 && request.status < 300 || request.status === 304) {
|
|
410
|
-
pos = request.responseXML.documentElement.getElementsByTagName("message");
|
|
411
|
-
posLen = pos.length;
|
|
412
|
-
for (i = 0; i < posLen; i++) {
|
|
413
|
-
MSG[pos[i].getAttribute("msgid")] = pos[i].getAttribute("msgstr");
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
if (typeof callBack === "function") {
|
|
417
|
-
callBack();
|
|
418
|
-
callBack = null;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
function Butterlation() {
|
|
424
|
-
this.curDomain = 0;
|
|
425
|
-
this.domainArr = [];
|
|
426
|
-
this.options = {
|
|
427
|
-
"defaultLang": b28Cfg.defaultLang,
|
|
428
|
-
"support": b28Cfg.supportLang,
|
|
429
|
-
"fileType": b28Cfg.fileType
|
|
430
|
-
};
|
|
431
|
-
this.isSupport = function (lang) {
|
|
432
|
-
var support = this.options.support,
|
|
433
|
-
len = support.length,
|
|
434
|
-
i;
|
|
435
|
-
|
|
436
|
-
for (i = 0; i < len; i++) {
|
|
437
|
-
if (lang === support[i]) {
|
|
438
|
-
return support[i];
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
};
|
|
442
|
-
this.setLang = function (lang) {
|
|
443
|
-
|
|
444
|
-
if (lang !== undefined) {
|
|
445
|
-
|
|
446
|
-
if (!this.isSupport(lang)) {
|
|
447
|
-
lang = this.options.defaultLang;
|
|
448
|
-
}
|
|
449
|
-
doc.cookie = "bLanguage=" + lang + ";";
|
|
450
|
-
}
|
|
451
|
-
return lang;
|
|
452
|
-
};
|
|
453
|
-
this.getLang = function () {
|
|
454
|
-
var special = {
|
|
455
|
-
"zh": "cn",
|
|
456
|
-
"zh-chs": "cn",
|
|
457
|
-
"zh-cn": "cn",
|
|
458
|
-
"zh-cht": "cn",
|
|
459
|
-
"zh-hk": "zh",
|
|
460
|
-
"zh-mo": "zh",
|
|
461
|
-
"zh-tw": "zh",
|
|
462
|
-
"zh-sg": "zh",
|
|
463
|
-
"es-419":"laes",
|
|
464
|
-
"pt-br":"brpt"
|
|
465
|
-
},
|
|
466
|
-
defLang = this.options.defaultLang,
|
|
467
|
-
local, ret, start, end;
|
|
468
|
-
|
|
469
|
-
if ((doc.cookie.indexOf("bLanguage=")) === -1) {
|
|
470
|
-
local = (win.navigator.language || win.navigator.userLanguage ||
|
|
471
|
-
win.navigator.browserLanguage || win.navigator.systemLanguage || defLang).toLowerCase();
|
|
472
|
-
|
|
473
|
-
ret = special[local] || local.split("-")[0].toString();
|
|
474
|
-
} else {
|
|
475
|
-
if (doc.cookie.indexOf("bLanguage=") === 0) {
|
|
476
|
-
start = 10;
|
|
477
|
-
|
|
478
|
-
//incase there has cookie like: **bLanguage=cn
|
|
479
|
-
} else if (doc.cookie.indexOf("; bLanguage=") !== -1) {
|
|
480
|
-
start = doc.cookie.indexOf("; bLanguage=") + 12;
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
if (start !== undefined) {
|
|
484
|
-
end = (doc.cookie.indexOf(';', start) !== -1) ?
|
|
485
|
-
doc.cookie.indexOf(';', start) : doc.cookie.length;
|
|
486
|
-
ret = doc.cookie.substring(start, end);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
return this.isSupport(ret) || this.options.defaultLang;
|
|
491
|
-
};
|
|
492
|
-
this.getURL = function (domain) {
|
|
493
|
-
return langPath + this.lang + "/" + domain + "." + this.options.fileType + "?" + b28Cfg.dateStr;
|
|
494
|
-
};
|
|
495
|
-
this.setTextDomain = function (domain, lang, callBack) {
|
|
496
|
-
var i,
|
|
497
|
-
domainLen,
|
|
498
|
-
htmlElem = doc.documentElement;
|
|
499
|
-
|
|
500
|
-
//Hander lang is undefined
|
|
501
|
-
this.lang = lang || this.getLang();
|
|
502
|
-
this.setLang(lang);
|
|
503
|
-
this.curDomain = 0;
|
|
504
|
-
if (typeof callBack === "function") {
|
|
505
|
-
this.success = callBack;
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
htmlElem.style.display = "none";
|
|
509
|
-
if(this.lang == "cn"){
|
|
510
|
-
htmlElem.className = htmlElem.className + " lang-" + this.lang;
|
|
511
|
-
} else if(this.lang == "zh" ){
|
|
512
|
-
htmlElem.className = htmlElem.className + " lang-" + this.lang;
|
|
513
|
-
} else {
|
|
514
|
-
//增加多国语言样式
|
|
515
|
-
htmlElem.className = htmlElem.className + " lang-en lang-css-" + this.lang;
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
if (Object.prototype.toString.call(domain) === "[object Array]") {
|
|
521
|
-
domainLen = domain.length;
|
|
522
|
-
this.domainArr = domain;
|
|
523
|
-
|
|
524
|
-
for (i = 0; i < domainLen; i = i + 1) {
|
|
525
|
-
this.po = this.getURL(domain[i]);
|
|
526
|
-
this.loadDomain(this.po, i);
|
|
527
|
-
}
|
|
528
|
-
} else if (typeof domain === "string") {
|
|
529
|
-
this.domainArr.push(domain);
|
|
530
|
-
this.po = this.getURL(domain);
|
|
531
|
-
this.loadDomain(this.po, 0);
|
|
532
|
-
}
|
|
533
|
-
};
|
|
534
|
-
|
|
535
|
-
this.loadDomain = function (url) {
|
|
536
|
-
//当前语言为id语言,则不需要发请求
|
|
537
|
-
if (this.lang === b28Cfg.idLang) {
|
|
538
|
-
b28Loaded = true;
|
|
539
|
-
b28Cfg.initSelect && domReady(Butterlate.initSelectElem);
|
|
540
|
-
doc.documentElement.style.display = '';
|
|
541
|
-
if (typeof Butterlate.success === "function") {
|
|
542
|
-
Butterlate.success();
|
|
543
|
-
}
|
|
544
|
-
} else {
|
|
545
|
-
if(this.options.fileType === "json") {
|
|
546
|
-
loadJSON(url, this.loadedDict);
|
|
547
|
-
} else if(this.options.fileType === "xml") {
|
|
548
|
-
loadXML(url, this.loadedDict);
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
};
|
|
552
|
-
this.loadedDict = function () {
|
|
553
|
-
var len = Butterlate.domainArr.length;
|
|
554
|
-
if (Butterlate.curDomain + 1 === len) {
|
|
555
|
-
b28Loaded = true;
|
|
556
|
-
domReady(Butterlate.translatePage);
|
|
557
|
-
} else {
|
|
558
|
-
Butterlate.curDomain += 1;
|
|
559
|
-
}
|
|
560
|
-
};
|
|
561
|
-
this.isLoaded = function () {
|
|
562
|
-
return b28Loaded;
|
|
563
|
-
};
|
|
564
|
-
this.gettext = function (key) {
|
|
565
|
-
if(!key){
|
|
566
|
-
return "";
|
|
567
|
-
}
|
|
568
|
-
return MSG[key] !== undefined ? MSG[key] : key.replace(/^[a-zA-Z]\#[a-zA-Z][a-zA-Z][a-zA-Z]\#/g,"");
|
|
569
|
-
};
|
|
570
|
-
this.getFormatText = function (key, replacements) {
|
|
571
|
-
var nkey = this.gettext(key),
|
|
572
|
-
index,
|
|
573
|
-
count = 0;
|
|
574
|
-
if(!replacements) {
|
|
575
|
-
return nkey;
|
|
576
|
-
}
|
|
577
|
-
if (replacements instanceof Array && replacements.length !== 0) {
|
|
578
|
-
while ((index = nkey.indexOf('%s')) !== -1) {
|
|
579
|
-
nkey = nkey.slice(0, index) + replacements[count] +
|
|
580
|
-
nkey.slice(index + 2);
|
|
581
|
-
count = ((count + 1) === replacements.length) ? count : (count + 1);
|
|
582
|
-
}
|
|
583
|
-
} else if (typeof replacements === "string") {
|
|
584
|
-
index = nkey.indexOf('%s');
|
|
585
|
-
nkey = nkey.slice(0, index) + replacements + nkey.slice(index + 2);
|
|
586
|
-
}
|
|
587
|
-
return nkey;
|
|
588
|
-
};
|
|
589
|
-
this.initSelectElem = function () {
|
|
590
|
-
var selectElem = doc.getElementById('select-lang'),
|
|
591
|
-
len = b28Cfg.supportLang.length,
|
|
592
|
-
newOption, lang, i;
|
|
593
|
-
|
|
594
|
-
if (selectElem && selectElem.nodeName.toLowerCase() == "select") {
|
|
595
|
-
for (i = 0; i < len; i++) {
|
|
596
|
-
lang = b28Cfg.supportLang[i];
|
|
597
|
-
newOption = new Option(Butterlate.langArr[lang], lang);
|
|
598
|
-
selectElem.add(newOption, undefined);
|
|
599
|
-
}
|
|
600
|
-
selectElem.value = Butterlate.lang;
|
|
601
|
-
|
|
602
|
-
if (doc.addEventListener) {
|
|
603
|
-
selectElem.addEventListener("change", function () {
|
|
604
|
-
Butterlate.setLang(doc.getElementById('select-lang').value);
|
|
605
|
-
setTimeout(function () {
|
|
606
|
-
window.location.reload();
|
|
607
|
-
}, 24);
|
|
608
|
-
}, false);
|
|
609
|
-
|
|
610
|
-
} else if (doc.attachEvent) {
|
|
611
|
-
selectElem.attachEvent('onchange', function () {
|
|
612
|
-
Butterlate.setLang(doc.getElementById('select-lang').value);
|
|
613
|
-
setTimeout(function () {
|
|
614
|
-
window.location.reload();
|
|
615
|
-
}, 24);
|
|
616
|
-
});
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
this.translate = function (translateTarget) {
|
|
622
|
-
var translateElem;
|
|
623
|
-
|
|
624
|
-
if(assertElement(translateTarget)) {
|
|
625
|
-
translateElem = translateTarget;
|
|
626
|
-
} else if(translateTarget && typeof translateTarget === 'string') {
|
|
627
|
-
translateElem = doc.getElementById(translateTarget);
|
|
628
|
-
}
|
|
629
|
-
translateElem = translateElem || doc.documentElement;
|
|
630
|
-
|
|
631
|
-
//hidepage before translate
|
|
632
|
-
doc.documentElement.style.display = 'none';
|
|
633
|
-
|
|
634
|
-
replaceTextNodeValue(translateElem);
|
|
635
|
-
|
|
636
|
-
//show page when translate complete
|
|
637
|
-
doc.documentElement.style.display = '';
|
|
638
|
-
|
|
639
|
-
if (typeof Butterlate.success === "function") {
|
|
640
|
-
Butterlate.success();
|
|
641
|
-
}
|
|
642
|
-
};
|
|
643
|
-
|
|
644
|
-
this.translatePage = function () {
|
|
645
|
-
|
|
646
|
-
var bodyElem = doc.body || doc.documentElement;
|
|
647
|
-
|
|
648
|
-
// 翻译HTML页面内容
|
|
649
|
-
transTitle();
|
|
650
|
-
|
|
651
|
-
// 初始语言选择下拉框
|
|
652
|
-
b28Cfg.initSelect && Butterlate.initSelectElem();
|
|
653
|
-
|
|
654
|
-
Butterlate.translate(bodyElem);
|
|
655
|
-
|
|
656
|
-
};
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
Butterlate = new Butterlation();
|
|
660
|
-
|
|
661
|
-
Butterlate.langArr = {
|
|
662
|
-
"cn": "简体中文",
|
|
663
|
-
"zh": "繁體中文",
|
|
664
|
-
"de": "Deutsch", //德语
|
|
665
|
-
"en": "English", //英语
|
|
666
|
-
"es":"Español",//欧西
|
|
667
|
-
"laes":"Esp. (Amér. Lat.)",//美西
|
|
668
|
-
"nl":"Nederlands",//荷兰语
|
|
669
|
-
"ko":" 한국어",//韩语
|
|
670
|
-
"fr": "Français", //法国
|
|
671
|
-
"hu": "Magyar", //匈牙利
|
|
672
|
-
"it": "Italiano", //意大利
|
|
673
|
-
"pl": "Polski", //波兰
|
|
674
|
-
"ro": "Română", //罗马尼亚
|
|
675
|
-
"tr": "Türkçe", //土耳其
|
|
676
|
-
"ru": "Русский", //Russian 俄语
|
|
677
|
-
"brpt": "Port. (Amér.Lat.)", // 巴葡
|
|
678
|
-
"pt": "Português", // 欧葡
|
|
679
|
-
"cs": "Čeština",//捷克语
|
|
680
|
-
"uk":"Українська"//乌克兰语
|
|
681
|
-
};
|
|
682
|
-
|
|
683
|
-
//for debug use
|
|
684
|
-
Butterlate.getMsg = function() {
|
|
685
|
-
return MSG;
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
Butterlate.setMsg = function(obj) {
|
|
689
|
-
return MSG.extend(obj);
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
//print pure translate json data
|
|
693
|
-
Butterlate.exportPureJsonData = function() {
|
|
694
|
-
for(attribute in Butterlate.getMsg()) {
|
|
695
|
-
if(typeof MSG[attribute] !== 'function'){
|
|
696
|
-
console.log('"' + attribute + '":"' + MSG[attribute] + '",');
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
//Export to window
|
|
702
|
-
win.Butterlate = Butterlate;
|
|
703
|
-
win.B = win.B || win.Butterlate;
|
|
704
|
-
win._ = function (key, replacements) {
|
|
705
|
-
return Butterlate.getFormatText(key, replacements);
|
|
706
|
-
};
|
|
707
|
-
win.Butterlate.loadScript = loadScript;
|
|
708
|
-
|
|
709
|
-
}(window, document));
|
|
1
|
+
// "New Butterfat internationalization" (b28new.js)
|
|
2
|
+
// Released under the MIT License
|
|
3
|
+
// versions 3.0.0
|
|
4
|
+
// $Id: b28new.js 2014-12-23 ETw $
|
|
5
|
+
/***********************************************************************************************
|
|
6
|
+
************************************************************************************************/
|
|
7
|
+
|
|
8
|
+
(function (window, document) {
|
|
9
|
+
|
|
10
|
+
//定义保存翻译的字典和配置
|
|
11
|
+
var MSG = {},
|
|
12
|
+
b28Cfg = {},
|
|
13
|
+
dateObj = new Date();
|
|
14
|
+
|
|
15
|
+
MSG.extend = function (obj) {
|
|
16
|
+
var name;
|
|
17
|
+
|
|
18
|
+
for (name in obj) {
|
|
19
|
+
if (obj.hasOwnProperty(name)) {
|
|
20
|
+
MSG[name] = obj[name];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// var configLang = CONFIG_MULTI_LANGUAGE_SORFWARE;
|
|
26
|
+
// var lang = configLang.split(",");
|
|
27
|
+
/*********翻译配置***********/
|
|
28
|
+
//配置翻译支持的所有语言,如果不支持某种语言,则以默认语言显示
|
|
29
|
+
//使用前请添加所有已支持的语言到此数组中
|
|
30
|
+
var configLang = top.CONFIG_MULTI_LANGUAGE_SORFWARE;
|
|
31
|
+
var lang = configLang.split(",");
|
|
32
|
+
b28Cfg.supportLang = lang;
|
|
33
|
+
//id语言
|
|
34
|
+
b28Cfg.idLang = "en";
|
|
35
|
+
//配置语言包文件类型 within ["xml", "json"]
|
|
36
|
+
b28Cfg.fileType = "json";
|
|
37
|
+
//是否对要翻译文字进行trim
|
|
38
|
+
b28Cfg.trimText = true;
|
|
39
|
+
//默认替换节点中的文字,将其设为true可插入html
|
|
40
|
+
b28Cfg.insertHTML = true;
|
|
41
|
+
|
|
42
|
+
//是否初始化下拉框
|
|
43
|
+
b28Cfg.initSelect = true;
|
|
44
|
+
|
|
45
|
+
//时间字符串
|
|
46
|
+
b28Cfg.dateStr = dateObj.getDay() + "" + dateObj.getHours() + "" + dateObj.getMinutes();
|
|
47
|
+
|
|
48
|
+
//获取默认语言
|
|
49
|
+
/**
|
|
50
|
+
* [getDefaultLang 根据宏值及浏览器语言获取设备显示的默认语言]
|
|
51
|
+
*
|
|
52
|
+
* @param {[type]} lang [功能宏中指定的支持语言]
|
|
53
|
+
*
|
|
54
|
+
* @return {[type]} [浏览器默认显示的设备语言]
|
|
55
|
+
*/
|
|
56
|
+
function getDefaultLang(lang) {
|
|
57
|
+
var special = {
|
|
58
|
+
"zh": "cn",
|
|
59
|
+
"zh-chs": "cn",
|
|
60
|
+
"zh-cn": "cn",
|
|
61
|
+
"zh-cht": "cn",
|
|
62
|
+
"zh-hk": "zh",
|
|
63
|
+
"zh-mo": "zh",
|
|
64
|
+
"zh-tw": "zh",
|
|
65
|
+
"zh-sg": "zh",
|
|
66
|
+
"es-419":"laes",
|
|
67
|
+
"pt-br":"brpt"
|
|
68
|
+
},
|
|
69
|
+
navLang;
|
|
70
|
+
//获取浏览器语言
|
|
71
|
+
navLang = (window.navigator.language || window.navigator.userLanguage || window.navigator.browserLanguage || window.navigator.systemLanguage).toLowerCase();
|
|
72
|
+
navLang = special[navLang] || navLang.split("-")[0].toString();
|
|
73
|
+
|
|
74
|
+
//宏值中包含浏览器语言,则将其作为默认语言
|
|
75
|
+
for (var i = 0; i<lang.length; i++) {
|
|
76
|
+
if (lang[i] === navLang) {
|
|
77
|
+
return lang[i];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//宏值中不包含浏览器语言,则把宏值中第一项作为默认语言
|
|
81
|
+
return lang[0];
|
|
82
|
+
}
|
|
83
|
+
//页面初始化后默认显示的语言
|
|
84
|
+
b28Cfg.defaultLang = getDefaultLang(lang) || b28Cfg.idLang;
|
|
85
|
+
|
|
86
|
+
var win = window,
|
|
87
|
+
doc = document,
|
|
88
|
+
core_version = "3.0.0",
|
|
89
|
+
core_trim = core_version.trim,
|
|
90
|
+
|
|
91
|
+
//获取语言文件相对路径
|
|
92
|
+
js = document.scripts,
|
|
93
|
+
langPath = js[js.length-1].src.substring(0,js[js.length-1].src.lastIndexOf("/")+1),
|
|
94
|
+
|
|
95
|
+
// JSON RegExp
|
|
96
|
+
rvalidchars = /^[\],:{}\s]*$/,
|
|
97
|
+
rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
|
|
98
|
+
rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
|
|
99
|
+
rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
|
|
100
|
+
|
|
101
|
+
// 语言包文件是否加载完成标志
|
|
102
|
+
b28Loaded = false,
|
|
103
|
+
|
|
104
|
+
// Define until function
|
|
105
|
+
domReady, loadScript, ajaxLoadScript, loadJSON, loadXML, innerText, trim, _trim, parseJSON, createXHR,
|
|
106
|
+
|
|
107
|
+
// Define a local copy of Butterlate
|
|
108
|
+
Butterlate;
|
|
109
|
+
|
|
110
|
+
trim = core_trim && !core_trim.call("\uFEFF\xA0") ?
|
|
111
|
+
function (text) {
|
|
112
|
+
return text == null ?
|
|
113
|
+
"" :
|
|
114
|
+
core_trim.call(text);
|
|
115
|
+
} :
|
|
116
|
+
|
|
117
|
+
// Otherwise use our own trimming function
|
|
118
|
+
function (text) {
|
|
119
|
+
if(text == null) {
|
|
120
|
+
return "";
|
|
121
|
+
} else {
|
|
122
|
+
text += "";
|
|
123
|
+
}
|
|
124
|
+
var str = text.replace(/^\s+/, ""),
|
|
125
|
+
end = str.length - 1,
|
|
126
|
+
ws = /\s/;
|
|
127
|
+
|
|
128
|
+
while (ws.test(str.charAt(end))) {
|
|
129
|
+
end--;
|
|
130
|
+
}
|
|
131
|
+
return str.slice(0, end + 1);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
_trim = function (str) {
|
|
135
|
+
if(b28Cfg.trimText) {
|
|
136
|
+
return trim(str)
|
|
137
|
+
} else {
|
|
138
|
+
return str;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
parseJSON = function (data) {
|
|
143
|
+
if (window.JSON && window.JSON.parse) {
|
|
144
|
+
return window.JSON.parse(data);
|
|
145
|
+
}
|
|
146
|
+
if (data === null) {
|
|
147
|
+
return data;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (typeof data === "string") {
|
|
151
|
+
|
|
152
|
+
// Make sure leading/trailing whitespace is removed (IE can't handle it)
|
|
153
|
+
data = trim(data);
|
|
154
|
+
|
|
155
|
+
if (data) {
|
|
156
|
+
// Make sure the incoming data is actual JSON
|
|
157
|
+
// Logic borrowed from http://json.org/json2.js
|
|
158
|
+
if (rvalidchars.test(data.replace(rvalidescape, "@")
|
|
159
|
+
.replace(rvalidtokens, "]")
|
|
160
|
+
.replace(rvalidbraces, ""))) {
|
|
161
|
+
|
|
162
|
+
return (new Function("return " + data))();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
createXHR = function () {
|
|
169
|
+
try {
|
|
170
|
+
//return function() {
|
|
171
|
+
return new XMLHttpRequest();
|
|
172
|
+
//}
|
|
173
|
+
} catch (e1) {
|
|
174
|
+
try {
|
|
175
|
+
//return function() {
|
|
176
|
+
return new ActiveXObject("Msxml2.XMLHTTP");
|
|
177
|
+
//}
|
|
178
|
+
} catch (e2) {
|
|
179
|
+
try {
|
|
180
|
+
//return function() {
|
|
181
|
+
return new ActiveXObject("Microsoft.XMLHTTP");
|
|
182
|
+
//}
|
|
183
|
+
} catch (e3) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
innerText = (function () {
|
|
191
|
+
if(b28Cfg.insertHTML) {
|
|
192
|
+
return function(elem, str) {
|
|
193
|
+
if(str) {
|
|
194
|
+
elem.innerHTML = str;
|
|
195
|
+
return elem;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
var element = doc.createElement('p');
|
|
201
|
+
element.innerHTML = core_version;
|
|
202
|
+
return element.textContent ? function (elem, str) {
|
|
203
|
+
if (str) {
|
|
204
|
+
elem.textContent = str;
|
|
205
|
+
return elem;
|
|
206
|
+
}
|
|
207
|
+
return elem.textContent;
|
|
208
|
+
|
|
209
|
+
} : function (elem, str) {
|
|
210
|
+
if (str) {
|
|
211
|
+
elem.innerText = str;
|
|
212
|
+
return elem;
|
|
213
|
+
}
|
|
214
|
+
return elem.innerText;
|
|
215
|
+
};
|
|
216
|
+
}());
|
|
217
|
+
|
|
218
|
+
function assertElement(elem) {
|
|
219
|
+
//支持HTMLElement
|
|
220
|
+
if(typeof HTMLElement === 'object' && elem instanceof HTMLElement) {
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
//ie等
|
|
224
|
+
if(typeof elem === 'object' && (elem.nodeType === 1 || elem.nodeType === 9) &&
|
|
225
|
+
typeof elem.nodeName === 'string') {
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function transTitle() {
|
|
232
|
+
doc.title = Butterlate.gettext(_trim(doc.title));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function replaceTextNodeValue(element) {
|
|
236
|
+
if (!element) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
var firstChild = element.firstChild,
|
|
240
|
+
nextSibling = element.nextSibling,
|
|
241
|
+
nodeType = element.nodeType,
|
|
242
|
+
btnStr = "submit,reset,button",
|
|
243
|
+
curValue, isInputButton;
|
|
244
|
+
|
|
245
|
+
//handle element node
|
|
246
|
+
if (nodeType === 1) {
|
|
247
|
+
|
|
248
|
+
// Hander elements common attribute need to replace
|
|
249
|
+
curValue = element.getAttribute("alt");
|
|
250
|
+
if (curValue && /\S/.test(curValue)) {
|
|
251
|
+
curValue = _trim(curValue);
|
|
252
|
+
element.setAttribute("alt", Butterlate.gettext(curValue));
|
|
253
|
+
}
|
|
254
|
+
curValue = element.getAttribute("placeholder");
|
|
255
|
+
if (curValue && /\S/.test(curValue)) {
|
|
256
|
+
curValue = _trim(curValue);
|
|
257
|
+
element.setAttribute("placeholder", Butterlate.gettext(curValue));
|
|
258
|
+
}
|
|
259
|
+
curValue = element.getAttribute("title");
|
|
260
|
+
if (curValue && /\S/.test(curValue)) {
|
|
261
|
+
curValue = _trim(curValue);
|
|
262
|
+
element.setAttribute("title", Butterlate.gettext(curValue));
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
isInputButton = element.nodeName.toLowerCase() == "input" &&
|
|
266
|
+
(btnStr.indexOf(element.getAttribute("type")) !== -1);
|
|
267
|
+
if (isInputButton) {
|
|
268
|
+
|
|
269
|
+
//data-lang属性具有较高优先级
|
|
270
|
+
curValue = element.getAttribute("data-lang") || element.value;
|
|
271
|
+
} else {
|
|
272
|
+
curValue = element.getAttribute("data-lang");
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (curValue && /\S/.test(curValue)) {
|
|
276
|
+
curValue = _trim(curValue);
|
|
277
|
+
if (curValue) {
|
|
278
|
+
if (isInputButton) {
|
|
279
|
+
element.setAttribute("value", Butterlate.gettext(curValue));
|
|
280
|
+
} else {
|
|
281
|
+
innerText(element, Butterlate.gettext(curValue));
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
//handle textNode
|
|
287
|
+
} else if (nodeType === 3 && /\S/.test(element.nodeValue)) {
|
|
288
|
+
curValue = _trim(element.nodeValue);
|
|
289
|
+
element.nodeValue = Butterlate.gettext(curValue);
|
|
290
|
+
}
|
|
291
|
+
//translate siblings
|
|
292
|
+
if (nextSibling) {
|
|
293
|
+
replaceTextNodeValue(nextSibling);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
//translate firstChild
|
|
297
|
+
//stop handle elem.child if elem has attr data-lang
|
|
298
|
+
if(firstChild && !element.getAttribute("data-lang")) {
|
|
299
|
+
replaceTextNodeValue(firstChild);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
domReady = (function () {
|
|
304
|
+
var funcs = [],
|
|
305
|
+
already = false,
|
|
306
|
+
len,
|
|
307
|
+
i;
|
|
308
|
+
|
|
309
|
+
function handler(e) {
|
|
310
|
+
e = e || win.event;
|
|
311
|
+
if (already) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (e.type === 'readystatechange' && doc.readyState !== 'complete') {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
for (i = 0, len = funcs.length; i < len; i++) {
|
|
320
|
+
funcs[i].call(doc);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
already = true;
|
|
324
|
+
funcs = null;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (doc.addEventListener) {
|
|
328
|
+
doc.addEventListener("DOMContentLoaded", handler, false);
|
|
329
|
+
doc.addEventListener("onreadystatechange", handler, false);
|
|
330
|
+
win.addEventListener("load", handler, false);
|
|
331
|
+
} else if (doc.attachEvent) {
|
|
332
|
+
doc.attachEvent('onreadystatechange', handler);
|
|
333
|
+
win.attachEvent('onload', handler);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// return ready() function
|
|
337
|
+
return function ready(f) {
|
|
338
|
+
if (already) {
|
|
339
|
+
f.call(doc);
|
|
340
|
+
} else {
|
|
341
|
+
funcs.push(f);
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
}());
|
|
345
|
+
|
|
346
|
+
loadScript = (function () {
|
|
347
|
+
var scripts = doc.createElement("script"),
|
|
348
|
+
hasReadyState = scripts.readyState;
|
|
349
|
+
|
|
350
|
+
return hasReadyState ? function (url, callBack) {
|
|
351
|
+
var scripts = doc.createElement("script");
|
|
352
|
+
|
|
353
|
+
scripts.onreadystatechange = function () {
|
|
354
|
+
if (scripts.readyState === 'loaded' ||
|
|
355
|
+
scripts.readyState === 'complete') {
|
|
356
|
+
scripts.onreadystatechange = null;
|
|
357
|
+
|
|
358
|
+
if (typeof callBack === "function") {
|
|
359
|
+
callBack();
|
|
360
|
+
callBack = null;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
scripts.src = url;
|
|
365
|
+
doc.getElementsByTagName("head")[0].appendChild(scripts);
|
|
366
|
+
|
|
367
|
+
} : function (url, callBack) {
|
|
368
|
+
var scripts = doc.createElement("script");
|
|
369
|
+
|
|
370
|
+
scripts.onload = function () {
|
|
371
|
+
if (typeof callBack === "function") {
|
|
372
|
+
callBack();
|
|
373
|
+
callBack = null;
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
scripts.src = url;
|
|
377
|
+
doc.getElementsByTagName("head")[0].appendChild(scripts);
|
|
378
|
+
};
|
|
379
|
+
})();
|
|
380
|
+
|
|
381
|
+
loadJSON = function (url, callBack) {
|
|
382
|
+
var request = createXHR();
|
|
383
|
+
request.open("GET", url + "?" + Math.random(), false);
|
|
384
|
+
//request.setRequestHeader("If-Modified-Since", "1");
|
|
385
|
+
//request.setRequestHeader("Accept", "application/json, text/javascript, */*; q=0.01");
|
|
386
|
+
request.send(null);
|
|
387
|
+
|
|
388
|
+
if (request.status >= 200 && request.status < 300 || request.status === 304) {
|
|
389
|
+
MSG.extend(parseJSON(request.responseText));
|
|
390
|
+
|
|
391
|
+
if (typeof callBack === "function") {
|
|
392
|
+
callBack();
|
|
393
|
+
callBack = null;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
loadXML = function (url, callBack) {
|
|
399
|
+
var request,
|
|
400
|
+
i,
|
|
401
|
+
pos,
|
|
402
|
+
posLen;
|
|
403
|
+
|
|
404
|
+
request = createXHR();
|
|
405
|
+
request.open("GET", url + "?" + Math.random(), false);
|
|
406
|
+
//request.setRequestHeader("If-Modified-Since", "1");
|
|
407
|
+
request.send(null);
|
|
408
|
+
|
|
409
|
+
if (request.status >= 200 && request.status < 300 || request.status === 304) {
|
|
410
|
+
pos = request.responseXML.documentElement.getElementsByTagName("message");
|
|
411
|
+
posLen = pos.length;
|
|
412
|
+
for (i = 0; i < posLen; i++) {
|
|
413
|
+
MSG[pos[i].getAttribute("msgid")] = pos[i].getAttribute("msgstr");
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (typeof callBack === "function") {
|
|
417
|
+
callBack();
|
|
418
|
+
callBack = null;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
function Butterlation() {
|
|
424
|
+
this.curDomain = 0;
|
|
425
|
+
this.domainArr = [];
|
|
426
|
+
this.options = {
|
|
427
|
+
"defaultLang": b28Cfg.defaultLang,
|
|
428
|
+
"support": b28Cfg.supportLang,
|
|
429
|
+
"fileType": b28Cfg.fileType
|
|
430
|
+
};
|
|
431
|
+
this.isSupport = function (lang) {
|
|
432
|
+
var support = this.options.support,
|
|
433
|
+
len = support.length,
|
|
434
|
+
i;
|
|
435
|
+
|
|
436
|
+
for (i = 0; i < len; i++) {
|
|
437
|
+
if (lang === support[i]) {
|
|
438
|
+
return support[i];
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
this.setLang = function (lang) {
|
|
443
|
+
|
|
444
|
+
if (lang !== undefined) {
|
|
445
|
+
|
|
446
|
+
if (!this.isSupport(lang)) {
|
|
447
|
+
lang = this.options.defaultLang;
|
|
448
|
+
}
|
|
449
|
+
doc.cookie = "bLanguage=" + lang + ";";
|
|
450
|
+
}
|
|
451
|
+
return lang;
|
|
452
|
+
};
|
|
453
|
+
this.getLang = function () {
|
|
454
|
+
var special = {
|
|
455
|
+
"zh": "cn",
|
|
456
|
+
"zh-chs": "cn",
|
|
457
|
+
"zh-cn": "cn",
|
|
458
|
+
"zh-cht": "cn",
|
|
459
|
+
"zh-hk": "zh",
|
|
460
|
+
"zh-mo": "zh",
|
|
461
|
+
"zh-tw": "zh",
|
|
462
|
+
"zh-sg": "zh",
|
|
463
|
+
"es-419":"laes",
|
|
464
|
+
"pt-br":"brpt"
|
|
465
|
+
},
|
|
466
|
+
defLang = this.options.defaultLang,
|
|
467
|
+
local, ret, start, end;
|
|
468
|
+
|
|
469
|
+
if ((doc.cookie.indexOf("bLanguage=")) === -1) {
|
|
470
|
+
local = (win.navigator.language || win.navigator.userLanguage ||
|
|
471
|
+
win.navigator.browserLanguage || win.navigator.systemLanguage || defLang).toLowerCase();
|
|
472
|
+
|
|
473
|
+
ret = special[local] || local.split("-")[0].toString();
|
|
474
|
+
} else {
|
|
475
|
+
if (doc.cookie.indexOf("bLanguage=") === 0) {
|
|
476
|
+
start = 10;
|
|
477
|
+
|
|
478
|
+
//incase there has cookie like: **bLanguage=cn
|
|
479
|
+
} else if (doc.cookie.indexOf("; bLanguage=") !== -1) {
|
|
480
|
+
start = doc.cookie.indexOf("; bLanguage=") + 12;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
if (start !== undefined) {
|
|
484
|
+
end = (doc.cookie.indexOf(';', start) !== -1) ?
|
|
485
|
+
doc.cookie.indexOf(';', start) : doc.cookie.length;
|
|
486
|
+
ret = doc.cookie.substring(start, end);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
return this.isSupport(ret) || this.options.defaultLang;
|
|
491
|
+
};
|
|
492
|
+
this.getURL = function (domain) {
|
|
493
|
+
return langPath + this.lang + "/" + domain + "." + this.options.fileType + "?" + b28Cfg.dateStr;
|
|
494
|
+
};
|
|
495
|
+
this.setTextDomain = function (domain, lang, callBack) {
|
|
496
|
+
var i,
|
|
497
|
+
domainLen,
|
|
498
|
+
htmlElem = doc.documentElement;
|
|
499
|
+
|
|
500
|
+
//Hander lang is undefined
|
|
501
|
+
this.lang = lang || this.getLang();
|
|
502
|
+
this.setLang(lang);
|
|
503
|
+
this.curDomain = 0;
|
|
504
|
+
if (typeof callBack === "function") {
|
|
505
|
+
this.success = callBack;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
htmlElem.style.display = "none";
|
|
509
|
+
if(this.lang == "cn"){
|
|
510
|
+
htmlElem.className = htmlElem.className + " lang-" + this.lang;
|
|
511
|
+
} else if(this.lang == "zh" ){
|
|
512
|
+
htmlElem.className = htmlElem.className + " lang-" + this.lang;
|
|
513
|
+
} else {
|
|
514
|
+
//增加多国语言样式
|
|
515
|
+
htmlElem.className = htmlElem.className + " lang-en lang-css-" + this.lang;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
if (Object.prototype.toString.call(domain) === "[object Array]") {
|
|
521
|
+
domainLen = domain.length;
|
|
522
|
+
this.domainArr = domain;
|
|
523
|
+
|
|
524
|
+
for (i = 0; i < domainLen; i = i + 1) {
|
|
525
|
+
this.po = this.getURL(domain[i]);
|
|
526
|
+
this.loadDomain(this.po, i);
|
|
527
|
+
}
|
|
528
|
+
} else if (typeof domain === "string") {
|
|
529
|
+
this.domainArr.push(domain);
|
|
530
|
+
this.po = this.getURL(domain);
|
|
531
|
+
this.loadDomain(this.po, 0);
|
|
532
|
+
}
|
|
533
|
+
};
|
|
534
|
+
|
|
535
|
+
this.loadDomain = function (url) {
|
|
536
|
+
//当前语言为id语言,则不需要发请求
|
|
537
|
+
if (this.lang === b28Cfg.idLang) {
|
|
538
|
+
b28Loaded = true;
|
|
539
|
+
b28Cfg.initSelect && domReady(Butterlate.initSelectElem);
|
|
540
|
+
doc.documentElement.style.display = '';
|
|
541
|
+
if (typeof Butterlate.success === "function") {
|
|
542
|
+
Butterlate.success();
|
|
543
|
+
}
|
|
544
|
+
} else {
|
|
545
|
+
if(this.options.fileType === "json") {
|
|
546
|
+
loadJSON(url, this.loadedDict);
|
|
547
|
+
} else if(this.options.fileType === "xml") {
|
|
548
|
+
loadXML(url, this.loadedDict);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
};
|
|
552
|
+
this.loadedDict = function () {
|
|
553
|
+
var len = Butterlate.domainArr.length;
|
|
554
|
+
if (Butterlate.curDomain + 1 === len) {
|
|
555
|
+
b28Loaded = true;
|
|
556
|
+
domReady(Butterlate.translatePage);
|
|
557
|
+
} else {
|
|
558
|
+
Butterlate.curDomain += 1;
|
|
559
|
+
}
|
|
560
|
+
};
|
|
561
|
+
this.isLoaded = function () {
|
|
562
|
+
return b28Loaded;
|
|
563
|
+
};
|
|
564
|
+
this.gettext = function (key) {
|
|
565
|
+
if(!key){
|
|
566
|
+
return "";
|
|
567
|
+
}
|
|
568
|
+
return MSG[key] !== undefined ? MSG[key] : key.replace(/^[a-zA-Z]\#[a-zA-Z][a-zA-Z][a-zA-Z]\#/g,"");
|
|
569
|
+
};
|
|
570
|
+
this.getFormatText = function (key, replacements) {
|
|
571
|
+
var nkey = this.gettext(key),
|
|
572
|
+
index,
|
|
573
|
+
count = 0;
|
|
574
|
+
if(!replacements) {
|
|
575
|
+
return nkey;
|
|
576
|
+
}
|
|
577
|
+
if (replacements instanceof Array && replacements.length !== 0) {
|
|
578
|
+
while ((index = nkey.indexOf('%s')) !== -1) {
|
|
579
|
+
nkey = nkey.slice(0, index) + replacements[count] +
|
|
580
|
+
nkey.slice(index + 2);
|
|
581
|
+
count = ((count + 1) === replacements.length) ? count : (count + 1);
|
|
582
|
+
}
|
|
583
|
+
} else if (typeof replacements === "string") {
|
|
584
|
+
index = nkey.indexOf('%s');
|
|
585
|
+
nkey = nkey.slice(0, index) + replacements + nkey.slice(index + 2);
|
|
586
|
+
}
|
|
587
|
+
return nkey;
|
|
588
|
+
};
|
|
589
|
+
this.initSelectElem = function () {
|
|
590
|
+
var selectElem = doc.getElementById('select-lang'),
|
|
591
|
+
len = b28Cfg.supportLang.length,
|
|
592
|
+
newOption, lang, i;
|
|
593
|
+
|
|
594
|
+
if (selectElem && selectElem.nodeName.toLowerCase() == "select") {
|
|
595
|
+
for (i = 0; i < len; i++) {
|
|
596
|
+
lang = b28Cfg.supportLang[i];
|
|
597
|
+
newOption = new Option(Butterlate.langArr[lang], lang);
|
|
598
|
+
selectElem.add(newOption, undefined);
|
|
599
|
+
}
|
|
600
|
+
selectElem.value = Butterlate.lang;
|
|
601
|
+
|
|
602
|
+
if (doc.addEventListener) {
|
|
603
|
+
selectElem.addEventListener("change", function () {
|
|
604
|
+
Butterlate.setLang(doc.getElementById('select-lang').value);
|
|
605
|
+
setTimeout(function () {
|
|
606
|
+
window.location.reload();
|
|
607
|
+
}, 24);
|
|
608
|
+
}, false);
|
|
609
|
+
|
|
610
|
+
} else if (doc.attachEvent) {
|
|
611
|
+
selectElem.attachEvent('onchange', function () {
|
|
612
|
+
Butterlate.setLang(doc.getElementById('select-lang').value);
|
|
613
|
+
setTimeout(function () {
|
|
614
|
+
window.location.reload();
|
|
615
|
+
}, 24);
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
this.translate = function (translateTarget) {
|
|
622
|
+
var translateElem;
|
|
623
|
+
|
|
624
|
+
if(assertElement(translateTarget)) {
|
|
625
|
+
translateElem = translateTarget;
|
|
626
|
+
} else if(translateTarget && typeof translateTarget === 'string') {
|
|
627
|
+
translateElem = doc.getElementById(translateTarget);
|
|
628
|
+
}
|
|
629
|
+
translateElem = translateElem || doc.documentElement;
|
|
630
|
+
|
|
631
|
+
//hidepage before translate
|
|
632
|
+
doc.documentElement.style.display = 'none';
|
|
633
|
+
|
|
634
|
+
replaceTextNodeValue(translateElem);
|
|
635
|
+
|
|
636
|
+
//show page when translate complete
|
|
637
|
+
doc.documentElement.style.display = '';
|
|
638
|
+
|
|
639
|
+
if (typeof Butterlate.success === "function") {
|
|
640
|
+
Butterlate.success();
|
|
641
|
+
}
|
|
642
|
+
};
|
|
643
|
+
|
|
644
|
+
this.translatePage = function () {
|
|
645
|
+
|
|
646
|
+
var bodyElem = doc.body || doc.documentElement;
|
|
647
|
+
|
|
648
|
+
// 翻译HTML页面内容
|
|
649
|
+
transTitle();
|
|
650
|
+
|
|
651
|
+
// 初始语言选择下拉框
|
|
652
|
+
b28Cfg.initSelect && Butterlate.initSelectElem();
|
|
653
|
+
|
|
654
|
+
Butterlate.translate(bodyElem);
|
|
655
|
+
|
|
656
|
+
};
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
Butterlate = new Butterlation();
|
|
660
|
+
|
|
661
|
+
Butterlate.langArr = {
|
|
662
|
+
"cn": "简体中文",
|
|
663
|
+
"zh": "繁體中文",
|
|
664
|
+
"de": "Deutsch", //德语
|
|
665
|
+
"en": "English", //英语
|
|
666
|
+
"es":"Español",//欧西
|
|
667
|
+
"laes":"Esp. (Amér. Lat.)",//美西
|
|
668
|
+
"nl":"Nederlands",//荷兰语
|
|
669
|
+
"ko":" 한국어",//韩语
|
|
670
|
+
"fr": "Français", //法国
|
|
671
|
+
"hu": "Magyar", //匈牙利
|
|
672
|
+
"it": "Italiano", //意大利
|
|
673
|
+
"pl": "Polski", //波兰
|
|
674
|
+
"ro": "Română", //罗马尼亚
|
|
675
|
+
"tr": "Türkçe", //土耳其
|
|
676
|
+
"ru": "Русский", //Russian 俄语
|
|
677
|
+
"brpt": "Port. (Amér.Lat.)", // 巴葡
|
|
678
|
+
"pt": "Português", // 欧葡
|
|
679
|
+
"cs": "Čeština",//捷克语
|
|
680
|
+
"uk":"Українська"//乌克兰语
|
|
681
|
+
};
|
|
682
|
+
|
|
683
|
+
//for debug use
|
|
684
|
+
Butterlate.getMsg = function() {
|
|
685
|
+
return MSG;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
Butterlate.setMsg = function(obj) {
|
|
689
|
+
return MSG.extend(obj);
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
//print pure translate json data
|
|
693
|
+
Butterlate.exportPureJsonData = function() {
|
|
694
|
+
for(attribute in Butterlate.getMsg()) {
|
|
695
|
+
if(typeof MSG[attribute] !== 'function'){
|
|
696
|
+
console.log('"' + attribute + '":"' + MSG[attribute] + '",');
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
//Export to window
|
|
702
|
+
win.Butterlate = Butterlate;
|
|
703
|
+
win.B = win.B || win.Butterlate;
|
|
704
|
+
win._ = function (key, replacements) {
|
|
705
|
+
return Butterlate.getFormatText(key, replacements);
|
|
706
|
+
};
|
|
707
|
+
win.Butterlate.loadScript = loadScript;
|
|
708
|
+
|
|
709
|
+
}(window, document));
|