@huzapi/i18n-handlerdeprecated

I18n (internationalization / multi-language) handler

Usage no npm install needed!

<script type="module">
  import huzapiI18nHandler from 'https://cdn.skypack.dev/@huzapi/i18n-handler';
</script>

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'}