2009-08-30 10 views
19

Che cosa è un buon modo per gestire i parametri in stringhe localizzate in javascript? Sto usando lo stesso formato in classe MessageFormat di java, ad es .:MessageFormat in javascript (parametri nelle stringhe UI localizzate)

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

Dove {0} sarà sostituito con il primo parametro e {1} con la seconda.

Questa è la chiamata che voglio usare in JS (vale a dire che voglio implementare origStr):

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

sto indovinando la strategia migliore sarebbe quella di utilizzare un'espressione regolare. Se è così, si prega di offrire una buona espressione regolare. Ma sono aperto a sentire altre opzioni.

+0

Mostra come JS immaturo è :( –

risposta

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 per misura il vostro requisito:

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

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

È possibile aggiungere funzionalità i18n di fantasia come ordinale-i-fying (come si chiama):

// 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

Sembra che ero solo circa 3 anni di ritardo, ma nel caso qualcuno abbia ancora bisogno di una libreria MessageFormat standalone per JS:

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

Ci siamo! Compilare a JS - quindi può essere davvero veloce, e supporta SelectFormat e PluralFormat.

Nota: questo è ICU MessageFormat che è un po 'diverso (leggi: meglio) rispetto alla roba che potrebbe essere incorporata nella tua lingua.

+0

Devo dire, questo è un po 'diverso da quello che mi aspettavo.Usiamo ICU MessageFormat in Java, e sembra più {0, plurale, zero {nessun risultato} uno {1 risultato } altri {{0} risultati}}. Mentre questo assomiglia a {RES, plurale, = 0 {nessun risultato} uno {1 risultato} altro {# risultati}} - a parte superficialmente usando le stesse parole chiave CLDR per l'una/altra/etc Mi sembra un formato completamente diverso per me – Trejkaz

+0

MessageFormat.js e MessageFormat.java capita solo di condividere nomi La sintassi è completamente diversa –

+0

Sono dello stesso formato e sono in gran parte compatibili l'uno con l'altro. I due esempi @Trejkaz menzionano solo differenze nelle parole chiave utilizzate. '= 0' è un valore letterale, dove 'zero' è una parola chiave (che non si applica a en-US). –

3

È possibile utilizzare L10ns. Usa il MessageFormat di ICU.

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

È inoltre possibile definirlo utilizzando PluralFormat. Per ottenere il plurale giusto per Apple.

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

Nella suddetta CLDR dichiarazione definisce la forma plurale one e other. Ulteriori informazioni possono essere trovate nel loro documentation.

Problemi correlati