element-plus/packages/hooks/use-locale/index.ts
Jeremy c2710d97d0
fix(components): [global-config] (#11847)
* fix(components): [loading]

* Remove inappropriate way of using injection in directives.

* chore: rewrite implementation

* fix(components): [global-config]

* Fix global config injection in global components.

* chore: fix format

* chore: remove .only modifier

* chore: fix failing tests
2023-03-06 23:20:21 +08:00

51 lines
1.5 KiB
TypeScript

import { computed, inject, isRef, ref, unref } from 'vue'
import { get } from 'lodash-unified'
import English from '@element-plus/locale/lang/en'
import type { MaybeRef } from '@vueuse/core'
import type { InjectionKey, Ref } from 'vue'
import type { Language } from '@element-plus/locale'
export type TranslatorOption = Record<string, string | number>
export type Translator = (path: string, option?: TranslatorOption) => string
export type LocaleContext = {
locale: Ref<Language>
lang: Ref<string>
t: Translator
}
export const buildTranslator =
(locale: MaybeRef<Language>): Translator =>
(path, option) =>
translate(path, option, unref(locale))
export const translate = (
path: string,
option: undefined | TranslatorOption,
locale: Language
): string =>
(get(locale, path, path) as string).replace(
/\{(\w+)\}/g,
(_, key) => `${option?.[key] ?? `{${key}}`}`
)
export const buildLocaleContext = (
locale: MaybeRef<Language>
): LocaleContext => {
const lang = computed(() => unref(locale).name)
const localeRef = isRef(locale) ? locale : ref(locale)
return {
lang,
locale: localeRef,
t: buildTranslator(locale),
}
}
export const localeContextKey: InjectionKey<Ref<Language | undefined>> =
Symbol('localeContextKey')
export const useLocale = (localeOverrides?: Ref<Language | undefined>) => {
const locale = localeOverrides || inject(localeContextKey, ref())!
return buildLocaleContext(computed(() => locale.value || English))
}