53 lines
1.3 KiB
TypeScript
53 lines
1.3 KiB
TypeScript
import { ref, computed } from 'vue'
|
|
import type { Language } from '@/types/tools'
|
|
import { locales } from '@/config/i18n'
|
|
|
|
// 全局语言状态
|
|
const currentLanguage = ref<Language>('zh')
|
|
|
|
export const useLanguage = () => {
|
|
// 获取当前语言的翻译对象
|
|
const translation = computed(() => locales[currentLanguage.value])
|
|
|
|
// 翻译函数
|
|
const t = (key: string, params?: Record<string, string>) => {
|
|
const keys = key.split('.')
|
|
let value: any = translation.value
|
|
|
|
for (const k of keys) {
|
|
value = value?.[k]
|
|
}
|
|
|
|
let result = value || key
|
|
|
|
// 替换参数
|
|
if (params && typeof result === 'string') {
|
|
Object.keys(params).forEach(param => {
|
|
result = result.replace(`{${param}}`, params[param])
|
|
})
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// 切换语言
|
|
const switchLanguage = (lang: Language) => {
|
|
currentLanguage.value = lang
|
|
localStorage.setItem('preferred-language', lang)
|
|
}
|
|
|
|
// 从本地存储恢复语言
|
|
const restoreLanguage = () => {
|
|
const saved = localStorage.getItem('preferred-language') as Language
|
|
if (saved && (saved === 'zh' || saved === 'en')) {
|
|
currentLanguage.value = saved
|
|
}
|
|
}
|
|
|
|
return {
|
|
language: currentLanguage,
|
|
t,
|
|
switchLanguage,
|
|
restoreLanguage
|
|
}
|
|
}
|