 Issue 6432313504169984:
  Issue 1663 - Various Firefox-related changes of the first-run page  (Closed)
    
  
    Issue 6432313504169984:
  Issue 1663 - Various Firefox-related changes of the first-run page  (Closed) 
  | Index: i18n.js | 
| =================================================================== | 
| --- a/i18n.js | 
| +++ b/i18n.js | 
| @@ -10,95 +10,41 @@ | 
| * 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; | 
| +// This variable should no longer be necessary once options.js in Chrome | 
| +// accesses ext.i18n directly. | 
| +var i18n = ext.i18n; | 
| -if (typeof ext != "undefined") | 
| +if (ext.i18n.noSpecialMessages) | 
| 
Thomas Greiner
2015/01/07 12:19:55
Nit: Shouldn't we avoid negatives like that? Inste
 
Sebastian Noack
2015/01/07 12:22:17
Maybe we don't even need that property. You could
 
Wladimir Palant
2015/01/07 16:33:10
Done.
 
Sebastian Noack
2015/01/07 16:40:56
Usually I'd prefer to store the return value in a
 
Wladimir Palant
2015/01/07 16:52:41
Yes, translations in the content process cannot ch
 | 
| { | 
| - i18n = ext.i18n; | 
| - | 
| - document.documentElement.lang = ext.i18n.getMessage("@@ui_locale").replace(/_/g, "-"); | 
| - document.documentElement.dir = ext.i18n.getMessage("@@bidi_dir"); | 
| + ext.backgroundPage.sendMessage({ | 
| + type: "app.get", | 
| + what: "localeInfo" | 
| + }, function(localeInfo) | 
| + { | 
| + document.documentElement.lang = localeInfo.locale; | 
| + document.documentElement.dir = localeInfo.isRTL ? "rtl" : "ltr"; | 
| + }); | 
| } | 
| 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; | 
| - } | 
| - } | 
| - }; | 
| - })(); | 
| - | 
| - var Utils = require("utils").Utils; | 
| - document.documentElement.lang = Utils.appLocale; | 
| - document.documentElement.dir = Utils.chromeRegistry.isLocaleRTL("adblockplus") ? "rtl" : "ltr"; | 
| + document.documentElement.lang = ext.i18n.getMessage("@@ui_locale").replace(/_/g, "-"); | 
| + document.documentElement.dir = ext.i18n.getMessage("@@bidi_dir"); | 
| } | 
| // 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) | 
| +ext.i18n.setElementText = function(element, stringName, arguments) | 
| { | 
| function processString(str, element) | 
| { | 
| var match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(str); | 
| if (match) | 
| { | 
| processString(match[1], element); | 
| @@ -109,17 +55,17 @@ i18n.setElementText = function(element, | 
| processString(match[4], element); | 
| } | 
| else | 
| element.appendChild(document.createTextNode(str)); | 
| } | 
| while (element.lastChild) | 
| element.removeChild(element.lastChild); | 
| - processString(i18n.getMessage(stringName, arguments), element); | 
| + processString(ext.i18n.getMessage(stringName, arguments), element); | 
| } | 
| // Loads i18n strings | 
| function loadI18nStrings() | 
| { | 
| var nodes = document.querySelectorAll("[class^='i18n_']"); | 
| for(var i = 0; i < nodes.length; i++) | 
| { | 
| @@ -128,17 +74,17 @@ function loadI18nStrings() | 
| 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); | 
| + ext.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(); |