11wqe1 vor 2 Tagen
Ursprung
Commit
5301ea39c0
46 geänderte Dateien mit 3862 neuen und 1903 gelöschten Zeilen
  1. 6 6
      src/components/EnglishVoice2/index.vue
  2. 15 16
      src/components/checkEnglishVoice/index.vue
  3. 133 127
      src/components/classRoomHelper/component/countdown.vue
  4. 34 34
      src/components/classRoomHelper/component/reviewArea.vue
  5. 330 271
      src/components/classRoomHelper/component/searchArea.vue
  6. 54 212
      src/components/classRoomHelper/component/taskArea.vue
  7. 2 2
      src/components/classRoomHelper/component/workFlowIframe.vue
  8. 35 32
      src/components/classRoomHelper/index.vue
  9. 9 7
      src/components/classRoomHelper/studentIndex.vue
  10. 10 7
      src/components/components/answerData.vue
  11. 14 12
      src/components/components/answerData2.vue
  12. 6 6
      src/components/components/appStoreC.vue
  13. 10 7
      src/components/components/askStatic.vue
  14. 12 6
      src/components/components/askStatic2.vue
  15. 8 6
      src/components/components/audio.vue
  16. 156 153
      src/components/components/choseWorksDetailDialog.vue
  17. 9 6
      src/components/components/cocoFlowDia.vue
  18. 26 24
      src/components/components/englishEva.vue
  19. 16 16
      src/components/components/intelligentAnalysis/checkAi/aiLeader.vue
  20. 6 4
      src/components/components/intelligentAnalysis/choseCheck/index.vue
  21. 6 4
      src/components/components/intelligentAnalysis/smarter.vue
  22. 18 15
      src/components/components/onlineWrite.vue
  23. 11 8
      src/components/components/sortToolWorkShow.vue
  24. 25 23
      src/components/components/statisticalAnalysis.vue
  25. 44 31
      src/components/components/studentWorkPreviewDialog.vue
  26. 1 1
      src/components/components/vpdf.vue
  27. 1 1
      src/components/courseDetail.vue
  28. 7 4
      src/components/easy2/commpont/evaTable.vue
  29. 169 167
      src/components/easy2/studyStudent.vue
  30. 162 160
      src/components/easy3/studyStudent.vue
  31. 14 12
      src/components/interVideo/index.vue
  32. 19 16
      src/components/scoreList/scoreItem.vue
  33. 57 51
      src/components/scoreZong/get.vue
  34. 41 35
      src/components/scoreZong/index.vue
  35. 163 161
      src/components/studyStudent.vue
  36. 166 164
      src/components/studySutdentClass/studyStudent.vue
  37. 56 49
      src/components/tools/imgDraw/imgDraw.vue
  38. 15 12
      src/components/tools/jsmind.vue
  39. 6 2
      src/components/tools/table.vue
  40. 5 2
      src/components/tools/time.vue
  41. 6 4
      src/components/tools/wangEnduit.vue
  42. 12 9
      src/components/updateMore/updateMore.vue
  43. 5 2
      src/components/wordCloud/index.vue
  44. 651 1
      src/lang/cn.json
  45. 662 14
      src/lang/en.json
  46. 649 1
      src/lang/hk.json

+ 6 - 6
src/components/EnglishVoice2/index.vue

@@ -1,5 +1,5 @@
 <template>
-    <el-dialog title="英语口语" :visible.sync="EnglishVoiceDialog" :append-to-body="true" width="100%"
+    <el-dialog :title="lang.ssEnglishSpeak" :visible.sync="EnglishVoiceDialog" :append-to-body="true" width="100%"
         :before-close="handleClose" class="dialog_diy">
         <div class="ev_box" v-if="EnglishVoiceDialog">
             <div class="ev_box_left">
@@ -11,7 +11,7 @@
                 </right>
             </div>
             <div class="ev_btn">
-                <el-button type="primary" style="padding: 5px 10px;font-size: 14px;height: 30px;" size="mini" :disabled="!(checkType == (checkJson.length - 1))" @click="addEnglishWork">点击提交</el-button>
+                <el-button type="primary" style="padding: 5px 10px;font-size: 14px;height: 30px;" size="mini" :disabled="!(checkType == (checkJson.length - 1))" @click="addEnglishWork">{{ lang.ssClickSubmit }}</el-button>
 
             </div>
         </div>
@@ -47,7 +47,7 @@ export default {
             type:String
         },
         courseType:{
-            type:Number
+            type:[Number, String]
         },
         taskCount:{
             type:Number
@@ -150,13 +150,13 @@ export default {
                     text: "",
                 },
             ];
-            if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+            if (this.homeWorkLoading) return this.$message.info(this.lang.ssClickTooFast)
             this.homeWorkLoading = true
             this.ajax
                 .post(this.$store.state.api + "addCourseWorks5", params)
                 .then((res) => {
                     this.$message({
-                        message: "提交成功",
+                        message: this.lang.ssSubmitSuccess,
                         type: "success",
                     });
                     setTimeout(() => {
@@ -172,7 +172,7 @@ export default {
                 })
                 .catch((err) => {
                    
-                    this.$message.error("提交失败");
+                    this.$message.error(this.lang.ssSubmitFailed);
                     console.error(err);
                     setTimeout(() => {
                             this.homeWorkLoading = false

+ 15 - 16
src/components/checkEnglishVoice/index.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    title="查看"
+    :title="lang.ssView"
     :visible.sync="dialogVisibleENScore"
     :append-to-body="true"
     width="800px"
@@ -16,7 +16,7 @@
         </div>
         <div class="btn_box">
           <el-button type="primary" size="small" @click="opanData">
-            学生报告
+            {{ lang.ssStudentReport }}
           </el-button>
         </div>
       </div>
@@ -43,7 +43,7 @@
         </div>
       </div>
       <div class="scoreBox">
-        <span class="t">请输入分数</span>
+        <span class="t">{{ lang.ssEnterScore }}</span>
         <el-input-number
           :disabled="courseDetail.userid != userid"
           v-model="wScore2"
@@ -53,25 +53,25 @@
         ></el-input-number>
       </div>
       <div class="scoreDetailBox">
-        <span class="t">评分评论</span>
+        <span class="t">{{ lang.ssScoringComment }}</span>
         <el-input
           type="textarea"
           :rows="5"
           :disabled="courseDetail.userid != userid"
           resize="none"
           v-model="scoreDetail2"
-          placeholder="请输入对学生的评价"
+          :placeholder="lang.ssEnterStudentEvaluation"
         >
         </el-input>
       </div>
     </div>
     <span slot="footer" class="dialog-footer">
-      <el-button @click="close">取 消</el-button>
+      <el-button @click="close">{{ lang.ssCancelBtn }}</el-button>
       <el-button
         type="primary"
         v-if="courseDetail.userid == userid"
         @click="scoreWork(commentDetail.wid)"
-        >确 定
+        >{{ lang.ssConfirmBtn }}
       </el-button>
     </span>
     <dataBoard :dataDialog.sync="dataDialog" :mark="{wScore2:wScore2,scoreDetail2:scoreDetail2}" :englishVoiceJson="englishVoiceJson" :commentDetail="commentDetail"></dataBoard>
@@ -82,7 +82,10 @@
 import right from "./component/right.vue";
 import left from "./component/left.vue";
 import dataBoard from "./data/index.vue";
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
   components: {
     right,
     left,
@@ -100,7 +103,7 @@ export default {
       type: String
     },
     commentDetail: {
-      type: Object
+      type: [Object,Array]
     },
     courseDetail: {
       type: Object
@@ -150,7 +153,7 @@ export default {
       this.detail = a.detail;
       this.checkJson = a.array;
       this.checkType = 0;
-      this.work.length = a.array.length;
+      this.work.length = (a.array && a.array.length) ? a.array.length : 0;
       this.wScore2 = JSON.parse(JSON.stringify(this.wScore));
       this.scoreDetail2 = JSON.parse(JSON.stringify(this.scoreDetail));
       let works = JSON.parse(
@@ -171,7 +174,7 @@ export default {
     },
     scoreWork(wid) {
       if (this.wScore2 == 0) {
-        this.$message.error("请评分");
+        this.$message.error(this.lang.ssPleaseRate);
         return;
       }
       let params = [
@@ -187,7 +190,7 @@ export default {
         .post(this.$store.state.api + "scoreWork", params)
         .then(res => {
           this.$message({
-            message: "评分成功",
+            message: this.lang.ssRatingSuccess,
             type: "success"
           });
           this.wScore2 = 0;
@@ -197,7 +200,7 @@ export default {
           this.close2();
         })
         .catch(err => {
-          this.$message.error("评分失败");
+          this.$message.error(this.lang.ssRatingFailed);
           console.error(err);
         });
     },
@@ -222,10 +225,6 @@ export default {
 </script>
 
 <style scoped>
-.dialog_diy >>> .el-dialog {
-  /* height: 100%; */
-  /* margin: 15vh auto !important; */
-}
 
 .dialog_diy >>> .el-dialog__header {
   background: #454545 !important;

+ 133 - 127
src/components/classRoomHelper/component/countdown.vue

@@ -35,7 +35,7 @@
                   ></span
                 >
               </div>
-              <span></span>
+              <span>{{ lang.ssMinute }}</span>
             </div>
 
             <div class="c_t_i_card" v-else v-click-outside="handleBlur1">
@@ -48,7 +48,7 @@
                   @keyup.enter.native="changeShowInput1(false)"
                 ></el-input>
               </div>
-              <span></span>
+              <span>{{ lang.ssMinute }}</span>
             </div>
 
             <div
@@ -82,7 +82,7 @@
                   ></span
                 >
               </div>
-              <span></span>
+              <span>{{ lang.ssSecond }}</span>
             </div>
             <div class="c_t_i_card" v-else v-click-outside="handleBlur2">
               <div class="c_t_i_c_inputBox">
@@ -94,7 +94,7 @@
                   @keyup.enter.native="changeShowInput2(false)"
                 ></el-input>
               </div>
-              <span></span>
+              <span>{{ lang.ssSecond }}</span>
             </div>
           </div>
           <div class="c_t_item" v-if="type == 1">
@@ -105,7 +105,7 @@
               <div>
                 <div>{{ keepTimeShow.m2 }}</div>
               </div>
-              <span></span>
+              <span>{{ lang.ssMinute }}</span>
             </div>
 
             <div class="c_t_i_card">
@@ -115,40 +115,40 @@
               <div>
                 <div>{{ keepTimeShow.s2 }}</div>
               </div>
-              <span></span>
+              <span>{{ lang.ssSecond }}</span>
             </div>
           </div>
         </div>
 
         <div class="c_choiceTime" v-if="type == 0">
           <div class="c_title">
-            <span>快捷设置</span>
+            <span>{{ lang.ssQuickSettings }}</span>
           </div>
           <div class="c_ct_box">
-            <span @click="setCountdownTime(30)">30秒</span>
-            <span @click="setCountdownTime(60)">1分钟</span>
-            <span @click="setCountdownTime(120)">2分钟</span>
-            <span @click="setCountdownTime(180)">3分钟</span>
-            <span @click="setCountdownTime(300)">5分钟</span>
-            <span @click="setCountdownTime(360)">6分钟</span>
-            <span @click="setCountdownTime(480)">8分钟</span>
-            <span @click="setCountdownTime(600)">10分钟</span>
+            <span @click="setCountdownTime(30)">{{ lang.ss30Seconds }}</span>
+            <span @click="setCountdownTime(60)">{{ lang.ss1Minute }}</span>
+            <span @click="setCountdownTime(120)">{{ lang.ss2Minutes }}</span>
+            <span @click="setCountdownTime(180)">{{ lang.ss3Minutes }}</span>
+            <span @click="setCountdownTime(300)">{{ lang.ss5Minutes }}</span>
+            <span @click="setCountdownTime(360)">{{ lang.ss6Minutes }}</span>
+            <span @click="setCountdownTime(480)">{{ lang.ss8Minutes }}</span>
+            <span @click="setCountdownTime(600)">{{ lang.ss10Minutes }}</span>
           </div>
         </div>
 
         <div class="c_behaviorTag">
           <div class="c_title">
-            <span>行为标签</span>
+            <span>{{ lang.ssBehaviorTags }}</span>
             <div class="c_t_btnArea">
               <span
                 @click="changeBehaviorTagType(0)"
                 :class="[behaviorTagType == 0 ? 'c_t_ba_active' : '']"
-                >常用</span
+                >{{ lang.ssCommon }}</span
               >
               <span
                 @click="changeBehaviorTagType(1)"
                 :class="[behaviorTagType == 1 ? 'c_t_ba_active' : '']"
-                >更多</span
+                >{{ lang.ssMore }}</span
               >
               <!-- <el-button-group>
 								<el-button
@@ -176,22 +176,27 @@
             class="c_bt_box"
             v-loading="behaviorTagMoreLoading && behaviorTagType == 1"
           >
+          <template v-if="behaviorTagType == 1">
             <span
-              v-if="behaviorTagType == 1"
               :class="[choiceBehavior.includes(item) ? 'c_bt_b_active' : '']"
               v-for="(item, index) in behaviorTagMore"
               @click="choiceBehaviorTag(item)"
               :key="behaviorTagType + '-' + index"
               >{{ item }}</span
             >
-            <span
-              v-if="behaviorTagType == 0"
-              :class="[choiceBehavior.includes(item) ? 'c_bt_b_active' : '']"
-              v-for="(item, index) in behaviorTagCommon"
-              @click="choiceBehaviorTag(item)"
-              :key="behaviorTagType + '-' + index"
-              >{{ item }}</span
-            >
+          </template>
+           
+             
+            <template v-if="behaviorTagType == 0">
+              <span
+                :class="[choiceBehavior.includes(item) ? 'c_bt_b_active' : '']"
+                v-for="(item, index) in behaviorTagCommon"
+                @click="choiceBehaviorTag(item)"
+                :key="behaviorTagType + '-' + index"
+                >{{ item }}</span
+              >
+            </template>
+           
           </div>
         </div>
 
@@ -201,7 +206,7 @@
               <el-tooltip
                 effect="light"
 								placement="top"
-                :content="showSourceList ? '隐藏音乐列表' : '显示音乐列表'"
+                :content="showSourceList ? lang.ssHideMusicList : lang.ssShowMusicList"
               >
                 <span @click.stop="()=>showSourceList = !showSourceList">
                   <svg
@@ -233,7 +238,7 @@
             <el-tooltip
               class="item"
               effect="light"
-              :content="sourceActive ? '关闭音乐' : '开启音乐'"
+              :content="sourceActive ? lang.ssTurnOffMusic : lang.ssTurnOnMusic"
               placement="top"
             >
               <svg
@@ -353,7 +358,7 @@
             <el-tooltip
               class="item"
               effect="light"
-              content="重置"
+              :content="lang.ssResetTimer"
               placement="top"
             >
               <svg
@@ -383,7 +388,7 @@
 
         <div class="ActivityMemo">
           <span @click="changeShowType(1)">
-            教学活动备忘
+            {{ lang.ssTeachingActivityMemo }}
             <svg
               width="16"
               height="16"
@@ -410,7 +415,7 @@
 
       <div class="c_changeType">
         <div class="c_ct_btn" @click="changeType(0)">
-          <div>倒计时</div>
+          <div>{{ lang.ssCountdown }}</div>
           <span v-if="type == 0"></span>
           <svg
             width="21"
@@ -445,7 +450,7 @@
         <span></span>
 
         <div class="c_ct_btn" @click="changeType(1)">
-          <div>计时器</div>
+          <div>{{ lang.ssTimer }}</div>
           <span v-if="type == 1"></span>
           <svg
             width="21"
@@ -518,7 +523,7 @@
               d="M7.66782 3.1263C7.87421 2.94284 8.19025 2.96143 8.37371 3.16782L12.3737 7.66782C12.5421 7.85727 12.5421 8.14274 12.3737 8.33219L8.37371 12.8322C8.19025 13.0386 7.87421 13.0572 7.66782 12.8737C7.46143 12.6903 7.44284 12.3742 7.6263 12.1678L11.331 8.00001L7.6263 3.83219C7.44284 3.6258 7.46143 3.30976 7.66782 3.1263Z"
               fill="black"
             /></svg
-          >返回</span
+          >{{ lang.ssReturn }}</span
         >
       </div>
       <div class="c_b_btnArea">
@@ -527,13 +532,13 @@
             :type="showBtnType == 0 ? 'primary' : ''"
             size="small"
             @click="showBtnType = 0"
-            >所有事件</el-button
+            >{{ lang.ssAllEvents }}</el-button
           >
           <el-button
             :type="showBtnType == 1 ? 'primary' : ''"
             size="small"
             @click="showBtnType = 1"
-            >计时事件</el-button
+            >{{ lang.ssTimingEvents }}</el-button
           >
         </el-button-group>
 
@@ -541,7 +546,7 @@
           @click="derive(showMemorandumList)"
           v-loading="exportLoading"
         >
-          <el-tooltip class="item" effect="dark" content="导出" placement="top">
+          <el-tooltip class="item" effect="dark" :content="lang.ssExport" placement="top">
             <svg
               t="1724319590942"
               class="icon"
@@ -580,13 +585,13 @@
             <div class="c_s_time" v-if="item.timeDiff">
               <div>
                 <span v-if="item.timeDiff.h !== null"
-                  >{{ item.timeDiff.h }}</span
+                  >{{ item.timeDiff.h }}{{ lang.ssHourUnit }}</span
                 >
                 <span v-if="item.timeDiff.m !== null"
-                  >{{ item.timeDiff.m }}</span
+                  >{{ item.timeDiff.m }}{{ lang.ssMinute }}</span
                 >
                 <span v-if="item.timeDiff.s !== null"
-                  >{{ item.timeDiff.s }}</span
+                  >{{ item.timeDiff.s }}{{ lang.ssSecond }}</span
                 >
               </div>
             </div>
@@ -656,27 +661,27 @@ export default {
         "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%80%92%E6%95%B010%E7%A7%92%E5%8F%A0%E5%8A%A0%E9%9F%B3%E6%95%881721638403882.MP3",
       sourceUrlList: [
         {
-          name: "音乐1",
+          name: this.lang.ssMusic1,
           url:
             "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%80%92%E8%AE%A1%E6%97%B6%E9%9F%B3%E4%B9%901721355956636.mp3"
         },
         {
-          name: "音乐2",
+          name: this.lang.ssMusic2,
           url:
             "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E9%9F%B3%E4%B9%9021728975233277.mp3"
         },
         {
-          name: "音乐3",
+          name: this.lang.ssMusic3,
           url:
             "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E9%9F%B3%E4%B9%9031728975268412.mp3"
         },
         {
-          name: "音乐4",
+          name: this.lang.ssMusic4,
           url:
             "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E9%9F%B3%E4%B9%9041728975432067.mp3"
         },
         {
-          name: "音乐5",
+          name: this.lang.ssMusic5,
           url:
             "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E9%9F%B3%E4%B9%9051728975447857.mp3"
         }
@@ -700,19 +705,20 @@ export default {
       behaviorTagMore: [], //更多
       behaviorTagMoreLoading: false,
       behaviorTagCommon: [
-        "小组讨论",
-        "小组汇报",
-        "动手实验",
-        "课堂游戏",
-        "自主学习",
-        "作品展示",
-        "学生演讲",
-        "学生分享",
-        "随堂练习",
-        "快速问答",
-        "阅读资料",
-        "观察记录"
-      ], //常用
+        this.lang.ssGroupDiscussion,
+        this.lang.ssGroupReport,
+        this.lang.ssHandsOnExperiment,
+        this.lang.ssClassroomGame,
+        this.lang.ssIndependentLearning,
+        this.lang.ssWorkDisplay,
+        this.lang.ssStudentSpeech,
+        this.lang.ssStudentShare,
+        this.lang.ssClassPractice,
+        this.lang.ssQuickQAndA,
+        this.lang.ssReadingMaterials,
+        this.lang.ssObservationRecord
+      ], 
+      //常用
       choiceBehavior: [],
       memorandumList: [],
       memorandumLoading: false,
@@ -982,29 +988,29 @@ export default {
   },
   methods: {
     derive(_data) {
-      if (this.exportLoading) return this.$message.info("请稍等...");
+      if (this.exportLoading) return this.$message.info(this.lang.ssPleaseWaitDots);
       this.exportLoading = true;
       let _array = [];
       _data.forEach((item, index) => {
         let json = {};
-        json["时间"] = item.time;
-        json["事件"] = item.textList
+        json[this.lang.ssTime] = item.time;
+        json[this.lang.ssEvent] = item.textList
           .map(i => i.replace(/<[^>]+>/g, ""))
           .join(",");
-        json["时间差"] =
+        json[this.lang.ssTimeDifference] =
           index == 0
             ? ""
             : `${
                 _data[index - 1].timeDiff.h
-                  ? _data[index - 1].timeDiff.h + "时"
+                  ? _data[index - 1].timeDiff.h + this.lang.ssHourUnit
                   : ""
               }${
                 _data[index - 1].timeDiff.m
-                  ? _data[index - 1].timeDiff.m + "分"
+                  ? _data[index - 1].timeDiff.m + this.lang.ssMinute
                   : ""
               }${
                 _data[index - 1].timeDiff.s
-                  ? _data[index - 1].timeDiff.s + "秒"
+                  ? _data[index - 1].timeDiff.s + this.lang.ssSecond
                   : ""
               }`;
         _array.push(json);
@@ -1020,72 +1026,72 @@ export default {
         { wch: 25 }
       ];
       XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
-      XLSX.writeFile(workbook, "事件.xlsx");
+      XLSX.writeFile(workbook, this.lang.ssEventExportFileName);
 
       this.exportLoading = false;
-      this.$message.success("导出成功");
+      this.$message.success(this.lang.ssExportSuccess);
     },
     lookWork(data) {
       const taskTypes = {
-        查看作业: new Set(),
-        进行点赞: new Set(),
-        进行评论: new Set(),
-        进行评分: new Set()
+        [this.lang.ssViewHomework]: new Set(),
+        [this.lang.ssPerformLike]: new Set(),
+        [this.lang.ssPerformComment]: new Set(),
+        [this.lang.ssPerformRating]: new Set()
       };
 
       let _result = [];
 
-      const viewRegex = /查看<span class=['"]variable['"]>(.*?)<\/span>的作业/g;
-      const likeRegex = /对<span class=['"]variable['"]>(.*?)<\/span>的作业进行<span class=['"]btn['"]>点赞<\/span>/g;
-      const commentRegex = /对<span class=['"]variable['"]>(.*?)<\/span>的作业进行<span class=['"]btn['"]>评论<\/span>/g;
-      const markRegex = /对<span class=['"]variable['"]>(.*?)<\/span>的作业进行<span class=['"]btn['"]>评分<\/span>/g;
+      const viewRegex = new RegExp(`${this.lang.ssViewHomework}<span class=['"]variable['"]>(.*?)<\/span>${this.lang.ssHomeworkOf}`, 'g');
+      const likeRegex = new RegExp(`对<span class=['"]variable['"]>(.*?)<\/span>${this.lang.ssHomeworkOf}${this.lang.ssPerformLike}<span class=['"]btn['"]>点赞<\/span>`, 'g');
+      const commentRegex = new RegExp(`对<span class=['"]variable['"]>(.*?)<\/span>${this.lang.ssHomeworkOf}${this.lang.ssPerformComment}<span class=['"]btn['"]>评论<\/span>`, 'g');
+      const markRegex = new RegExp(`对<span class=['"]variable['"]>(.*?)<\/span>${this.lang.ssHomeworkOf}${this.lang.ssPerformRating}<span class=['"]btn['"]>评分<\/span>`, 'g');
       data.forEach(str => {
         if (viewRegex.test(str)) {
           this.extractText(str, viewRegex).forEach(item =>
-            taskTypes["查看作业"].add(item)
+            taskTypes[this.lang.ssViewHomework].add(item)
           );
         } else if (likeRegex.test(str)) {
           this.extractText(str, likeRegex).forEach(item =>
-            taskTypes["进行点赞"].add(item)
+            taskTypes[this.lang.ssPerformLike].add(item)
           );
         } else if (commentRegex.test(str)) {
           this.extractText(str, commentRegex).forEach(item =>
-            taskTypes["进行评论"].add(item)
+            taskTypes[this.lang.ssPerformComment].add(item)
           );
         } else if (markRegex.test(str)) {
           this.extractText(str, markRegex).forEach(item =>
-            taskTypes["进行评分"].add(item)
+            taskTypes[this.lang.ssPerformRating].add(item)
           );
         }
       });
 
-      if (Array.from(taskTypes["查看作业"]).length > 0) {
+      if (Array.from(taskTypes[this.lang.ssViewHomework]).length > 0) {
         _result.push(
-          `查看<span class='variable'>${Array.from(taskTypes["查看作业"]).join(
+          `${this.lang.ssViewHomework}<span class='variable'>${Array.from(taskTypes[this.lang.ssViewHomework]).join(
             ","
-          )}</span>的作业`
+          )}</span>${this.lang.ssHomeworkOf}`
         );
       }
-      if (Array.from(taskTypes["进行点赞"]).length > 0) {
+      if (Array.from(taskTypes[this.lang.ssPerformLike]).length > 0) {
         _result.push(
-          `对<span class='variable'>${Array.from(taskTypes["进行点赞"]).join(
+          `对<span class='variable'>${Array.from(taskTypes[this.lang.ssPerformLike]).join(
             ","
-          )}</span>的作业进行<span class="btn">点赞</span>`
+          )}</span>${this.lang.ssHomeworkOf}${this.lang.ssPerformLike}<span class="btn">点赞</span>`
         );
       }
-      if (Array.from(taskTypes["进行评论"]).length > 0) {
+      if (Array.from(taskTypes[this.lang.ssPerformComment]).length > 0) {
         _result.push(
-          `对<span class='variable'>${Array.from(taskTypes["进行评论"]).join(
+          `对<span class='variable'>${Array.from(taskTypes[this.lang.ssPerformComment]).join(
             ","
-          )}</span>的作业进行<span class="btn">评论</span>`
+          )}</span>${this.lang.ssHomeworkOf}${this.lang.ssPerformComment}<span class="btn">评论</span>`
         );
       }
 
-      if (Array.from(taskTypes["进行评分"]).length > 0) {
+      if (Array.from(taskTypes[this.lang.ssPerformRating]).length > 0) {
         _result.push(
-          `对<span class='variable'>${Array.from(taskTypes["进行评分"]).join(
+          `对<span class='variable'>${Array.from(taskTypes[this.lang.ssPerformRating]).join(
             ","
-          )}</span>的作业进行<span class="btn">评分</span>`
+          )}</span>${this.lang.ssHomeworkOf}${this.lang.ssPerformRating}<span class="btn">评分</span>`
         );
       }
 
@@ -1126,7 +1132,7 @@ export default {
       // 构建结果数组
       map.forEach((btns, variable) => {
         // 构建新的字符串
-        let newString = `对<span class="variable">${variable}</span>的作业<span class="btn">${btns.join(
+        let newString = `${this.lang.ssPerformActionOn}<span class="variable">${variable}</span>${this.lang.ssHomeworkOf}<span class="btn">${btns.join(
           ","
         )}</span>`;
         result.push(newString);
@@ -1235,8 +1241,8 @@ export default {
       this.type = newType;
     },
     changeBehaviorTagType(newType) {
-      if (this.isCountdown) return this.$message.error("正在倒计时");
-      if (this.isKeepTime) return this.$message.error("正在计时");
+      if (this.isCountdown) return this.$message.error(this.lang.ssCountdownRunning);
+      if (this.isKeepTime) return this.$message.error(this.lang.ssTimerRunning);
       if (this.behaviorTagType == newType) return;
       this.choiceBehavior = [];
       this.behaviorTagType = newType;
@@ -1245,14 +1251,14 @@ export default {
       }
     },
     setCountdownTime(newTime = 0) {
-      if (this.isCountdown) return this.$message.error("正在倒计时");
-      if (this.isKeepTime) return this.$message.error("正在计时");
+      if (this.isCountdown) return this.$message.error(this.lang.ssCountdownRunning);
+      if (this.isKeepTime) return this.$message.error(this.lang.ssTimerRunning);
       this.countdownTime = newTime;
     },
     addTime(time = 0) {
       if (this.isCountdown) return console.log("正在计时");
       if (this.countdownTime >= 3600) {
-        return this.$message.error("倒计时最高一小时");
+        return this.$message.error(this.lang.ssCountdownMaxHour);
       }
       if (this.countdownTime + time > 3600) {
         return (this.countdownTime = 3600);
@@ -1265,8 +1271,8 @@ export default {
       this.countdownTime -= time;
     },
     choiceBehaviorTag(tag) {
-      if (this.isCountdown) return this.$message.error("正在倒计时");
-      if (this.isKeepTime) return this.$message.error("正在计时");
+      if (this.isCountdown) return this.$message.error(this.lang.ssCountdownRunning);
+      if (this.isKeepTime) return this.$message.error(this.lang.ssTimerRunning);
       let _index = this.choiceBehavior.findIndex(i => i == tag);
       if (_index != -1) {
         // 数组删除指定下标数据
@@ -1284,13 +1290,13 @@ export default {
         if (this.$refs.audioRef.playing && this.sourceActive) {
           this.$refs.audioRef.pause();
         }
-        this.$message.success("已暂停倒计时");
+        this.$message.success(this.lang.ssCountdownPaused);
       } else {
         //开始
         if (this.countdownTime == 0)
-          return this.$message.error("请设置倒计时时间");
+          return this.$message.error(this.lang.ssSetCountdownTime);
         this.isCountdown = true;
-        this.$message.success("已开始倒计时");
+        this.$message.success(this.lang.ssCountdownStarted);
         if (this.sourceActive) {
           this.$refs.audioRef.setVolume(0);
           this.$refs.audioRef.play();
@@ -1323,11 +1329,11 @@ export default {
           this.isCountdown = true;
           this.countdownTime -= 1;
         }, 1000);
-        let timeShow = `${this.countdownTimeShow.m1}${this.countdownTimeShow.m2}分钟${this.countdownTimeShow.s1}${this.countdownTimeShow.s2}秒`;
+        let timeShow = `${this.countdownTimeShow.m1}${this.countdownTimeShow.m2}${this.lang.ssMinuteWord}${this.countdownTimeShow.s1}${this.countdownTimeShow.s2}${this.lang.ssSecondWord}`;
         this.insertMemorandum(
-          `设置<span class="variable">${timeShow}</span><span class="btn">倒计时</span>${
+          `${this.lang.ssSet}<span class="variable">${timeShow}</span><span class="btn">${this.lang.ssCountdown}</span>${
             this.choiceBehavior.length > 0
-              ? ",用于" +
+              ? this.lang.ssUsedFor +
                 '<span class="btn">' +
                 this.choiceBehavior.join("、") +
                 "</span>"
@@ -1363,7 +1369,7 @@ export default {
         if (this.$refs.audioRef.playing && this.sourceActive) {
           this.$refs.audioRef.pause();
         }
-        this.$message.success("已停止计时");
+        this.$message.success(this.lang.ssTimerStopped);
       } else {
         this.isKeepTime = true;
         if (this.sourceActive) {
@@ -1373,7 +1379,7 @@ export default {
         this.keepTimeTimer = setInterval(() => {
           this.keepTime += 1;
         }, 1000);
-        this.$message.success("已开始计时");
+        this.$message.success(this.lang.ssTimerStarted);
         this.insertMemorandum(
           `使用<span class="btn">计时器</span>${
             this.choiceBehavior.length > 0
@@ -1413,9 +1419,9 @@ export default {
     reset() {
       if (this.type == 0) {
         if (this.isCountdown) {
-          this.$confirm("正在倒计时!确定重置倒计时吗?", "提醒", {
-            confirmButtonText: "确定",
-            cancelButtonText: "取消",
+          this.$confirm(this.lang.ssConfirmResetCountdown, this.lang.ssTip, {
+            confirmButtonText: this.lang.ssConfirm,
+            cancelButtonText: this.lang.ssCancel,
             type: "warning"
           })
             .then(_ => {
@@ -1425,7 +1431,7 @@ export default {
               this.countdownTime = 0;
               this.isCountdown = false;
               this.choiceBehavior = [];
-              this.$message.success("已重置");
+              this.$message.success(this.lang.ssResetDone);
               if (this.$refs.audioRef.playing) {
                 this.$refs.audioRef.pause();
               }
@@ -1434,9 +1440,9 @@ export default {
               console.log("取消重置");
             });
         } else {
-          this.$confirm("确定重置倒计时吗?", "提醒", {
-            confirmButtonText: "确定",
-            cancelButtonText: "取消",
+          this.$confirm(this.lang.ssConfirmResetBasic, this.lang.ssTip, {
+            confirmButtonText: this.lang.ssConfirm,
+            cancelButtonText: this.lang.ssCancel,
             type: "warning"
           })
             .then(_ => {
@@ -1447,7 +1453,7 @@ export default {
               this.countdownTime = 0;
               this.isCountdown = false;
               this.choiceBehavior = [];
-              this.$message.success("已重置");
+              this.$message.success(this.lang.ssResetDone);
             })
             .catch(_ => {
               console.log("取消重置");
@@ -1455,9 +1461,9 @@ export default {
         }
       } else if (this.type == 1) {
         if (this.isKeepTime) {
-          this.$confirm("正在计时!确定重置计时吗?", "提醒", {
-            confirmButtonText: "确定",
-            cancelButtonText: "取消",
+          this.$confirm(this.lang.ssConfirmResetTimer, this.lang.ssTip, {
+            confirmButtonText: this.lang.ssConfirm,
+            cancelButtonText: this.lang.ssCancel,
             type: "warning"
           })
             .then(_ => {
@@ -1471,11 +1477,11 @@ export default {
                 time: this.keepTime,
                 tag: this.choiceBehavior
               };
-              let timeShow = `${this.keepTimeShow.m1}${this.keepTimeShow.m2}分钟${this.keepTimeShow.s1}${this.keepTimeShow.s2}秒`;
+              let timeShow = `${this.keepTimeShow.m1}${this.keepTimeShow.m2}${this.lang.ssMinuteWord}${this.keepTimeShow.s1}${this.keepTimeShow.s2}${this.lang.ssSecondWord}`;
               this.insertMemorandum(
-                `结束计时器,<span class="btn">计时</span><span class="variable">${timeShow}</span>${
+                `${this.lang.ssEndTimer}<span class="btn">${this.lang.ssTimerWord}</span><span class="variable">${timeShow}</span>${
                   this.choiceBehavior.length > 0
-                    ? ",用于" +
+                    ? this.lang.ssUsedFor +
                       '<span class="btn">' +
                       this.choiceBehavior.join("、") +
                       "</span>"
@@ -1499,11 +1505,11 @@ export default {
             this.$refs.audioRef.pause();
           }
           this.insertData(_data);
-          let timeShow = `${this.keepTimeShow.m1}${this.keepTimeShow.m2}分钟${this.keepTimeShow.s1}${this.keepTimeShow.s2}秒`;
+          let timeShow = `${this.keepTimeShow.m1}${this.keepTimeShow.m2}${this.lang.ssMinuteWord}${this.keepTimeShow.s1}${this.keepTimeShow.s2}${this.lang.ssSecondWord}`;
           this.insertMemorandum(
-            `结束计时器,<span class="btn">计时</span><span class="variable">${timeShow}</span>${
+            `${this.lang.ssEndTimer}<span class="btn">${this.lang.ssTimerWord}</span><span class="variable">${timeShow}</span>${
               this.choiceBehavior.length > 0
-                ? ",用于" +
+                ? this.lang.ssUsedFor +
                   '<span class="btn">' +
                   this.choiceBehavior.join("、") +
                   "</span>"
@@ -1572,7 +1578,7 @@ ${_textData}
         })
         .catch(e => {
           this.behaviorTagMoreLoading = false;
-          this.$message.error("获取更多行为标签失败");
+          this.$message.error(this.lang.ssGetMoreTagsFailed);
           this.behaviorTagType = 0;
           this.behaviorTagMore = [];
           console.log(e);
@@ -1634,7 +1640,7 @@ ${_textData}
         .catch(err => {
           console.log(err);
           this.memorandumLoading = false;
-          this.$message.error("获取行为备忘失败");
+          this.$message.error(this.lang.ssGetMemoFailed);
         });
     },
 
@@ -1705,7 +1711,7 @@ ${_textData}
       };
     },
 		changeSourceUrl(url){
-			if(this.isCountdown || this.isKeepTime)return this.$message.error("请先停止计时再设置");
+			if(this.isCountdown || this.isKeepTime)return this.$message.error(this.lang.ssStopTimerFirst);
 			if(this.sourceUrl == url)return this.showSourceList = false;
 			this.sourceUrl = url;
 

+ 34 - 34
src/components/classRoomHelper/component/reviewArea.vue

@@ -5,14 +5,14 @@
         <div class="checkbox">
 
 					<div class="cb-tabList">
-						<div :class="[commentTagShow==0?'cb-tabItem':'']" @click="commentTagShow=0">评论</div>
+						<div :class="[commentTagShow==0?'cb-tabItem':'']" @click="commentTagShow=0">{{lang.ssComment }}</div>
 
-						<div :class="[commentTagShow==2?'cb-tabItem':'']" @click="commentTagShow=2">总评</div>
+						<div :class="[commentTagShow==2?'cb-tabItem':'']" @click="commentTagShow=2">{{lang.ssTotalEval }}</div>
 					</div>
           <el-select v-model="pzStype" @change="selectPz" class="selectBox" v-show="commentTagShow == 0">
-            <el-option label="时间降序" :value="1"></el-option>
-            <el-option label="时间升序" :value="2"></el-option>
-            <el-option label="我的评课" :value="3"></el-option>
+            <el-option :label="lang.ssTimeDesc" :value="1"></el-option>
+            <el-option :label="lang.ssTimeAsc" :value="2"></el-option>
+            <el-option :label="lang.ssMyComment" :value="3"></el-option>
           </el-select>
         </div>
       </div>
@@ -20,20 +20,20 @@
         <div class="pzListBox" v-if="pzList && pzList.length">
           <div class="pzList" v-for="(pz, pzIndex) in pzList" :key="pzIndex">
             <div class="pzNavTop">
-              <div></div>
+              <div>{{lang.ssEval }}</div>
               <div>
                 {{
                   pz.username && pz.username.length > 5
                     ? pz.username.substring(0, 5) + "..."
                     : pz.username
-                }}的评论
+                }}{{lang.ssCommentOf }}
               </div>
               <div
                 class="pzDelete"
                 v-if="pz.userid == userid"
                 @click="deletePz(pz.id)"
               >
-                删除
+                {{lang.ssDelete }}
               </div>
             </div>
             <div
@@ -58,7 +58,7 @@
               <div class="time">
                 {{ pz.time }}
               </div>
-              <div @click="setReplyIndex(pz.id, pzIndex)">回复</div>
+              <div @click="setReplyIndex(pz.id, pzIndex)">{{lang.ssReply }}</div>
             </div>
 
             <div v-if="pz.hfList && pz.hfList.length > 0" class="hfBox">
@@ -101,7 +101,7 @@
         </div>
         <div class="addPzButton">
           <div class="addPz" @click="(addPzDialog = true), (pzType = 1)">
-            添加评论
+            {{lang.ssAddComment }}
           </div>
           <!-- <div class="img1">
             <div @click="(addPzDialog = true), (pzType = 2)">
@@ -122,7 +122,7 @@
           <div class="teacherPzImg">
             <img src="../../../assets/icon/teacherPz.png" alt="" />
           </div>
-          <div style="margin-left: 10px; height: 25px">教师评论</div>
+          <div style="margin-left: 10px; height: 25px">{{lang.ssTeacherComment }}</div>
         </div>
         <div @click="addPzDialog = false">
           <img src="../../../assets/close1.png" class="pzClose" alt="" />
@@ -131,11 +131,11 @@
       <div class="addPzBox">
         <div class="addPzCheck">
           <span :class="{ isChooseActive: pzType == 1 }" @click="pzType = 1"
-            >文本</span
+            >{{lang.ssText }}</span
           >
           <!-- <span :class="{isChooseActive:pzType==3}" @click="pzType = 3">图片</span> -->
           <span :class="{ isChooseActive: pzType == 2 }" @click="pzType = 2"
-            >音频</span
+            >{{lang.ssAudio }}</span
           >
         </div>
         <div style="height: calc(100% - 95px)">
@@ -144,7 +144,7 @@
           <editor-bar
             class="binfo_input pzConText"
             style="width: 100% !important"
-            placeholder="请输入任务描述"
+            :placeholder="lang.ssEnterTaskDesc"
             v-model="pzConText"
             @change="change"
             v-if="pzType == 1"
@@ -159,7 +159,7 @@
           </div> -->
         </div>
         <div class="addTextCss" @click="addPz('1')" v-if="pzType == 1">
-          确定
+          {{lang.ssConfirm }}
         </div>
       </div>
     </div>
@@ -173,7 +173,7 @@
           <div class="teacherPzImg">
             <img src="../../../assets/icon/teacherPz.png" alt="" />
           </div>
-          <div style="margin-left: 10px; height: 25px">添加回复</div>
+          <div style="margin-left: 10px; height: 25px">{{lang.ssAddReply }}</div>
         </div>
         <div @click="replyDialogVisible = false">
           <img src="../../../assets/close1.png" class="pzClose" alt="" />
@@ -192,12 +192,12 @@
           <editor-bar
             class="binfo_input pzConText"
             style="width: 100% !important; margin: 0 auto"
-            placeholder="请输入回复描述"
+            :placeholder="lang.ssEnterReplyDesc"
             v-model="reply"
             @change="change"
           ></editor-bar>
         </div>
-        <div class="addTextCss" @click="addHf">确定</div>
+        <div class="addTextCss" @click="addHf">{{lang.ssConfirm }}</div>
       </div>
     </div>
   </div>
@@ -258,9 +258,9 @@ export default {
   },
   methods: {
 		deleteReply(id) {
-      this.$confirm("确定删除此回复吗?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
+      this.$confirm(this.lang.ssConfirmDeleteReply, this.lang.ssTip, {
+        confirmButtonText: this.lang.ssConfirm,
+        cancelButtonText: this.lang.ssCancel,
         type: "warning",
       })
         .then(() => {
@@ -273,13 +273,13 @@ export default {
             .post(this.$store.state.api + "deleteReply", params)
             .then((res) => {
               this.$message({
-                message: "删除成功",
+                message: this.lang.ssDeleteSuccess,
                 type: "success",
               });
               this.selectPz();
             })
             .catch((err) => {
-              this.$message.error("网络异常");
+              this.$message.error(this.lang.ssNetworkError);
               console.error(err);
             });
         })
@@ -287,7 +287,7 @@ export default {
     },
 		addHf() {
       if (this.reply == "") {
-        this.$message.error("回复不能为空!");
+        this.$message.error(this.lang.ssReplyEmpty);
         return;
       }
       let params = [
@@ -307,14 +307,14 @@ export default {
         .then((res) => {
           this.reply = "";
           this.$message({
-            message: "回复成功",
+            message: this.lang.ssReplySuccess,
             type: "success",
           });
           this.replyDialogVisible = false;
           this.selectPz();
         })
         .catch((err) => {
-          this.$message.error("回复失败");
+          this.$message.error(this.lang.ssReplyFailed);
           console.error(err);
         });
     },
@@ -397,7 +397,7 @@ export default {
 		},
 		addPz(type, content) {
       if (type == "1" && this.pzConText == "") {
-        this.$message.error("评论不能为空!");
+        this.$message.error(this.lang.ssCommentEmpty);
         return;
       }
       let params = [
@@ -414,7 +414,7 @@ export default {
         .post(this.$store.state.api + "addPz2", params)
         .then((res) => {
           this.$message({
-            message: "添加成功",
+            message: this.lang.ssAddSuccess,
             type: "success",
           });
           this.pzConText = "";
@@ -423,7 +423,7 @@ export default {
 					this.insertMemorandum(`使用<span class="btn">评论</span>功能,添加评论`)
         })
         .catch((err) => {
-          this.$message.error("添加失败");
+          this.$message.error(this.lang.ssAddFailed);
           console.error(err);
         });
 				
@@ -432,9 +432,9 @@ export default {
 			console.log(val);
 		},
 		deletePz(id) {
-      this.$confirm("确定删除此评论吗?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
+      this.$confirm(this.lang.ssConfirmDeleteComment, this.lang.ssTip, {
+        confirmButtonText: this.lang.ssConfirm,
+        cancelButtonText: this.lang.ssCancel,
         type: "warning",
       })
         .then(() => {
@@ -447,13 +447,13 @@ export default {
             .post(this.$store.state.api + "deletePz", params)
             .then((res) => {
               this.$message({
-                message: "删除成功",
+                message: this.lang.ssDeleteSuccess,
                 type: "success",
               });
               this.selectPz();
             })
             .catch((err) => {
-              this.$message.error("网络异常");
+              this.$message.error(this.lang.ssNetworkError);
               console.error(err);
             });
         })

Datei-Diff unterdrückt, da er zu groß ist
+ 330 - 271
src/components/classRoomHelper/component/searchArea.vue


+ 54 - 212
src/components/classRoomHelper/component/taskArea.vue

@@ -1,19 +1,20 @@
 <template>
   <div class="task">
     <div class="taskTop">
-      <div class="tt_title">任务时间分配</div>
+      <div class="tt_title">{{ lang.ssTaskTimeAllocation }}</div>
       <div class="tt_item">
         <div class="tt_i_title">
-          <span>课程时间轴</span>
+          <span>{{ lang.ssCourseTimeline }}</span>
         </div>
         <div class="tt_i_box">
-          <div class="tt_i_b_step" v-if="navList.length == 1">
+          <div class="tt_i_b_step" style="width: 140px;" v-if="navList.length == 1">
             <!-- 只有一个阶段 -->
             <span
               :style="{
                 background: taskCount >= index ? '#3681FC' : '#E0EAFB'
               }"
               v-for="(item, index) in navList[courseType].task"
+              :key="index"
             ></span>
           </div>
           <div class="tt_i_b_step" v-if="navList.length > 1">
@@ -23,6 +24,7 @@
                 background: courseType >= index ? '#3681FC' : '#E0EAFB'
               }"
               v-for="(item, index) in navList"
+              :key="index"
             ></span>
           </div>
           <!-- <img :src="require('../../../assets/icon/course/group.png')" /> -->
@@ -31,16 +33,16 @@
 
       <div class="tt_item">
         <div class="tt_i_title">
-          <span>任务状态</span>
-          <span v-if="isWorkStudent !== 0">学生活动中...</span>
+          <span>{{ lang.ssTaskStatus }}</span>
+          <span v-if="isWorkStudent !== 0">{{ lang.ssStudentActivity }}</span>
         </div>
         <div class="tt_i_box">
           <div class="tt_i_b_item">
-            <div class="tt_i_b_title">作业提交</div>
+            <div class="tt_i_b_title">{{ lang.ssHomework }}</div>
             <div class="tt_i_b_box">
               <div class="tt_i_b_b_item">
-                <div>提交人数</div>
-                <span>{{ isWorkStudent }}<span></span></span>
+                <div>{{ lang.ssSubmitCount }}</div>
+                <span>{{ isWorkStudent }}<span>{{ lang.ssPersonUnit }}</span></span>
               </div>
               <div
                 class="tt_i_b_b_item"
@@ -50,25 +52,25 @@
                     complete != '-'
                 "
               >
-                <div>完成率</div>
+                <div>{{ lang.ssCompletionRate }}</div>
                 <span>{{ complete }}<span>%</span></span>
               </div>
             </div>
           </div>
-          <div class="tt_i_b_item">
-            <div class="tt_i_b_title">交流互动</div>
-            <div class="tt_i_b_box">
+          <div class="tt_i_b_item" style="width: 290px;">
+            <div class="tt_i_b_title">{{ lang.ssCommunication }}</div>
+            <div class="tt_i_b_box" >
               <div class="tt_i_b_b_item">
-                <div>参与人数</div>
-                <span>{{ isWorkAll }}<span></span></span>
+                <div>{{ lang.ssParticipantCount }}</div>
+                <span>{{ isWorkAll }}<span>{{ lang.ssPersonUnit }}</span></span>
               </div>
               <div class="tt_i_b_b_item">
-                <div>点赞数</div>
-                <span>{{ likeNum }}<span></span></span>
+                <div>{{ lang.ssLikeCount }}</div>
+                <span>{{ likeNum }}<span>{{ lang.ssItemUnit }}</span></span>
               </div>
               <div class="tt_i_b_b_item">
-                <div>评论数</div>
-                <span>{{ commentNum }}<span></span></span>
+                <div>{{ lang.ssCommentCount }}</div>
+                <span>{{ commentNum }}<span>{{ lang.ssCommentUnit }}</span></span>
               </div>
             </div>
           </div>
@@ -79,11 +81,11 @@
       <div class="aba_top">
         <div class="aba_t_left">
           <img :src="require('../../../assets/icon/course/practice.svg')" />
-          <span>巩固练习</span>
+          <span>{{ lang.ssConsolidatePractice }}</span>
           <el-tooltip
             class="item"
             effect="light"
-            content="刷新"
+            :content="lang.ssRefresh"
             placement="top"
             v-if="showCard == 1"
           >
@@ -116,13 +118,13 @@
       <div class="aba_box">
         <div class="aa_ab_noTask" v-if="showCard == 0">
           <img :src="require('../../../assets/icon/course/aiLogo.png')" />
-          <span>当前课堂未添加练习题</span>
+          <span>{{ lang.ssNoExerciseAdded }}</span>
           <div
             class="aa_ab_nt_btn"
             @click.stop="getTopic()"
             v-show="ttype == 1"
           >
-            一键出题
+            {{ lang.ssOneClickGenerate }}
           </div>
           <div
             v-show="
@@ -130,17 +132,17 @@
                 this.courseDetail.juri.indexOf(userid) != -1
             "
           >
-            或前往“<span @click.stop="goSetTopic()">课堂管理</span
-            >”编辑工具,自主添加题目
+            {{ lang.ssGoTo }}"<span @click.stop="goSetTopic()">{{ lang.ssClassManagement }}</span
+            >"{{ lang.ssEditToolAddTopics }}
           </div>
         </div>
 
         <div class="aa_ab_topic" v-else-if="showCard == 1">
           <div class="aa_ab_t_title">
             <span v-if="topicList[showTopicIndex].answer.length"
-              >【多选题】</span
+              >{{ lang.ssMultipleChoice }}</span
             >
-            <span v-else>【单选题】</span>
+            <span v-else>{{ lang.ssSingleChoice }}</span>
             <span>{{ topicList[showTopicIndex].teststitle }}</span>
           </div>
 
@@ -243,7 +245,7 @@
           <div class="aa_ab_t_btnArea">
             <div class="aa_ab_t_message">
               <div class="aa_ab_t_m_answer">
-                正确答案:<span v-if="showBottomCard == 2">{{
+                {{ lang.ssCorrectAnswer }}<span v-if="showBottomCard == 2">{{
                   topicList[showTopicIndex].answer.length
                     ? topicList[showTopicIndex].answer
                         .map(i => chooseList[i])
@@ -257,13 +259,13 @@
                   :class="[showBottomCard == 1 ? 'aa_ab_t_m_btnActive' : '']"
                   @click.stop="statistics()"
                   v-if="ttype != 2"
-                  >题目统计</span
+                  >{{ lang.ssTopicStatistics }}</span
                 >
                 <span
                   :class="[showBottomCard == 2 ? 'aa_ab_t_m_btnActive' : '']"
                   v-if="ttype != 2"
                   @click.stop="analyze()"
-                  >答案解析</span
+                  >{{ lang.ssAnswerAnalysis }}</span
                 >
               </div>
             </div>
@@ -275,17 +277,17 @@
             >
               <div class="sc_top">
                 <div>
-                  提交人数 <span>{{ statisticsData.total }}</span>
+                  {{ lang.ssSubmitCount }} <span>{{ statisticsData.total }}</span>
                 </div>
                 <div>
-                  正确率 <span>{{ statisticsData.accuracy }}%</span>
+                  {{ lang.ssCorrectRate }} <span>{{ statisticsData.accuracy }}%</span>
                 </div>
 
                 <div class="sc_t_refresh" @click.stop="getStatistics()">
                   <el-tooltip
                     class="item"
                     effect="dark"
-                    content="刷新"
+                    :content="lang.ssRefresh"
                     placement="top"
                   >
                     <img
@@ -296,7 +298,7 @@
               </div>
 
               <div class="sc_bottom">
-                <span v-if="statisticsData.total == 0">当前暂无学生提交.</span>
+                <span v-if="statisticsData.total == 0">{{ lang.ssNoStudentSubmit }}</span>
                 <div
                   class="sc_b_item"
                   v-else
@@ -332,7 +334,7 @@
                 @click.stop="getAiTopic()"
                 v-show="ttype == 1"
               >
-                <span>智能出题</span>
+                <span>{{ lang.ssSmartGenerate }}</span>
                 <svg
                   width="17"
                   :style="showMenu ? 'transform: rotate(180deg);' : ''"
@@ -353,9 +355,9 @@
                   v-if="showMenu"
                   v-click-outside="handleBlur"
                 >
-                  <span @click.stop="getAiTopicByyType(0)">相似题</span>
-                  <span @click.stop="getAiTopicByyType(1)">更难题</span>
-                  <span @click.stop="getAiTopicByyType(2)">更易题</span>
+                  <span @click.stop="getAiTopicByyType(0)" style="width: 135px;text-align: center;">{{ lang.ssSimilarTopic }}</span>
+                  <span @click.stop="getAiTopicByyType(1)">{{ lang.ssHarderTopic }}</span>
+                  <span @click.stop="getAiTopicByyType(2)">{{ lang.ssEasierTopic }}</span>
                 </div>
               </div>
 
@@ -366,7 +368,7 @@
                 ]"
                 @click.stop="up()"
               >
-                上一题
+                {{ lang.ssPreviousTopic }}
               </div>
               <div
                 :class="[
@@ -377,178 +379,14 @@
                 ]"
                 @click.stop="next()"
               >
-                下一题
+                {{ lang.ssNextTopic }}
               </div>
             </div>
           </div>
         </div>
       </div>
     </div>
-    <!-- <div class="aiArea">
-      <div class="aa_title">巩固练习</div>
-      <div class="aa_aiBox" v-loading="aiBoxLoading">
-       
-				 <div class="aa_ab_noTask" v-if="showCard == 0">
-          <div>当前课堂未添加练习题</div>
-           <div v-if="this.courseDetail.userid == userid">
-            点击<span @click.stop="getTopic()">一键出题</span>自动生成 10
-            道随堂练习
-          </div>
-          <div
-            v-if="
-              this.courseDetail.userid == userid ||
-                this.courseDetail.juri.indexOf(userid) != -1
-            "
-          >
-            前往<span @click.stop="goSetTopic()">课堂管理</span
-            >编辑工具,自主添加题目
-          </div>
-        </div>
 
-        <div class="aa_ab_topic" v-else-if="showCard == 1">
-          <div class="topicNum">
-            {{ showTopicIndex + 1 }}/{{ topicList.length }}
-          </div>
-          <div class="aa_ab_t_t_detail">
-            <div class="aa_ab_t_t_d_title">
-              <span v-if="topicList[showTopicIndex].answer.length"
-                >【多选题】</span
-              >
-              <span v-else>【单选题】</span>
-              {{ topicList[showTopicIndex].teststitle }}
-            </div>
-            <div class="aa_ab_t_t_d_check">
-              <div
-                class="aa_ab_t_t_d_c_item"
-                v-for="(item, index) in topicList[showTopicIndex].checkList"
-                :key="showTopicIndex + '-' + index"
-              >
-                <div class="checkInput" @click.stop="chooseAnswer(index)">
-                  <img
-                    :src="require('../../../assets/icon/course/yes.svg')"
-                    v-if="
-                      topicList[showTopicIndex].answer2 === index ||
-                        (topicList[showTopicIndex].answer2.length &&
-                          topicList[showTopicIndex].answer2.includes(index))
-                    "
-                  />
-                </div>
-                <span v-if="item.imgType == 1"
-                  >{{ index + 1 }}、
-                  <img
-                    :src="item.src"
-                    @click.stop="$hevueImgPreview(item.src)"
-                  />
-                </span>
-                <span v-else
-                  >{{ index + 1 }}、<span>{{ item }}</span></span
-                >
-              </div>
-            </div>
-          </div>
-          <div class="aa_ab_t_t_btnArea">
-            <div class="aa_ab_t_t_ba_left" v-if="topicList.length > 1">
-              <img
-                :src="require('../../../assets/icon/course/left.svg')"
-                :style="showTopicIndex == 0 ? `opacity: .5;` : ''"
-                @click.stop="up()"
-              />
-              <img
-                :src="require('../../../assets/icon/course/left.svg')"
-                :style="
-                  topicList.length && topicList.length - 1 == showTopicIndex
-                    ? `opacity: .5;transform: rotate(180deg);`
-                    : 'transform: rotate(180deg);'
-                "
-                @click.stop="next()"
-              />
-            </div>
-            <div class="aa_ab_t_t_ba_right">
-              <div class="br_area" v-if="ttype!=2">
-                <span
-                  :class="[showBottomCard == 1 ? 'br_a_active' : '']"
-                  @click.stop="statistics()"
-                  >统计</span
-                >
-              </div>
-              <div class="br_area" v-if="ttype!=2">
-                <span
-                  :class="[showBottomCard == 2 ? 'br_a_active' : '']"
-                  @click.stop="analyze()"
-                  >解析</span
-                >
-              </div>
-              <div class="br_area" v-if="this.courseDetail.userid == userid && ttype!=2">
-                <div class="br_a_menu" v-if="showMenu">
-                  <span @click.stop="getAiTopicByyType(0)">相似题</span>
-                  <span @click.stop="getAiTopicByyType(1)">更难题</span>
-                  <span @click.stop="getAiTopicByyType(2)">更易题</span>
-                </div>
-                <span @click.stop="getAiTopic()">智能出题</span>
-              </div>
-
-              <div class="br_area" v-if="ttype==2">
-                <span @click.stop="studentSubmit()">提交</span>
-              </div>
-            </div>
-          </div>
-        </div>
-        <div class="aa_ab_bottomCard" v-if="showBottomCard != 0">
-          <div class="statisticsCard" v-if="showBottomCard == 1" v-loading="statisticsLoading">
-            <div class="sc_top">
-              <div>
-                提交人数 <span>{{ statisticsData.total }}</span>
-              </div>
-              <div>正确率 <span>{{statisticsData.accuracy}}%</span></div>
-
-							<div class="sc_t_refresh" @click.sto="getStatistics()">
-								<el-tooltip class="item" effect="dark" content="刷新" placement="top">
-									<img :src="require('../../../assets/icon/course/refresh.svg')">
-    						</el-tooltip>
-								
-							</div>
-            </div>
-
-						<div class="sc_top">
-              <div>
-                答案: <span>{{ topicList[showTopicIndex].answer.length?topicList[showTopicIndex].answer.map(i=>i+=1).join('、'):topicList[showTopicIndex].answer+1 }}</span>
-              </div>
-            </div>
-            <div class="sc_bottom">
-              <span v-if="statisticsData.total == 0"
-                >当前暂无学生提交练习.</span
-              >
-							<div class="sc_b_item" v-else v-for="(item,index) in statisticsData.checkList" :key="showTopicIndex+'-'+index">
-								<span class="sc_b_i_index">{{item.index}}、</span>
-								<div class="sc_b_i_progress">
-									<el-progress :percentage="item.accuracy"></el-progress>
-								</div>
-								<span class="sc_b_i_num">{{item.num}}人</span>
-							</div>
-            </div>
-          </div>
-          <div
-            class="analyzeCard"
-            v-else-if="showBottomCard == 2"
-            v-loading="analyzeLoading"
-          >
-            <span>{{ analyzeText }}</span>
-            <div class="ac_btnArea">
-              <img
-                :src="require('../../../assets/icon/course/megaphone3.svg')"
-                v-if="!aiIsTalk"
-                @click="aiTalkAll({ aiContent: analyzeText })"
-              />
-              <img
-                :src="require('../../../assets/icon/course/megaphone.svg')"
-                v-else
-                @click="aiTalkAll({ aiContent: analyzeText })"
-              />
-            </div>
-          </div>
-        </div>
-      </div>
-    </div> -->
 
     <iframe
       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
@@ -949,7 +787,7 @@ export default {
       // 移除临时元素
       document.body.removeChild(tempInput);
       this.$message({
-        message: "复制成功",
+        message: this.lang.ssCopySuccess,
         type: "success"
       });
     },
@@ -1255,7 +1093,7 @@ ${_textData}
             // this.$message.success("一键出题成功");
           } else {
             if (this.itemType == 2) {
-              this.$message.error("一键出题失败");
+              this.$message.error(this.lang.ssOneClickGenerateFailed);
             }
           }
           this.aiBoxLoading = false;
@@ -1263,7 +1101,7 @@ ${_textData}
         .catch(e => {
           this.aiBoxLoading = false;
           if (this.itemType == 2) {
-              this.$message.error("一键出题失败");
+              this.$message.error(this.lang.ssOneClickGenerateFailed);
           }
           console.log(e);
         });
@@ -1547,7 +1385,7 @@ ${taskText}
         })
         .catch(e => {
           this.aiBoxLoading = false;
-          this.$message.error("智能出题失败");
+          this.$message.error(this.lang.ssSmartGenerateFailed);
           console.log(e);
         });
       if (type == 0) {
@@ -1570,7 +1408,7 @@ ${taskText}
     chooseAnswer(answer) {
       if (this.showBottomCard == 2) return;
       if (this.topicList[this.showTopicIndex].isSubmit)
-        return this.$message.error("该题已经提交过了");
+        return this.$message.error(this.lang.ssTopicAlreadySubmitted);
       if (this.topicList[this.showTopicIndex].answer.length) {
         //多选题
         if (this.topicList[this.showTopicIndex].answer2.includes(answer)) {
@@ -1593,7 +1431,7 @@ ${taskText}
           this.topicList[this.showTopicIndex].answer2 === "") ||
         this.topicList[this.showTopicIndex].answer2.length == 0
       ) {
-        return this.$message.error("请先答题");
+        return this.$message.error(this.lang.ssPleaseAnswerFirst);
       } else {
         this.topicList[this.showTopicIndex].isSubmit = true;
         this.saveTaskList();
@@ -1628,7 +1466,7 @@ ${taskText}
             });
 
             if (flag) {
-              this.$message.info("老师有新添加的题目");
+              this.$message.info(this.lang.ssTeacherAddedNewTopics);
             }
 
             this.topicList = _task;
@@ -1777,7 +1615,7 @@ ${taskText}
     },
     studentSubmit() {
       this.saveTaskList(0).then(res => {
-        this.$message.success("提交成功");
+        this.$message.success(this.lang.ssSubmitSuccess);
         this.selectDefaultTaskList();
       });
     },
@@ -1877,7 +1715,7 @@ ${_choiceText}
           })
           .catch(e => {
             this.analyzeLoading = false;
-            this.$message.error("生成解析失败");
+            this.$message.error(this.lang.ssGenerateAnalysisFailed);
             console.log(e);
           });
       });
@@ -1949,6 +1787,7 @@ ${_choiceText}
   width: 100%;
   height: auto;
   display: flex;
+  gap: 15px;
   margin-top: 10px;
   justify-content: space-between;
 }
@@ -2022,6 +1861,7 @@ ${_choiceText}
 .tt_i_b_b_item > div {
   font-size: 14px;
   color: #949599;
+  text-align: center;
 }
 
 .tt_i_b_b_item > span {
@@ -2522,6 +2362,8 @@ ${_choiceText}
 
 .aa_ab_t_ba_nextOrUp {
   width: 100%;
+  font-size: 14px;
+  text-align: center;
   height: 35px;
   display: flex;
   justify-content: space-between;

+ 2 - 2
src/components/classRoomHelper/component/workFlowIframe.vue

@@ -22,7 +22,7 @@ export default {
             handler: function(newVal, oldVal) {
                 if (newVal) {
                     this.checkIndex = 0
-                    this.src = newVal[this.checkIndex].src
+                    this.src = newVal[this.checkIndex].src ? newVal[this.checkIndex].src : ''
                     console.log('-------------------',this.src);
                     this.$forceUpdate();
                 }
@@ -39,7 +39,7 @@ export default {
     methods: {
         setSrc(index) {
             this.checkIndex = index
-            this.src = this.iframeSrc[index].src
+            this.src = this.iframeSrc[index] && this.iframeSrc[index].src ? this.iframeSrc[index].src : ''
         }
     },
     mounted(){

+ 35 - 32
src/components/classRoomHelper/index.vue

@@ -88,7 +88,7 @@
                   stroke-width="5"
                 />
               </svg>
-              <span>学生自由预览</span>
+              <span>{{ lang.ssStudentFreePreview }}</span>
             </div>
             <div
               class="ch_nav_box_topFixed_popover_item"
@@ -135,7 +135,7 @@
                   stroke-width="5"
                 />
               </svg>
-              <span>开放作业预览</span>
+              <span>{{ lang.ssOpenHomeworkPreview }}</span>
             </div>
           </div>
           <div
@@ -161,7 +161,7 @@
                 p-id="4481"
               ></path>
             </svg>
-            <span>分屏</span>
+            <span>{{ lang.ssSplitScreen }}</span>
           </div>
         </el-popover>
       </div>
@@ -170,7 +170,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            :content="fold ? '折叠' : '展开'"
+            :content="fold ? lang.ssFold : lang.ssExpand"
             placement="top"
           >
             <img
@@ -182,7 +182,7 @@
         </div>
 
         <div @click="changeItemType(5)" v-if="tType == 1">
-          <el-tooltip class="item" effect="dark" content="评论" placement="top">
+          <el-tooltip class="item" effect="dark" :content="lang.ssComment" placement="top">
             <img
               :src="require('../../assets/icon/course/comment2.svg')"
               alt=""
@@ -201,7 +201,7 @@
           v-if="!videoStart && (tType == 1 || tType == 4)"
         >
           <div class="drawerBox">
-            <span>上传中</span>
+            <span>{{ lang.ssUploading }}</span>
             <el-progress
               :width="80"
               type="circle"
@@ -212,7 +212,7 @@
             <el-tooltip
               class="item"
               effect="dark"
-              content="录制"
+              :content="lang.ssRecord"
               placement="top"
             >
               <img
@@ -228,7 +228,7 @@
           v-else-if="tType == 1 || tType == 4"
           style="background:#f63564"
         >
-          <el-tooltip class="item" effect="dark" content="下载" placement="top">
+          <el-tooltip class="item" effect="dark" :content="lang.ssDownload" placement="top">
             <img
               :src="require('../../assets/icon/course/record4.svg')"
               alt=""
@@ -255,7 +255,7 @@
             :src="require('../../assets/icon/course/task.png')"
           />
           <!-- <span :style="`background:url(${itemType==2?require('../../assets/icon/course/task_active.png'):require('../../assets/icon/course/task.png')});`"></span> -->
-          <div>测验</div>
+          <div>{{ lang.ssQuiz }}</div>
         </div>
 
         <div
@@ -275,7 +275,7 @@
             :src="require('../../assets/icon/course/up.png')"
           />
           <!-- <span :style="`background:url(${itemType==1?require('../../assets/icon/course/up_active.png'):require('../../assets/icon/course/up.png')});`"></span> -->
-          <div>对话</div>
+          <div>{{ lang.ssDialogue }}</div>
         </div>
         <div
           v-if="iframeSrc.length  && (canUseCourseId.includes(courseId) || oid == '91796dfb-8791-11ef-9b30-005056b86db5')"
@@ -293,7 +293,7 @@
             v-if="itemType != 6"
             :src="require('../../assets/icon/course/gongzuoliu.svg')"
           />
-          <div>工作流</div>
+          <div>{{ lang.ssWorkflow }}</div>
         </div>
 
         <div
@@ -312,7 +312,7 @@
             v-if="itemType != 7"
             :src="require('../../assets/icon/course/teachingAssistant_default.svg')"
           />
-          <div>助教</div>
+          <div>{{ lang.ssAssistant }}</div>
         </div>
 
         <div
@@ -331,12 +331,12 @@
             v-if="itemType != 3"
             :src="require('../../assets/icon/course/Countdown.svg')"
           />
-          <div>倒计时</div>
+          <div>{{ lang.ssCountdown }}</div>
         </div>
       </div>
       <div class="ch_nav_box_bottom">
         <div @click.stop="commentAndAnnotate()" style="z-index: 9999;" v-if="tType!=2">
-          <el-tooltip class="item" effect="dark" content="批注" placement="top">
+          <el-tooltip class="item" effect="dark" :content="lang.ssAnnotation" placement="top">
             <img
               :src="require('../../assets/icon/course/edit2.svg')"
               v-if="!AnnotationCanvasShow"
@@ -365,7 +365,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            :content="recordType == 0 ? '开启语音助手' : '关闭语音助手'"
+            :content="recordType == 0 ? lang.ssStartVoiceAssistant : lang.ssCloseVoiceAssistant"
             placement="top"
           >
             <img
@@ -380,7 +380,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            content="上一步"
+            :content="lang.ssPrevious"
             placement="top"
           >
             <img :src="require('../../assets/icon/course/last.png')" />
@@ -391,7 +391,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            content="下一步"
+            :content="lang.ssNext"
             placement="top"
           >
             <img :src="require('../../assets/icon/course/next.png')" />
@@ -402,7 +402,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            :content="type == 0 ? '展开' : '折叠'"
+            :content="type == 0 ? lang.ssExpand : lang.ssFold"
             placement="top"
           >
             <img :src="require('../../assets/icon/course/menu.png')" />
@@ -418,17 +418,17 @@
     >
       <div @click="$emit('backPage')">
         <img :src="require('../../assets/icon/course/return.png')" alt="" />
-        <span>返回</span>
+        <span>{{ lang.ssReturn }}</span>
       </div>
 
       <div @click="$emit('refresh')">
         <img :src="require('../../assets/icon/course/refresh.png')" alt="" />
-        <span>刷新</span>
+        <span>{{ lang.ssRefresh }}</span>
       </div>
 
       <div @click="$emit('authority')" v-if="tType == 1 || tType == 4">
         <img :src="require('../../assets/icon/course/setting2.svg')" alt="" />
-        <span>权限</span>
+        <span>{{ lang.ssPermission }}</span>
       </div>
     </div>
     <levitatedSphere ref="levitatedSphereRef" @startTime="startTime" />
@@ -471,6 +471,7 @@ import reviewArea from "./component/reviewArea.vue";
 import workFlowIframe from "./component/workFlowIframe.vue";
 import uploadFile from "./component/uploadFile.vue";
 import { v4 as uuidv4 } from "uuid";
+import { myMixin } from "@/mixins/mixin.js"
 // 自定义指令,用于处理点击外部区域的事件
 const clickOutside = {
   bind(el, binding) {
@@ -491,6 +492,7 @@ const clickOutside = {
   }
 };
 export default {
+  mixins: [myMixin],
   emits: [
     "refresh",
     "goStep",
@@ -778,7 +780,7 @@ ${_textData}
     },
     startRecording() {
       if (this.uploadFileStatus.loading)
-        return this.$message.error("正在上传录屏文件,请稍等...");
+        return this.$message.error(this.lang.ssUploadingRecording);
       this.$emit("startRecording");
       this.insertMemorandum(`使用<span class="btn">录制</span>功能,录制课堂`);
     },
@@ -929,13 +931,13 @@ ${_textData}
       });
     },
     startAssistant() {
-      if(this.isBtn) return this.$message.info("请稍等...");
+      if(this.isBtn) return this.$message.info(this.lang.ssPleaseWait);
       this.isBtn = true
       setTimeout(() => {
           this.isBtn = false
       }, 1000);
 
-      if (this.recordLoading) return this.$message.info("请稍等...");
+      if (this.recordLoading) return this.$message.info(this.lang.ssPleaseWait);
       this.recordLoading = true;
       if (this.recordType == 0) {
         if (this.itemType == 4) {
@@ -954,9 +956,9 @@ ${_textData}
     changeMegaphone() {
       this.openMegaphone = !this.openMegaphone;
       if (this.openMegaphone) {
-        this.$message.success("已开启AI语音");
+        this.$message.success(this.lang.ssAIVoiceEnabled);
       } else {
-        this.$message.success("已关闭AI语音");
+        this.$message.success(this.lang.ssAIVoiceDisabled);
       }
     },
     // 展开
@@ -1133,9 +1135,9 @@ Instruction: Based on the context, follow "Format example", write content
               this.splitScreenData.userId == this.userid &&
               this.splitScreenData.uid != this.splitScreenData.myUid
             ) {
-              this.$message.error("需要在开启分屏的设备上关闭分屏");
+              this.$message.error(this.lang.ssCloseSplitScreenOnDevice);
             } else {
-              this.$message.error("你不是分屏的创建者,无法关闭分屏");
+              this.$message.error(this.lang.ssNotSplitScreenCreator);
             }
           }
         } else {
@@ -1143,11 +1145,11 @@ Instruction: Based on the context, follow "Format example", write content
           // this.splitScreenData.isOpen = true;
         }
       } else {
-        this.$message.error("只有老师可以分屏");
+        this.$message.error(this.lang.ssOnlyTeacherCanSplitScreen);
       }
     },
     checkUploadFile(file) {
-      this.$confirm(`是否上传${file.name}至资源库?`)
+      this.$confirm(this.lang.ssConfirmUploadToResource.replace(/\*/g, file.name))
         .then(res => {
           console.log("上传👉", file);
           this.$refs.uploadFileRef.awsupload({ file: file });
@@ -1184,7 +1186,7 @@ Instruction: Based on the context, follow "Format example", write content
         .post(this.$store.state.api + "addSourceFile", params)
         .then(res => {
           this.$message.success(
-            `上传《${this.uploadFileStatus.file.name}》至资源库成功`
+            this.lang.ssUploadFileToResourceSuccess.replace(/\*/g, this.uploadFileStatus.file.name)
           );
           this.uploadFileStatus = {
             file: null,
@@ -1247,7 +1249,7 @@ Instruction: Based on the context, follow "Format example", write content
 }
 
 .ch_content_box {
-  width: 400px;
+  width: 495px;
   height: 100%;
   border-right: 2px solid #e7e7e7;
 }
@@ -1438,6 +1440,7 @@ Instruction: Based on the context, follow "Format example", write content
 .ch_nav_box_topFixed_item > span {
   margin-top: 5px;
   font-size: 14px;
+  text-align: center;
 }
 
 .ch_nav_box_topFixed_item_active {

+ 9 - 7
src/components/classRoomHelper/studentIndex.vue

@@ -9,13 +9,13 @@
     <div class="ch_nav_box">
       <div class="ch_nav_box_top">
         <div @click="$emit('backPage')" class="ch_nav_box_top_item">
-          <el-tooltip class="item" effect="dark" content="返回" placement="top">
+          <el-tooltip class="item" effect="dark" :content="lang.ssReturn" placement="top">
             <img :src="require('../../assets/icon/course/return.png')" alt="" />
           </el-tooltip>
         </div>
 
         <div @click="$emit('refresh')" class="ch_nav_box_top_item">
-          <el-tooltip class="item" effect="dark" content="刷新" placement="top">
+          <el-tooltip class="item" effect="dark" :content="lang.ssRefresh" placement="top">
             <img
               :src="require('../../assets/icon/course/refresh.png')"
               alt=""
@@ -45,7 +45,7 @@
               require('../../assets/icon/course/teachingAssistant_default.svg')
             "
           />
-          <div>助教</div>
+          <div>{{ lang.ssAssistant }}</div>
         </div>
       </div>
       <div class="ch_nav_box_bottom">
@@ -58,7 +58,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            content="上一步"
+            :content="lang.ssPrevious"
             placement="top"
           >
             <img :src="require('../../assets/icon/course/last.png')" />
@@ -74,7 +74,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            content="下一步"
+            :content="lang.ssNext"
             placement="top"
           >
             <img :src="require('../../assets/icon/course/next.png')" />
@@ -85,7 +85,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            :content="type == 0 ? '展开' : '折叠'"
+            :content="type == 0 ? lang.ssExpand : lang.ssFold"
             placement="top"
           >
             <img :src="require('../../assets/icon/course/menu.png')" />
@@ -114,7 +114,9 @@
 
 <script>
 import workFlowIframe from "./component/workFlowIframe.vue";
+import { myMixin } from "@/mixins/mixin.js";
 export default {
+  mixins: [myMixin],
   emits: [
     "refresh",
     "goStep",
@@ -364,7 +366,7 @@ export default {
 }
 
 .ch_content_box {
-  width: 400px;
+  width: 495px;
   height: 100%;
   border-right: 2px solid #e7e7e7;
 }

+ 10 - 7
src/components/components/answerData.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="data_body" v-resize="resize">
     <div class="title">
-      <span>答对数量</span>
-      <el-button type="primary" @click="getA()">查看学生</el-button>
+      <span>{{ lang.ssCorrectCount }}</span>
+      <el-button type="primary" @click="getA()">{{ lang.ssViewStudent }}</el-button>
     </div>
     <div style="width: 100%; height: 400px">
       <!-- <img src="../../assets/dataimage/1.png" style="width:90%" /> -->
@@ -13,7 +13,7 @@
       ></div>
     </div>
     <el-dialog
-      title="查看"
+      :title="lang.ssView"
       :visible.sync="dialogVisible"
       :append-to-body="true"
       width="900px"
@@ -22,10 +22,10 @@
     >
       <div>
         <div v-for="(item, index) in timu" :key="index" class="borderB">
-          <div class="s_title">{{ index + 1 }}</div>
+          <div class="s_title">{{ lang.ssQuestionNum.replace(/\*/g, index + 1) }}</div>
           <div class="stuBox" style="margin-top: 20px; align-items: flex-start">
             <div style="margin: 0 0 10px 0; min-width: 70px; color: #adadad;font-size:16px;">
-              答对同学:
+              {{ lang.ssCorrectStudents }}
             </div>
             <div class="stuBox" style="flex-wrap: wrap">
               <span
@@ -40,7 +40,7 @@
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="dialogVisible = false"
-          >关 闭</el-button
+          >{{ lang.ssCloseBtn }}</el-button
         >
       </span>
     </el-dialog>
@@ -48,7 +48,10 @@
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
   props: ["people"],
   data() {
     return {
@@ -65,7 +68,7 @@ export default {
       option: {
         tooltip: {
           trigger: "item",
-          formatter: "第{b0}题: 答对{c0}人",
+          formatter: this.lang.ssQuestionTooltip,
         },
         grid: {
           left: "1%",

+ 14 - 12
src/components/components/answerData2.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="data_body" v-resize="resize">
     <div class="title">
-      <span>答对数量</span>
-      <el-button type="primary" @click="getA()">查看学生</el-button>
+      <span>{{ lang.ssCorrectCount }}</span>
+      <el-button type="primary" @click="getA()">{{ lang.ssViewStudent }}</el-button>
     </div>
     <div style="width: 100%; height: 400px">
       <!-- <img src="../../assets/dataimage/1.png" style="width:90%" /> -->
@@ -10,27 +10,27 @@
     </div>
     <div class="c_box">
       <div class="correct">
-        <span>答题人数<span>{{ people.length + "人" }}</span></span>
+        <span>{{ lang.ssAnswerCount }}<span>{{ people.length }}{{ lang.ssPerson }}</span></span>
       </div>
       <div class="correct">
-        <span>全部答对人数为<span>{{
-        count+'人'
-        }}</span></span>
+        <span>{{ lang.ssTotalCorrectCount }}<span>{{
+        count
+        }}{{ lang.ssPerson }}</span></span>
       </div>
       <div class="correct">
-        <span>正确率为<span>{{
+        <span>{{ lang.ssCorrectRate }}<span>{{
         people.length > 0 ? countA(count,people) : 0
         }}</span></span>
       </div>
     </div>
-    <el-dialog title="查看" :visible.sync="dialogVisible" :append-to-body="true" width="900px" :before-close="handleClose"
+    <el-dialog :title="lang.ssView" :visible.sync="dialogVisible" :append-to-body="true" width="900px" :before-close="handleClose"
       class="dialog_diy">
       <div>
         <div v-for="(item, index) in timu" :key="index" class="borderB">
-          <div class="s_title">{{index+1}}</div>
+          <div class="s_title">{{ lang.ssQuestionNum.replace(/\*/g, index+1) }}</div>
           <div class="stuBox" style="margin-top: 20px;align-items: flex-start;">
             <div style="margin: 0 0 10px 0; min-width: 70px; color: #adadad;font-size:16px;">
-              答对同学:
+              {{ lang.ssCorrectStudents }}
             </div>
             <div class="stuBox" style="flex-wrap: wrap">
               <span class="studentClass" v-for="(pe, pi) in person[index]" :key="index + '-' + pi">{{ pe }}</span>
@@ -39,7 +39,7 @@
         </div>
       </div>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="dialogVisible = false">关 闭</el-button>
+        <el-button @click="dialogVisible = false">{{ lang.ssCloseBtn }}</el-button>
       </span>
     </el-dialog>
   </div>
@@ -47,8 +47,10 @@
 
 <script>
 import Big from 'big.js'
+import { myMixin } from "@/mixins/mixin.js"
 
 export default {
+  mixins: [myMixin],
   props: ["problemJson", "answer", "people"],
   data() {
     return {
@@ -65,7 +67,7 @@ export default {
       option: {
         tooltip: {
           trigger: "item",
-          formatter: "第{b0}题: 答对{c0}人",
+          formatter: this.lang.ssQuestionTooltip,
         },
         grid: {
           left: "1%",

+ 6 - 6
src/components/components/appStoreC.vue

@@ -25,8 +25,8 @@
             
             
             <div style="display: flex;justify-content: flex-end;padding: 0 30px;box-sizing: border-box;">
-                <el-button type="primary" style="margin-right: 20px;" size="medium" @click="handleClose">关闭</el-button>
-                <el-button type="primary" @click="uploadWork" size="medium">提交作业</el-button>
+                <el-button type="primary" style="margin-right: 20px;" size="medium" @click="handleClose">{{ lang.ssClose }}</el-button>
+                <el-button type="primary" @click="uploadWork" size="medium">{{ lang.ssSubmitWork }}</el-button>
             </div>
         </el-dialog>
     </div>
@@ -76,7 +76,7 @@ import { myMixin } from "@/mixins/mixin.js"
                 let _iframe = this.$refs.appStore;
                 console.log('sStudent',this.userId);
 
-                if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+                if (this.homeWorkLoading) return this.$message.info(this.lang.ssClickTooFast)
                 this.homeWorkLoading = true
                 // window.exposed_outputs
                 // let Cow = _iframe.contentWindow.exposed_outputs
@@ -105,7 +105,7 @@ import { myMixin } from "@/mixins/mixin.js"
                     .post(this.$store.state.api + "addCourseWorks3-2", params)
                     .then(res => {
                     this.$message({
-                        message: "提交成功",
+                        message: this.lang.ssSubmitSuccess,
                         type: "success"
                     });
                         this.dialogVisibleSelectTeacher = false;
@@ -124,7 +124,7 @@ import { myMixin } from "@/mixins/mixin.js"
                             this.homeWorkLoading = false
                         }, 500);
 
-                        this.$message.error("提交失败");
+                        this.$message.error(this.lang.ssSubmitFailed);
                         console.error(err);
                     });
             },
@@ -168,7 +168,7 @@ import { myMixin } from "@/mixins/mixin.js"
                         if (err) {
                         // var a = _this.$refs.upload1.uploadFiles;
                         // a.splice(a.length - 1, a.length);
-                        _this.$message.error("上传失败ppt数据失败");
+                        _this.$message.error(_this.lang.ssUploadPptDataFailed);
                         } else {
                         //上传成功处理
                         // _this.unitJson[_this.unitIndex].chapterInfo[0].fileList1.push({

+ 10 - 7
src/components/components/askStatic.vue

@@ -41,13 +41,13 @@
           <el-button
             type="primary"
             @click="getA(checkJson[index].checkPerson, item.checkList)"
-            >查看学生</el-button
+            >{{ lang.ssViewStudent }}</el-button
           >
         </div>
         <div class="a_add_body">
           <div class="a_add_input width100">
             <div class="a_add_persent a_add_persent_div a_add_persent_title">
-              <span>选项</span><span>小计</span><span>比例</span>
+              <span>{{ lang.ssOption }}</span><span>{{ lang.ssSubtotal }}</span><span>{{ lang.ssProportion }}</span>
             </div>
             <div class="a_add_persent">
               <div
@@ -101,7 +101,7 @@
                 class="a_add_persent_div"
                 v-if="item.answer || item.answer == 0"
               >
-                <span>正确率</span>
+                <span>{{ lang.ssCorrectRate }}</span>
                 <span>{{
                   (checkJson[index].right ? checkJson[index].right : 0) + "%"
                 }}</span>
@@ -113,7 +113,7 @@
       </div>
     </div>
     <el-dialog
-      title="查看"
+      :title="lang.ssView"
       :visible.sync="dialogVisible"
       :append-to-body="true"
       width="900px"
@@ -125,7 +125,7 @@
           <div v-html="item" class="s_title"></div>
           <div class="stuBox" style="margin-top: 20px; align-items: flex-start">
             <div style="margin: 0 0 10px 0; min-width: 70px; color: #adadad;font-size:16px;">
-              选择同学:
+              {{ lang.ssSelectStudent }}
             </div>
             <div class="stuBox" style="flex-wrap: wrap">
               <span
@@ -140,7 +140,7 @@
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="dialogVisible = false"
-          >关 闭</el-button
+          >{{ lang.ssCloseBtn }}</el-button
         >
       </span>
     </el-dialog>
@@ -148,7 +148,10 @@
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
   props: ["askJSON", "checkJson"],
   data() {
     return {
@@ -296,7 +299,7 @@ export default {
 }
 
 .a_add_persent_div span:nth-child(2) {
-  width: 7%;
+  width: 12%;
 }
 
 .a_add_persent_div span:nth-child(3) {

+ 12 - 6
src/components/components/askStatic2.vue

@@ -58,13 +58,13 @@
           <el-button
             type="primary"
             @click="getA(checkJson[index].checkPerson, item.checkList)"
-            >查看学生</el-button
+            >{{ lang.ssViewStudent }}</el-button
           >
         </div>
         <div class="a_add_body">
           <div class="a_add_input width100">
             <div class="a_add_persent a_add_persent_div a_add_persent_title">
-              <span>选项</span><span>小计</span><span>比例</span>
+              <span>{{ lang.ssOption }}</span><span>{{ lang.ssSubtotal }}</span><span>{{ lang.ssProportion }}</span>
             </div>
             <div class="a_add_persent">
               <div
@@ -133,7 +133,7 @@
                 </span>
               </div>
               <div class="a_add_persent_div">
-                <span>正确率</span>
+                <span>{{ lang.ssCorrectRate }}</span>
                 <span>{{
                   (checkJson[index].right ? checkJson[index].right : 0) + "%"
                 }}</span>
@@ -145,7 +145,7 @@
       </div>
     </div>
     <el-dialog
-      title="查看"
+      :title="lang.ssView"
       :visible.sync="dialogVisible"
       :append-to-body="true"
       width="900px"
@@ -162,7 +162,7 @@
           <div v-else v-html="item" class="s_title"></div>
           <div class="stuBox" style="margin-top: 20px; align-items: flex-start">
             <div style="margin: 0 0 10px 0; min-width: 70px; color: #adadad;font-size:16px;">
-              选择同学:
+              {{ lang.ssSelectStudent }}
             </div>
             <div class="stuBox" style="flex-wrap: wrap">
               <span
@@ -177,7 +177,7 @@
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="dialogVisible = false"
-          >关 闭</el-button
+          >{{ lang.ssCloseBtn }}</el-button
         >
       </span>
     </el-dialog>
@@ -187,7 +187,10 @@
 <script>
 import katex from 'katex'
 import 'katex/dist/katex.min.css'
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
   props: ["askJSON", "checkJson"],
   data() {
     return {
@@ -202,6 +205,9 @@ export default {
   computed: {
         renderedFormula() {
       return function(val){
+        if (this.lang.lang == 'com') {
+          return val;
+        }
         try {
            // 判断是否含有HTML标签,<tag ...>...</tag>
             const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);

+ 8 - 6
src/components/components/audio.vue

@@ -3,12 +3,12 @@
     <div>
       <el-button type="primary" :style="{ 'background': isRecord ? '#ee5255' : '', 'borderColor': isRecord ? '#ee5255' : '' }"
         @click="startRecorder()">{{
-        !isRecord ? "开始录音" : "结束录音"
+        !isRecord ? lang.ssStartRecording : lang.ssStopRecording
         }}</el-button>
       <el-button type="primary" :style="{ 'background': isPlayerRecord ? '#ee5255' : '', 'borderColor': isPlayerRecord ? '#ee5255' : '' }" @click="playRecorder()">{{
-      !isPlayerRecord ? "录音播放" : "停止播放"
+      !isPlayerRecord ? lang.ssPlayRecording : lang.ssStopPlaying
       }}</el-button>
-      <el-button type="primary" @click="getMp3Data()">上传录音</el-button>
+      <el-button type="primary" @click="getMp3Data()">{{ lang.ssUploadRecording }}</el-button>
 
       <!-- <div style="margin: 10px auto 0; display: flex; align-items: center" v-if="LuAudioUrl">
         <span>已上传录音:</span>
@@ -22,6 +22,7 @@
 
 <script>
 import Recorder from "js-audio-recorder";
+import { myMixin } from "@/mixins/mixin.js"
 const lamejs = require("lamejs");
 
 const recorder = new Recorder({
@@ -41,6 +42,7 @@ recorder.onprogress = function (params) {
   // console.log('--------------END---------------')
 };
 export default {
+  mixins: [myMixin],
   props: [],
   data() {
     return {
@@ -61,7 +63,7 @@ export default {
           (error) => {
             _this.isRecord = false;
             // _this.$message.error(`${error.name} : ${error.message}`);
-            _this.$message.error(`没有找到可使用的麦克风,或者您没有允许此网页使用麦克风`);
+            _this.$message.error(_this.lang.ssNoMicrophone);
             // 出错了
             console.log(`${error.name} : ${error.message}`);
           }
@@ -95,7 +97,7 @@ export default {
      * */
     getMp3Data() {
       if (!recorder.fileSize) {
-        this.$message.error("请录音后在上传语音");
+        this.$message.error(this.lang.ssRecordBeforeUpload);
         return;
       }
       const mp3Blob = this.convertToMp3(recorder.getWAV());
@@ -194,7 +196,7 @@ export default {
             if (err) {
               var a = _this.$refs.upload1.uploadFiles;
               a.splice(a.length - 1, a.length);
-              _this.$message.error("上传失败");
+              _this.$message.error(_this.lang.ssUploadFailed);
             } else {
               if (type == 3) {
                 _this.LuAudioUrl = data.Location;

Datei-Diff unterdrückt, da er zu groß ist
+ 156 - 153
src/components/components/choseWorksDetailDialog.vue


+ 9 - 6
src/components/components/cocoFlowDia.vue

@@ -9,7 +9,7 @@
             :before-close="handleClose">
             <div slot="title">
                 <div class="markScore_diyTit">
-                    <div>查看作业</div>
+                    <div>{{ lang.ssViewWork }}</div>
                     <img  @click="markFullScreenBtn" style="cursor: pointer;height: 16px;" src="../../assets/icon/svgImg/nrk_fullscreen.svg" alt="" />
                 </div>
             </div>
@@ -18,7 +18,7 @@
                 <template v-if="listData.length && showListData(listData)">
                     <div v-for="(item,index) in listData" :key="index">
                         <div class="BodyCon" v-if="item.imageUrls && item.imageUrls.length">
-                            <div class="BodyConTit">节点{{ index + 1}}</div>
+                            <div class="BodyConTit">{{ lang.ssNodeLabel.replace(/\*/g, index + 1) }}</div>
                             <div style="display: flex;flex-wrap: wrap;gap: 10px;">
                                 <img 
                                     style="max-width: 360px;object-fit: cover;cursor: pointer;" 
@@ -31,10 +31,10 @@
                             </div>
                         </div>
                         <div class="BodyCon" v-if="item.messages && item.messages.length" >
-                            <div class="BodyConTit">节点{{ index + 1}}</div>
+                            <div class="BodyConTit">{{ lang.ssNodeLabel.replace(/\*/g, index + 1) }}</div>
                             <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
                                 <div class="left" v-if="po.role == 'assistant'">
-                                        <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
+                                        <div class="TName" style="background-color: #0560FD;">{{ lang.ssXiaoKeAIAssistant }}</div>
                                         <div class="con" v-html="MarkdownT(po.content)"></div>
                                 </div>
 
@@ -52,7 +52,7 @@
                     align-items: center;
                     height: 100%;
                     min-height: 500px;">
-                    作业暂时只能展示对话文字哦~
+{{ lang.ssWorkOnlyShowsDialog }}
                 </div>
             </div>
             
@@ -70,7 +70,7 @@
             <div style="text-align: center;">
                 <img 
                     :src="previewImageUrl" 
-                    alt="预览图片" 
+                    :alt="lang.ssPreviewImage" 
                     style="max-width: 100%; max-height: 80vh; object-fit: contain;"
                 />
             </div>
@@ -119,7 +119,10 @@ const getFile = url => {
     // axios({
   });
 };
+import { myMixin } from "@/mixins/mixin.js"
+
     export default {
+        mixins: [ myMixin ],
         data() {
             return {
                 username:'',

+ 26 - 24
src/components/components/englishEva.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    title="英语写作"
+    :title="lang.ssEnglishWrite"
     :visible.sync="engEvaDialogVisible"
     :append-to-body="true"
     width="800px"
@@ -10,11 +10,11 @@
     <div class="engUpBox">
       <div class="engUpTop2">
         <div class="engTitle">
-          <div>作文题目:</div>
+          <div>{{ lang.ssEssayTitle }}</div>
           <div>{{ evaEngJson.teacherJson.engTitle }}</div>
         </div>
         <div class="engText">
-          <div>作文内容:</div>
+          <div>{{ lang.ssEssayContent }}</div>
           <div
             class="cont"
             v-html="evaEngJson.teacherJson.englishText"
@@ -27,8 +27,8 @@
             (courseDetail.userid == uid ||
               (courseDetail.course_teacher &&
                 courseDetail.course_teacher.indexOf(uid) != -1))
-              ? "教师评价"
-              : "查看教师评价"
+              ? lang.ssTeacherScoring
+              : lang.ssViewTeacherEvaluation
           }}
         </div>
       </div>
@@ -38,16 +38,16 @@
       >
         <div :class="type == 0 ? 'oldBox' : 'halfOldBox'">
           <div class="oldMes">
-            原文( 作者:{{ evaEngJson.message.username }}
+            {{ lang.ssOriginalAuthor.replace(/\*/g, evaEngJson.message.username) }}
           </div>
           <div class="oldText">
             <div class="detailBox">
               <div class="oldDetail">
-                <div>标题:</div>
+                <div>{{ lang.ssTitleColon }}</div>
                 <div>{{ evaEngJson.studentJson.engTitle }}</div>
               </div>
               <div class="oldDetail1">
-                <div>正文:</div>
+                <div>{{ lang.ssContentColon }}</div>
                 <div v-html="evaEngJson.studentJson.engText"></div>
               </div>
               <div
@@ -57,7 +57,7 @@
                   evaEngJson.studentJson.imgList.length > 0
                 "
               >
-                <div>图片:</div>
+                <div>{{ lang.ssImageColon }}</div>
                 <div class="oldImg">
                   <img :src="evaEngJson.studentJson.imgList[0].url" alt="" />
                 </div>
@@ -80,7 +80,7 @@
               class="allName"
               style="background: #aacaff; min-width: 100%; width: 100%"
             >
-              教师评价
+              {{ lang.ssTeacherScoring }}
             </div>
           </div>
           <div class="oldText" style="margin-top: 10px">
@@ -96,7 +96,7 @@
                   v-model="evaEngJson.teacherJson.textJson.score"
                   class="engRate"
                 ></el-rate> -->
-                <div>评分标准:</div>
+                <div>{{ lang.ssScoringCriteria }}</div>
                 <div class="setEngEva">
                   <div
                     v-for="(item, index) in evaEngJson.teacherJson.textJson
@@ -126,7 +126,7 @@
                 </div>
               </div>
               <div v-else>
-                <div>评分:</div>
+                <div>{{ lang.ssMarkScore }}:</div>
                 <div>
                   <el-input
                     v-model="startList.score"
@@ -135,7 +135,7 @@
                 </div>
               </div>
               <div class="oldDetail">
-                <div>作业评价:</div>
+                <div>{{ lang.ssHomeworkEvaluation }}</div>
                 <el-input
                   type="textarea"
                   :rows="10"
@@ -167,7 +167,7 @@
                     (courseDetail.course_teacher &&
                       courseDetail.course_teacher.indexOf(uid) != -1))
                 "
-                >AI评价</el-button
+                >{{ lang.ssAIEvaluation }}</el-button
               >
             </div>
           </div>
@@ -213,7 +213,7 @@
                   <div v-html="evaEngJson.studentJson.engText"></div>
                 </div>
                 <div class="oldDetail" style="min-width: 300px">
-                  <div>作业评价:</div>
+                  <div>{{ lang.ssHomeworkEvaluation }}</div>
                   <div v-if="!aiList.engText">暂无AI评价</div>
                   <div v-else v-html="html"></div>
                 </div>
@@ -233,7 +233,7 @@
                 <div v-html="evaEngJson.studentJson.engText"></div>
               </div>
               <div class="oldDetail">
-                <div>作业评价:</div>
+                <div>{{ lang.ssHomeworkEvaluation }}</div>
                 <el-input
                   type="textarea"
                   :rows="10"
@@ -251,15 +251,17 @@
       class="dialog-footer"
       style="z-index: 999; position: relative"
     >
-      <el-button @click="close()">取 消</el-button>
-      <el-button type="primary" @click="addCode">确 定</el-button>
+      <el-button @click="close()">{{ lang.ssCancelBtn }}</el-button>
+      <el-button type="primary" @click="addCode">{{ lang.ssConfirmBtn }}</el-button>
     </span>
   </el-dialog>
 </template>
 
 <script>
 import MarkdownIt from "markdown-it";
+import { myMixin } from "@/mixins/mixin.js";
 export default {
+  mixins: [myMixin],
   props: ["engEvaDialogVisible", "evaEngJson", "uid", "tType", "courseDetail"],
   data() {
     return {
@@ -301,17 +303,17 @@ export default {
       // let value = e.replace(/[^d]/g, ""); // 只能输入数字
       if (value == true) {
         if (e < 0) {
-          this.$message.error("请输入大于0的数值");
+          this.$message.error(this.lang.ssEnterValueGreaterThanZero);
           this.startList.score = "";
           return;
         } else if (e > 100) {
-          this.$message.error("数值不能大于100");
+          this.$message.error(this.lang.ssValueCannotExceed100);
           this.startList.score = "";
           return;
         }
       } else {
         this.startList.score = "";
-        this.$message.error("请输入数字");
+        this.$message.error(this.lang.ssPleaseEnterNumber);
         return;
       }
     },
@@ -375,7 +377,7 @@ export default {
             res.data.FunctionResponse.result &&
             res.data.FunctionResponse.result == "无效请求,请重新发起对话"
           ) {
-            this.$message.error("你的作文内容太长,无法使用Ai评价!");
+            this.$message.error(this.lang.ssEssayTooLongForAI);
             return;
           }
           this.teacherList.engText =
@@ -397,10 +399,10 @@ export default {
       this.ajax
         .get(this.$store.state.api + "addEngEva", params)
         .then((res) => {
-          this.$message.success("评价成功");
+          this.$message.success(this.lang.ssEvaluationSuccess);
         })
         .catch((err) => {
-          this.$message.error("网络不佳");
+          this.$message.error(this.lang.ssNetworkPoor);
           console.error(err);
         });
     },

+ 16 - 16
src/components/components/intelligentAnalysis/checkAi/aiLeader.vue

@@ -1263,7 +1263,7 @@ ${fileText}
           console.log("👉xxxx", _array);
           _array.forEach((i, index) => {
             let _obj = {
-              姓名: i.sName
+              [this.lang.ssStudentName]: i.sName
             };
             if ([4].includes(this.toolType)) {
               let _json = JSON.parse(i.works);
@@ -1271,9 +1271,9 @@ ${fileText}
 
               _json[0].askJson.askJson.forEach((i2, index2) => {
                 _obj[
-                  `${i2.type == "2" ? "多选题" : "单选题"}${index2 + 1}:${
+                  `${i2.type == "2" ? this.lang.ssMultiChoice : this.lang.ssSingleChoice}${index2 + 1}:${
                     i2.askstitle
-                  }(选项:${i2.checkList
+              }(${this.lang.ssOptions}${i2.checkList
                     .map((i3, index3) => `${this.optionTypeList[index3]}:${i3}`)
                     .join("、")})`
                 ] =
@@ -1284,18 +1284,18 @@ ${fileText}
                     : this.optionTypeList[_json[0].anwer[index2]];
               });
             } else if ([1, 7, 3].includes(this.toolType)) {
-              _obj["链接地址"] = i.works;
+              _obj[this.lang.ssLinkAddress] = i.works;
             } else if ([15].includes(this.toolType)) {
               let _json = JSON.parse(i.works);
-              _obj[`问题:${_json[0].answerTitle}`] = _json[0].answer.replaceAll('\n', '').replaceAll(',', ',');
+              _obj[`${this.lang.ssQuestionColon}${_json[0].answerTitle}`] = _json[0].answer.replaceAll('\n', '').replaceAll(',', ',');
             } else if ([40].includes(this.toolType)) {
               let _json = JSON.parse(i.works);
               let _testData = JSON.parse(JSON.stringify(this.testData));
               _testData.rateJson.forEach((i2, index2) => {
-                _obj[`个人评价${index2 + 1}:${i2.value.replaceAll('\n', '').replaceAll(',', ',')}(描述:${i2.detail.replaceAll('\n', '').replaceAll(',', ',')})`] =
+                _obj[`${this.lang.ssPersonalEval}${index2 + 1}:${i2.value.replaceAll('\n', '').replaceAll(',', ',')}(描述:${i2.detail.replaceAll('\n', '').replaceAll(',', ',')})`] =
                   _json.eStar[index2];
               });
-              _obj[`个人评价内容`] = _json.eBzText.replaceAll('\n', '').replaceAll(',', ',');
+              _obj[this.lang.ssPersonalEvalContent] = _json.eBzText.replaceAll('\n', '').replaceAll(',', ',');
             } else if ([41].includes(this.toolType)) {
               let selectData = i.works.split(",");
               let _text = [];
@@ -1305,14 +1305,14 @@ ${fileText}
               });
 
               // _testData.selectJson.select
-              _obj["选择匹配"] = _text.join("-");
+              _obj[this.lang.ssMatch] = _text.join("-");
             } else if ([45].includes(this.toolType)) {
               let _json = JSON.parse(i.works);
               _json[0].testJson.testJson.forEach((i2, index2) => {
                 _obj[
-                  `${i2.type == "2" ? "多选题" : "单选题"}${index2 + 1}:${
+                  `${i2.type == "2" ? this.lang.ssMultiChoice : this.lang.ssSingleChoice}${index2 + 1}:${
                     i2.teststitle.replaceAll('\n', '').replaceAll(',', ',')
-                  }(答案:${
+                  }(${this.lang.ssAnswer}${
                     typeof i2.answer == "object"
                       ? i2.answer
                           .map(i3 => `${this.optionTypeList[i3]}`)
@@ -1332,14 +1332,14 @@ ${fileText}
               let _json = JSON.parse(i.works);
               _json.forEach((i, index) => {
                 _obj[
-                  `排序${index + 1}(正确排序:${i.rightAnswer.join("、")})`
+                  `${this.lang.ssSort}${index + 1}(正确排序:${i.rightAnswer.join("、")})`
                 ] = i.chooseSenList.join("、");
               });
             } else if ([48, 52].includes(this.toolType)) {
               let _json = JSON.parse(i.works);
-              _obj["内容"] = _json.text.replaceAll('\n', '').replaceAll(',', ',');
+              _obj[this.lang.ssContentList] = _json.text.replaceAll('\n', '').replaceAll(',', ',');
             } else if ([57].includes(this.toolType)) {
-              _obj["提交内容"] = i.works;
+              _obj[this.lang.ssSubmitContent] = i.works;
             } else if ([72].includes(this.toolType)) {
               if (i.works && i.works != "undefined" && i.works != undefined) {
                 let _data = JSON.parse(i.works);
@@ -1351,13 +1351,13 @@ ${fileText}
                     }
                   });
                 });
-                _obj["聊天内容"] = _text;
+                _obj[this.lang.ssChatContent] = _text;
               }else{
-								_obj["聊天内容"] = "";
+								_obj[this.lang.ssChatContent] = "";
 							}
             }
 
-            _obj["提交时间"] = i.time;
+            _obj[this.lang.ssSubmitTime] = i.time;
             _fileData.push(_obj);
           });
 

+ 6 - 4
src/components/components/intelligentAnalysis/choseCheck/index.vue

@@ -15,15 +15,15 @@
                 '&role=' +
                 role
             }"
-            >表单管理</el-breadcrumb-item
+            >{{ lang.ssFormManagement }}</el-breadcrumb-item
           >
           <el-breadcrumb-item>
-            <span style="color: rgb(15, 126, 255)">AI分析</span>
+            <span style="color: rgb(15, 126, 255)">{{ lang.ssAIAnalysis }}</span>
           </el-breadcrumb-item>
         </el-breadcrumb>
       </div>
       <div class="cc_t_right">
-        <div class="r_pub_button_retrun" @click="back">返回</div>
+        <div class="r_pub_button_retrun" @click="back">{{ lang.ssReturn }}</div>
       </div>
     </div>
     <div class="cc_bottom" v-loading="loading ">
@@ -60,11 +60,13 @@
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
 import aiBoxRight from '../check/aiBoxRight.vue';
 import txtView from './txtView.vue';
 import csvTableView from './csvTableView.vue';
 export default {
   name: "ChoseCheck",
+	mixins: [myMixin],
 	components:{
 		aiBoxRight,
 		txtView,
@@ -192,7 +194,7 @@ export default {
                 courseid: works[i].courseid,
                 id: works[i].id,
                 userid: works[i].userid,
-                name: works[i].username ? works[i].username : '匿名',
+                name: works[i].username ? works[i].username : this.lang.ssAnonymous,
                 time: works[i].time,
                 array: _json,
                 cut:0,

+ 6 - 4
src/components/components/intelligentAnalysis/smarter.vue

@@ -11,8 +11,8 @@
                 <div class="cc_b_right">
                     <div v-if="showFileUrl" style="width: 100%;height: 100%;">
                         <div style="display: flex;">
-                            <div :class="['preview_file', { active: fileMenu === 1 }]" @click="fileMenu = 1">文件预览</div>
-                            <div :class="['bianji_file', { active: fileMenu === 2 }]" @click="fileMenu = 2">文案编辑</div>
+                            <div :class="['preview_file', { active: fileMenu === 1 }]" @click="fileMenu = 1">{{ lang.ssFilePreview }}</div>
+                            <div :class="['bianji_file', { active: fileMenu === 2 }]" @click="fileMenu = 2">{{ lang.ssContentEditing }}</div>
                         </div>
                         <div v-show="fileMenu == 1" style=" width: 100%;height: calc(100% - 40px);">
                         <!-- <div class="cc_b_r_menu">
@@ -45,6 +45,7 @@
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
 import radarZong from "./dataCom/radarZong.vue";
 import radarTeacher from "./dataCom/radarTeacher.vue";
 import aiLeader from "./checkAi/aiLeader.vue";
@@ -55,6 +56,7 @@ import Editor  from './checkAi/wangEnduit.vue';
 import htmlDocx from "html-docx-js/dist/html-docx";
 import { saveAs } from "file-saver";
 export default {
+  mixins: [myMixin],
   props:{
     worksStudent:{
       type:Array,
@@ -195,8 +197,8 @@ export default {
         async downUserAsk(){
           // console.log(this.userAsk)
           // console.log(this.userAsk)
-          await this.generateDocx("文案编辑",this.userAsk);
-          this.$message.success("下载成功")
+          await this.generateDocx(this.lang.ssContentEditing,this.userAsk);
+          this.$message.success(this.lang.ssDownloadSuccess)
         },
             // 导出docx
     async generateDocx(name, html) {

+ 18 - 15
src/components/components/onlineWrite.vue

@@ -1,11 +1,11 @@
 <template>
   <div class="engBox">
     <div class="engTitle">
-      <div>作文题目:</div>
+      <div>{{ lang.ssEssayTitle }}</div>
       <div>{{ englishList.engTitle }}</div>
     </div>
     <div class="engText">
-      <div>作文内容:</div>
+      <div>{{ lang.ssEssayContent }}</div>
       <div class="cont" v-html="englishList.englishText"></div>
     </div>
 
@@ -22,28 +22,28 @@
       </div>
     </div>
 
-    <div class="chooseUpload" @click="type = 1" v-if="type == 0">+在线编写</div>
+    <div class="chooseUpload" @click="type = 1" v-if="type == 0">+{{ lang.ssOnlineWriting }}</div>
     <div
       class="chooseUpload"
       @click="uploadDialogVisible = true"
       v-if="type == 0"
     >
-      +图片上传
+      +{{ lang.ssImageUpload }}
     </div>
 
     <div class="loadingImageText" v-if="type == 1">
       <div class="ftypeBox">
         <div class="ftypeTitle">
-          <div>标题:</div>
+          <div>{{ lang.ssTitleColon }}</div>
           <div>
             <el-input
               v-model="myAnswerList.engTitle"
-              placeholder="请填写你的作文题目"
+              :placeholder="lang.ssPleaseFillEssayTitle"
             ></el-input>
           </div>
         </div>
         <div class="ftypeText">
-          <div>正文:</div>
+          <div>{{ lang.ssContentColon }}</div>
           <div>
             <el-input
               type="textarea"
@@ -61,7 +61,7 @@
     </div>
 
     <el-dialog
-      title="图片上传"
+      :title="lang.ssImageUpload"
       :visible.sync="uploadDialogVisible"
       :append-to-body="true"
       width="30%"
@@ -75,7 +75,7 @@
       >
         <div class="up_photo2">
           <img src="../../assets/icon/plwork1.png" alt />
-          <span>点击上传文件</span>
+          <span>{{ lang.ssClickUploadFile }}</span>
         </div>
         <input
           type="file"
@@ -93,17 +93,20 @@
           <img src="../../assets/icon/english/delete.png" alt="" />
         </div>
       </div>
-      <div style="text-align: center">如已进行填写,确认后将清空内容噢。</div>
+      <div style="text-align: center">{{ lang.ssConfirmClearContent }}</div>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="checkImage">取 消</el-button>
-        <el-button type="primary" @click="uploadIsType">确定</el-button>
+        <el-button @click="checkImage">{{ lang.ssCancelBtn }}</el-button>
+        <el-button type="primary" @click="uploadIsType">{{ lang.ssConfirm }}</el-button>
       </span>
     </el-dialog>
   </div>
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
   props: ["englishList", "myAnswerList1", "userid"],
   data() {
     return {
@@ -206,7 +209,7 @@ export default {
             [file.name.split(".").length - 1].toLocaleUpperCase()
         ) == -1
       ) {
-        _this.$message.error("请上传图片!");
+        _this.$message.error(this.lang.ssPleaseUploadImage);
         return;
       }
 
@@ -241,7 +244,7 @@ export default {
             if (err) {
               var a = _this.$refs.upload1.uploadFiles;
               a.splice(a.length - 1, a.length);
-              _this.$message.error("上传失败");
+              _this.$message.error(this.lang.ssUploadFailed);
             } else {
               // _this.$message.success('上传成功')
               _this.myAnswerList.imgList.push({
@@ -326,7 +329,7 @@ ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenc
             res.data.FunctionResponse.result &&
             res.data.FunctionResponse.result == "无效请求,请重新发起对话"
           ) {
-            this.$message.error("你的作文内容太长,无法使用图片识别!");
+            this.$message.error(this.lang.ssEssayTooLongForAI);
             loading.close();
             return;
           }

+ 11 - 8
src/components/components/sortToolWorkShow.vue

@@ -1,10 +1,10 @@
 <template>
     <div style="width: 100%;" v-if="sortData.length">
         <div class="SortTool" v-for="(e,ind) in sortData" :key="ind + 'k'">
-                <el-button type="primary" @click="lookStu(ind)" class="btn" >查看学生</el-button>
+                <el-button type="primary" @click="lookStu(ind)" class="btn" >{{ lang.ssViewStudent }}</el-button>
                 <div class="tabCon">
                     <div class="con" style="width: 30%;">
-                        <div>句子</div>
+                        <div>{{ lang.ssSentence }}</div>
                         <div v-for="(i,index) in e" :key="index" style="display: flex;align-items: center;">
                             <el-tooltip class="item" effect="dark" :content="i.value.join(' ')" placement="top-start">
                              <div class="TitTimu" :style="{color:JSON.stringify(i.value) == JSON.stringify(i.trA)? '#409EFF' :'' }">{{ i.value.join(' ') }}</div>
@@ -13,11 +13,11 @@
                             <img style="height: 15px;width: 15px;margin-left: 10px;" v-if="JSON.stringify(i.value) == JSON.stringify(i.trA)" src="../../assets/right.png" alt="">
                         </div>
                         <div>
-                            正确率
+                            {{ lang.ssCorrectRate }}
                         </div>
                     </div>
                     <div class="con" style="width: 10%;">
-                        <div>小计</div>
+                        <div>{{ lang.ssSubtotal }}</div>
                         <div v-for="(i,index) in e" :key="index">
                             {{ i.count }}
                         </div>
@@ -32,7 +32,7 @@
                         
                     </div>
                     <div class="con" style="width: 60%;">
-                        <div>比例</div>
+                        <div>{{ lang.ssProportion }}</div>
                         <div v-for="(i,index) in e" :key="index">
                             <el-progress :percentage="i.pro"></el-progress>
                         </div>
@@ -41,7 +41,7 @@
             </div>
 
             <el-dialog
-                title="查看"
+                :title="lang.ssView"
                 :visible.sync="dialogVisible"
                 :append-to-body="true"
                 width="900px"
@@ -54,7 +54,7 @@
                             {{ item.sName }}:
                         </div>
                         <div style="display: flex;align-items: center;">
-                          答案:<span :style="{color:JSON.parse(item.works)[itemIndex].chooseSenList.join('') == JSON.parse(item.works)[itemIndex].rightAnswer.join('')? '#409EFF' :'' }">
+                          {{ lang.ssAnswerLabel }}<span :style="{color:JSON.parse(item.works)[itemIndex].chooseSenList.join('') == JSON.parse(item.works)[itemIndex].rightAnswer.join('')? '#409EFF' :'' }">
                                     {{ JSON.parse(item.works)[itemIndex].chooseSenList.join(' ') }}
                                 </span>
                             <img style="height: 15px;width: 15px;margin-left: 10px;" 
@@ -66,7 +66,7 @@
                 </div>
                 <span slot="footer" class="dialog-footer">
                     <el-button @click="dialogVisible = false">
-                        关 闭
+                        {{ lang.ssCloseBtn }}
                     </el-button>
                 </span>
             </el-dialog>
@@ -77,7 +77,10 @@
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
+
     export default {
+        mixins: [myMixin],
         props: ["people"],
         data(){
             return {

+ 25 - 23
src/components/components/statisticalAnalysis.vue

@@ -34,7 +34,7 @@
                 p-id="4289"
               ></path>
             </svg>
-            <span>退出</span>
+            <span>{{ lang.ssExit }}</span>
           </div>
         </div>
         <div class="s_b_bottom">
@@ -42,26 +42,26 @@
             <span
               @click="changeShowType(0)"
               :class="{ s_b_b_l_active: showType === 0 }"
-              >题目情况</span
+              >{{ lang.ssQuestionSituation }}</span
             >
             <span
               @click="changeShowType(1)"
               :class="{ s_b_b_l_active: showType === 1 }"
-              >学生汇总</span
+              >{{ lang.ssStudentSummary }}</span
             >
             <span
               @click="changeShowType(2)"
               :class="{ s_b_b_l_active: showType === 2 }"
-              >班级汇总</span
+              >{{ lang.ssClassSummary }}</span
             >
           </div>
           <div class="s_b_b_right">
             <div class="s_b_b_r_btnArea">
-              <div class="s_b_b_r_primaryBtn" @click="refresh">刷新</div>
+              <div class="s_b_b_r_primaryBtn" @click="refresh">{{ lang.ssRefresh }}</div>
             </div>
             <div class="s_b_b_r_item" v-if="showType === 0">
               <div class="itemBox">
-                <div class="ib_title">数据统计图</div>
+                <div class="ib_title">{{ lang.ssDataStatisticsChart }}</div>
                 <div
                   class="ib_echarts"
                   style="width:60%;height: 600px;min-width: 600px;"
@@ -75,7 +75,7 @@
               </div>
 
               <div class="itemBox">
-                <div class="ib_title">数据详情</div>
+                <div class="ib_title">{{ lang.ssDataDetails }}</div>
                 <el-table
                   v-if="problemSituationData.tableData.length > 0"
                   :data="problemSituationData.tableData"
@@ -97,7 +97,7 @@
                       .options"
                     width="70"
                     :key="index"
-                    :label="`选项${index + 1}`"
+                    :label="`${lang.ssOption}${index + 1}`"
                     align="center"
                   >
                     <template slot-scope="scope">
@@ -111,7 +111,7 @@
             </div>
             <div class="s_b_b_r_item" v-if="showType === 1">
               <div class="itemBox">
-                <div class="ib_title">数据统计图</div>
+                <div class="ib_title">{{ lang.ssDataStatisticsChart }}</div>
                 <div
                   class="ib_echarts"
                   style="width:60%;height: 600px;min-width: 600px;"
@@ -125,7 +125,7 @@
               </div>
 
               <div class="itemBox">
-                <div class="ib_title">数据详情</div>
+                <div class="ib_title">{{ lang.ssDataDetails }}</div>
                 <el-table
                   v-if="studentSummary.tableData.length > 0"
                   :data="studentSummary.tableData"
@@ -146,7 +146,7 @@
                     v-for="(item, index) in studentSummary.tableData[0].options"
                     width="70"
                     :key="index"
-                    :label="`选项${index + 1}`"
+                    :label="`${lang.ssOption}${index + 1}`"
                     align="center"
                   >
                     <template slot-scope="scope">
@@ -161,7 +161,7 @@
 
             <div class="s_b_b_r_item" v-if="showType === 2">
               <div class="itemBox">
-                <div class="ib_title">数据统计图</div>
+                <div class="ib_title">{{ lang.ssDataStatisticsChart }}</div>
                 <div class="ib_echarts" style="width:800px;height: 600px">
                   <eChartsView3
                     id="classSummaryData"
@@ -172,7 +172,7 @@
               </div>
 
               <div class="itemBox">
-                <div class="ib_title">数据详情</div>
+                <div class="ib_title">{{ lang.ssDataDetails }}</div>
                 <el-table
                   v-if="classSummary.tableData.length > 0"
                   :data="classSummary.tableData"
@@ -194,7 +194,7 @@
                     v-for="(item, index) in classSummary.tableData[0].options"
                     width="70"
                     :key="index"
-                    :label="`选项${index + 1}`"
+                    :label="`${lang.ssOption}${index + 1}`"
                     align="center"
                   >
                     <template slot-scope="scope">
@@ -217,7 +217,9 @@
 import eChartsView from "./eChartsView.vue";
 import eChartsView2 from "./eChartsView.vue";
 import eChartsView3 from "./eChartsView.vue";
+import { myMixin } from "@/mixins/mixin.js";
 export default {
+  mixins: [myMixin],
   props: {
     courseType: {
       type: String || Number,
@@ -380,7 +382,7 @@ export default {
           optionsLength = item.checkList.length;
         }
         let itemObj = {
-          label: `题目${index + 1}`,
+          label: this.lang.ssQuestionNumber.replace(/\*/g, index + 1),
           question: item.askTitle,
           options: []
         };
@@ -429,7 +431,7 @@ export default {
 
       let series = result.tableData[0].options.map((item, index) => {
         return {
-          name: `选项${index + 1}`,
+          name: `${this.lang.ssOption}${index + 1}`,
           type: "bar",
           stack: "total",
           barWidth: "60%",
@@ -541,7 +543,7 @@ export default {
 
       let series = result.tableData[0].options.map((item, index) => {
         return {
-          name: `选项${index + 1}`,
+          name: `${this.lang.ssOption}${index + 1}`,
           type: "bar",
           stack: "total",
           barWidth: "60%",
@@ -581,14 +583,14 @@ export default {
             {
               type: "pie",
               radius: ["40%", "70%"],
-              name: "班级汇总",
+              name: this.lang.ssClassSummary,
               avoidLabelOverlap: false,
               padAngle: 0,
               itemStyle: {
                 borderRadius: 10
               },
               label: {
-                formatter: "{b}:{c}",
+                formatter: "{b}:{c}" + this.lang.ssPerson,
                 fontSize: 30
               },
               labelLine: {
@@ -609,7 +611,7 @@ export default {
           optionsLength = item.checkList.length;
         }
         let itemObj = {
-          label: `题目${index + 1}`,
+          label: this.lang.ssQuestionNumber.replace(/\*/g, index + 1),
           question: item.askTitle,
           options: []
         };
@@ -637,8 +639,8 @@ export default {
       });
 
       let totalData = {
-        label: "总计",
-        question: "总计",
+        label: this.lang.ssTotal,
+        question: this.lang.ssTotal,
         options: new Array(optionsLength).fill(0)
       };
 
@@ -653,7 +655,7 @@ export default {
       totalData.options.forEach((item, index) => {
         let obj = {
           value: item,
-          name: `选项${index + 1}`
+          name: `${this.lang.ssOption}${index + 1}`
         };
         result.eChartsOption.series[0].data.push(obj);
       });

+ 44 - 31
src/components/components/studentWorkPreviewDialog.vue

@@ -13,8 +13,8 @@
       <div class="s_body">
         <div class="s_b_main">
           <div class="s_b_m_top">
-            <div>学生作业预览</div>
-            <span @click="close()">退出</span>
+            <div>{{ lang.ssStudentWorkPreview }}</div>
+            <span @click="close()">{{ lang.ssExit }}</span>
           </div>
           <div
             class="s_b_m_content"
@@ -39,7 +39,7 @@
 
                   <span
                     style="display: flex;align-items: center;"
-                    >{{ item.type == 1 ? "单选题:" : "多选题:"
+                    >{{ item.type == 1 ? lang.ssSingleChoiceColon : lang.ssMultipleChoiceColon
                     }}<span v-html="renderedFormula(item.teststitle)"></span> </span
                   >
                 </div>
@@ -110,12 +110,12 @@
                     justify-content: center;
                   "
                 >
-                  <div style="margin-right: 20px; font-size: 20px">标题:</div>
+                  <div style="margin-right: 20px; font-size: 20px">{{ lang.ssTitleColon }}</div>
                   <div style="font-size: 20px">{{ testData.askTitle }}</div>
                 </div>
                 <div class="a_addBox">
                   <div style="font-size: 16px; color: #c7c7c7; margin-bottom: 10px">
-                    题目内容
+                    {{ lang.ssQuestionContent }}
                   </div>
                   <div
                     class="a_add_box"
@@ -125,7 +125,7 @@
                     <div class="a_add_head">
                       <div style="display: flex">
                         <span class="askIndex"> {{ index1 + 1 }}</span>
-                        <div>题目:{{ testData.askJson[index1].askstitle }}</div>
+                        <div>{{ lang.ssQuestionColon }}{{ testData.askJson[index1].askstitle }}</div>
                       </div>
                       <img
                         v-if="testData.askJson[index1].img"
@@ -179,7 +179,7 @@
 
             <div class="s_b_m_tool15" v-if="[15].includes(tool)">
               <div class="s_b_m_ti_title">
-                <div>提问:{{ testData.answerQ }}</div>
+                <div>{{ lang.ssQuestionColon }}{{ testData.answerQ }}</div>
               </div>
 
               <div class="s_b_m_ti_answer">{{ userAnswer }}</div>
@@ -187,7 +187,7 @@
 
             <div class="s_b_m_tool41" v-if="[41].includes(tool)">
               <div class="s_b_m_t_image">
-                <img :src="testData.selectJson.url" alt="题目图片" />
+                <img :src="testData.selectJson.url" :alt="lang.ssQuestionImage" />
               </div>
               <div class="s_b_m_t_select">
                 <div
@@ -195,7 +195,7 @@
                   v-for="(item, index) in testData.selectJson.answer"
                   :key="index"
                 >
-                  <el-select v-model="userAnswer[index]" placeholder="请选择">
+                  <el-select v-model="userAnswer[index]" :placeholder="lang.ssPleaseSelect">
                     <el-option
                       v-for="(item2, index2) in testData.selectJson.select"
                       :disabled="true"
@@ -217,7 +217,7 @@
               >
                 <div class="s_b_m_ti_title">
                   <span></span>
-                  <span>{{ index + 1 }}</span>
+                  <span>{{ lang.ssQuestionNumber.replace(/\*/g, index + 1) }}</span>
                 </div>
 
                 <div class="s_s_b_m_s_rightOrError">
@@ -226,14 +226,14 @@
                       src="../../assets/icon/conSentences/right.png"
                       alt=""
                     />
-                    回答正确
+                    {{ lang.ssAnswerCorrect }}
                   </div>
                   <div v-else>
                     <img
                       src="../../assets/icon/conSentences/wrong.png"
                       alt=""
                     />
-                    回答错误
+                    {{ lang.ssAnswerWrong }}
                   </div>
                 </div>
 
@@ -245,7 +245,7 @@
 
                 <div class="s_b_m_s_sortText">
                   <div>
-                    组成句子:<span
+                    {{ lang.ssComposeSentence }}<span
                       v-for="(item2, index2) in userAnswer[index]" :key="index2"
                       >{{ item2 }}</span
                     >
@@ -275,7 +275,7 @@
               <template  v-if="JSON.parse(studentWork.works).length && showListData(JSON.parse(studentWork.works))">
                 <div v-for="(item,index) in JSON.parse(studentWork.works)" :key="index">
                   <div class="BodyCon" v-if="item.imageUrls && item.imageUrls.length">
-                      <div class="BodyConTit">节点{{ index + 1}}</div>
+                      <div class="BodyConTit">{{ lang.ssNodeLabel.replace(/\*/g, index + 1) }}</div>
                        <div style="display: flex;flex-wrap: wrap;gap: 10px;">
                             <img 
                                 style="max-width: 360px;object-fit: cover;cursor: pointer;" 
@@ -288,10 +288,10 @@
                         </div>
                   </div>  
                   <div class="BodyCon" v-if="item.messages && item.messages.length" >
-                        <div class="BodyConTit">节点{{ index + 1}}</div>
+                        <div class="BodyConTit">{{ lang.ssNodeLabel.replace(/\*/g, index + 1) }}</div>
                         <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
                             <div class="left" v-if="po.role == 'assistant'">
-                                    <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
+                                    <div class="TName" style="background-color: #0560FD;">{{ lang.ssXiaoKeAIAssistant }}</div>
                                     <div class="con" v-html="MarkdownT(po.content)"></div>
                             </div>
 
@@ -309,7 +309,7 @@
                     align-items: center;
                     height: 100%;
                     min-height: 500px;">
-                  作业暂时只能展示对话文字哦~
+                  {{ lang.ssWorkOnlyShowsDialog }}
               </div>
             </div>
           </div>
@@ -327,7 +327,7 @@
         <div style="text-align: center;">
             <img 
                 :src="previewImageUrl" 
-                alt="预览图片" 
+                :alt="lang.ssPreviewImage" 
                 style="max-width: 100%; max-height: 80vh; object-fit: contain;"
             />
         </div>
@@ -336,6 +336,7 @@
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
 import MarkdownIt from "markdown-it";
 import katex from 'katex'
 import 'katex/dist/katex.min.css'
@@ -379,63 +380,64 @@ const getFile = url => {
   });
 };
 export default {
+  mixins: [myMixin],
   components: {},
   data() {
     return {
       show: false,
       toolList: [
         {
-          label: "选择题",
+          labelKey: "ssChoice",
           value: 45,
           img: require("../../assets/icon/thirdToolList/choose.png")
         },
         {
-          label: "问卷调查",
+          labelKey: "ssSurvey",
           value: 4,
           img: require("../../assets/icon/thirdToolList/ask.png")
         },
         {
-          label: "表格",
+          labelKey: "ssTable",
           value: 48,
           img: require("../../assets/icon/fourthToolList/table.png")
         },
         {
-          label: "文档",
+          labelKey: "ssDocument",
           value: 52,
           img: require("../../assets/icon/fourthToolList/text.png")
         },
         {
-          label: "学生分组",
+          labelKey: "ssStudentGroup",
           value: 49,
           img: require("../../assets/icon/fourthToolList/group.png")
         },
         {
-          label: "电子白板",
+          labelKey: "ssWhiteboard",
           value: 1,
           img: require("../../assets/icon/secondToolList/whiteBoard.png")
         },
         {
-          label: "问答题",
+          labelKey: "ssQaQuestion",
           value: 15,
           img: require("../../assets/icon/thirdToolList/answer.png")
         },
         {
-          label: "选择匹配",
+          labelKey: "ssMatch",
           value: 41,
           img: require("../../assets/icon/thirdToolList/select.png")
         },
         {
-          label: "排序",
+          labelKey: "ssSort",
           value: 47,
           img: require("../../assets/icon/fourthToolList/conSentences.png")
         },
         {
-          label: "个人评价",
+          labelKey: "ssPersonalEval",
           value: 40,
           img: require("../../assets/icon/secondToolList/eval.png")
         },
         {
-          label: "思维网格",
+          labelKey: "ssMindGrid",
           value: 7,
           img: require("../../assets/icon/secondToolList/mindNetwork.png")
         }
@@ -449,8 +451,16 @@ export default {
 			optionTypeList:['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
 
     };
-  },
-  methods: {
+    },
+    computed: {
+      translatedToolList() {
+        return this.toolList.map(item => ({
+          ...item,
+          label: this.lang[item.labelKey]
+        }));
+      }
+    },
+    methods: {
     async open({ work, testData, testJson, tool }) {
 
       console.log('work',work);
@@ -505,6 +515,9 @@ export default {
     },
     renderedFormula() {
       return function(val){
+        if (this.lang.lang == 'com') {
+          return val;
+        }
        try {
            // 判断是否含有HTML标签,<tag ...>...</tag>
             const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);

+ 1 - 1
src/components/components/vpdf.vue

@@ -2,7 +2,7 @@
   <!--使用 pdfvuer 实现 滑动浏览 单印章-->
   <div class="pdf">
     <div class="loading" v-show="loading">
-      <span>pdf可能会加载时间有点长,请耐心等待...</span>
+      <span>{{ lang.ssPdfLoadingPleaseWait }}</span>
     </div>
     <!-- <div id="contentArea" class="show" v-if="!loading">
       <pdf :scale.sync="scale" :resize="true" ref="wrapper" class="p-pdf" :src="pdfData" v-for="i in numPages" :key="i"

+ 1 - 1
src/components/courseDetail.vue

@@ -2474,7 +2474,7 @@ export default {
         .then(res => {
           if (
             converter(res.data.FunctionResponse.result) ==
-            converter(this.lang.ssSendSuccess)
+            converter('发送成功')
           ) {
           } else {
             this.$message.warning(res.data.FunctionResponse.result);

+ 7 - 4
src/components/easy2/commpont/evaTable.vue

@@ -8,7 +8,7 @@
           stripe
           style="width: 100%"
         >
-          <el-table-column label="素养" align="center">
+          <el-table-column :label="lang.ssCompetence" align="center">
             <template slot-scope="scope">
               <div
                 style="display:flex;justify-content: center;align-items: center;"
@@ -26,7 +26,7 @@
             </template></el-table-column
           >
 
-          <el-table-column label="评价标准" align="center">
+          <el-table-column :label="lang.ssEvalStandard" align="center">
             <template slot-scope="scope"
               ><div>
                 {{ scope.row.detail != "" ? scope.row.detail : "-" }}
@@ -34,7 +34,7 @@
             >
           </el-table-column>
 
-          <el-table-column label="细则" align="center">
+          <el-table-column :label="lang.ssDetail" align="center">
             <template slot-scope="scope"
               ><div
                 style="display:flex;justify-content: space-around;margin:auto"
@@ -46,7 +46,7 @@
                     style="white-space:pre-wrap"
                   ></div>
                   <div slot="reference" style="color:#4383FF;cursor: pointer;">
-                    查看
+                    {{ lang.ssView }}
                   </div>
                 </el-popover>
               </div>
@@ -59,7 +59,10 @@
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js";
+
 export default {
+  mixins: [myMixin],
   props: ["eList"],
 //   mounted() {
 //     console.log("eList", this.eList);

Datei-Diff unterdrückt, da er zu groß ist
+ 169 - 167
src/components/easy2/studyStudent.vue


Datei-Diff unterdrückt, da er zu groß ist
+ 162 - 160
src/components/easy3/studyStudent.vue


+ 14 - 12
src/components/interVideo/index.vue

@@ -1,6 +1,6 @@
 <template>
     <div style="position: relative;">
-        <el-dialog title="交互视频" :visible.sync="dialogVisibleVideo" :append-to-body="true" width="95%"
+        <el-dialog :title="lang.ssInteractiveVideo" :visible.sync="dialogVisibleVideo" :append-to-body="true" width="95%"
             :before-close="handleClose" class="dialog_diy">
             <div v-if="dialogVisibleVideo">
                 <div class="videoBox">
@@ -8,7 +8,7 @@
                         :options="playerO" v-if="this.json.video" @timeupdate="onPlayerTimeupdate($event)"></video-player>
 										
 										<div class="chooseNodeBox">
-											<div class="chooseNodeItem" v-for="(item,index) in json.setting" @click.stop="chooseNode(item)">
+											<div class="chooseNodeItem" v-for="(item,index) in json.setting" :key="index" @click.stop="chooseNode(item)">
 												<!-- <div v-if="userChooseAnswer.find(i=>i.testJson[0].teststitle==item.tool.toolJson.testJson[0].teststitle)" class="el-icon-circle-check"></div> -->
 												<div v-if="userChooseAnswer[index]" class="el-icon-circle-check"></div>
 												<div v-else>{{ index+1 }}</div>
@@ -16,17 +16,17 @@
 										</div>
                 </div>
 								<div class="accuracy" v-if="accuracyList.length>0">
-									<span>准确率:</span>
-									<div class="accuracyItem" v-for="(item,index) in accuracyList">
-										<div class="accuracyTitle">{{ index+1 }} 题:</div>
-										<div class="accuracyValue">正确率{{item}}%</div>
+									<span>{{ lang.ssCorrectRate }}:</span>
+									<div class="accuracyItem" v-for="(item,index) in accuracyList" :key="index">
+										<div class="accuracyTitle">{{ lang.ssQuestionNum.replace(/\*/g, index + 1) }}</div>
+										<div class="accuracyValue">{{ lang.ssCorrectRate }}{{item}}%</div>
 									</div>
 								</div>
             </div>
 						
             <span slot="footer" class="dialog-footer">
-                <el-button @click="close">关 闭</el-button>
-								<el-button @click.stop="submitBtn" type="primary">确认</el-button>
+                <el-button @click="close">{{ lang.ssCloseBtn }}</el-button>
+								<el-button @click.stop="submitBtn" type="primary">{{ lang.ssConfirm }}</el-button>
             </span>
         </el-dialog>
         <choiceD 
@@ -49,9 +49,11 @@
 
 <script>
 import choiceD from '../Choice/index.vue'
+import { myMixin } from "@/mixins/mixin.js"
 
 export default {
 		emits:['success'],
+    mixins: [myMixin],
     props: {
         dialogVisibleVideo: {
             type: Boolean,
@@ -105,7 +107,7 @@ export default {
                 ],
                 // poster: require("../../assets/tu31.png"), //你的封面地址
                 // poster: dataRes.imgUrl, //你的封面地址
-                notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
+                notSupportedMessage: this.lang.ssVideoNotSupported, //允许覆盖Video.js无法播放媒体源时显示的默认信息。
                 controlBar: {
                     timeDivider: true, //当前时间和持续时间的分隔符
                     durationDisplay: true, //显示持续时间
@@ -229,7 +231,7 @@ export default {
 				},
 				submitBtn(){
 					if(this.videoType==1)return this.close();
-					if(this.userChooseAnswer<this.json.setting.length)return this.$message.info("请答题");
+					if(this.userChooseAnswer<this.json.setting.length)return this.$message.info(this.lang.ssPleaseAnswer);
 					let data = this.json;
 					data.setting.forEach((i,index)=>i.tool.toolJson = this.userChooseAnswer[index])
 					let params = [{
@@ -247,11 +249,11 @@ export default {
 					this.ajax
         	.post(this.$store.state.api + "addCourseWorks5", params)
         	.then((res) => {
-        	  this.$message.success("提交成功");
+        	  this.$message.success(this.lang.ssSubmitSuccess);
         	  this.close();
         	})
         	.catch((err) => {
-        	  this.$message.error("提交失败");
+        	  this.$message.error(this.lang.ssSubmitFailed);
         	  console.error(err);
         	});
 				},

+ 19 - 16
src/components/scoreList/scoreItem.vue

@@ -1,7 +1,7 @@
 <template>
 	<div class="scoreItem">
 		<div class="si-title"  @click="openDialog">
-			<div class="si-t-avatar"></div>
+			<div class="si-t-avatar">{{ lang.ssEvaluation }}</div>
 			<span>{{ this.data.title }}</span>
 		</div>
 		<div class="si-content"  @click="openDialog">
@@ -9,7 +9,7 @@
 		</div>
 		<div class="si-footer"  @click="openDialog">
 			<div class="si-f-time">{{isScoreList.length>0?isScoreList[0]['update_at']:''}}</div>
-			<div class="si-f-status">{{ isScoreList.length>0?"已提交":"未提交" }}</div>
+			<div class="si-f-status">{{ isScoreList.length>0?lang.ssSubmitted:lang.ssNotSubmitted }}</div>
 		</div>
 		<div v-if="showDialog == true" class="addDialogCss" v-el-drag-dialog>
       <div class="pzTop">
@@ -17,7 +17,7 @@
           <div class="teacherPzImg">
             <img src="../../assets/icon/teacherPz.png" alt="" />
           </div>
-          <div style="margin-left: 10px; height: 25px">教师评分</div>
+          <div style="margin-left: 10px; height: 25px">{{ lang.ssTeacherScoring }}</div>
         </div>
         <div @click="close">
           <img src="../../assets/close1.png" class="pzClose" alt="" />
@@ -29,8 +29,8 @@
 					<div class="step_box">
           	<div class="edit_top">
           	  <div class="op_btn">
-          	    <el-button type="primary" size="small" @click="reset">重置</el-button>
-          	    <el-button type="primary" size="small" @click="publish">提交</el-button>
+          	    <el-button type="primary" size="small" @click="reset">{{ lang.ssReset }}</el-button>
+          	    <el-button type="primary" size="small" @click="publish">{{ lang.ssSubmit }}</el-button>
           	  </div>
           	</div>
           <topicVue :cJson.sync="cJson" :title="this.data.title" :brief="brief" ref="topicVue" v-if="!loading" @publish2="publish2" :tid="tid" :gcourseid="data.groupid"></topicVue>
@@ -39,7 +39,7 @@
             @getTestWorkByCid="getTestWorkByCid" @publish2="publish2" :tid="data.typeid" :gcourseid="data.groupid"></topicVue> -->
 			 	</div>
         <div class="addTextCss" @click="submit">
-          确定
+          {{ lang.ssConfirm }}
         </div>
       </div>
     </div>
@@ -48,7 +48,10 @@
 
 <script>
 import topicVue from "./commpont/topic.vue";
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
 	components:{
 		topicVue
 	},
@@ -133,22 +136,22 @@ export default {
       this.ajax
         .post(this.$store.state.api + ((this.tid) ? "addTestWorks2" : "addTestWorks"), params)
         .then((res) => {
-          this.$message.success('保存成功')
+          this.$message.success(this.lang.ssSaveSuccess)
           setTimeout(() => {
             this.loading = false
           }, 500);
         })
         .catch((err) => {
-          this.$message.error("网络不佳");
+          this.$message.error(this.lang.ssNetworkPoor);
           this.loading = false
           console.error(err);
         });
     },
 		reset(){
 			this
-        .$confirm("是否将已经填写的内容重置?", "提示", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
+        .$confirm(this.lang.ssConfirmResetContent, this.lang.ssPrompt, {
+          confirmButtonText: this.lang.ssConfirm,
+          cancelButtonText: this.lang.ssCancel,
           type: "warning",
         })
         .then(() => {
@@ -161,7 +164,7 @@ export default {
             //   this.cJson = JSON.parse(JSON.stringify(this.cJson2));
             // }
 						this.cJson = this.data.chapters?JSON.parse(this.data.chapters):[];
-						this.$message.success('重置成功')
+						this.$message.success(this.lang.ssResetCompleted)
             this.loading = true
             this.isReset = false
             setTimeout(() => {
@@ -206,12 +209,12 @@ export default {
       this.ajax
         .post(this.$store.state.api + "addTestWorks", params)
         .then((res) => {
-          this.$message.success('保存成功')
+          this.$message.success(this.lang.ssSaveSuccess)
 					this.showDialog = false;
 					this.$emit("refresh")
         })
         .catch((err) => {
-          this.$message.error("网络不佳");
+          this.$message.error(this.lang.ssNetworkPoor);
           console.error(err);
         });
     },
@@ -228,12 +231,12 @@ export default {
       this.ajax
         .post(this.$store.state.api + ((this.tid) ? "addTestWorks2" : "addTestWorks"), params)
         .then((res) => {
-          this.$message.success('提交成功')
+          this.$message.success(this.lang.ssSubmitSuccess)
           this.showDialog = false;
 					this.$emit("refresh")
         })
         .catch((err) => {
-          this.$message.error("网络不佳");
+          this.$message.error(this.lang.ssNetworkPoor);
           console.error(err);
         });
     },

+ 57 - 51
src/components/scoreZong/get.vue

@@ -1,20 +1,23 @@
 <template>
     <div class="sz_body" v-loading="loading">
-        <div @click="exportExcel" v-show="false">导出</div>
-        <div style="font-size: 18px;margin-bottom: 20px;">评分人数:<span class="color">{{ num }}</span>人 总平均分:<span
+        <div @click="exportExcel" v-show="false">{{ lang.ssExport }}</div>
+        <div style="font-size: 18px;margin-bottom: 20px;">{{ lang.ssScoringCount }}:<span class="color">{{ num }}</span>{{ lang.ssPerson }} {{ lang.ssTotalAverageScore }}:<span
                 class="color">{{ num ? score ? (score / num).toFixed(1) : 0 : 0 }}</span></div>
         <div class="test_box" v-for="(item, index) in testList" :key="index">
             <div class="testTitle">{{ item.title }}</div>
-            <div class="testContent" v-if="item.type == '1'" v-for="(item2, index2) in item.array"
-                :key="index + '-' + index2">
-                <div class="testContent_title">{{ index2 + 1 }}、{{ item2.title }}</div>
-                <div class="testContent_input">
-                    <!-- <el-input v-model="item2.uscore" class="c_input" @change="numberPan(index, index2, item2.score)"
-                        placeholder="请输入评分" /> -->
-                    <span>平均分:</span>
-                    <span class="color">{{ num ? item2.uscore ? (item2.uscore / num).toFixed(2) : 0 : 0 }}</span>
+            <template v-for="(item2, index2) in item.array">
+                <div class="testContent" v-if="item.type == '1'" 
+                    :key="index + '-' + index2">
+                    <div class="testContent_title">{{ index2 + 1 }}、{{ item2.title }}</div>
+                    <div class="testContent_input">
+                        <!-- <el-input v-model="item2.uscore" class="c_input" @change="numberPan(index, index2, item2.score)"
+                            placeholder="请输入评分" /> -->
+                        <span>{{ lang.ssAverageScore }}:</span>
+                        <span class="color">{{ num ? item2.uscore ? (item2.uscore / num).toFixed(2) : 0 : 0 }}</span>
+                    </div>
                 </div>
-            </div>
+            </template>
+            
             <div v-if="item.type == '2'">
                 <div class="test_ping" v-for="(answer, index2) in item.answerArray" :key="index + '-' + index2">
                     <span style="    min-width: fit-content;">{{ index2 + 1 }}.</span>
@@ -26,7 +29,10 @@
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+    mixins: [ myMixin ],
     props: {
         courseid: {
             type: String,
@@ -42,116 +48,116 @@ export default {
             userid:"",
             testList: [
                 {
-                    title: '教学目标(5分)',
+                    title: this.lang.ssTeachingObjectives,
                     type: '1',
                     array: [
                         {
-                            title: '目标结构完整,能够清晰地表达学生的学习过程与预期成果。目标符合学情,具有可行性与逻辑递进性。目标体现学生本位与素养导向,不单纯停留在知识与技能层面。',
+                            title: this.lang.ssTeachingObjectivesDesc,
                             score: 5,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学内容(5分)',
+                    title: this.lang.ssTeachingContent,
                     type: '1',
                     array: [
                         {
-                            title: '重难点突出,符合课标与教材要求,不超纲。符合学情特点,贴近学生生活,体现积极向上的育人价值观。关注学生学习的最近发展区,有意识地展现因材施教的意图。',
+                            title: this.lang.ssTeachingContentDesc,
                             score: 5,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学过程(30分)',
+                    title: this.lang.ssTeachingProcess,
                     type: '1',
                     array: [
                         {
-                            title: '课堂结构合理、紧密,层次清楚,突出重难点的解决。(10分)',
+                            title: this.lang.ssTeachingProcessStructure,
                             score: 10,
                             uscore: 0,
                         },
                         {
-                            title: '强调“学”的活动设计,教与学有机结合。(10分)',
+                            title: this.lang.ssTeachingProcessLearning,
                             score: 10,
                             uscore: 0,
                         },
                         {
-                            title: '课堂管理有序,教学语言清晰准确,能及时、合理地解决课堂问题,体现良好的教学素养。(10分)',
+                            title: this.lang.ssTeachingProcessManagement,
                             score: 10,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学方法与策略(20分)',
+                    title: this.lang.ssTeachingMethods,
                     type: '1',
                     array: [
                         {
-                            title: '符合教学内容与学科特点。落实有效,能体现出学生的学习成效,不流于形式。具有一定的新意,展现教师的独立思考与探究意识。',
+                            title: this.lang.ssTeachingMethodsDesc,
                             score: 20,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学工具(15分)',
+                    title: this.lang.ssTeachingTools,
                     type: '1',
                     array: [
                         {
-                            title: '合理、科学地使用信息化技术、学习单、自制教学道具、辅助性资源等教学工具。',
+                            title: this.lang.ssTeachingToolsDesc,
                             score: 15,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学评价(10分)',
+                    title: this.lang.ssTeachingEvaluation,
                     type: '1',
                     array: [
                         {
-                            title: '重视评价,有合理的评价手段与工具。评价落实有效,体现针对性和专业性。',
+                            title: this.lang.ssTeachingEvaluationDesc,
                             score: 10,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '创新意识(10分)',
+                    title: this.lang.ssInnovation,
                     type: '1',
                     array: [
                         {
-                            title: '教学空间的选择、布置有独特想法,且合理有效。敢于尝试多样化的教学形式,如主题式、大单元、项目式、游戏化等。开发特色有效的教学策略与手段,如小组合作探究、跨学科展演等,教师特色鲜明。',
+                            title: this.lang.ssInnovationDesc,
                             score: 10,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学效果(5分)',
+                    title: this.lang.ssTeachingEffect,
                     type: '1',
                     array: [
                         {
-                            title: '达成目标,整个过程有资源的生成。学习过程中学生有满足、成功与喜悦等体验,对后续学习更有信心,能力得到发展。',
+                            title: this.lang.ssTeachingEffectDesc,
                             score: 5,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '加分项(10分)',
+                    title: this.lang.ssBonusPoints,
                     type: '1',
                     array: [
                         {
-                            title: '某项优点特别突出,如教学风貌、教学理念、教学特色、教学手段等。',
+                            title: this.lang.ssBonusPointsDesc,
                             score: 10,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '评语',
+                    title: this.lang.ssComments,
                     type: '2',
                     answer: '',
                     answerArray: [],
@@ -178,21 +184,21 @@ export default {
                 var array = [];
                 for (var i = 0; i < res.length; i++) {
                     var _json = {};
-                    _json["序号"] = i+1;
-                    _json["姓名"] = res[i].username;
-                    _json["教学目标(5分)"] = res[i]['test00'];
-                    _json["教学内容(5分)"] = res[i]['test10'];
-                    _json["教学过程-1课程结构(10分)"] = res[i]['test20'];
-                    _json["教学过程-2活动设计(10分)"] = res[i]['test21'];
-                    _json["教学过程-3秩序管理(10分)"] = res[i]['test22'];
-                    _json["教学方法与策略(20分)"] = res[i]['test30'];
-                    _json["教学工具(15分)"] = res[i]['test40'];
-                    _json["教学评价(10分)"] = res[i]['test50'];
-                    _json["创新意识(10分)"] = res[i]['test60'];
-                    _json["教学效果(5分)"] = res[i]['test70'];
-                    _json["加分项(10分)"] = res[i]['test80'];
-                    _json["总分(110分)"] = res[i]['sum'];
-                    _json["评语"] = res[i]['ping'];
+                    _json[this.lang.ssSerialNumber] = i+1;
+                    _json[this.lang.ssName] = res[i].username;
+                    _json[this.lang.ssTeachingObjectives] = res[i]['test00'];
+                    _json[this.lang.ssTeachingContent] = res[i]['test10'];
+                    _json[this.lang.ssTeachingProcess + "-1" + this.lang.ssCourseStructure] = res[i]['test20'];
+                    _json[this.lang.ssTeachingProcess + "-2" + this.lang.ssActivityDesign] = res[i]['test21'];
+                    _json[this.lang.ssTeachingProcess + "-3" + this.lang.ssOrderManagement] = res[i]['test22'];
+                    _json[this.lang.ssTeachingMethods] = res[i]['test30'];
+                    _json[this.lang.ssTeachingTools] = res[i]['test40'];
+                    _json[this.lang.ssTeachingEvaluation] = res[i]['test50'];
+                    _json[this.lang.ssInnovation] = res[i]['test60'];
+                    _json[this.lang.ssTeachingEffect] = res[i]['test70'];
+                    _json[this.lang.ssBonusPoints] = res[i]['test80'];
+                    _json[this.lang.ssTotalScore] = res[i]['sum'];
+                    _json[this.lang.ssComments] = res[i]['ping'];
                     array.push(_json);
                 }
 
@@ -211,7 +217,7 @@ export default {
                 // const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
                 // FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} demo.xlsx`);//保存文件
                 this.$message({
-                    message: "导出成功",
+                    message: this.lang.ssExportSuccess,
                     type: "success",
                 });
 
@@ -222,11 +228,11 @@ export default {
         numberPan(index, index2, score) {
             let _score = this.testList[index].array[index2].uscore
             if (/[^\d]/.test(_score) || _score < 0) {
-                this.$message.error('请输入大于0的整数')
+                this.$message.error(this.lang.ssEnterPositiveInteger)
                 this.testList[index].array[index2].uscore = 0
             }
             if (parseInt(_score) > parseInt(score)) {
-                this.$message.error('不能输入大于得分的整数')
+                this.$message.error(this.lang.ssCannotEnterScoreAbove)
                 this.testList[index].array[index2].uscore = score
             }
             this.$forceUpdate();
@@ -244,7 +250,7 @@ export default {
                 .then((res) => {
                     console.log(res.data);
                     this.$message({
-                        message: "添加成功",
+                        message: this.lang.ssAddSuccess,
                         type: "success",
                     });
                     this.getList();

+ 41 - 35
src/components/scoreZong/index.vue

@@ -2,30 +2,36 @@
     <div class="sz_body" v-loading="loading" style="position: unset !important;">
         <div class="test_box" v-for="(item, index) in testList" :key="index">
             <div class="testTitle">{{ item.title }}</div>
-            <div class="testContent" v-if="item.type == '1'" v-for="(item2, index2) in item.array"
-                :key="index + '-' + index2">
-                <div class="testContent_title">{{ index2 + 1 }}、{{ item2.title }}</div>
-                <div class="testContent_input">
-                    <!-- <el-input v-model="item2.uscore" class="c_input" @change="numberPan(index, index2, item2.score)"
-                        placeholder="请输入评分" /> -->
-                    <el-rate v-model="item2.uscore" :allow-half="false" class="custom-rate"></el-rate>
-                    
+            <template v-for="(item2, index2) in item.array">
+                <div class="testContent" v-if="item.type == '1'" 
+                    :key="index + '-' + index2">
+                    <div class="testContent_title">{{ index2 + 1 }}、{{ item2.title }}</div>
+                    <div class="testContent_input">
+                        <!-- <el-input v-model="item2.uscore" class="c_input" @change="numberPan(index, index2, item2.score)"
+                            placeholder="请输入评分" /> -->
+                        <el-rate v-model="item2.uscore" :allow-half="false" class="custom-rate"></el-rate>
+                        
+                    </div>
                 </div>
-            </div>
+            </template>
+            
             <div v-if="item.type == '2'">
                 <textarea rows="8" class="binfo_input binfo_textarea" cols v-model="item.answer"
-                    placeholder="你还有哪些补充"></textarea>
+                    :placeholder="lang.ssAnyMoreSupplements"></textarea>
             </div>
         </div>
         <div class="btn">
-            <el-button type="primary" size="default" @click="confirm">提交</el-button>
+            <el-button type="primary" size="default" @click="confirm">{{ lang.ssSubmit }}</el-button>
 
         </div>
     </div>
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
     props: {
         courseid: {
             type: String,
@@ -40,116 +46,116 @@ export default {
         return {
             testList: [
                 {
-                    title: '教学目标(5分)',
+                    title: this.lang.ssTeachingObjectives,
                     type: '1',
                     array: [
                         {
-                            title: '目标结构完整,能够清晰地表达学生的学习过程与预期成果。目标符合学情,具有可行性与逻辑递进性。目标体现学生本位与素养导向,不单纯停留在知识与技能层面。',
+                            title: this.lang.ssTeachingObjectivesDesc,
                             score: 5,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学内容(5分)',
+                    title: this.lang.ssTeachingContent,
                     type: '1',
                     array: [
                         {
-                            title: '重难点突出,符合课标与教材要求,不超纲。符合学情特点,贴近学生生活,体现积极向上的育人价值观。关注学生学习的最近发展区,有意识地展现因材施教的意图。',
+                            title: this.lang.ssTeachingContentDesc,
                             score: 5,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学过程(30分)',
+                    title: this.lang.ssTeachingProcess,
                     type: '1',
                     array: [
                         {
-                            title: '课堂结构合理、紧密,层次清楚,突出重难点的解决。(10分)',
+                            title: this.lang.ssTeachingProcessStructure,
                             score: 10,
                             uscore: 0,
                         },
                         {
-                            title: '强调“学”的活动设计,教与学有机结合。(10分)',
+                            title: this.lang.ssTeachingProcessLearning,
                             score: 10,
                             uscore: 0,
                         },
                         {
-                            title: '课堂管理有序,教学语言清晰准确,能及时、合理地解决课堂问题,体现良好的教学素养。(10分)',
+                            title: this.lang.ssTeachingProcessManagement,
                             score: 10,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学方法与策略(20分)',
+                    title: this.lang.ssTeachingMethods,
                     type: '1',
                     array: [
                         {
-                            title: '符合教学内容与学科特点。落实有效,能体现出学生的学习成效,不流于形式。具有一定的新意,展现教师的独立思考与探究意识。',
+                            title: this.lang.ssTeachingMethodsDesc,
                             score: 20,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学工具(15分)',
+                    title: this.lang.ssTeachingTools,
                     type: '1',
                     array: [
                         {
-                            title: '合理、科学地使用信息化技术、学习单、自制教学道具、辅助性资源等教学工具。',
+                            title: this.lang.ssTeachingToolsDesc,
                             score: 15,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学评价(10分)',
+                    title: this.lang.ssTeachingEvaluation,
                     type: '1',
                     array: [
                         {
-                            title: '重视评价,有合理的评价手段与工具。评价落实有效,体现针对性和专业性。',
+                            title: this.lang.ssTeachingEvaluationDesc,
                             score: 10,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '创新意识(10分)',
+                    title: this.lang.ssInnovation,
                     type: '1',
                     array: [
                         {
-                            title: '教学空间的选择、布置有独特想法,且合理有效。敢于尝试多样化的教学形式,如主题式、大单元、项目式、游戏化等。开发特色有效的教学策略与手段,如小组合作探究、跨学科展演等,教师特色鲜明。',
+                            title: this.lang.ssInnovationDesc,
                             score: 10,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '教学效果(5分)',
+                    title: this.lang.ssTeachingEffect,
                     type: '1',
                     array: [
                         {
-                            title: '达成目标,整个过程有资源的生成。学习过程中学生有满足、成功与喜悦等体验,对后续学习更有信心,能力得到发展。',
+                            title: this.lang.ssTeachingEffectDesc,
                             score: 5,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '加分项(10分)',
+                    title: this.lang.ssBonusPoints,
                     type: '1',
                     array: [
                         {
-                            title: '某项优点特别突出,如教学风貌、教学理念、教学特色、教学手段等。',
+                            title: this.lang.ssBonusPointsDesc,
                             score: 10,
                             uscore: 0,
                         }
                     ],
                 },
                 {
-                    title: '评语',
+                    title: this.lang.ssComments,
                     type: '2',
                     answer: ''
                 },
@@ -164,11 +170,11 @@ export default {
         numberPan(index, index2, score) {
             let _score = this.testList[index].array[index2].uscore
             if (/[^\d]/.test(_score) || _score < 0) {
-                this.$message.error('请输入大于0的整数')
+                this.$message.error(this.lang.ssEnterPositiveInteger)
                 this.testList[index].array[index2].uscore = 0
             }
             if (parseInt(_score) > parseInt(score)) {
-                this.$message.error('不能输入大于得分的整数')
+                this.$message.error(this.lang.ssCannotEnterScoreAbove)
                 this.testList[index].array[index2].uscore = score
             }
             this.$forceUpdate();
@@ -186,7 +192,7 @@ export default {
                 .then((res) => {
                     console.log(res.data);
                     this.$message({
-                        message: "添加成功",
+                        message: this.lang.ssAddSuccess,
                         type: "success",
                     });
                     this.getList();

Datei-Diff unterdrückt, da er zu groß ist
+ 163 - 161
src/components/studyStudent.vue


Datei-Diff unterdrückt, da er zu groß ist
+ 166 - 164
src/components/studySutdentClass/studyStudent.vue


+ 56 - 49
src/components/tools/imgDraw/imgDraw.vue

@@ -39,15 +39,15 @@
               <span>{{ item.name }}</span>
             </button>
           </div>
-          <div class="tool_item" v-for="item in btns" :key="item.icon">
-            <button @click.stop="item.fun" v-if="item.name == '上一步'" :disabled="prevDis"
+          <div class="tool_item" v-for="item in btnsConfig" :key="item.icon">
+            <button @click.stop="item.fun" v-if="item.name == lang.ssPrevious" :disabled="prevDis"
               :style="prevDis ? 'cursor:not-allowed' : ''">
               <svg class="icon" aria-hidden="true">
                 <use :xlink:href="item.icon" />
               </svg>
               <span>{{ item.name }}</span>
             </button>
-            <button @click.stop="item.fun" v-else-if="item.name == '下一步'" :disabled="nextDis"
+            <button @click.stop="item.fun" v-else-if="item.name == lang.ssNext" :disabled="nextDis"
               :style="nextDis ? 'cursor:not-allowed' : ''">
               <svg class="icon" aria-hidden="true">
                 <use :xlink:href="item.icon" />
@@ -64,17 +64,17 @@
           <div class="tool_item go_up">
             <button @click.stop="handleShowOrHide(0)">
               <i class="el-icon-caret-top"></i>
-              <span>收起</span>
+              <span>{{ lang.ssCollapseText }}</span>
             </button>
           </div>
           <div class="pull" v-if="!isExpand">
             <span class="line"></span>
-            <span class="round" title="展开" @click.stop="handleShowOrHide(1)"></span>
+            <span class="round" :title="lang.ssExpandText" @click.stop="handleShowOrHide(1)"></span>
           </div>
         </div>
         <div :class="['tools', 'bars', showTools ? '' : 'hideTools']">
-          <div class="el-icon-s-tools arrow" v-if="!showTools" title="展开" @click.stop="handleShowTools(1)"></div>
-          <div class="el-icon-arrow-right arrow" v-else title="收起" @click.stop="handleShowTools(0)"></div>
+          <div class="el-icon-s-tools arrow" v-if="!showTools" :title="lang.ssExpandText" @click.stop="handleShowTools(1)"></div>
+          <div class="el-icon-arrow-right arrow" v-else :title="lang.ssCollapseText" @click.stop="handleShowTools(0)"></div>
           <div :class="[
             'tool_item',
             activeTool == item.toolType ? 'activeTool' : '',
@@ -95,7 +95,10 @@
 import cursors from "./cursor";
 import "../../../assets/drawIcon/iconfont";
 import bgA from "./img";
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
   name: "imgDraw",
   props: {
     drawShow: {
@@ -118,24 +121,24 @@ export default {
       settings: [
         {
           icon: "#icon-youqitong_huaban1",
-          name: "颜色",
+          name: this.lang ? this.lang.ssColor : "颜色",
           fun: "",
         },
         {
           icon: "#icon-huabi_huaban1",
-          name: "粗细",
+          name: this.lang ? this.lang.ssThickness : "粗细",
           fun: "",
         },
         {
           icon: "#icon-fangda_huaban1",
-          name: "放大",
+          name: this.lang ? this.lang.ssZoomIn : "放大",
           fun: () => {
             return this.handleBeLarge();
           },
         },
         {
           icon: "#icon-suoxiao_huaban1",
-          name: "缩小",
+          name: this.lang ? this.lang.ssZoomOut : "缩小",
           fun: () => {
             return this.handleBeSmall();
           },
@@ -145,7 +148,7 @@ export default {
       tools: [
         {
           icon: "#icon-huabi_huaban1",
-          name: "画笔",
+          name: this.lang ? this.lang.ssBrush : "画笔",
           toolType: 1,
         },
         // {
@@ -170,28 +173,55 @@ export default {
         // },
         {
           icon: "#icon-wenzi_huaban1",
-          name: "文字",
+          name: this.lang ? this.lang.ssText : "文字",
           toolType: 6,
         },
       ],
-      btns: [
+      canvas_front: null,
+      canvas_back: null,
+      canvas_base: null,
+      ctx_base: null,
+      ctx_front: null,
+      ctx_back: null,
+      currentImg: {
+        url: "",
+        width: "",
+        height: "",
+        scale: 1,
+        index: 0,
+      },
+      isExpand: 1,
+      showTools: 1,
+      canDraw: false,
+      text: "",
+      canvasStore: [""],
+      prevDis: true,
+      nextDis: true,
+      baseMap: "",
+      tl: 0,
+      tt: 0,
+    };
+  },
+  computed: {
+    btnsConfig() {
+      return [
         {
           icon: "#icon-chexiao",
-          name: "上一步",
+          name: this.lang ? this.lang.ssPrevious : "上一步",
           fun: () => {
             return this.handlePrev();
           },
         },
         {
           icon: "#icon-zhongzuo",
-          name: "下一步",
+          name: this.lang ? this.lang.ssNext : "下一步",
           fun: () => {
             return this.handleNext();
           },
         },
         {
           icon: "#icon-lajixiang_huaban1",
-          name: "清除",
+          name: this.lang ? this.lang.ssClear : "清除",
           fun: () => {
             return this.handleClearCanvas();
           },
@@ -199,7 +229,7 @@ export default {
         {
           // icon: "#icon-baocun",
           icon: "",
-          name: "关闭",
+          name: this.lang ? this.lang.ssClose : "关闭",
           fun: () => {
             // return this.handleCanvas2Img();
             // return (this.show = false);
@@ -208,36 +238,13 @@ export default {
         },
         {
           icon: "",
-          name: "保存批注",
+          name: this.lang ? this.lang.ssSaveAnnotation : "保存批注",
           fun: () => {
             return this.handleSave();
           },
         },
-      ],
-      canvas_front: null,
-      canvas_back: null,
-      canvas_base: null,
-      ctx_base: null,
-      ctx_front: null,
-      ctx_back: null,
-      currentImg: {
-        url: "",
-        width: "",
-        height: "",
-        scale: 1,
-        index: 0,
-      },
-      isExpand: 1,
-      showTools: 1,
-      canDraw: false,
-      text: "",
-      canvasStore: [""],
-      prevDis: true,
-      nextDis: true,
-      baseMap: "",
-      tl: 0,
-      tt: 0,
-    };
+      ];
+    },
   },
   methods: {
     /** 显示或隐藏设置栏*/
@@ -755,16 +762,16 @@ export default {
         this.tools = [
           {
             icon: "#icon-zhixian_huaban1",
-            name: "移动",
+            name: this.lang ? this.lang.ssMove : "移动",
             toolType: 0,
           }, {
             icon: "#icon-huabi_huaban1",
-            name: "画笔",
+            name: this.lang ? this.lang.ssBrush : "画笔",
             toolType: 1,
           },
           {
             icon: "#icon-wenzi_huaban1",
-            name: "文字",
+            name: this.lang ? this.lang.ssText : "文字",
             toolType: 6,
           },
         ]
@@ -773,12 +780,12 @@ export default {
 
         this.tools = [{
           icon: "#icon-huabi_huaban1",
-          name: "画笔",
+          name: this.lang ? this.lang.ssBrush : "画笔",
           toolType: 1,
         },
         {
           icon: "#icon-wenzi_huaban1",
-          name: "文字",
+          name: this.lang ? this.lang.ssText : "文字",
           toolType: 6,
         },
         ]

+ 15 - 12
src/components/tools/jsmind.vue

@@ -114,7 +114,10 @@ window.jsMind = jsMind;
 
 require("jsmind/js/jsmind.draggable.js");
 require("jsmind/js/jsmind.screenshot.js");
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
   props: {
     showBar: {
       // 是否显示工具栏,显示启用编辑
@@ -146,11 +149,11 @@ export default {
       isZoomOut: false,
       level: 0,
       nodeOptions: [
-        { value: 1, label: "展开到一级节点" },
-        { value: 2, label: "展开到二级节点" },
-        { value: 3, label: "展开到三级节点" },
-        { value: 0, label: "展开全部节点" },
-        { value: -1, label: "隐藏全部节点" },
+        { value: 1, label: this.lang.ssExpandToLevel1 },
+        { value: 2, label: this.lang.ssExpandToLevel2 },
+        { value: 3, label: this.lang.ssExpandToLevel3 },
+        { value: 0, label: this.lang.ssExpandAll },
+        { value: -1, label: this.lang.ssCollapseAll },
       ],
       themeOptions: [
         { value: "default", label: "default" },
@@ -213,13 +216,13 @@ export default {
           const mind = jsMind.util.json.string2json(jsmindData);
           if (mind) {
             this.jm.show(mind);
-            this.$message({ type: "success", message: "打开成功" });
+            this.$message({ type: "success", message: this.lang.ssOpenSuccess });
           } else {
-            this.prompt_info("不能打开mindmap文件");
+            this.prompt_info(this.lang.ssCannotOpenMindmap);
           }
         });
       } else {
-        this.prompt_info("请先选择文件");
+        this.prompt_info(this.lang.ssPleaseSelectFile);
         return false;
       }
     },
@@ -364,7 +367,7 @@ export default {
     addNode() {
       let selectedNode = this.jm.get_selected_node();
       if (!selectedNode) {
-        this.$message({ type: "warning", message: "请先选择一个节点!" });
+        this.$message({ type: "warning", message: this.lang.ssPleaseSelectNode });
         return;
       }
       let nodeid = jsMind.util.uuid.newid();
@@ -380,12 +383,12 @@ export default {
     addBrotherNode() {
       let selectedNode = this.jm.get_selected_node();
       if (!selectedNode) {
-        this.$message({ type: "warning", message: "请先选择一个节点!" });
+        this.$message({ type: "warning", message: this.lang.ssPleaseSelectNode });
         return;
       } else if (selectedNode.isroot) {
         this.$message({
           type: "warning",
-          message: "不能在根节点添加,请重新选择节点!",
+          message: this.lang.ssCannotAddRoot,
         });
         return;
       }
@@ -424,7 +427,7 @@ export default {
     editNode() {
       let selectedId = this.get_selected_nodeid();
       if (!selectedId) {
-        this.$message({ type: "warning", message: "请先选择一个节点!" });
+        this.$message({ type: "warning", message: this.lang.ssPleaseSelectNode });
         return;
       }
       let nodeObj = this.jm.get_node(selectedId);

+ 6 - 2
src/components/tools/table.vue

@@ -11,9 +11,11 @@
 import E from "wangeditor";
 import "../../common/aws-sdk-2.235.1.min";
 import { Loading } from 'element-ui';
+import { myMixin } from "@/mixins/mixin.js"
 // import 'wangeditor/release/wangEditor.min.css'
 export default {
   name: "editoritem",
+  mixins: [myMixin],
   data() {
     return {
       // uploadPath,
@@ -36,7 +38,9 @@ export default {
     },
     placeholder: {
       type: String,
-      default: "请输入正文"
+      default: function() {
+        return this.lang ? this.lang.ssEnterContent : "请输入正文";
+      }
     }
   },
   watch: {
@@ -140,7 +144,7 @@ export default {
               .send(function (err, data) {
                 loading.close();
                 if (err) {
-                  that.$message.error("上传失败");
+                  that.$message.error(that.lang.ssUploadFailed);
                 } else {
                   //上传成功处理
                   insert(data.Location);

+ 5 - 2
src/components/tools/time.vue

@@ -63,12 +63,15 @@
         @click="pauseTimer"
       ></button>
     </div>
-    <el-button type="primary" @click="reset" class="reset_btn">重置</el-button>
+    <el-button type="primary" @click="reset" class="reset_btn">{{ lang.ssReset }}</el-button>
   </div>
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
   props: ["preTime"],
   data() {
     return {
@@ -145,7 +148,7 @@ export default {
           //   btn.style.opacity = 1;
           // });
           _this.displayTimeLeft(_this.wholeTime);
-          _this.$message.success("时间到!!!");
+          _this.$message.success(_this.lang.ssTimeUp);
           // pauseBtn.classList.remove("pause");
           // pauseBtn.classList.add("play");
           return;

+ 6 - 4
src/components/tools/wangEnduit.vue

@@ -53,6 +53,12 @@ export default {
   mounted() {
     this.seteditor();
     this.editor.txt.html(this.value);
+    // 设置CSS变量用于国际化
+    this.$nextTick(() => {
+      const style = document.createElement('style');
+      style.textContent = `.editor >>> .w-e-icon-table2::after { content: "${this.$lang.ssInsertTable}"; }`;
+      document.head.appendChild(style);
+    });
   },
   methods: {
     seteditor() {
@@ -199,10 +205,6 @@ export default {
   background: #f1f1f1;
 }
 
-.editor >>> .w-e-icon-table2::after {
-  content: '插入表格';
-  margin-left: 5px;
-}
 
 
 /* table 样式 */

+ 12 - 9
src/components/updateMore/updateMore.vue

@@ -1,35 +1,38 @@
 <template>
-  <el-dialog title="添加学生" :visible.sync="dialogVisibleMember" :append-to-body="true" width="540px" height="80%"
+  <el-dialog :title="lang.ssAddStudent" :visible.sync="dialogVisibleMember" :append-to-body="true" width="540px" height="80%"
     :before-close="handleClose" class="addNewPP">
     <div class="people" v-if="dialogVisibleMember">
       <div class="people_top">
         <div class="people_top_right">
           <div class="people_search">
-            <el-input placeholder="填写自定义姓名" v-model="name" @change="nameChange"></el-input>
+            <el-input :placeholder="lang.ssFillCustomName" v-model="name" @change="nameChange"></el-input>
           </div>
         </div>
-        <div class="people_nav">选择学生</div>
+        <div class="people_nav">{{ lang.ssSelectStudent }}</div>
       </div>
       <div class="i_box_login2" v-if="cList.length">
         <div :class="{ active: cname == item.userid }" v-for="(item, index) in cList" :key="index"
           :label="item.userid" @click="addGroupUser(item.userid)">
-          <el-tooltip placement="top" :content="item.name ? item.name : '暂无姓名'">
-            <span>{{ item.name ? item.name : "暂无姓名" }}</span>
+          <el-tooltip placement="top" :content="item.name ? item.name : lang.ssNoName">
+            <span>{{ item.name ? item.name : lang.ssNoName }}</span>
           </el-tooltip>
         </div>
       </div>
-      <div style="text-align: center; margin-top: 10px" v-else>暂无数据</div>
+      <div style="text-align: center; margin-top: 10px" v-else>{{ lang.ssNoData }}</div>
     </div>
 
     <span slot="footer" class="dialog-footer">
-        <el-button @click="close">取 消</el-button>
-      <el-button type="primary" @click="joinUpMore">确定</el-button>
+        <el-button @click="close">{{ lang.ssCancelBtn }}</el-button>
+      <el-button type="primary" @click="joinUpMore">{{ lang.ssConfirm }}</el-button>
     </span>
   </el-dialog>
 </template>
 
 <script>
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
   props: ["dialogVisibleMember", "cList", "userid", "searchTN"],
   data() {
     return {
@@ -74,7 +77,7 @@ export default {
     },
     joinUpMore() {
       if(!this.cname && !this.name){
-        this.$message.error("请选择一个学生或者填写自定义姓名")
+        this.$message.error(this.lang.ssSelectOrFillStudent)
       }
       let a = this.name ? this.name : this.cname
       this.$emit("setPlname",a)

+ 5 - 2
src/components/wordCloud/index.vue

@@ -1,6 +1,6 @@
 <template>
     <div>
-        <el-dialog title="词云" :visible.sync="dialogVisibleWordCloud" :append-to-body="true" width="800px"
+        <el-dialog :title="lang.ssWordCloud" :visible.sync="dialogVisibleWordCloud" :append-to-body="true" width="800px"
             :before-close="handleClose" class="dialog_diy dialog_diy3">
             <div class="wordCloud__tagBall" :style="{ width: `500px`, height: `500px` }" @mouseenter="stop"
                 @mouseleave="start" v-if="data.length">
@@ -9,14 +9,17 @@
                     :title="item.name ">{{ item.name }}</span>
                     <!-- + item.value -->
             </div>
-            <div class="noneBox" v-else>暂无内容</div>
+            <div class="noneBox" v-else>{{ lang.ssNoContent }}</div>
         </el-dialog>
     </div>
 </template>
    
    
 <script>
+import { myMixin } from "@/mixins/mixin.js"
+
 export default {
+  mixins: [myMixin],
     name: 'cloudWork',
     props: {
         dialogVisibleWordCloud: {

+ 651 - 1
src/lang/cn.json

@@ -21,7 +21,9 @@
   "ssSurvey": "问卷调查",
   "ssChoice": "选择题",
   "ssQa": "问答",
+  "ssQaQuestion": "问答题",
   "ssHomework": "作业提交",
+  "ssHomeworkDesc": "(提交图文视频等)",
   "ssBatchUpload": "批量上传",
   "ssMatch": "选择匹配",
   "ssSort": "排序",
@@ -50,6 +52,9 @@
   "ssNext": "下一步",
   "ssPermission": "权限",
   "ssReturn": "返回",
+  "ssFormManagement": "表单管理",
+  "ssAIAnalysis": "AI分析",
+  "ssAnonymous": "匿名",
   "ssNoDesc": "暂无描述",
   "ssViewDoc": "查看文档",
   "ssContentList": "内容列表",
@@ -71,6 +76,7 @@
   "ssAllHistory": "全历史",
   "ssToolDesc": "工具描述",
   "ssEnterTaskDesc": "请输入任务描述",
+  "ssEnterProjectKeyQuestion": "请填写项目课程关键问题....",
   "ssUploadHomework": "上传作业",
   "ssGenerateWordCloud": "生成词云",
   "ssExportHomework": "导出作业",
@@ -86,12 +92,16 @@
   "ssQuestionNum": "第*题",
   "ssRightPerson": "答对人数",
   "ssGroupSetting": "分组设置",
+  "ssGroupNameFormat": "第*组名称:",
   "ssCurrentCount": "目前人数",
   "ssPerson": "人",
+  "ssCurrentCountNum": "目前人数*人",
   "ssEvaluate": "评一评",
   "ssTarget": "目标",
   "ssEvalDimension": "评价维度",
   "ssEvalStandard": "评价标准",
+  "ssEvalName": "评价名称",
+  "ssEvalDesc": "评价描述",
   "ssDimensionDesc": "维度描述",
   "ssDetail": "细则",
   "ssView": "查看",
@@ -99,14 +109,19 @@
   "ssExpandTarget": "展开目标",
   "ssTargetTree": "目标树",
   "ssTargetCompass": "目标罗盘",
+  "ssTargetKanban": "目标看板",
+  "ssTaskColon": ":任务:",
   "ssUpFile": "上传文件",
+  "ssUploadImage": "上传图片",
   "ssSubmit": "提交",
+  "ssTeacherSubmitWork": "教师提交作业",
   "ssTotalEval": "总评",
   "ssTimeDesc": "时间降序",
   "ssTimeAsc": "时间升序",
   "ssMyComment": "我的评课",
   "ssEval": "评",
   "ssCommentOf": "的评论",
+  "ssCommentOfUser": "*的评论",
   "ssDelete": "删除",
   "ssReply": "回复",
   "ssAddComment": "添加评论",
@@ -128,10 +143,18 @@
   "ssTitle": "标题",
   "ssQuestionContent": "题目内容",
   "ssQuestion": "题目",
+  "ssQuestionColon": "题目:",
+  "ssQuestionTitleColon": "提问:",
   "ssStudentName": "学生姓名",
   "ssViewChoice": "查看选择题",
   "ssSingleChoice": "单选题",
   "ssMultiChoice": "多选题",
+  "ssViewRichText": "查看富文本",
+  "ssTextTitle": "文本标题",
+  "ssRichTextContent": "富文本内容",
+  "ssFilePreview": "文件预览",
+  "ssContentEditing": "文案编辑",
+  "ssDownloadSuccess": "下载成功",
   "ssAiGeneralCourse": "AI通识课",
   "ssCourse": "课程",
   "ssEnterKeyword": "请输入关键字",
@@ -229,5 +252,632 @@
   "ssAllGrades": "全部年级",
   "ssClass": "班级",
   "ssNoData": "暂无数据",
-  "ssStage3": "* 阶段"
+  "ssStage3": "* 阶段",
+  "ssInviteCodeLabel": "识别码:",
+  "ssToolNum": "工具*:",
+  "ssAiotBlockly": "AIoT Blockly",
+  "ssAiPython": "AI Python",
+  "ssAiBlockly": "AI Blockly",
+  "ssCocoPi": "CocoPi",
+  "ssGeogebra": "GeoGebra",
+  "ssTaskLabel": "任务*",
+  "ssContentListLabel": "内容列表:",
+  "ssTimeLabel": "时间:",
+  "ssFeatureNotAvail": "此功能暂未开放!",
+  "ssCloseBtn": "关 闭",
+  "ssViewVideo": "查看视频",
+  "ssViewDetails": "查看详情",
+  "ssTeacherAnnotation": "教师批注",
+  "ssSelectStarsForRating": "请选择星星进行评分",
+  "ssEnterEvalContent": "请输入评价内容...",
+  "ssNoComments": "暂无评论",
+  "ssEvaluation": "评价",
+  "ssEnterComment": "请输入评论",
+  "ssViewDocument": "查看文档",
+  "ssAIApplication": "AI应用",
+  "ssExitFullscreen": "退出全屏",
+  "ssSelectCorrespondingAnswer": "请选择对应的答案进行答题!",
+  "ssSelectAnswerByQuestion": "根据题目选择对应答案",
+  "ssSelectCorrectAnswer": "请选择正确答案",
+  "ssAnswerCorrect": "回答正确",
+  "ssAnswerWrong": "回答错误",
+  "ssCorrectAnswer": "正确答案:",
+  "ssSubmitAnswer": "提交答案",
+  "ssTeacherScoring": "教师评分",
+  "ssClickDownloadFile": "点击下载文件",
+  "ssClickOpenCocoPi": "点击打开CocoPi",
+  "ssEnterScore": "请输入分数",
+  "ssScoringComment": "评分评论",
+  "ssEnterStudentEvaluation": "请输入对学生的评价",
+  "ssSelectCorrectOrder": "请选择正确顺序",
+  "ssHomeworkOf": "的作业",
+  "ssFormSentence": "组成句子:",
+  "ssSubmitted": "已提交",
+  "ssCorrectAnswerBelow": "正确答案如下:",
+  "ssTableContent": "表格内容",
+  "ssRestoreTemplate": "还原模板",
+  "ssDocumentContent": "文档内容",
+  "ssModify": "修改",
+  "ssEmptyPosition": "空位置",
+  "ssRemoveMember": "移除组员",
+  "ssExitGroup": "退出分组",
+  "ssSetGroupCountAndName": "请设置小组数量及名称",
+  "ssSetGroupMemberCount": "请设置每组人数",
+  "ssEnterNumber2To10": "请输入2-10的数字",
+  "ssClickUploadFile": "点击上传文件",
+  "ssSelectFile": "选择文件",
+  "ssSelected": "已选择",
+  "ssMyEvaluation": "我的评价",
+  "ssModifyName": "修改名称",
+  "ssModifyGroup": "修改分组",
+  "ssRemoveGroupMember": "移除组员",
+  "ssSelectGroupToJoin": "请选择要进入的分组",
+  "ssSelectMemberToDelete": "请选择要删除的组员",
+  "ssName": "名称",
+  "ssHomeworkSubmit": "作业提交",
+  "ssEssayTitle": "作文题目:",
+  "ssEssayContent": "作文内容:",
+  "ssNoteRedDeleteGreenAdd": "注:红色划线字为删除,绿色背景白色字为新添加.",
+  "ssAddAnnotation": "添加批注",
+  "ssCancelAdd": "取消添加",
+  "ssAIAnnotation": "AI批注",
+  "ssOriginalAuthor": "原文( 作者:",
+  "ssTitleColon": "标题:",
+  "ssContentColon": "正文:",
+  "ssImage": "图片",
+  "ssImageColon": "图片:",
+  "ssWordCloud": "词云",
+  "ssCourseStarted": "开课啦",
+  "ssFollowTeacherLearning": "接下来你将跟随老师一起开始今天的学习!",
+  "ssStudyHard": "要认真听讲哦~",
+  "ssStartLearningBtn": "开始学习",
+  "ssAIScoringInProgress": "正在进行AI评分中,请稍后",
+  "ssConfirmReset": "确认一键重置?",
+  "ssResetCompleted": "重置完成",
+  "ssNoConcurrentAIScoring": "请勿同时间进行AI评分",
+  "ssDetailGenerating": "细则努力生成中,请稍候……",
+  "ssNoStarRating": "未有星级。",
+  "ssNetworkPoor": "网络不佳",
+  "ssAIEvaluatingInProgress": "正在AI评价进程中请稍后",
+  "ssEvaluationSuccess": "评价成功",
+  "ssEssayTooLongForAI": "你的作文内容太长,无法使用Ai批注!",
+  "ssAICorrectPrompt": "Role: 你是一名小学英语作文的老师,根据这篇文章的内容你去批改这篇文章,然后仅输出一篇纠错好的文章。文章:${t}",
+  "ssSelectTaskToAdd": "请选择要添加的任务",
+  "ssAddSuccess": "添加成功",
+  "ssStar0": "0星",
+  "ssStar2": "2星",
+  "ssStar3": "3星",
+  "ssStar4": "4星",
+  "ssStar5": "5星",
+  "ssNotAvailable": "暂未开放",
+  "ssClickTooFast": "点击过快,请稍后...",
+  "ssSubmitSuccess": "提交成功",
+  "ssSubmitFailed": "提交失败",
+  "ssFillAnswersComplete": "请将答案填写完整!",
+  "ssConfirmRestoreTemplate": "确定还原此模板吗?",
+  "ssPrompt": "提示",
+  "ssSplitScreenEnabled": "分屏模式已开启",
+  "ssSplitScreenDataRetrieved": "获取了分屏数:",
+  "ssSplitScreenEnded": "已结束分屏模式",
+  "ssTeacherEndedSplitScreen": "教师已结束分屏,确定后自由预览。",
+  "ssConfirmFreePreview": "确定后自由预览",
+  "ssOperationTooFast": "操作过快,请稍等",
+  "ssSplitScreenClosed": "已关闭分屏模式",
+  "ssSplitScreenOpened": "已开启分屏",
+  "ssSplitScreenOpenFailed": "分屏开启失败",
+  "ssSelectedByTeacher": "你被老师选到啦!",
+  "ssConfirmSubmitCorrection": "你确定提交批改嘛?",
+  "ssAskStudentToAnswer": "是否让*同学回答问题?",
+  "ssHomeworkSubmissionTool": "作业提交工具",
+  "ssConfirmExportHomework": "确定导出作业吗?",
+  "ssExitSuccess": "退出成功",
+  "ssPositionFull": "位置已满,无法加入",
+  "ssPositionLocked": "位置已被锁定,无法*",
+  "ssGroupLargerThanSet": "已经有小组比你设置的人数多,请重新设置",
+  "ssSettingSuccess": "设置成功",
+  "ssScreenRecording": "录屏",
+  "ssOperationSuccess": "操作成功",
+  "ssJoinSuccess": "加入成功",
+  "ssConfirmDeleteAnnotation": "确定删除此批注吗?",
+  "ssDeleteSuccess": "删除成功",
+  "ssDeleteFailed": "删除失败",
+  "ssBatchUploadNoClassPermission": "提示:批量上传未添加班级权限,请添加班级或从班级入口进入。",
+  "ssNoClassPermission": "提示:未添加班级权限,请添加班级或从班级入口进入。",
+  "ssAppConnectionEmpty": "应用连接为空, 请到课程管理中添加",
+  "ssNotSupportedForStudents": "不支持学生使用",
+  "ssPleaseSelectOption": "请选择选项",
+  "ssPleaseFillCompleteInfo": "请将信息填写完整",
+  "ssAlreadySubmittedHomework": "您已经提交了该作业了,如果您再提交将覆盖上次提交的作业!",
+  "ssConfirmSubmitAgain": "再次提交会覆盖原有作业,并清空评分。",
+  "ssUploadFileRequired": "请上传文件",
+  "ssEnterStudentName": "请填写学生姓名",
+  "ssEnterEssayContent": "请输入作文标题和正文!",
+  "ssHomeworkDeleted": "此作业已被删除",
+  "ssLikeSuccess": "点赞成功",
+  "ssLikeFailed": "点赞失败",
+  "ssCancelLikeSuccess": "取消点赞成功",
+  "ssConfirmDeleteComment": "确定删除此评论吗?",
+  "ssDeleteCommentSuccess": "删除评论成功",
+  "ssOnlyOneCommentPerHomework": "一个作业只能评论一条",
+  "ssCommentSuccess": "评论成功",
+  "ssCommentFailed": "评论失败",
+  "ssPleaseRate": "请评分",
+  "ssRatingSuccess": "评分成功",
+  "ssRatingFailed": "评分失败",
+  "ssConfirmDeleteWork": "确定删除此作业吗?",
+  "ssNetworkError": "网络异常",
+  "ssNoAISetting": "您暂未设置AI评分,请修改该工具的评价设置后使用。",
+  "ssUploadFailed": "上传失败",
+  "ssFollowModeOn": "已经开启跟随模式,请认真跟堂听讲",
+  "ssTaskLocked": "任务未解锁",
+  "ssPrevTaskLocked": "上一任务未解锁",
+  "ssCommentEmpty": "评论不能为空!",
+  "ssAddFailed": "添加失败",
+  "ssReplyEmpty": "回复不能为空!",
+  "ssReplySuccess": "回复成功",
+  "ssReplyFailed": "回复失败",
+  "ssPermSetSuccess": "权限设置成功",
+  "ssPermClosedOk": "权限关闭成功",
+  "ssStuViewPermOn": "学生查看内容资料权限已开启",
+  "ssStuViewPermOff": "关闭学生查看内容资料权限",
+  "ssFollowModeOn2": "跟随模式已开启",
+  "ssFollowModeOff": "跟随模式已关闭",
+  "ssAnnotationImage": "批注图.png",
+  "ssFullScreenView": "全屏查看",
+  "ssFileDownload": "文件下载",
+  "ssRatingScale": "量规评分",
+  "ssPermissionSetting": "权限设置",
+  "ssAllowViewAllHomework": "允许学生查看所有作业",
+  "ssProhibitViewStage": "禁止学生查看阶段",
+  "ssEnableFollowMode": "开启跟随模式",
+  "ssAllowViewContent": "允许学生查看内容资料",
+  "ssOpenSeatTip": "提示:开启【开放选座】,学生能够自由加入和退出小组。",
+  "ssEnterName": "请输入名称...",
+  "ssCountdownHint": "提示:点击'+'或'-'修改倒计时时长。",
+  "ssCommentLabel": "评论:",
+  "ssPositionLockedCannotJoin": "位置已被锁定,无法加入",
+  "ssPositionFullCannotJoin": "位置已满,无法加入",
+  "ssPositionLockedCannotExit": "位置已被锁定,无法退出",
+  "ssTeachingPlan": "教案",
+  "ssEnterStudentNamePlaceholder": "请输入学生名字",
+  "ssSelectStudentPlaceholder": "请选择学生",
+  "ssVideoNotSupported": "此视频暂无法播放,请稍后再试",
+  "ssVeryCreative": "很有创意!",
+  "ssNotBad": "还不错哦~",
+  "ssKeepTrying": "继续努力哦~",
+  "ssInvalidRequest": "无效请求,请重新发起对话",
+  "ssLockPosition": "锁定位置",
+  "ssUnlockPosition": "解锁位置",
+  "ssOpenSeat": "开放选座",
+  "ssAdd": "添加",
+  "ssNoMatchingContent": "未找到匹配的内容。",
+  "ssStreamStopListening": "流停止监听",
+  "ssPermissionGrantedSuccess": "已点击允许,开启成功",
+  "ssCheckMicrophone": "请检查是否存在麦克风",
+  "ssSplitScreenDataSuccess": "分屏数据成功",
+  "ssSplitScreenDataFailed": "分屏数据失败",
+  "ssCancelBtn": "取 消",
+  "ssConfirmBtn": "确 定",
+  "ssHomeworkDialog": "作业弹框",
+  "ssConfirmDeleteReply": "确定删除此回复吗?",
+  "ssTaskWithColon": "任务:",
+  "ssCatalog": "目录",
+  "ssDownloadRecord": "下载录制",
+  "ssLearnLearn": "学一学",
+  "ssTeacherWorkspace": "教师工作区",
+  "ssEvaluationType": "评价类",
+  "ssTip": "提示",
+  "ssFunctionNotOpen": "此功能暂未开放!",
+  "ssPermissionSettings": "权限设置",
+  "ssAllowStudentViewAllWork": "允许学生查看所有作业",
+  "ssProhibitStudentViewStage": "禁止学生查看阶段",
+  "ssAllowStudentViewContent": "允许学生查看内容资料",
+  "ssGroupNumName": "第*组名称:",
+  "ssReturnBtn": "返回",
+  "ssToolLabel": "工具",
+  "ssSubmitDescText": "(提交图文视频等)",
+  "ssMoleculeLabel": "分子结构",
+  "ssCourseDesignLabel": "课程设计",
+  "ssGoalManageLabel": "目标管理",
+  "ssExitGroupBtn": "退出分组",
+  "ssAddBtn": "添加",
+  "ssDeleteBtn": "删除",
+  "ssSelectGroupPrompt": "请选择要进入的分组",
+  "ssSelectMemberPrompt": "请选择要删除的组员",
+  "ssSelectStudentPrompt": "请选择学生",
+  "ssEditNoteText": "注:红色划线字为删除,绿色背景白色字为新添加.",
+  "ssWordCloudTitle": "词云",
+  "ssCourseStartWithTitle": "“*”开课啦",
+  "ssFollowTeacherMsg": "接下来你将跟随老师一起开始今天的学习!",
+  "ssStudyHardMsg": "要认真听讲哦~",
+  "ssPdfLoadingPleaseWait": "pdf可能会加载时间有点长,请耐心等待...",
+  "ssOption": "选项",
+  "ssSubtotal": "小计",
+  "ssProportion": "比例",
+  "ssSelectStudent": "选择同学:",
+  "ssViewStudent": "查看学生",
+  "ssCorrectCount": "答对数量",
+  "ssCorrectStudents": "答对同学:",
+  "ssQuestionTooltip": "第{b0}题: 答对{c0}人",
+  "ssAnswerCount": "答题人数",
+  "ssTotalCorrectCount": "全部答对人数为",
+  "ssSentence": "句子",
+  "ssAnswerLabel": "答案:",
+  "ssEnterContent": "请输入正文",
+  "ssTimeUp": "时间到!!!",
+  "ssImport": "导入",
+  "ssSave": "保存",
+  "ssDownloadMindMap": "下载导图",
+  "ssGetData": "获取数据",
+  "ssAddNode": "新增节点",
+  "ssAddBrotherNode": "新增兄弟节点",
+  "ssEditNode": "编辑节点",
+  "ssDeleteNode": "删除节点",
+  "ssZoomIn": "放大",
+  "ssZoomOut": "缩小",
+  "ssExpandNodes": "展开节点",
+  "ssTheme": "主题:",
+  "ssSelectTheme": "选择主题",
+  "ssFontSize": "字体大小",
+  "ssFontWeight": "字体粗细",
+  "ssRegular": "常规",
+  "ssBold": "粗体",
+  "ssBolder": "更粗",
+  "ssFontStyle": "字体样式",
+  "ssStandard": "标准",
+  "ssItalic": "斜体",
+  "ssOblique": "倾斜",
+  "ssBackgroundColor": "背景颜色",
+  "ssFontColor": "字体颜色",
+  "ssNodeContent": "节点内容",
+  "ssConfirmEdit": "确 定",
+  "ssOpenSuccess": "打开成功",
+  "ssCannotOpenMindmap": "不能打开mindmap文件",
+  "ssPleaseSelectFile": "请先选择文件",
+  "ssPleaseSelectNode": "请先选择一个节点!",
+  "ssCannotAddRoot": "不能在根节点添加,请重新选择节点!",
+  "ssExpandToLevel1": "展开到一级节点",
+  "ssExpandToLevel2": "展开到二级节点",
+  "ssExpandToLevel3": "展开到三级节点",
+  "ssExpandAll": "展开全部节点",
+  "ssCollapseAll": "隐藏全部节点",
+  "ssStartRecording": "开始录音",
+  "ssStopRecording": "结束录音",
+  "ssPlayRecording": "录音播放",
+  "ssStopPlaying": "停止播放",
+  "ssUploadRecording": "上传录音",
+  "ssNoMicrophone": "没有找到可使用的麦克风,或者您没有允许此网页使用麦克风",
+  "ssRecordBeforeUpload": "请录音后在上传语音",
+  "ssMove": "移动",
+  "ssColor": "颜色",
+  "ssThickness": "粗细",
+  "ssBrush": "画笔",
+  "ssClear": "清除",
+  "ssClose": "关闭",
+  "ssSaveAnnotation": "保存批注",
+  "ssPleaseAnswer": "请答题",
+  "ssAddStudent": "添加学生",
+  "ssFillCustomName": "填写自定义姓名",
+  "ssNoName": "暂无姓名",
+  "ssSelectOrFillStudent": "请选择一个学生或者填写自定义姓名",
+  "ssNoContent": "暂无内容",
+  "ssOnlineWriting": "在线编写",
+  "ssImageUpload": "图片上传",
+  "ssPleaseFillEssayTitle": "请填写你的作文题目",
+  "ssPleaseUploadImage": "请上传图片!",
+  "ssConfirmClearContent": "如已进行填写,确认后将清空内容噢。",
+  "ssViewTeacherEvaluation": "查看教师评价",
+  "ssScoringCriteria": "评分标准:",
+  "ssHomeworkEvaluation": "作业评价:",
+  "ssAIEvaluation": "AI评价",
+  "ssEnterValueGreaterThanZero": "请输入大于0的数值",
+  "ssValueCannotExceed100": "数值不能大于100",
+  "ssPleaseEnterNumber": "请输入数字",
+  "ssClickSubmit": "点击提交",
+  "ssStudentReport": "学生报告",
+  "ssSaveSuccess": "保存成功",
+  "ssConfirmResetContent": "是否将已经填写的内容重置?",
+  "ssAnyMoreSupplements": "你还有哪些补充",
+  "ssTeachingObjectives": "教学目标(5分)",
+  "ssTeachingContent": "教学内容(5分)",
+  "ssTeachingProcess": "教学过程(30分)",
+  "ssTeachingMethods": "教学方法与策略(20分)",
+  "ssTeachingTools": "教学工具(15分)",
+  "ssTeachingEvaluation": "教学评价(10分)",
+  "ssInnovation": "创新意识(10分)",
+  "ssTeachingEffect": "教学效果(5分)",
+  "ssBonusPoints": "加分项(10分)",
+  "ssComments": "评语",
+  "ssEnterPositiveInteger": "请输入大于0的整数",
+  "ssCannotEnterScoreAbove": "不能输入大于得分的整数",
+  "ssTeachingObjectivesDesc": "目标结构完整,能够清晰地表达学生的学习过程与预期成果。目标符合学情,具有可行性与逻辑递进性。目标体现学生本位与素养导向,不单纯停留在知识与技能层面。",
+  "ssTeachingContentDesc": "重难点突出,符合课标与教材要求,不超纲。符合学情特点,贴近学生生活,体现积极向上的育人价值观。关注学生学习的最近发展区,有意识地展现因材施教的意图。",
+  "ssTeachingProcessStructure": "课堂结构合理、紧密,层次清楚,突出重难点的解决。(10分)",
+  "ssTeachingProcessLearning": "强调\"学\"的活动设计,教与学有机结合。(10分)",
+  "ssTeachingProcessManagement": "课堂管理有序,教学语言清晰准确,能及时、合理地解决课堂问题,体现良好的教学素养。(10分)",
+  "ssTeachingMethodsDesc": "符合教学内容与学科特点。落实有效,能体现出学生的学习成效,不流于形式。具有一定的新意,展现教师的独立思考与探究意识。",
+  "ssTeachingToolsDesc": "合理、科学地使用信息化技术、学习单、自制教学道具、辅助性资源等教学工具。",
+  "ssTeachingEvaluationDesc": "重视评价,有合理的评价手段与工具。评价落实有效,体现针对性和专业性。",
+  "ssInnovationDesc": "教学空间的选择、布置有独特想法,且合理有效。敢于尝试多样化的教学形式,如主题式、大单元、项目式、游戏化等。开发特色有效的教学策略与手段,如小组合作探究、跨学科展演等,教师特色鲜明。",
+  "ssTeachingEffectDesc": "达成目标,整个过程有资源的生成。学习过程中学生有满足、成功与喜悦等体验,对后续学习更有信心,能力得到发展。",
+  "ssBonusPointsDesc": "某项优点特别突出,如教学风貌、教学理念、教学特色、教学手段等。",
+  "ssStudentFreePreview": "学生自由预览",
+  "ssOpenHomeworkPreview": "开放作业预览",
+  "ssSplitScreen": "分屏",
+  "ssQuiz": "测验",
+  "ssDialogue": "对话",
+  "ssWorkflow": "工作流",
+  "ssAssistant": "助教",
+  "ssAnnotation": "批注",
+  "ssStartVoiceAssistant": "开启语音助手",
+  "ssCloseVoiceAssistant": "关闭语音助手",
+  "ssUploadingRecording": "正在上传录屏文件,请稍等...",
+  "ssRecordClassroom": "录制课堂",
+  "ssOpenCountdownPanel": "倒计时面板",
+  "ssPleaseWait": "请稍等...",
+  "ssAIVoiceEnabled": "已开启AI语音",
+  "ssAIVoiceDisabled": "已关闭AI语音",
+  "ssCloseSplitScreenOnDevice": "需要在开启分屏的设备上关闭分屏",
+  "ssNotSplitScreenCreator": "你不是分屏的创建者,无法关闭分屏",
+  "ssOnlyTeacherCanSplitScreen": "只有老师可以分屏",
+  "ssUploadToResourceSuccess": "上传至资源库成功",
+  "ssConfirmUploadToResource": "是否上传*至资源库?",
+  "ssUploadFileToResourceSuccess": "上传《*》至资源库成功",
+  "ssCompetence": "素养",
+  "ssExit": "退出",
+  "ssStudentWorkPreview": "学生作业预览",
+  "ssSingleChoiceColon": "单选题:",
+  "ssMultipleChoiceColon": "多选题:",
+  "ssComposeSentence": "组成句子:",
+  "ssNodeLabel": "节点*",
+  "ssXiaoKeAIAssistant": "小可AI助手",
+  "ssWorkOnlyShowsDialog": "作业暂时只能展示对话文字哦~",
+  "ssPreviewImage": "预览图片",
+  "ssQuestionImage": "题目图片",
+  "ssQuestionSituation": "题目情况",
+  "ssStudentSummary": "学生汇总",
+  "ssClassSummary": "班级汇总",
+  "ssDataStatisticsChart": "数据统计图",
+  "ssDataDetails": "数据详情",
+  "ssQuestionNumber": "题目*",
+  "ssTotal": "总计",
+  "ssScoringCount": "评分人数",
+  "ssTotalAverageScore": "总平均分",
+  "ssSerialNumber": "序号",
+  "ssCourseStructure": "课程结构",
+  "ssActivityDesign": "活动设计",
+  "ssOrderManagement": "秩序管理",
+  "ssTotalScore": "总分",
+  "ssWorkDetails": "作业详情",
+  "ssQuestionStatistics": "题目统计",
+  "ssStudentStatistics": "学生统计",
+  "ssSmartAnalysis": "智能分析",
+  "ssAiAssistant": "AI助手",
+  "ssMindNetwork": "思维网络",
+  "ssAppStore": "应用中心",
+  "ssOptionSummary": "选项汇总",
+  "ssPleaseSelect": "请选择",
+  "ssEnterEvaluation": "请输入评价内容...",
+  "ssNoTitle": "无标题",
+  "ssSingleChoiceWithColon": "单选题:",
+  "ssMultipleChoiceWithColon": "多选题:",
+  "ssGroupSettings": "分组设置",
+  "ssEnter2to10Digits": "请输入2-10的数字",
+  "ssAccuracyRate": "准确率",
+  "ssAiApplication": "AI应用",
+  "ssNone": "无",
+  "ssMultipleChoice": "多选题",
+  "ssAsk": "提问",
+  "ssPleaseChooseCorrectOrder": "请选择正确顺序",
+  "ssAccuracyRateColon": "准确率:",
+  "ssNoUnsubmittedStudents": "无未提交学生...",
+  "ssWorkPreview": "作业预览",
+  "ssNoSubmittedStudents": "暂无提交学生...",
+  "ssCocoPiWork": "CocoPi作业",
+  "ssPleaseSetGroupNumberAndName": "请设置小组数量及名称",
+  "ssGroupNameColon": "第*组名称:",
+  "ssPleaseSetGroupSize": "请设置每组人数",
+  "ssPleaseSelectMembersToDelete": "请选择要删除的组员",
+  "ssUploadFailedPptData": "上传失败ppt数据失败",
+  "ssGroupSizeExceedsSetting": "已经有小组比你设置的人数多,请重新设置",
+  "ssOptionLabel": "选项*",
+  "ssQuestionLabel": "第*题",
+  "ssPleaseEnterTitleAndContent": "请输入作文标题和正文!",
+  "ssPleaseFillAnswer": "请填写答案",
+  "ssPleaseSelectAnswer": "请选择答案",
+  "ssPleaseCompleteAnswer": "请将答案填写完整!",
+  "ssCannotViewOnProjection": "投影下不可查看",
+  "ssUploadSuccess": "上传成功",
+  "ssI": "我",
+  "ssGuessYouWantToSearch": "猜你想搜:",
+  "ssSelectAgent": "选择您需要的智能体,开始对话",
+  "ssMy": "我的",
+  "ssCommunity": "社区",
+  "ssPleaseEnterContent": "请输入内容",
+  "ssClearChatHistory": "清空聊天记录",
+  "ssDefaultNotRead": "默认不朗诵",
+  "ssDefaultRead": "默认朗诵",
+  "ssClassTips": "课堂小贴士",
+  "ssAgent": "智能体",
+  "ssGenerateImage": "生成图片",
+  "ssSearchImage": "搜索图片",
+  "ssSearchVideo": "搜索视频",
+  "ssPleaseSpeak": "请说话",
+  "ssVoiceInput": "语音输入",
+  "ssTextInput": "文字输入",
+  "ssEndRecording": "结束录音",
+  "ssSend": "发送",
+  "ssStopSending": "停止发送",
+  "ssVoiceAssistant": "语音助手",
+  "ssSearchDesiredAgent": "搜索想要的智能体",
+  "ssQuery": "查询",
+  "ssUseVoice": "使用语音",
+  "ssUseKeyboard": "使用键盘",
+  "ssCopySuccess": "复制成功",
+  "ssClearChatHistoryPrompt": "确定清空聊天记录吗?",
+  "ssClearChatHistorySuccess": "清除聊天记录成功",
+  "ssClearChatHistoryFailed": "清除聊天记录失败",
+  "ssGetVideoFailed": "获取视频失败",
+  "ssGenerateImageFailed": "生成图片失败",
+  "ssGenerateFailed": "生成失败",
+  "ssGetChatHistoryFailed": "获取对话记录失败",
+  "ssImageNotSupportDownload": "此图片不支持下载",
+  "ssHelloHowCanIHelp": "您好,有什么需要我帮忙的吗?",
+  "ssGetRoleListFailed": "获取角色列表失败",
+  "ssGetPublicRoleFailed": "获取公共角色失败",
+  "ssToolSimulationDriving": "模拟驾驶",
+  "ssToolPathSearch": "路径搜索",
+  "ssToolDeepLearning": "深度学习",
+  "ssToolPersonalEvaluation": "个人评价",
+  "ssToolAiotBlockly": "AIoT Blockly",
+  "ssToolAiPython": "AI Python",
+  "ssToolAiBlockly": "AI Blockly",
+  "ssToolCocoPi": "CocoPi",
+  "ssToolGeogebra": "GeoGebra",
+  "ssToolMolecularStructure": "分子结构",
+  "ssToolTimeline": "时间轴",
+  "ssToolGoalManagement": "目标管理",
+  "ssToolCourseDesign": "课程设计",
+  "ssToolInteractiveVideo": "交互视频",
+  "ssMembers": "成员",
+  "ssNoMembers": "暂无成员...",
+  "ssHomeworkSubmissionStatus": "作业提交情况",
+  "ssSummaryAnalysis": "总结分析",
+  "ssHomeworkDetails": "作业详细",
+  "ssOptions": "选项:",
+  "ssClickToSpeak": "点击说话",
+  "ssClickRecordingButton": "请点击录音按钮开始录音",
+  "ssQuestionText": "题目:",
+  "ssAnswerText": "答题:",
+  "ssStudentText": "学生:",
+  "ssCorrectAnswerText": "答案:",
+  "ssPleaseStopRecordingFirst": "请先停止录音",
+  "ssPleaseStartRecordingFirst": "请先开始录音",
+  "ssPleaseWaitDots": "请稍等...",
+  "ssConfirmDialogTitle": "提示",
+  "ssVideoKeyword": "视频",
+  "ssImageKeyword": "图片",
+  "ssStudentGrade": "学生年级:",
+  "ssCategoryLabel": "分类:",
+  "ssTaskTimeAllocation": "任务时间分配",
+  "ssCourseTimeline": "课程时间轴",
+  "ssTaskStatus": "任务状态",
+  "ssStudentActivity": "学生活动中...",
+  "ssSubmitCount": "提交人数",
+  "ssPersonUnit": "人",
+  "ssCompletionRate": "完成率",
+  "ssCommunication": "交流互动",
+  "ssParticipantCount": "参与人数",
+  "ssLikeCount": "点赞数",
+  "ssItemUnit": "个",
+  "ssCommentCount": "评论数",
+  "ssCommentUnit": "条",
+  "ssConsolidatePractice": "巩固练习",
+  "ssNoExerciseAdded": "当前课堂未添加练习题",
+  "ssOneClickGenerate": "一键出题",
+  "ssClassManagement": "课堂管理",
+  "ssEditToolAddTopics": "编辑工具,自主添加题目",
+  "ssTopicStatistics": "题目统计",
+  "ssAnswerAnalysis": "答案解析",
+  "ssNoStudentSubmit": "当前暂无学生提交.",
+  "ssConfirmSelection": "确认选择",
+  "ssSmartGenerate": "智能出题",
+  "ssSimilarTopic": "相似题",
+  "ssHarderTopic": "更难题",
+  "ssEasierTopic": "更易题",
+  "ssPreviousTopic": "上一题",
+  "ssNextTopic": "下一题",
+  "ssClick": "点击",
+  "ssAutoGenerate10": "自动生成 10",
+  "ssPracticeQuestions": "道随堂练习",
+  "ssGoTo": "前往",
+  "ssEditToolAddTopics2": "编辑工具,自主添加题目",
+  "ssStatistics": "统计",
+  "ssAnalysis": "解析",
+  "ssAnswer": "答案:",
+  "ssNoStudentSubmitPractice": "当前暂无学生提交练习.",
+  "ssOneClickGenerateFailed": "一键出题失败",
+  "ssSmartGenerateFailed": "智能出题失败",
+  "ssTopicAlreadySubmitted": "该题已经提交过了",
+  "ssPleaseAnswerFirst": "请先答题",
+  "ssTeacherAddedNewTopics": "老师有新添加的题目",
+  "ssGenerateAnalysisFailed": "生成解析失败",
+  "ssLinkAddress": "链接地址",
+  "ssPersonalEvalContent": "个人评价内容",
+  "ssSubmitContent": "提交内容",
+  "ssChatContent": "聊天内容",
+  "ssSubmitTime": "提交时间",
+  "ssInsertTable": "插入表格",
+  "ssMinute": "分",
+  "ssSecond": "秒",
+  "ssQuickSettings": "快捷设置",
+  "ssCommon": "常用",
+  "ssMore": "更多",
+  "ssTimer": "计时器",
+  "ssTeachingActivityMemo": "教学活动备忘",
+  "ssAllEvents": "所有事件",
+  "ssTimingEvents": "计时事件",
+  "ssExport": "导出",
+  "ssCountdownRunning": "正在倒计时",
+  "ssTimerRunning": "正在计时",
+  "ssCountdownMaxHour": "倒计时最高一小时",
+  "ssSetCountdownTime": "请设置倒计时时间",
+  "ssCountdownPaused": "已暂停倒计时",
+  "ssCountdownStarted": "已开始倒计时",
+  "ssTimerStopped": "已停止计时",
+  "ssTimerStarted": "已开始计时",
+  "ssResetDone": "已重置",
+  "ssConfirmResetCountdown": "正在倒计时!确定重置倒计时吗?",
+  "ssConfirmResetTimer": "正在计时!确定重置计时吗?",
+  "ssConfirmResetBasic": "确定重置",
+  "ssExportSuccess": "导出成功",
+  "ssGetMoreTagsFailed": "获取更多行为标签失败",
+  "ssGetMemoFailed": "获取行为备忘失败",
+  "ssStopTimerFirst": "请先停止计时再设置",
+  "ssBehaviorTags": "行为标签",
+  "ss30Seconds": "30秒",
+  "ss1Minute": "1分钟",
+  "ss2Minutes": "2分钟",
+  "ss3Minutes": "3分钟",
+  "ss5Minutes": "5分钟",
+  "ss6Minutes": "6分钟",
+  "ss8Minutes": "8分钟",
+  "ss10Minutes": "10分钟",
+  "ssHideMusicList": "隐藏音乐列表",
+  "ssShowMusicList": "显示音乐列表",
+  "ssTurnOffMusic": "关闭音乐",
+  "ssTurnOnMusic": "开启音乐",
+  "ssMusic1": "音乐1",
+  "ssMusic2": "音乐2",
+  "ssMusic3": "音乐3",
+  "ssMusic4": "音乐4",
+  "ssMusic5": "音乐5",
+  "ssGroupDiscussion": "小组讨论",
+  "ssGroupReport": "小组汇报",
+  "ssHandsOnExperiment": "动手实验",
+  "ssClassroomGame": "课堂游戏",
+  "ssIndependentLearning": "自主学习",
+  "ssWorkDisplay": "作品展示",
+  "ssStudentSpeech": "学生演讲",
+  "ssStudentShare": "学生分享",
+  "ssClassPractice": "随堂练习",
+  "ssQuickQAndA": "快速问答",
+  "ssReadingMaterials": "阅读资料",
+  "ssObservationRecord": "观察记录",
+  "ssEvent": "事件",
+  "ssTimeDifference": "时间差",
+  "ssViewHomework": "查看作业",
+  "ssPerformLike": "进行点赞",
+  "ssPerformComment": "进行评论",
+  "ssPerformRating": "进行评分",
+  "ssHourUnit": "时",
+  "ssEventExportFileName": "事件.xlsx",
+  "ssPerformActionOn": "对",
+  "ssSet": "设置",
+  "ssUsedFor": ",用于",
+  "ssEndTimer": "结束计时器,",
+  "ssTimerWord": "计时",
+  "ssMinuteWord": "分钟",
+  "ssSecondWord": "秒",
+  "ssResetTimer": "重置"
 }

+ 662 - 14
src/lang/en.json

@@ -10,28 +10,30 @@
   "ssSimulateDrive": "Simulate Drive",
   "ssPathSearch": "Path Search",
   "ssDeepLearning": "Deep Learning",
-  "ssCountdown": "Countdown",
+  "ssCountdown": "Timer",
   "ssPickPerson": "Pick Person",
   "ssMindGrid": "Mind Grid",
-  "ssWhiteboard": "Whiteboard",
+  "ssWhiteboard": "E-Whiteboard",
   "ssDocument": "Document",
   "ssMindMap": "Mind Map",
   "ssTable": "Table",
-  "ssStudentGroup": "Student Group",
+  "ssStudentGroup": "Student Grouping",
   "ssSurvey": "Survey",
-  "ssChoice": "Choice",
+  "ssChoice": "Multiple Choice",
   "ssQa": "Q&A",
-  "ssHomework": "Homework",
+  "ssQaQuestion": "Q&A Question",
+  "ssHomework": "Assignment submission",
+  "ssHomeworkDesc": "(Submit pictures, texts, videos, etc.)",
   "ssBatchUpload": "Batch Upload",
   "ssMatch": "Match",
-  "ssSort": "Sort",
-  "ssPersonalEval": "Personal Evaluation",
+  "ssSort": "Sorting",
+  "ssPersonalEval": "Self Assessment",
   "ssTraining": "Training Platform",
-  "ssCodeEdit": "Code Editor",
+  "ssCodeEdit": "Source Code Editing",
   "ssTurtle": "Turtle Programming",
-  "ssTranslate": "Translate",
-  "ssDigitalBoard": "Digital Board",
-  "ssFormula": "Formula Editor",
+  "ssTranslate": "Translation",
+  "ssDigitalBoard": "Digital Canvas",
+  "ssFormula": "LaTeX",
   "ssMolecule": "Molecule Structure",
   "ssTimeline": "Timeline",
   "ssEnglishWrite": "English Writing",
@@ -50,6 +52,9 @@
   "ssNext": "Next",
   "ssPermission": "Permission",
   "ssReturn": "Return",
+  "ssFormManagement": "Form Management",
+  "ssAIAnalysis": "AI Analysis",
+  "ssAnonymous": "Anonymous",
   "ssNoDesc": "No description",
   "ssViewDoc": "View Document",
   "ssContentList": "Content List",
@@ -71,6 +76,7 @@
   "ssAllHistory": "All History",
   "ssToolDesc": "Tool Description",
   "ssEnterTaskDesc": "Please enter task description",
+  "ssEnterProjectKeyQuestion": "Please fill in the key questions of the project course....",
   "ssUploadHomework": "Upload Homework",
   "ssGenerateWordCloud": "Generate Word Cloud",
   "ssExportHomework": "Export Homework",
@@ -82,12 +88,14 @@
   "ssScoring": "Scoring",
   "ssNoHomework": "No homework submitted",
   "ssScoringIn": "Scoring",
-  "ssCorrectRate": "Correct Rate",
+  "ssCorrectRate": "Accuracy",
   "ssQuestionNum": "Question *",
   "ssRightPerson": "Correct Answers",
   "ssGroupSetting": "Group Setting",
+  "ssGroupNameFormat": "Group * Name:",
   "ssCurrentCount": "Current Count",
   "ssPerson": "Person",
+  "ssCurrentCountNum": "Current Count * Person",
   "ssEvaluate": "Evaluate",
   "ssTarget": "Target",
   "ssEvalDimension": "Evaluation Dimension",
@@ -99,14 +107,19 @@
   "ssExpandTarget": "Expand Target",
   "ssTargetTree": "Target Tree",
   "ssTargetCompass": "Target Compass",
+  "ssTargetKanban": "Target Kanban",
+  "ssTaskColon": ": Task: ",
   "ssUpFile": "Upload File",
+  "ssUploadImage": "Upload Image",
   "ssSubmit": "Submit",
+  "ssTeacherSubmitWork": "Teacher Submit Homework",
   "ssTotalEval": "Total Evaluation",
   "ssTimeDesc": "Time Descending",
   "ssTimeAsc": "Time Ascending",
   "ssMyComment": "My Comment",
   "ssEval": "Eval",
   "ssCommentOf": "'s Comment",
+  "ssCommentOfUser": "*'s Comment",
   "ssDelete": "Delete",
   "ssReply": "Reply",
   "ssAddComment": "Add Comment",
@@ -128,10 +141,18 @@
   "ssTitle": "Title",
   "ssQuestionContent": "Question Content",
   "ssQuestion": "Question",
+  "ssQuestionColon": "Question: ",
+  "ssQuestionTitleColon": "Question: ",
   "ssStudentName": "Student Name",
   "ssViewChoice": "View Choice",
   "ssSingleChoice": "Single Choice",
   "ssMultiChoice": "Multiple Choice",
+  "ssViewRichText": "View Rich Text",
+  "ssTextTitle": "Text Title",
+  "ssRichTextContent": "Rich Text Content",
+  "ssFilePreview": "File Preview",
+  "ssContentEditing": "Content Editing",
+  "ssDownloadSuccess": "Download Successful",
   "ssAiGeneralCourse": "AI General Course",
   "ssCourse": "Course",
   "ssEnterKeyword": "Enter Keywords",
@@ -192,7 +213,7 @@
   "ssLike": "Like:",
   "ssCommentColon": "Comment:",
   "ssHomeworkEvaluationCount": "Homework Evaluation Count:",
-  "ssAverageScore": "Average Score:",
+  "ssAverageScore": "Average",
   "ssScoreUnit": " points",
   "ssSelectStage": "Please select stage",
   "ssCourseQRCode": "Course QR Code",
@@ -229,5 +250,632 @@
   "ssAllGrades": "All Grades",
   "ssClass": "Class",
   "ssNoData": "No Data",
-  "ssStage3": "* Phrase(s)"
+  "ssStage3": "* Phrase(s)",
+  "ssInviteCodeLabel": "Invite Code:",
+  "ssToolNum": "Tool *: ",
+  "ssAiotBlockly": "AIoT Blockly",
+  "ssAiPython": "AI Python",
+  "ssAiBlockly": "AI Blockly",
+  "ssCocoPi": "CocoPi",
+  "ssGeogebra": "GeoGebra",
+  "ssTaskLabel": "Task *",
+  "ssContentListLabel": "Content List:",
+  "ssTimeLabel": "Time:",
+  "ssFeatureNotAvail": "This feature is not yet available!",
+  "ssCloseBtn": "Close",
+  "ssViewVideo": "View Video",
+  "ssViewDetails": "View Details",
+  "ssTeacherAnnotation": "Teacher Annotation",
+  "ssSelectStarsForRating": "Please select stars for rating",
+  "ssEnterEvalContent": "Please enter assessment  content...",
+  "ssNoComments": "No comments yet",
+  "ssEvaluation": "Evaluation",
+  "ssEnterComment": "Please enter comment",
+  "ssViewDocument": "View Document",
+  "ssAIApplication": "AI Application",
+  "ssExitFullscreen": "Exit Fullscreen",
+  "ssSelectCorrespondingAnswer": "Please select the corresponding answer to answer the question!",
+  "ssSelectAnswerByQuestion": "Select the corresponding answer according to the question",
+  "ssSelectCorrectAnswer": "Please select the correct answer",
+  "ssAnswerCorrect": "Answer correct",
+  "ssAnswerWrong": "Answer wrong",
+  "ssCorrectAnswer": "Correct answer:",
+  "ssSubmitAnswer": "Submit Answer",
+  "ssTeacherScoring": "Teacher Scoring",
+  "ssClickDownloadFile": "Click to download file",
+  "ssClickOpenCocoPi": "Click to open CocoPi",
+  "ssEnterScore": "Please enter score",
+  "ssScoringComment": "Scoring Comment",
+  "ssEnterStudentEvaluation": "Please enter evaluation of the student",
+  "ssSelectCorrectOrder": "Please select the correct order",
+  "ssHomeworkOf": "'s homework",
+  "ssFormSentence": "Form sentence:",
+  "ssSubmitted": "Submitted",
+  "ssCorrectAnswerBelow": "Correct answer below:",
+  "ssTableContent": "Table Content",
+  "ssRestoreTemplate": "Restore Template",
+  "ssDocumentContent": "Document Content",
+  "ssModify": "Modify",
+  "ssEmptyPosition": "Empty Position",
+  "ssRemoveMember": "Remove Member",
+  "ssExitGroup": "Exit Group",
+  "ssSetGroupCountAndName": "Please set group count and name",
+  "ssSetGroupMemberCount": "Please set members per group",
+  "ssEnterNumber2To10": "Please enter a number from 2-10",
+  "ssClickUploadFile": "Click to upload file",
+  "ssSelectFile": "Select File",
+  "ssSelected": "Selected",
+  "ssMyEvaluation": "My Evaluation",
+  "ssModifyName": "Modify Name",
+  "ssModifyGroup": "Modify Group",
+  "ssRemoveGroupMember": "Remove Group Member",
+  "ssSelectGroupToJoin": "Please select a group to join",
+  "ssSelectMemberToDelete": "Please select members to delete",
+  "ssName": "Name",
+  "ssHomeworkSubmit": "Homework Submit",
+  "ssEssayTitle": "Essay Title:",
+  "ssEssayContent": "Essay Content:",
+  "ssNoteRedDeleteGreenAdd": "Note: Red strikethrough means deleted, green background with white text means added.",
+  "ssAddAnnotation": "Add Annotation",
+  "ssCancelAdd": "Cancel Add",
+  "ssAIAnnotation": "AI Annotation",
+  "ssOriginalAuthor": "Original (Author:",
+  "ssTitleColon": "Title:",
+  "ssContentColon": "Content:",
+  "ssImage": "Image",
+  "ssImageColon": "Image:",
+  "ssWordCloud": "Word Cloud",
+  "ssCourseStarted": "Course Started",
+  "ssFollowTeacherLearning": "Next, you will follow the teacher to start today's learning!",
+  "ssStudyHard": "Study hard~",
+  "ssStartLearningBtn": "Start Learning",
+  "ssAIScoringInProgress": "AI scoring in progress, please wait",
+  "ssConfirmReset": "Confirm reset?",
+  "ssResetCompleted": "Reset completed",
+  "ssNoConcurrentAIScoring": "Please do not perform AI scoring at the same time",
+  "ssDetailGenerating": "Details are being generated, please wait...",
+  "ssNoStarRating": "No star rating.",
+  "ssNetworkPoor": "Poor network",
+  "ssAIEvaluatingInProgress": "AI evaluation in progress, please wait",
+  "ssEvaluationSuccess": "Evaluation successful",
+  "ssEssayTooLongForAI": "Your essay content is too long and cannot use AI annotation!",
+  "ssAICorrectPrompt": "Role: You are a primary school English composition teacher. Based on the content of this article, correct this article and only output a corrected good article. Article: ${t}",
+  "ssSelectTaskToAdd": "Please select the task to add",
+  "ssAddSuccess": "Added successfully",
+  "ssStar0": "0 star",
+  "ssStar2": "2 stars",
+  "ssStar3": "3 stars",
+  "ssStar4": "4 stars",
+  "ssStar5": "5 stars",
+  "ssNotAvailable": "Not available yet",
+  "ssClickTooFast": "Clicking too fast, please wait...",
+  "ssSubmitSuccess": "Submitted successfully",
+  "ssSubmitFailed": "Submission failed",
+  "ssFillAnswersComplete": "Please fill in all answers!",
+  "ssConfirmRestoreTemplate": "Are you sure to restore this template?",
+  "ssPrompt": "Prompt",
+  "ssSplitScreenEnabled": "Split screen mode enabled",
+  "ssSplitScreenDataRetrieved": "Retrieved split screen count:",
+  "ssSplitScreenEnded": "Split screen mode ended",
+  "ssTeacherEndedSplitScreen": "Teacher has ended split screen, free preview after confirmation.",
+  "ssConfirmFreePreview": "Free preview after confirmation",
+  "ssOperationTooFast": "Operation too fast, please wait",
+  "ssSplitScreenClosed": "Split screen mode closed",
+  "ssSplitScreenOpened": "Split screen enabled",
+  "ssSplitScreenOpenFailed": "Failed to open split screen",
+  "ssSelectedByTeacher": "You have been selected by the teacher!",
+  "ssConfirmSubmitCorrection": "Are you sure to submit the correction?",
+  "ssAskStudentToAnswer": "Ask * student to answer the question?",
+  "ssHomeworkSubmissionTool": "Homework Submission Tool",
+  "ssConfirmExportHomework": "Are you sure to export homework?",
+  "ssExitSuccess": "Exit successful",
+  "ssPositionFull": "Position is full, cannot join",
+  "ssPositionLocked": "Position is locked, cannot *",
+  "ssGroupLargerThanSet": "Some groups already have more members than your setting, please reset",
+  "ssSettingSuccess": "Setting successful",
+  "ssScreenRecording": "Screen Recording",
+  "ssOperationSuccess": "Operation successful",
+  "ssJoinSuccess": "Join successful",
+  "ssConfirmDeleteAnnotation": "Are you sure to delete this annotation?",
+  "ssDeleteSuccess": "Delete successful",
+  "ssDeleteFailed": "Delete failed",
+  "ssBatchUploadNoClassPermission": "Prompt: Batch upload has no class permission added, please add class or enter from class entrance.",
+  "ssNoClassPermission": "Prompt: No class permission added, please add class or enter from class entrance.",
+  "ssAppConnectionEmpty": "Application connection is empty, please add in course management",
+  "ssNotSupportedForStudents": "Not supported for student use",
+  "ssPleaseSelectOption": "Please select an option",
+  "ssPleaseFillCompleteInfo": "Please fill in the complete information",
+  "ssAlreadySubmittedHomework": "You have already submitted this homework, if you submit again it will overwrite the previous submission!",
+  "ssConfirmSubmitAgain": "Submitting again will overwrite the original homework and clear the score.",
+  "ssUploadFileRequired": "Please upload file",
+  "ssEnterStudentName": "Please enter student name",
+  "ssEnterEssayContent": "Please enter essay title and content!",
+  "ssHomeworkDeleted": "This homework has been deleted",
+  "ssLikeSuccess": "Like successful",
+  "ssLikeFailed": "Like failed",
+  "ssCancelLikeSuccess": "Cancel like successful",
+  "ssConfirmDeleteComment": "Are you sure to delete this comment?",
+  "ssDeleteCommentSuccess": "Comment deleted successfully",
+  "ssOnlyOneCommentPerHomework": "Only one comment per homework",
+  "ssCommentSuccess": "Comment successful",
+  "ssCommentFailed": "Comment failed",
+  "ssPleaseRate": "Please rate",
+  "ssRatingSuccess": "Rating successful",
+  "ssRatingFailed": "Rating failed",
+  "ssConfirmDeleteWork": "Are you sure to delete this homework?",
+  "ssNetworkError": "Network error",
+  "ssNoAISetting": "You have not set up AI scoring yet, please modify the evaluation settings of this tool before using it.",
+  "ssUploadFailed": "Upload failed",
+  "ssFollowModeOn": "Follow mode is already enabled, please listen carefully to the lecture",
+  "ssTaskLocked": "Task not unlocked",
+  "ssPrevTaskLocked": "Previous task not unlocked",
+  "ssCommentEmpty": "Comment cannot be empty!",
+  "ssAddFailed": "Add failed",
+  "ssReplyEmpty": "Reply cannot be empty!",
+  "ssReplySuccess": "Reply successful",
+  "ssReplyFailed": "Reply failed",
+  "ssPermSetSuccess": "Permission setting successful",
+  "ssPermClosedOk": "Permission closed successfully",
+  "ssStuViewPermOn": "Student view content permission enabled",
+  "ssStuViewPermOff": "Close student view content permission",
+  "ssFollowModeOn2": "Follow mode enabled",
+  "ssFollowModeOff": "Follow mode disabled",
+  "ssAnnotationImage": "Annotation.png",
+  "ssFullScreenView": "Full Screen View",
+  "ssFileDownload": "File Download",
+  "ssRatingScale": "Rating Scale",
+  "ssPermissionSetting": "Permission Settings",
+  "ssAllowViewAllHomework": "Allow students to view all homework",
+  "ssProhibitViewStage": "Prohibit students from viewing stages",
+  "ssEnableFollowMode": "Enable follow mode",
+  "ssAllowViewContent": "Allow students to view content materials",
+  "ssOpenSeatTip": "Tip: Enable [Open Seating] to allow students to freely join and leave groups.",
+  "ssEnterName": "Please enter name...",
+  "ssCountdownHint": "Hint: Click '+' or '-' to modify the countdown duration.",
+  "ssCommentLabel": "Comments:",
+  "ssPositionLockedCannotJoin": "Position is locked and cannot be joined",
+  "ssPositionFullCannotJoin": "Position is full and cannot be joined",
+  "ssPositionLockedCannotExit": "Position is locked and cannot be exited",
+  "ssTeachingPlan": "Teaching Plan",
+  "ssEnterStudentNamePlaceholder": "Please enter student name",
+  "ssSelectStudentPlaceholder": "Please select student",
+  "ssVideoNotSupported": "This video cannot be played for now, please try again later",
+  "ssVeryCreative": "Very creative!",
+  "ssNotBad": "Not bad~",
+  "ssKeepTrying": "Keep trying~",
+  "ssInvalidRequest": "Invalid request, please try again",
+  "ssLockPosition": "Lock Position",
+  "ssUnlockPosition": "Unlock Position",
+  "ssOpenSeat": "Open Seat Selection",
+  "ssAdd": "Add",
+  "ssNoMatchingContent": "No matching content found.",
+  "ssStreamStopListening": "Stream stop listening",
+  "ssPermissionGrantedSuccess": "Permission granted successfully",
+  "ssCheckMicrophone": "Please check if microphone exists",
+  "ssSplitScreenDataSuccess": "Split screen data success",
+  "ssSplitScreenDataFailed": "Split screen data failed",
+  "ssCancelBtn": "Cancel",
+  "ssConfirmBtn": "Confirm",
+  "ssHomeworkDialog": "Homework Dialog",
+  "ssConfirmDeleteReply": "Confirm delete this reply?",
+  "ssTaskWithColon": "Task:",
+  "ssCatalog": "Catalog",
+  "ssDownloadRecord": "Download Recording",
+  "ssLearnLearn": "Learn",
+  "ssTeacherWorkspace": "Teacher Workspace",
+  "ssEvaluationType": "Evaluation",
+  "ssTip": "Tip",
+  "ssFunctionNotOpen": "This function is not yet available!",
+  "ssPermissionSettings": "Permission Settings",
+  "ssAllowStudentViewAllWork": "Allow students to view all assignments",
+  "ssProhibitStudentViewStage": "Prohibit students from viewing stages",
+  "ssAllowStudentViewContent": "Allow students to view content materials",
+  "ssGroupNumName": "Group * Name:",
+  "ssReturnBtn": "Return",
+  "ssToolLabel": "Tool",
+  "ssSubmitDescText": "(Submit pictures, texts, videos, etc.)",
+  "ssMoleculeLabel": "Molecule Structure",
+  "ssCourseDesignLabel": "Course Design",
+  "ssGoalManageLabel": "Goal Management",
+  "ssExitGroupBtn": "Exit Group",
+  "ssAddBtn": "Add",
+  "ssDeleteBtn": "Delete",
+  "ssSelectGroupPrompt": "Please select a group to join",
+  "ssSelectMemberPrompt": "Please select members to delete",
+  "ssSelectStudentPrompt": "Please select student",
+  "ssEditNoteText": "Note: Red strikethrough means deleted, green background with white text means added.",
+  "ssWordCloudTitle": "Word Cloud",
+  "ssFollowTeacherMsg": "Next, you will follow the teacher to start today's learning!",
+  "ssStudyHardMsg": "Please study hard~",
+  "ssCourseStartWithTitle": "“*” course has started!",
+  "ssPdfLoadingPleaseWait": "PDF may take some time to load, please be patient...",
+  "ssOption": "Option",
+  "ssSubtotal": "Subtotal",
+  "ssProportion": "Proportion",
+  "ssSelectStudent": "Select student:",
+  "ssViewStudent": "Details",
+  "ssCorrectCount": "Statistics on correct answers",
+  "ssCorrectStudents": "Students Who Answered Correctly:",
+  "ssQuestionTooltip": "Question {b0}: {c0} correct",
+  "ssAnswerCount": "Participants",
+  "ssTotalCorrectCount": "All-Correct Students:",
+  "ssSentence": "Sentence",
+  "ssAnswerLabel": "Answer:",
+  "ssEnterContent": "Please enter content",
+  "ssTimeUp": "Time's up!!!",
+  "ssImport": "Import",
+  "ssSave": "Save",
+  "ssDownloadMindMap": "Download Mind Map",
+  "ssGetData": "Get Data",
+  "ssAddNode": "Add Node",
+  "ssAddBrotherNode": "Add Brother Node",
+  "ssEditNode": "Edit Node",
+  "ssDeleteNode": "Delete Node",
+  "ssZoomIn": "Zoom In",
+  "ssZoomOut": "Zoom Out",
+  "ssExpandNodes": "Expand Nodes",
+  "ssTheme": "Theme:",
+  "ssSelectTheme": "Select Theme",
+  "ssFontSize": "Font Size",
+  "ssFontWeight": "Font Weight",
+  "ssRegular": "Regular",
+  "ssBold": "Bold",
+  "ssBolder": "Bolder",
+  "ssFontStyle": "Font Style",
+  "ssStandard": "Standard",
+  "ssItalic": "Italic",
+  "ssOblique": "Oblique",
+  "ssBackgroundColor": "Background Color",
+  "ssFontColor": "Font Color",
+  "ssNodeContent": "Node Content",
+  "ssConfirmEdit": "Confirm",
+  "ssOpenSuccess": "Opened successfully",
+  "ssCannotOpenMindmap": "Cannot open mindmap file",
+  "ssPleaseSelectFile": "Please select a file first",
+  "ssPleaseSelectNode": "Please select a node first!",
+  "ssCannotAddRoot": "Cannot add to root node, please select another node!",
+  "ssExpandToLevel1": "Expand to Level 1 Nodes",
+  "ssExpandToLevel2": "Expand to Level 2 Nodes",
+  "ssExpandToLevel3": "Expand to Level 3 Nodes",
+  "ssExpandAll": "Expand All Nodes",
+  "ssCollapseAll": "Collapse All Nodes",
+  "ssStartRecording": "Start Recording",
+  "ssStopRecording": "Stop Recording",
+  "ssPlayRecording": "Play Recording",
+  "ssStopPlaying": "Stop Playing",
+  "ssUploadRecording": "Upload Recording",
+  "ssNoMicrophone": "No available microphone found, or you have not allowed this webpage to use the microphone",
+  "ssRecordBeforeUpload": "Please record before uploading audio",
+  "ssMove": "Move",
+  "ssColor": "Color",
+  "ssThickness": "Thickness",
+  "ssBrush": "Brush",
+  "ssClear": "Clear",
+  "ssClose": "Close",
+  "ssSaveAnnotation": "Save Annotation",
+  "ssPleaseAnswer": "Please answer the questions",
+  "ssAddStudent": "Add Student",
+  "ssFillCustomName": "Fill in custom name",
+  "ssNoName": "No name available",
+  "ssSelectOrFillStudent": "Please select a student or fill in a custom name",
+  "ssNoContent": "No content",
+  "ssOnlineWriting": "Online Writing",
+  "ssImageUpload": "Image Upload",
+  "ssPleaseFillEssayTitle": "Please fill in your essay title",
+  "ssPleaseUploadImage": "Please upload image!",
+  "ssConfirmClearContent": "If you have already filled in content, it will be cleared after confirmation.",
+  "ssViewTeacherEvaluation": "View Teacher Evaluation",
+  "ssScoringCriteria": "Scoring Criteria:",
+  "ssHomeworkEvaluation": "Homework Evaluation:",
+  "ssAIEvaluation": "AI Evaluation",
+  "ssEnterValueGreaterThanZero": "Please enter a value greater than 0",
+  "ssValueCannotExceed100": "Value cannot exceed 100",
+  "ssPleaseEnterNumber": "Please enter a number",
+  "ssClickSubmit": "Click to submit",
+  "ssStudentReport": "Student Report",
+  "ssSaveSuccess": "Save successful",
+  "ssConfirmResetContent": "Do you want to reset the already filled content?",
+  "ssAnyMoreSupplements": "Do you have any more supplements?",
+  "ssTeachingObjectives": "Teaching Objectives (5 points)",
+  "ssTeachingContent": "Instructional Content (5 points)",
+  "ssTeachingProcess": "Teaching Process (30 points)",
+  "ssTeachingMethods": "Teaching Methods and Strategies (20 points)",
+  "ssTeachingTools": "Instructional Tools (15 points)",
+  "ssTeachingEvaluation": "Teaching Evaluation (10 points)",
+  "ssInnovation": "Innovation Consciousness (10 points)",
+  "ssTeachingEffect": "Teaching Effect (5 points)",
+  "ssBonusPoints": "Bonus Points (10 points)",
+  "ssComments": "Comment",
+  "ssEnterPositiveInteger": "Please enter a positive integer",
+  "ssCannotEnterScoreAbove": "Cannot enter a score higher than the maximum",
+  "ssTeachingObjectivesDesc": "Complete framework that clearly articulates the learning process and expected outcomes. Objectives are student-appropriate, feasible, and logically progressive. Emphasizes student-centered and competency-based approaches, extending beyond mere knowledge/skill acquisition.",
+  "ssTeachingContentDesc": "Highlights core challenges while aligning with curriculum standards and textbooks (no overextension). Content suits student demographics, connects to real-life contexts, and promotes positive educational values. Demonstrates awareness of students' Zone of Proximal Development (ZPD) with differentiated teaching intent.",
+  "ssTeachingProcessStructure": "The class structure is reasonable, compact, and well-organized, with clear layers and a focus on resolving key and difficult points. (10 points)",
+  "ssTeachingProcessLearning": "Emphasizes the design of “learning” activities, integrating teaching and learning organically. (10 points)",
+  "ssTeachingProcessManagement": "Classroom management is orderly, teaching language is clear and accurate, and problems in the classroom can be resolved promptly and reasonably, demonstrating good teaching qualities. (10 points)",
+  "ssTeachingMethodsDesc": "They are in line with the Instructional content and the characteristics of the subject. They are implemented effectively, can reflect students' learning outcomes, and do not fall into a mere formality. They have a certain novelty and demonstrate the teacher's independent thinking and exploration consciousness.",
+  "ssTeachingToolsDesc": "Use information technology, learning sheets, self-made teaching props, auxiliary resources, etc. in a reasonable and scientific manner.",
+  "ssTeachingEvaluationDesc": "They attach importance to evaluation and have reasonable evaluation methods and tools. The evaluation is implemented effectively, reflecting specificity and professionalism.",
+  "ssInnovationDesc": "The selection and arrangement of teaching space have unique ideas and are reasonable and effective. They dare to try diverse teaching forms, such as thematic, large-unit, project-based, and gamified. They develop characteristic and effective teaching strategies and means, such as group cooperative exploration and interdisciplinary performances. The teacher has a distinct personal style.",
+  "ssTeachingEffectDesc": "The goals are achieved. Resources are generated throughout the process. Students have experiences of satisfaction, success, and joy during the learning process, and have more confidence for subsequent learning and their abilities have been developed.",
+  "ssBonusPointsDesc": "A particular advantage is particularly prominent, such as teaching style, teaching philosophy, teaching characteristics, teaching methods, etc.",
+  "ssStudentFreePreview": "Student Free Preview",
+  "ssOpenHomeworkPreview": "Open Homework Preview",
+  "ssSplitScreen": "Split Screen",
+  "ssQuiz": "Quiz",
+  "ssDialogue": "Dialogue",
+  "ssWorkflow": "Workflow",
+  "ssAssistant": "Assistant",
+  "ssAnnotation": "Annotation",
+  "ssStartVoiceAssistant": "Start Voice Assistant",
+  "ssCloseVoiceAssistant": "Close Voice Assistant",
+  "ssUploadingRecording": "Uploading recording file, please wait...",
+  "ssRecordClassroom": "Record Classroom",
+  "ssOpenCountdownPanel": "Countdown Panel",
+  "ssPleaseWait": "Please wait...",
+  "ssAIVoiceEnabled": "AI Voice Enabled",
+  "ssAIVoiceDisabled": "AI Voice Disabled",
+  "ssCloseSplitScreenOnDevice": "Need to close split screen on the device that opened it",
+  "ssNotSplitScreenCreator": "You are not the split screen creator and cannot close it",
+  "ssOnlyTeacherCanSplitScreen": "Only teachers can split screen",
+  "ssUploadToResourceSuccess": "Upload to resource library successful",
+  "ssConfirmUploadToResource": "Upload * to resource library?",
+  "ssUploadFileToResourceSuccess": "Upload '*' to resource library successful",
+  "ssCompetence": "Competence",
+  "ssExit": "Exit",
+  "ssStudentWorkPreview": "Student Work Preview",
+  "ssSingleChoiceColon": "Single Choice: ",
+  "ssMultipleChoiceColon": "Multiple Choice: ",
+  "ssComposeSentence": "Compose Sentence: ",
+  "ssNodeLabel": "Node *",
+  "ssXiaoKeAIAssistant": "XiaoKe AI Assistant",
+  "ssWorkOnlyShowsDialog": "Work can only display dialogue text for now~",
+  "ssPreviewImage": "Preview Image",
+  "ssQuestionImage": "Question Image",
+  "ssQuestionSituation": "Question Situation",
+  "ssStudentSummary": "Student Summary",
+  "ssClassSummary": "Class Summary",
+  "ssDataStatisticsChart": "Data Statistics Chart",
+  "ssDataDetails": "Data Details",
+  "ssQuestionNumber": "Question *",
+  "ssTotal": "Total",
+  "ssScoringCount": "Rating Count",
+  "ssTotalAverageScore": "Average Rating",
+  "ssSerialNumber": "Serial number",
+  "ssCourseStructure": "Course structure",
+  "ssActivityDesign": "Activity design",
+  "ssOrderManagement": "Order management",
+  "ssTotalScore": "Total score",
+  "ssWorkDetails": "Work Details",
+  "ssQuestionStatistics": "Question Statistics",
+  "ssStudentStatistics": "Student Statistics",
+  "ssSmartAnalysis": "Smart Analysis",
+  "ssAiAssistant": "AI Assistant",
+  "ssMindNetwork": "Mind Network",
+  "ssAppStore": "App Store",
+  "ssOptionSummary": "Option Summary",
+  "ssPleaseSelect": "Please select",
+  "ssEnterEvaluation": "Please enter evaluation content...",
+  "ssNoTitle": "No title",
+  "ssSingleChoiceWithColon": "Single choice:",
+  "ssMultipleChoiceWithColon": "Multiple choice:",
+  "ssGroupSettings": "Group Settings",
+  "ssEnter2to10Digits": "Please enter 2-10 digits",
+  "ssAccuracyRate": "Accuracy Rate",
+  "ssAiApplication": "AI Application",
+  "ssNone": "None",
+  "ssMultipleChoice": "Multiple Choice",
+  "ssAsk": "Ask",
+  "ssPleaseChooseCorrectOrder": "Please choose the correct order",
+  "ssAccuracyRateColon": "Accuracy Rate: ",
+  "ssNoUnsubmittedStudents": "No unsubmitted students...",
+  "ssWorkPreview": "Work Preview",
+  "ssNoSubmittedStudents": "No submitted students...",
+  "ssCocoPiWork": "CocoPi Work",
+  "ssPleaseSetGroupNumberAndName": "Please set the number and names of groups",
+  "ssGroupNameColon": "Group * name:",
+  "ssPleaseSetGroupSize": "Please set the group size",
+  "ssPleaseSelectMembersToDelete": "Please select members to delete",
+  "ssUploadFailedPptData": "Failed to upload PPT data",
+  "ssGroupSizeExceedsSetting": "There are already groups with more members than your setting, please reset",
+  "ssOptionLabel": "Option *",
+  "ssQuestionLabel": "Question *",
+  "ssPleaseEnterTitleAndContent": "Please enter the essay title and content!",
+  "ssPleaseFillAnswer": "Please fill in the answer",
+  "ssPleaseSelectAnswer": "Please select an answer",
+  "ssPleaseCompleteAnswer": "Please complete the answer!",
+  "ssCannotViewOnProjection": "Cannot view under projection",
+  "ssUploadSuccess": "Upload successful",
+  "ssI": "I",
+  "ssGuessYouWantToSearch": "Guess you want to search:",
+  "ssSelectAgent": "Select the agent you need and start a conversation",
+  "ssMy": "My",
+  "ssCommunity": "Community",
+  "ssPleaseEnterContent": "Please enter content",
+  "ssClearChatHistory": "Clear chat history",
+  "ssDefaultNotRead": "Default not to read aloud",
+  "ssDefaultRead": "Default to read aloud",
+  "ssClassTips": "Class Tips",
+  "ssAgent": "Agent",
+  "ssGenerateImage": "Generate Image",
+  "ssSearchImage": "Search Image",
+  "ssSearchVideo": "Search Video",
+  "ssPleaseSpeak": "Please speak",
+  "ssVoiceInput": "Voice Input",
+  "ssTextInput": "Text Input",
+  "ssEndRecording": "End Recording",
+  "ssSend": "Send",
+  "ssStopSending": "Stop Sending",
+  "ssVoiceAssistant": "Voice Assistant",
+  "ssSearchDesiredAgent": "Search desired agent",
+  "ssQuery": "Query",
+  "ssUseVoice": "Use Voice",
+  "ssUseKeyboard": "Use Keyboard",
+  "ssCopySuccess": "Copy successful",
+  "ssClearChatHistoryPrompt": "Are you sure to clear chat history?",
+  "ssClearChatHistorySuccess": "Clear chat history successful",
+  "ssClearChatHistoryFailed": "Clear chat history failed",
+  "ssGetVideoFailed": "Get video failed",
+  "ssGenerateImageFailed": "Generate image failed",
+  "ssGenerateFailed": "Generate failed",
+  "ssGetChatHistoryFailed": "Get chat history failed",
+  "ssImageNotSupportDownload": "This image does not support download",
+  "ssHelloHowCanIHelp": "Hello, how can I help you?",
+  "ssGetRoleListFailed": "Get role list failed",
+  "ssGetPublicRoleFailed": "Get public role failed",
+  "ssToolSimulationDriving": "Simulation Driving",
+  "ssToolPathSearch": "Path Search",
+  "ssToolDeepLearning": "Deep Learning",
+  "ssToolPersonalEvaluation": "Self Assessment",
+  "ssToolAiotBlockly": "AIoT Blockly",
+  "ssToolAiPython": "AI Python",
+  "ssToolAiBlockly": "AI Blockly",
+  "ssToolCocoPi": "CocoPi",
+  "ssToolGeogebra": "GeoGebra",
+  "ssToolMolecularStructure": "Molecular Structure",
+  "ssToolTimeline": "Timeline",
+  "ssToolGoalManagement": "Goal Management",
+  "ssToolCourseDesign": "Course Design",
+  "ssToolInteractiveVideo": "Interactive Video",
+  "ssMembers": "Members",
+  "ssNoMembers": "No members...",
+  "ssHomeworkSubmissionStatus": "Homework Submission Status",
+  "ssSummaryAnalysis": "Summary Analysis",
+  "ssHomeworkDetails": "Homework Details",
+  "ssOptions": "Options:",
+  "ssClickToSpeak": "Click to speak",
+  "ssClickRecordingButton": "Please click the recording button to start recording",
+  "ssQuestionText": "Question:",
+  "ssAnswerText": "Answer:",
+  "ssStudentText": "Student:",
+  "ssCorrectAnswerText": "Correct Answer:",
+  "ssPleaseStopRecordingFirst": "Please stop recording first",
+  "ssPleaseStartRecordingFirst": "Please start recording first",
+  "ssPleaseWaitDots": "Please wait...",
+  "ssConfirmDialogTitle": "Prompt",
+  "ssVideoKeyword": "video",
+  "ssImageKeyword": "image",
+  "ssStudentGrade": "Student Grade:",
+  "ssCategoryLabel": "Category:",
+  "ssTaskTimeAllocation": "Task Time Allocation",
+  "ssCourseTimeline": "Course Timeline",
+  "ssTaskStatus": "Task Status",
+  "ssStudentActivity": "Students are active...",
+  "ssSubmitCount": "Number of Submissions",
+  "ssPersonUnit": "people",
+  "ssCompletionRate": "Completion Rate",
+  "ssCommunication": "Communication & Interaction",
+  "ssParticipantCount": "Number of Participants",
+  "ssLikeCount": "Number of Likes",
+  "ssItemUnit": "items",
+  "ssCommentCount": "Number of Comments",
+  "ssCommentUnit": "comments",
+  "ssConsolidatePractice": "Consolidate Practice",
+  "ssNoExerciseAdded": "No exercises added to current class",
+  "ssOneClickGenerate": "One-click Generate",
+  "ssClassManagement": "Class Management",
+  "ssEditToolAddTopics": "Edit tools, add topics independently",
+  "ssTopicStatistics": "Topic Statistics",
+  "ssAnswerAnalysis": "Answer Analysis",
+  "ssNoStudentSubmit": "No students have submitted yet.",
+  "ssConfirmSelection": "Confirm Selection",
+  "ssSmartGenerate": "Smart Generation",
+  "ssSimilarTopic": "Similar Topic",
+  "ssHarderTopic": "Harder Topic",
+  "ssEasierTopic": "Easier Topic",
+  "ssPreviousTopic": "Previous Topic",
+  "ssNextTopic": "Next Topic",
+  "ssClick": "Click",
+  "ssAutoGenerate10": "Auto generate 10",
+  "ssPracticeQuestions": "practice questions",
+  "ssGoTo": "Go to",
+  "ssEditToolAddTopics2": "Edit tools, add topics independently",
+  "ssStatistics": "Statistics",
+  "ssAnalysis": "Analysis",
+  "ssAnswer": "Answer:",
+  "ssNoStudentSubmitPractice": "No students have submitted practice yet.",
+  "ssOneClickGenerateFailed": "One-click generation failed",
+  "ssSmartGenerateFailed": "Smart generation failed",
+  "ssTopicAlreadySubmitted": "This topic has already been submitted",
+  "ssPleaseAnswerFirst": "Please answer first",
+  "ssTeacherAddedNewTopics": "Teacher has added new topics",
+  "ssGenerateAnalysisFailed": "Failed to generate analysis",
+  "ssLinkAddress": "Link Address",
+  "ssPersonalEvalContent": "Personal Evaluation Content",
+  "ssSubmitContent": "Submitted Content",
+  "ssChatContent": "Chat Content",
+  "ssSubmitTime": "Submission Time",
+  "ssInsertTable": "Insert Table",
+  "ssMinute": "min",
+  "ssSecond": "sec",
+  "ssQuickSettings": "Quick Settings",
+  "ssCommon": "Common",
+  "ssMore": "More",
+  "ssTimer": "Timer",
+  "ssTeachingActivityMemo": "Teaching Activity Memo",
+  "ssAllEvents": "All Events",
+  "ssTimingEvents": "Timing Events",
+  "ssExport": "Export",
+  "ssCountdownRunning": "Countdown is running",
+  "ssTimerRunning": "Timer is running",
+  "ssCountdownMaxHour": "Countdown maximum 1 hour",
+  "ssSetCountdownTime": "Please set countdown time",
+  "ssCountdownPaused": "Countdown paused",
+  "ssCountdownStarted": "Countdown started",
+  "ssTimerStopped": "Timer stopped",
+  "ssTimerStarted": "Timer started",
+  "ssResetDone": "Reset done",
+  "ssConfirmResetCountdown": "Countdown is running! Confirm reset countdown?",
+  "ssConfirmResetTimer": "Timer is running! Confirm reset timer?",
+  "ssConfirmResetBasic": "Confirm reset",
+  "ssExportSuccess": "Export successful",
+  "ssGetMoreTagsFailed": "Failed to get more behavior tags",
+  "ssGetMemoFailed": "Failed to get behavior memo",
+  "ssStopTimerFirst": "Please stop timer first before setting",
+  "ssBehaviorTags": "Behavior Tags",
+  "ss30Seconds": "30 seconds",
+  "ss1Minute": "1 minute",
+  "ss2Minutes": "2 minutes",
+  "ss3Minutes": "3 minutes",
+  "ss5Minutes": "5 minutes",
+  "ss6Minutes": "6 minutes",
+  "ss8Minutes": "8 minutes",
+  "ss10Minutes": "10 minutes",
+  "ssHideMusicList": "Hide music list",
+  "ssShowMusicList": "Show music list",
+  "ssTurnOffMusic": "Turn off music",
+  "ssTurnOnMusic": "Turn on music",
+  "ssMusic1": "Music 1",
+  "ssMusic2": "Music 2",
+  "ssMusic3": "Music 3",
+  "ssMusic4": "Music 4",
+  "ssMusic5": "Music 5",
+  "ssGroupDiscussion": "Group Discussion",
+  "ssGroupReport": "Group Report",
+  "ssHandsOnExperiment": "Hands-on Experiment",
+  "ssClassroomGame": "Classroom Game",
+  "ssIndependentLearning": "Independent Learning",
+  "ssWorkDisplay": "Work Display",
+  "ssStudentSpeech": "Student Speech",
+  "ssStudentShare": "Student Share",
+  "ssClassPractice": "Class Practice",
+  "ssQuickQAndA": "Quick Q&A",
+  "ssReadingMaterials": "Reading Materials",
+  "ssObservationRecord": "Observation Record",
+  "ssEvent": "Event",
+  "ssTimeDifference": "Time Difference",
+  "ssViewHomework": "View Homework",
+  "ssPerformLike": "Perform Like",
+  "ssPerformComment": "Perform Comment",
+  "ssPerformRating": "Perform Rating",
+  "ssHourUnit": "h",
+  "ssEventExportFileName": "Events.xlsx",
+  "ssPerformActionOn": "",
+  "ssSet": "Set",
+  "ssUsedFor": ", used for",
+  "ssEndTimer": "End timer, ",
+  "ssTimerWord": "timer",
+  "ssMinuteWord": "minutes",
+  "ssSecondWord": "seconds",
+  "ssResetTimer": "Reset"
 }

+ 649 - 1
src/lang/hk.json

@@ -21,7 +21,9 @@
   "ssSurvey": "問卷調查",
   "ssChoice": "選擇題",
   "ssQa": "問答",
+  "ssQaQuestion": "問答題",
   "ssHomework": "作業提交",
+  "ssHomeworkDesc": "(提交圖文視頻等)",
   "ssBatchUpload": "批量上傳",
   "ssMatch": "選擇匹配",
   "ssSort": "排序",
@@ -50,6 +52,9 @@
   "ssNext": "下一步",
   "ssPermission": "權限",
   "ssReturn": "返回",
+  "ssFormManagement": "表單管理",
+  "ssAIAnalysis": "AI分析",
+  "ssAnonymous": "匿名",
   "ssNoDesc": "暫無描述",
   "ssViewDoc": "查看文檔",
   "ssContentList": "內容列表",
@@ -71,6 +76,7 @@
   "ssAllHistory": "全歷史",
   "ssToolDesc": "工具描述",
   "ssEnterTaskDesc": "請輸入任務描述",
+  "ssEnterProjectKeyQuestion": "請填寫項目課程關鍵問題....",
   "ssUploadHomework": "上傳作業",
   "ssGenerateWordCloud": "生成詞雲",
   "ssExportHomework": "導出作業",
@@ -86,8 +92,10 @@
   "ssQuestionNum": "第*題",
   "ssRightPerson": "答對人數",
   "ssGroupSetting": "分組設置",
+  "ssGroupNameFormat": "第*組名稱:",
   "ssCurrentCount": "目前人數",
   "ssPerson": "人",
+  "ssCurrentCountNum": "目前人數*人",
   "ssEvaluate": "評一評",
   "ssTarget": "目標",
   "ssEvalDimension": "評價維度",
@@ -99,14 +107,19 @@
   "ssExpandTarget": "展開目標",
   "ssTargetTree": "目標樹",
   "ssTargetCompass": "目標羅盤",
+  "ssTargetKanban": "目標看板",
+  "ssTaskColon": ":任務:",
   "ssUpFile": "上傳文件",
+  "ssUploadImage": "上傳圖片",
   "ssSubmit": "提交",
+  "ssTeacherSubmitWork": "教師提交作業",
   "ssTotalEval": "總評",
   "ssTimeDesc": "時間降序",
   "ssTimeAsc": "時間升序",
   "ssMyComment": "我的評課",
   "ssEval": "評",
   "ssCommentOf": "的評論",
+  "ssCommentOfUser": "*的評論",
   "ssDelete": "刪除",
   "ssReply": "回復",
   "ssAddComment": "添加評論",
@@ -128,10 +141,18 @@
   "ssTitle": "標題",
   "ssQuestionContent": "題目內容",
   "ssQuestion": "題目",
+  "ssQuestionColon": "題目:",
+  "ssQuestionTitleColon": "提問:",
   "ssStudentName": "學生姓名",
   "ssViewChoice": "查看選擇題",
   "ssSingleChoice": "單選題",
   "ssMultiChoice": "多選題",
+  "ssViewRichText": "查看富文本",
+  "ssTextTitle": "文本標題",
+  "ssRichTextContent": "富文本內容",
+  "ssFilePreview": "文件預覽",
+  "ssContentEditing": "文案編輯",
+  "ssDownloadSuccess": "下載成功",
   "ssAiGeneralCourse": "AI通識課",
   "ssCourse": "課程",
   "ssEnterKeyword": "請輸入關鍵字",
@@ -229,5 +250,632 @@
   "ssAllGrades": "全部年級",
   "ssClass": "班級",
   "ssNoData": "暫無數據",
-  "ssStage3": "* 階段"
+  "ssStage3": "* 階段",
+  "ssInviteCodeLabel": "識別碼:",
+  "ssToolNum": "工具*:",
+  "ssAiotBlockly": "AIoT Blockly",
+  "ssAiPython": "AI Python",
+  "ssAiBlockly": "AI Blockly",
+  "ssCocoPi": "CocoPi",
+  "ssGeogebra": "GeoGebra",
+  "ssTaskLabel": "任務*",
+  "ssContentListLabel": "內容列表:",
+  "ssTimeLabel": "時間:",
+  "ssFeatureNotAvail": "此功能暫未開放!",
+  "ssCloseBtn": "關閉",
+  "ssViewVideo": "查看視頻",
+  "ssViewDetails": "查看詳情",
+  "ssTeacherAnnotation": "教師批注",
+  "ssSelectStarsForRating": "請選擇星星進行評分",
+  "ssEnterEvalContent": "請輸入評價內容...",
+  "ssNoComments": "暫無評論",
+  "ssEvaluation": "評價",
+  "ssEnterComment": "請輸入評論",
+  "ssViewDocument": "查看文檔",
+  "ssAIApplication": "AI應用",
+  "ssExitFullscreen": "退出全屏",
+  "ssSelectCorrespondingAnswer": "請選擇對應的答案進行答題!",
+  "ssSelectAnswerByQuestion": "根據題目選擇對應答案",
+  "ssSelectCorrectAnswer": "請選擇正確答案",
+  "ssAnswerCorrect": "回答正確",
+  "ssAnswerWrong": "回答錯誤",
+  "ssCorrectAnswer": "正確答案:",
+  "ssSubmitAnswer": "提交答案",
+  "ssTeacherScoring": "教師評分",
+  "ssClickDownloadFile": "點擊下載文件",
+  "ssClickOpenCocoPi": "點擊打開CocoPi",
+  "ssEnterScore": "請輸入分數",
+  "ssScoringComment": "評分評論",
+  "ssEnterStudentEvaluation": "請輸入對學生的評價",
+  "ssSelectCorrectOrder": "請選擇正確順序",
+  "ssHomeworkOf": "的作業",
+  "ssFormSentence": "組成句子:",
+  "ssSubmitted": "已提交",
+  "ssCorrectAnswerBelow": "正確答案如下:",
+  "ssTableContent": "表格內容",
+  "ssRestoreTemplate": "還原模板",
+  "ssDocumentContent": "文檔內容",
+  "ssModify": "修改",
+  "ssEmptyPosition": "空位置",
+  "ssRemoveMember": "移除組員",
+  "ssExitGroup": "退出分組",
+  "ssSetGroupCountAndName": "請設置小組數量及名稱",
+  "ssSetGroupMemberCount": "請設置每組人數",
+  "ssEnterNumber2To10": "請輸入2-10的數字",
+  "ssClickUploadFile": "點擊上傳文件",
+  "ssSelectFile": "選擇檔案",
+  "ssSelected": "已選擇",
+  "ssMyEvaluation": "我的評價",
+  "ssModifyName": "修改名稱",
+  "ssModifyGroup": "修改分組",
+  "ssRemoveGroupMember": "移除組員",
+  "ssSelectGroupToJoin": "請選擇要進入的分組",
+  "ssSelectMemberToDelete": "請選擇要刪除的組員",
+  "ssName": "名稱",
+  "ssHomeworkSubmit": "作業提交",
+  "ssEssayTitle": "作文題目:",
+  "ssEssayContent": "作文內容:",
+  "ssNoteRedDeleteGreenAdd": "注:紅色劃線字為刪除,綠色背景白色字為新添加.",
+  "ssAddAnnotation": "添加批注",
+  "ssCancelAdd": "取消添加",
+  "ssAIAnnotation": "AI批注",
+  "ssOriginalAuthor": "原文( 作者:",
+  "ssTitleColon": "標題:",
+  "ssContentColon": "正文:",
+  "ssImage": "圖片",
+  "ssImageColon": "圖片:",
+  "ssWordCloud": "詞雲",
+  "ssCourseStarted": "開課啦",
+  "ssFollowTeacherLearning": "接下來你將跟隨老師一起開始今天的学习!",
+  "ssStudyHard": "要認真聽講哦~",
+  "ssStartLearningBtn": "開始學習",
+  "ssAIScoringInProgress": "正在進行AI評分中,請稍後",
+  "ssConfirmReset": "確認一鍵重置?",
+  "ssResetCompleted": "重置完成",
+  "ssNoConcurrentAIScoring": "請勿同時進行AI評分",
+  "ssDetailGenerating": "細則努力生成中,請稍候……",
+  "ssNoStarRating": "未有星級。",
+  "ssNetworkPoor": "網路不佳",
+  "ssAIEvaluatingInProgress": "正在AI評價進程中請稍後",
+  "ssEvaluationSuccess": "評價成功",
+  "ssEssayTooLongForAI": "你的作文內容太長,無法使用Ai批注!",
+  "ssAICorrectPrompt": "Role: 你係一名小學英文作文老師,根據呢篇文章嘅內容,去批改呢篇文章,然後只輸出篇經修改嘅好文章。文章:${t}",
+  "ssSelectTaskToAdd": "請選擇要添加的任務",
+  "ssAddSuccess": "添加成功",
+  "ssStar0": "0星",
+  "ssStar2": "2星",
+  "ssStar3": "3星",
+  "ssStar4": "4星",
+  "ssStar5": "5星",
+  "ssNotAvailable": "暫未開放",
+  "ssClickTooFast": "點擊過快,請稍後...",
+  "ssSubmitSuccess": "提交成功",
+  "ssSubmitFailed": "提交失敗",
+  "ssFillAnswersComplete": "請將答案填寫完整!",
+  "ssConfirmRestoreTemplate": "確定還原此模板嗎?",
+  "ssPrompt": "提示",
+  "ssSplitScreenEnabled": "分屏模式已開啟",
+  "ssSplitScreenDataRetrieved": "獲取了分屏數:",
+  "ssSplitScreenEnded": "已結束分屏模式",
+  "ssTeacherEndedSplitScreen": "教師已結束分屏,確定後自由預覽。",
+  "ssConfirmFreePreview": "確定後自由預覽",
+  "ssOperationTooFast": "操作過快,請稍等",
+  "ssSplitScreenClosed": "已關閉分屏模式",
+  "ssSplitScreenOpened": "已開啟分屏",
+  "ssSplitScreenOpenFailed": "分屏開啟失敗",
+  "ssSelectedByTeacher": "你被老師選到啦!",
+  "ssConfirmSubmitCorrection": "你確定提交批改嘛?",
+  "ssAskStudentToAnswer": "是否讓*同學回答問題?",
+  "ssHomeworkSubmissionTool": "作業提交工具",
+  "ssConfirmExportHomework": "確定導出作業嗎?",
+  "ssExitSuccess": "退出成功",
+  "ssPositionFull": "位置已滿,無法加入",
+  "ssPositionLocked": "位置已被鎖定,無法*",
+  "ssGroupLargerThanSet": "已經有小組比你設置的人數多,請重新設置",
+  "ssSettingSuccess": "設置成功",
+  "ssScreenRecording": "錄屏",
+  "ssOperationSuccess": "操作成功",
+  "ssJoinSuccess": "加入成功",
+  "ssConfirmDeleteAnnotation": "確定刪除此批注嗎?",
+  "ssDeleteSuccess": "刪除成功",
+  "ssDeleteFailed": "刪除失敗",
+  "ssBatchUploadNoClassPermission": "提示:批量上傳未添加班級權限,請添加班級或從班級入口進入。",
+  "ssNoClassPermission": "提示:未添加班級權限,請添加班級或從班級入口進入。",
+  "ssAppConnectionEmpty": "應用連接為空, 請到課程管理中添加",
+  "ssNotSupportedForStudents": "不支持學生使用",
+  "ssPleaseSelectOption": "請選擇選項",
+  "ssPleaseFillCompleteInfo": "請將信息填寫完整",
+  "ssAlreadySubmittedHomework": "您已經提交了該作業了,如果您再提交將覆蓋上次提交的作業!",
+  "ssConfirmSubmitAgain": "再次提交會覆蓋原有作業,並清空評分。",
+  "ssUploadFileRequired": "請上傳檔案",
+  "ssEnterStudentName": "請填寫學生姓名",
+  "ssEnterEssayContent": "請輸入作文標題和正文!",
+  "ssHomeworkDeleted": "此作業已被刪除",
+  "ssLikeSuccess": "點贊成功",
+  "ssLikeFailed": "點贊失敗",
+  "ssCancelLikeSuccess": "取消點贊成功",
+  "ssConfirmDeleteComment": "確定刪除此評論嗎?",
+  "ssDeleteCommentSuccess": "刪除評論成功",
+  "ssOnlyOneCommentPerHomework": "一個作業只能評論一條",
+  "ssCommentSuccess": "評論成功",
+  "ssCommentFailed": "評論失敗",
+  "ssPleaseRate": "請評分",
+  "ssRatingSuccess": "評分成功",
+  "ssRatingFailed": "評分失敗",
+  "ssConfirmDeleteWork": "確定刪除此作業嗎?",
+  "ssNetworkError": "網路異常",
+  "ssNoAISetting": "您暫未設置AI評分,請修改該工具的評價設置後使用。",
+  "ssUploadFailed": "上傳失敗",
+  "ssFollowModeOn": "已經開啟跟隨模式,請認真跟堂聽講",
+  "ssTaskLocked": "任務未解鎖",
+  "ssPrevTaskLocked": "上一任務未解鎖",
+  "ssCommentEmpty": "評論不能為空!",
+  "ssAddFailed": "添加失敗",
+  "ssReplyEmpty": "回覆不能為空!",
+  "ssReplySuccess": "回覆成功",
+  "ssReplyFailed": "回覆失敗",
+  "ssPermSetSuccess": "權限設置成功",
+  "ssPermClosedOk": "權限關閉成功",
+  "ssStuViewPermOn": "學生查看內容資料權限已開啟",
+  "ssStuViewPermOff": "關閉學生查看內容資料權限",
+  "ssFollowModeOn2": "跟隨模式已開啟",
+  "ssFollowModeOff": "跟隨模式已關閉",
+  "ssAnnotationImage": "批註圖.png",
+  "ssFullScreenView": "全屏查看",
+  "ssFileDownload": "檔案下載",
+  "ssRatingScale": "量規評分",
+  "ssPermissionSetting": "權限設置",
+  "ssAllowViewAllHomework": "允許學生查看所有作業",
+  "ssProhibitViewStage": "禁止學生查看階段",
+  "ssEnableFollowMode": "開啟跟隨模式",
+  "ssAllowViewContent": "允許學生查看內容資料",
+  "ssOpenSeatTip": "提示:開啟【開放選座】,學生能夠自由加入和退出小組。",
+  "ssEnterName": "請輸入名稱...",
+  "ssCountdownHint": "提示:點擊'+'或'-'修改倒計時長度。",
+  "ssCommentLabel": "評論:",
+  "ssPositionLockedCannotJoin": "位置已被鎖定,無法加入",
+  "ssPositionFullCannotJoin": "位置已滿,無法加入",
+  "ssPositionLockedCannotExit": "位置已被鎖定,無法退出",
+  "ssTeachingPlan": "教案",
+  "ssEnterStudentNamePlaceholder": "請輸入學生名字",
+  "ssSelectStudentPlaceholder": "請選擇學生",
+  "ssVideoNotSupported": "此視頻暫無法播放,請稍後再試",
+  "ssVeryCreative": "很有創意!",
+  "ssNotBad": "還不錯哦~",
+  "ssKeepTrying": "繼續努力哦~",
+  "ssInvalidRequest": "無效請求,請重新發起對話",
+  "ssLockPosition": "鎖定位置",
+  "ssUnlockPosition": "解鎖位置",
+  "ssOpenSeat": "開放選座",
+  "ssAdd": "添加",
+  "ssNoMatchingContent": "未找到匹配的內容。",
+  "ssStreamStopListening": "流停止監聽",
+  "ssPermissionGrantedSuccess": "已點擊允許,開啟成功",
+  "ssCheckMicrophone": "請檢查是否存在麥克風",
+  "ssSplitScreenDataSuccess": "分屏數據成功",
+  "ssSplitScreenDataFailed": "分屏數據失敗",
+  "ssCancelBtn": "取 消",
+  "ssConfirmBtn": "確 定",
+  "ssHomeworkDialog": "作業彈框",
+  "ssConfirmDeleteReply": "確定刪除此回覆嗎?",
+  "ssTaskWithColon": "任務:",
+  "ssCatalog": "目錄",
+  "ssDownloadRecord": "下載錄製",
+  "ssLearnLearn": "學一學",
+  "ssTeacherWorkspace": "教師工作區",
+  "ssEvaluationType": "評價類",
+  "ssTip": "提示",
+  "ssFunctionNotOpen": "此功能暫未開放!",
+  "ssPermissionSettings": "權限設置",
+  "ssAllowStudentViewAllWork": "允許學生查看所有作業",
+  "ssProhibitStudentViewStage": "禁止學生查看階段",
+  "ssAllowStudentViewContent": "允許學生查看內容資料",
+  "ssGroupNumName": "第*組名稱:",
+  "ssReturnBtn": "返回",
+  "ssToolLabel": "工具",
+  "ssSubmitDescText": "(提交圖文視頻等)",
+  "ssMoleculeLabel": "分子結構",
+  "ssCourseDesignLabel": "課程設計",
+  "ssGoalManageLabel": "目標管理",
+  "ssExitGroupBtn": "退出分組",
+  "ssAddBtn": "添加",
+  "ssDeleteBtn": "刪除",
+  "ssSelectGroupPrompt": "請選擇要進入的分組",
+  "ssSelectMemberPrompt": "請選擇要刪除的組員",
+  "ssSelectStudentPrompt": "請選擇學生",
+  "ssEditNoteText": "注:紅色劃線字為刪除,綠色背景白色字為新添加.",
+  "ssWordCloudTitle": "詞雲",
+  "ssFollowTeacherMsg": "接下來你將跟隨老師一起開始今天的学习!",
+  "ssStudyHardMsg": "要認真聽講哦~",
+  "ssCourseStartWithTitle": "“*”開課啦",
+  "ssPdfLoadingPleaseWait": "pdf可能會加載時間有點長,請耐心等待...",
+  "ssOption": "選項",
+  "ssSubtotal": "小計",
+  "ssProportion": "比例",
+  "ssSelectStudent": "選擇同學:",
+  "ssViewStudent": "查看學生",
+  "ssCorrectCount": "答對數量",
+  "ssCorrectStudents": "答對同學:",
+  "ssQuestionTooltip": "第{b0}題: 答對{c0}人",
+  "ssAnswerCount": "答題人數",
+  "ssTotalCorrectCount": "全部答對人數為",
+  "ssSentence": "句子",
+  "ssAnswerLabel": "答案:",
+  "ssEnterContent": "請輸入正文",
+  "ssTimeUp": "時間到!!!",
+  "ssImport": "導入",
+  "ssSave": "保存",
+  "ssDownloadMindMap": "下載導圖",
+  "ssGetData": "獲取數據",
+  "ssAddNode": "新增節點",
+  "ssAddBrotherNode": "新增兄弟節點",
+  "ssEditNode": "編輯節點",
+  "ssDeleteNode": "刪除節點",
+  "ssZoomIn": "放大",
+  "ssZoomOut": "縮小",
+  "ssExpandNodes": "展開節點",
+  "ssTheme": "主題:",
+  "ssSelectTheme": "選擇主題",
+  "ssFontSize": "字體大小",
+  "ssFontWeight": "字體粗細",
+  "ssRegular": "常規",
+  "ssBold": "粗體",
+  "ssBolder": "更粗",
+  "ssFontStyle": "字體樣式",
+  "ssStandard": "標準",
+  "ssItalic": "斜體",
+  "ssOblique": "傾斜",
+  "ssBackgroundColor": "背景顏色",
+  "ssFontColor": "字體顏色",
+  "ssNodeContent": "節點內容",
+  "ssConfirmEdit": "確 定",
+  "ssOpenSuccess": "打開成功",
+  "ssCannotOpenMindmap": "不能打開mindmap文件",
+  "ssPleaseSelectFile": "請先選擇文件",
+  "ssPleaseSelectNode": "請先選擇一個節點!",
+  "ssCannotAddRoot": "不能在根節點添加,請重新選擇節點!",
+  "ssExpandToLevel1": "展開到一級節點",
+  "ssExpandToLevel2": "展開到二級節點",
+  "ssExpandToLevel3": "展開到三級節點",
+  "ssExpandAll": "展開全部節點",
+  "ssCollapseAll": "隱藏全部節點",
+  "ssStartRecording": "開始錄音",
+  "ssStopRecording": "結束錄音",
+  "ssPlayRecording": "錄音播放",
+  "ssStopPlaying": "停止播放",
+  "ssUploadRecording": "上傳錄音",
+  "ssNoMicrophone": "沒有找到可使用的麥克風,或者您沒有允許此網頁使用麥克風",
+  "ssRecordBeforeUpload": "請錄音後在上傳語音",
+  "ssMove": "移動",
+  "ssColor": "顏色",
+  "ssThickness": "粗細",
+  "ssBrush": "畫筆",
+  "ssClear": "清除",
+  "ssClose": "關閉",
+  "ssSaveAnnotation": "保存批註",
+  "ssPleaseAnswer": "請答題",
+  "ssAddStudent": "添加學生",
+  "ssFillCustomName": "填寫自定義姓名",
+  "ssNoName": "暫無姓名",
+  "ssSelectOrFillStudent": "請選擇一個學生或者填寫自定義姓名",
+  "ssNoContent": "暫無內容",
+  "ssOnlineWriting": "線上編寫",
+  "ssImageUpload": "圖片上傳",
+  "ssPleaseFillEssayTitle": "請填寫你的作文題目",
+  "ssPleaseUploadImage": "請上傳圖片!",
+  "ssConfirmClearContent": "如已進行填寫,確認後將清空內容噢。",
+  "ssViewTeacherEvaluation": "查看教師評價",
+  "ssScoringCriteria": "評分標準:",
+  "ssHomeworkEvaluation": "作業評價:",
+  "ssAIEvaluation": "AI評價",
+  "ssEnterValueGreaterThanZero": "請輸入大於0的數值",
+  "ssValueCannotExceed100": "數值不能大於100",
+  "ssPleaseEnterNumber": "請輸入數字",
+  "ssClickSubmit": "點擊提交",
+  "ssStudentReport": "學生報告",
+  "ssSaveSuccess": "保存成功",
+  "ssConfirmResetContent": "是否將已經填寫的內容重置?",
+  "ssAnyMoreSupplements": "你還有哪些補充",
+  "ssTeachingObjectives": "教學目標(5分)",
+  "ssTeachingContent": "教學內容(5分)",
+  "ssTeachingProcess": "教學過程(30分)",
+  "ssTeachingMethods": "教學方法與策略(20分)",
+  "ssTeachingTools": "教學工具(15分)",
+  "ssTeachingEvaluation": "教學評價(10分)",
+  "ssInnovation": "創新意識(10分)",
+  "ssTeachingEffect": "教學效果(5分)",
+  "ssBonusPoints": "加分項(10分)",
+  "ssComments": "評語",
+  "ssEnterPositiveInteger": "請輸入大於0的整數",
+  "ssCannotEnterScoreAbove": "不能輸入大於得分的整數",
+  "ssTeachingObjectivesDesc": "目標結構完整,能夠清晰地表達學生的學習過程與預期成果。目標符合學情,具有可行性與邏輯遞進性。目標體現學生本位與素養導向,不單純停留在知識與技能層面。",
+  "ssTeachingContentDesc": "重難點突出,符合課標與教材要求,不超綱。符合學情特點,貼近學生生活,體現積極向上的育人價值觀。關注學生學習的最近發展區,有意識地展現因材施教的意圖。",
+  "ssTeachingProcessStructure": "課堂結構合理、緊密,層次清楚,突出重難點的解決。(10分)",
+  "ssTeachingProcessLearning": "強調「學」的活動設計,教與學有機結合。(10分)",
+  "ssTeachingProcessManagement": "課堂管理有序,教學語言清晰準確,能及時、合理地解決課堂問題,體現良好的教學素養。(10分)",
+  "ssTeachingMethodsDesc": "符合教學內容與學科特點。落實有效,能體現出學生的學習成效,不流於形式。具有一定的創新,展現教師的獨立思考與探究意識。",
+  "ssTeachingToolsDesc": "合理、科學地使用信息化技術、學習單、自制教學道具、輔助性資源等教學工具。",
+  "ssTeachingEvaluationDesc": "重視評價,有合理的評價手段與工具。評價落實有效,體現針對性和專業性。",
+  "ssInnovationDesc": "教學空間的選擇、布置有獨特想法,且合理有效。敢於嘗試多樣化的教學形式,如主題式、大單元、項目式、遊戲化等。開發特色有效的教學策略與手段,如小組合作探究、跨學科展演等,教師特色鮮明。",
+  "ssTeachingEffectDesc": "達成目標,整個過程有資源的生成。學習過程中學生有滿足、成功與喜悅等體驗,對後續學習更有信心,能力得到發展。",
+  "ssBonusPointsDesc": "某項優點特別突出,如教學風貌、教學理念、教學特色、教學手段等。",
+  "ssStudentFreePreview": "學生自由預覽",
+  "ssOpenHomeworkPreview": "開放作業預覽",
+  "ssSplitScreen": "分屏",
+  "ssQuiz": "測驗",
+  "ssDialogue": "對話",
+  "ssWorkflow": "工作流",
+  "ssAssistant": "助教",
+  "ssAnnotation": "批註",
+  "ssStartVoiceAssistant": "開啟語音助手",
+  "ssCloseVoiceAssistant": "關閉語音助手",
+  "ssUploadingRecording": "正在上傳錄屏文件,請稍等...",
+  "ssRecordClassroom": "錄制課堂",
+  "ssOpenCountdownPanel": "倒計時面板",
+  "ssPleaseWait": "請稍等...",
+  "ssAIVoiceEnabled": "已開啟AI語音",
+  "ssAIVoiceDisabled": "已關閉AI語音",
+  "ssCloseSplitScreenOnDevice": "需要在開啟分屏的設備上關閉分屏",
+  "ssNotSplitScreenCreator": "你不是分屏的創建者,無法關閉分屏",
+  "ssOnlyTeacherCanSplitScreen": "只有老師可以分屏",
+  "ssUploadToResourceSuccess": "上傳至資源庫成功",
+  "ssConfirmUploadToResource": "是否上傳*至資源庫?",
+  "ssUploadFileToResourceSuccess": "上傳《*》至資源庫成功",
+  "ssCompetence": "素養",
+  "ssExit": "退出",
+  "ssStudentWorkPreview": "學生作業預覽",
+  "ssSingleChoiceColon": "單選題:",
+  "ssMultipleChoiceColon": "多選題:",
+  "ssComposeSentence": "組成句子:",
+  "ssNodeLabel": "節點*",
+  "ssXiaoKeAIAssistant": "小可AI助手",
+  "ssWorkOnlyShowsDialog": "作業暫時只能展示對話文字哦~",
+  "ssPreviewImage": "預覽圖片",
+  "ssQuestionImage": "題目圖片",
+  "ssQuestionSituation": "題目情況",
+  "ssStudentSummary": "學生匯總",
+  "ssClassSummary": "班級匯總",
+  "ssDataStatisticsChart": "數據統計圖",
+  "ssDataDetails": "數據詳情",
+  "ssQuestionNumber": "題目*",
+  "ssTotal": "總計",
+  "ssScoringCount": "評分人數",
+  "ssTotalAverageScore": "總平均分",
+  "ssSerialNumber": "序號",
+  "ssCourseStructure": "課程結構",
+  "ssActivityDesign": "活動設計",
+  "ssOrderManagement": "秩序管理",
+  "ssTotalScore": "總分",
+  "ssWorkDetails": "作業詳情",
+  "ssQuestionStatistics": "題目統計",
+  "ssStudentStatistics": "學生統計",
+  "ssSmartAnalysis": "智能分析",
+  "ssAiAssistant": "AI助手",
+  "ssMindNetwork": "思維網絡",
+  "ssAppStore": "應用中心",
+  "ssOptionSummary": "選項匯總",
+  "ssPleaseSelect": "請選擇",
+  "ssEnterEvaluation": "請輸入評價內容...",
+  "ssNoTitle": "無標題",
+  "ssSingleChoiceWithColon": "單選題:",
+  "ssMultipleChoiceWithColon": "多選題:",
+  "ssGroupSettings": "分組設置",
+  "ssEnter2to10Digits": "請輸入2-10的數字",
+  "ssAccuracyRate": "準確率",
+  "ssAiApplication": "AI應用",
+  "ssNone": "無",
+  "ssMultipleChoice": "多選題",
+  "ssAsk": "提問",
+  "ssPleaseChooseCorrectOrder": "請選擇正確順序",
+  "ssAccuracyRateColon": "準確率:",
+  "ssNoUnsubmittedStudents": "無未提交學生...",
+  "ssWorkPreview": "作業預覽",
+  "ssNoSubmittedStudents": "暫無提交學生...",
+  "ssCocoPiWork": "CocoPi作業",
+  "ssPleaseSetGroupNumberAndName": "請設置小組數量及名稱",
+  "ssGroupNameColon": "第*組名稱:",
+  "ssPleaseSetGroupSize": "請設置每組人數",
+  "ssPleaseSelectMembersToDelete": "請選擇要刪除的組員",
+  "ssUploadFailedPptData": "上傳失敗ppt數據失敗",
+  "ssGroupSizeExceedsSetting": "已經有小組比你設置的人數多,請重新設置",
+  "ssOptionLabel": "選項*",
+  "ssQuestionLabel": "第*題",
+  "ssPleaseEnterTitleAndContent": "請輸入作文標題和正文!",
+  "ssPleaseFillAnswer": "請填寫答案",
+  "ssPleaseSelectAnswer": "請選擇答案",
+  "ssPleaseCompleteAnswer": "請將答案填寫完整!",
+  "ssCannotViewOnProjection": "投影下不可查看",
+  "ssUploadSuccess": "上傳成功",
+  "ssI": "我",
+  "ssGuessYouWantToSearch": "猜你想搜:",
+  "ssSelectAgent": "選擇您需要的智能體,開始對話",
+  "ssMy": "我的",
+  "ssCommunity": "社區",
+  "ssPleaseEnterContent": "請輸入內容",
+  "ssClearChatHistory": "清空聊天記錄",
+  "ssDefaultNotRead": "默認不朗誦",
+  "ssDefaultRead": "默認朗誦",
+  "ssClassTips": "課堂小貼士",
+  "ssAgent": "智能體",
+  "ssGenerateImage": "生成圖片",
+  "ssSearchImage": "搜索圖片",
+  "ssSearchVideo": "搜索視頻",
+  "ssPleaseSpeak": "請說話",
+  "ssVoiceInput": "語音輸入",
+  "ssTextInput": "文字輸入",
+  "ssEndRecording": "結束錄音",
+  "ssSend": "發送",
+  "ssStopSending": "停止發送",
+  "ssVoiceAssistant": "語音助手",
+  "ssSearchDesiredAgent": "搜索想要的智能體",
+  "ssQuery": "查詢",
+  "ssUseVoice": "使用語音",
+  "ssUseKeyboard": "使用鍵盤",
+  "ssCopySuccess": "複製成功",
+  "ssClearChatHistoryPrompt": "確定清空聊天記錄嗎?",
+  "ssClearChatHistorySuccess": "清除聊天記錄成功",
+  "ssClearChatHistoryFailed": "清除聊天記錄失敗",
+  "ssGetVideoFailed": "獲取視頻失敗",
+  "ssGenerateImageFailed": "生成圖片失敗",
+  "ssGenerateFailed": "生成失敗",
+  "ssGetChatHistoryFailed": "獲取對話記錄失敗",
+  "ssImageNotSupportDownload": "此圖片不支持下載",
+  "ssHelloHowCanIHelp": "您好,有什麼需要我幫忙的嗎?",
+  "ssGetRoleListFailed": "獲取角色列表失敗",
+  "ssGetPublicRoleFailed": "獲取公共角色失敗",
+  "ssToolSimulationDriving": "模擬駕駛",
+  "ssToolPathSearch": "路徑搜索",
+  "ssToolDeepLearning": "深度學習",
+  "ssToolPersonalEvaluation": "個人評價",
+  "ssToolAiotBlockly": "AIoT Blockly",
+  "ssToolAiPython": "AI Python",
+  "ssToolAiBlockly": "AI Blockly",
+  "ssToolCocoPi": "CocoPi",
+  "ssToolGeogebra": "GeoGebra",
+  "ssToolMolecularStructure": "分子結構",
+  "ssToolTimeline": "時間軸",
+  "ssToolGoalManagement": "目標管理",
+  "ssToolCourseDesign": "課程設計",
+  "ssToolInteractiveVideo": "互動視頻",
+  "ssMembers": "成員",
+  "ssNoMembers": "暫無成員...",
+  "ssHomeworkSubmissionStatus": "作業提交情況",
+  "ssSummaryAnalysis": "總結分析",
+  "ssHomeworkDetails": "作業詳細",
+  "ssOptions": "選項:",
+  "ssClickToSpeak": "點擊說話",
+  "ssClickRecordingButton": "請點擊錄音按鈕開始錄音",
+  "ssQuestionText": "題目:",
+  "ssAnswerText": "答題:",
+  "ssStudentText": "學生:",
+  "ssCorrectAnswerText": "答案:",
+  "ssPleaseStopRecordingFirst": "請先停止錄音",
+  "ssPleaseStartRecordingFirst": "請先開始錄音",
+  "ssPleaseWaitDots": "請稍等...",
+  "ssConfirmDialogTitle": "提示",
+  "ssVideoKeyword": "視頻",
+  "ssImageKeyword": "圖片",
+  "ssStudentGrade": "學生年級:",
+  "ssCategoryLabel": "分類:",
+  "ssTaskTimeAllocation": "任務時間分配",
+  "ssCourseTimeline": "課程時間軸",
+  "ssTaskStatus": "任務狀態",
+  "ssStudentActivity": "學生活動中...",
+  "ssSubmitCount": "提交人數",
+  "ssPersonUnit": "人",
+  "ssCompletionRate": "完成率",
+  "ssCommunication": "交流互動",
+  "ssParticipantCount": "參與人數",
+  "ssLikeCount": "點贊數",
+  "ssItemUnit": "個",
+  "ssCommentCount": "評論數",
+  "ssCommentUnit": "條",
+  "ssConsolidatePractice": "鞏固練習",
+  "ssNoExerciseAdded": "當前課堂未添加練習題",
+  "ssOneClickGenerate": "一鍵出題",
+  "ssClassManagement": "課堂管理",
+  "ssEditToolAddTopics": "編輯工具,自主添加題目",
+  "ssTopicStatistics": "題目統計",
+  "ssAnswerAnalysis": "答案解析",
+  "ssNoStudentSubmit": "當前暫無學生提交.",
+  "ssConfirmSelection": "確認選擇",
+  "ssSmartGenerate": "智能出題",
+  "ssSimilarTopic": "相似題",
+  "ssHarderTopic": "更難題",
+  "ssEasierTopic": "更易題",
+  "ssPreviousTopic": "上一題",
+  "ssNextTopic": "下一題",
+  "ssClick": "點擊",
+  "ssAutoGenerate10": "自動生成 10",
+  "ssPracticeQuestions": "道隨堂練習",
+  "ssGoTo": "前往",
+  "ssEditToolAddTopics2": "編輯工具,自主添加題目",
+  "ssStatistics": "統計",
+  "ssAnalysis": "解析",
+  "ssAnswer": "答案:",
+  "ssNoStudentSubmitPractice": "當前暫無學生提交練習.",
+  "ssOneClickGenerateFailed": "一鍵出題失敗",
+  "ssSmartGenerateFailed": "智能出題失敗",
+  "ssTopicAlreadySubmitted": "該題已經提交過了",
+  "ssPleaseAnswerFirst": "請先答題",
+  "ssTeacherAddedNewTopics": "老師有新添加的題目",
+  "ssGenerateAnalysisFailed": "生成解析失敗",
+  "ssLinkAddress": "鏈接地址",
+  "ssPersonalEvalContent": "個人評價內容",
+  "ssSubmitContent": "提交內容",
+  "ssChatContent": "聊天內容",
+  "ssSubmitTime": "提交時間",
+  "ssInsertTable": "插入表格",
+  "ssMinute": "分",
+  "ssSecond": "秒",
+  "ssQuickSettings": "快捷設置",
+  "ssCommon": "常用",
+  "ssMore": "更多",
+  "ssTimer": "計時器",
+  "ssTeachingActivityMemo": "教學活動備忘",
+  "ssAllEvents": "所有事件",
+  "ssTimingEvents": "計時事件",
+  "ssExport": "導出",
+  "ssCountdownRunning": "正在倒計時",
+  "ssTimerRunning": "正在計時",
+  "ssCountdownMaxHour": "倒計時最高一小時",
+  "ssSetCountdownTime": "請設置倒計時時間",
+  "ssCountdownPaused": "已暫停倒計時",
+  "ssCountdownStarted": "已開始倒計時",
+  "ssTimerStopped": "已停止計時",
+  "ssTimerStarted": "已開始計時",
+  "ssResetDone": "已重置",
+  "ssConfirmResetCountdown": "正在倒計時!確定重置倒計時嗎?",
+  "ssConfirmResetTimer": "正在計時!確定重置計時嗎?",
+  "ssConfirmResetBasic": "確定重置",
+  "ssExportSuccess": "導出成功",
+  "ssGetMoreTagsFailed": "獲取更多行為標籤失敗",
+  "ssGetMemoFailed": "獲取行為備忘失敗",
+  "ssStopTimerFirst": "請先停止計時再設置",
+  "ssBehaviorTags": "行為標籤",
+  "ss30Seconds": "30秒",
+  "ss1Minute": "1分鐘",
+  "ss2Minutes": "2分鐘",
+  "ss3Minutes": "3分鐘",
+  "ss5Minutes": "5分鐘",
+  "ss6Minutes": "6分鐘",
+  "ss8Minutes": "8分鐘",
+  "ss10Minutes": "10分鐘",
+  "ssHideMusicList": "隱藏音樂列表",
+  "ssShowMusicList": "顯示音樂列表",
+  "ssTurnOffMusic": "關閉音樂",
+  "ssTurnOnMusic": "開啟音樂",
+  "ssMusic1": "音樂1",
+  "ssMusic2": "音樂2",
+  "ssMusic3": "音樂3",
+  "ssMusic4": "音樂4",
+  "ssMusic5": "音樂5",
+  "ssGroupDiscussion": "小組討論",
+  "ssGroupReport": "小組匯報",
+  "ssHandsOnExperiment": "動手實驗",
+  "ssClassroomGame": "課堂遊戲",
+  "ssIndependentLearning": "自主學習",
+  "ssWorkDisplay": "作品展示",
+  "ssStudentSpeech": "學生演講",
+  "ssStudentShare": "學生分享",
+  "ssClassPractice": "隨堂練習",
+  "ssQuickQAndA": "快速問答",
+  "ssReadingMaterials": "閱讀資料",
+  "ssObservationRecord": "觀察記錄",
+  "ssEvent": "事件",
+  "ssTimeDifference": "時間差",
+  "ssViewHomework": "查看作業",
+  "ssPerformLike": "進行點贊",
+  "ssPerformComment": "進行評論",
+  "ssPerformRating": "進行評分",
+  "ssHourUnit": "時",
+  "ssEventExportFileName": "事件.xlsx",
+  "ssPerformActionOn": "對",
+  "ssSet": "設置",
+  "ssUsedFor": ",用於",
+  "ssEndTimer": "結束計時器,",
+  "ssTimerWord": "計時",
+  "ssMinuteWord": "分鐘",
+  "ssSecondWord": "秒",
+  "ssResetTimer": "重置"
 }

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.