index.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { App, WritableComputedRef } from 'vue'
  2. import { createI18n, I18n as BaseI18n } from 'vue-i18n'
  3. import { deflangName, langNameEum, langNames, langNameDescs } from './constant'
  4. import { localGetFactory, localSetFactory } from '@/utils/store'
  5. import { paramsToStr, strToParams } from '@/utils'
  6. import zh from './zh-entry'
  7. type I18n = BaseI18n & {
  8. global: {
  9. t: I18nGlobalTranslation
  10. changeLang(langName: langNameEum, reload?: boolean): void
  11. locale: WritableComputedRef<langNameEum>
  12. }
  13. }
  14. const localKey = 'lang'
  15. const local = {
  16. get: localGetFactory(str => {
  17. if (str) {
  18. return str as langNameEum
  19. } else {
  20. const langs = Object.keys(langNameDescs)
  21. const defLang = window?.navigator?.language || 'en'
  22. const navLang = langs.find(lang =>
  23. new RegExp(`-?${lang}-?`).test(defLang)
  24. )
  25. return navLang || langNameEum.en
  26. }
  27. }),
  28. set: localSetFactory((lang: langNameEum) => lang)
  29. }
  30. const params = strToParams(location.search)
  31. export const lang = (params.lang || local.get(localKey)) as langNameEum
  32. if (lang !== local.get(localKey)) {
  33. local.set(localKey, lang)
  34. }
  35. const i18n: I18n = createI18n({
  36. legacy: false,
  37. fallbackLocale: deflangName,
  38. availableLocales: langNames,
  39. locale: lang,
  40. sync: true,
  41. silentTranslationWarn: true,
  42. missingWarn: false,
  43. silentFallbackWarn: true
  44. }) as I18n
  45. export const langs = {
  46. [langNameEum.zh]: zh,
  47. }
  48. i18n.global.setLocaleMessage(langNameEum.zh, zh)
  49. i18n.global.changeLang = (lang: langNameEum, reload = true) => {
  50. i18n.global.locale.value = lang
  51. local.set(localKey, lang)
  52. params.lang = lang
  53. if (reload) {
  54. location.search = paramsToStr(params)
  55. }
  56. // location.reload()
  57. }
  58. export const setupI18n = (app: App) => {
  59. app.config.globalProperties.$t = i18n.global.t
  60. app.use(i18n)
  61. }
  62. export const changeLang = i18n.global.changeLang
  63. export const ui18n = i18n.global
  64. export const useI18n = () => ui18n
  65. export * from './constant'