Index: chrome/content/ui/i18n.js |
=================================================================== |
--- a/chrome/content/ui/i18n.js |
+++ b/chrome/content/ui/i18n.js |
@@ -18,29 +18,29 @@ |
var i18n; |
if (typeof chrome != "undefined") |
{ |
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) |
@@ -82,29 +82,49 @@ else |
})(); |
} |
// Loads and 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. |
function loadI18nStrings() |
{ |
+ 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)); |
+ } |
+ |
var nodes = document.querySelectorAll("[class^='i18n_']"); |
for(var i = 0; i < nodes.length; i++) |
{ |
- var arguments = JSON.parse("[" + nodes[i].textContent + "]"); |
- var className = nodes[i].className; |
+ 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); |
- var prop = "innerHTML" in nodes[i] ? "innerHTML" : "textContent"; |
- if(arguments.length > 0) |
- nodes[i][prop] = i18n.getMessage(stringName, arguments); |
- else |
- nodes[i][prop] = i18n.getMessage(stringName); |
+ |
+ while (node.lastChild) |
+ node.removeChild(node.lastChild); |
Thomas Greiner
2013/07/10 08:45:38
node.innerHTML = "";
is increasingly faster the mo
Wladimir Palant
2013/07/10 09:07:23
I would rather avoid using innerHTML for anything
Thomas Greiner
2013/07/10 09:41:43
I wasn't aware of that review process. I assume th
|
+ processString(i18n.getMessage(stringName, arguments), node); |
} |
} |
// Provides a more readable string of the current date and time |
function i18n_timeDateStrings(when) |
{ |
var d = new Date(when); |
var timeString = d.toLocaleTimeString(); |