✨ Add i18n support
This commit is contained in:
@@ -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 定义配置文件路径相关配置
|
||||||
*/
|
*/
|
||||||
|
@@ -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 更新编辑器配置
|
||||||
*/
|
*/
|
||||||
|
@@ -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;
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
@@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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 {
|
||||||
// 如果内存中已有配置,直接更新
|
// 如果内存中已有配置,直接更新
|
||||||
|
Reference in New Issue
Block a user