Pārlūkot izejas kodu

feat: 添加当前系统语言显示功能

- 更新 SoftwareInfo 接口添加 current_locale 和 default_locale 字段
- 在 i18nSlice 中添加系统语言状态和获取逻辑
- 在 LanguageSettingModal 中显示当前语言并自动选中对应选项

修改文件:
- src/API/softwareInfo.ts
- src/states/i18nSlice.ts
- src/components/LanguageSettingModal.tsx
sw 1 nedēļu atpakaļ
vecāks
revīzija
aceb1c6602

+ 4 - 0
src/API/softwareInfo.ts

@@ -5,6 +5,10 @@ export interface SoftwareInfo {
   FPD: string;
   /** 发生器类型 - "Simulator": 模拟设备, "Physics": 物理设备 */
   GEN: string;
+  /** 当前系统语言,如 "zh_CN.UTF-8" */
+  current_locale: string;
+  /** 默认系统语言,如 "zh_CN.UTF-8" */
+  default_locale: string;
   language: string[];
   product: string;
   guest: string; //目前只用于急诊访问数据

+ 9 - 0
src/components/LanguageSettingModal.tsx

@@ -25,6 +25,7 @@ const LanguageSettingModal: React.FC<LanguageSettingModalProps> = ({
   const {
     availableLanguages,
     selectedLanguage,
+    currentSystemLocale,
     languagesLoading,
     savingLanguage,
     languageError,
@@ -100,6 +101,14 @@ const LanguageSettingModal: React.FC<LanguageSettingModalProps> = ({
         ) : (
           <>
             <Space direction="vertical" size="large" style={{ width: '100%' }}>
+              {currentSystemLocale && (
+                <div>
+                  <Text style={{ fontSize: 14 }}>
+                    当前语言:<Text strong>{currentSystemLocale}</Text>
+                  </Text>
+                </div>
+              )}
+
               <div>
                 <Text
                   strong

+ 35 - 15
src/states/i18nSlice.ts

@@ -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) => {