index.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 "./locales/zh.json";
  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";