import { createI18n } from 'vue-i18n' import en from './en' import zhCN from './zh-CN' // 默认语言 const defaultLocale = 'en' // 支持的语言列表 export const supportedLocales = [ { code: 'en', name: 'English' }, { code: 'zh-CN', name: '中文' } ] // 从localStorage获取用户偏好语言 function getStoredLocale() { const stored = localStorage.getItem('preferred-locale') if (stored && supportedLocales.some(locale => locale.code === stored)) { return stored } return null } // 检测浏览器语言 function getBrowserLocale() { const navigator = window.navigator const browserLocale = navigator.language || navigator.userLanguage || defaultLocale // 检查是否直接支持 if (supportedLocales.some(locale => locale.code === browserLocale)) { return browserLocale } // 检查是否支持语言的主要部分(如 zh-CN -> zh) const primaryLanguage = browserLocale.split('-')[0] const matchedLocale = supportedLocales.find(locale => locale.code.split('-')[0] === primaryLanguage ) return matchedLocale?.code || defaultLocale } // 确定使用的语言 const initialLocale = getStoredLocale() || getBrowserLocale() // 创建i18n实例 const i18n = createI18n({ legacy: false, // 使用Composition API模式 locale: initialLocale, fallbackLocale: defaultLocale, messages: { en, 'zh-CN': zhCN }, // 全局注入属性 globalInjection: true, // 开发环境下显示缺失翻译警告 // eslint-disable-next-line no-undef silentTranslationWarn: process.env.NODE_ENV === 'production', // eslint-disable-next-line no-undef silentFallbackWarn: process.env.NODE_ENV === 'production' }) // 语言切换函数 export function setLocale(locale) { if (supportedLocales.some(l => l.code === locale)) { i18n.global.locale.value = locale localStorage.setItem('preferred-locale', locale) // 设置HTML lang属性 document.documentElement.lang = locale } } // 获取当前语言 export function getCurrentLocale() { return i18n.global.locale.value } // 初始化时设置HTML lang属性 document.documentElement.lang = initialLocale export default i18n