Created
May 20, 2020 08:34
-
-
Save RWOverdijk/14b6f846d78d0c3573c89020fd15b100 to your computer and use it in GitHub Desktop.
TypeScript: Tiny super basic I18n
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class I18n { | |
public translations: TranslationsInterface; | |
public locale: string; | |
constructor(locale: string = '', translations: TranslationsInterface = {}) { | |
this.translations = translations; | |
this.locale = locale; | |
} | |
public t(key: string, params?: { [key: string]: string }) { | |
const translation = key.split('.').reduce((tmpMessages: any, part: string) => { | |
if (!tmpMessages || !tmpMessages[part]) return null; | |
return tmpMessages[part]; | |
}, (this.translations[this.locale] || {}) as LanguageTranslationsInterface); | |
if (!translation) { | |
return 'ERROR: No translation for: ' + key; | |
} | |
if (!params) { | |
return translation; | |
} | |
return Object.keys(params).reduce((msg: string, paramKey: string) => { | |
return msg.replace(new RegExp(`%{${paramKey}}`, 'g'), params[paramKey]); | |
}, translation); | |
} | |
public toCurrency(cents: number) { | |
const { | |
decimals = 2, | |
unit = '$ ', | |
separator = '.', | |
delimiter = ',' | |
} = (this.translations[this.locale]?.number as NumberTranslationsInterface | null)?.currency?.format ?? {}; | |
return unit + (Math.round(cents) / 100) | |
.toFixed(decimals) | |
.replace('.', separator as string) | |
.replace(new RegExp(`\\d(?=(\\d{3})+\\${separator})`, 'g'), `$&${delimiter}`); | |
} | |
} | |
export interface TranslationsInterface { | |
[language: string]: LanguageTranslationsInterface | { number?: NumberTranslationsInterface }; | |
} | |
export interface NumberTranslationsInterface { | |
currency: { | |
format: { | |
unit?: string, | |
separator?: string; | |
delimiter?: string; | |
decimals?: number; | |
}; | |
}; | |
} | |
export interface LanguageTranslationsInterface { | |
[keyOrNamespace: string]: string | LanguageTranslationsInterface; | |
} | |
const i18n = new I18n('nl', { | |
nl: { | |
number: { | |
currency: { | |
format: { | |
unit: '€ ', | |
separator: ',', | |
delimiter: '.', | |
} | |
} | |
}, | |
hello: 'world', | |
nested: { | |
is: { | |
bitchin: 'word', | |
} | |
} | |
} | |
}); | |
i18n.toCurrency(1200050); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment