/*
* This file is part of Adblock Plus ,
* 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 .
*/
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);