mirror of
https://github.com/chatopera/cosin.git
synced 2025-06-20 22:46:59 +08:00
94 lines
2.8 KiB
JavaScript
94 lines
2.8 KiB
JavaScript
(function() {
|
|
/**
|
|
* provides text formatting and i18n key storage features<br>
|
|
* implements most of the Sun Java MessageFormat functionality.
|
|
* @see <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html" target="sun">Sun's Documentation</a>
|
|
*/
|
|
|
|
var keys = {};
|
|
|
|
var format = function(message, args) {
|
|
var substitute = function() {
|
|
var format = arguments[1].split(',');
|
|
var substr = escape(args[format.shift()]);
|
|
if(format.length === 0) {
|
|
return substr; // simple substitution eg {0}
|
|
}
|
|
switch(format.shift()) {
|
|
case "number" : return (new Number(substr)).toLocaleString();
|
|
case "date" : return (new Date(+substr)).toLocaleDateString(); // date and time require milliseconds since epoch
|
|
case "time" : return (new Date(+substr)).toLocaleTimeString(); // eg i18n.text("Key", +(new Date())); for current time
|
|
}
|
|
var styles = format.join("").split("|").map(function(style) {
|
|
return style.match(/(-?[\.\d]+)(#|<)([^{}]*)/);
|
|
});
|
|
var match = styles[0][3];
|
|
for(var i=0; i<styles.length; i++) {
|
|
if((styles[i][2] === "#" && (+styles[i][1]) === (+substr)) ||
|
|
(styles[i][2] === "<" && ((+styles[i][1]) < (+substr)))) {
|
|
match = styles[i][3];
|
|
}
|
|
}
|
|
return match;
|
|
};
|
|
|
|
return message && message.replace(/'(')|'([^']+)'|([^{']+)|([^']+)/g, function(x, sq, qs, ss, sub) {
|
|
do {} while(sub && (sub !== (sub = (sub.replace(/\{([^{}]+)\}/, substitute)))));
|
|
return sq || qs || ss || unescape(sub);
|
|
});
|
|
};
|
|
|
|
this.i18n = {
|
|
|
|
setKeys: function(strings) {
|
|
for(var key in strings) {
|
|
keys[key] = strings[key];
|
|
}
|
|
},
|
|
|
|
text: function() {
|
|
var args = Array.prototype.slice.call(arguments),
|
|
key = keys[args.shift()];
|
|
if(args.length === 0) {
|
|
return key;
|
|
}
|
|
return format(key, args);
|
|
},
|
|
|
|
complex: function() {
|
|
var args = Array.prototype.slice.call(arguments),
|
|
key = keys[args.shift()],
|
|
ret = [],
|
|
replacer = function(x, pt, sub) { ret.push(pt || args[+sub]); return ""; };
|
|
do {} while(key && key !== (key = key.replace(/([^{]+)|\{(\d+)\}/, replacer )));
|
|
return ret;
|
|
}
|
|
|
|
};
|
|
|
|
})();
|
|
|
|
(function() {
|
|
var nav = window.navigator;
|
|
var userLang = ( nav.languages && nav.languages[0] ) || nav.language || nav.userLanguage;
|
|
var scripts = document.getElementsByTagName('script');
|
|
var data = scripts[ scripts.length - 1].dataset;
|
|
if( ! data["langs"] ) {
|
|
return;
|
|
}
|
|
var langs = data["langs"].split(/\s*,\s*/);
|
|
var script0 = scripts[0];
|
|
function install( lang ) {
|
|
var s = document.createElement("script");
|
|
s.src = data["basedir"] + "/" + lang + '_strings.js';
|
|
s.async = false;
|
|
script0.parentNode.appendChild(s);
|
|
script0 = s;
|
|
}
|
|
|
|
install( langs.shift() ); // always install primary language
|
|
userLang && langs
|
|
.filter( function( lang ) { return userLang.indexOf( lang ) === 0; } )
|
|
.forEach( install );
|
|
}());
|