michael@0: /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ michael@0: /* globals FirefoxCom */ michael@0: michael@0: 'use strict'; michael@0: michael@0: // Small subset of the webL10n API by Fabien Cazenave for pdf.js extension. michael@0: (function(window) { michael@0: var gLanguage = ''; michael@0: michael@0: // fetch an l10n objects michael@0: function getL10nData(key) { michael@0: var response = FirefoxCom.requestSync('getStrings', key); michael@0: var data = JSON.parse(response); michael@0: if (!data) { michael@0: console.warn('[l10n] #' + key + ' missing for [' + gLanguage + ']'); michael@0: } michael@0: return data; michael@0: } michael@0: michael@0: // replace {{arguments}} with their values michael@0: function substArguments(text, args) { michael@0: if (!args) { michael@0: return text; michael@0: } michael@0: return text.replace(/\{\{\s*(\w+)\s*\}\}/g, function(all, name) { michael@0: return (name in args ? args[name] : '{{' + name + '}}'); michael@0: }); michael@0: } michael@0: michael@0: // translate a string michael@0: function translateString(key, args, fallback) { michael@0: var i = key.lastIndexOf('.'); michael@0: var name, property; michael@0: if (i >= 0) { michael@0: name = key.substring(0, i); michael@0: property = key.substring(i + 1); michael@0: } else { michael@0: name = key; michael@0: property = 'textContent'; michael@0: } michael@0: var data = getL10nData(name); michael@0: var value = (data && data[property]) || fallback; michael@0: if (!value) { michael@0: return '{{' + key + '}}'; michael@0: } michael@0: return substArguments(value, args); michael@0: } michael@0: michael@0: // translate an HTML element michael@0: function translateElement(element) { michael@0: if (!element || !element.dataset) { michael@0: return; michael@0: } michael@0: michael@0: // get the related l10n object michael@0: var key = element.dataset.l10nId; michael@0: var data = getL10nData(key); michael@0: if (!data) { michael@0: return; michael@0: } michael@0: michael@0: // get arguments (if any) michael@0: // TODO: more flexible parser? michael@0: var args; michael@0: if (element.dataset.l10nArgs) { michael@0: try { michael@0: args = JSON.parse(element.dataset.l10nArgs); michael@0: } catch (e) { michael@0: console.warn('[l10n] could not parse arguments for #' + key + ''); michael@0: } michael@0: } michael@0: michael@0: // translate element michael@0: // TODO: security check? michael@0: for (var k in data) { michael@0: element[k] = substArguments(data[k], args); michael@0: } michael@0: } michael@0: michael@0: michael@0: // translate an HTML subtree michael@0: function translateFragment(element) { michael@0: element = element || document.querySelector('html'); michael@0: michael@0: // check all translatable children (= w/ a `data-l10n-id' attribute) michael@0: var children = element.querySelectorAll('*[data-l10n-id]'); michael@0: var elementCount = children.length; michael@0: for (var i = 0; i < elementCount; i++) { michael@0: translateElement(children[i]); michael@0: } michael@0: michael@0: // translate element itself if necessary michael@0: if (element.dataset.l10nId) { michael@0: translateElement(element); michael@0: } michael@0: } michael@0: michael@0: window.addEventListener('DOMContentLoaded', function() { michael@0: gLanguage = FirefoxCom.requestSync('getLocale', null); michael@0: michael@0: translateFragment(); michael@0: michael@0: // fire a 'localized' DOM event michael@0: var evtObject = document.createEvent('Event'); michael@0: evtObject.initEvent('localized', false, false); michael@0: evtObject.language = gLanguage; michael@0: window.dispatchEvent(evtObject); michael@0: }); michael@0: michael@0: // Public API michael@0: document.mozL10n = { michael@0: // get a localized string michael@0: get: translateString, michael@0: michael@0: // get the document language michael@0: getLanguage: function() { michael@0: return gLanguage; michael@0: }, michael@0: michael@0: // get the direction (ltr|rtl) of the current language michael@0: getDirection: function() { michael@0: // http://www.w3.org/International/questions/qa-scripts michael@0: // Arabic, Hebrew, Farsi, Pashto, Urdu michael@0: var rtlList = ['ar', 'he', 'fa', 'ps', 'ur']; michael@0: return (rtlList.indexOf(gLanguage) >= 0 ? 'rtl' : 'ltr'); michael@0: }, michael@0: michael@0: // translate an element or document fragment michael@0: translate: translateFragment michael@0: }; michael@0: })(this); michael@0: