Files
lmvpn_server/frontend/src/i18n.ts
T
kevin 25c3ad685a 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 格式
2026-07-07 15:05:53 +08:00

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