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; "metadata": ConfigMetadata;
/**
* 界面语言
*/
"language": LanguageType;
/** Creates a new AppConfig instance. */ /** Creates a new AppConfig instance. */
constructor($$source: Partial<AppConfig> = {}) { constructor($$source: Partial<AppConfig> = {}) {
if (!("editor" in $$source)) { if (!("editor" in $$source)) {
@@ -39,6 +44,9 @@ export class AppConfig {
if (!("metadata" in $$source)) { if (!("metadata" in $$source)) {
this["metadata"] = (new ConfigMetadata()); this["metadata"] = (new ConfigMetadata());
} }
if (!("language" in $$source)) {
this["language"] = ("" as LanguageType);
}
Object.assign(this, $$source); 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 定义配置文件路径相关配置 * PathConfig 定义配置文件路径相关配置
*/ */

View File

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

View File

@@ -1,6 +1,7 @@
import {createI18n} from 'vue-i18n'; import {createI18n} from 'vue-i18n';
import {useStorage} from '@vueuse/core';
import messages from './locales'; 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'; export type SupportedLocaleType = 'zh-CN' | 'en-US';
@@ -27,29 +28,44 @@ const getBrowserLanguage = (): SupportedLocaleType => {
locale.code.startsWith(langCode) || locale.code.split('-')[0] === langCode 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实例 // 创建i18n实例
const i18n = createI18n({ const i18n = createI18n({
lobalInjection: true, globalInjection: true,
locale: storedLocale.value, locale: 'zh-CN',
fallbackLocale: 'zh-CN' as SupportedLocaleType, fallbackLocale: 'zh-CN' as SupportedLocaleType,
messages 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) => { export const setLocale = (locale: SupportedLocaleType) => {
if (SUPPORTED_LOCALES.some(l => l.code === locale)) { if (SUPPORTED_LOCALES.some(l => l.code === locale)) {
storedLocale.value = locale; // 更新后端配置
i18n.global.locale = locale; SetLanguage(locale as LanguageType)
document.documentElement.setAttribute('lang', locale); .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; export default i18n;

View File

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

View File

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

View File

@@ -23,6 +23,16 @@ type EditorConfig struct {
TabType TabType `json:"tabType"` // Tab类型空格或Tab TabType TabType `json:"tabType"` // Tab类型空格或Tab
} }
// LanguageType 语言类型定义
type LanguageType string
const (
// LangZhCN 中文简体
LangZhCN LanguageType = "zh-CN"
// LangEnUS 英文-美国
LangEnUS LanguageType = "en-US"
)
// PathConfig 定义配置文件路径相关配置 // PathConfig 定义配置文件路径相关配置
type PathConfig struct { type PathConfig struct {
RootDir string `json:"rootDir"` // 根目录 RootDir string `json:"rootDir"` // 根目录
@@ -34,6 +44,7 @@ type AppConfig struct {
Editor EditorConfig `json:"editor"` // 编辑器配置 Editor EditorConfig `json:"editor"` // 编辑器配置
Paths PathConfig `json:"paths"` // 路径配置 Paths PathConfig `json:"paths"` // 路径配置
Metadata ConfigMetadata `json:"metadata"` // 配置元数据 Metadata ConfigMetadata `json:"metadata"` // 配置元数据
Language LanguageType `json:"language"` // 界面语言
} }
// ConfigMetadata 配置元数据 // ConfigMetadata 配置元数据
@@ -60,5 +71,6 @@ func NewDefaultAppConfig() *AppConfig {
Version: "1.0.0", Version: "1.0.0",
LastUpdated: time.Now(), LastUpdated: time.Now(),
}, },
Language: LangZhCN,
} }
} }

View File

@@ -314,6 +314,58 @@ func (cs *ConfigService) SaveAppConfig(config *models.AppConfig) error {
return cs.saveAppConfig(config) 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 更新编辑器配置 // UpdateEditorConfig 更新编辑器配置
func (cs *ConfigService) UpdateEditorConfig(editorConfig models.EditorConfig) error { func (cs *ConfigService) UpdateEditorConfig(editorConfig models.EditorConfig) error {
// 如果内存中已有配置,直接更新 // 如果内存中已有配置,直接更新