|
@@ -1,10 +1,15 @@
|
|
|
import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit';
|
|
|
import { fetchI18nMessages, I18nMessages } from '../API/i18n/i18nActions';
|
|
|
-import {
|
|
|
- getLanguageList,
|
|
|
- changeLanguage,
|
|
|
- LanguageItem,
|
|
|
-} from '../API/language';
|
|
|
+import { getLanguageList, changeLanguage, LanguageItem } from '../API/language';
|
|
|
+import { fetchSoftwareInfo } from '../API/softwareInfo';
|
|
|
+
|
|
|
+/**
|
|
|
+ * 从 locale 格式提取语言代码
|
|
|
+ * 例如: "zh_CN.UTF-8" -> "zh", "en_US.UTF-8" -> "en"
|
|
|
+ */
|
|
|
+function extractLanguageCode(locale: string): string {
|
|
|
+ return locale.split('_')[0].split('.')[0];
|
|
|
+}
|
|
|
|
|
|
export interface I18nState {
|
|
|
messages: I18nMessages;
|
|
@@ -15,6 +20,7 @@ export interface I18nState {
|
|
|
// 语言管理相关状态
|
|
|
availableLanguages: LanguageItem[];
|
|
|
selectedLanguage: string;
|
|
|
+ currentSystemLocale: string; // 当前系统语言,如 "zh"
|
|
|
languagesLoading: boolean;
|
|
|
savingLanguage: boolean;
|
|
|
languageError: string | null;
|
|
@@ -29,6 +35,7 @@ const initialState: I18nState = {
|
|
|
// 语言管理初始状态
|
|
|
availableLanguages: [],
|
|
|
selectedLanguage: '',
|
|
|
+ currentSystemLocale: '',
|
|
|
languagesLoading: false,
|
|
|
savingLanguage: false,
|
|
|
languageError: null,
|
|
@@ -47,11 +54,24 @@ export const loadI18nMessages = createAsyncThunk(
|
|
|
export const loadAvailableLanguages = createAsyncThunk(
|
|
|
'i18n/loadAvailableLanguages',
|
|
|
async () => {
|
|
|
- const response = await getLanguageList();
|
|
|
- if (response.data.code === '0x000000') {
|
|
|
- return response.data.data;
|
|
|
+ // 同时获取语言列表和软件信息
|
|
|
+ const [languageResponse, softwareInfo] = await Promise.all([
|
|
|
+ getLanguageList(),
|
|
|
+ fetchSoftwareInfo(),
|
|
|
+ ]);
|
|
|
+
|
|
|
+ if (languageResponse.data.code === '0x000000') {
|
|
|
+ // 从 softwareInfo 获取当前系统语言
|
|
|
+ const currentSystemLocale = extractLanguageCode(
|
|
|
+ softwareInfo.current_locale
|
|
|
+ );
|
|
|
+
|
|
|
+ return {
|
|
|
+ languages: languageResponse.data.data,
|
|
|
+ currentSystemLocale,
|
|
|
+ };
|
|
|
}
|
|
|
- throw new Error(response.data.description || '加载语言列表失败');
|
|
|
+ throw new Error(languageResponse.data.description || '加载语言列表失败');
|
|
|
}
|
|
|
);
|
|
|
|
|
@@ -109,16 +129,16 @@ const i18nSlice = createSlice({
|
|
|
})
|
|
|
.addCase(loadAvailableLanguages.fulfilled, (state, action) => {
|
|
|
state.languagesLoading = false;
|
|
|
- state.availableLanguages = action.payload;
|
|
|
- // 默认选中第一个语言
|
|
|
- if (action.payload.length > 0 && !state.selectedLanguage) {
|
|
|
- state.selectedLanguage = action.payload[0].language;
|
|
|
+ state.availableLanguages = action.payload.languages;
|
|
|
+ state.currentSystemLocale = action.payload.currentSystemLocale;
|
|
|
+ // 默认选中当前系统语言
|
|
|
+ if (!state.selectedLanguage) {
|
|
|
+ state.selectedLanguage = action.payload.currentSystemLocale;
|
|
|
}
|
|
|
})
|
|
|
.addCase(loadAvailableLanguages.rejected, (state, action) => {
|
|
|
state.languagesLoading = false;
|
|
|
- state.languageError =
|
|
|
- action.error.message || '加载语言列表失败';
|
|
|
+ state.languageError = action.error.message || '加载语言列表失败';
|
|
|
})
|
|
|
// 更新系统语言
|
|
|
.addCase(updateSystemLanguage.pending, (state) => {
|