2009-08-30 8 views
19

¿Cuál es una buena manera de manejar los parámetros en cadenas localizadas en javascript? estoy usando el mismo formato que en la clase MessageFormat de java, por ejemplo .:MessageFormat en javascript (parámetros en cadenas de UI localizadas)

There are {0} apples in basket ID {1}.

Dónde {0} será reemplazado por el primer parámetro y {1} con el segundo.

Esta es la llamada que desea utilizar en JS (es decir, quiero poner en práctica origStr):

var str = replaceParams(origStr, [5, 'AAA']);

estoy adivinando la mejor estrategia sería utilizar una expresión regular. Si es así, ofrezca una buena expresión regular. Pero estoy abierto a escuchar cualquier otra opción.

+0

Muestra qué tan inmaduro JS es :( –

Respuesta

33
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); 

O para adaptarse a sus necesidades:

function replaceParams(string, replacements) { 
    return string.replace(/\{(\d+)\}/g, function() { 
     return replacements[arguments[1]]; 
    }); 

    // Or, if prototype code above... 
    String.format.apply(string, replacements); 
} 

Usted puede agregar características i18n de fantasía tales como ordinal-i-ficar (como se llame):

// 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); 
10

Parece como si estuviera solo unos 3 años tarde, pero en caso de que alguien aún necesite una biblioteca independiente de MessageFormat para JS:

https://github.com/SlexAxton/messageformat.js

¡Ya va! Se compila en JS, por lo que puede ser realmente rápido y es compatible con SelectFormat y PluralFormat.

Nota :: Este es ICU MessageFormat que es un poco diferente (léase: mejor) que las cosas que pueden estar integradas en su idioma.

+0

Tengo que decir, esto es un poco diferente de lo que esperaba. Usamos ICU MessageFormat en Java, y se parece más a {0, plural, cero {ningún resultado} uno {1 resultado } Otros {{0} resultados}}. Mientras que este se ve como {RES, plural, = 0 {ningún resultado} uno {1 resultado} otro {# resultados}} - que no sea superficialmente utilizando las mismas palabras clave CLDR para uno/otro/etc. me parece un formato completamente diferente. – Trejkaz

+0

MessageFormat.js y MessageFormat.java solo comparten nombres. La sintaxis es completamente diferente. –

+0

Tienen el mismo formato, y en su mayoría son compatibles entre sí. Los dos ejemplos @Trejkaz mencionan que solo hay diferencias en las palabras clave que se usan. '= 0' es un valor literal, donde' cero' es una palabra clave (que no se aplica a en-US). –

3

Puede usar L10ns. Utiliza el FormFormat de ICU.

There are {apples} apples in basket ID {baskedId}. 

También se pueden definir usando PluralFormat. Para obtener la forma plural adecuada para Apple.

There are {apples, plural, one{# apple} other{# apples}} apples in basket ID {baskedId}. 

En el CLDR declaración anterior define la forma plural one y other. Se puede encontrar más información en su documentation.

Cuestiones relacionadas