browser/extensions/pdfjs/content/web/l10n.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/browser/extensions/pdfjs/content/web/l10n.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,133 @@
     1.4 +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
     1.6 +/* globals FirefoxCom */
     1.7 +
     1.8 +'use strict';
     1.9 +
    1.10 +// Small subset of the webL10n API by Fabien Cazenave for pdf.js extension.
    1.11 +(function(window) {
    1.12 +  var gLanguage = '';
    1.13 +
    1.14 +  // fetch an l10n objects
    1.15 +  function getL10nData(key) {
    1.16 +    var response = FirefoxCom.requestSync('getStrings', key);
    1.17 +    var data = JSON.parse(response);
    1.18 +    if (!data) {
    1.19 +      console.warn('[l10n] #' + key + ' missing for [' + gLanguage + ']');
    1.20 +    }
    1.21 +    return data;
    1.22 +  }
    1.23 +
    1.24 +  // replace {{arguments}} with their values
    1.25 +  function substArguments(text, args) {
    1.26 +    if (!args) {
    1.27 +      return text;
    1.28 +    }
    1.29 +    return text.replace(/\{\{\s*(\w+)\s*\}\}/g, function(all, name) {
    1.30 +      return (name in args ? args[name] : '{{' + name + '}}');
    1.31 +    });
    1.32 +  }
    1.33 +
    1.34 +  // translate a string
    1.35 +  function translateString(key, args, fallback) {
    1.36 +    var i = key.lastIndexOf('.');
    1.37 +    var name, property;
    1.38 +    if (i >= 0) {
    1.39 +      name = key.substring(0, i);
    1.40 +      property = key.substring(i + 1);
    1.41 +    } else {
    1.42 +      name = key;
    1.43 +      property = 'textContent';
    1.44 +    }
    1.45 +    var data = getL10nData(name);
    1.46 +    var value = (data && data[property]) || fallback;
    1.47 +    if (!value) {
    1.48 +      return '{{' + key + '}}';
    1.49 +    }
    1.50 +    return substArguments(value, args);
    1.51 +  }
    1.52 +
    1.53 +  // translate an HTML element
    1.54 +  function translateElement(element) {
    1.55 +    if (!element || !element.dataset) {
    1.56 +      return;
    1.57 +    }
    1.58 +
    1.59 +    // get the related l10n object
    1.60 +    var key = element.dataset.l10nId;
    1.61 +    var data = getL10nData(key);
    1.62 +    if (!data) {
    1.63 +      return;
    1.64 +    }
    1.65 +
    1.66 +    // get arguments (if any)
    1.67 +    // TODO: more flexible parser?
    1.68 +    var args;
    1.69 +    if (element.dataset.l10nArgs) {
    1.70 +      try {
    1.71 +        args = JSON.parse(element.dataset.l10nArgs);
    1.72 +      } catch (e) {
    1.73 +        console.warn('[l10n] could not parse arguments for #' + key + '');
    1.74 +      }
    1.75 +    }
    1.76 +
    1.77 +    // translate element
    1.78 +    // TODO: security check?
    1.79 +    for (var k in data) {
    1.80 +      element[k] = substArguments(data[k], args);
    1.81 +    }
    1.82 +  }
    1.83 +
    1.84 +
    1.85 +  // translate an HTML subtree
    1.86 +  function translateFragment(element) {
    1.87 +    element = element || document.querySelector('html');
    1.88 +
    1.89 +    // check all translatable children (= w/ a `data-l10n-id' attribute)
    1.90 +    var children = element.querySelectorAll('*[data-l10n-id]');
    1.91 +    var elementCount = children.length;
    1.92 +    for (var i = 0; i < elementCount; i++) {
    1.93 +      translateElement(children[i]);
    1.94 +    }
    1.95 +
    1.96 +    // translate element itself if necessary
    1.97 +    if (element.dataset.l10nId) {
    1.98 +      translateElement(element);
    1.99 +    }
   1.100 +  }
   1.101 +
   1.102 +  window.addEventListener('DOMContentLoaded', function() {
   1.103 +    gLanguage = FirefoxCom.requestSync('getLocale', null);
   1.104 +
   1.105 +    translateFragment();
   1.106 +
   1.107 +    // fire a 'localized' DOM event
   1.108 +    var evtObject = document.createEvent('Event');
   1.109 +    evtObject.initEvent('localized', false, false);
   1.110 +    evtObject.language = gLanguage;
   1.111 +    window.dispatchEvent(evtObject);
   1.112 +  });
   1.113 +
   1.114 +  // Public API
   1.115 +  document.mozL10n = {
   1.116 +    // get a localized string
   1.117 +    get: translateString,
   1.118 +
   1.119 +    // get the document language
   1.120 +    getLanguage: function() {
   1.121 +      return gLanguage;
   1.122 +    },
   1.123 +
   1.124 +    // get the direction (ltr|rtl) of the current language
   1.125 +    getDirection: function() {
   1.126 +      // http://www.w3.org/International/questions/qa-scripts
   1.127 +      // Arabic, Hebrew, Farsi, Pashto, Urdu
   1.128 +      var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];
   1.129 +      return (rtlList.indexOf(gLanguage) >= 0 ? 'rtl' : 'ltr');
   1.130 +    },
   1.131 +
   1.132 +    // translate an element or document fragment
   1.133 +    translate: translateFragment
   1.134 +  };
   1.135 +})(this);
   1.136 +

mercurial