index.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { createI18n, I18n as BaseI18n } from 'vue-i18n'
  2. import { App, WritableComputedRef } from 'vue'
  3. import { localGetFactory, localSetFactory } from '@/utils/store'
  4. import { paramsToStr, strToParams } from '@/utils/params'
  5. import zh from './locales/zh.json'
  6. import en from './locales/en.json'
  7. import ja from './locales/ja.json'
  8. import kr from './locales/ko.json'
  9. // 语言支持
  10. export enum langNameEum {
  11. zh = 'zh',
  12. en = 'en',
  13. ja = 'ja',
  14. kr = 'kr'
  15. }
  16. export const langNameDescs = {
  17. [langNameEum.zh]: '中文',
  18. [langNameEum.en]: 'English',
  19. [langNameEum.ja]: '日语',
  20. [langNameEum.kr]: '韩语'
  21. }
  22. export const deflangName = langNameEum.zh
  23. export const langNames = [langNameEum.en, langNameEum.zh, langNameEum.ja, langNameEum.kr]
  24. type I18n = BaseI18n & {
  25. global: {
  26. t: I18nGlobalTranslation
  27. changeLang(langName: langNameEum, reload?: boolean): void
  28. locale: WritableComputedRef<langNameEum>
  29. }
  30. }
  31. const localKey = 'lang'
  32. const local = {
  33. get: localGetFactory(str => {
  34. const langs = Object.keys(langNameDescs)
  35. if (str) {
  36. return langs.includes(str) ? str : langNameEum.zh
  37. } else {
  38. const defLang = window?.navigator?.language || 'zh'
  39. const navLang = langs.find(lang =>
  40. new RegExp(`-?${lang}-?`).test(defLang)
  41. )
  42. return navLang || langNameEum.en
  43. }
  44. }),
  45. set: localSetFactory((lang: langNameEum) => lang)
  46. }
  47. const params = strToParams(location.search)
  48. export const langKey = (params.lang || local.get(localKey)) as langNameEum
  49. if (langKey !== local.get(localKey)) {
  50. local.set(localKey, langKey)
  51. }
  52. const i18n: I18n = createI18n({
  53. legacy: false,
  54. fallbackLocale: deflangName,
  55. availableLocales: langNames,
  56. locale: langKey,
  57. sync: true,
  58. silentTranslationWarn: true,
  59. missingWarn: false,
  60. silentFallbackWarn: true
  61. }) as I18n
  62. export const langs = {
  63. [langNameEum.en]: en,
  64. [langNameEum.zh]: zh,
  65. [langNameEum.ja]: ja,
  66. [langNameEum.kr]: kr,
  67. }
  68. export const lang = langs[langKey] as typeof zh
  69. console.error(lang)
  70. i18n.global.setLocaleMessage(langNameEum.zh, zh)
  71. i18n.global.setLocaleMessage(langNameEum.en, en)
  72. i18n.global.setLocaleMessage(langNameEum.ja, ja)
  73. i18n.global.setLocaleMessage(langNameEum.kr, kr)
  74. i18n.global.changeLang = (lang: langNameEum, reload = true) => {
  75. i18n.global.locale.value = lang
  76. local.set(localKey, lang)
  77. params.lang = lang
  78. if (reload) {
  79. location.search = paramsToStr(params)
  80. }
  81. // location.reload()
  82. }
  83. export const setupI18n = (app: App) => {
  84. window.$t = app.config.globalProperties.$t = i18n.global.t
  85. app.use(i18n)
  86. }
  87. export const changeLang = i18n.global.changeLang
  88. export const ui18n = i18n.global
  89. export const useI18n = () => ui18n