What is a good way for handling parameters in localized strings in javascript? I am using the same format as in java's MessageFormat class, e.g.:
There are {0} apples in basket ID {1}.
Where {0}
will be replaced with the first parameter and {1}
with the second.
This is the call I want to use in JS (i.e. I want to implement origStr
):
var str = replaceParams(origStr, [5, 'AAA']);
I am guessing the best strategy would be to use a regular expression. If so, please offer a good regular expression. But I'm open to hear any other options.
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);
Or to fit your requirement:
function replaceParams(string, replacements) { return string.replace(/\{(\d+)\}/g, function() { return replacements[arguments[1]]; }); // Or, if prototype code above... String.format.apply(string, replacements); }
You can add fancy i18n features such as ordinal-i-fying (whatever it's called):
// 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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With