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 +