diff --git a/frontend/bindings/voidraft/internal/models/models.ts b/frontend/bindings/voidraft/internal/models/models.ts index db6a899..59591a4 100644 --- a/frontend/bindings/voidraft/internal/models/models.ts +++ b/frontend/bindings/voidraft/internal/models/models.ts @@ -28,6 +28,11 @@ export class AppConfig { */ "metadata": ConfigMetadata; + /** + * 界面语言 + */ + "language": LanguageType; + /** Creates a new AppConfig instance. */ constructor($$source: Partial = {}) { 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 定义配置文件路径相关配置 */ diff --git a/frontend/bindings/voidraft/internal/services/configservice.ts b/frontend/bindings/voidraft/internal/services/configservice.ts index b5ed217..2cdb08a 100644 --- a/frontend/bindings/voidraft/internal/services/configservice.ts +++ b/frontend/bindings/voidraft/internal/services/configservice.ts @@ -46,6 +46,14 @@ export function GetFullConfigPath(): Promise & { cancel(): void } { return $resultPromise; } +/** + * GetLanguage 获取当前语言设置 + */ +export function GetLanguage(): Promise & { 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 return $resultPromise; } +/** + * SetLanguage 设置语言 + */ +export function SetLanguage(language: models$0.LanguageType): Promise & { cancel(): void } { + let $resultPromise = $Call.ByID(814725002, language) as any; + return $resultPromise; +} + /** * UpdateEditorConfig 更新编辑器配置 */ diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts index e41f38f..c499cf7 100644 --- a/frontend/src/i18n/index.ts +++ b/frontend/src/i18n/index.ts @@ -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('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; \ No newline at end of file diff --git a/frontend/src/i18n/locales/index.ts b/frontend/src/i18n/locales/index.ts index 4828243..a16569d 100644 --- a/frontend/src/i18n/locales/index.ts +++ b/frontend/src/i18n/locales/index.ts @@ -1,6 +1,6 @@ import zhCN from './zh-CN'; import enUS from './en-US'; - + export default { 'zh-CN': zhCN, 'en-US': enUS diff --git a/frontend/src/stores/configStore.ts b/frontend/src/stores/configStore.ts index e612e1a..1420b59 100644 --- a/frontend/src/stores/configStore.ts +++ b/frontend/src/stores/configStore.ts @@ -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); diff --git a/internal/models/config.go b/internal/models/config.go index 91de990..1610e5f 100644 --- a/internal/models/config.go +++ b/internal/models/config.go @@ -23,6 +23,16 @@ type EditorConfig struct { TabType TabType `json:"tabType"` // Tab类型(空格或Tab) } +// LanguageType 语言类型定义 +type LanguageType string + +const ( + // LangZhCN 中文简体 + LangZhCN LanguageType = "zh-CN" + // LangEnUS 英文-美国 + LangEnUS LanguageType = "en-US" +) + // PathConfig 定义配置文件路径相关配置 type PathConfig struct { RootDir string `json:"rootDir"` // 根目录 @@ -34,6 +44,7 @@ type AppConfig struct { Editor EditorConfig `json:"editor"` // 编辑器配置 Paths PathConfig `json:"paths"` // 路径配置 Metadata ConfigMetadata `json:"metadata"` // 配置元数据 + Language LanguageType `json:"language"` // 界面语言 } // ConfigMetadata 配置元数据 @@ -60,5 +71,6 @@ func NewDefaultAppConfig() *AppConfig { Version: "1.0.0", LastUpdated: time.Now(), }, + Language: LangZhCN, } } diff --git a/internal/services/config_service.go b/internal/services/config_service.go index 4c942c5..b0d8fb9 100644 --- a/internal/services/config_service.go +++ b/internal/services/config_service.go @@ -314,6 +314,58 @@ func (cs *ConfigService) SaveAppConfig(config *models.AppConfig) error { return cs.saveAppConfig(config) } +// GetLanguage 获取当前语言设置 +func (cs *ConfigService) GetLanguage() (models.LanguageType, error) { + // 如果内存中已有配置,直接返回 + if cs.config != nil { + return cs.config.Language, nil + } + + // 否则从文件加载 + config, err := cs.loadAppConfig() + if err != nil { + log.Printf("GetLanguage: Failed to load config: %v", err) + // 使用默认配置 + defaultConfig := models.NewDefaultAppConfig() + cs.config = defaultConfig + return defaultConfig.Language, nil + } + + // 更新内存中的配置 + cs.config = config + log.Printf("GetLanguage: Retrieved language: %s", config.Language) + return config.Language, nil +} + +// SetLanguage 设置语言 +func (cs *ConfigService) SetLanguage(language models.LanguageType) error { + // 验证语言类型有效 + if language != models.LangZhCN && language != models.LangEnUS { + return fmt.Errorf("unsupported language: %s", language) + } + + // 如果内存中已有配置,直接更新 + if cs.config != nil { + log.Printf("SetLanguage: Updating language to: %s", language) + cs.config.Language = language + return cs.saveAppConfig(cs.config) + } + + // 没有内存中的配置,需要先加载 + config, err := cs.loadAppConfig() + if err != nil { + log.Printf("SetLanguage: Failed to load config: %v", err) + // 使用默认配置 + config = models.NewDefaultAppConfig() + } + + // 更新语言配置 + config.Language = language + + // 保存到文件 + return cs.saveAppConfig(config) +} + // UpdateEditorConfig 更新编辑器配置 func (cs *ConfigService) UpdateEditorConfig(editorConfig models.EditorConfig) error { // 如果内存中已有配置,直接更新