README
Huz Api / I18N Handler
I18n (internationalization / multi-language) handler
Test (100% TDD)
npm test
Install to your project
npm i @huzapi/i18n-handler
Import
const {I18nString} = require('@huzapi/i18n-handler');
//there are many most-used variations below
Interceptors
Interceptor | Input | Output | Sample |
---|---|---|---|
languageDefault | Express.Request | string | 'en' |
languageDefaultList | Express.Request | string[] | ['en', 'de'] |
languageAvailableList | Express.Request | string[] | ['en', 'de', 'fr', 'es', 'it', 'pt', 'cn', 'ru', 'tr'] |
All interceptors take request object to use context
const {Interceptors} = require('@huzapi/i18n-handler');
//it takes current user language
Interceptors.languageDefault((req) => req._userSession.language || 'en' );
//When empty value, which keys will be created
Interceptors.languageDefaultList((req) => ['en', 'de']);
//Only these languages will be allowed, others removed
Interceptors.languageAvailableList((req) => ['en', 'de', 'fr', 'es', 'it', 'pt', 'cn', 'ru', 'tr'])
Variations
Class | DateType | Structure |
---|---|---|
I18nString | string |
{[lang: string]: string} |
I18nStringArray | string[] |
{[lang: string]: Array<string>} |
I18nInt | number |
{[lang: string]: number} |
I18nIntArray | number[] |
{[lang: string]: Array<number>} |
I18nFloat | number |
{[lang: string]: number} |
I18nFloatArray | number[] |
{[lang: string]: Array<number>} |
I18nBool | boolean |
{[lang: string]: boolean} |
I18nBoolArray | boolean[] |
{[lang: string]: Array<boolean>} |
I18nDatetime | string |
{[lang: string]: string} |
I18nDatetimeArray | string[] |
{[lang: string]: Array<string>} |
I18nDate | string |
{[lang: string]: string} |
I18nDateArray | string[] |
{[lang: string]: Array<string>} |
I18nTime | string |
{[lang: string]: string} |
I18nTimeArray | string[] |
{[lang: string]: Array<string>} |
I18nUuid | string |
{[lang: string]: string} |
I18nUuidArray | string[] |
{[lang: string]: Array<string>} |
I18nObject | Record<string, any> |
{[lang: string]: Record<string, any>} |
I18nObjectArray | Record<string, any>[] |
{[lang: string]: Array<Record<string, any>>} |
I18nArray | any[] |
{[lang: string]: Array<any>} |
Create Custom Variation
const {I18nAbstract} = require('@huzapi/i18n-handler');
/**
* Assume that, you want to assign a person to each language
* */
class YourPersonClass {
id = null;
name = null;
/**
* @param {any} value
* @returns {?YourPersonClass}
* */
static cast(value) {
//validates value is {id: string, name: string}
return convertedValue;
}
/**
* @param {any} value
* @returns {boolean}
* */
static isFilled(value) {
//validates value is valid or non-empty
return value.id !== null;
}
}
const YourI18n = new I18nAbstract('info-name', (v) => YourPersonClass.cast(v), (v) => YourPersonClass.isFilled(v));
//DEF_KEY is "__" it will be filled by default language (languageDefault)
//Invalid language will be removed, only languageAvailableList keys will be seved
YourI18n.request(req, {en: {id:5}, invalidLang: {id:23, name: 'dummy'}}) //{__: {id:5, name: null}, en: {id:5, name: null}}
//Plain value (not-i18n) will be converted as i18n
YourI18n.request(req, {id:7}) //{__: {id:7, name: null}, en: {id:7, name: null}}
//DEF_KEY will be removed
YourI18n.response(req, {__: {id:7, name: 'Eric'}, en: {id:7, name: 'Eric'}, de: {id:34, name: 'Hans'}}) //{en: {id:7, name: 'Eric'}, de: {id:34, name: 'Hans'}}
//it based on languageDefaultList, ie: if it is ['en', 'de']
YourI18n.responseDef(req) //{en: {id:null, name: null}, de: {id:null, name: null}}
//it based on languageDefault, ie: if it is 'de'
YourI18n.mapToPlain(req, {__: {id:7, name: 'Eric'}, en: {id:7, name: 'Eric'}, de: {id:34, name: 'Hans'}}) //{id:34, name: 'Hans'}