Просмотр исходного кода

请把字典管理新增,修改,删除弹框内容也全部做英文适配

wyn 4 месяцев назад
Родитель
Сommit
75386925e2

+ 11 - 11
src/components/UserManagement.tsx

@@ -131,11 +131,11 @@ export default function UserManagement({ subMenu }: UserManagementProps) {
   // 导出用户
   const handleExport = async () => {
     Modal.confirm({
-      title: '确认导出',
+      title: t('form.exportUserConfirm'),
       icon: <ExclamationCircleOutlined />,
-      content: '确定要导出用户数据吗?',
-      okText: '确定导出',
-      cancelText: '取消',
+      content: t('form.exportUserConfirmText'),
+      okText: t('form.exportUserConfirmButton'),
+      cancelText: t('common.cancel'),
       onOk: async () => {
         setExportLoading(true);
         try {
@@ -143,14 +143,14 @@ export default function UserManagement({ subMenu }: UserManagementProps) {
           const url = window.URL.createObjectURL(blob);
           const link = document.createElement('a');
           link.href = url;
-          link.download = '用户数据.xls';
+          link.download = t('form.userDataFileName');
           document.body.appendChild(link);
           link.click();
           document.body.removeChild(link);
           window.URL.revokeObjectURL(url);
-          toast.success('导出成功');
+          toast.success(t('form.exportUserSuccess'));
         } catch (error: any) {
-          toast.error(error.message || '导出失败');
+          toast.error(error.message || t('form.exportUserFailed'));
         } finally {
           setExportLoading(false);
         }
@@ -237,7 +237,7 @@ export default function UserManagement({ subMenu }: UserManagementProps) {
     setResetPwdLoading(true);
     try {
       await userApi.resetUserPassword(resetPwdUser.id, resetPwdPassword);
-      toast.success(`修改成功,新密码是:${resetPwdPassword}`);
+      toast.success(`${t('form.resetPasswordSuccess')}${resetPwdPassword}`);
       setResetPwdModalVisible(false);
       setResetPwdPassword('');
       setResetPwdUser(null);
@@ -650,7 +650,7 @@ export default function UserManagement({ subMenu }: UserManagementProps) {
 
       {/* 重置密码弹框 */}
       <Modal
-        title="重置密码"
+        title={t('form.resetPasswordTitle')}
         open={resetPwdModalVisible}
         onOk={submitResetPassword}
         onCancel={() => {
@@ -665,10 +665,10 @@ export default function UserManagement({ subMenu }: UserManagementProps) {
       >
         <div style={{ marginTop: 16 }}>
           <p style={{ marginBottom: 12 }}>
-            请输入用户 <strong>"{resetPwdUser?.username}"</strong> 的新密码:
+            {t('form.resetPasswordPrompt')} <strong>"{resetPwdUser?.username}"</strong> {t('form.resetPasswordNewPassword')}
           </p>
           <Input.Password
-            placeholder="请输入新密码"
+            placeholder={t('form.resetPasswordPlaceholder')}
             value={resetPwdPassword}
             onChange={(e) => setResetPwdPassword(e.target.value)}
             onPressEnter={submitResetPassword}

+ 21 - 21
src/components/lockCabinet/LockCabinetForm.tsx

@@ -73,7 +73,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
   // 打开弹窗
   const open = async (type: string, id?: number) => {
     setDialogVisible(true);
-    setDialogTitle(type === 'create' ? '新增机柜' : '编辑机柜');
+    setDialogTitle(type === 'create' ? t('form.addLockCabinet') : t('form.editLockCabinet'));
     setFormType(type as 'create' | 'update');
     setCurrentId(id);
 
@@ -104,7 +104,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
           });
         }, 0);
       } catch (error: any) {
-        toast.error(error.message || '获取机柜信息失败');
+        toast.error(error.message || t('form.getLockCabinetDetailFailed'));
       } finally {
         setFormLoading(false);
       }
@@ -143,7 +143,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
         // 创建时移除 cabinetId
         delete data.cabinetId;
         await lockCabinetApi.insertIsLockCabinet(data);
-        toast.success('创建成功');
+        toast.success(t('form.createSuccess'));
         setDialogVisible(false);
         // 延迟调用 onSuccess,确保对话框已关闭
         setTimeout(() => {
@@ -152,7 +152,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
       } else {
         // 编辑时,必须使用从详情接口获取的 currentId
         if (!currentId) {
-          toast.error('缺少机柜ID,无法更新');
+          toast.error(t('form.missingLockCabinetId'));
           setFormLoading(false);
           return;
         }
@@ -160,7 +160,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
         delete data.cabinetId;
         (data as any).id = currentId;
         await lockCabinetApi.updateIsLockCabinet(data);
-        toast.success('更新成功');
+        toast.success(t('form.updateSuccess'));
         setDialogVisible(false);
         // 延迟调用 onSuccess,确保对话框已关闭
         setTimeout(() => {
@@ -172,7 +172,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
         // 表单验证错误
         return;
       }
-      toast.error(error.message || '操作失败');
+      toast.error(error.message || t('form.operationFailed'));
     } finally {
       setFormLoading(false);
     }
@@ -212,39 +212,39 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
           }}
         >
           <Form.Item
-            label="锁柜名称"
+            label={t('form.cabinetName')}
             name="cabinetName"
-            rules={[{ required: true, message: '锁柜名称不能为空' }]}
+            rules={[{ required: true, message: t('form.lockCabinetNameRequired') }]}
           >
-            <Input placeholder="请输入锁柜名称" />
+            <Input placeholder={t('form.cabinetNamePlaceholder')} />
           </Form.Item>
 
           <Form.Item
-            label="岗位序号"
+            label={t('form.workstation')}
             name="workstationId"
-            rules={[{ required: true, message: '岗位序号不能为空' }]}
+            rules={[{ required: true, message: t('form.workstationIdRequired') }]}
           >
             <TreeSelect
               treeData={convertToTreeSelectData(workstationOptions)}
-              placeholder="请选择岗位"
+              placeholder={t('form.workstationPlaceholder')}
               treeDefaultExpandAll
             />
           </Form.Item>
 
           <Form.Item
-            label="硬件ID"
+            label={t('table.hardwareId')}
             name="hardwareId"
-            rules={[{ required: true, message: '硬件ID不能为空' }]}
+            rules={[{ required: true, message: t('form.hardwareIdRequired') }]}
           >
             <Select
-              placeholder="请选择硬件ID"
+              placeholder={t('form.hardwareIdPlaceholder')}
               allowClear
               options={hardwareOptions}
             />
           </Form.Item>
 
           <Form.Item
-            label="是否在线"
+            label={t('common.onlineStatus')}
             name="isOnline"
           >
             <Radio.Group>
@@ -257,7 +257,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
           </Form.Item>
 
           <Form.Item
-            label="状态"
+            label={t('table.status')}
             name="status"
           >
             <Radio.Group>
@@ -272,7 +272,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
           <Row gutter={16}>
             <Col span={12}>
               <Form.Item
-                label="图标"
+                label={t('table.icon')}
                 name="cabinetIcon"
                 valuePropName="value"
                 getValueFromEvent={(value) => value}
@@ -287,7 +287,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
             </Col>
             <Col span={12}>
               <Form.Item
-                label="图片"
+                label={t('table.image')}
                 name="cabinetPicture"
                 valuePropName="value"
                 getValueFromEvent={(value) => value}
@@ -303,10 +303,10 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
           </Row>
 
           <Form.Item
-            label="备注"
+            label={t('table.remark')}
             name="remark"
           >
-            <Input.TextArea placeholder="请输入备注" rows={4} />
+            <Input.TextArea placeholder={t('form.remarkPlaceholder')} rows={4} />
           </Form.Item>
         </Form>
       </Spin>

+ 4 - 4
src/components/lockCabinet/SystemLockCabinetManagement.tsx

@@ -143,7 +143,7 @@ export default function SystemLockCabinetManagement() {
     if (formRef.current) {
       formRef.current.open(type, id);
     } else {
-      toast.error(t('common.formNotInitialized') || '表单组件未初始化,请刷新页面重试');
+      toast.error(t('common.formNotInitialized'));
     }
   };
 
@@ -500,7 +500,7 @@ export default function SystemLockCabinetManagement() {
         <div className="bg-white rounded-lg border border-gray-200 px-6 py-4">
           <div className="flex items-center justify-between">
             <div className="text-sm text-gray-600">
-              共 <span className="text-blue-600 font-medium">{total}</span> 条记录
+              {t('common.total')} <span className="text-blue-600 font-medium">{total}</span> {t('common.records')}
             </div>
             <div className="flex gap-2">
               <Button
@@ -511,7 +511,7 @@ export default function SystemLockCabinetManagement() {
                 }}
                 disabled={queryParams.pageNo <= 1}
               >
-                上一页
+                {t('common.prevPage')}
               </Button>
               <span className="px-4 py-2 text-sm text-gray-600 flex items-center">
                 {queryParams.pageNo} / {Math.ceil(total / queryParams.pageSize) || 1}
@@ -524,7 +524,7 @@ export default function SystemLockCabinetManagement() {
                 }}
                 disabled={queryParams.pageNo >= Math.ceil(total / queryParams.pageSize)}
               >
-                下一页
+                {t('common.nextPage')}
               </Button>
             </div>
           </div>

+ 13 - 11
src/components/user/UserAssignRoleForm.tsx

@@ -3,6 +3,7 @@ import { Modal, Form, Input, Select, message } from 'antd';
 import { userPermissionApi } from '../../api/user/permission';
 import { systemApi } from '../../api/System';
 import { UserVO, RoleVO } from '../../types';
+import { useTranslation } from 'react-i18next';
 
 interface UserAssignRoleFormProps {
   onSuccess?: () => void;
@@ -13,6 +14,7 @@ export interface UserAssignRoleFormRef {
 }
 
 const UserAssignRoleForm = forwardRef<UserAssignRoleFormRef, UserAssignRoleFormProps>(({ onSuccess }, ref) => {
+  const { t } = useTranslation();
   const [dialogVisible, setDialogVisible] = useState(false);
   const [formLoading, setFormLoading] = useState(false);
   const [form] = Form.useForm();
@@ -38,7 +40,7 @@ const UserAssignRoleForm = forwardRef<UserAssignRoleFormRef, UserAssignRoleFormP
       setRoleList(roles || []);
     } catch (error) {
       console.error('加载角色列表失败:', error);
-      message.error('加载角色列表失败');
+      message.error(t('form.loadRoleListFailed'));
     }
 
     // 获取用户角色列表
@@ -50,7 +52,7 @@ const UserAssignRoleForm = forwardRef<UserAssignRoleFormRef, UserAssignRoleFormP
       });
     } catch (error: any) {
       console.error('获取用户角色失败:', error);
-      message.error(error.message || '获取用户角色失败');
+      message.error(error.message || t('form.getUserRoleFailed'));
     } finally {
       setFormLoading(false);
     }
@@ -73,11 +75,11 @@ const UserAssignRoleForm = forwardRef<UserAssignRoleFormRef, UserAssignRoleFormP
         };
         console.log('分配角色参数:', params);
         await userPermissionApi.assignUserRole(params);
-        message.success('分配成功');
+        message.success(t('form.assignSuccess'));
         setDialogVisible(false);
         onSuccess?.();
       } catch (error: any) {
-        message.error(error.message || '分配失败');
+        message.error(error.message || t('form.assignFailed'));
       } finally {
         setFormLoading(false);
       }
@@ -88,13 +90,13 @@ const UserAssignRoleForm = forwardRef<UserAssignRoleFormRef, UserAssignRoleFormP
 
   return (
     <Modal
-      title="分配角色"
+      title={t('form.assignRoleTitle')}
       open={dialogVisible}
       onCancel={() => setDialogVisible(false)}
       onOk={submitForm}
       confirmLoading={formLoading}
-      okText="确定"
-      cancelText="取消"
+      okText={t('common.confirm')}
+      cancelText={t('common.cancel')}
       destroyOnClose
     >
       <Form
@@ -104,18 +106,18 @@ const UserAssignRoleForm = forwardRef<UserAssignRoleFormRef, UserAssignRoleFormP
           roleIds: [],
         }}
       >
-        <Form.Item label="用户名称" name="username">
+        <Form.Item label={t('form.userName')} name="username">
           <Input disabled />
         </Form.Item>
 
-        <Form.Item label="用户名" name="nickname">
+        <Form.Item label={t('form.nickname')} name="nickname">
           <Input disabled />
         </Form.Item>
 
-        <Form.Item label="角色" name="roleIds">
+        <Form.Item label={t('common.assignRole')} name="roleIds">
           <Select
             mode="multiple"
-            placeholder="请选择角色"
+            placeholder={t('form.selectRole')}
             options={roleList.map(role => ({
               label: role.name,
               value: role.id,

+ 30 - 30
src/components/user/UserForm.tsx

@@ -34,7 +34,7 @@ const UserForm = forwardRef<UserFormRef, UserFormProps>(({ onSuccess }, ref) =>
   // 打开弹窗
   const open = async (type: string, id?: number) => {
     setDialogVisible(true);
-    setDialogTitle(type === 'create' ? '新增用户' : '编辑用户');
+    setDialogTitle(type === 'create' ? t('form.addUser') : t('form.editUser'));
     setFormType(type as 'create' | 'update');
     form.resetFields();
 
@@ -87,7 +87,7 @@ const UserForm = forwardRef<UserFormRef, UserFormProps>(({ onSuccess }, ref) =>
           deptId: userData.deptId,
         });
       } catch (error: any) {
-        message.error(error.message || '获取用户信息失败');
+        message.error(error.message || t('form.getUserInfoFailed'));
       } finally {
         setFormLoading(false);
       }
@@ -114,7 +114,7 @@ const UserForm = forwardRef<UserFormRef, UserFormProps>(({ onSuccess }, ref) =>
       try {
         if (formType === 'create') {
           await userApi.createUser(values as UserVO);
-          message.success('创建成功');
+          message.success(t('form.createSuccess'));
         } else {
           // 编辑模式下,合并原始数据和表单数据,确保所有必要字段都被传递
           const updateData: any = {
@@ -156,12 +156,12 @@ const UserForm = forwardRef<UserFormRef, UserFormProps>(({ onSuccess }, ref) =>
           
           console.log('提交的用户数据:', updateData); // 调试用
           await userApi.updateUser(updateData as UserVO);
-          message.success('更新成功');
+          message.success(t('form.updateSuccess'));
         }
         setDialogVisible(false);
         onSuccess?.();
       } catch (error: any) {
-        message.error(error.message || '操作失败');
+        message.error(error.message || t('form.operationFailed'));
       } finally {
         setFormLoading(false);
       }
@@ -206,20 +206,20 @@ const UserForm = forwardRef<UserFormRef, UserFormProps>(({ onSuccess }, ref) =>
             <Row gutter={16}>
               <Col span={12}>
                 <Form.Item
-                  label="账号"
+                  label={t('form.account')}
                   name="username"
-                  rules={[{ required: true, message: '账号不能为空' }]}
+                  rules={[{ required: true, message: t('form.accountRequired') }]}
                 >
-                  <Input placeholder="请输入账号" />
+                  <Input placeholder={t('form.accountPlaceholder')} />
                 </Form.Item>
               </Col>
               <Col span={12}>
                 <Form.Item
-                  label="用户密码"
+                  label={t('form.userPassword')}
                   name="password"
-                  rules={[{ required: true, message: '用户密码不能为空' }]}
+                  rules={[{ required: true, message: t('form.userPasswordRequired') }]}
                 >
-                  <Input.Password placeholder="请输入用户密码" />
+                  <Input.Password placeholder={t('form.userPasswordPlaceholder')} />
                 </Form.Item>
               </Col>
             </Row>
@@ -257,18 +257,18 @@ const UserForm = forwardRef<UserFormRef, UserFormProps>(({ onSuccess }, ref) =>
         <Row gutter={16}>
           <Col span={12}>
             <Form.Item
-              label="用户名"
+              label={t('form.nickname')}
               name="nickname"
-              rules={[{ required: true, message: '用户名不能为空' }]}
+              rules={[{ required: true, message: t('form.nicknameRequired') }]}
             >
-              <Input placeholder="请输入用户名" />
+              <Input placeholder={t('form.nicknamePlaceholder')} />
             </Form.Item>
           </Col>
           <Col span={12}>
-            <Form.Item label="部门" name="deptId">
+            <Form.Item label={t('form.departmentName')} name="deptId">
               <TreeSelect
                 treeData={convertDeptToTreeSelectData(deptList)}
-                placeholder="请选择归属部门"
+                placeholder={t('form.selectDept')}
                 style={{ width: '100%' }}
               />
             </Form.Item>
@@ -277,10 +277,10 @@ const UserForm = forwardRef<UserFormRef, UserFormProps>(({ onSuccess }, ref) =>
 
         <Row gutter={16}>
           <Col span={12}>
-            <Form.Item label="岗位" name="workstationIds">
+            <Form.Item label={t('form.workstation')} name="workstationIds">
               <Select
                 mode="multiple"
-                placeholder="选择岗位"
+                placeholder={t('form.selectPosition')}
                 options={postList.map(post => ({
                   label: post.name,
                   value: post.id,
@@ -290,16 +290,16 @@ const UserForm = forwardRef<UserFormRef, UserFormProps>(({ onSuccess }, ref) =>
           </Col>
           <Col span={12}>
             <Form.Item
-              label="手机号码"
+              label={t('form.mobile')}
               name="mobile"
               rules={[
                 {
                   pattern: /^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/,
-                  message: '请输入正确的手机号码',
+                  message: t('form.mobilePhoneError'),
                 },
               ]}
             >
-              <Input maxLength={11} placeholder="请输入手机号码" />
+              <Input maxLength={11} placeholder={t('form.mobilePlaceholder')} />
             </Form.Item>
           </Col>
         </Row>
@@ -307,21 +307,21 @@ const UserForm = forwardRef<UserFormRef, UserFormProps>(({ onSuccess }, ref) =>
         <Row gutter={16}>
           <Col span={12}>
             <Form.Item
-              label="邮箱"
+              label={t('form.deptEmail')}
               name="email"
               rules={[
                 {
                   type: 'email',
-                  message: '请输入正确的邮箱地址',
+                  message: t('form.emailError'),
                 },
               ]}
             >
-              <Input maxLength={50} placeholder="请输入邮箱" />
+              <Input maxLength={50} placeholder={t('form.deptEmailPlaceholder')} />
             </Form.Item>
           </Col>
           <Col span={12}>
-            <Form.Item label="用户性别" name="sex">
-              <Select placeholder="请选择">
+            <Form.Item label={t('form.userSex')} name="sex">
+              <Select placeholder={t('common.pleaseSelect')}>
                 {sexOptions.map(option => (
                   <Select.Option key={option.value} value={option.value}>
                     {option.label}
@@ -335,15 +335,15 @@ const UserForm = forwardRef<UserFormRef, UserFormProps>(({ onSuccess }, ref) =>
         <Row gutter={16}>
           <Col span={12}>
             <Form.Item
-              label="卡号"
+              label={t('form.cardNumber')}
               name="cardNfc"
             >
-              <Input placeholder="请输入卡号(选填)" />
+              <Input placeholder={t('form.cardNumberPlaceholder')} />
             </Form.Item>
           </Col>
           <Col span={12}>
-            <Form.Item label="备注" name="remark">
-              <TextArea rows={3} placeholder="请输入内容" />
+            <Form.Item label={t('form.remark')} name="remark">
+              <TextArea rows={3} placeholder={t('form.remarkPlaceholder')} />
             </Form.Item>
           </Col>
         </Row>

+ 16 - 16
src/components/user/UserImportForm.tsx

@@ -41,14 +41,14 @@ const UserImportForm = forwardRef<UserImportFormRef, UserImportFormProps>(({ onS
       const url = window.URL.createObjectURL(blob);
       const link = document.createElement('a');
       link.href = url;
-      link.download = '用户导入模版.xls';
+      link.download = t('form.userImportTemplateFileName');
       document.body.appendChild(link);
       link.click();
       document.body.removeChild(link);
       window.URL.revokeObjectURL(url);
-      message.success('模板下载成功');
+      message.success(t('form.templateDownloadSuccess'));
     } catch (error: any) {
-      message.error(error.message || '下载模板失败');
+      message.error(error.message || t('form.templateDownloadFailed'));
     }
   };
 
@@ -62,7 +62,7 @@ const UserImportForm = forwardRef<UserImportFormRef, UserImportFormProps>(({ onS
       const validTypes = ['.xlsx', '.xls'];
       const fileExtension = file.name.substring(file.name.lastIndexOf('.')).toLowerCase();
       if (!validTypes.includes(fileExtension)) {
-        message.error('仅允许导入 xls、xlsx 格式文件');
+        message.error(t('form.fileFormatError'));
         return false;
       }
       setFileList([file]);
@@ -79,13 +79,13 @@ const UserImportForm = forwardRef<UserImportFormRef, UserImportFormProps>(({ onS
   // 提交表单
   const submitForm = async () => {
     if (fileList.length === 0) {
-      message.error('请上传文件');
+      message.error(t('form.pleaseUploadFile'));
       return;
     }
 
     const file = fileList[0].originFileObj;
     if (!file) {
-      message.error('请上传文件');
+      message.error(t('form.pleaseUploadFile'));
       return;
     }
 
@@ -95,15 +95,15 @@ const UserImportForm = forwardRef<UserImportFormRef, UserImportFormProps>(({ onS
       
       // 拼接提示语
       const data = response;
-      let text = `上传成功数量:${data.createUsernames?.length || 0}; `;
+      let text = `${t('form.uploadSuccessCount')}${data.createUsernames?.length || 0}; `;
       if (data.createUsernames?.length > 0) {
         text += data.createUsernames.map((u: string) => `< ${u} >`).join(' ');
       }
-      text += `更新成功数量:${data.updateUsernames?.length || 0}; `;
+      text += `${t('form.updateSuccessCount')}${data.updateUsernames?.length || 0}; `;
       if (data.updateUsernames?.length > 0) {
         text += data.updateUsernames.map((u: string) => `< ${u} >`).join(' ');
       }
-      text += `更新失败数量:${Object.keys(data.failureUsernames || {}).length}; `;
+      text += `${t('form.updateFailedCount')}${Object.keys(data.failureUsernames || {}).length}; `;
       if (data.failureUsernames) {
         text += Object.entries(data.failureUsernames)
           .map(([username, reason]) => `< ${username}: ${reason} >`)
@@ -111,7 +111,7 @@ const UserImportForm = forwardRef<UserImportFormRef, UserImportFormProps>(({ onS
       }
       
       Modal.info({
-        title: '导入结果',
+        title: t('form.importResult'),
         content: <div dangerouslySetInnerHTML={{ __html: text }} />,
         width: 600,
       });
@@ -119,7 +119,7 @@ const UserImportForm = forwardRef<UserImportFormRef, UserImportFormProps>(({ onS
       setDialogVisible(false);
       onSuccess?.();
     } catch (error: any) {
-      message.error(error.message || '上传失败,请您重新上传!');
+      message.error(error.message || t('form.uploadFailed'));
     } finally {
       setFormLoading(false);
     }
@@ -127,7 +127,7 @@ const UserImportForm = forwardRef<UserImportFormRef, UserImportFormProps>(({ onS
 
   return (
     <Modal
-      title="用户导入"
+      title={t('form.userImport')}
       open={dialogVisible}
       onCancel={() => setDialogVisible(false)}
       onOk={submitForm}
@@ -145,7 +145,7 @@ const UserImportForm = forwardRef<UserImportFormRef, UserImportFormProps>(({ onS
           <p className="ant-upload-drag-icon">
             <InboxOutlined />
           </p>
-          <p className="ant-upload-text">将文件拖到此处,或点击上传</p>
+          <p className="ant-upload-text">{t('form.uploadDragText')}</p>
         </Dragger>
 
         <div style={{ marginTop: 16, marginBottom: 16 }}>
@@ -153,12 +153,12 @@ const UserImportForm = forwardRef<UserImportFormRef, UserImportFormProps>(({ onS
             checked={updateSupport}
             onChange={(e) => setUpdateSupport(e.target.checked)}
           >
-            是否更新已经存在的用户数据
+            {t('form.updateExistingUser')}
           </Checkbox>
         </div>
 
         <div style={{ fontSize: 12, color: '#999', textAlign: 'center' }}>
-          <span>仅允许导入 xls、xlsx 格式文件。</span>
+          <span>{t('form.onlyAllowImportFormat')}</span>
           <Button
             type="link"
             size="small"
@@ -166,7 +166,7 @@ const UserImportForm = forwardRef<UserImportFormRef, UserImportFormProps>(({ onS
             onClick={importTemplate}
             style={{ padding: 0, fontSize: 12, height: 'auto' }}
           >
-            下载模板
+            {t('form.downloadTemplate')}
           </Button>
         </div>
       </div>

+ 61 - 2
src/locales/en.json

@@ -178,6 +178,7 @@
     "records": "records",
     "prevPage": "Previous",
     "nextPage": "Next",
+    "formNotInitialized": "Form component not initialized, please refresh the page and try again",
     "addTemplate": "Add Template",
     "editTemplate": "Edit Process Template",
     "addTemplateTitle": "Add Process Template",
@@ -189,7 +190,56 @@
     "editFormManagement": "Edit Form Management",
     "addFormManagement": "New Form Management",
     "editPost": "Edit Post",
-    "addPost": "Add Post"
+    "addPost": "Add Post",
+    "addUser": "Add User",
+    "editUser": "Edit User",
+    "account": "Account",
+    "accountPlaceholder": "Please enter account",
+    "accountRequired": "Account cannot be empty",
+    "userPassword": "User Password",
+    "userPasswordPlaceholder": "Please enter user password",
+    "userPasswordRequired": "User password cannot be empty",
+    "selectDept": "Please select department",
+    "selectPosition": "Select position",
+    "userSex": "Gender",
+    "cardNumber": "Card Number",
+    "cardNumberPlaceholder": "Please enter card number (optional)",
+    "mobilePhoneError": "Please enter a valid mobile number",
+    "emailError": "Please enter a valid email address",
+    "getUserInfoFailed": "Failed to get user information",
+    "exportUserConfirm": "Confirm Export",
+    "exportUserConfirmText": "Are you sure you want to export user data?",
+    "exportUserConfirmButton": "Confirm Export",
+    "exportUserSuccess": "Export successful",
+    "exportUserFailed": "Export failed",
+    "userDataFileName": "User Data.xls",
+    "resetPasswordTitle": "Reset Password",
+    "resetPasswordPrompt": "Please enter a new password for user",
+    "resetPasswordNewPassword": ":",
+    "resetPasswordPlaceholder": "Please enter new password",
+    "resetPasswordSuccess": "Modified successfully, new password is:",
+    "assignRoleTitle": "Assign Role",
+    "userName": "User Name",
+    "selectRole": "Please select role",
+    "loadRoleListFailed": "Failed to load role list",
+    "getUserRoleFailed": "Failed to get user roles",
+    "assignSuccess": "Assign successful",
+    "assignFailed": "Assign failed",
+    "userImport": "User Import",
+    "uploadDragText": "Drag file here or click to upload",
+    "updateExistingUser": "Update existing user data",
+    "onlyAllowImportFormat": "Only xls and xlsx format files are allowed.",
+    "downloadTemplate": "Download Template",
+    "userImportTemplateFileName": "User Import Template.xls",
+    "templateDownloadSuccess": "Template downloaded successfully",
+    "templateDownloadFailed": "Template download failed",
+    "fileFormatError": "Only xls and xlsx format files are allowed",
+    "pleaseUploadFile": "Please upload a file",
+    "uploadFailed": "Upload failed, please try again!",
+    "importResult": "Import Result",
+    "uploadSuccessCount": "Upload success count:",
+    "updateSuccessCount": "Update success count:",
+    "updateFailedCount": "Update failed count:"
   },
   "table": {
     "name": "Name",
@@ -363,6 +413,7 @@
     "cabinetNamePlaceholder": "Please enter cabinet name",
     "nickname": "Nickname",
     "nicknamePlaceholder": "Please enter nickname",
+    "nicknameRequired": "Nickname cannot be empty",
     "username": "Username",
     "usernamePlaceholder": "Please enter username",
     "mobile": "Mobile",
@@ -498,7 +549,15 @@
     "createSuccess": "Created successfully",
     "updateSuccess": "Updated successfully",
     "operationFailed": "Operation failed",
-    "deleteDictDataText": "Are you sure you want to delete dictionary data"
+    "deleteDictDataText": "Are you sure you want to delete dictionary data",
+    "addLockCabinet": "Add Lock Cabinet",
+    "editLockCabinet": "Edit Lock Cabinet",
+    "lockCabinetNameRequired": "Lock cabinet name cannot be empty",
+    "workstationIdRequired": "Workstation cannot be empty",
+    "hardwareIdRequired": "Hardware ID cannot be empty",
+    "hardwareIdPlaceholder": "Please select hardware ID",
+    "getLockCabinetDetailFailed": "Failed to get lock cabinet information",
+    "missingLockCabinetId": "Missing lock cabinet ID, unable to update"
   },
   "role": {
     "addRole": "Add Role",

+ 61 - 2
src/locales/zh.json

@@ -178,6 +178,7 @@
     "records": "条记录",
     "prevPage": "上一页",
     "nextPage": "下一页",
+    "formNotInitialized": "表单组件未初始化,请刷新页面重试",
     "addTemplate": "新增模板",
     "editTemplate": "编辑流程模板",
     "addTemplateTitle": "新增流程模板",
@@ -189,7 +190,56 @@
     "editFormManagement": "编辑表单管理",
     "addFormManagement": "新建表单管理",
     "editPost": "编辑岗位",
-    "addPost": "新增岗位"
+    "addPost": "新增岗位",
+    "addUser": "新增用户",
+    "editUser": "编辑用户",
+    "account": "账号",
+    "accountPlaceholder": "请输入账号",
+    "accountRequired": "账号不能为空",
+    "userPassword": "用户密码",
+    "userPasswordPlaceholder": "请输入用户密码",
+    "userPasswordRequired": "用户密码不能为空",
+    "selectDept": "请选择归属部门",
+    "selectPosition": "选择岗位",
+    "userSex": "用户性别",
+    "cardNumber": "卡号",
+    "cardNumberPlaceholder": "请输入卡号(选填)",
+    "mobilePhoneError": "请输入正确的手机号码",
+    "emailError": "请输入正确的邮箱地址",
+    "getUserInfoFailed": "获取用户信息失败",
+    "exportUserConfirm": "确认导出",
+    "exportUserConfirmText": "确定要导出用户数据吗?",
+    "exportUserConfirmButton": "确定导出",
+    "exportUserSuccess": "导出成功",
+    "exportUserFailed": "导出失败",
+    "userDataFileName": "用户数据.xls",
+    "resetPasswordTitle": "重置密码",
+    "resetPasswordPrompt": "请输入用户",
+    "resetPasswordNewPassword": "的新密码:",
+    "resetPasswordPlaceholder": "请输入新密码",
+    "resetPasswordSuccess": "修改成功,新密码是:",
+    "assignRoleTitle": "分配角色",
+    "userName": "用户名称",
+    "selectRole": "请选择角色",
+    "loadRoleListFailed": "加载角色列表失败",
+    "getUserRoleFailed": "获取用户角色失败",
+    "assignSuccess": "分配成功",
+    "assignFailed": "分配失败",
+    "userImport": "用户导入",
+    "uploadDragText": "将文件拖到此处,或点击上传",
+    "updateExistingUser": "是否更新已经存在的用户数据",
+    "onlyAllowImportFormat": "仅允许导入 xls、xlsx 格式文件。",
+    "downloadTemplate": "下载模板",
+    "userImportTemplateFileName": "用户导入模版.xls",
+    "templateDownloadSuccess": "模板下载成功",
+    "templateDownloadFailed": "下载模板失败",
+    "fileFormatError": "仅允许导入 xls、xlsx 格式文件",
+    "pleaseUploadFile": "请上传文件",
+    "uploadFailed": "上传失败,请您重新上传!",
+    "importResult": "导入结果",
+    "uploadSuccessCount": "上传成功数量:",
+    "updateSuccessCount": "更新成功数量:",
+    "updateFailedCount": "更新失败数量:"
   },
   "table": {
     "name": "名称",
@@ -362,6 +412,7 @@
     "cabinetNamePlaceholder": "请输入机柜名称",
     "nickname": "用户名",
     "nicknamePlaceholder": "请输入用户名",
+    "nicknameRequired": "用户名不能为空",
     "username": "账号",
     "usernamePlaceholder": "请输入账号",
     "mobile": "手机号码",
@@ -497,7 +548,15 @@
     "createSuccess": "创建成功",
     "updateSuccess": "更新成功",
     "operationFailed": "操作失败",
-    "deleteDictDataText": "确定要删除字典数据"
+    "deleteDictDataText": "确定要删除字典数据",
+    "addLockCabinet": "新增机柜",
+    "editLockCabinet": "编辑机柜",
+    "lockCabinetNameRequired": "锁柜名称不能为空",
+    "workstationIdRequired": "岗位不能为空",
+    "hardwareIdRequired": "硬件ID不能为空",
+    "hardwareIdPlaceholder": "请选择硬件ID",
+    "getLockCabinetDetailFailed": "获取机柜信息失败",
+    "missingLockCabinetId": "缺少机柜ID,无法更新"
   },
   "role": {
     "addRole": "新增角色",