tremble 2 år sedan
förälder
incheckning
773c24b5a3
24 ändrade filer med 1042 tillägg och 122 borttagningar
  1. 1 1
      packages/qjkankan-editor/src/components/insertPositionTipInEditor.vue
  2. 36 18
      packages/qjkankan-editor/src/components/materialSelectorForManageCenter.vue
  3. 9 4
      packages/qjkankan-editor/src/components/preview/index.vue
  4. 94 0
      packages/qjkankan-editor/src/components/pulldownMenuInEditor copy.vue
  5. 17 4
      packages/qjkankan-editor/src/components/userInfo.vue
  6. 8 5
      packages/qjkankan-editor/src/config/menu.js
  7. 10 3
      packages/qjkankan-editor/src/framework/EditorHead.vue
  8. 7 4
      packages/qjkankan-editor/src/framework/material/aside.vue
  9. 4 2
      packages/qjkankan-editor/src/framework/material/header.vue
  10. 72 0
      packages/qjkankan-editor/src/lang/_en.js
  11. 105 0
      packages/qjkankan-editor/src/lang/_zh.js
  12. 1 1
      packages/qjkankan-editor/src/lang/index.js
  13. 2 0
      packages/qjkankan-editor/src/pages/edit.js
  14. 1 1
      packages/qjkankan-editor/src/views/base/Toolbar.vue
  15. 7 2
      packages/qjkankan-editor/src/views/base/autoCruiseSettings.vue
  16. 9 4
      packages/qjkankan-editor/src/views/base/backgroundMusicSettings.vue
  17. 497 0
      packages/qjkankan-editor/src/views/base/customButtonSettings copy.vue
  18. 28 13
      packages/qjkankan-editor/src/views/material/audio/index.vue
  19. 7 1
      packages/qjkankan-editor/src/views/material/components/uploadList1.1.0.vue
  20. 29 13
      packages/qjkankan-editor/src/views/material/image/index.vue
  21. 30 13
      packages/qjkankan-editor/src/views/material/pano/index.vue
  22. 13 6
      packages/qjkankan-editor/src/views/material/popup/share.vue
  23. 28 13
      packages/qjkankan-editor/src/views/material/video/index.vue
  24. 27 14
      packages/qjkankan-editor/src/views/material/works/index.vue

+ 1 - 1
packages/qjkankan-editor/src/components/insertPositionTipInEditor.vue

@@ -104,7 +104,7 @@ export default {
           } else if (this.topologyLevel === 3) { // 拖拽到二级分组中
             if (this.indentLevel === 2) { // 拖拽到隐藏的默认二级分组中
               if (this.dragInfo.node.children.length === 1 && this.dragInfo.node.children[0].name === '默认二级分组') {
-                if (this.dragInfo.node.children[0].id === this.parentNode?.id) {
+                if (this.dragInfo.node.children[0].id === this.parentNode.id) {
                   // console.log('情况13:被拖拽的一级分组只有一个隐藏的默认二级分组,拖拽到自身的默认二级分组中');
                   return false
                 } else {

+ 36 - 18
packages/qjkankan-editor/src/components/materialSelectorForManageCenter.vue

@@ -9,7 +9,7 @@
         :class="{active: currentMaterialType === 'image'}"
         class="text"
         >
-          图片
+          {{image}}
         </span>
         <div v-if="currentMaterialType === 'image'" class="bottom-line"></div>
       </a>
@@ -18,7 +18,7 @@
         :class="{active: currentMaterialType === 'pano'}"
         class="text"
         >
-          全景图
+          {{panorama}}
         </span>
         <div v-if="currentMaterialType === 'pano'" class="bottom-line"></div>
       </a>
@@ -27,7 +27,7 @@
         :class="{active: currentMaterialType === 'audio'}"
         class="text"
         >
-          音频
+          {{audio}}
         </span>
         <div v-if="currentMaterialType === 'audio'" class="bottom-line"></div>
       </a>
@@ -36,7 +36,7 @@
         :class="{active: currentMaterialType === 'video'}"
         class="text"
         >
-          视频
+          {{video}}
         </span>
         <div v-if="currentMaterialType === 'video'" class="bottom-line"></div>
       </a>
@@ -45,14 +45,14 @@
         :class="{active: currentMaterialType === '3D'}"
         class="text"
         >
-          三维场景
+          {{scene}}
         </span>
         <div v-if="currentMaterialType === '3D'" class="bottom-line"></div>
       </a>
     </div>
     
     <div class="filter">
-      <input type="text" placeholder="输入关键词" v-model="searchKey"/>
+      <input type="text" :placeholder="keywords" v-model="searchKey"/>
       <i v-if="!searchKey" class="iconfont icon-editor_search search-icon"/>
       <i v-if="searchKey" @click="searchKey=''" class="iconfont icontoast_red clear-icon"></i>
     </div>
@@ -147,11 +147,11 @@
       <div v-else class="no-data">
         <div v-if="latestUsedSearchKey">
           <img :src="require('@/assets/images/default/empty_04_search.png')" alt="">
-          <span>{{'未搜索到结果~'}}</span>
+          <span>{{no_serch_result}}</span>
         </div>
         <div v-if="!latestUsedSearchKey">
           <img :src="require('@/assets/images/default/empty_04.png')" alt="">
-          <span>{{'暂无素材~'}}</span>
+          <span>{{no_material_result}}</span>
         </div>
       </div>
     </div>
@@ -189,13 +189,13 @@
       <div v-else class="no-data">
         <div v-if="latestUsedSearchKey">
           <img :src="require('@/assets/images/default/empty_04_search.png')" alt="">
-          <span>{{'未搜索到结果~'}}</span>
+          <span>{{no_serch_result}}</span>
         </div>
         <div v-if="!latestUsedSearchKey">
           <img :src="require('@/assets/images/default/empty_04.png')" alt="">
-          <span>{{'暂无素材~'}}</span>
+          <span>{{no_material_result}}</span>
           <a href="/#/">
-            <button class="ui-button">如何拍摄三维场景</button>
+            <button class="ui-button">{{how_to_shoot}}</button>
           </a>
         </div>
       </div>
@@ -203,13 +203,13 @@
 
     <div class="btns">
       <button v-if="currentMaterialType !== '3D'" class="ui-button upload-btn" @click="onClickUpload">
-        <span>上传素材</span>
+        <span>{{upload_material}}</span>
         <i class="iconfont icon-material_prompt tool-tip-for-editor"
           v-tooltip="
-            currentMaterialType === 'image' ? '请上传10MB以内、jpg/png格式的图片' :
-            currentMaterialType === 'pano' ? '请上传2:1、120MB以内、jpg格式的图片' :
-            currentMaterialType === 'audio' ? '请上传20MB以内、mp3格式的音频' :
-            currentMaterialType === 'video' ? '请上传200MB以内、mp4格式的视频' : ''
+            currentMaterialType === 'image' ? img_size :
+            currentMaterialType === 'pano' ? pano_size :
+            currentMaterialType === 'audio' ? audio_size :
+            currentMaterialType === 'video' ? video_size : ''
           ">
         </i>
         <FileInput
@@ -224,9 +224,9 @@
       </button>
       <div v-else class="button-placeholder"></div>
       <div>
-        <button class="ui-button cancel" @click="$emit('cancle')">取消</button>
+        <button class="ui-button cancel" @click="$emit('cancle')">{{cancel}}</button>
         <button class="ui-button submit" :class="{disable: !select.length}" @click="onClickComfirm">
-          确定
+          {{comfirm}}
         </button>
       </div>
     </div>
@@ -249,6 +249,7 @@ import FileInput from "@/components/shared/uploads/UploadMultiple.vue";
 import { mapState } from "vuex";
 // import AudioIconCanPlay from "@/components/audio/indexForEditor.vue";
 import RadioOrCheckbox from "@/components/shared/RadioOrCheckbox.vue";
+import {i18n} from "@/lang"
 
 export default {
   props:{
@@ -500,6 +501,23 @@ export default {
   },
   data () {
     return {
+      no_serch_result: i18n.t("gather.no_serch_result"),
+      no_material_result: i18n.t("gather.no_material_result"),
+      panorama: i18n.t("gather.panorama"),
+      image: i18n.t("gather.image"),
+      audio: i18n.t("gather.audio"),
+      video: i18n.t("gather.video"),
+      scene: i18n.t("gather.scene"),
+      keywords: i18n.t("gather.keywords"),
+      how_to_shoot: i18n.t("gather.how_to_shoot"),
+      upload_material: i18n.t("gather.upload_material"),
+      img_size: i18n.t("gather.img_size"),
+      pano_size: i18n.t("gather.pano_size"),
+      audio_size: i18n.t("gather.audio_size"),
+      video_size: i18n.t("gather.video_size"),
+      cancel: i18n.t("gather.cancel"),
+      comfirm: i18n.t("gather.comfirm"),
+      
       imageList: [],
       panoList: [],
       audioList: [],

+ 9 - 4
packages/qjkankan-editor/src/components/preview/index.vue

@@ -7,7 +7,7 @@
         }"
       >
         <div class="ui-message-header">
-          <span>全景作品预览</span>
+          <span>{{work_preview}}</span>
           <span @click="$emit('close')">
             <i class="iconfont icon_close"></i>
           </span>
@@ -23,10 +23,10 @@
             }"
             @click="$emit('close')"
           >
-            取消
+            {{cancel}}
           </button>
-          <button class="ui-button submit ui-button-rect" @click="copy">复制链接</button>
-          <button class="ui-button submit ui-button-rect" @click="openBlank">新窗口打开</button>
+          <button class="ui-button submit ui-button-rect" @click="copy">{{copy_link}}</button>
+          <button class="ui-button submit ui-button-rect" @click="openBlank">{{new_blank}}</button>
         </div>
       </div>
     </popup>
@@ -34,6 +34,7 @@
 
 <script>
 import Popup from "@/components/shared/popup";
+import {i18n} from "@/lang"
 
 export default {
   props: {
@@ -53,6 +54,10 @@ export default {
   },
   data(){
     return {
+      copy_link: i18n.t("material.works.copy_link"),
+      work_preview: i18n.t("material.works.work_preview"),
+      new_blank: i18n.t("material.works.new_blank"),
+      cancel: i18n.t("material.works.cancel"),
     }
   },
   methods:{

+ 94 - 0
packages/qjkankan-editor/src/components/pulldownMenuInEditor copy.vue

@@ -0,0 +1,94 @@
+<template>
+  <div class="pull-down-menu-in-editor" v-clickoutside="onClickOutside">
+    <button class="menu-cover" @click="isExpand = !isExpand">
+      {{placeholder ? placeholder : $i18n.t(`edit_settings.${value}`)}}
+      <i class="iconfont icon-material_preview_upload_collect" :class="{flip: isExpand}"></i>
+    </button>
+    <div class="menu" v-show="isExpand">
+      <button v-for="(item, index) of valueList" :key="index"
+        @click="onSelect(item)"
+      >
+        {{$i18n.t(`edit_settings.${item}`)}}
+      </button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    valueList: {
+      type: Array,
+      default: function() {
+        return [
+        '111',
+        '222',
+        ]
+      },
+    },
+    placeholder: {
+      type: String,
+      default: '',
+    },
+    value: {
+      type: String,
+      required: true,
+    }
+  },
+  data() {
+    return {
+      isExpand: false,
+    }
+  },
+  methods: {
+    onClickOutside() {
+      if (this.isExpand) {
+        this.isExpand = false
+      }
+    },
+    onSelect(item) {
+      console.log(item,'ads')
+      this.isExpand = false
+      this.$emit('input', this.$i18n.t(`edit_settings.${item}`))
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  button {
+    background: #252526;
+    border: 1px solid #404040;
+    height: 36px;
+    color: #fff;
+    width: 100%;
+  }
+.pull-down-menu-in-editor {
+  width: 140px;
+  position: relative;
+  > button.menu-cover {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 16px;
+    cursor: pointer;
+    > .icon-material_preview_upload_collect {
+      font-size: 11px;
+      color: rgba(255, 255, 255, 0.6);
+      border-radius: 2px;
+      &.flip {
+        transform: translateY(-2px) rotate(180deg);
+      }
+    }
+  }
+  > .menu {
+    position: absolute;
+    width: 100%;
+    > button {
+      display: block;
+      border-top: none;
+      cursor: pointer;
+    }
+  }
+}
+</style>

+ 17 - 4
packages/qjkankan-editor/src/components/userInfo.vue

@@ -5,15 +5,15 @@
       <div class="nickName">{{userNickName}}</div>
       <i class="iconfont icon-show_drop-down"></i>
       <ul class="menu">
-        <li><span @click="onClickPersonalCenter">个人中心</span></li>
-        <li><span class="warn" @click="onClickLogout" >退出登录</span></li>
+        <li><span @click="onClickPersonalCenter">{{personal_center}}</span></li>
+        <li><span class="warn" @click="onClickLogout" >{{logout}}</span></li>
       </ul>
     </template>
     <template v-else>
       <div class="loginAndRegis">
-        <span>登录</span>
+        <span @click="onClickLogin">{{login}}</span>
         |
-        <span>注册</span>
+        <span @click="onClickRegister">{{register}}</span>
       </div>
     </template>
   </div>
@@ -21,9 +21,16 @@
 
 <script>
 import { mapGetters } from 'vuex'
+import {i18n} from "@/lang"
+
 export default {
   data() {
     return {
+      personal_center: i18n.t("personal_center.personal_center"),
+      logout: i18n.t("personal_center.logout"),
+      login: i18n.t("personal_center.login"),
+      register: i18n.t("personal_center.register"),
+
     }
   },
   computed: {
@@ -33,6 +40,12 @@ export default {
     ]),
   },
   methods: {
+    onClickLogin(){
+      window.location.href = '/#/login/login?from=%2F'
+    },
+    onClickRegister(){
+      window.location.href = '/#/login/register?from=%2F'
+    },
     onClickPersonalCenter() {
       window.location.href = '/#/information'
     },

+ 8 - 5
packages/qjkankan-editor/src/config/menu.js

@@ -1,7 +1,10 @@
+import {i18n} from "@/lang"
+
+
 // 编辑器主菜单
 const PCMenu = [
   {
-    text: "基础",
+    text: i18n.t("edit_page.settings"),
     icon: "settings",
     link: "/base",
     name: "base",
@@ -9,7 +12,7 @@ const PCMenu = [
     hidden: false,
   },
   {
-    text: "导航",
+    text: i18n.t("edit_page.navigation"),
     icon: "navigation",
     link: "/navigation",
     name: "navigation",
@@ -18,7 +21,7 @@ const PCMenu = [
     hidden: false,
   },
   {
-    text: "视角",
+    text: i18n.t("edit_page.viewpoint"),
     icon: "viewpoint",
     link: "/screen",
     name: "screen",
@@ -27,7 +30,7 @@ const PCMenu = [
     hidden: false
   },
   {
-    text: "热点",
+    text: i18n.t("edit_page.hotspot"),
     icon: "hot",
     link: "/hotspot",
     name: "hotspot",
@@ -36,7 +39,7 @@ const PCMenu = [
     hidden: false
   },
   {
-    text: "讲解",
+    text: i18n.t("edit_page.explanation"),
     icon: "explanation",
     link: "/explanation",
     name: "explanation",

+ 10 - 3
packages/qjkankan-editor/src/framework/EditorHead.vue

@@ -2,17 +2,17 @@
   <header class="app-head" app-border dir-bottom>
     <a class="app-head-back" href="./material.html#/works">
       <i class="iconfont icon-editor_return"></i>
-      返回我的作品
+      {{back_myworks}}
     </a>
     <span class="app-head-title">{{ info.name }}</span>
     <div class="app-head-save ui-button deepcancel app-head-view" @click="onView" :class="{ disable: !canLoad || isEditing }">
       <i class="iconfont iconeditor_preview"></i>
-      预览
+      {{preview}}
     </div>
 
     <div class="ui-button submit app-head-save" @click="onSave" :class="{ disable: !canLoad || isEditing }">
       <i class="iconfont iconeditor_save"></i>
-      保存
+      {{savetips}}
     </div>
     <preview v-if="info" :key="Math.random()" :name="info.name" :show="showPreview" :ifr="`./show.html?id=${info.id}&rnd=${Math.random()}`" @close="showPreview = false" />
   </header>
@@ -22,12 +22,19 @@ import { saveWorks, getPanoInfo, checkLogin } from "@/api";
 import { mapGetters } from "vuex";
 // import config from '@/config'
 import preview from "@/components/preview";
+import {i18n} from "@/lang"
+
 let hhhreg = /\\\\\\\\/g;
 
 export default {
   name: "app-head",
   data() {
     return {
+      back_myworks: i18n.t("edit_page.back_myworks"),
+      preview: i18n.t("edit_page.preview"),
+      savetips: i18n.t("edit_page.save"),
+
+
       showPreview: false,
       canLoad: false,
     };

+ 7 - 4
packages/qjkankan-editor/src/framework/material/aside.vue

@@ -9,26 +9,29 @@
 </template>
 
 <script>
+import {i18n} from "@/lang"
+
 export default {
   data(){
     return {
+
       list:[{
-        name:'全景图片',
+        name:i18n.t("gather.panorama"),
         id:'pano',
         link:{path:'/pano'},
         icon:'icon-material_panoramic_picture'
       },{
-        name:'图片',
+        name:i18n.t("gather.image"),
         id:'image',
         link:{path:'/image'},
         icon:'icon-material_image'
       },{
-        name:'音频',
+        name:i18n.t("gather.audio"),
         id:'audio',
         link:{path:'/audio'},
         icon:'icon-material_music'
       },{
-        name:'视频',
+        name:i18n.t("gather.video"),
         id:'video',
         link:{path:'/video'},
         icon:'icon-material_video'

+ 4 - 2
packages/qjkankan-editor/src/framework/material/header.vue

@@ -16,6 +16,8 @@
 
 <script>
 import UserInfo from "@/components/userInfo.vue";
+import {i18n} from "@/lang"
+
 export default {
   components: {
     UserInfo,
@@ -25,14 +27,14 @@ export default {
       active:{},
       tab: [
         {
-          name: "我的作品",
+          name: i18n.t("gather.my_works"),
           id: "works",
           path:{
             path:'/works'
           }
         },
         {
-          name: "我的素材",
+          name: i18n.t("gather.my_material"),
           id: "material",
           path:{
             path:'/'

+ 72 - 0
packages/qjkankan-editor/src/lang/_en.js

@@ -524,5 +524,77 @@ module.exports = {
             "zoom": "Zoom<br />Zoom in or out.",
             "set": "Got it"
         }
+    },
+    "material": {
+        "works": {
+            "my":"我的作品",
+            "create":"创建作品",
+            "search":"搜索作品",
+            "preview":"预览",
+            "edit":"编辑",
+            "share":"分享",
+            "delete":"删除",
+            "no_works":"您还没有作品,请先创建作品~",
+            "work_link":"作品链接",
+            "work_qrCode":"作品二维码",
+            "download_qrCode":"下载二维码",
+            "copy_link":"复制链接",
+            "work_preview":"全景作品预览",
+            "new_blank":"新窗口打开",
+            "cancel":"取消",
+        },
+    },
+    "gather":{
+        "select_material":"选择素材",
+        "no_title":"无标题",
+
+        "my_works":"我的作品",
+        "my_material":"我的素材",
+
+
+ 
+        "panorama":"全景图",
+        "image":"图片",
+        "audio":"音频",
+        "video":"视频",
+        "scene":"三维场景",
+        "keywords":"输入关键词",
+        "how_to_shoot":"如何拍摄三维场景",
+        "pano_size":"请上传2:1、120MB以内、jpg格式的图片",
+        "cancel":"取消",
+        "comfirm":"确定",
+
+        "pano_fail":"格式错误,请上传2:1、120MB以内、jpg格式的全景图片",
+        "pano_limit":"过大,请上传2:1、120MB以内、jpg格式的全景图片",
+        "edit_cover":"编辑封面",
+
+        "img_fail":"格式错误,请上传10MB以内、jpg/png格式的图片",
+        "img_limit":"过大,请上传10MB以内、jpg/png格式的图片",
+        "img_size":"请上传10MB以内、jpg/png格式的图片",
+        
+ 
+        "audio_size":"请上传20MB以内、mp3格式的音频",
+        "audio_limit":"过大,请上传20MB以内、mp3格式的音频",
+        "audio_fail":"格式错误,请上传20MB以内、mp3格式的音频",
+       
+
+        "upload_material":"上传素材",
+        "video_size":"请上传200MB以内、mp4格式的视频",
+        "video_limit":"过大,请上传200MB以内、mp4格式的视频",
+        "video_fail":"格式错误,请上传200MB以内、mp4格式的视频",
+        "serch_material":"搜索素材",
+        "rename":"重命名",
+        "delete":"删除",
+        "no_serch_result":"未搜索到结果",
+        "no_material_result":"暂无素材~",
+        "had_load":"已加载{msg}条",
+        "uploading":"正在上传 {msg}"
+    },
+    "personal_center":{
+        "personal_center":"个人中心",
+        "logout":"退出登录",
+        "login":"登录",
+        "register":"注册",
+        
     }
 }

+ 105 - 0
packages/qjkankan-editor/src/lang/_zh.js

@@ -524,5 +524,110 @@ module.exports = {
             "zoom": "缩放<br />双指滑动放大或缩小视图",
             "set":"我知道了"
         }
+    },
+    "material": {
+        "works": {
+            "my":"我的作品",
+            "create":"创建作品",
+            "search":"搜索作品",
+            "preview":"预览",
+            "edit":"编辑",
+            "share":"分享",
+            "delete":"删除",
+            "no_works":"您还没有作品,请先创建作品~",
+            "work_link":"作品链接",
+            "work_qrCode":"作品二维码",
+            "download_qrCode":"下载二维码",
+            "copy_link":"复制链接",
+            "work_preview":"全景作品预览",
+            "new_blank":"新窗口打开",
+            "cancel":"取消",
+        },
+    },
+    "gather":{
+        "select_material":"选择素材",
+        "no_title":"无标题",
+
+        "my_works":"我的作品",
+        "my_material":"我的素材",
+
+
+ 
+        "panorama":"全景图",
+        "image":"图片",
+        "audio":"音频",
+        "video":"视频",
+        "scene":"三维场景",
+        "keywords":"输入关键词",
+        "how_to_shoot":"如何拍摄三维场景",
+        "pano_size":"请上传2:1、120MB以内、jpg格式的图片",
+        "cancel":"取消",
+        "comfirm":"确定",
+
+        "pano_fail":"格式错误,请上传2:1、120MB以内、jpg格式的全景图片",
+        "pano_limit":"过大,请上传2:1、120MB以内、jpg格式的全景图片",
+        "edit_cover":"编辑封面",
+
+        "img_fail":"格式错误,请上传10MB以内、jpg/png格式的图片",
+        "img_limit":"过大,请上传10MB以内、jpg/png格式的图片",
+        "img_size":"请上传10MB以内、jpg/png格式的图片",
+        
+ 
+        "audio_size":"请上传20MB以内、mp3格式的音频",
+        "audio_limit":"过大,请上传20MB以内、mp3格式的音频",
+        "audio_fail":"格式错误,请上传20MB以内、mp3格式的音频",
+       
+
+        "upload_material":"上传素材",
+        "video_size":"请上传200MB以内、mp4格式的视频",
+        "video_limit":"过大,请上传200MB以内、mp4格式的视频",
+        "video_fail":"格式错误,请上传200MB以内、mp4格式的视频",
+        "serch_material":"搜索素材",
+        "rename":"重命名",
+        "delete":"删除",
+        "no_serch_result":"未搜索到结果",
+        "no_material_result":"暂无素材~",
+        "had_load":"已加载{msg}条",
+        "uploading":"正在上传 {msg}"
+    },
+    "personal_center":{
+        "personal_center":"个人中心",
+        "logout":"退出登录",
+        "login":"登录",
+        "register":"注册",
+    },
+    "edit_page":{
+        "back_myworks":"返回我的作品",
+        "preview":"预览",
+        "settings":"基础",
+        "navigation":"导航",
+        "viewpoint":"视角",
+        "hotspot":"热点",
+        "explanation":"讲解",
+        "save":"保存",
+    },
+    "edit_settings":{
+        "auto_pano":"自动巡游",
+        "enter_auto":"进入全景图自动巡游(3分钟完整巡游一次)",
+
+
+        "set_bgm":"设置背景音乐",
+        "add_audio":"添加音频",
+        "change_audio":"更换音频",
+
+        "custom_button":"自定义按钮",
+        "custom_button_tips":"自定义按钮可为作品添加联系方式或网站链接等,设置可见后即可在作品显示。",
+        "edit":"编辑",
+        "hide":"隐藏",
+        "show":"显示",
+        "button_name":"按钮名称",
+        "button_placeholder":"请输入按钮名称",
+        "please_input":"请输入",
+        "phone":"电话号码",
+        "link":"链接地址",
+        "phone_short":"电话",
+        "link_short":"链接",
+
+        
     }
 }

+ 1 - 1
packages/qjkankan-editor/src/lang/index.js

@@ -24,7 +24,7 @@ const i18n = new VueI18n({
         zh,
         en
     },
-    fallbackLocale: 'zh'
+    fallbackLocale: lang
 })
 
 config.lang = lang

+ 2 - 0
packages/qjkankan-editor/src/pages/edit.js

@@ -7,6 +7,7 @@ import 'viewerjs/dist/viewer.css'
 import Viewer from 'v-viewer'
 import '@/directives/vTitleInEditor.js'
 import '@/directives/vTooltipInEditor.js'
+import { i18n } from "@/lang"
 
 console.log('v1014.1550');
 
@@ -25,5 +26,6 @@ Vue.config.productionTip = false
 new Vue({
   router,
   store,
+  i18n,
   render: h => h(App)
 }).$mount('#app')

+ 1 - 1
packages/qjkankan-editor/src/views/base/Toolbar.vue

@@ -123,7 +123,7 @@ export default {
       info: 'info'
     }),
     titleLength() {
-      return this.info?.name?.length || '0'
+      return this.info.name.length || '0'
     }
   },
   mounted() {

+ 7 - 2
packages/qjkankan-editor/src/views/base/autoCruiseSettings.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="auto-cruise-settings">
-    <span class="title">自动巡游</span>
+    <span class="title">{{auto_pano}}</span>
     <br>
     <div class="switch-wrapper">
-      <span class="label">进入全景图自动巡游(3分钟完整巡游一次)</span>
+      <span class="label">{{enter_auto}}</span>
       <Switcher :value="info.isAuto" @change="onSwitcherChange"></Switcher>
     </div>
   </div>
@@ -12,6 +12,7 @@
 <script>
 import { mapGetters } from "vuex";
 import Switcher from "@/components/shared/Switcher";
+import {i18n} from "@/lang"
 
 export default {
   components: {
@@ -19,6 +20,10 @@ export default {
   },
   data() {
     return {
+
+      auto_pano:i18n.t("edit_settings.auto_pano"),
+      enter_auto:i18n.t("edit_settings.enter_auto"),
+
       password:'',
       canSee: false,
     }

+ 9 - 4
packages/qjkankan-editor/src/views/base/backgroundMusicSettings.vue

@@ -1,10 +1,10 @@
 <template>
   <div class="background-music-settings">
-    <span class="title">设置背景音乐</span>
+    <span class="title">{{set_bgm}}</span>
     <br>
     <button v-if="!(info && info.backgroundMusic && info.backgroundMusic.name)" @click="onClickMusicSelectionBtn">
       <i class="iconfont icon-editor_add"></i>
-      添加音频
+      {{add_audio}}
     </button>
     <template v-else>
       <div class="music-display" @click.self="onClickCurrentMusic">
@@ -14,13 +14,13 @@
       </div>
       <button @click="onClickMusicSelectionBtn">
         <i class="iconfont icon-editor_update"></i>
-        更换音频
+        {{change_audio}}
       </button>
     </template>
 
     <div class="dialog" style="z-index: 2000" v-if="isShowSelectionWindow">
       <MaterialSelectorForEditor
-        title="选择素材"
+        :title="select_material"
         @cancle="isShowSelectionWindow = false"
         @submit="handleSubmitFromMaterialSelector"
         :selectableType="['audio']"
@@ -34,6 +34,7 @@
 import { mapGetters } from "vuex";
 import MaterialSelectorForEditor from "@/components/materialSelectorForEditor.vue";
 import Audio from "@/components/audio/audioButton.vue";
+import {i18n} from "@/lang"
 
 export default {
   components: {
@@ -42,6 +43,10 @@ export default {
   },
   data() {
     return {
+      set_bgm:i18n.t("edit_settings.set_bgm"),
+      add_audio:i18n.t("edit_settings.add_audio"),
+      change_audio:i18n.t("edit_settings.change_audio"),
+      select_material:i18n.t("gather.select_material"),
       isShowSelectionWindow: false,
     }
   },

+ 497 - 0
packages/qjkankan-editor/src/views/base/customButtonSettings copy.vue

@@ -0,0 +1,497 @@
+<template>
+  <div class="custom-button-settings">
+    <span class="title">{{ custom_button }}</span>
+
+
+    <i class="iconfont icon-material_prompt tool-tip-for-editor" v-tooltip="custom_button_tips">
+    </i>
+    <br />
+
+    <div v-for="(item, index) of info.customButton" :key="index" class="button-setting-item"
+      :class="{ expand: expandStatus[index] }">
+      <div class="title-bar" :class="info.customButton[index].isShow ? 'bright' : 'dark'"
+        @click="onRequestForChangeExpandStatus(index)">
+        <div class="left">
+          <i class="iconfont icon-edit_input_arrow icon-expand"></i>
+          <img v-if="info.customButton[index].type === '电话' && info.customButton[index].isShow"
+            :src="require('@/assets/images/icons/phone.svg')" class="button-icon" alt="">
+          <img v-if="info.customButton[index].type === '电话' && !info.customButton[index].isShow"
+            :src="require('@/assets/images/icons/phone-dark.svg')" class="button-icon" alt="">
+          <img v-if="info.customButton[index].type === '链接' && info.customButton[index].isShow"
+            :src="require('@/assets/images/icons/link.svg')" class="button-icon" alt="">
+          <img v-if="info.customButton[index].type === '链接' && !info.customButton[index].isShow"
+            :src="require('@/assets/images/icons/link-dark.svg')" class="button-icon" alt="">
+          <span class="button-name">
+            {{ buttonName[index] }}
+            <!-- {{ info.customButton[index].name  }} -->
+          </span>
+        </div>
+        <div class="right">
+          <i class="iconfont icon-editor_list_edit btn-edit" @click.stop="onRequestForEdit(index)" v-tooltip="edittips">
+          </i>
+          <i v-show="info.customButton[index].isShow" class="iconfont icon-editor_on btn-show" v-tooltip="hidetips"
+            @click.stop="info.customButton[index].isShow = false"></i>
+          <i v-show="!info.customButton[index].isShow" class="iconfont icon-editor_off btn-hide" v-tooltip="showtips"
+            @click.stop="onRequestForShow(index)"></i>
+        </div>
+      </div>
+      <div class="edit-content">
+        <div class="edit-content-item">
+          <span class="item-name">{{ button_name }}</span>
+          <PulldownMenuInEditor class="selector" :valueList="buttonTypeList" v-model="info.customButton[index].type">
+          </PulldownMenuInEditor>
+          <input class="name-input" :placeholder="button_placeholder" v-model="info.customButton[index].name"
+            maxlength="15">
+        </div>
+        <div class="edit-content-item">
+          <span class="item-name">{{ buttonValueTips[index] }}</span>
+          <input class="value-input" v-model="info.customButton[index].value">
+        </div>
+      </div>
+    </div>
+
+    <popup v-if="isEditing" :canClose="false">
+      <div class="ui-message ui-message-confirm dark edit-window">
+        <div class="ui-message-header">
+          <span>{{ custom_button }}</span>
+          <span @click="isEditing = false">
+            <i class="iconfont icon_close"></i>
+          </span>
+        </div>
+
+        <div class="ui-message-main">
+          <div class="edit-content-item">
+            <span class="item-name">{{ button_name }}</span>
+            <PulldownMenuInEditor class="selector" :valueList="buttonTypeList" v-model="editingInfo.type">
+            </PulldownMenuInEditor>
+            <input class="name-input" :placeholder="button_placeholder" v-model="editingInfo.name" maxlength="15">
+          </div>
+          <div class="edit-content-item">
+            <span class="item-name">{{ editingButtonValueTip }}</span>
+            <input class="value-input" :placeholder="`${please_input}${editingButtonValueTip}`"
+              v-model="editingInfo.value">
+          </div>
+        </div>
+
+        <div class="ui-message-footer">
+          <button class="ui-button deepcancel" @click="isEditing = false">
+            {{ canceltips }}
+          </button>
+          <button class="ui-button submit" @click="onConfirmEditing">
+            {{ comfirmtips }}
+          </button>
+        </div>
+      </div>
+    </popup>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+import PulldownMenuInEditor from "@/components/pulldownMenuInEditor.vue";
+import { isValidPhoneNumber } from "@/utils/other.js";
+import Popup from "@/components/shared/popup/index.vue";
+import { i18n } from "@/lang"
+
+
+export default {
+  components: {
+    PulldownMenuInEditor,
+    Popup,
+  },
+  data() {
+    return {
+      custom_button: i18n.t("edit_settings.custom_button"),
+      custom_button_tips: i18n.t("edit_settings.custom_button_tips"),
+      edittips: i18n.t("edit_settings.edit"),
+      hidetips: i18n.t("edit_settings.hide"),
+      showtips: i18n.t("edit_settings.show"),
+      button_name: i18n.t("edit_settings.button_name"),
+      button_placeholder: i18n.t("edit_settings.button_placeholder"),
+      please_input: i18n.t("edit_settings.please_input"),
+
+      canceltips: i18n.t("gather.cancel"),
+      comfirmtips: i18n.t("gather.comfirm"),
+
+      expandStatus: [],
+      buttonTypeList: [
+        'phone_short',
+        'link_short',
+      ],
+      isEditing: false,
+      editingButtonIdx: -1,
+      isIgnoreTypeChangeWhenEditing: false,
+      editingInfo: {
+        type: '',
+        name: '',
+        value: '',
+      }
+    }
+  },
+  computed: {
+    ...mapGetters({
+      info: 'info'
+    }),
+    buttonValueTips() {
+      if (this.info.customButton) {
+        return this.info.customButton.map((item) => {
+          if (item.type === '电话') {
+            return i18n.t("edit_settings.phone")
+          } else if (item.type === '链接') {
+            return i18n.t("edit_settings.link")
+          } else {
+            return ''
+          }
+        })
+      } else {
+        return null
+      }
+    },
+
+    buttonName() {
+      if (this.info.customButton) {
+        return this.info.customButton.map((item) => {
+          if (item.type === '电话') {
+            return i18n.t("edit_settings.phone_short")
+          } else if (item.type === '链接') {
+            return i18n.t("edit_settings.link_short")
+          } else {
+            return ''
+          }
+        })
+      } else {
+        return null
+      }
+    },
+    editingButtonValueTip() {
+      if (this.editingInfo.type === '电话') {
+        return i18n.t("edit_settings.phone")
+      } else if (this.editingInfo.type === '链接') {
+        return i18n.t("edit_settings.link")
+      } else {
+        return ''
+      }
+    },
+  },
+  watch: {
+    'editingInfo.type': {
+      handler(vNew) {
+        if (!this.isIgnoreTypeChangeWhenEditing) {
+          console.log(vNew);
+          this.editingInfo.name = vNew
+          this.editingInfo.value = ''
+        }
+        this.isIgnoreTypeChangeWhenEditing = false
+      }
+    },
+  },
+  beforeMount() {
+    if (!this.info.customButton) {
+      // 这是在v1.2版之前创建的作品,还没设置过自定义按钮,所以还没有customButton字段
+      this.info.customButton = [
+        {
+          "type": "phone",
+          "name": "电话",
+          "value": "",
+          "isShow": false
+        },
+        {
+          "type": "link",
+          "name": "链接",
+          "value": "",
+          "isShow": false
+        }
+      ]
+    }
+  },
+  methods: {
+    onRequestForChangeExpandStatus(index) {
+      this.$set(this.expandStatus, index, !this.expandStatus[index])
+    },
+    onRequestForEdit(index) {
+      this.editingButtonIdx = index
+      this.isIgnoreTypeChangeWhenEditing = true,
+        this.editingInfo.type = this.info.customButton[index].type
+      this.editingInfo.name = this.info.customButton[index].name
+      this.editingInfo.value = this.info.customButton[index].value
+      this.isEditing = true
+    },
+    checkButtonName(name) {
+      if (!name) {
+        this.$msg.warning('请填写完整信息')
+        return false
+      }
+      return true
+    },
+    checkButtonValue(value, type) {
+      if (type === '电话') {
+        if (!isValidPhoneNumber(value)) {
+          this.$msg.warning('请正确填写电话号码')
+          return false
+        }
+      } else if (type === '链接') {
+        if (!value) {
+          this.$msg.warning('请填写完整信息')
+          return false
+        }
+      }
+      return true
+    },
+    onConfirmEditing() {
+      if (!this.checkButtonName(this.editingInfo.name)) {
+        return
+      }
+      if (!this.checkButtonValue(this.editingInfo.value, this.editingInfo.type)) {
+        return
+      }
+      this.info.customButton[this.editingButtonIdx].type = this.editingInfo.type
+      this.info.customButton[this.editingButtonIdx].name = this.editingInfo.name
+      this.info.customButton[this.editingButtonIdx].value = this.editingInfo.value
+      this.$msg.success('操作成功')
+      this.isEditing = false
+    },
+    onRequestForShow(index) {
+      if (!this.checkButtonName(this.info.customButton[index].name)) {
+        return
+      }
+      if (!this.checkButtonValue(this.info.customButton[index].value, this.info.customButton[index].type)) {
+        return
+      }
+      this.info.customButton[index].isShow = true
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.custom-button-settings {
+  padding: 24px 30px;
+  background: #252526;
+  height: 546px;
+
+  .title {
+    font-size: 18px;
+    color: #FFFFFF;
+  }
+
+  .tool-tip-for-editor {
+    margin-left: 4px;
+    font-size: 12px;
+    cursor: default;
+    position: relative;
+    top: -2px;
+  }
+
+  >.button-setting-item {
+    margin-top: 16px;
+    position: relative;
+    min-height: 50px;
+
+    >.title-bar {
+      position: absolute;
+      width: 100%;
+      height: 50px;
+      background: #1A1B1D;
+      border-radius: 2px;
+      border: 1px solid #404040;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding: 0 16px;
+      cursor: pointer;
+
+      &.bright {
+        color: #fff;
+      }
+
+      &.dark {
+        color: #808080;
+      }
+
+      >.left {
+        display: flex;
+        align-items: center;
+
+        >.icon-expand {
+          font-size: 10px;
+          color: rgba(255, 255, 255, 0.6);
+          transform: rotate(-90deg);
+          cursor: pointer;
+        }
+
+        >.button-icon {
+          width: 18px;
+          height: 18px;
+          margin-left: 6px;
+        }
+
+        >.button-name {
+          font-size: 16px;
+          margin-left: 6px;
+        }
+      }
+
+      >.right {
+        display: flex;
+        align-items: center;
+
+        i.btn-edit {
+          margin-left: 16px;
+          cursor: pointer;
+
+          &:hover {
+            color: #0076F6;
+          }
+        }
+
+        >.btn-show {
+          margin-left: 16px;
+          cursor: pointer;
+
+          &:hover {
+            color: #0076F6;
+          }
+        }
+
+        >.btn-hide {
+          margin-left: 16px;
+          cursor: pointer;
+
+          &:hover {
+            color: #0076F6;
+          }
+        }
+      }
+    }
+
+    >.edit-content {
+      border-radius: 2px;
+      border: 1px solid #404040;
+      padding-top: 58px;
+      padding-bottom: 26px;
+      display: none;
+      pointer-events: none;
+
+      >.edit-content-item {
+        margin-top: 16px;
+        display: flex;
+        align-items: center;
+
+        >.item-name {
+          margin-left: 16px;
+          font-size: 14px;
+          color: rgba(255, 255, 255, 0.5)
+        }
+
+        >.selector {
+          margin-left: 16px;
+        }
+
+        >.name-input {
+          height: 36px;
+          background: transparent;
+          border-radius: 2px;
+          border: 1px solid #404040;
+          color: #fff;
+          font-size: 14px;
+          padding: 0 16px;
+          letter-spacing: 1px;
+          width: 470px;
+
+          &:focus {
+            border-color: #0076F6;
+          }
+        }
+
+        >.value-input {
+          margin-left: 16px;
+          height: 36px;
+          background: transparent;
+          border-radius: 2px;
+          border: 1px solid #404040;
+          color: #fff;
+          font-size: 14px;
+          padding: 0 16px;
+          letter-spacing: 1px;
+          width: 610px;
+
+          &:focus {
+            border-color: #0076F6;
+          }
+        }
+      }
+    }
+  }
+
+  >.button-setting-item.expand {
+    >.title-bar {
+      >.left {
+        >.icon-expand {
+          transform: rotate(0deg);
+        }
+      }
+    }
+
+    >.edit-content {
+      display: block;
+    }
+  }
+
+  .edit-window {
+    width: 574px;
+
+    >.ui-message-main {
+      margin-bottom: 40px;
+
+      >.edit-content-item {
+        margin-top: 16px;
+        display: flex;
+        align-items: center;
+
+        >.item-name {
+          flex: 0 0 auto;
+          font-size: 14px;
+          color: rgba(255, 255, 255, 0.5)
+        }
+
+        >.selector {
+          margin-left: 16px;
+        }
+
+        >.name-input {
+          height: 36px;
+          background: #252526;
+          border-radius: 2px;
+          border: 1px solid #404040;
+          color: #fff;
+          font-size: 14px;
+          padding: 0 16px;
+          letter-spacing: 1px;
+          width: 470px;
+
+          &:focus {
+            border-color: #0076F6;
+          }
+        }
+
+        >.value-input {
+          margin-left: 16px;
+          height: 36px;
+          background: #252526;
+          border-radius: 2px;
+          border: 1px solid #404040;
+          color: #fff;
+          font-size: 14px;
+          padding: 0 16px;
+          letter-spacing: 1px;
+          width: 610px;
+
+          &:focus {
+            border-color: #0076F6;
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 28 - 13
packages/qjkankan-editor/src/views/material/audio/index.vue

@@ -10,16 +10,16 @@
           @click="onUploadFile"
           class="ui-button submit"
         >
-          <span>上传素材</span>
+          <span>{{upload_material}}</span>
           <i class="iconfont icon-material_prompt hover-tips hover-tips-upload-icon">
             <div>
-              <div class="remark">请上传20MB以内、mp3格式的音频</div>
+              <div class="remark">{{audio_size}}</div>
             </div>
           </i>
           <upload
             ref="uploadFile"
-            :failString="'格式错误,请上传20MB以内、mp3格式的音频'"
-            :limitFailStr="'过大,请上传20MB以内、mp3格式的音频'"
+            :failString="audio_fail"
+            :limitFailStr="audio_limit"
             accept-type="audio/mp3"
             media-type="audio"
             :limit="20"
@@ -33,7 +33,7 @@
           <input
             type="text"
             v-model="searchKey"
-            placeholder="搜索素材"
+            :placeholder="serch_material"
           />
           <i v-if="searchKey" @click="searchKey=''" class="iconfont icontoast_red del"></i>
         </div>
@@ -65,12 +65,12 @@
               @click="(showRename = true), (popupItem = item)"
             >
               <div>
-                <div class="remark">重命名</div>
+                <div class="remark">{{rename}}</div>
               </div>
             </i>
             <i class="iconfont icon-material_operation_delete hover-tips-warn" @click="del(item)">
               <div>
-                <div class="remark">删除</div>
+                <div class="remark">{{del}}</div>
               </div>
             </i>
           </div>
@@ -86,15 +86,15 @@
         </div>
       </tableList>
       <UploadTaskList class="upload-task-list" fileType="AUDIO" :taskList="uploadListForUI" @cancel-task="onCancelTask"></UploadTaskList>
-      <div class="total-number" v-if="list.length !== 0 || hasMoreData">已加载{{list.length}}条</div>
+      <div class="total-number" v-if="list.length !== 0 || hasMoreData">{{had_load}}</div>
       <div class="nodata" v-if="list.length == 0 && !hasMoreData && lastestUsedSearchKey">
         <img :src="$noresult" alt="" />
-        <span>未搜索到结果~</span>
+        <span>{{no_serch_result}}</span>
       </div>
       <div class="nodata" v-if="list.length == 0 && !hasMoreData && !lastestUsedSearchKey">
         <img :src="config.empty" alt="" />
-        <span>暂无素材~</span>
-        <button @click="$refs.uploadFile.click()" class="upload-btn-in-table">上传素材</button>
+        <span>{{no_material_result}}</span>
+        <button @click="$refs.uploadFile.click()" class="upload-btn-in-table">{{upload_material}}</button>
       </div>
     </div>
 
@@ -119,6 +119,7 @@ import { changeByteUnit } from "@/utils/file";
 import UploadTaskList from "../components/uploadList1.1.0.vue";
 import { debounce } from "@/utils/other.js"
 import { mapState } from 'vuex';
+import {i18n} from "@/lang"
 
 import {
   getMaterialList,
@@ -141,6 +142,17 @@ export default {
   },
   data() {
     return {
+      upload_material: i18n.t("gather.upload_material"),
+      audio_size: i18n.t("gather.audio_size"),
+      audio_limit: i18n.t("gather.audio_limit"),
+      audio_fail: i18n.t("gather.audio_fail"),
+      serch_material: i18n.t("gather.serch_material"),
+      rename: i18n.t("gather.rename"),
+      deltips: i18n.t("gather.delete"),
+      no_serch_result: i18n.t("gather.no_serch_result"),
+      no_material_result: i18n.t("gather.no_material_result"),
+
+
       config,
       showRename: false,
       showList: false,
@@ -155,7 +167,7 @@ export default {
       
       tablist: [
         {
-          name: "音频",
+          name: i18n.t("gather.audio"),
           id: TYPE,
         },
       ],
@@ -167,7 +179,10 @@ export default {
   computed: {
     ...mapState({
       uploadListForUI: 'uploadStatusListAudio',
-    })
+    }),
+    had_load(){
+      return i18n.t("gather.had_load",{msg:this.list.length})
+    }
   },
   mounted() {
   },

+ 7 - 1
packages/qjkankan-editor/src/views/material/components/uploadList1.1.0.vue

@@ -4,7 +4,7 @@
     <div class="head">
       <div class="left">
         <i class="iconfont iconmaterial_preview_upload"></i>
-        <span class="text">正在上传 {{taskList.length}}</span>
+        <span class="text">{{uploading}}</span>
       </div>
       <div class="right">
         <i
@@ -52,6 +52,9 @@
 </template>
 
 <script>
+import {i18n} from "@/lang"
+
+
 export default {
   props: {
     fileType: {
@@ -111,6 +114,9 @@ export default {
           return require('@/assets/images/icons/upload-file-type-icon-image@2x.png')
       }
     },
+    uploading(){
+      return i18n.t("gather.uploading",{msg:this.taskList.length})
+    }
   },
   data() {
     return {

+ 29 - 13
packages/qjkankan-editor/src/views/material/image/index.vue

@@ -10,16 +10,16 @@
           @click="onUploadFile"
           class="ui-button submit"
         >
-          <span>上传素材</span>
+          <span>{{upload_material}}</span>
           <i class="iconfont icon-material_prompt hover-tips hover-tips-upload-icon">
             <div>
-              <div class="remark">请上传10MB以内、jpg/png格式的图片</div>
+              <div class="remark">{{img_size}}</div>
             </div>
           </i>
           <upload
             ref="uploadFile"
-            :failString="'格式错误,请上传10MB以内、jpg/png格式的图片'"
-            :limitFailStr="'过大,请上传10MB以内、jpg/png格式的图片'"
+            :failString="img_fail"
+            :limitFailStr="img_limit"
             accept-type="image/png,image/jpeg"
             media-type="image"
             :limit="10"
@@ -33,7 +33,7 @@
           <input
             type="text"
             v-model="searchKey"
-            placeholder="搜索素材"
+            :placeholder="serch_material"
           />
           <i v-if="searchKey" @click="searchKey=''" class="iconfont icontoast_red del"></i>
         </div>
@@ -65,12 +65,12 @@
               @click="(showRename = true), (popupItem = item)"
             >
               <div>
-                <div class="remark">重命名</div>
+                <div class="remark">{{rename}}</div>
               </div>
             </i>
             <i class="iconfont icon-material_operation_delete hover-tips-warn" @click="del(item)">
               <div>
-                <div class="remark">删除</div>
+                <div class="remark">{{del}}</div>
               </div>
             </i>
           </div>
@@ -89,15 +89,15 @@
         </div>
       </tableList>
       <UploadTaskList class="upload-task-list" fileType="IMAGE" :taskList="uploadListForUI" @cancel-task="onCancelTask"></UploadTaskList>
-      <div class="total-number" v-if="list.length !== 0 || hasMoreData">已加载{{list.length}}条</div>
+      <div class="total-number" v-if="list.length !== 0 || hasMoreData">{{had_load}}</div>
       <div class="nodata" v-if="list.length == 0 && !hasMoreData && lastestUsedSearchKey">
         <img :src="$noresult" alt="" />
-        <span>未搜索到结果~</span>
+        <span>{{no_serch_result}}</span>
       </div>
       <div class="nodata" v-if="list.length == 0 && !hasMoreData && !lastestUsedSearchKey">
         <img :src="config.empty" alt="" />
-        <span>暂无素材~</span>
-        <button @click="$refs.uploadFile.click()" class="upload-btn-in-table">上传素材</button>
+        <span>{{no_material_result}}</span>
+        <button @click="$refs.uploadFile.click()" class="upload-btn-in-table">{{upload_material}}</button>
       </div>
     </div>
 
@@ -138,6 +138,9 @@ import {
   checkUserSize
 } from "@/api";
 
+import {i18n} from "@/lang"
+
+
 const TYPE = "image";
 
 export default {
@@ -151,6 +154,16 @@ export default {
   },
   data() {
     return {
+      upload_material: i18n.t("gather.upload_material"),
+      img_fail: i18n.t("gather.img_fail"),
+      img_limit: i18n.t("gather.img_limit"),
+      img_size: i18n.t("gather.img_size"),
+      serch_material: i18n.t("gather.serch_material"),
+      rename: i18n.t("gather.rename"),
+      deltips: i18n.t("gather.delete"),
+      no_serch_result: i18n.t("gather.no_serch_result"),
+      no_material_result: i18n.t("gather.no_material_result"),
+
       config, // TODO: 没必要这么弄
       showRename: false,
       showList: false,
@@ -164,7 +177,7 @@ export default {
       searchKey: "",
       tablist: [
         {
-          name: "图片",
+          name: i18n.t("gather.image"),
           id: TYPE,
         },
       ],
@@ -176,7 +189,10 @@ export default {
   computed: {
     ...mapState({
       uploadListForUI: 'uploadStatusListImage',
-    })
+    }),
+    had_load(){
+      return i18n.t("gather.had_load",{msg:this.list.length})
+    }
   },
   mounted() {
   },

+ 30 - 13
packages/qjkankan-editor/src/views/material/pano/index.vue

@@ -10,16 +10,16 @@
           @click="onUploadFile"
           class="ui-button submit"
         >
-          <span>上传素材</span>
+          <span>{{upload_material}}</span>
           <i class="iconfont icon-material_prompt hover-tips hover-tips-upload-icon">
             <div>
-              <div class="remark">请上传2:1、120MB以内、jpg格式的图片</div>
+              <div class="remark">{{pano_size}}</div>
             </div>
           </i>
           <upload
             ref="uploadFile"
-            :failString="'格式错误,请上传2:1、120MB以内、jpg格式的全景图片'"
-            :limitFailStr="'过大,请上传2:1、120MB以内、jpg格式的全景图片'"
+            :failString="pano_fail"
+            :limitFailStr="pano_limit"
             accept-type=".jpg"
             media-type="image"
             :limit="120"
@@ -33,7 +33,7 @@
           <input
             type="text"
             v-model="searchKey"
-            placeholder="搜索素材"
+            :placeholder="serch_material"
           />
           <i v-if="searchKey" @click="searchKey=''" class="iconfont icontoast_red del"></i>
         </div>
@@ -69,7 +69,7 @@
               @click="(showCover = true), (popupItem = item)"
             >
               <div>
-                <div class="remark">编辑封面</div>
+                <div class="remark">{{edit_cover}}</div>
               </div>
             </i>
 
@@ -78,12 +78,12 @@
               @click="(showRename = true), (popupItem = item)"
             >
               <div>
-                <div class="remark">重命名</div>
+                <div class="remark">{{rename}}</div>
               </div>
             </i>
             <i class="iconfont icon-material_operation_delete hover-tips-warn" @click="del(item)">
               <div>
-                <div class="remark">删除</div>
+                <div class="remark">{{deltips}}</div>
               </div>
             </i>
           </div>
@@ -106,15 +106,15 @@
         </div>
       </tableList>
       <UploadTaskList class="upload-task-list" fileType="IMAGE" :taskList="uploadListForUI" @cancel-task="onCancelTask"></UploadTaskList>
-      <div class="total-number" v-if="list.length !== 0 || hasMoreData">已加载{{list.length}}条</div>
+      <div class="total-number" v-if="list.length !== 0 || hasMoreData">{{had_load}}</div>
       <div class="nodata" v-if="list.length == 0 && !hasMoreData && lastestUsedSearchKey">
         <img :src="$noresult" alt="" />
-        <span>未搜索到结果~</span>
+        <span>{{no_serch_result}}</span>
       </div>
       <div class="nodata" v-if="list.length == 0 && !hasMoreData && !lastestUsedSearchKey">
         <img :src="config.empty" alt="" />
-        <span>暂无素材~</span>
-        <button @click="$refs.uploadFile.click()" class="upload-btn-in-table">上传素材</button>
+        <span>{{no_material_result}}</span>
+        <button @click="$refs.uploadFile.click()" class="upload-btn-in-table">{{upload_material}}</button>
       </div>
     </div>
 
@@ -163,6 +163,9 @@ import {
   checkUserSize
 } from "@/api";
 
+import {i18n} from "@/lang"
+
+
 const TYPE = "pano";
 const LONG_POLLING_INTERVAL = 5;
 
@@ -179,6 +182,17 @@ export default {
   },
   data() {
     return {
+      upload_material: i18n.t("gather.upload_material"),
+      serch_material: i18n.t("gather.serch_material"),
+      no_serch_result: i18n.t("gather.no_serch_result"),
+      no_material_result: i18n.t("gather.no_material_result"),
+      pano_size: i18n.t("gather.pano_size"),
+      pano_fail: i18n.t("gather.pano_fail"),
+      pano_limit: i18n.t("gather.pano_limit"),
+      edit_cover: i18n.t("gather.edit_cover"),
+      rename: i18n.t("gather.rename"),
+      deltips: i18n.t("gather.delete"),
+      
       config,
       showRename: false,
       showCover: false,
@@ -194,7 +208,7 @@ export default {
 
       tablist: [
         {
-          name: "全景图片",
+          name: i18n.t("gather.panorama"),
           id: TYPE,
         },
       ],
@@ -212,6 +226,9 @@ export default {
       return this.uploadListForUI.some((item) => {
         return item.status === 'LOADING' && item.ifKnowProgress === false
       })
+    },
+    had_load(){
+      return i18n.t("gather.had_load",{msg:this.list.length})
     }
   },
   mounted() {

+ 13 - 6
packages/qjkankan-editor/src/views/material/popup/share.vue

@@ -2,7 +2,7 @@
   <popup v-if="show">
     <div class="ui-message ui-message-confirm message-material" style="width: 500px">
       <div class="ui-message-header header-material">
-        <span>分享</span>
+        <span>{{share}}</span>
         <span @click="$emit('close')">
           <i class="iconfont icon_close"></i>
         </span>
@@ -10,11 +10,11 @@
       <div class="ui-message-main">
         <ul>
           <li>
-            <span>作品链接</span>
-            <input :title="item.share" class="ui-input" disabled type="text" maxlength="15" placeholder="输入名字" v-model="item.share" />
+            <span>{{work_link}}</span>
+            <input :title="item.share" class="ui-input" disabled type="text" maxlength="15"  v-model="item.share" />
           </li>
           <li>
-            <span>作品二维码</span>
+            <span>{{work_qrCode}}</span>
             <img :src="item.qrCode + `?${Math.random()}` || $thumb" alt="" />
           </li>
         </ul>
@@ -22,10 +22,10 @@
 
       <div class="ui-message-footer footer-material">
         <button @click="downloadImg(item)" class="ui-button">
-          下载二维码
+          {{download_qrCode}}
         </button>
         <button @click="copy(item.share)" class="ui-button submit">
-          复制链接
+          {{copy_link}}
         </button>
       </div>
     </div>
@@ -34,6 +34,7 @@
 
 <script>
 import Popup from "@/components/shared/popup";
+import {i18n} from "@/lang"
 
 let dataUrlToBold = function(url) {
   let arr = url.split(","),
@@ -54,6 +55,12 @@ export default {
   },
   data() {
     return {
+      work_link: i18n.t("material.works.work_link"),
+      work_qrCode: i18n.t("material.works.work_qrCode"),
+      share: i18n.t("material.works.share"),
+      download_qrCode: i18n.t("material.works.download_qrCode"),
+      copy_link: i18n.t("material.works.copy_link"),
+
       key: "",
     };
   },

+ 28 - 13
packages/qjkankan-editor/src/views/material/video/index.vue

@@ -10,16 +10,16 @@
           @click="onUploadFile"
           class="ui-button submit"
         >
-          <span>上传素材</span>
+          <span>{{upload_material}}</span>
           <i class="iconfont icon-material_prompt hover-tips hover-tips-upload-icon">
             <div>
-              <div class="remark">请上传200MB以内、mp4格式的视频</div>
+              <div class="remark">{{video_size}}</div>
             </div>
           </i>
           <upload
             ref="uploadFile"
-            :failString="'格式错误,请上传200MB以内、mp4格式的视频'"
-            :limitFailStr="'过大,请上传200MB以内、mp4格式的视频'"
+            :failString="video_limit"
+            :limitFailStr="video_fail"
             accept-type="video/mp4"
             media-type="video"
             :limit="200"
@@ -33,7 +33,7 @@
             <input
               type="text"
               v-model="searchKey"
-              placeholder="搜索素材"
+              :placeholder="serch_material"
             />
             <i v-if="searchKey" @click="searchKey=''" class="iconfont icontoast_red del"></i>
           </div>
@@ -65,12 +65,12 @@
               @click="(showRename = true), (popupItem = item)"
             >
               <div>
-                <div class="remark">重命名</div>
+                <div class="remark">{{rename}}</div>
               </div>
             </i>
             <i class="iconfont icon-material_operation_delete hover-tips-warn" @click="del(item)">
               <div>
-                <div class="remark">删除</div>
+                <div class="remark">{{del}}</div>
               </div>
             </i>
           </div>
@@ -91,15 +91,15 @@
         </div>
       </tableList>
       <UploadTaskList class="upload-task-list" fileType="VIDEO" :taskList="uploadListForUI" @cancel-task="onCancelTask"></UploadTaskList>
-      <div class="total-number" v-if="list.length !== 0 || hasMoreData">已加载{{list.length}}条</div>
+      <div class="total-number" v-if="list.length !== 0 || hasMoreData">{{had_load}}</div>
       <div class="nodata" v-if="list.length == 0 && !hasMoreData && lastestUsedSearchKey">
         <img :src="$noresult" alt="" />
-        <span>未搜索到结果~</span>
+        <span>{{no_serch_result}}</span>
       </div>
       <div class="nodata" v-if="list.length == 0 && !hasMoreData && !lastestUsedSearchKey">
         <img :src="config.empty" alt="" />
-        <span>暂无素材~</span>
-        <button @click="$refs.uploadFile.click()" class="upload-btn-in-table">上传素材</button>
+        <span>{{no_material_result}}</span>
+        <button @click="$refs.uploadFile.click()" class="upload-btn-in-table">{{upload_material}}</button>
       </div>
     </div>
 
@@ -128,6 +128,7 @@ import preview from "../popup/videoPreviewer.vue";
 import UploadTaskList from "../components/uploadList1.1.0.vue";
 import { debounce } from "@/utils/other.js"
 import { mapState } from 'vuex';
+import {i18n} from "@/lang"
 
 import {
   getMaterialList,
@@ -150,6 +151,17 @@ export default {
   },
   data() {
     return {
+      upload_material: i18n.t("gather.upload_material"),
+      video_size: i18n.t("gather.video_size"),
+      video_limit: i18n.t("gather.video_limit"),
+      video_fail: i18n.t("gather.video_fail"),
+      serch_material: i18n.t("gather.serch_material"),
+      rename: i18n.t("gather.rename"),
+      deltips: i18n.t("gather.delete"),
+      no_serch_result: i18n.t("gather.no_serch_result"),
+      no_material_result: i18n.t("gather.no_material_result"),
+
+
       config,
       showRename: false,
       showList: false,
@@ -164,7 +176,7 @@ export default {
 
       tablist: [
         {
-          name: "视频",
+          name: i18n.t("gather.video"),
           id: TYPE,
         },
       ],
@@ -176,7 +188,10 @@ export default {
   computed: {
     ...mapState({
       uploadListForUI: 'uploadStatusListVideo',
-    })
+    }),
+    had_load(){
+      return i18n.t("gather.had_load",{msg:this.list.length})
+    }
   },
   mounted() {
   },

+ 27 - 14
packages/qjkankan-editor/src/views/material/works/index.vue

@@ -4,12 +4,12 @@
       <i class="iconfont icon-top"></i>
     </div>
     <div class="tab">
-      <span>我的作品 {{workTotalNum !== undefined ? `(${workTotalNum})`:''}}</span>
+      <span>{{myWorks}} {{workTotalNum !== undefined ? `(${workTotalNum})`:''}}</span>
       <div class="tab-r">
         <div class="filter">
           <div :class="{active: isFilterFocus}" @focusin="onFilterFocus" @focusout="onFilterBlur">
             <i class="iconfont iconworks_search search"></i>
-            <input type="text" placeholder="搜索作品" v-model="searchKey">
+            <input type="text" :placeholder="search" v-model="searchKey">
             <i v-if="searchKey" @click="searchKey=''" class="iconfont icontoast_red del"></i>
           </div>
         </div>
@@ -26,7 +26,7 @@
             <div>
               <i class="iconfont icon_plus"></i>
             </div>
-            <span>创建作品</span>
+            <span>{{create}}</span>
           </div>
         </div>
       </li>
@@ -41,11 +41,11 @@
       <li v-for="(item,i) in list" :key="i" :class="{'has-more-data': hasMoreData}">
         <div class="wrapper">
           <div class="li-hover">
-            <span class="lipreview" @click="handlePreview(item)">预览</span>
+            <span class="lipreview" @click="handlePreview(item)">{{preview}}</span>
             <ul class="oper">
-              <li class="comfirmhover" @click="edit(item)"><i class="iconfont icon-works_editor"></i>编辑</li>
-              <li class="comfirmhover" @click="openShare(item)"><i class="iconfont icon-works_share"></i>分享</li>
-              <li class="cancelhover" @click="del(item, i)"><i class="iconfont icon-works_delete"></i>删除</li>
+              <li class="comfirmhover" @click="edit(item)"><i class="iconfont icon-works_editor"></i>{{edittips}}</li>
+              <li class="comfirmhover" @click="openShare(item)"><i class="iconfont icon-works_share"></i>{{share}}</li>
+              <li class="cancelhover" @click="del(item, i)"><i class="iconfont icon-works_delete"></i>{{deltips}}</li>
             </ul>
           </div>
           <div class="img" @click="handlePreview(item)">
@@ -53,7 +53,7 @@
           </div>
           <div class="li-info">
             <div>
-              <span class="shenglve tttttt" :title="item.name||'无标题'">{{item.name||'无标题'}}</span>
+              <span class="shenglve tttttt" :title="item.name||no_title">{{item.name||no_title}}</span>
             </div>
             <div>
               <span>{{item.createTime.split(' ')[0]}}</span>
@@ -70,18 +70,18 @@
     </ul>
     <div class="nodata" v-if="list.length == 0 && !hasMoreData && lastestUsedSearchKey">
       <img :src="$noresult" alt="" />
-      <span>未搜索到结果~</span>
+      <span>{{no_serch_result}}~</span>
     </div>
     <div class="nodata" v-if="list.length == 0 && !hasMoreData && !lastestUsedSearchKey">
       <img :src="config.empty" alt="" />
-      <span>您还没有作品,请先创建作品~</span>
-      <button @click="add" class="upload-btn-in-table">创建作品</button>
+      <span>{{no_works}}</span>
+      <button @click="add" class="upload-btn-in-table">{{create}}</button>
     </div>
     <share :show='showShare' :item="shareItem" @close="showShare=false"></share>
     <preview v-if="showItem" :name="showItem.name" :show="showPreview" :ifr="`./show.html?id=${showItem.id}`"
       :dark="false" @close="showPreview = false" />
     <div class="dialog" style="z-index: 10" v-if="isShowMaterialSelector">
-      <MaterialSelector title="选择素材" @cancle="isShowMaterialSelector = false" @submit="handleSubmitFromMaterialSelector"
+      <MaterialSelector :title="select_material" @cancle="isShowMaterialSelector = false" @submit="handleSubmitFromMaterialSelector"
         :selectableType="['pano', '3D']" :isMultiSelection="true" :workId="newWorkId" initialMaterialType="pano" />
     </div>
   </div>
@@ -95,7 +95,8 @@ import config from "@/config";
 import { debounce } from "@/utils/other.js"
 import MaterialSelector from "@/components/materialSelectorForManageCenter.vue";
 import { mapGetters } from "vuex";
-import Popup from "@/components/shared/popup";
+import {i18n} from "@/lang"
+
 
 import {
   addWorks,
@@ -119,8 +120,20 @@ export default {
   },
   data() {
     return {
-      config,
+      myWorks: i18n.t("material.works.my"),
+      create: i18n.t("material.works.create"),
+      search: i18n.t("material.works.search"),
+      preview: i18n.t("material.works.preview"),
+      edittips: i18n.t("material.works.edit"),
+      share: i18n.t("material.works.share"),
+      deltips: i18n.t("material.works.delete"),
+      no_works: i18n.t("material.works.no_works"),
+      no_title: i18n.t("gather.no_title"),
+      no_serch_result: i18n.t("gather.no_serch_result"),
+      select_material: i18n.t("gather.select_material"),
 
+
+      config,
       list: [],
       workTotalNum: undefined,
       hasMoreData: true,