-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathi18n.js
150 lines (129 loc) · 4.07 KB
/
i18n.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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);