Browse Source

更新翻译

gavin.chen 1 year ago
parent
commit
94b04970b3

+ 2 - 1
.vscode/settings.json

@@ -6,5 +6,6 @@
   "editor.defaultFormatter": null,
   "[javascriptreact]": {
     "editor.defaultFormatter": "esbenp.prettier-vscode"
-  }
+  },
+  "i18next.i18nPaths": "e:/fis_packages/fis_h5_school/src/i18n"
 }

+ 18 - 0
src/i18n/en.json

@@ -1,4 +1,5 @@
 {
+  "${label}是必填项!": "${label} is required!",
   "Language": "Language",
   "android": "Android",
   "courseCode": "Course Code",
@@ -23,8 +24,10 @@
   "中文": "Chinese",
   "互动区": "Interactive Area",
   "互动区暂未开放": "Interactive Area is not Open Yet",
+  "价格不得小于0元,且最多小数点后两位": "The price must not be less than 0 and up to two decimal places",
   "修改": "Modify",
   "公开课": "Public Class",
+  "关联专辑": "Related Album",
   "关闭": "Close",
   "分享": "Share",
   "分享链接已复制到剪贴板🔗": "Shared link has been copied to clipboard🔗",
@@ -35,6 +38,9 @@
   "删除": "Delete",
   "删除失败": "Deletion Failed",
   "刷新": "Refresh",
+  "助教": "Teaching Assistant",
+  "助教不能是参会者": "The teaching assistant can't be a participant",
+  "参会者": "Participant",
   "发送": "Send",
   "发送信息": "Send Message",
   "发送框不能为空": "The send box cannot be empty",
@@ -61,6 +67,7 @@
   "开始时间": "Start Time",
   "开始课程": "Start Course",
   "当前浏览器不支持全屏模式": "The current browser does not support full-screen mode",
+  "当前语言": "Current Language",
   "待审核": "Pending Review",
   "微信": "WeChat",
   "我创建的": "Created",
@@ -83,6 +90,7 @@
   "是": "Yes",
   "是否删除该专辑": "Whether to Delete This Album",
   "是否删除该课程": "Whether to Delete This Course",
+  "是否小班化": "Is it a small class",
   "暂无": "None for Now",
   "暂无数据": "No Data",
   "暂无简介": "No Introduction",
@@ -98,6 +106,7 @@
   "版本信息(开发用)": "Version Information (For Development)",
   "版本号已复制到剪贴板🔗": "Version Number has been Copied to Clipboard🔗",
   "状态": "Status",
+  "班级管理": "Class Management",
   "直播": "Live Stream",
   "直播课程": "Live Stream Course",
   "确定": "Confirm",
@@ -106,7 +115,9 @@
   "结束失败": "Ending Failed",
   "结束录制": "Stop Recording",
   "结束课程": "End Course",
+  "编辑专辑": "Edit Album",
   "编辑失败": "Editing Failed",
+  "编辑课程": "Edit Course",
   "老师暂时离开,请稍后": "The Teacher is Temporarily Away, Please Wait",
   "英文": "English",
   "获取Token": "Get Token",
@@ -115,17 +126,24 @@
   "请至PC端下载": "Please Download at PC End",
   "请输入": "Please Enter",
   "请输入名称": "Please Enter the Name",
+  "请输入姓名": "Please Enter Name",
+  "请输入用户姓名": "Please Enter User's Name",
   "请选择": "Please Select",
+  "请选择jpg、jpeg、png的图片上传": "Please upload a jpg, jpeg or png image",
   "请选择图片上传": "Please Select an Image to Upload",
   "请选择支付方式": "Please Choose Payment Method",
   "课程": "Course",
   "课程专辑": "Course Album",
+  "课程价格(元)": "Course Price (Yuan)",
+  "课程分类": "Course Category",
   "课程列表": "Course List",
   "课程名称": "Course Name",
   "课程已结束": "Course Ended",
   "课程形式": "Course Format",
+  "课程描述": "Course Description",
   "课程未开始,请稍后": "The Course Hasn't Started Yet, Please Wait",
   "课程标签": "Course Tag",
+  "课程源": "Course Source",
   "课程简介": "Course Introduction",
   "课程规模": "Course Size",
   "课程:": "Course: ",

+ 19 - 1
src/i18n/zh.json

@@ -1,4 +1,5 @@
 {
+  "${label}是必填项!": "${label}是必填项!",
   "Language": "Language",
   "android": "android",
   "courseCode": "courseCode",
@@ -23,8 +24,10 @@
   "中文": "中文",
   "互动区": "互动区",
   "互动区暂未开放": "互动区暂未开放",
+  "价格不得小于0元,且最多小数点后两位": "价格不得小于0元,且最多小数点后两位",
   "修改": "修改",
   "公开课": "公开课",
+  "关联专辑": "关联专辑",
   "关闭": "关闭",
   "分享": "分享",
   "分享链接已复制到剪贴板🔗": "分享链接已复制到剪贴板🔗",
@@ -35,6 +38,9 @@
   "删除": "删除",
   "删除失败": "删除失败",
   "刷新": "刷新",
+  "助教": "助教",
+  "助教不能是参会者": "助教不能是参会者",
+  "参会者": "参会者",
   "发送": "发送",
   "发送信息": "发送信息",
   "发送框不能为空": "发送框不能为空",
@@ -61,6 +67,7 @@
   "开始时间": "开始时间",
   "开始课程": "开始课程",
   "当前浏览器不支持全屏模式": "当前浏览器不支持全屏模式",
+  "当前语言": "当前语言",
   "待审核": "待审核",
   "微信": "微信",
   "我创建的": "我创建的",
@@ -83,6 +90,7 @@
   "是": "是",
   "是否删除该专辑": "是否删除该专辑",
   "是否删除该课程": "是否删除该课程",
+  "是否小班化": "是否小班化",
   "暂无": "暂无",
   "暂无数据": "暂无数据",
   "暂无简介": "暂无简介",
@@ -98,6 +106,7 @@
   "版本信息(开发用)": "版本信息(开发用)",
   "版本号已复制到剪贴板🔗": "版本号已复制到剪贴板🔗",
   "状态": "状态",
+  "班级管理": "班级管理",
   "直播": "直播",
   "直播课程": "直播课程",
   "确定": "确定",
@@ -106,7 +115,9 @@
   "结束失败": "结束失败",
   "结束录制": "结束录制",
   "结束课程": "结束课程",
+  "编辑专辑": "编辑专辑",
   "编辑失败": "编辑失败",
+  "编辑课程": "编辑课程",
   "老师暂时离开,请稍后": "老师暂时离开,请稍后",
   "英文": "英文",
   "获取Token": "获取Token",
@@ -115,17 +126,24 @@
   "请至PC端下载": "请至PC端下载",
   "请输入": "请输入",
   "请输入名称": "请输入名称",
+  "请输入姓名": "请输入姓名",
+  "请输入用户姓名": "请输入用户姓名",
   "请选择": "请选择",
+  "请选择jpg、jpeg、png的图片上传": "请选择jpg、jpeg、png的图片上传",
   "请选择图片上传": "请选择图片上传",
   "请选择支付方式": "请选择支付方式",
   "课程": "课程",
   "课程专辑": "课程专辑",
+  "课程价格(元)": "课程价格(元)",
+  "课程分类": "课程分类",
   "课程列表": "课程列表",
   "课程名称": "课程名称",
   "课程已结束": "课程已结束",
   "课程形式": "课程形式",
+  "课程描述": "课程描述",
   "课程未开始,请稍后": "课程未开始,请稍后",
   "课程标签": "课程标签",
+  "课程源": "课程源",
   "课程简介": "课程简介",
   "课程规模": "课程规模",
   "课程:": "课程:",
@@ -135,4 +153,4 @@
   "资料名称": "资料名称",
   "进入课程": "进入课程",
   "首页": "首页"
-}
+}

+ 3 - 5
src/pages/CreateAlbumPage.jsx

@@ -10,6 +10,8 @@ import { useTranslation } from 'react-i18next';
 
 const { TextArea } = Input;
 
+const { t, i18n } = useTranslation();
+
 const layout = {
   labelCol: {
     span: 8,
@@ -19,9 +21,8 @@ const layout = {
   },
 };
 
-/* eslint-disable no-template-curly-in-string */
 const validateMessages = {
-  required: '${label}是必填项!',
+  required: t('${label}是必填项!'),
   types: {
     email: '${label} is not a valid email!',
     number: '${label} is not a valid number!',
@@ -30,7 +31,6 @@ const validateMessages = {
     range: '${label} must be between ${min} and ${max}',
   },
 };
-/* eslint-enable no-template-curly-in-string */
 
 const getBase64 = (file) =>
   new Promise((resolve, reject) => {
@@ -41,8 +41,6 @@ const getBase64 = (file) =>
   });
 
 function CreateAlbum(param) {
-  const { t, i18n } = useTranslation();
-
   const { code, form, onRequestClose } = param;
   const [isHasEditCode, setHasEditCode] = useState(); // 是否有编辑code
   const [caseListData, setCaseListData] = useState(); // 病例标签

+ 46 - 40
src/pages/CreateCoursePage.jsx

@@ -22,6 +22,7 @@ import locale from 'antd/es/date-picker/locale/zh_CN';
 import { useTranslation } from 'react-i18next';
 
 const { TextArea } = Input;
+const { t, i18n } = useTranslation();
 
 const layout = {
   labelCol: {
@@ -32,9 +33,8 @@ const layout = {
   },
 };
 
-/* eslint-disable no-template-curly-in-string */
 const validateMessages = {
-  required: '${label}是必填项!',
+  required: t('${label}是必填项!'),
   types: {
     email: '${label} is not a valid email!',
     number: '${label} is not a valid number!',
@@ -43,7 +43,6 @@ const validateMessages = {
     range: '${label} must be between ${min} and ${max}',
   },
 };
-/* eslint-enable no-template-curly-in-string */
 
 const getBase64 = (file) =>
   new Promise((resolve, reject) => {
@@ -75,7 +74,6 @@ function CreateCourse(param) {
   const [previewTitle, setPreviewTitle] = useState('');
   const [loading, setLoading] = useState(false);
   const [imageUrl, setImageUrl] = useState();
-  const { t, i18n } = useTranslation();
 
   let assistantsSearchTimer;
   let currentAssistantsValue;
@@ -140,7 +138,7 @@ function CreateCourse(param) {
       ];
       setFileList(newFileList);
     } else {
-      message.error('请选择jpg、jpeg、png的图片上传');
+      message.error(t('请选择jpg、jpeg、png的图片上传'));
     }
     return false;
   };
@@ -180,14 +178,14 @@ function CreateCourse(param) {
       if (result.result) {
         onRequestClose();
       } else {
-        message.error('编辑失败');
+        message.error(toolbar(t('编辑失败')));
       }
     } else {
       result = await coursesAPI.createCourseAsync(values.course);
       if (result.result) {
         onRequestClose();
       } else {
-        message.error('创建失败');
+        message.error(t('创建失败'));
       }
     }
   };
@@ -197,7 +195,7 @@ function CreateCourse(param) {
       return Promise.resolve();
     }
 
-    return Promise.reject(new Error('价格不得小于0元,且最多小数点后两位'));
+    return Promise.reject(new Error(t('价格不得小于0元,且最多小数点后两位')));
   };
 
   const uploadButton = (
@@ -488,23 +486,23 @@ function CreateCourse(param) {
         <Col className='gutter-row' span={12}>
           <Form.Item
             name={['course', 'Name']}
-            label='名称'
+            label={t('名称')}
             rules={[
               {
                 required: true,
               },
               {
                 pattern: /^\S+$/,
-                message: '名称不能包含空格',
+                message: t('名称不能包含空格'),
               },
             ]}>
-            <Input placeholder='请输入名称' maxLength={40} />
+            <Input placeholder={t('请输入名称')} maxLength={40} />
           </Form.Item>
         </Col>
         <Col className='gutter-row' span={12}>
           <Form.Item
             name={['course', 'CourseType']}
-            label='课程分类'
+            label={t('课程分类')}
             rules={[
               {
                 required: true,
@@ -512,10 +510,10 @@ function CreateCourse(param) {
             ]}>
             <Select
               allowClear
-              placeholder='请选择'
+              placeholder={t('请选择')}
               options={[
-                { value: 1, label: '直播课程' },
-                { value: 2, label: '多媒体课程' },
+                { value: 1, label: t('直播课程') },
+                { value: 2, label: t('多媒体课程') },
               ]}
               onChange={changeCourseType}
             />
@@ -523,7 +521,9 @@ function CreateCourse(param) {
         </Col>
         {isShowSmallClass && (
           <Col className='gutter-row' span={12}>
-            <Form.Item name={['course', 'IsSmallClass']} label='是否小班化'>
+            <Form.Item
+              name={['course', 'IsSmallClass']}
+              label={t('是否小班化')}>
               <Radio.Group onChange={changeIsSmallClass} defaultValue={false}>
                 <Radio value={true}> {t('是')} </Radio>
                 <Radio value={false}> {t('否')} </Radio>
@@ -535,14 +535,14 @@ function CreateCourse(param) {
           <Col className='gutter-row' span={12}>
             <Form.Item
               name={['course', 'StartTime']}
-              label='开始时间'
+              label={t('开始时间')}
               rules={[
                 {
                   required: true,
                 },
               ]}>
               <DatePicker
-                placeholder='请选择'
+                placeholder={t('请选择')}
                 locale={locale}
                 disabledDate={disabledDate}
                 disabledTime={disabledTime}
@@ -576,11 +576,13 @@ function CreateCourse(param) {
           </Col>
         )}
         <Col className='gutter-row' span={12}>
-          <Form.Item name={['course', 'CourseLabelCodes']} label='课程标签'>
+          <Form.Item
+            name={['course', 'CourseLabelCodes']}
+            label={t('课程标签')}>
             <Select
               allowClear
               mode='multiple'
-              placeholder='请选择'
+              placeholder={t('请选择')}
               options={courseListData}
               filterOption={(input, option) =>
                 (option?.label ?? '')
@@ -593,7 +595,7 @@ function CreateCourse(param) {
         <Col className='gutter-row' span={12}>
           <Form.Item
             name={['course', 'AudienceType']}
-            label='课程规模'
+            label={t('课程规模')}
             rules={[
               {
                 required: true,
@@ -601,10 +603,10 @@ function CreateCourse(param) {
             ]}>
             <Select
               allowClear
-              placeholder='请选择'
+              placeholder={t('请选择')}
               options={[
-                { value: 1, label: '公开课' },
-                { value: 2, label: '私有课' },
+                { value: 1, label: t('公开课') },
+                { value: 2, label: t('私有课') },
               ]}
               onChange={changeAudienceType}
             />
@@ -612,40 +614,42 @@ function CreateCourse(param) {
         </Col>
         {isShowClassManagement && (
           <Col className='gutter-row' span={12}>
-            <Form.Item name={['course', 'UserGroupCodes']} label='班级管理'>
+            <Form.Item
+              name={['course', 'UserGroupCodes']}
+              label={t('班级管理')}>
               <Select
                 allowClear
                 mode='multiple'
                 options={classManagementListData}
-                placeholder='请选择'
+                placeholder={t('请选择')}
               />
             </Form.Item>
           </Col>
         )}
         {isShowAssistantParticipants && (
           <Col className='gutter-row' span={12}>
-            <Form.Item name={['course', 'Assistants']} label='助教'>
+            <Form.Item name={['course', 'Assistants']} label={t('助教')}>
               <Select
                 allowClear
                 showSearch={true}
                 filterOption={false}
                 options={assistantsListData}
                 onSearch={handleSearchAssistants}
-                placeholder='请选择'
+                placeholder={t('请选择')}
               />
             </Form.Item>
           </Col>
         )}{' '}
         {isShowAssistantParticipants && (
           <Col className='gutter-row' span={12}>
-            <Form.Item name={['course', 'Experts']} label='参会者'>
+            <Form.Item name={['course', 'Experts']} label={t('参会者')}>
               <Select
                 allowClear
                 mode='multiple'
                 filterOption={false}
                 options={expertsListData}
                 onSearch={handleSearchAttendees}
-                placeholder='请选择'
+                placeholder={t('请选择')}
               />
             </Form.Item>
           </Col>
@@ -653,7 +657,7 @@ function CreateCourse(param) {
         <Col className='gutter-row' span={12}>
           <Form.Item
             name={['course', 'Price']}
-            label='课程价格(元)'
+            label={t('课程价格(元)')}
             rules={[
               {
                 validator: validatePrice,
@@ -675,11 +679,13 @@ function CreateCourse(param) {
           </Form.Item>
         </Col>
         <Col className='gutter-row' span={12}>
-          <Form.Item name={['course', 'CourseAlbumCodes']} label='关联专辑'>
+          <Form.Item
+            name={['course', 'CourseAlbumCodes']}
+            label={t('关联专辑')}>
             <Select
               showSearch
               mode='multiple'
-              placeholder='请选择'
+              placeholder={t('请选择')}
               optionFilterProp='children'
               filterOption={(input, option) =>
                 (option?.label ?? '').includes(input)
@@ -697,7 +703,7 @@ function CreateCourse(param) {
           <Col className='gutter-row' span={12}>
             <Form.Item
               name={['course', 'CourseVideoCodes']}
-              label='课程源'
+              label={t('课程源')}
               rules={[
                 {
                   required: true,
@@ -705,7 +711,7 @@ function CreateCourse(param) {
               ]}>
               <Select
                 showSearch
-                placeholder='请选择'
+                placeholder={t('请选择')}
                 optionFilterProp='children'
                 onChange={onChange}
                 onSearch={onSearch}
@@ -720,10 +726,10 @@ function CreateCourse(param) {
           </Col>
         )}
         <Col className='gutter-row' span={12}>
-          <Form.Item name={['course', 'CourseMaterialCodes']} label='资料'>
+          <Form.Item name={['course', 'CourseMaterialCodes']} label={t('资料')}>
             <Select
               showSearch
-              placeholder='请选择'
+              placeholder={t('请选择')}
               mode='multiple'
               optionFilterProp='children'
               onChange={onChange}
@@ -740,16 +746,16 @@ function CreateCourse(param) {
         <Col className='gutter-row' span={24}>
           <Form.Item
             name={['course', 'CourseIntro']}
-            label='课程描述'
+            label={t('课程描述')}
             labelCol={{ span: 4 }}
             rules={[{}]}>
-            <TextArea rows={4} placeholder='请输入' maxLength={100} />
+            <TextArea rows={4} placeholder={t('请输入')} maxLength={100} />
           </Form.Item>
         </Col>
         <Col className='gutter-row' span={24}>
           <Form.Item
             name={['course', 'Cover']}
-            label='封面'
+            label={t('封面')}
             style={{ height: '102px' }}
             labelCol={{ span: 4 }}>
             <ImgCrop aspect={16 / 9} quality={1}>

+ 7 - 7
src/pages/GuestCoursePlayerPage.jsx

@@ -20,8 +20,8 @@ const GuestCoursePlayerPage = () => {
   const [isShowPdf, setShowPdf] = useState(true);
   const [courseItems, setCourseItems] = useState([]);
   const [isShellWeb, setIsShellWeb] = useState(false);
-  const [currentTab, setCurrentTab] = useState('简介');
-  const [tabsList, setTabsList] = useState(['简介', '资料']);
+  const [currentTab, setCurrentTab] = useState(t('简介'));
+  const [tabsList, setTabsList] = useState([t('简介'), t('资料')]);
   const [userName, setUserName] = useState('');
   const [messageApi, contextHolder] = message.useMessage();
   const { t, i18n } = useTranslation();
@@ -77,7 +77,7 @@ const GuestCoursePlayerPage = () => {
     addCoursePlayCountOnInit();
     getCourseDeatil();
     if (isMobileDevice()) {
-      setTabsList(['简介', '资料', '互动区']);
+      setTabsList([t('简介'), t('资料'), t('互动区')]);
     }
   }, [getCourseDeatil, courseCode]);
 
@@ -141,14 +141,14 @@ const GuestCoursePlayerPage = () => {
     } else {
       messageApi.open({
         type: 'error',
-        content: '请输入用户姓名',
+        content: t('请输入用户姓名'),
       });
     }
   };
 
   // 内容主题区域,显示【课程列表】或【简介】
   const buildContentArea = () => {
-    if (currentTab === '简介') {
+    if (currentTab === t('简介')) {
       return (
         <div className='flex-grow flex flex-col  bg-gray-50 rounded p-5'>
           <div className='text-xl mb-2'>{t('课程简介')} </div>
@@ -238,7 +238,7 @@ const GuestCoursePlayerPage = () => {
         )}
       </div>
       <Modal
-        title='请输入姓名'
+        title={t('请输入姓名')}
         open={isGuestNameModalOpen}
         centered
         maskClosable={false}
@@ -250,7 +250,7 @@ const GuestCoursePlayerPage = () => {
         <div className='w-full max-w-md p-6 bg-white rounded-lg '>
           <form>
             <div className='mb-8 '>
-              <Input placeholder='请输入姓名' onChange={inputChange} />
+              <Input placeholder={t('请输入姓名')} onChange={inputChange} />
             </div>
             <div className='flex justify-center items-center w-full'>
               <button