Browse Source

添加多语言功能

master
[yxf] 4 weeks ago
parent
commit
48d50f25d9
  1. 23
      im-uniapp/common/date.js
  2. 21
      im-uniapp/components/chat-message-item/chat-message-item.vue
  3. 43
      im-uniapp/main.js
  4. 445
      im-uniapp/pages/chat/chat-box.vue
  5. 46
      im-uniapp/static/i18n/ara.json
  6. 46
      im-uniapp/static/i18n/de.json
  7. 47
      im-uniapp/static/i18n/en.json
  8. 46
      im-uniapp/static/i18n/fra.json
  9. 46
      im-uniapp/static/i18n/jp.json
  10. 46
      im-uniapp/static/i18n/kor.json
  11. 46
      im-uniapp/static/i18n/pt.json
  12. 46
      im-uniapp/static/i18n/ru.json
  13. 46
      im-uniapp/static/i18n/vie.json
  14. 47
      im-uniapp/static/i18n/zh.json

23
im-uniapp/common/date.js

@ -1,19 +1,35 @@
// 先获取全局 i18n(uniapp 通用写法)
const getI18n = () => {
if (typeof getApp !== 'undefined') {
return getApp()?.$i18n || null
}
return null
}
// 多语言文本获取
const t = (key) => {
const i18n = getI18n()
if (!i18n) return key
return i18n.t(key)
}
let toTimeText = (timeStamp, simple) => { let toTimeText = (timeStamp, simple) => {
var dateTime = new Date(timeStamp) var dateTime = new Date(timeStamp)
var currentTime = Date.parse(new Date()); //当前时间 var currentTime = Date.parse(new Date()); //当前时间
var timeDiff = currentTime - dateTime; //与当前时间误差 var timeDiff = currentTime - dateTime; //与当前时间误差
var timeText = ''; var timeText = '';
if (timeDiff <= 60000) { //一分钟内 if (timeDiff <= 60000) { //一分钟内
timeText = 'Just now'; timeText = t('common.justNow');
} else if (timeDiff > 60000 && timeDiff < 3600000) { } else if (timeDiff > 60000 && timeDiff < 3600000) {
//1小时内 //1小时内
timeText = Math.floor(timeDiff / 60000) + ' minutes ago'; const min = Math.floor(timeDiff / 60000)
timeText = `${min} ${t('common.minutesAgo')}`;
} else if (timeDiff >= 3600000 && timeDiff < 86400000 && !isYestday(dateTime)) { } else if (timeDiff >= 3600000 && timeDiff < 86400000 && !isYestday(dateTime)) {
//今日 //今日
timeText = formatDateTime(dateTime).substr(11, 5); timeText = formatDateTime(dateTime).substr(11, 5);
} else if (isYestday(dateTime)) { } else if (isYestday(dateTime)) {
//昨天 //昨天
timeText = 'Yesterday ' + formatDateTime(dateTime).substr(11, 5); timeText = t('common.yesterday') + ' ' + formatDateTime(dateTime).substr(11, 5);
} else if (isYear(dateTime)) { } else if (isYear(dateTime)) {
//今年 //今年
timeText = formatDateTime(dateTime).substr(5, simple ? 5 : 14); timeText = formatDateTime(dateTime).substr(5, simple ? 5 : 14);
@ -54,6 +70,7 @@ let formatDateTime = (date) => {
minute = minute < 10 ? ('0' + minute) : minute minute = minute < 10 ? ('0' + minute) : minute
var second = dateObject.getSeconds() var second = dateObject.getSeconds()
second = second < 10 ? ('0' + second) : second second = second < 10 ? ('0' + second) : second
// 修复:这里少了一个 + 号
return y + '/' + m + '/' + d + ' ' + h + ':' + minute + ':' + second return y + '/' + m + '/' + d + ' ' + h + ':' + minute + ':' + second
} }

21
im-uniapp/components/chat-message-item/chat-message-item.vue

@ -17,10 +17,8 @@
<view class="message-content-wrapper"> <view class="message-content-wrapper">
<view v-if="msgInfo.type == $enums.MESSAGE_TYPE.TEXT"> <view v-if="msgInfo.type == $enums.MESSAGE_TYPE.TEXT">
<long-press-menu :items="menuItems" @select="onSelectMenu"> <long-press-menu :items="menuItems" @select="onSelectMenu">
<!-- up-parse支持点击a标签,但是不支持显示emo表情也不支持换行 -->
<up-parse v-if="$url.containUrl(msgInfo.content)&&!$emo.containEmoji(msgInfo.content)" <up-parse v-if="$url.containUrl(msgInfo.content)&&!$emo.containEmoji(msgInfo.content)"
class="message-text" :showImgMenu="false" :content="nodesText"></up-parse> class="message-text" :showImgMenu="false" :content="nodesText"></up-parse>
<!-- rich-text支持显示emo表情以及消息换行但是不支持点击a标签 -->
<rich-text v-else class="message-text" :nodes="nodesText"></rich-text> <rich-text v-else class="message-text" :nodes="nodesText"></rich-text>
</long-press-menu> </long-press-menu>
</view> </view>
@ -72,12 +70,12 @@
class="send-fail iconfont icon-warning-circle-fill"></view> class="send-fail iconfont icon-warning-circle-fill"></view>
</view> </view>
<view class="message-status" v-if="!isAction && msgInfo.selfSend && !msgInfo.groupId"> <view class="message-status" v-if="!isAction && msgInfo.selfSend && !msgInfo.groupId">
<text class="chat-readed" v-if="msgInfo.status == $enums.MESSAGE_STATUS.READED">Read</text> <text class="chat-readed" v-if="msgInfo.status == $enums.MESSAGE_STATUS.READED">{{ $t('chat.read') }}</text>
<text class="chat-unread" v-else>Unread</text> <text class="chat-unread" v-else>{{ $t('chat.unread') }}</text>
</view> </view>
<view class="chat-receipt" v-if="msgInfo.receipt" @click="onShowReadedBox"> <view class="chat-receipt" v-if="msgInfo.receipt" @click="onShowReadedBox">
<text v-if="msgInfo.receiptOk" class="tool-icon iconfont icon-ok"></text> <text v-if="msgInfo.receiptOk" class="tool-icon iconfont icon-ok"></text>
<text v-else>{{ msgInfo.readedCount }}人已读</text> <text v-else>{{ $t('chat.readedCount', { count: msgInfo.readedCount }) }}</text>
</view> </view>
</view> </view>
</view> </view>
@ -121,20 +119,17 @@ export default {
this.$emit("resend", this.msgInfo); this.$emit("resend", this.msgInfo);
}, },
onPlayAudio() { onPlayAudio() {
//
if (!this.innerAudioContext) { if (!this.innerAudioContext) {
this.innerAudioContext = uni.createInnerAudioContext(); this.innerAudioContext = uni.createInnerAudioContext();
let url = this.contentData.url; let url = this.contentData.url;
this.innerAudioContext.src = url; this.innerAudioContext.src = url;
this.innerAudioContext.onEnded((e) => { this.innerAudioContext.onEnded((e) => {
console.log('停止')
this.audioPlayState = "STOP" this.audioPlayState = "STOP"
this.emit(); this.emit();
}) })
this.innerAudioContext.onError((e) => { this.innerAudioContext.onError((e) => {
this.audioPlayState = "STOP" this.audioPlayState = "STOP"
console.log("播放音频出错"); console.log("播放音频出错");
console.log(e)
this.emit(); this.emit();
}); });
} }
@ -199,27 +194,27 @@ export default {
if (this.msgInfo.type == this.$enums.MESSAGE_TYPE.TEXT) { if (this.msgInfo.type == this.$enums.MESSAGE_TYPE.TEXT) {
items.push({ items.push({
key: 'COPY', key: 'COPY',
name: '复制', name: this.$t('chat.copy'),
icon: 'bars' icon: 'bars'
}); });
} }
if (this.msgInfo.selfSend && this.msgInfo.id > 0) { if (this.msgInfo.selfSend && this.msgInfo.id > 0) {
items.push({ items.push({
key: 'RECALL', key: 'RECALL',
name: '撤回', name: this.$t('chat.recall'),
icon: 'refreshempty' icon: 'refreshempty'
}); });
} }
items.push({ items.push({
key: 'DELETE', key: 'DELETE',
name: '删除', name: this.$t('chat.delete'),
icon: 'trash', icon: 'trash',
color: '#e64e4e' color: '#e64e4e'
}); });
if (this.msgInfo.type == this.$enums.MESSAGE_TYPE.FILE) { if (this.msgInfo.type == this.$enums.MESSAGE_TYPE.FILE) {
items.push({ items.push({
key: 'DOWNLOAD', key: 'DOWNLOAD',
name: '下载并打开', name: this.$t('chat.download'),
icon: 'download' icon: 'download'
}); });
} }
@ -245,7 +240,6 @@ export default {
return this.$emo.transform(text, 'emoji-normal') return this.$emo.transform(text, 'emoji-normal')
}, },
imageStyle() { imageStyle() {
console.log(uni.getSystemInfo())
let maxSize = uni.getSystemInfoSync().windowWidth * 0.6; let maxSize = uni.getSystemInfoSync().windowWidth * 0.6;
let minSize = uni.getSystemInfoSync().windowWidth * 0.2; let minSize = uni.getSystemInfoSync().windowWidth * 0.2;
let width = this.contentData.width; let width = this.contentData.width;
@ -256,7 +250,6 @@ export default {
let h = Math.max(width > height ? ratio * maxSize : maxSize, minSize); let h = Math.max(width > height ? ratio * maxSize : maxSize, minSize);
return `width: ${w}px;height:${h}px;` return `width: ${w}px;height:${h}px;`
} else { } else {
//
return `max-width: ${maxSize}px;min-width:100px;max-height: ${maxSize}px;min-height:100px;` return `max-width: ${maxSize}px;min-width:100px;max-height: ${maxSize}px;min-height:100px;`
} }
} }

43
im-uniapp/main.js

@ -10,6 +10,27 @@ import * as messageType from './common/messageType';
import { createSSRApp } from 'vue' import { createSSRApp } from 'vue'
import uviewPlus from '@/uni_modules/uview-plus' import uviewPlus from '@/uni_modules/uview-plus'
import * as pinia from 'pinia'; import * as pinia from 'pinia';
// i18n
import { createI18n } from 'vue-i18n'
import zh from './static/i18n/zh.json';
import en from './static/i18n/en.json'
import jp from './static/i18n/jp.json';
import kor from './static/i18n/kor.json'
import vie from './static/i18n/vie.json';
import ru from './static/i18n/ru.json'
import de from './static/i18n/de.json'
import fra from './static/i18n/fra.json'
import pt from './static/i18n/pt.json'
import ara from './static/i18n/ara.json'
const savedLang = uni.getStorageSync('app_language') || 'zh'
const i18n = createI18n({
legacy: false,
locale: savedLang,
messages: { zh, en, jp, kor, vie, ru, de, fra, pt, ara }
})
import useChatStore from '@/store/chatStore.js' import useChatStore from '@/store/chatStore.js'
import useFriendStore from '@/store/friendStore.js' import useFriendStore from '@/store/friendStore.js'
import useGroupStore from '@/store/groupStore.js' import useGroupStore from '@/store/groupStore.js'
@ -19,28 +40,30 @@ import barGroup from '@/components/bar/bar-group'
import arrowBar from '@/components/bar/arrow-bar' import arrowBar from '@/components/bar/arrow-bar'
import btnBar from '@/components/bar/btn-bar' import btnBar from '@/components/bar/btn-bar'
import switchBar from '@/components/bar/switch-bar' import switchBar from '@/components/bar/switch-bar'
// #ifdef H5 // #ifdef H5
import * as recorder from './common/recorder-h5'; import * as recorder from './common/recorder-h5';
import ImageResize from "quill-image-resize-mp"; import ImageResize from "quill-image-resize-mp";
import Quill from "quill"; import Quill from "quill";
// 以下组件用于兼容部分手机聊天边框无法输入的问题
window.Quill = Quill; window.Quill = Quill;
window.ImageResize = { default: ImageResize }; window.ImageResize = { default: ImageResize };
// 调试器
// import VConsole from 'vconsole'
// new VConsole();
// #endif // #endif
// #ifndef H5 // #ifndef H5
import * as recorder from './common/recorder-app'; import * as recorder from './common/recorder-app';
// #endif // #endif
export function createApp() { export function createApp() {
const app = createSSRApp(App) const app = createSSRApp(App)
app.use(uviewPlus); app.use(uviewPlus);
app.use(pinia.createPinia()); app.use(pinia.createPinia());
app.use(i18n);
app.component('bar-group', barGroup); app.component('bar-group', barGroup);
app.component('arrow-bar', arrowBar); app.component('arrow-bar', arrowBar);
app.component('btn-bar', btnBar); app.component('btn-bar', btnBar);
app.component('switch-bar', switchBar); app.component('switch-bar', switchBar);
app.config.globalProperties.$http = request; app.config.globalProperties.$http = request;
app.config.globalProperties.$wsApi = socketApi; app.config.globalProperties.$wsApi = socketApi;
app.config.globalProperties.$msgType = messageType; app.config.globalProperties.$msgType = messageType;
@ -50,7 +73,11 @@ export function createApp() {
app.config.globalProperties.$enums = enums; app.config.globalProperties.$enums = enums;
app.config.globalProperties.$date = date; app.config.globalProperties.$date = date;
app.config.globalProperties.$rc = recorder; app.config.globalProperties.$rc = recorder;
// 初始化时再挂载store对象 app.config.globalProperties.$t = i18n.global.t;
// 把 i18n 挂到全局,让页面能访问到
app.config.globalProperties.$i18n = i18n.global;
app.config.globalProperties.$mountStore = () => { app.config.globalProperties.$mountStore = () => {
app.config.globalProperties.chatStore = useChatStore(); app.config.globalProperties.chatStore = useChatStore();
app.config.globalProperties.friendStore = useFriendStore(); app.config.globalProperties.friendStore = useFriendStore();
@ -58,8 +85,6 @@ export function createApp() {
app.config.globalProperties.configStore = useConfigStore(); app.config.globalProperties.configStore = useConfigStore();
app.config.globalProperties.userStore = useUserStore(); app.config.globalProperties.userStore = useUserStore();
} }
return {
app, return { app, pinia }
pinia
}
} }

445
im-uniapp/pages/chat/chat-box.vue

File diff suppressed because it is too large

46
im-uniapp/static/i18n/ara.json

@ -0,0 +1,46 @@
{
"chat": {
"copy": "نسخ",
"recall": "تراجع",
"delete": "حذف",
"download": "تحميل",
"read": "مقروء",
"unread": "غير مقروء",
"readedCount": "{count} شخص قرأ",
"guessWantAsk": "ربما تريد السؤال",
"typing": "يكتب...",
"autoReplyFailed": "فشل الرد التلقائي",
"receiptMessage": "【مقروء】",
"inputPlaceholder": "اكتب رسالة",
"send": "إرسال",
"newMessages": "{count} رسائل جديدة",
"cannotSendBlank": "لا ترسل رسالة فارغة",
"copySuccess": "تم النسخ",
"copyFailed": "فشل النسخ",
"downloadFailed": "فشل التحميل",
"deleteMessage": "حذف الرسالة",
"confirmDelete": "حذف هذه الرسالة؟",
"recallMessage": "تراجع الرسالة",
"confirmRecall": "تراجع هذه الرسالة؟",
"deleteSuccess": "تم الحذف",
"resendNotSupported": "غير مدعوم",
"sendFailed": "فشل الإرسال",
"uploadFailed": "فشل الرفع",
"userBanned": "مكتوم: {reason}",
"groupBanned": "مكتوم في المجموعة: {reason}",
"atAll": "الكل",
"file": "ملف",
"album": "ألبوم",
"camera": "كاميرا",
"noFriends": "لا أصدقاء",
"title": "دردشة"
},
"common": {
"confirm": "موافق",
"cancel": "إلغاء",
"loading": "جاري التحميل...",
"justNow": "الآن",
"minutesAgo": "دقائق مضت",
"yesterday": "أمس"
}
}

46
im-uniapp/static/i18n/de.json

@ -0,0 +1,46 @@
{
"chat": {
"copy": "Kopieren",
"recall": "Zurücknehmen",
"delete": "Löschen",
"download": "Herunterladen",
"read": "Gelesen",
"unread": "Ungelesen",
"readedCount": "{count} Personen gelesen",
"guessWantAsk": "Vielleicht fragen Sie",
"typing": "Schreibt...",
"autoReplyFailed": "Automatische Antwort fehlgeschlagen",
"receiptMessage": "【Gelesen】",
"inputPlaceholder": "Nachricht eingeben",
"send": "Senden",
"newMessages": "{count} neue Nachrichten",
"cannotSendBlank": "Keine leeren Nachrichten",
"copySuccess": "Kopiert",
"copyFailed": "Kopieren fehlgeschlagen",
"downloadFailed": "Download fehlgeschlagen",
"deleteMessage": "Nachricht löschen",
"confirmDelete": "Diese Nachricht löschen?",
"recallMessage": "Nachricht zurücknehmen",
"confirmRecall": "Diese Nachricht zurücknehmen?",
"deleteSuccess": "Gelöscht",
"resendNotSupported": "Nicht unterstützt",
"sendFailed": "Senden fehlgeschlagen",
"uploadFailed": "Hochladen fehlgeschlagen",
"userBanned": "Stumm geschaltet: {reason}",
"groupBanned": "In Gruppe stumm: {reason}",
"atAll": "Alle",
"file": "Datei",
"album": "Album",
"camera": "Kamera",
"noFriends": "Keine Freunde",
"title": "Chat"
},
"common": {
"confirm": "OK",
"cancel": "Abbrechen",
"loading": "Lädt...",
"justNow": "Gerade eben",
"minutesAgo": "Min. vor",
"yesterday": "Gestern"
}
}

47
im-uniapp/static/i18n/en.json

@ -0,0 +1,47 @@
{
"chat": {
"copy": "Copy",
"recall": "Recall",
"delete": "Delete",
"download": "Download & Open",
"read": "Read",
"unread": "Unread",
"readedCount": "{count} read",
"guessWantAsk": "You may want to ask",
"typing": "typing...",
"autoReplyFailed": "Auto reply failed",
"receiptMessage": "[Read Receipt]",
"inputPlaceholder": "Type a message",
"send": "Send",
"newMessages": "{count} new messages",
"cannotSendBlank": "Cannot send empty message",
"copySuccess": "Copied",
"copyFailed": "Copy failed",
"downloadFailed": "Download failed",
"deleteMessage": "Delete Message",
"confirmDelete": "Sure to delete?",
"recallMessage": "Recall Message",
"confirmRecall": "Sure to recall?",
"deleteSuccess": "Deleted",
"resendNotSupported": "Resend not supported",
"sendFailed": "Send failed",
"uploadFailed": "Upload failed",
"userBanned": "You are banned: {reason}",
"groupBanned": "You are banned in group: {reason}",
"atAll": "All",
"file": "File",
"album": "Album",
"camera": "Camera",
"noFriends": "No friends",
"title": "Chat"
},
"common": {
"confirm": "OK",
"cancel": "Cancel",
"loading": "Loading...",
"justNow": "Just now",
"minutesAgo": "minutes ago",
"yesterday": "Yesterday"
}
}

46
im-uniapp/static/i18n/fra.json

@ -0,0 +1,46 @@
{
"chat": {
"copy": "Copier",
"recall": "Rappeler",
"delete": "Supprimer",
"download": "Télécharger",
"read": "Lu",
"unread": "Non lu",
"readedCount": "{count} personnes lues",
"guessWantAsk": "Vous pouvez demander",
"typing": "En train d'écrire...",
"autoReplyFailed": "Échec de la réponse auto",
"receiptMessage": "【Lu】",
"inputPlaceholder": "Entrez un message",
"send": "Envoyer",
"newMessages": "{count} nouveaux messages",
"cannotSendBlank": "Pas de message vide",
"copySuccess": "Copié",
"copyFailed": "Échec de la copie",
"downloadFailed": "Échec du téléchargement",
"deleteMessage": "Supprimer le message",
"confirmDelete": "Supprimer ce message?",
"recallMessage": "Rappeler le message",
"confirmRecall": "Rappeler ce message?",
"deleteSuccess": "Supprimé",
"resendNotSupported": "Non supporté",
"sendFailed": "Échec de l'envoi",
"uploadFailed": "Échec du téléversement",
"userBanned": "Muet: {reason}",
"groupBanned": "Groupe muet: {reason}",
"atAll": "Tous",
"file": "Fichier",
"album": "Album",
"camera": "Caméra",
"noFriends": "Pas d'amis",
"title": "Discussion"
},
"common": {
"confirm": "OK",
"cancel": "Annuler",
"loading": "Chargement...",
"justNow": "À l'instant",
"minutesAgo": "min avant",
"yesterday": "Hier"
}
}

46
im-uniapp/static/i18n/jp.json

@ -0,0 +1,46 @@
{
"chat": {
"copy": "コピー",
"recall": "取り消し",
"delete": "削除",
"download": "ダウンロードして開く",
"read": "既読",
"unread": "未読",
"readedCount": "{count}人が既読",
"guessWantAsk": "質問したいこと",
"typing": "入力中...",
"autoReplyFailed": "自動返信失敗",
"receiptMessage": "【既読確認】",
"inputPlaceholder": "メッセージを入力",
"send": "送信",
"newMessages": "{count}件の新着メッセージ",
"cannotSendBlank": "空白メッセージは送信できません",
"copySuccess": "コピー成功",
"copyFailed": "コピー失敗",
"downloadFailed": "ダウンロード失敗",
"deleteMessage": "メッセージ削除",
"confirmDelete": "このメッセージを削除しますか?",
"recallMessage": "メッセージ取り消し",
"confirmRecall": "このメッセージを取り消しますか?",
"deleteSuccess": "削除成功",
"resendNotSupported": "再送信に対応していません",
"sendFailed": "送信失敗",
"uploadFailed": "アップロード失敗",
"userBanned": "発言禁止されています: {reason}",
"groupBanned": "グループで発言禁止: {reason}",
"atAll": "全員",
"file": "ファイル",
"album": "アルバム",
"camera": "カメラ",
"noFriends": "友達なし",
"title": "チャット"
},
"common": {
"confirm": "確定",
"cancel": "キャンセル",
"loading": "読み込み中...",
"justNow": "たった今",
"minutesAgo": "分前",
"yesterday": "昨日"
}
}

46
im-uniapp/static/i18n/kor.json

@ -0,0 +1,46 @@
{
"chat": {
"copy": "복사",
"recall": "취소",
"delete": "삭제",
"download": "다운로드 및 열기",
"read": "읽음",
"unread": "안읽음",
"readedCount": "{count}명 읽음",
"guessWantAsk": "물어보고 싶은 것",
"typing": "입력 중...",
"autoReplyFailed": "자동 회신 실패",
"receiptMessage": "【읽음 확인】",
"inputPlaceholder": "메시지 입력",
"send": "전송",
"newMessages": "{count}개의 새 메시지",
"cannotSendBlank": "빈 메시지는 보낼 수 없습니다",
"copySuccess": "복사 성공",
"copyFailed": "복사 실패",
"downloadFailed": "다운로드 실패",
"deleteMessage": "메시지 삭제",
"confirmDelete": "이 메시지를 삭제할까요?",
"recallMessage": "메시지 취소",
"confirmRecall": "이 메시지를 취소할까요?",
"deleteSuccess": "삭제 성공",
"resendNotSupported": "재전송 지원 안됨",
"sendFailed": "전송 실패",
"uploadFailed": "업로드 실패",
"userBanned": "채팅 금지: {reason}",
"groupBanned": "그룹 채팅 금지: {reason}",
"atAll": "모두",
"file": "파일",
"album": "앨범",
"camera": "카메라",
"noFriends": "친구 없음",
"title": "채팅"
},
"common": {
"confirm": "확인",
"cancel": "취소",
"loading": "로딩 중...",
"justNow": "방금",
"minutesAgo": "분 전",
"yesterday": "어제"
}
}

46
im-uniapp/static/i18n/pt.json

@ -0,0 +1,46 @@
{
"chat": {
"copy": "Copiar",
"recall": "Retirar",
"delete": "Excluir",
"download": "Baixar",
"read": "Lido",
"unread": "Não lido",
"readedCount": "{count} pessoas leram",
"guessWantAsk": "Talvez queira perguntar",
"typing": "Digitando...",
"autoReplyFailed": "Resposta automática falhou",
"receiptMessage": "【Lido】",
"inputPlaceholder": "Digite uma mensagem",
"send": "Enviar",
"newMessages": "{count} novas mensagens",
"cannotSendBlank": "Não envie mensagem vazia",
"copySuccess": "Copiado",
"copyFailed": "Falha ao copiar",
"downloadFailed": "Falha no download",
"deleteMessage": "Excluir mensagem",
"confirmDelete": "Excluir esta mensagem?",
"recallMessage": "Retirar mensagem",
"confirmRecall": "Retirar esta mensagem?",
"deleteSuccess": "Excluído",
"resendNotSupported": "Não suportado",
"sendFailed": "Falha no envio",
"uploadFailed": "Falha no upload",
"userBanned": "Silenciado: {reason}",
"groupBanned": "Grupo silenciado: {reason}",
"atAll": "Todos",
"file": "Arquivo",
"album": "Álbum",
"camera": "Câmera",
"noFriends": "Sem amigos",
"title": "Chat"
},
"common": {
"confirm": "OK",
"cancel": "Cancelar",
"loading": "Carregando...",
"justNow": "Agora mesmo",
"minutesAgo": "min atrás",
"yesterday": "Ontem"
}
}

46
im-uniapp/static/i18n/ru.json

@ -0,0 +1,46 @@
{
"chat": {
"copy": "Копировать",
"recall": "Отозвать",
"delete": "Удалить",
"download": "Скачать и открыть",
"read": "Прочитано",
"unread": "Не прочитано",
"readedCount": "{count} человек прочитало",
"guessWantAsk": "Возможно, вы хотите спросить",
"typing": "Печатает...",
"autoReplyFailed": "Автоответ не удался",
"receiptMessage": "【Прочитано】",
"inputPlaceholder": "Введите сообщение",
"send": "Отправить",
"newMessages": "{count} новых сообщений",
"cannotSendBlank": "Нельзя отправить пустое",
"copySuccess": "Скопировано",
"copyFailed": "Ошибка копирования",
"downloadFailed": "Ошибка загрузки",
"deleteMessage": "Удалить сообщение",
"confirmDelete": "Удалить это сообщение?",
"recallMessage": "Отозвать сообщение",
"confirmRecall": "Отозвать это сообщение?",
"deleteSuccess": "Удалено",
"resendNotSupported": "Не поддерживается",
"sendFailed": "Ошибка отправки",
"uploadFailed": "Ошибка загрузки",
"userBanned": "Вы заблокированы: {reason}",
"groupBanned": "В группе блокировка: {reason}",
"atAll": "Все",
"file": "Файл",
"album": "Альбом",
"camera": "Камера",
"noFriends": "Нет друзей",
"title": "Чат"
},
"common": {
"confirm": "ОК",
"cancel": "Отмена",
"loading": "Загрузка...",
"justNow": "Только что",
"minutesAgo": "мин назад",
"yesterday": "Вчера"
}
}

46
im-uniapp/static/i18n/vie.json

@ -0,0 +1,46 @@
{
"chat": {
"copy": "Sao chép",
"recall": "Thu hồi",
"delete": "Xóa",
"download": "Tải & mở",
"read": "Đã đọc",
"unread": "Chưa đọc",
"readedCount": "{count} người đã đọc",
"guessWantAsk": "Bạn có thể hỏi",
"typing": "Đang nhập...",
"autoReplyFailed": "Trả lời tự động thất bại",
"receiptMessage": "【Đã đọc】",
"inputPlaceholder": "Nhập tin nhắn",
"send": "Gửi",
"newMessages": "{count} tin nhắn mới",
"cannotSendBlank": "Không gửi tin rỗng",
"copySuccess": "Sao chép thành công",
"copyFailed": "Sao chép thất bại",
"downloadFailed": "Tải thất bại",
"deleteMessage": "Xóa tin nhắn",
"confirmDelete": "Xóa tin này?",
"recallMessage": "Thu hồi tin nhắn",
"confirmRecall": "Thu hồi tin này?",
"deleteSuccess": "Xóa thành công",
"resendNotSupported": "Không hỗ trợ gửi lại",
"sendFailed": "Gửi thất bại",
"uploadFailed": "Tải lên thất bại",
"userBanned": "Bạn bị cấm nói: {reason}",
"groupBanned": "Bị cấm trong nhóm: {reason}",
"atAll": "Tất cả",
"file": "Tệp",
"album": "Thư viện",
"camera": "Máy ảnh",
"noFriends": "Chưa có bạn bè",
"title": "Trò chuyện"
},
"common": {
"confirm": "Xác nhận",
"cancel": "Hủy",
"loading": "Đang tải...",
"justNow": "Vừa xong",
"minutesAgo": "phút trước",
"yesterday": "Hôm qua"
}
}

47
im-uniapp/static/i18n/zh.json

@ -0,0 +1,47 @@
{
"chat": {
"copy": "复制",
"recall": "撤回",
"delete": "删除",
"download": "下载并打开",
"read": "已读",
"unread": "未读",
"readedCount": "{count}人已读",
"guessWantAsk": "你可能想问",
"typing": "正在输入...",
"autoReplyFailed": "自动回复失败",
"receiptMessage": "【已读回执】",
"inputPlaceholder": "请输入消息",
"send": "发送",
"newMessages": "{count}条新消息",
"cannotSendBlank": "不能发送空消息",
"copySuccess": "复制成功",
"copyFailed": "复制失败",
"downloadFailed": "下载失败",
"deleteMessage": "删除消息",
"confirmDelete": "确定删除此消息?",
"recallMessage": "撤回消息",
"confirmRecall": "确定撤回此消息?",
"deleteSuccess": "删除成功",
"resendNotSupported": "暂不支持重发该类型消息",
"sendFailed": "发送失败",
"uploadFailed": "上传失败",
"userBanned": "你已被禁言,原因:{reason}",
"groupBanned": "你已被群禁言,原因:{reason}",
"atAll": "所有人",
"file": "文件",
"album": "相册",
"camera": "相机",
"noFriends": "暂无好友",
"title": "聊天"
},
"common": {
"confirm": "确定",
"cancel": "取消",
"loading": "加载中...",
"justNow": "刚刚",
"minutesAgo": "分钟前",
"yesterday": "昨天"
}
}
Loading…
Cancel
Save