LEFT | RIGHT |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <http://adblockplus.org/>, | 2 * This file is part of Adblock Plus <http://adblockplus.org/>, |
3 * Copyright (C) 2006-2013 Eyeo GmbH | 3 * Copyright (C) 2006-2013 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 var i18n = (window.ext && ext.i18n) || (window.chrome && chrome.i18n); | 18 var i18n; |
19 if (!i18n) | 19 |
| 20 if (typeof ext != "undefined") |
| 21 i18n = ext.i18n; |
| 22 else if (typeof chrome != "undefined") |
| 23 // TODO: This check only exist for backwards compatibility, while the Safari |
| 24 // port isn't merged into the adblockpluschrome repo. So this branch should |
| 25 // be removed when the Safari port was merged. |
| 26 i18n = chrome.i18n; |
| 27 else |
20 { | 28 { |
21 // Using Firefox' approach on i18n instead | 29 // Using Firefox' approach on i18n instead |
22 | 30 |
23 // Randomize URI to work around bug 719376 | 31 // Randomize URI to work around bug 719376 |
24 var pageName = location.pathname.replace(/.*\//, '').replace(/\..*?$/, ''); | 32 var pageName = location.pathname.replace(/.*\//, '').replace(/\..*?$/, ''); |
25 var stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/
" + pageName + | 33 var stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/
" + pageName + |
26 ".properties?" + Math.random()); | 34 ".properties?" + Math.random()); |
27 | 35 |
28 function getI18nMessage(key) | 36 function getI18nMessage(key) |
29 { | 37 { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 catch(e) | 79 catch(e) |
72 { | 80 { |
73 Cu.reportError(e); | 81 Cu.reportError(e); |
74 return "Missing translation: " + key; | 82 return "Missing translation: " + key; |
75 } | 83 } |
76 } | 84 } |
77 }; | 85 }; |
78 })(); | 86 })(); |
79 } | 87 } |
80 | 88 |
81 // Loads and inserts i18n strings into matching elements. Any inner HTML already
in the | 89 // Inserts i18n strings into matching elements. Any inner HTML already in the el
ement is |
82 // element is parsed as JSON and used as parameters to substitute into placehold
ers in the | 90 // parsed as JSON and used as parameters to substitute into placeholders in the
i18n |
83 // i18n message. | 91 // message. |
84 function loadI18nStrings() | 92 i18n.setElementText = function(element, stringName, arguments) |
85 { | 93 { |
86 function processString(str, element) | 94 function processString(str, element) |
87 { | 95 { |
88 var match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(str); | 96 var match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(str); |
89 if (match) | 97 if (match) |
90 { | 98 { |
91 processString(match[1], element); | 99 processString(match[1], element); |
92 | 100 |
93 var e = document.createElement(match[2]); | 101 var e = document.createElement(match[2]); |
94 processString(match[3], e); | 102 processString(match[3], e); |
95 element.appendChild(e); | 103 element.appendChild(e); |
96 | 104 |
97 processString(match[4], element); | 105 processString(match[4], element); |
98 } | 106 } |
99 else | 107 else |
100 element.appendChild(document.createTextNode(str)); | 108 element.appendChild(document.createTextNode(str)); |
101 } | 109 } |
102 | 110 |
| 111 while (element.lastChild) |
| 112 element.removeChild(element.lastChild); |
| 113 processString(i18n.getMessage(stringName, arguments), element); |
| 114 } |
| 115 |
| 116 // Loads i18n strings |
| 117 function loadI18nStrings() |
| 118 { |
103 var nodes = document.querySelectorAll("[class^='i18n_']"); | 119 var nodes = document.querySelectorAll("[class^='i18n_']"); |
104 for(var i = 0; i < nodes.length; i++) | 120 for(var i = 0; i < nodes.length; i++) |
105 { | 121 { |
106 var node = nodes[i]; | 122 var node = nodes[i]; |
107 var arguments = JSON.parse("[" + node.textContent + "]"); | 123 var arguments = JSON.parse("[" + node.textContent + "]"); |
108 if (arguments.length == 0) | 124 if (arguments.length == 0) |
109 arguments = null; | 125 arguments = null; |
110 | 126 |
111 var className = node.className; | 127 var className = node.className; |
112 if (className instanceof SVGAnimatedString) | 128 if (className instanceof SVGAnimatedString) |
113 className = className.animVal; | 129 className = className.animVal; |
114 var stringName = className.split(/\s/)[0].substring(5); | 130 var stringName = className.split(/\s/)[0].substring(5); |
115 | 131 |
116 while (node.lastChild) | 132 i18n.setElementText(node, stringName, arguments); |
117 node.removeChild(node.lastChild); | |
118 processString(i18n.getMessage(stringName, arguments), node); | |
119 } | 133 } |
120 } | 134 } |
121 | 135 |
122 // Provides a more readable string of the current date and time | 136 // Provides a more readable string of the current date and time |
123 function i18n_timeDateStrings(when) | 137 function i18n_timeDateStrings(when) |
124 { | 138 { |
125 var d = new Date(when); | 139 var d = new Date(when); |
126 var timeString = d.toLocaleTimeString(); | 140 var timeString = d.toLocaleTimeString(); |
127 | 141 |
128 var now = new Date(); | 142 var now = new Date(); |
129 if (d.toDateString() == now.toDateString()) | 143 if (d.toDateString() == now.toDateString()) |
130 return [timeString]; | 144 return [timeString]; |
131 else | 145 else |
132 return [timeString, d.toLocaleDateString()]; | 146 return [timeString, d.toLocaleDateString()]; |
133 } | 147 } |
134 | 148 |
135 // Fill in the strings as soon as possible | 149 // Fill in the strings as soon as possible |
136 window.addEventListener("DOMContentLoaded", loadI18nStrings, true); | 150 window.addEventListener("DOMContentLoaded", loadI18nStrings, true); |
LEFT | RIGHT |