123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- "use strict";
- // Small subset of the webL10n API by Fabien Cazenave for PDF.js extension.
- (function (window) {
- let gL10nData = null;
- let gLanguage = "";
- let gExternalLocalizerServices = null;
- let gReadyState = "loading";
- // fetch an l10n objects
- function getL10nData(key) {
- gL10nData ||= gExternalLocalizerServices.getStrings();
- const data = gL10nData?.[key];
- if (!data) {
- console.warn("[l10n] #" + key + " missing for [" + gLanguage + "]");
- }
- return data;
- }
- // replace {{arguments}} with their values
- function substArguments(text, args) {
- if (!args) {
- return text;
- }
- return text.replace(/\{\{\s*(\w+)\s*\}\}/g, function (all, name) {
- return name in args ? args[name] : "{{" + name + "}}";
- });
- }
- // translate a string
- function translateString(key, args, fallback) {
- var i = key.lastIndexOf(".");
- var name, property;
- if (i >= 0) {
- name = key.substring(0, i);
- property = key.substring(i + 1);
- } else {
- name = key;
- property = "textContent";
- }
- var data = getL10nData(name);
- var value = (data && data[property]) || fallback;
- if (!value) {
- return "{{" + key + "}}";
- }
- return substArguments(value, args);
- }
- // translate an HTML element
- function translateElement(element) {
- if (!element || !element.dataset) {
- return;
- }
- // get the related l10n object
- var key = element.dataset.l10nId;
- var data = getL10nData(key);
- if (!data) {
- return;
- }
- // get arguments (if any)
- // TODO: more flexible parser?
- var args;
- if (element.dataset.l10nArgs) {
- try {
- args = JSON.parse(element.dataset.l10nArgs);
- } catch (e) {
- console.warn("[l10n] could not parse arguments for #" + key + "");
- }
- }
- // translate element
- // TODO: security check?
- for (var k in data) {
- element[k] = substArguments(data[k], args);
- }
- }
- // translate an HTML subtree
- function translateFragment(element) {
- element = element || document.querySelector("html");
- // check all translatable children (= w/ a `data-l10n-id' attribute)
- var children = element.querySelectorAll("*[data-l10n-id]");
- var elementCount = children.length;
- for (var i = 0; i < elementCount; i++) {
- translateElement(children[i]);
- }
- // translate element itself if necessary
- if (element.dataset.l10nId) {
- translateElement(element);
- }
- }
- // Public API
- document.mozL10n = {
- // get a localized string
- get: translateString,
- // get the document language
- getLanguage() {
- return gLanguage;
- },
- // get the direction (ltr|rtl) of the current language
- getDirection() {
- // http://www.w3.org/International/questions/qa-scripts
- // Arabic, Hebrew, Farsi, Pashto, Urdu
- var rtlList = ["ar", "he", "fa", "ps", "ur"];
- // use the short language code for "full" codes like 'ar-sa' (issue 5440)
- var shortCode = gLanguage.split("-")[0];
- return rtlList.includes(shortCode) ? "rtl" : "ltr";
- },
- getReadyState() {
- return gReadyState;
- },
- setExternalLocalizerServices(externalLocalizerServices) {
- gExternalLocalizerServices = externalLocalizerServices;
- gLanguage = gExternalLocalizerServices.getLocale();
- gReadyState = "complete";
- },
- // translate an element or document fragment
- translate: translateFragment,
- };
- })(this);
|