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