Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: i18n.js

Issue 4875452820750336: Issue 1663 - Moving first-run page to adblockplusui repository (Closed)
Patch Set: Created Dec. 16, 2014, 1:59 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « firstRun.js ('k') | locale/ar/firstRun.json » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: i18n.js
===================================================================
new file mode 100644
--- /dev/null
+++ b/i18n.js
@@ -0,0 +1,154 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+var i18n;
+
+if (typeof ext != "undefined")
+{
+ i18n = ext.i18n;
+
+ document.documentElement.lang = ext.i18n.getMessage("@@ui_locale").replace(/_/g, "-");
+ document.documentElement.dir = ext.i18n.getMessage("@@bidi_dir");
+}
+else
+{
+ // Using Firefox' approach on i18n instead
+
+ // Randomize URI to work around bug 719376
+ var pageName = location.pathname.replace(/.*\//, '').replace(/\..*?$/, '');
+ var stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/" + pageName +
+ ".properties?" + Math.random());
+
+ function getI18nMessage(key)
+ {
+ return {
+ "message": stringBundle.GetStringFromName(key)
+ };
+ }
+
+ i18n = (function()
+ {
+ function getText(message, args)
+ {
+ var text = message.message;
+ var placeholders = message.placeholders;
+
+ if (!args || !placeholders)
+ return text;
+
+ for (var key in placeholders)
+ {
+ var content = placeholders[key].content;
+ if (!content)
+ continue;
+
+ var index = parseInt(content.slice(1), 10);
+ if (isNaN(index))
+ continue;
+
+ var replacement = args[index - 1];
+ if (typeof replacement === "undefined")
+ continue;
+
+ text = text.split("$" + key + "$").join(replacement);
+ }
+ return text;
+ }
+
+ return {
+ getMessage: function(key, args)
+ {
+ try{
+ var message = getI18nMessage(key);
+ return getText(message, args);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ return "Missing translation: " + key;
+ }
+ }
+ };
+ })();
+
+ var Utils = require("utils").Utils;
+ document.documentElement.lang = Utils.appLocale;
+ document.documentElement.dir = Utils.chromeRegistry.isLocaleRTL("adblockplus") ? "rtl" : "ltr";
+}
+
+// Inserts i18n strings into matching elements. Any inner HTML already in the element is
+// parsed as JSON and used as parameters to substitute into placeholders in the i18n
+// message.
+i18n.setElementText = function(element, stringName, arguments)
+{
+ function processString(str, element)
+ {
+ var match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(str);
+ if (match)
+ {
+ processString(match[1], element);
+
+ var e = document.createElement(match[2]);
+ processString(match[3], e);
+ element.appendChild(e);
+
+ processString(match[4], element);
+ }
+ else
+ element.appendChild(document.createTextNode(str));
+ }
+
+ while (element.lastChild)
+ element.removeChild(element.lastChild);
+ processString(i18n.getMessage(stringName, arguments), element);
+}
+
+// Loads i18n strings
+function loadI18nStrings()
+{
+ var nodes = document.querySelectorAll("[class^='i18n_']");
+ for(var i = 0; i < nodes.length; i++)
+ {
+ var node = nodes[i];
+ var arguments = JSON.parse("[" + node.textContent + "]");
+ if (arguments.length == 0)
+ arguments = null;
+
+ var className = node.className;
+ if (className instanceof SVGAnimatedString)
+ className = className.animVal;
+ var stringName = className.split(/\s/)[0].substring(5);
+
+ i18n.setElementText(node, stringName, arguments);
+ }
+}
+
+// Provides a more readable string of the current date and time
+function i18n_timeDateStrings(when)
+{
+ var d = new Date(when);
+ var timeString = d.toLocaleTimeString();
+
+ var now = new Date();
+ if (d.toDateString() == now.toDateString())
+ return [timeString];
+ else
+ return [timeString, d.toLocaleDateString()];
+}
+
+// Fill in the strings as soon as possible
+window.addEventListener("DOMContentLoaded", loadI18nStrings, true);
« no previous file with comments | « firstRun.js ('k') | locale/ar/firstRun.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld