mtcute/packages/i18n/src/index.ts

83 lines
2.4 KiB
TypeScript
Raw Normal View History

import { I18nStrings, I18nValue, MtcuteI18nAdapter, MtcuteI18nFunction, OtherLanguageWrap } from './types.js'
import { createI18nStringsIndex, extractLanguageFromUpdate } from './utils.js'
2022-07-19 02:47:59 +03:00
export * from './plurals/english.js'
export * from './plurals/russian.js'
export * from './types.js'
export { extractLanguageFromUpdate } from './utils.js'
export interface MtcuteI18nParameters<Strings extends I18nStrings, Input> {
2022-07-19 02:47:59 +03:00
/**
* Primary language which will also be used as a fallback
*/
primaryLanguage: {
/**
* Two letter language code.
*/
name: string
/**
* Strings for the language.
2022-07-19 02:47:59 +03:00
*/
strings: Strings
}
otherLanguages?: Record<string, OtherLanguageWrap<Strings>>
/**
* Language that will be used if no language is specified
*
2023-10-29 20:25:06 +03:00
* @default {@link primaryLanguage}
2022-07-19 02:47:59 +03:00
*/
defaultLanguage?: string
2022-08-29 18:53:27 +03:00
/**
* Adapter that will be used to extract language from the update.
*/
adapter?: MtcuteI18nAdapter<Input>
2022-07-19 02:47:59 +03:00
}
export function createMtcuteI18n<Strings extends I18nStrings, Input>(
params: MtcuteI18nParameters<Strings, Input>,
2022-08-29 18:53:27 +03:00
): MtcuteI18nFunction<Strings, Input> {
2022-07-19 02:47:59 +03:00
const {
primaryLanguage,
otherLanguages,
defaultLanguage = primaryLanguage.name,
adapter = extractLanguageFromUpdate as unknown as MtcuteI18nAdapter<Input>,
2022-07-19 02:47:59 +03:00
} = params
const indexes: Record<string, Record<string, I18nValue>> = {}
2023-09-24 01:32:22 +03:00
const fallbackIndex = (indexes[primaryLanguage.name] = createI18nStringsIndex(primaryLanguage.strings))
2022-07-19 02:47:59 +03:00
if (otherLanguages) {
Object.keys(otherLanguages).forEach((lang) => {
indexes[lang] = createI18nStringsIndex(otherLanguages[lang] as I18nStrings)
2022-07-19 02:47:59 +03:00
})
}
if (!(defaultLanguage in indexes)) {
2023-09-24 01:32:22 +03:00
throw new TypeError('defaultLanguage is not a registered language')
2022-07-19 02:47:59 +03:00
}
2023-09-24 01:32:22 +03:00
const tr = (lang: Input | string | null, key: string, ...params: unknown[]) => {
2022-07-19 02:47:59 +03:00
if (lang === null) lang = defaultLanguage
2022-08-29 18:53:27 +03:00
if (typeof lang !== 'string') {
lang = adapter(lang) ?? defaultLanguage
2022-07-19 02:47:59 +03:00
}
const strings = indexes[lang] ?? fallbackIndex
let val = strings[key] ?? fallbackIndex[key] ?? `[missing: ${key}]`
if (typeof val === 'function') {
val = val(...params)
}
return val
}
2022-08-29 18:53:27 +03:00
return tr as MtcuteI18nFunction<Strings, Input>
2022-07-19 02:47:59 +03:00
}