2009-08-30 11 views
19

Jaki jest dobry sposób na obsługę parametrów w zlokalizowanych ciągach znaków w javascript? Używam ten sam format jak w klasie MessageFormat Java, np .:MessageFormat w javascript (parametry w zlokalizowanych ciągach UI)

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

Gdzie {0} zostaną zastąpione pierwszego parametru i {1} z drugim.

Jest to wezwanie chcę użyć w JS (czyli chcę wdrożyć origStr):

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

Domyślam najlepszą strategią byłoby użyć wyrażenia regularnego. Jeśli tak, zaproponuj dobre wyrażenie regularne. Ale jestem otwarty na słuchanie innych opcji.

+0

Pokazuje, jak niedojrzały JS :( –

Odpowiedz

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

Albo aby dopasować swoje wymagania:

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

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

Możesz dodać zaawansowane funkcje i18n takich jak porządkowej-i-fying (cokolwiek to się nazywa):

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

Wygląda na to, że jestem opóźnienie o około 3 lata, ale w przypadku, gdy ktoś nadal potrzebuje rzeczywistej samodzielnej biblioteki MessageFormat dla JS:

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

Idź! Kompiluje się z JS - więc może być naprawdę szybki i obsługuje SelectFormat i PluralFormat.

Uwaga :: To jest ICA MessageFormat, który jest nieco inny (czytaj: lepiej) niż rzeczy, które mogą być wbudowane w twój język.

+0

Muszę powiedzieć, że jest trochę inny niż oczekiwałem. Używamy ICU MessageFormat w Javie i wygląda bardziej jak {0, liczba mnoga, zero {brak wyników} jeden {1 wynik } inne {{0} wyniki}} .Tak ten wygląda {RES, liczba mnoga, = 0 {brak wyników} jeden {1 wynik} inne {# wyniki}} - inny niż powierzchownie przy użyciu tych samych słów kluczowych CLDR dla jednego/innych/etc. Wydaje mi się, że to zupełnie inny format: – Trejkaz

+0

MessageFormat.js i MessageFormat.java występują tylko w nazwach współużytkowanych, składnia jest zupełnie inna –

+0

Są w tym samym formacie i są w większości zgodne ze sobą. Dwa przykłady @Trejkaz wspominają tam tylko o tym, które słowa kluczowe są używane. '= 0' jest dosłowną wartością, gdzie' zero' jest słowem kluczowym (to nie dotyczy en-US) –

3

Można użyć L10ns. Korzysta z MessageFormat ICU.

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

Można również zdefiniować za pomocą PluralFormat. Aby uzyskać liczbę mnogą dla Apple.

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

W powyższym stwierdzeniu projekcie CLDR konsorcjum określa liczbę mnogą one i other. Więcej informacji można znaleźć w ich documentation.

Powiązane problemy