Add i18n support

This commit is contained in:
2025-04-28 12:41:18 +08:00
parent 0d3df25a94
commit d7a848e7ad
7 changed files with 140 additions and 16 deletions

View File

@@ -28,6 +28,11 @@ export class AppConfig {
*/
"metadata": ConfigMetadata;
/**
* 界面语言
*/
"language": LanguageType;
/** Creates a new AppConfig instance. */
constructor($$source: Partial<AppConfig> = {}) {
if (!("editor" in $$source)) {
@@ -39,6 +44,9 @@ export class AppConfig {
if (!("metadata" in $$source)) {
this["metadata"] = (new ConfigMetadata());
}
if (!("language" in $$source)) {
this["language"] = ("" as LanguageType);
}
Object.assign(this, $$source);
}
@@ -158,6 +166,26 @@ export class EditorConfig {
}
}
/**
* LanguageType 语言类型定义
*/
export enum LanguageType {
/**
* The Go zero value for the underlying type of the enum.
*/
$zero = "",
/**
* LangZhCN 中文简体
*/
LangZhCN = "zh-CN",
/**
* LangEnUS 英文-美国
*/
LangEnUS = "en-US",
};
/**
* PathConfig 定义配置文件路径相关配置
*/

View File

@@ -46,6 +46,14 @@ export function GetFullConfigPath(): Promise<string> & { cancel(): void } {
return $resultPromise;
}
/**
* GetLanguage 获取当前语言设置
*/
export function GetLanguage(): Promise<models$0.LanguageType> & { cancel(): void } {
let $resultPromise = $Call.ByID(3409375894) as any;
return $resultPromise;
}
/**
* ResetToDefault 重置为默认配置
*/
@@ -62,6 +70,14 @@ export function SaveAppConfig(config: models$0.AppConfig | null): Promise<void>
return $resultPromise;
}
/**
* SetLanguage 设置语言
*/
export function SetLanguage(language: models$0.LanguageType): Promise<void> & { cancel(): void } {
let $resultPromise = $Call.ByID(814725002, language) as any;
return $resultPromise;
}
/**
* UpdateEditorConfig 更新编辑器配置
*/

View File

@@ -1,6 +1,7 @@
import {createI18n} from 'vue-i18n';
import {useStorage} from '@vueuse/core';
import messages from './locales';
import { GetLanguage, SetLanguage } from '@/../bindings/voidraft/internal/services/configservice';
import { LanguageType } from '@/../bindings/voidraft/internal/models';
// 定义支持的语言类型
export type SupportedLocaleType = 'zh-CN' | 'en-US';
@@ -27,29 +28,44 @@ const getBrowserLanguage = (): SupportedLocaleType => {
locale.code.startsWith(langCode) || locale.code.split('-')[0] === langCode
);
return supportedLang?.code || 'zh-CN'; // 默认为中文
return supportedLang?.code || 'zh-CN';
};
const storedLocale = useStorage<SupportedLocaleType>('voidraft-language', getBrowserLanguage());
// 创建i18n实例
const i18n = createI18n({
lobalInjection: true,
locale: storedLocale.value,
globalInjection: true,
locale: 'zh-CN',
fallbackLocale: 'zh-CN' as SupportedLocaleType,
messages
});
// 立即从后端获取语言设置
GetLanguage().then(lang => {
if (lang) {
i18n.global.locale = lang as any;
document.documentElement.setAttribute('lang', lang);
}
}).catch(error => {
console.error('Failed to get language from backend:', error);
// 如果获取失败,使用浏览器语言作为后备
const browserLang = getBrowserLanguage();
i18n.global.locale = browserLang as any;
document.documentElement.setAttribute('lang', browserLang);
});
// 切换语言的方法
export const setLocale = (locale: SupportedLocaleType) => {
if (SUPPORTED_LOCALES.some(l => l.code === locale)) {
storedLocale.value = locale;
i18n.global.locale = locale;
document.documentElement.setAttribute('lang', locale);
// 更新后端配置
SetLanguage(locale as LanguageType)
.then(() => {
i18n.global.locale = locale;
document.documentElement.setAttribute('lang', locale);
})
.catch(error => {
console.error('Failed to set language:', error);
});
}
};
// 初始设置html lang属性
document.documentElement.setAttribute('lang', storedLocale.value);
export default i18n;

View File

@@ -1,6 +1,6 @@
import zhCN from './zh-CN';
import enUS from './en-US';
export default {
'zh-CN': zhCN,
'en-US': enUS

View File

@@ -1,5 +1,5 @@
import {defineStore} from 'pinia';
import {ref, watch, inject} from 'vue';
import {ref, watch} from 'vue';
import {useDebounceFn} from '@vueuse/core';
import {
GetEditorConfig,
@@ -174,8 +174,8 @@ export const useConfigStore = defineStore('config', () => {
// 重置为默认配置
async function resetToDefaults() {
try {
await ResetToDefault();
await loadConfigFromBackend();
await ResetToDefault();
await loadConfigFromBackend();
logStore.info(t('config.resetSuccess'));
} catch (error) {
console.error('Failed to reset configuration:', error);