 Issue 8560083:
  adblockplusopera: Port UI code from Chrome  (Closed)
    
  
    Issue 8560083:
  adblockplusopera: Port UI code from Chrome  (Closed) 
  | Index: i18n.js | 
| =================================================================== | 
| new file mode 100644 | 
| --- /dev/null | 
| +++ b/i18n.js | 
| @@ -0,0 +1,96 @@ | 
| +/* | 
| + * This Source Code is subject to the terms of the Mozilla Public License | 
| + * version 2.0 (the "License"). You can obtain a copy of the License at | 
| + * http://mozilla.org/MPL/2.0/. | 
| + */ | 
| + | 
| +var i18n = (function() | 
| +{ | 
| + function getText(message, args) | 
| + { | 
| + var text = message.message; | 
| 
Wladimir Palant
2012/10/12 15:04:02
"Uncaught exception: message is undefined". You mi
 
Felix Dahlke
2012/10/16 14:20:01
Done.
 | 
| + | 
| + if (!args) | 
| 
Wladimir Palant
2012/10/12 15:04:02
if (!args || !message.placeholders) I think, other
 
Felix Dahlke
2012/10/16 14:20:01
You're right, done.
 | 
| + return text; | 
| + | 
| + var placeholders = message.placeholders; | 
| + for (var key in placeholders) | 
| + { | 
| + var content = placeholders[key].content; | 
| + if (!content) | 
| + continue; | 
| + | 
| + var index = parseInt(content.slice(1)); | 
| 
Wladimir Palant
2012/10/12 15:04:02
parseInt(..., 10) please.
 
Felix Dahlke
2012/10/16 14:20:01
Not again! :) Done.
 | 
| + 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) | 
| + { | 
| + var messages = opera.extension.bgProcess.i18nMessages; | 
| + var message = getText(messages[key], args); | 
| + if (!message) | 
| + return "Missing translation: " + key; | 
| 
Wladimir Palant
2012/10/12 15:04:02
Actually, missing translations are currently quite
 
Felix Dahlke
2012/10/16 14:20:01
Done, see my changes and comments to background.js
 | 
| + return message; | 
| + } | 
| + }; | 
| +})(); | 
| + | 
| +// 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() { | 
| + 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 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); | 
| + } | 
| +} | 
| + | 
| +function i18n_time(h, m) { | 
| + var locale = i18n.getMessage("@@ui_locale"); | 
| 
Wladimir Palant
2012/10/12 15:04:02
@@ui_locale is a special string that isn't part of
 
Felix Dahlke
2012/10/16 14:20:01
Done.
 | 
| + if(m < 10) | 
| + m = "0" + m; | 
| + if(locale == "fr") { | 
| + return h + "h" + m; | 
| + } else { | 
| + var ampm = "a.m."; | 
| + if(h >= 12) { | 
| + h -= 12; | 
| + ampm = "p.m."; | 
| + } | 
| + if(h == 0) | 
| + h = 12; | 
| + return(h + ":" + m + " " + ampm); | 
| + } | 
| +} | 
| + | 
| +// 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); |