1.0.1 • Published 5 years ago

@huzapi/i18n-handler v1.0.1

Weekly downloads
-
License
ISC
Repository
gitlab
Last release
5 years ago

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

InterceptorInputOutputSample
languageDefaultExpress.Requeststring'en'
languageDefaultListExpress.Requeststring[]'en', 'de'
languageAvailableListExpress.Requeststring[]'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

ClassDateTypeStructure
I18nStringstring{[lang: string]: string}
I18nStringArraystring[]{[lang: string]: Array<string>}
I18nIntnumber{[lang: string]: number}
I18nIntArraynumber[]{[lang: string]: Array<number>}
I18nFloatnumber{[lang: string]: number}
I18nFloatArraynumber[]{[lang: string]: Array<number>}
I18nBoolboolean{[lang: string]: boolean}
I18nBoolArrayboolean[]{[lang: string]: Array<boolean>}
I18nDatetimestring{[lang: string]: string}
I18nDatetimeArraystring[]{[lang: string]: Array<string>}
I18nDatestring{[lang: string]: string}
I18nDateArraystring[]{[lang: string]: Array<string>}
I18nTimestring{[lang: string]: string}
I18nTimeArraystring[]{[lang: string]: Array<string>}
I18nUuidstring{[lang: string]: string}
I18nUuidArraystring[]{[lang: string]: Array<string>}
I18nObjectRecord<string, any>{[lang: string]: Record<string, any>}
I18nObjectArrayRecord<string, any>[]{[lang: string]: Array<Record<string, any>>}
I18nArrayany[]{[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'}