✖
Perl の Locale::Maketext::Lexicon::Gettext フォーマットのメッセージをJSでフォーマットする
Perl の Locale::Maketext::Lexicon::Gettext は以下のような Gettext ライクなフォーマットを扱うが、同じようなことを JS でしたいとき
%1 さん、こんにちは %quant(%1,user,users)
- %function() は任意の関数が呼べる感じなので、JS でもそのようにしておく。
- numf は実装してない。
- Locale.data= { ... } みたいなのが言語別に完全にわかれているのを想定してる
var Locale = {
loc : function (msgid, arg) {
var args = Array.prototype.slice.call(arguments, 0);
var text = Locale.data[msgid];
if (text) {
if (/%/.test(text)) {
text = text.replace(/%(\d)/g, function (_, n) {
return args[n];
});
text = text.replace(/%([a-z*#]+)\(([^\)]+)\)/g, function (_, func, args) {
if (func == '#') func = 'numf';
if (func == '*') func = 'quant';
args = args.split(/,/);
return Locale[func].apply(null, args);
});
return text;
} else {
return text;
}
} else {
return msgid;
}
},
quant : function (number, singular, plural, negative) {
if (number == 0 && negative) { // no warnings
return negative;
} else
if (number == 1) {
return singular;
} else
if (plural) {
return plural;
} else {
return singular + 's';
}
},
numf : function (number) {
return number; // XXX
}
};