i18n.js 1.9 KB
Newer Older
LiangLiu's avatar
LiangLiu committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { createI18n } from 'vue-i18n'
import { ref } from 'vue'

const loadedLanguages = new Set()

// 创建 i18n 实例(初始只设置 locale,不加载全部语言)
const i18n = createI18n({
  legacy: false,
  globalInjection: true,
  locale: 'zh',
  fallbackLocale: 'en',
  messages: {}
})

// 异步加载语言文件
async function loadLanguageAsync(lang) {
  if (!loadedLanguages.has(lang)) {
    const messages = await import(`../locales/${lang}.json`)
    i18n.global.setLocaleMessage(lang, messages.default)
    loadedLanguages.add(lang)
  }
  if (i18n.global.locale.value === lang) return lang
  i18n.global.locale.value = lang
  localStorage.setItem('app-lang', lang) // ✅ 记住用户选择
  document.documentElement.lang = lang === 'zh' ? 'zh-CN' : 'en';
  return lang
}

// 初始化默认语言
async function initLanguage() {
  const savedLang = localStorage.getItem('app-lang') || 'zh'
  return loadLanguageAsync(savedLang)
}
async function switchLang() {
  const newLang = i18n.global.locale.value === 'zh' ? 'en' : 'zh'
  await loadLanguageAsync(newLang)
}

      //   // 语言切换功能
      //   const switchLanguage = (langCode) => {
      //     currentLanguage.value = langCode;
      //     localStorage.setItem('preferredLanguage', langCode);

      //     // 更新页面标题
      //     document.title = t('pageTitle');

      //     // 更新HTML lang属性
      //     document.documentElement.lang = langCode === 'zh' ? 'zh-CN' : 'en';
      // };

      // // 简单语言切换功能(中英文切换)
      // const toggleLanguage = () => {
      //     const newLang = currentLanguage.value === 'zh' ? 'en' : 'zh';
      //     switchLanguage(newLang);
      // };

  const languageOptions = ref([
    { code: 'zh', name: '中文', flag: 'ZH' },
    { code: 'en', name: 'English', flag: 'EN' }
]);

export { i18n as default, loadLanguageAsync, initLanguage, switchLang, languageOptions }