多语言: - 新增 vue-i18n,创建 src/locales/zh.ts、en.ts 语言包,按功能模块组织 key - 新增 src/i18n.ts,语言检测优先级:localStorage > navigator.language(zh→中文,其他→英文)> 兜底英文 - 导航栏新增语言切换按钮(中/EN 一键切换),选择持久化到 localStorage - 全部 View/Component 硬编码中文替换为 t() 调用,stores/auth.ts 错误消息同样国际化 - index.html lang 属性运行时动态更新 Logo: - 替换 Vue 默认 logo 为 LmVPN 品牌 Logo(盾牌+网络节点) - Header 导航栏:Logo 图标 + "LmVPN" 文字 - 首页标题区:大尺寸 Logo 展示 - Favicon 替换为 SVG 格式
33 lines
867 B
TypeScript
33 lines
867 B
TypeScript
import { createI18n } from 'vue-i18n'
|
|
import { messages, type Locale } from './locales'
|
|
|
|
const STORAGE_KEY = 'lang'
|
|
|
|
function detectLocale(): Locale {
|
|
const saved = localStorage.getItem(STORAGE_KEY)
|
|
if (saved === 'zh' || saved === 'en') return saved
|
|
const navLang = navigator.language?.toLowerCase() ?? ''
|
|
return navLang.startsWith('zh') ? 'zh' : 'en'
|
|
}
|
|
|
|
const i18n = createI18n({
|
|
legacy: false,
|
|
locale: detectLocale(),
|
|
fallbackLocale: 'en',
|
|
messages,
|
|
})
|
|
|
|
export function setLocale(locale: Locale) {
|
|
i18n.global.locale.value = locale
|
|
localStorage.setItem(STORAGE_KEY, locale)
|
|
document.documentElement.lang = locale === 'zh' ? 'zh-CN' : 'en'
|
|
}
|
|
|
|
export function toggleLocale() {
|
|
setLocale(i18n.global.locale.value === 'zh' ? 'en' : 'zh')
|
|
}
|
|
|
|
document.documentElement.lang = i18n.global.locale.value === 'zh' ? 'zh-CN' : 'en'
|
|
|
|
export default i18n
|