index.ts 2.3 KB

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