JavaScript でローカライズされた文字列のパラメータを処理する良い方法は何ですか? Java の MessageFormat クラスと同じ形式を使用しています。例:
There are {0} apples in basket ID {1}.
は{0}
最初のパラメータに置き換えられ、 は{1}
2 番目のパラメータに置き換えられます。
これは JS で使用したい呼び出しです (つまり、実装したいorigStr
)。
var str = replaceParams(origStr, [5, 'AAA']);
最善の戦略は正規表現を使用することだと推測します。もしそうなら、適切な正規表現を提供してください。ただし、他のオプションがあれば、ぜひお聞かせください。
ベストアンサー1
String.prototype.format = function() {
var args = arguments;
return this.replace(/\{(\d+)\}/g, function() {
return args[arguments[1]];
});
};
// Returns '2 + -1 = 1'.
'{0} + {1} = {2}'.format(2, -1, 1);
または、お客様の要件に合わせて:
function replaceParams(string, replacements) {
return string.replace(/\{(\d+)\}/g, function() {
return replacements[arguments[1]];
});
// Or, if prototype code above...
String.format.apply(string, replacements);
}
ordinal-i-fying (何と呼ばれても) などの高度な i18n 機能を追加できます。
// Not well tested.
i18n.en.filters = {
ordinal: function(n) {
// FIXME Doesn't handle all cases.
switch(('' + n).substr(-1)) {
case '1':
return '' + n + 'st';
case '2':
return '' + n + 'nd';
case '3':
return '' + n + 'rd';
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0':
return '' + n + 'th';
default:
return n; // Just in case...
}
},
plural: function(n, singular, plural) {
if(n == 1) {
return singular;
} else {
return plural;
}
}
};
i18n.current = i18n.en;
String.prototype.format = function() {
var args = arguments;
return this.replace(/\{((\d+)((\|\w+(:\w+)*)*))\}/g, function() {
var arg = args[arguments[2]],
filters = arguments[3].split('|'),
i, curFilter, curFilterArgs, curFilterFunc;
for(i = 0; i < filters.length; ++i) {
curFilterArgs = filters[i].split(':');
curFilter = curFilterArgs.shift();
curFilterFunc = i18n.current.filters[curFilter];
if(typeof curFilterFunc === 'function') {
arg = curFilterFunc.apply(null, [ arg ].concat(curFilterArgs));
}
}
return arg;
});
};
'You have {0} {0|plural:cow:cows} but I have {1} {1|plural:cow:cows}.'.format(2,1);
'My horse came in {0|ordinal} place while yours came in {1|ordinal}.'.format(42,1);