Internationalisation avec une syntaxe simple pour node.js et le navigateur.
Les solutions classiques utilisent plusieurs expressions pour les pluriels. Babelfish
définit plutôt les pluriels en ligne - c'est plus compact et plus facile pour les programmeurs. De plus, les phrases sont regroupées dans des étendues imbriquées, comme dans Ruby.
BabelFish
prend en charge toutes les règles plurielles du CLDR Unicode (via pluriels-cldr).
noeud.js :
$ npm install babelfish
navigateur:
$ bower install babelfish
Utilisez es5-shim pour la compatibilité des anciens navigateurs.
#{varname}
Fait écho à la valeur de la variable((Singular|Plural1|Plural2)):count
Forme plurielleexemple:
А у меня в кармане #{nails_count} ((гвоздь|гвоздя|гвоздей)):nails_count
Vous pouvez également omettre la variable d'ancrage pour les pluriels, par défaut ce sera count
. Ainsi les variantes suivantes sont égales :
I have #{count} ((nail|nails))
I have #{count} ((nail|nails)):count
Vous pouvez également utiliser des variables en plusieurs parties :
I have ((#{count} nail|#{count} nails))
Besoin d'une forme zéro spéciale ou d'écraser une valeur spécifique ? Aucun problème :
I have ((=0 no nails|#{count} nail|#{count} nails))
Si vous avez besoin #{
, ((
, |
or ))
quelque part dans le texte, où il peut être considéré comme une partie de balisage, échappez-les simplement avec .
Comme BabelFish aplatit les portées, c'est vraiment amusant et agréable de stocker les traductions dans des fichiers YAML :
---
ru-RU :
profile : Профиль
forums : Форумы
apps :
forums :
new_topic : Новая тема
last_post :
title : Последнее сообщение
by : от
demo :
apples : " На столе лежит #{count} ((яблоко|яблока|яблок)) "
// Create new instance of BabelFish with default language/locale: 'en-GB'
var BabelFish = require ( 'babelfish' ) ;
var i18n = new BabelFish ( 'en-GB' ) ;
// Fill in some phrases
i18n . addPhrase ( 'en-GB' , 'demo.hello' , 'Hello, #{user.name}.' ) ;
i18n . addPhrase ( 'en-GB' , 'demo.conv.wazup' , 'Whats up?' ) ;
i18n . addPhrase ( 'en-GB' , 'demo.conv.alright' , 'Alright, man!' ) ;
i18n . addPhrase ( 'en-GB' , 'demo.coerce' , 'Total: #{count}.' ) ;
i18n . addPhrase ( 'ru-RU' , 'demo.hello' , 'Привет, #{user.name}.' ) ;
i18n . addPhrase ( 'ru-RU' , 'demo.conv.wazup' , 'Как дела?' ) ;
i18n . addPhrase ( 'uk-UA' , 'demo.hello' , 'Здоровенькі були, #{user.name}.' ) ;
// Set locale fallback to use the most appropriate translation when possible
i18n . setFallback ( 'uk-UA' , 'ru-RU' ) ;
// Translate
var params = { user : { name : 'ixti' } } ;
i18n . t ( 'ru-RU' , 'demo.hello' , params ) ; // -> 'Привет, ixti.'
i18n . t ( 'ru-RU' , 'demo.conv.wazup' ) ; // -> 'Как дела?'
i18n . t ( 'ru-RU' , 'demo.conv.alright' ) ; // -> 'Alright, man!'
i18n . t ( 'uk-UA' , 'demo.hello' , params ) ; // -> 'Здоровенькі були, ixti.'
i18n . t ( 'uk-UA' , 'demo.conv.wazup' ) ; // -> 'Как дела?'
i18n . t ( 'uk-UA' , 'demo.conv.alright' ) ; // -> 'Alright, man!'
// When params is number or strings, it will be coerced to
// `{ count: XXX, value: XXX }` - use any of those in phrase.
i18n . t ( 'en-GB' , 'demo.coerce' , 5 ) ; // -> 'Total: 5.'
// You may wish to "dump" translations to load in browser later
// Dump will include all fallback translations and fallback rules
var locale_dump = i18n . stringify ( 'ru-RU' ) ;
var i18n_new = require ( 'babelfish' ) ( 'en-GB' ) ; // init without `new` also works
i18n_new . load ( locale_dump ) ;
// Use objects instead of strings (object/array/number/boolean) - can be
// useful to prepare bulk data for external libraries.
// Note, only JSON-supported types are ok (no date & regex)
i18n . addPhrase ( 'en-GB' , 'demo.boolean' , true ) ;
i18n . addPhrase ( 'en-GB' , 'demo.number' , 123 ) ;
i18n . addPhrase ( 'en-GB' , 'demo.array' , [ 1 , 2 , 3 ] ) ;
// fourth param required for hashes (objects) to disable flattening,
// other types are autodetected
i18n . addPhrase ( 'en-GB' , 'demo.array' , { foo : 1 , bar : "2" } , false ) ;
Visualisez le fichier LICENCE (MIT).