Browse Source

增加联系客服

ageer 1 year ago
parent
commit
b729c2ec9f

+ 1 - 0
src/api/index.ts

@@ -73,4 +73,5 @@ export * from "./units"
 export * from "./mic"
 export * from "./chat"
 export * from "./sse/fetchsse"
+export * from "./Recognition"
 

+ 18 - 0
src/api/mjapi.ts

@@ -3,6 +3,7 @@
  import { copyToClip } from "@/utils/copy";
  import { localGet, localSaveAny } from "./mjsave";
  import { t } from "@/locales";
+ import { getToken } from "@/store/modules/auth/helper";
 
  export interface gptsType{
      gid:string
@@ -275,6 +276,23 @@
          if(data.bot && data.bot=='NIJI_JOURNEY'){
              toData.botType= data.bot;
          }
+         let headerAi = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + getToken() };
+         let opt: RequestInit = { method: 'POST' };
+         let prompt = {prompt:data.drawText};
+         opt.body= JSON.stringify(prompt) ;
+         opt.headers = headerAi;
+
+         // 验证是否是付费用户
+         const response = fetch('/api/mjTask', opt);
+         const movies = JSON.parse(await (await response).text()); 
+         if(movies.code == 500){
+             chat.text='失败!'+"\n```json\n"+movies.msg+"\n```\n";
+             chat.loading=false;
+             homeStore.setMyData({act:'updateChat', actData:chat });
+             console.log("movies======",movies);
+             return
+         }
+
          d=  await mjFetch('/mj/submit/imagine' ,toData );
          mlog('submit',d );
          //return ;

BIN
src/assets/ageer.png


+ 2 - 1
src/components/common/Setting/About.vue

@@ -1,5 +1,6 @@
 <script setup lang='ts'>
   import { NCard,NImage } from 'naive-ui'
+  import defaultAvatar from '@/assets/ageer.png'
 </script>
 
 <template>
@@ -7,7 +8,7 @@
     <div style="text-align:center">
       <span>联系客服</span>
       <br>
-      <n-image style="margin: 20px;" width="150" src="http://43.139.70.230:6553/down/v7929z21iHCh.png"/>
+      <n-image style="margin: 20px;" width="150" :src="defaultAvatar"/>
       <br>
  
     </div>

+ 190 - 0
src/locales/en-US.ts

@@ -93,4 +93,194 @@ export default {
     onlineImportWarning: 'Note: Please check the JSON file source!',
     downloadError: 'Please check the network status and JSON file validity',
   },
+
+
+  "mj": {
+    "setOpen": "OpenAI Related",
+    "setOpenPlaceholder": "Must include http(s)://",
+    "setOpenUrl": "OpenAI API Address",
+    "setOpenKeyPlaceholder": "Use custom OpenAI Key to bypass password access restrictions",
+    "setMj": "Midjourney Related",
+    "setMjUrl": "Midjourney API Address:",
+    "setMjKeyPlaceholder": "Use custom Api Secret to bypass password access restrictions",
+    "setUploader": "Upload Related",
+    "setUploaderUrl": "Upload Address:",
+    "setBtSave": "Save",
+    "setBtBack": "Restore Default",
+
+    "redraw": "Redraw",
+  "fail1": "Please be patient, it's loading.",
+  "success1": "Image refreshed successfully!",
+  "high_variation": "Strong Variation",
+  "low_variation": "Weak Variation",
+  "p15": "Zoom 1.5x",
+  "p20": "Zoom 2x",
+  "p100": "Normal",
+  "retry": "Retry",
+  "pan_left": "Left",
+  "pan_right": "Right",
+  "pan_up": "Up",
+  "pan_down": "Down",
+  "up2": "HD 2x",
+  "up4": "HD 4x" , 
+
+  "thinking": "Thinking...",
+  "noReUpload": "Cannot re-upload",
+  "uploading": "Uploading...",
+  "uploadSuccess": "Upload successful",
+  "uploadFail": "Upload failed:",
+  "upPdf": "<span>Upload image or attachment<br/>You can upload images, PDFs, EXCEL, and other documents</span><p>Supports drag and drop</p>",
+  "upImg": "<span><b>Upload image</b><br/>Will automatically invoke the gpt-4-vision-preview model<br>Note: Additional image fees may apply<br/>Formats: jpeg, jpg, png, gif</span><p>Supports drag and drop</p> <p class=\"pt-2\"><b>Upload MP3 MP4</b> <br>Will automatically invoke the whisper-1 model<br>Formats: mp3, mp4, mpeg, mpga, m4a, wav, webm</p>",
+  "clearAll": "Clear parameters",
+  "czoom": "Custom",
+  "customTitle": "Custom zoom",
+  "zoominfo": "Modify zoom value, range from 1.0 to 2.0, default is set to 1.8",
+
+  "modleSuccess": "Model loaded successfully",
+  "setingSuccess": "Settings successful",
+
+  "tokenInfo1": "Remaining Tokens = Model Length - Role Setting - Context (Conversation History) - Replies Count - Current Input",
+    "tokenInfo2": "Leave the role setting blank, and the system will provide a default one.",
+    "noSuppertModel": "Refresh, this model is not currently supported!",
+    "failOcr": "Recognition failed",
+    "remain": "Remain:",
+  
+  "totalUsage": "Total subscription amount",
+  "disableGpt4": "GPT4 disabled",
+  "setTextInfo": "OpenAI API Key error, click here to retry",
+
+  "attr1": "Attr",
+  "ulink": "Image Link",
+  "copyFail": "Copy Failed",
+  "tts": "Text to Speech",
+  "fail": "Error",
+  "noSupperChrom": "Browser not supported!",
+  "lang": "Voice",
+  "ttsLoading": "Converting to Speech...",
+  "ttsSuccess": "Conversion successful",
+  "micIng": "Recording, say something...",
+  "mStart": "Start",
+  "mPause": "Pause",
+  "mGoon": "Continue",
+  "mRecord": "Re-record",
+  "mPlay": "Play",
+  "mCanel": "Cancel",
+  "mSent": "Send",
+
+  "findVersion": "Discover updated version",
+  "yesLastVersion": "Already on the latest version",
+  "infoStar": 'This project is open source on <a class="text-blue-600 dark:text-blue-500" href="https://github.com/Dooy/chatgpt-web-midjourney-proxy\" target="_blank">GitHub</a>, free, and based on the MIT license with no form of payment! </p><p>If you find this project helpful, please give it a Star on GitHub, thank you!',
+  "setBtSaveChat": "Save chat only",
+  "setBtSaveSys": "Save to system",
+  "wsrvClose": "Close wsrv",
+  "wsrvOpen": "Open wsrv",
+
+  "temperature": "Temperature",
+  "temperatureInfo": "As the (temperature) value increases, the responses become more random",
+  "top_p": "Top",
+  "top_pInfo": "(top_p) is similar to randomness but should not be changed together with temperature",
+  "presence_penalty": "Presence",
+  "presence_penaltyInfo": "As the (presence_penalty) value increases, there is a higher chance of expanding to new topics",
+  "frequency_penalty": "Frequency",
+  "frequency_penaltyInfo": "As the (frequency_penalty) value increases, there is a higher likelihood of reducing repeated words",
+  "tts_voice": "Voice Role",
+  "typing": "Typing",
+  "authErro": "Authorization failed",
+  "authBt": "Please enter the authorization access password again" ,
+  "micWhisper": "Whisper speech recognition",
+  "micAsr": "Instant recognition",
+  "micRec": "Start recording, please speak! It will automatically stop if there is no sound for 2 seconds.",
+  "micRecEnd": "Recording has ended"
+  },
+  "mjset": {
+    "server": "Server",
+    "about": "About",
+    "model": "Model",
+    "sysname": "AI Drawing"
+  },
+  "mjtab": {
+    "chat": "Chat",
+    "draw": "Drawing",
+    "drawinfo": "AI Drawing with Midjourney Engine",
+    "gallery": "Gallery",
+    "galleryInfo": "My Gallery"
+  },
+  "mjchat": {
+    "loading": "Loading Image",
+    "openurl": "Open Link Directly",
+    "failReason": "Failure Reason:",
+    "reload": "Reload",
+    "progress": "Progress:",
+    "wait": "Task has been submitted, please wait...",
+    "reroll": "Redraw",
+    "wait2": "Task {id} has been submitted, please wait",
+    "redrawEditing": "Partial Redraw Editing",
+    "face": "Change Face",
+    "blend": "Blend Images",
+    "draw": "Drawing",
+    "submiting": "Submitting",
+    "submit": "Submit",
+    "wait3": "Please do not close! Image is being generated...",
+    "success": "Save Successful",
+    "successTitle": "Success",
+    "modlePlaceholder": "Custom models, separated by spaces (optional)",
+    "myModle": "Custom Models",
+    "historyCnt": "Context Count",
+    "historyToken": "More context improves accuracy but consumes more credits",
+    "historyTCnt": "Reply Count",
+    "historyTCntInfo": "Higher reply count may consume more credits",
+    "role": "Role Setting",
+    "rolePlaceholder": "Set an exclusive role for your conversation (optional)",
+    "loading2": "Loading...",
+    "loadmore": "Load More",
+    "nofind": "Unable to find",
+    "nofind2": "related content. You can try the following:",
+    "success2": "Switch Successful!",
+    "modelChange": "Model Change",
+    "search": "Search",
+    "searchPlaceholder": "GPT names, descriptions",
+    "attr": "Attachments",
+    "noproduct": "Gallery has no entries yet",
+    "myGallery": "My Gallery",
+    "yourHead": "Your Avatar",
+    "your2Head": "Celebrity Image",
+    "tipInfo": "Note:<li>1. Images must include faces for proper rendering</li><li>2. 'Celebrity Image' can be created using MJ drawing</li><li>3. 'Celebrity Image' can also include anime characters</li><li>4. 'Your Avatar' is recommended to be a passport-sized personal photo</li>",
+    "placeInput": "Please fill in the prompt!",
+    "more5sb": "Upload up to 5 images at most",
+    "exSuccess": "Export successful... Please check the download folder",
+    "downloadSave": "ai_drawing.txt",
+    "noproducet": "No mature works for now",
+    "imgBili": "Image Ratio",
+    "imagEx": "Export Artwork Image Links",
+    "prompt": "Prompts",
+    "imgCYes": "Contains Base Image",
+    "imgCUpload": "Upload Base Image",
+    "imgCInfo": "Base Image Info:<br/>1. Use your own images as a base for MJ drawing<br/>2. You can use multiple base images, up to 5, each not exceeding 1M in size",
+    "imgCadd": "+Add",
+    "del": "Delete",
+    "img2text": "Image-to-Text",
+    "img2textinfo": "Not sure what prompts to use? Try Image-to-Text! Submit an image to get prompts",
+    "traning": "Translating...",
+    "imgcreate": "Generate Image",
+    "imginfo": "Other parameters:<li>1 --no: Ignore --no car to exclude cars from the image</li><li>2 --seed: Obtain a seed first with --seed 123456</li><li>3 --chaos 10: Mix (range: 0-100)</li><li>4 --tile: Fragmentation</li>",
+    "tStyle": "Style",
+    "tView": "View",
+    "tShot": "Character Shot",
+    "tLight": "Lighting",
+    "tQuality": "Image Quality",
+    "tStyles": "Artistic Level",
+    "tVersion": "Model Version",
+    "dalleInfo": "Note:<li>1. DALL-E is an image generation model provided by OpenAI</li><li>2. OpenAI images have an expiration date, so make backups</li><li>3. Note: The price of 1790px images is double</li>",
+    "version": "Version",
+    "size": "Size",
+    "blendInfo": "Note:<li>1. Blend at least 2 images</li><li>2. Up to 6 images can be used for blending</li>",
+    "blendStart": "Start Blending",
+    "no2add": "Do not add duplicate images",
+    "add2more": "Please add two or more images",
+    "no1m": "Image size cannot exceed 1M",
+    "imgExt": "Images support only jpg, gif, png, jpeg formats"
+  }
+
+
+
 }

+ 6 - 0
src/locales/index.ts

@@ -5,6 +5,9 @@ import koKR from './ko-KR'
 import zhCN from './zh-CN'
 import zhTW from './zh-TW'
 import ruRU from './ru-RU'
+import viVn from './vi-VN'
+import frFr from './fr-FR'
+import trTr from './tr-TR'
 import { useAppStoreWithOut } from '@/store/modules/app'
 import type { Language } from '@/store/modules/app/helper'
 
@@ -22,6 +25,9 @@ const i18n = createI18n({
     'zh-CN': zhCN,
     'zh-TW': zhTW,
     'ru-RU': ruRU,
+    'vi-VN': viVn,
+    'fr-FR': frFr,
+    'tr-TR': trTr,
   },
 })
 

+ 185 - 0
src/locales/ko-KR.ts

@@ -92,4 +92,189 @@ export default {
     importRepeatContent: '내용이 반복되어 건너뜀: {msg}',
     onlineImportWarning: '참고: JSON 파일 소스를 확인하십시오!',
   },
+
+  "mj": {
+    "setOpen": "OpenAI 관련",
+    "setOpenPlaceholder": "http(s)://를 포함해야 함"
+    ,"setOpenUrl": "OpenAI 인터페이스 주소"
+    ,"setOpenKeyPlaceholder": "비밀번호 액세스 제한을 우회하기 위해 사용자 지정 OpenAI 키 사용"
+    ,"setMj": "Midjourney 관련"
+    ,"setMjUrl": "Midjourney 인터페이스 주소:"
+    ,"setMjKeyPlaceholder": "비밀번호 액세스 제한을 우회하기 위해 사용자 지정 Api Secret 사용"
+    ,"setUploader": "업로드 관련"
+    ,"setUploaderUrl": "업로드 주소:"
+    ,"setBtSave": "저장"
+    ,"setBtBack": "기본으로 복원",
+    "redraw": "부분 재그림",
+    "fail1": "고객님은 너무 급해하지 마세요. 로딩 중입니다.",
+    "success1": "이미지가 성공적으로 새로고쳐졌습니다!",
+    "high_variation": "강한 변화",
+    "low_variation": "약한 변화",
+    "p15": "확대 1.5배",
+    "p20": "확대 2배",
+    "p100": "표준",
+    "retry": "분석 다시 시도",
+    "pan_left": "왼쪽으로 다시 분석",
+    "pan_right": "오른쪽으로 다시 분석",
+    "pan_up": "위로 다시 분석",
+    "pan_down": "아래로 다시 분석",
+    "up2": "고화질 2배",
+    "up4": "고화질 4배" ,
+
+    "thinking": "생각 중...",
+    "noReUpload": "다시 업로드할 수 없습니다",
+    "uploading": "업로딩 중...",
+    "uploadSuccess": "업로드 성공",
+    "uploadFail": "업로드 실패:",
+    "upPdf": "<span>이미지 또는 첨부 파일 업로드<br/>이미지, PDF, EXCEL 및 기타 문서를 업로드할 수 있습니다</span><p>드래그 앤 드롭 지원</p>",
+    "upImg": "<span><b>이미지 업로드</b><br/>자동으로 gpt-4-vision-preview 모델을 호출합니다<br>참고: 추가 이미지 비용이 발생할 수 있습니다<br/>포맷: jpeg, jpg, png, gif</span><p>드래그 앤 드롭 지원</p> <p class=\"pt-2\"><b>MP3 MP4 업로드</b> <br>자동으로 whisper-1 모델을 호출합니다<br>포맷: mp3, mp4, mpeg, mpga, m4a, wav, webm</p>",
+    "clearAll": "매개변수 지우기",
+    "czoom": "사용자 정의",
+    "customTitle": "사용자 정의 줌",
+    "zoominfo": "줌 값 수정, 범위는 1.0에서 2.0까지이며 기본 설정은 1.8로 설정됩니다",
+
+    "modleSuccess": "모델이 성공적으로 로드되었습니다",
+    "setingSuccess": "설정이 성공적으로 완료되었습니다",
+    "tokenInfo1": "남은 토큰 = 모델 길이 - 역할 설정 - 컨텍스트 (대화 기록) - 답변 수 - 현재 입력",
+    "tokenInfo2": "역할 설정을 비워두면 시스템에서 기본 값을 제공합니다.",
+    "noSuppertModel": "새로 고침, 현재 이 모델은 지원되지 않습니다!",
+    "failOcr": "인식 실패",
+    "remain": "남:",
+
+    "totalUsage": "총 구독 금액",
+    "disableGpt4": "GPT4 비활성화됨",
+    "setTextInfo": "OpenAI API 키 오류, 여기를 클릭하여 다시 시도",
+    
+    "attr1": "첨부",
+    "ulink": "원본 이미지 링크",
+    "copyFail": "복사 실패",
+    "tts": "텍스트 음성 변환 (TTS)",
+    "fail": "오류가 발생했습니다",
+    "noSupperChrom": "브라우저가 지원되지 않습니다!",
+    "lang": "음성",
+    "ttsLoading": "음성으로 변환 중...",
+    "ttsSuccess": "변환 성공",
+    "micIng": "녹음 중, 무엇인가 말해보세요...",
+    "mStart": "시작",
+    "mPause": "일시 정지",
+    "mGoon": "계속",
+    "mRecord": "다시 녹음",
+    "mPlay": "재생",
+    "mCanel": "취소",
+    "mSent": "전송",
+    "findVersion": "최신 버전 찾기",
+    "yesLastVersion": "최신 버전입니다",
+    "infoStar": "이 프로젝트는 <a class=\"text-blue-600 dark:text-blue-500\" href=\"https://github.com/Dooy/chatgpt-web-midjourney-proxy\" target=\"_blank\">GitHub</a>에서 오픈 소스로 제공되며 MIT 라이선스를 기반으로 하며 어떠한 유료 행위도 없습니다! </p><p>이 프로젝트가 도움이 되었다면 GitHub에서 별을 주시기 바랍니다. 감사합니다!",
+    "setBtSaveChat": "대화만 저장",
+    "setBtSaveSys": "시스템에 저장",
+
+    "wsrvClose": "닫기 wsrv",
+    "wsrvOpen": "열기 wsrv",
+    
+    "temperature": "랜덤성",
+    "temperatureInfo": "(temperature) 값이 증가함에 따라 응답이 더 랜덤해집니다",
+    "top_p": "상위 확률 샘플링",
+    "top_pInfo": "(top_p)은 랜덤성과 유사하지만 온도와 함께 변경되어서는 안 됩니다",
+    "presence_penalty": "주제 신선도",
+    "presence_penaltyInfo": "(presence_penalty) 값이 증가함에 따라 새로운 주제로 확장될 가능성이 높아집니다",
+    "frequency_penalty": "빈도 패널티",
+    "frequency_penaltyInfo": "(frequency_penalty) 값이 증가함에 따라 반복된 단어를 줄이는 가능성이 높아집니다",
+    "tts_voice": "TTS 음성 캐릭터",
+    "typing": "입력 중",
+    "authErro": "인가 실패",
+    "authBt": "인가 액세스 암호를 다시 입력하십시오",
+    "micWhisper": "속삭임 음성 인식",
+    "micAsr": "즉시 인식",
+    "micRec": "녹음 시작, 말씀하세요! 2초 동안 소리가 없으면 자동으로 중지됩니다.",
+    "micRecEnd": "녹음이 종료되었습니다"
+
+  },
+  "mjset": {
+    "server": "서버"
+    ,"about": "소개"
+    ,"model": "모델"
+    ,"sysname": "AI 그림"
+  },
+  "mjtab": {
+    "chat": "대화"
+    ,"draw": "그림"
+    ,"drawinfo": "AI 그림 Midjourney 엔진"
+    ,"gallery": "갤러리"
+    ,"galleryInfo": "내 갤러리"
+  },
+  "mjchat": {
+    "loading": "이미지 로드 중"
+    ,"openurl": "직접 링크 열기"
+    ,"failReason": "실패 이유:"
+    ,"reload": "재로드"
+    ,"progress": "진행:"
+    ,"wait": "작업이 제출되었습니다. 기다려주세요..."
+    ,"reroll": "재그림"
+    ,"wait2": "작업 {id}이(가) 제출되었습니다. 기다려주세요"
+    ,"redrawEditing": "일부 재그림 편집"
+    ,"face": "얼굴 바꾸기"
+    ,"blend": "혼합"
+    ,"draw": "그림 그리기"
+    ,"submiting": "제출 중"
+    ,"submit": "제출"
+    ,"wait3": "닫지 마세요! 이미지 생성 중..."
+    ,"success": "저장 성공"
+    ,"successTitle": "성공"
+    ,"modlePlaceholder": "여러 개의 사용자 정의 모델은 띄어쓰기로 구분됩니다. 필수 사항은 아닙니다."
+    ,"myModle": "내 모델"
+    ,"historyCnt": "컨텍스트 수"
+    ,"historyToken": "더 많은 컨텍스트는 기억을 더 정확하게 만들지만 더 많은 크레딧을 소비할 수 있습니다."
+    ,"historyTCnt": "답장 수"
+    ,"historyTCntInfo": "답장 수가 많을수록 더 많은 크레딧이 소비될 수 있습니다."
+    ,"role": "역할 설정"
+    ,"rolePlaceholder": "대화에 고유한 역할을 설정하십시오. 필수는 아닙니다."
+    ,"loading2": "로딩 중..."
+    ,"loadmore": "더 보기"
+    ,"nofind": "찾을 수 없음"
+    ,"nofind2": "관련 내용을 찾을 수 없습니다. 다음을 시도해 보십시오."
+    ,"success2": "전환 성공!"
+    ,"modelChange": "모델 변경"
+    ,"search": "검색"
+    ,"searchPlaceholder": "GPTs 이름, 소개"
+    ,"attr": "첨부 파일"
+    ,"noproduct": "갤러리에 작품이 없습니다."
+    ,"myGallery": "내 갤러리"
+    ,"yourHead": "당신의 프로필 사진"
+    ,"your2Head": "스타 이미지"
+    ,"tipInfo": "설명:<li>1. 이미지에는 얼굴이 반드시 포함되어야 합니다. 그렇지 않으면 이미지가 생성되지 않습니다.</li> <li>2. '스타 이미지'는 먼저 MJ 그림으로 만들 수 있습니다.</li> <li>3. '스타 이미지'는 애니메이션 이미지로도 괜찮습니다.</li> <li>4. '당신의 프로필 사진'은 1인치 개인 사진을 사용하는 것이 좋습니다.</li>"
+    ,"placeInput": "힌트를 입력하세요!"
+    ,"more5sb": "최대 5장의 이미지를 업로드할 수 있습니다."
+    ,"exSuccess": "내보내기 성공... 다운로드 창을 확인하세요."
+    ,"downloadSave": "ai그림.txt"
+    ,"noproducet": "아직 미완성 작품이 없습니다."
+    ,"imgBili": "이미지 비율"
+    ,"imagEx": "작품 이미지 링크 내보내기"
+    ,"prompt": "힌트"
+    ,"imgCYes": "쿠션 이미지 포함"
+    ,"imgCUpload": "자체 쿠션 이미지 업로드"
+    ,"imgCInfo": "쿠션 이미지 안내:<br/> 1. 쿠션 이미지는 자체 이미지를 기본으로 사용하여 MJ로 그림을 그릴 수 있습니다.<br/> 2. 최대 5 장의 쿠션 이미지를 사용할 수 있으며 각 이미지의 크기는 1M를 초과하지 않아야 합니다.<br/>"
+    ,"imgCadd": "+추가"
+    ,"del": "삭제"
+    ,"img2text": "이미지에서 텍스트 생성"
+    ,"img2textinfo": "힌트가 어떻게 쓰여야 할지 모르겠나요? 이미지에서 텍스트를 생성해 보세요! <br/>이미지를 제출하면 힌트가 생성됩니다."
+    ,"traning": "번역 중..."
+    ,"imgcreate": "이미지 생성"
+    ,"imginfo": "기타 매개변수:<li>1 --no를 무시하면 --no car가 이미지에 표시되지 않습니다.</li><li>2 --seed는 먼저 시드를 얻을 수 있습니다. --seed 123456</li> <li>3 --chaos 10은 혼합(범위: 0-100)</li> <li>4 --tile 조각화</li>"
+    ,"tStyle": "스타일"
+    ,"tView": "시점"
+    ,"tShot": "캐릭터 샷"
+    ,"tLight": "조명"
+    ,"tQuality": "화질"
+    ,"tStyles": "아트 정도"
+    ,"tVersion": "모델 버전"
+    ,"dalleInfo": "설명:<li>1. DALL-E는 OpenAI에서 제공하는 그림 모델입니다.</li>  <li>2. OpenAI의 이미지는 일시적입니다. 백업을 잘 해 두세요.</li>   <li>3. 주의: 1790px 이미지의 가격은 두 배입니다.</li> "
+    ,"version": "버전"
+    ,"size": "크기"
+    ,"blendInfo": "설명:<li>1. 최소 2 장의 이미지를 합성하십시오.</li> <li>2. 최대 6 장의 이미지를 업로드할 수 있습니다.</li> "
+    ,"blendStart": "합성 시작"
+    ,"no2add": "이미지를 중복해서 추가하지 마십시오."
+    ,"add2more": "두 장 이상의 이미지를 추가하십시오."
+    ,"no1m": "이미지 크기는 1M를 초과할 수 없습니다."
+    ,"imgExt": "이미지는 jpg, gif, png, jpeg 형식만 지원됩니다."
+  }
 }

+ 188 - 0
src/locales/ru-RU.ts

@@ -93,4 +93,192 @@ export default {
     onlineImportWarning: 'Внимание! Проверьте источник JSON-файла!',
     downloadError: 'Проверьте состояние сети и правильность JSON-файла',
   },
+  "mj": {
+    "setOpen": "OpenAI связанный",
+    "setOpenPlaceholder": "Должен содержать http(s)://",
+    "setOpenUrl": "Адрес интерфейса OpenAI",
+    "setOpenKeyPlaceholder": "Используйте свой собственный ключ OpenAI для обхода ограничений доступа по паролю",
+    "setMj": "Midjourney связанный",
+    "setMjUrl": "Адрес интерфейса Midjourney:",
+    "setMjKeyPlaceholder": "Используйте свой собственный Api Secret для обхода ограничений доступа по паролю",
+    "setUploader": "Связанный с загрузкой",
+    "setUploaderUrl": "Адрес загрузки:",
+    "setBtSave": "Сохранить",
+    "setBtBack": "Восстановить по умолчанию",
+
+   
+  "redraw": "Частичная Перерисовка",
+  "fail1": "Пожалуйста, будьте терпеливы, идет загрузка.",
+  "success1": "Изображение успешно обновлено!",
+  "high_variation": "Сильные Изменения",
+  "low_variation": "Слабые Изменения",
+  "p15": "Увеличение 1.5x",
+  "p20": "Увеличение 2x",
+  "p100": "Обычное",
+  "retry": "Повторный Анализ",
+  "pan_left": "Переанализировать влево",
+  "pan_right": "Переанализировать вправо",
+  "pan_up": "Переанализировать вверх",
+  "pan_down": "Переанализировать вниз",
+  "up2": "Высокое Разрешение 2x",
+  "up4": "Высокое Разрешение 4x",
+
+  "thinking": "В раздумьях...",
+  "noReUpload": "Нельзя повторно загружать",
+  "uploading": "Загрузка...",
+  "uploadSuccess": "Загрузка успешна",
+  "uploadFail": "Ошибка загрузки:",
+  "upPdf": "<span>Загрузите изображение или вложение<br/>Вы можете загрузить изображения, PDF, EXCEL и другие документы</span><p>Поддерживается перетаскивание</p>",
+  "upImg": "<span><b>Загрузить изображение</b><br/>Автоматически вызовет модель gpt-4-vision-preview<br>Примечание: Могут действовать дополнительные тарифы за изображения<br/>Форматы: jpeg, jpg, png, gif</span><p>Поддерживается перетаскивание</p> <p class=\"pt-2\"><b>Загрузить MP3 MP4</b> <br>Автоматически вызовет модель whisper-1<br>Форматы: mp3, mp4, mpeg, mpga, m4a, wav, webm</p>",
+  "clearAll": "Очистить параметры",
+  "czoom": "Настроить",
+  "customTitle": "Настроить зум",
+  "zoominfo": "Измените значение зума, диапазон от 1.0 до 2.0, по умолчанию установлено 1.8",
+
+  "modleSuccess": "Модель успешно загружена",
+  "setingSuccess": "Настройки успешно выполнены",
+
+ "tokenInfo1": "Оставшиеся токены = Длина модели - Установка роли - Контекст (История разговора) - Количество ответов - Текущий ввод",
+"tokenInfo2": "Оставьте установку роли пустой, и система предоставит значение по умолчанию.",
+"noSuppertModel": "Обновите, эта модель в настоящее время не поддерживается!",
+"failOcr": "Ошибка распознавания",
+"remain": "Осталось:",
+
+  "totalUsage": "Общая сумма подписки",
+  "disableGpt4": "GPT4 отключен",
+  "setTextInfo": "Ошибка ключа OpenAI API, нажмите здесь, чтобы повторить попытку",
+
+  "attr1": "Вложение",
+  "ulink": "Ссылка на оригинальное изображение",
+  "copyFail": "Не удалось скопировать",
+  "tts": "Текст в речь",
+  "fail": "Произошла ошибка",
+  "noSupperChrom": "Браузер не поддерживается!",
+  "lang": "Голос",
+  "ttsLoading": "Преобразование в речь...",
+  "ttsSuccess": "Преобразование успешно",
+  "micIng": "Идет запись, скажите что-нибудь...",
+  "mStart": "Начать",
+  "mPause": "Пауза",
+  "mGoon": "Продолжить",
+  "mRecord": "Перезаписать",
+  "mPlay": "Воспроизвести",
+  "mCanel": "Отмена",
+  "mSent": "Отправить",
+  "findVersion": "Обнаружить обновленную версию",
+  "yesLastVersion": "Уже последняя версия",
+  "infoStar": "Этот проект с открытым исходным кодом находится на <a class=\"text-blue-600 dark:text-blue-500\" href=\"https://github.com/Dooy/chatgpt-web-midjourney-proxy\" target=\"_blank\">GitHub</a>, бесплатный и основан на лицензии MIT без каких-либо форм оплаты! </p><p>Если вы находите этот проект полезным, пожалуйста, добавьте звезду на GitHub, спасибо!",
+  "setBtSaveChat": "Сохранить только чат",
+  "setBtSaveSys": "Сохранить в систему",
+
+  "wsrvClose": "Закрыть wsrv",
+  "wsrvOpen": "Открыть wsrv",
+
+  "temperature": "Случайность",
+  "temperatureInfo": "При увеличении значения (temperature) ответы становятся более случайными",
+  "top_p": "Верхняя вероятность выборки",
+  "top_pInfo": "(top_p) аналогично случайности, но не следует изменять вместе с температурой",
+  "presence_penalty": "Свежесть темы",
+  "presence_penaltyInfo": "При увеличении значения (presence_penalty) увеличивается вероятность расширения на новые темы",
+  "frequency_penalty": "Частотное наказание",
+  "frequency_penaltyInfo": "При увеличении значения (frequency_penalty) увеличивается вероятность уменьшения повторяющихся слов"
+  ,"tts_voice": "Голос TTS",
+  "typing": "Печать",
+  "authErro": "Ошибка авторизации",
+  "authBt": "Пожалуйста, введите пароль доступа к авторизации снова",
+  
+  "micWhisper": "Распознавание шепота",
+  "micAsr": "Мгновенное распознавание",
+  "micRec": "Начать запись, пожалуйста, говорите! Запись автоматически остановится, если 2 секунды не будет звука.",
+  "micRecEnd": "Запись завершена"
+  },
+  "mjset": {
+    "server": "Сервер",
+    "about": "О нас",
+    "model": "Модель",
+    "sysname": "Искусственный интеллект для рисования"
+  },
+  "mjtab": {
+    "chat": "Чат",
+    "draw": "Рисование",
+    "drawinfo": "Рисование с использованием искусственного интеллекта Midjourney",
+    "gallery": "Галерея",
+    "galleryInfo": "Моя галерея"
+  },
+  "mjchat": {
+    "loading": "Идет загрузка изображения",
+    "openurl": "Открыть ссылку напрямую",
+    "failReason": "Причина сбоя:",
+    "reload": "Перезагрузить",
+    "progress": "Прогресс:",
+    "wait": "Задача отправлена, подождите...",
+    "reroll": "Перерисовать",
+    "wait2": "Задача {id} отправлена, подождите",
+    "redrawEditing": "Редактирование части изображения",
+    "face": "Сменить лицо",
+    "blend": "Смешивание изображений",
+    "draw": "Рисовать",
+    "submiting": "Отправка...",
+    "submit": "Отправить",
+    "wait3": "Пожалуйста, не закрывайте! Создание изображения...",
+    "success": "Сохранено успешно",
+    "successTitle": "Успешно",
+    "modlePlaceholder": "Пользовательские модели (разделять пробелами, необязательно)",
+    "myModle": "Мои модели",
+    "historyCnt": "Количество контекста",
+    "historyToken": "Больше контекста делает память точнее, но расходует больше квоты",
+    "historyTCnt": "Количество ответов",
+    "historyTCntInfo": "Больше ответов, возможно, потребуется больше квоты",
+    "role": "Настройка роли",
+    "rolePlaceholder": "Дайте своему разговору уникальную роль, необязательно",
+    "loading2": "Загрузка...",
+    "loadmore": "Загрузить еще",
+    "nofind": "Не удалось найти",
+    "nofind2": "Связанные материалы отсутствуют. Попробуйте следующее",
+    "success2": "Переключение успешно!",
+    "modelChange": "Смена модели",
+    "search": "Поиск",
+    "searchPlaceholder": "Имя и описание GPTs",
+    "attr": "Прикрепленные файлы",
+    "noproduct": "В галерее пока нет ваших работ",
+    "myGallery": "Моя галерея",
+    "yourHead": "Ваш аватар",
+    "your2Head": "Изображение знаменитости",
+    "tipInfo": "Примечание:<li>1 Изображение должно содержать лицо, иначе не будет изображения</li> <li>2 «Изображение знаменитости» можно сначала создать с помощью mj</li> <li>3 «Изображение знаменитости» может быть аниме</li> <li>4 «Ваш аватар» рекомендуется использовать фотографию лица</li>",
+    "placeInput": "Пожалуйста, введите подсказку!",
+    "more5sb": "Максимум 5 изображений для загрузки",
+    "exSuccess": "Экспорт успешен... Проверьте загрузки",
+    "downloadSave": "aiрисование.txt",
+    "noproducet": "Пока нет готовых работ",
+    "imgBili": "Соотношение изображения",
+    "imagEx": "Экспорт ссылок изображений",
+    "prompt": "Подсказка",
+    "imgCYes": "Содержит макет",
+    "imgCUpload": "Загрузить свой макет",
+    "imgCInfo": "Информация о макете:<br/> 1. Макет позволяет использовать свои изображения для создания рисунков MJ<br/> 2. Можно использовать несколько макетов, максимум 5, размер каждого изображения не более 1 Мб<br/>",
+    "imgCadd": "+Добавить",
+    "del": "Удалить",
+    "img2text": "Изображение в текст",
+    "img2textinfo": "Не знаете, как написать подсказку? Попробуйте изображение в тексте! <br/> Передайте изображение, получите подсказку",
+    "traning": "Перевод...",
+    "imgcreate": "Создание изображения",
+    "imginfo": "Дополнительные параметры: <li>1 --no Игнорировать --no car, чтобы не рисовать машины на изображении</li><li>2 --seed Получить сначала сид --seed 123456</li><li>3 --chaos 10 Смешивание (диапазон: 0-100)</li><li>4 --tile Фрагментирование</li>",
+    "tStyle": "Стиль",
+    "tView": "Вид",
+    "tShot": "Угол обзора",
+    "tLight": "Освещение",
+    "tQuality": "Качество изображения",
+    "tStyles": "Уровень искусства",
+    "tVersion": "Версия модели",
+    "dalleInfo": "Инструкции: <li>1 DALL-E - это модель от OpenAI для создания изображений</li><li>2 Изображения от OpenAI имеют ограниченный срок годности, сделайте резервную копию</li><li>3 Внимание: изображения размером 1790 пикселей стоят вдвое дороже</li>",
+    "version": "Версия",
+    "size": "Размер",
+    "blendInfo": "Инструкции: <li>1 Смешивание как минимум двух изображений</li><li>2 Максимальное количество загружаемых изображений - 6</li>",
+    "blendStart": "Начать смешивание",
+    "no2add": "Не добавляйте одно и то же изображение повторно",
+    "add2more": "Добавьте как минимум два изображения",
+    "no1m": "Размер изображения не должен превышать 1 Мб",
+    "imgExt": "Формат изображения должен быть jpg, gif, png, jpeg"
+  
+  }
 }

+ 187 - 0
src/locales/vi-VN.ts

@@ -91,4 +91,191 @@ export default {
     onlineImportWarning: 'Lưu ý: Vui lòng kiểm tra nguồn tệp JSON!',
     downloadError: 'Vui lòng kiểm tra trạng thái mạng và tính hợp lệ của tệp JSON',
   },
+  "mj": {
+    "setOpen": "OpenAI liên quan",
+    "setOpenPlaceholder": "Phải chứa http(s)://",
+    "setOpenUrl": "Địa chỉ giao diện OpenAI",
+    "setOpenKeyPlaceholder": "Sử dụng khóa OpenAI tùy chỉnh để bỏ qua hạn chế mật khẩu",
+    "setMj": "Midjourney liên quan",
+    "setMjUrl": "Địa chỉ giao diện Midjourney:",
+    "setMjKeyPlaceholder": "Sử dụng Khóa Api Secret tùy chỉnh để bỏ qua hạn chế mật khẩu",
+    "setUploader": "Tải lên liên quan",
+    "setUploaderUrl": "Địa chỉ tải lên:",
+    "setBtSave": "Lưu",
+    "setBtBack": "Khôi phục mặc định",
+
+    "redraw": "Vẽ Lại Phần",
+    "fail1": "Anh/chị đừng vội, đang tải đó.",
+    "success1": "Ảnh đã làm mới thành công!",
+    "high_variation": "Biến Động Mạnh",
+    "low_variation": "Biến Động Nhẹ",
+    "p15": "Thu Phóng 1.5 lần",
+    "p20": "Thu Phóng 2 lần",
+    "p100": "Bình thường",
+    "retry": "Thử Lại Phân Tích",
+    "pan_left": "Phân Tích Lại Bên Trái",
+    "pan_right": "Phân Tích Lại Bên Phải",
+    "pan_up": "Phân Tích Lại Lên",
+    "pan_down": "Phân Tích Lại Xuống",
+    "up2": "Độ Phân Giải Cao 2 lần",
+    "up4": "Độ Phân Giải Cao 4 lần",
+
+    "thinking": "Đang suy nghĩ...",
+    "noReUpload": "Không thể tải lên lại",
+    "uploading": "Đang tải lên...",
+    "uploadSuccess": "Tải lên thành công",
+    "uploadFail": "Tải lên thất bại:",
+    "upPdf": "<span>Tải lên hình ảnh hoặc tệp đính kèm<br/>Bạn có thể tải lên hình ảnh, PDF, EXCEL và các tài liệu khác</span><p>Hỗ trợ kéo và thả</p>",
+    "upImg": "<span><b>Tải lên hình ảnh</b><br/>Sẽ tự động gọi mô hình gpt-4-vision-preview<br>Chú ý: Có thể áp dụng phí ảnh bổ sung<br/>Định dạng: jpeg, jpg, png, gif</span><p>Hỗ trợ kéo và thả</p> <p class=\"pt-2\"><b>Tải lên MP3 MP4</b> <br>Sẽ tự động gọi mô hình whisper-1<br>Định dạng: mp3, mp4, mpeg, mpga, m4a, wav, webm</p>",
+    "clearAll": "Xóa tất cả các tham số",
+    "czoom": "Tùy chỉnh",
+    "customTitle": "Tùy chỉnh zoom",
+    "zoominfo": "Sửa giá trị zoom, khoảng từ 1.0 đến 2.0, mặc định được đặt là 1.8",
+
+    "modleSuccess": "Tải mô hình thành công",
+    "setingSuccess": "Thiết lập thành công",
+
+    "tokenInfo1": "Còn lại Tokens = Độ dài mô hình - Thiết lập vai trò - Bối cảnh (Lịch sử cuộc trò chuyện) - Số phản hồi - Đầu vào hiện tại",
+    "tokenInfo2": "Để trống thiết lập vai trò và hệ thống sẽ cung cấp một giá trị mặc định.",
+    "noSuppertModel": "Làm mới, hiện tại mô hình này không được hỗ trợ!",
+    "failOcr": "Nhận dạng thất bại",
+    "remain": "Còn:",
+
+    "totalUsage": "Tổng số tiền đăng ký",
+    "disableGpt4": "GPT4 đã tắt",
+    "setTextInfo": "Lỗi Khóa API OpenAI, nhấp vào đây để thử lại" ,
+
+    "attr1": "Đính",
+    "ulink": "Liên kết Ảnh gốc",
+    "copyFail": "Sao chép thất bại",
+    "tts": "Văn bản thành Tiếng nói (TTS)",
+    "fail": "Đã xảy ra lỗi",
+    "noSupperChrom": "Trình duyệt không được hỗ trợ!",
+    "lang": "Âm thanh",
+    "ttsLoading": "Đang chuyển đổi thành tiếng nói...",
+    "ttsSuccess": "Chuyển đổi thành công",
+    "micIng": "Đang ghi âm, nói điều gì đó...",
+    "mStart": "Bắt đầu",
+    "mPause": "Tạm dừng",
+    "mGoon": "Tiếp tục",
+    "mRecord": "Ghi lại",
+    "mPlay": "Phát",
+    "mCanel": "Hủy",
+    "mSent": "Gửi",
+    "findVersion": "Phát hiện phiên bản cập nhật",
+    "yesLastVersion": "Đã là phiên bản mới nhất",
+    "infoStar": "Dự án này được mở nguồn tại <a class=\"text-blue-600 dark:text-blue-500\" href=\"https://github.com/Dooy/chatgpt-web-midjourney-proxy\" target=\"_blank\">GitHub</a>, miễn phí và dựa trên giấy phép MIT mà không có bất kỳ hình thức thanh toán nào! </p><p>Nếu bạn thấy dự án này hữu ích, hãy cho nó một sao trên GitHub, cảm ơn bạn!",
+    "setBtSaveChat": "Chỉ lưu trò chuyện",
+    "setBtSaveSys": "Lưu vào hệ thống",
+
+    "wsrvClose": "Đóng wsrv",
+    "wsrvOpen": "Mở wsrv",
+    
+    "temperature": "Ngẫu nhiên",
+    "temperatureInfo": "Khi giá trị (temperature) tăng, các phản hồi trở nên ngẫu nhiên hơn",
+    "top_p": "Lấy Mẫu Xác Suất Cao Nhất",
+    "top_pInfo": "(top_p) tương tự như ngẫu nhiên nhưng không nên thay đổi cùng với nhiệt độ",
+    "presence_penalty": "Sự Tươi Mới của Chủ đề",
+    "presence_penaltyInfo": "Khi giá trị (presence_penalty) tăng, có khả năng mở rộng đến các chủ đề mới cao hơn",
+    "frequency_penalty": "Hình Phạt Tần Số",
+    "frequency_penaltyInfo": "Khi giá trị (frequency_penalty) tăng, có khả năng giảm sự lặp lại của các từ nhiều hơn"
+   ,"tts_voice": "Nhân vật giọng TTS",
+    "typing": "Đang nhập",
+    "authErro": "Xác thực không thành công",
+    "authBt": "Vui lòng nhập lại mật khẩu truy cập xác thực",
+
+    "micWhisper": "Nhận diện giọng nói thì thầm",
+    "micAsr": "Nhận diện ngay lập tức",
+    "micRec": "Bắt đầu ghi âm, vui lòng nói chuyện! Sẽ tự động dừng nếu không có âm thanh trong vòng 2 giây.",
+    "micRecEnd": "Ghi âm đã kết thúc"
+
+  },
+  "mjset": {
+    "server": "Máy chủ",
+    "about": "Về",
+    "model": "Mô hình",
+    "sysname": "Trí tuệ nhân tạo vẽ"
+  },
+  "mjtab": {
+    "chat": "nói",
+    "draw": "Vẽ",
+    "drawinfo": "Vẽ trí tuệ nhân tạo Midjourney",
+    "gallery": "sách",
+    "galleryInfo": "Phòng trưng bày của tôi"
+  },
+  "mjchat": {
+    "loading": "Đang tải hình ảnh",
+    "openurl": "Mở liên kết trực tiếp",
+    "failReason": "Lý do thất bại:",
+    "reload": "Tải lại",
+    "progress": "Tiến triển:",
+    "wait": "Nhiệm vụ đã được gửi, vui lòng đợi...",
+    "reroll": "Vẽ lại",
+    "wait2": "Nhiệm vụ {id} đã được gửi, vui lòng đợi",
+    "redrawEditing": "Chỉnh sửa vẽ lại",
+    "face": "Thay đổi khuôn mặt",
+    "blend": "Trộn ảnh",
+    "draw": "Vẽ",
+    "submiting": "Đang gửi",
+    "submit": "Gửi",
+    "wait3": "Vui lòng không tắt! Đang tạo ảnh...",
+    "success": "Lưu thành công",
+    "successTitle": "Thành công",
+    "modlePlaceholder": "Mô hình tùy chỉnh, cách nhau bằng khoảng trắng, không bắt buộc",
+    "myModle": "Mô hình tùy chỉnh của tôi",
+    "historyCnt": "Số ngữ cảnh",
+    "historyToken": "Số ngữ cảnh nhiều hơn sẽ làm cho bộ nhớ chính xác hơn, nhưng sẽ tiêu tốn nhiều chi phí hơn",
+    "historyTCnt": "Số câu trả lời",
+    "historyTCntInfo": "Số câu trả lời càng nhiều, khả năng tiêu tốn chi phí càng cao",
+    "role": "Đặt vai trò",
+    "rolePlaceholder": "Đặt một vai trò riêng cho cuộc trò chuyện của bạn, không bắt buộc",
+    "loading2": "Đang tải...",
+    "loadmore": "Tải thêm",
+    "nofind": "Không thể tìm thấy",
+    "nofind2": "Nội dung liên quan không tìm thấy, bạn có thể thử những nội dung sau đây",
+    "success2": "Chuyển đổi thành công!",
+    "modelChange": "Thay đổi mô hình",
+    "search": "Tìm kiếm",
+    "searchPlaceholder": "Tên GPTs, giới thiệu",
+    "attr": "Phụ kiện",
+    "noproduct": "Phòng trưng bày chưa có sản phẩm của bạn",
+    "myGallery": "Phòng trưng bày của tôi",
+    "yourHead": "Ảnh đại diện của bạn",
+    "your2Head": "Ảnh ngôi sao",
+    "tipInfo": "Chú ý: <li>1 Hình ảnh phải chứa khuôn mặt, nếu không sẽ không xuất hiện ảnh</li> <li>2 'Ảnh ngôi sao' có thể sử dụng MJ để vẽ trước</li> <li>3 'Ảnh ngôi sao' có thể là hình ảnh hoạt hình</li> <li>4 'Ảnh đại diện của bạn' nên sử dụng ảnh cá nhân 1 inch</li>",
+    "placeInput": "Vui lòng điền từ gợi ý!",
+    "more5sb": "Tối đa tải lên 5 ảnh",
+    "exSuccess": "Xuất thành công... Vui lòng kiểm tra thanh tải về",
+    "downloadSave": "ai vẽ.txt",
+    "noproducet": "Hiện chưa có sản phẩm chín thành",
+    "imgBili": "Tỉ lệ ảnh",
+    "imagEx": "Xuất liên kết hình ảnh tác phẩm",
+    "prompt": "Từ gợi ý",
+    "imgCYes": "Có ảnh nền",
+    "imgCUpload": "Tự tải ảnh nền",
+    "imgCInfo": "Thông tin ảnh nền: <br/> 1. Ảnh nền có thể sử dụng ảnh cá nhân của bạn làm cơ sở để MJ vẽ hình <br/> 2. Có thể sử dụng nhiều ảnh nền, tối đa 5 ảnh, mỗi ảnh không quá 1M",
+    "imgCadd": "+ Thêm",
+    "del": "Xóa",
+    "img2text": "Hình thành văn",
+    "img2textinfo": "Không biết cách đặt từ gợi ý? Hãy thử Hình thành văn! <br/> Gửi hình ảnh, nhận từ gợi ý",
+    "traning": "Đang dịch...",
+    "imgcreate": "Tạo ảnh",
+    "imginfo": "Tham số khác: <li>1 --no Bỏ qua --no, không xuất hiện xe trong hình ảnh </li><li>2 --seed Có thể lấy hạt giống trước --seed 123456 </li> <li>3 --chaos 10 Hỗn loạn (phạm vi: 0-100)</li> <li>4 --tile Fragmentation </li>",
+    "tStyle": "Phong cách",
+    "tView": "Góc nhìn",
+    "tShot": "Góc chụp người",
+    "tLight": "Ánh sáng",
+    "tQuality": "Chất lượng hình ảnh",
+    "tStyles": "Mức độ nghệ thuật",
+    "tVersion": "Phiên bản mô hình",
+    "dalleInfo": "Chú ý: <li>1 Dall-e là mô hình vẽ hình do OpenAI cung cấp</li>  <li>2 Hình ảnh của OpenAI có thời gian sử dụng, hãy sao lưu đúng cách</li>   <li>3 Lưu ý: Giá của hình ảnh 1790px là gấp đôi</li>",
+    "version": "Phiên bản",
+    "size": "Kích thước",
+    "blendInfo": "Chú ý: <li>1 Kết hợp ít nhất 2 hình ảnh</li> <li>2 Tối đa có thể tải lên 6 hình ảnh</li>",
+    "blendStart": "Bắt đầu kết hợp",
+    "no2add": "Vui lòng không thêm hình ảnh giống nhau",
+    "add2more": "Vui lòng thêm ít nhất hai hình ảnh",
+    "no1m": "Kích thước hình ảnh không quá 1M",
+    "imgExt": "Chỉ hỗ trợ định dạng jpg, gif, png, jpeg cho hình ảnh"
+    }
 }

+ 7 - 1
src/locales/zh-CN.ts

@@ -280,6 +280,12 @@ export default {
     ,typing:'正在输入'
 
     ,authErro:'授权失败'
-    ,authBt:'请重新授权'
+    ,authBt:'请重新输入授权访问密码'
+
+    ,micWhisper:'Whisper语音识别'
+    ,micAsr:'即时识别'
+    ,micRec:'开始录音,请说话!2秒内无声音将自动关闭'
+    ,micRecEnd:'录音已结束'
+    
   }
 }

+ 181 - 0
src/locales/zh-TW.ts

@@ -93,4 +93,185 @@ export default {
     onlineImportWarning: '注意:請檢查 JSON 檔案來源!',
     downloadError: '請檢查網路狀態與 JSON 檔案有效性',
   },
+
+  "mj": {
+    "setOpen": "OpenAI 相關",
+    "setOpenPlaceholder": "必須包含 http(s)://",
+    "setOpenUrl": "OpenAI接口地址",
+    "setOpenKeyPlaceholder": "使用自定義 OpenAI Key 繞過密碼訪問限制",
+    "setMj": "Midjourney 相關",
+    "setMjUrl": "Midjourney接口地址:",
+    "setMjKeyPlaceholder": "使用自定義 Api Secret 繞過密碼訪問限制",
+    "setUploader": "上傳相關",
+    "setUploaderUrl": "上傳地址:",
+    "setBtSave": "保存",
+    "setBtBack": "恢復默認",
+    "redraw": "局部重繪",
+    "fail1": "客官不要太急嘛,正在加載呢",
+    "success1": "圖片刷新成功!",
+    "high_variation": "強變化",
+    "low_variation": "弱變化",
+    "p15": "變焦1.5倍",
+    "p20": "變焦2倍",
+    "p100": "方正",
+    "retry": "重分析",
+    "pan_left": "向左",
+    "pan_right": "向右",
+    "pan_up": "向上",
+    "pan_down": "向下",
+    "up2": "高清2倍",
+    "up4": "高清4倍",
+    
+    "thinking": "思考中...",
+    "noReUpload": "不能重複上傳",
+    "uploading": "上傳中...",
+    "uploadSuccess": "上傳成功",
+    "uploadFail": "上傳失敗:",
+    "upPdf": "<span>上傳圖片或附件<br/>可以上傳圖片、PDF、EXCEL等文檔</span><p>支持拖放</p>",
+    "upImg": "<span><b>上傳圖片</b><br/>將自動調用 gpt-4-vision-preview 模型<br>注意:可能會有額外的圖片費用<br/>格式:jpeg、jpg、png、gif</span><p>支持拖放</p> <p class=\"pt-2\"><b>上傳MP3 MP4</b> <br>將自動直接調用 whisper-1 模型<br>格式:mp3、mp4、mpeg、mpga、m4a、wav、webm</p>",
+    "clearAll": "清參數",
+    "czoom": "自定義",
+    "customTitle": "自定義變焦",
+    "zoominfo": "修改zoom值,範圍在 1.0 到 2.0,默认设置為1.8",
+
+  "modleSuccess": "模型成功載入",
+    "setingSuccess": "設定成功",
+
+    "tokenInfo1": "剩餘Tokens = 模型長度 - 角色設定 - 上下文(對話歷史) - 回覆數 - 目前輸入",
+    "tokenInfo2": "保持角色設定為空,系統將提供默認值。",
+    "noSuppertModel": "刷新,目前不受此模型支持!",
+    "failOcr": "識別失敗",
+    "remain": "餘:",
+
+    "totalUsage": "訂閱總額",
+    "disableGpt4": "已禁用GPT4",
+    "setTextInfo": "OpenAI API Key 錯誤,點擊這裡重新",
+
+    "attr1": "附",
+    "ulink": "原圖鏈接",
+    "copyFail": "複製失敗",
+    "tts": "文字轉語音",
+    "fail": "發生錯誤",
+    "noSupperChrom": "瀏覽器不支援!",
+    "lang": "語音",
+    "ttsLoading": "轉換中...",
+    "ttsSuccess": "轉換成功",
+    "micIng": "錄音中,請說些什麼...",
+    "mStart": "開始",
+    "mPause": "暫停",
+    "mGoon": "繼續",
+    "mRecord": "重新錄製",
+    "mPlay": "播放",
+    "mCanel": "取消",
+    "mSent": "發送",
+    "findVersion": "發現更新版本",
+    "yesLastVersion": "已是最新版本",
+    "infoStar": "此專案在 <a class=\"text-blue-600 dark:text-blue-500\" href=\"https://github.com/Dooy/chatgpt-web-midjourney-proxy\" target=\"_blank\">GitHub</a> 上以 MIT 協議開源,免費且沒有任何付費行為! </p><p>如果你覺得這個專案對你有幫助,請在 GitHub 上給它一顆星,謝謝!",
+    "setBtSaveChat": "僅保存對話",
+    "setBtSaveSys": "保存至系統",
+    "wsrvClose": "關閉 wsrv",
+    "wsrvOpen": "開啟 wsrv",
+    "temperature": "隨機性",
+    "temperatureInfo": "隨著 (temperature) 值的增加,回覆變得更隨機",
+    "top_p": "概率抽樣",
+    "top_pInfo": "(top_p) 類似於隨機性,但不應與溫度一同更改",
+    "presence_penalty": "話題新鮮度",
+    "presence_penaltyInfo": "隨著 (presence_penalty) 值的增加,擴展到新話題的機會更高",
+    "frequency_penalty": "頻率懲罰",
+    "frequency_penaltyInfo": "隨著 (frequency_penalty) 值的增加,降低重複字詞的可能性更高",
+    "tts_voice": "TTS 語音角色",
+    "typing": "正在輸入",
+    "authErro": "授權失敗",
+    "authBt": "請重新輸入授權訪問密碼",
+    "micWhisper": "Whisper語音識別",
+    "micAsr": "即時識別",
+    "micRec": "開始錄音,請說話!2秒內無聲音將自動關閉",
+    "micRecEnd": "錄音已結束"
+  },
+  "mjset": {
+    "server": "服務端",
+    "about": "關於",
+    "model": "模型",
+    "sysname": "AI繪圖"
+  },
+  "mjtab": {
+    "chat": "對話",
+    "draw": "繪畫",
+    "drawinfo": "AI繪畫 Midjourney引擎",
+    "gallery": "畫廊",
+    "galleryInfo": "我的畫廊"
+  },
+  "mjchat": {
+    "loading": "正在載入圖片",
+    "openurl": "直接打開鏈接",
+    "failReason": "失敗原因:",
+    "reload": "重新獲取",
+    "progress": "進度:",
+    "wait": "任務已經提交請等待...",
+    "reroll": "重繪",
+    "wait2": "任務 {id} 已經提交請等待",
+    "redrawEditing": "局部重繪編輯",
+    "face": "換臉",
+    "blend": "混圖",
+    "draw": "繪圖",
+    "submiting": "提交中",
+    "submit": "提交",
+    "wait3": "請勿關閉! 圖片生成中...",
+    "success": "保存成功",
+    "successTitle": "成功",
+    "modlePlaceholder": "自定義模型多個用空格隔開,不是必須",
+    "myModle": "自定義模型",
+    "historyCnt": "上下文數量",
+    "historyToken": "更多的上下文會使記憶更精確,但會消耗更多的額度",
+    "historyTCnt": "回復數",
+    "historyTCntInfo": "回復數越大 ,越有可能消耗更多的額度",
+    "role": "角色設定",
+    "rolePlaceholder": "給你的會話設置一個專屬的角色,不是必須",
+    "loading2": "正在加載...",
+    "loadmore": "加載更多",
+    "nofind": "未能找到",
+    "nofind2": "相關內容, 你可嘗試以下內容",
+    "success2": "切換成功!",
+    "modelChange": "模型切換",
+    "search": "搜索",
+    "searchPlaceholder": "GPTs名字、介紹",
+    "attr": "附件",
+    "noproduct": "畫廊還沒有您的作品",
+    "myGallery": "我的畫廊",
+    "yourHead": "你的頭像",
+    "your2Head": "明星圖",
+    "tipInfo": "說明:<li>1 圖片都必須包含臉,否則出不來圖</li> <li>2 “明星圖”可以先用mj繪畫製作出來</li> <li>3 “明星圖”其實動漫圖也行</li> <li>4 “你的頭像”建議用一寸個人照</li>",
+    "placeInput": "請填寫提示詞!",
+    "more5sb": "最多上傳5張圖片",
+    "exSuccess": "導出成功... 請看下載欄",
+    "downloadSave": "ai繪畫.txt",
+    "noproducet": "暫時沒成熟作品",
+    "imgBili": "圖片比例",
+    "imagEx": "作品圖片鏈接導出",
+    "prompt": "提示詞",
+    "imgCYes": "含有墊圖",
+    "imgCUpload": "自傳墊圖",
+    "imgCInfo": "墊圖說明:<br/> 1.墊圖可使用自己的圖片作為基礎,讓MJ來繪圖<br/> 2.可以使用多張墊圖 最多5張, 單張圖片不超過1M<br/>",
+    "imgCadd": "+添加",
+    "del": "刪除",
+    "img2text": "圖生文",
+    "img2textinfo": "不知如何寫提示詞?用圖生文試試!<br/>提交圖片,出提示詞",
+    "traning": "翻譯中...",
+    "imgcreate": "生成圖片",
+    "imginfo": "其他參數:  <li>1 --no 忽略 --no car 圖中不出現車 </li><li>2 --seed 可先獲取種子 --seed 123456 </li> <li>3 --chaos 10 混合(範圍:0-100)</li> <li>4 --tile 碎片化 </li> ",
+    "tStyle": "風格",
+    "tView": "視角",
+    "tShot": "人物鏡頭",
+    "tLight": "燈光",
+    "tQuality": "畫質",
+    "tStyles": "藝術程度",
+    "version": "版本",
+    "size": "尺寸",
+    "blendInfo": "說明: <li>1 合成至少2張圖片</li> <li>2 最多可傳6張圖</li> ",
+    "blendStart": "開始合成",
+    "no2add": "請勿重複添加圖片",
+    "add2more": "請添加兩張以上圖片",
+    "no1m": "圖片大小不能超過1M",
+    "imgExt": "圖片僅支持jpg,gif,png,jpeg格式"
+  }
 }

+ 62 - 5
src/views/mj/aiGptInput.vue

@@ -3,16 +3,19 @@ import { ref ,computed,watch } from 'vue';
 import { useBasicLayout } from '@/hooks/useBasicLayout'
 import { t } from '@/locales'
 import { NInput ,NButton,useMessage,NImage,NTooltip, NAutoComplete,NTag
-,NPopover,NModal  } from 'naive-ui'
+,NPopover,NModal, NDropdown  } from 'naive-ui'
 import { SvgIcon } from '@/components/common';
-import { canVisionModel, GptUploader, mlog, upImg,getFileFromClipboard,isFileMp3,countTokens, checkDisableGpt4} from '@/api';
+import { canVisionModel, GptUploader, mlog, upImg,getFileFromClipboard,isFileMp3
+    ,countTokens, checkDisableGpt4, Recognition } from '@/api';
 import { gptConfigStore, homeStore,useChatStore } from '@/store';
 import { AutoCompleteOptions } from 'naive-ui/es/auto-complete/src/interface';
 import { RenderLabel } from 'naive-ui/es/_internal/select-menu/src/interface';
 import { useRoute } from 'vue-router' 
 import aiModel from "@/views/mj/aiModel.vue"
 import AiMic from './aiMic.vue';
+import { useIconRender } from '@/hooks/useIconRender'
 
+const { iconRender } = useIconRender()
 //import FormData from 'form-data'
 const route = useRoute() 
 const chatStore = useChatStore()
@@ -20,7 +23,8 @@ const chatStore = useChatStore()
 const emit = defineEmits(['update:modelValue'])
 const props = defineProps<{ modelValue:string,disabled?:boolean,searchOptions?:AutoCompleteOptions,renderOption?: RenderLabel }>();
 const fsRef = ref()
-const st = ref<{fileBase64:string[],isLoad:number,isShow:boolean,showMic:boolean}>({fileBase64:[],isLoad:0,isShow:false,showMic:false })
+const st = ref<{fileBase64:string[],isLoad:number,isShow:boolean,showMic:boolean,micStart:boolean}>({fileBase64:[],isLoad:0
+    ,isShow:false,showMic:false , micStart:false})
 const { isMobile } = useBasicLayout()
 const placeholder = computed(() => {
   if (isMobile.value)
@@ -82,6 +86,10 @@ funt();
             //  const formData = new FormData( ); 
             // formData.append('file', file);
             // formData.append('model', 'whisper-1'); 
+
+            // GptUploader('/v1/audio/transcriptions',formData).then(r=>{
+            //     mlog('语音识别成功', r ); 
+            // }).catch(e=>ms.error('上传失败:'+ ( e.message?? JSON.stringify(e)) ));
             homeStore.setMyData({act:'gpt.whisper', actData:{ file , prompt:'whisper' } });
             return ;
 
@@ -162,6 +170,43 @@ const sendMic= (e:any )=>{
     homeStore.setMyData({act:'gpt.whisper', actData:{ file , prompt:'whisper',duration : e.stat?.duration } });
 }
 
+//语音识别ASR
+const goASR=()=>{
+    const olod = mvalue.value;
+    const rec= new Recognition();
+    let rz= '';
+    rec.setListener( (r:string)=>{
+        //mlog('result ', r  );
+        rz= r ; 
+        mvalue.value= r;
+        st.value.micStart= true 
+    }).setOnEnd( ( )=>{
+        //mlog('rec end');
+        mvalue.value= olod+rz;
+        ms.info( t('mj.micRecEnd'));
+        st.value.micStart= false 
+    }).setOpt({
+        timeOut:2000,
+        onStart:()=>{ ms.info( t('mj.micRec')); st.value.micStart= true },
+    }).start();
+}
+
+const drOption=[
+    {
+        label:  t('mj.micWhisper'),
+        key: "whisper",
+        icon:iconRender({ icon: 'ri:openai-fill' }),
+    },{
+        label:  t('mj.micAsr'),
+        icon:iconRender({ icon: 'ri:chrome-line' }),
+        key: "asr"
+    }
+]
+const handleSelectASR = ( key: string | number )=>{ 
+    if(key=='asr')    goASR(); 
+    if(key=='whisper')   st.value.showMic=true; 
+}
+
 </script>
 <template>
 <div v-if="st.showMic" class="  myinputs flex justify-center items-center" >
@@ -226,9 +271,21 @@ const sendMic= (e:any )=>{
                     </div>
                     </n-tooltip>
                 </div>
-                <div  class=" relative; w-[22px]">
+                <!-- <div  class=" relative; w-[22px]">
                     <SvgIcon icon="bi:mic"  class="absolute bottom-[10px] left-[30px] cursor-pointer" @click="st.showMic=true"></SvgIcon>
-                </div>
+                </div> -->
+                <n-dropdown trigger="hover" :options="drOption" @select="handleSelectASR">
+                    <div  class=" relative; w-[22px]">
+                        <div class="absolute bottom-[14px] left-[31px]" v-if="st.micStart">
+                            <span class="relative flex h-3 w-3" >
+                                <span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-red-500 opacity-75"></span>
+                                <span class="relative inline-flex rounded-full h-3 w-3 bg-red-400"></span>
+                            </span>
+                        </div>
+                        <!-- <SvgIcon icon="bi:mic"  class="absolute bottom-[10px] left-[55px] cursor-pointer" @click="goASR()"></SvgIcon> -->
+                        <SvgIcon icon="bi:mic"  class="absolute bottom-[10px] left-[30px] cursor-pointer"></SvgIcon>
+                    </div>
+                </n-dropdown>
                 
             </template>
             <template #suffix>

+ 1 - 1
src/views/mj/aiModel.vue

@@ -192,6 +192,6 @@ onMounted(() => {
  <section class=" text-right flex justify-end space-x-2"  >
     <NButton   @click="reSet()">{{ $t('mj.setBtBack') }}</NButton>
     <NButton type="primary" @click="saveChat">{{ $t('mj.setBtSaveChat') }}</NButton>
-    <!-- <NButton type="primary" @click="save">{{ $t('mj.setBtSaveSys') }}</NButton> -->
+    <NButton type="primary" @click="save">{{ $t('mj.setBtSaveSys') }}</NButton>
  </section>
 </template>