67 lines
2 KiB
JavaScript
67 lines
2 KiB
JavaScript
/*
|
|
* This file is provided by the addon-developer-support repository at
|
|
* https://github.com/thundernest/addon-developer-support
|
|
*
|
|
* For usage descriptions, please check:
|
|
* https://github.com/thundernest/addon-developer-support/tree/master/scripts/i18n
|
|
*
|
|
* Version 1.1
|
|
*
|
|
* Derived from:
|
|
* http://github.com/piroor/webextensions-lib-l10n
|
|
*
|
|
* Original license:
|
|
* The MIT License, Copyright (c) 2016-2019 YUKI "Piro" Hiroshi
|
|
*
|
|
*/
|
|
|
|
var i18n = {
|
|
updateString(string) {
|
|
let re = new RegExp(this.keyPrefix + "(.+?)__", "g");
|
|
return string.replace(re, (matched) => {
|
|
const key = matched.slice(this.keyPrefix.length, -2);
|
|
let rv = this.extension
|
|
? this.extension.localeData.localizeMessage(key)
|
|
: messenger.i18n.getMessage(key);
|
|
return rv || matched;
|
|
});
|
|
},
|
|
|
|
updateSubtree(node) {
|
|
const texts = document.evaluate(
|
|
'descendant::text()[contains(self::text(), "' + this.keyPrefix + '")]',
|
|
node,
|
|
null,
|
|
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
|
|
null
|
|
);
|
|
for (let i = 0, maxi = texts.snapshotLength; i < maxi; i++) {
|
|
const text = texts.snapshotItem(i);
|
|
if (text.nodeValue.includes(this.keyPrefix))
|
|
text.nodeValue = this.updateString(text.nodeValue);
|
|
}
|
|
|
|
const attributes = document.evaluate(
|
|
'descendant::*/attribute::*[contains(., "' + this.keyPrefix + '")]',
|
|
node,
|
|
null,
|
|
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
|
|
null
|
|
);
|
|
for (let i = 0, maxi = attributes.snapshotLength; i < maxi; i++) {
|
|
const attribute = attributes.snapshotItem(i);
|
|
if (attribute.value.includes(this.keyPrefix))
|
|
attribute.value = this.updateString(attribute.value);
|
|
}
|
|
},
|
|
|
|
updateDocument(options = {}) {
|
|
this.extension = null;
|
|
this.keyPrefix = "__MSG_";
|
|
if (options) {
|
|
if (options.extension) this.extension = options.extension;
|
|
if (options.keyPrefix) this.keyPrefix = options.keyPrefix;
|
|
}
|
|
this.updateSubtree(document);
|
|
},
|
|
};
|