A typed, no-dependency language and translation lib.
- Support for standard template literals as placeholders in messages, with plural support.
- Translations implement interfaces, so:
- you cannot use a incorrect message, since the compiler allows only declared message keys.
- you cannot forget a translation, since all the compiler will enforce you to implement it.
Add @rr0/lang as a dependency to your project:
npm install @rr0/lang --save
so that you can
import * from "@rr0/lang"
in your code.
- Create a common interface for your messages in every language. :
interface MyMessages extends KeyValue { hello: string; bye: string; }}` - Create implementations of this interface with translations values:
class MyFrenchMessages implements MyMessages { hello = "Bonjour ${name}"; bye = "Au revoir"} - Create a Translator with a given target language and grammar:
frTranslator = new Translator("fr", grammar_fr) - Translate a message:
bonjour = frTranslator.translate(myFrMessages.hello, {name: "Jérôme"})
You can use ${var:plural} variant in a placeholder to force plural. The translator will then use the provided grammar
rules to render the message.
By default, messages and translators are separated, but you can use a Translation, which is a Translator that holds
its messages.
Say we want to translate some message in two locales:
import{Translator,grammar_en,grammar_fr}from'@rr0/lang'// #1interfaceMyMessagesextendsKeyValue{key1: string}// #2classEnglishMessagesimplementsMyMessages{key1='several ${param1:plural} and ${param2:plural} but one single ${param1} and ${param2}'}classFrenchMessagesimplementsMyMessages{key1='plusieurs ${param1:plural} et ${param2:plural} mais un seul ${param1} et ${param2}'}// #3constmessages_en=newEnglishMessages()consttranslator_en=newTranslator('en',grammar_en)constmessages_fr=newFrenchMessages()consttranslator_fr=newTranslator('fr',grammar_fr)// #4consttranslated_en=translator_en.translate(messages_en.key1,{param1: 'thing',param2: 'party'})// translated_en = "several things and parties but one single thing and party"consttranslated_fr=translator_fr.translate(messages_fr.key1,{param1: 'cigare',param2: 'cheval'})// translated_fr = "plusieurs cigares et chevaux mais un seul cigare et cheval"A Translation is a Translator that holds its messages. For instance:
constmessages={dict: {key: 'value is ${param}'}}consttranslation=newTranslation('fr',grammar_fr,messages)translation.add('newKey','new value is ${param}')consttranslated=translation.translate(translation.messages.dict['newKey'],{param: 'paramValue'})// translated = "new value is paramValue"