feat: 前端多语言支持(中/英)与品牌 Logo 接入
多语言: - 新增 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 格式
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
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
|
||||
Reference in New Issue
Block a user