diff options
Diffstat (limited to 'data/extensions/spyblock@gnu.org/chrome/content/ui/i18n.js')
-rw-r--r-- | data/extensions/spyblock@gnu.org/chrome/content/ui/i18n.js | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/data/extensions/spyblock@gnu.org/chrome/content/ui/i18n.js b/data/extensions/spyblock@gnu.org/chrome/content/ui/i18n.js new file mode 100644 index 0000000..8366268 --- /dev/null +++ b/data/extensions/spyblock@gnu.org/chrome/content/ui/i18n.js @@ -0,0 +1,150 @@ +/* + * 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; +else if (typeof chrome != "undefined") + // TODO: This check only exist for backwards compatibility, while the Safari + // port isn't merged into the adblockpluschrome repo. So this branch should + // be removed when the Safari port was merged. + i18n = chrome.i18n; +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; + } + } + }; + })(); +} + +// 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); |