3 * provides text formatting and i18n key storage features<br>
4 * implements most of the Sun Java MessageFormat functionality.
5 * @see <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html" target="sun">Sun's Documentation</a>
10 var format = function(message, args) {
11 var substitute = function() {
12 var format = arguments[1].split(',');
13 var substr = escape(args[format.shift()]);
14 if(format.length === 0) {
15 return substr; // simple substitution eg {0}
17 switch(format.shift()) {
18 case "number" : return (new Number(substr)).toLocaleString();
19 case "date" : return (new Date(+substr)).toLocaleDateString(); // date and time require milliseconds since epoch
20 case "time" : return (new Date(+substr)).toLocaleTimeString(); // eg i18n.text("Key", +(new Date())); for current time
22 var styles = format.join("").split("|").map(function(style) {
23 return style.match(/(-?[\.\d]+)(#|<)([^{}]*)/);
25 var match = styles[0][3];
26 for(var i=0; i<styles.length; i++) {
27 if((styles[i][2] === "#" && (+styles[i][1]) === (+substr)) ||
28 (styles[i][2] === "<" && ((+styles[i][1]) < (+substr)))) {
35 return message && message.replace(/'(')|'([^']+)'|([^{']+)|([^']+)/g, function(x, sq, qs, ss, sub) {
36 do {} while(sub && (sub !== (sub = (sub.replace(/\{([^{}]+)\}/, substitute)))));
37 return sq || qs || ss || unescape(sub);
43 setKeys: function(strings) {
44 for(var key in strings) {
45 keys[key] = strings[key];
50 var args = Array.prototype.slice.call(arguments),
51 key = keys[args.shift()];
52 if(args.length === 0) {
55 return format(key, args);
59 var args = Array.prototype.slice.call(arguments),
60 key = keys[args.shift()],
62 replacer = function(x, pt, sub) { ret.push(pt || args[+sub]); return ""; };
63 do {} while(key && key !== (key = key.replace(/([^{]+)|\{(\d+)\}/, replacer )));
72 var nav = window.navigator;
73 var userLang = ( nav.languages && nav.languages[0] ) || nav.language || nav.userLanguage;
74 var scripts = document.getElementsByTagName('script');
75 var data = scripts[ scripts.length - 1].dataset;
76 if( ! data["langs"] ) {
79 var langs = data["langs"].split(/\s*,\s*/);
80 var script0 = scripts[0];
81 function install( lang ) {
82 var s = document.createElement("script");
83 s.src = data["basedir"] + "/" + lang + '_strings.js';
85 script0.parentNode.appendChild(s);
89 install( langs.shift() ); // always install primary language
91 .filter( function( lang ) { return userLang.indexOf( lang ) === 0; } )