Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MessageFormat in javascript (parameters in localized UI strings)

Tags:

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.

like image 794
Ovesh Avatar asked Aug 30 '09 08:08

Ovesh


1 Answers

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); 
like image 189
strager Avatar answered Oct 09 '22 11:10

strager