155 lines
5.0 KiB
JavaScript
155 lines
5.0 KiB
JavaScript
"use strict";
|
|
const common_vendor = require("../../../../common/vendor.js");
|
|
const _Translator = class _Translator {
|
|
constructor() {
|
|
this.isUseCache = true;
|
|
this.translationCache = /* @__PURE__ */ new Map();
|
|
}
|
|
static getInstance() {
|
|
if (!_Translator.instance) {
|
|
_Translator.instance = new _Translator();
|
|
}
|
|
return _Translator.instance;
|
|
}
|
|
async get(message) {
|
|
if (this.isUseCache) {
|
|
const cache = this.translationCache.get(message.ID);
|
|
if (cache !== void 0) {
|
|
return cache;
|
|
}
|
|
}
|
|
const currentMessage = common_vendor.Jt.getMessageModel(message.ID);
|
|
if (!currentMessage) {
|
|
return [];
|
|
}
|
|
const { text } = currentMessage.getMessageContent() || {};
|
|
const textList = [];
|
|
const splittingList = await this.getNickList(currentMessage);
|
|
for (let i = 0; i < text.length; ++i) {
|
|
const item = text[i];
|
|
if (item.name === "img") {
|
|
textList.push({ type: "face", value: item.src });
|
|
continue;
|
|
}
|
|
const { transSplitingList, atNickList } = this.getSplitResult(item.text, splittingList);
|
|
for (let j = 0; j < transSplitingList.length; ++j) {
|
|
textList.push({ type: "text", value: transSplitingList[j] });
|
|
if (j < atNickList.length) {
|
|
textList.push({ type: "mention", value: atNickList[j] });
|
|
}
|
|
}
|
|
}
|
|
const needTranslateTextIndex = [];
|
|
const needTranslateText = textList.filter((item, index) => {
|
|
if (item.type === "text" && item.value.trim() !== "") {
|
|
needTranslateTextIndex.push(index);
|
|
return true;
|
|
}
|
|
return false;
|
|
}).map((item) => item.value);
|
|
if (needTranslateText.length === 0) {
|
|
this.translationCache.set(currentMessage.ID, textList);
|
|
return textList;
|
|
}
|
|
const translationResult = await this.getTranslationStandard(needTranslateText);
|
|
translationResult.forEach((item, index) => {
|
|
textList[needTranslateTextIndex[index]].value = item;
|
|
});
|
|
this.translationCache.set(currentMessage.ID, textList);
|
|
return textList;
|
|
}
|
|
/**
|
|
* Clears the translation cache.
|
|
*/
|
|
clear() {
|
|
this.translationCache.clear();
|
|
}
|
|
disableCache() {
|
|
this.isUseCache = false;
|
|
}
|
|
enableCache() {
|
|
this.isUseCache = true;
|
|
}
|
|
getTranslationStandard(originTextList) {
|
|
return new Promise((resolve, reject) => {
|
|
common_vendor.Qt.translateText({
|
|
sourceTextList: originTextList,
|
|
sourceLanguage: "auto"
|
|
}).then((response) => {
|
|
const {
|
|
data: { translatedTextList }
|
|
} = response;
|
|
resolve(translatedTextList);
|
|
}).catch((error) => {
|
|
reject(error);
|
|
});
|
|
});
|
|
}
|
|
/**
|
|
* the nick list is used to split the text by @ + {nick or userID}
|
|
* @param message
|
|
* @returns e.g. ['@james', '@john']
|
|
*/
|
|
async getNickList(message) {
|
|
const splittingList = [];
|
|
const { atUserList = [] } = message;
|
|
const atAllID = common_vendor.qt.TYPES.MSG_AT_ALL;
|
|
if (atUserList.includes(atAllID)) {
|
|
splittingList.push(`@${common_vendor.Wt.t("TUIChat.所有人")}`);
|
|
}
|
|
if (atUserList.length > 0) {
|
|
const { data: userProfileList } = await common_vendor.Zt.getUserProfile({ userIDList: atUserList });
|
|
userProfileList.forEach((user) => {
|
|
const atNick = `@${user.nick || user.userID}`;
|
|
splittingList.push(atNick);
|
|
});
|
|
}
|
|
return [...new Set(splittingList)];
|
|
}
|
|
/**
|
|
* Splits the given text into substrings based on the provided splitString array.
|
|
*
|
|
* @param {string} text - The text to be split.
|
|
* @param {string[]} splitString - The array of strings to split the text by.
|
|
* @return {{ transSplitingList: string[]; atNickList: string[] }} - An object containing two arrays:
|
|
* - transSplitingList: An array of substrings extracted from the text.
|
|
* - atNickList: An array of split strings that were found in the text.
|
|
*/
|
|
getSplitResult(text, splitString) {
|
|
let searchStartPos = 0;
|
|
const transSplitingList = [];
|
|
const atNickList = [];
|
|
while (searchStartPos < text.length) {
|
|
const nextAtCharPos = text.indexOf("@", searchStartPos);
|
|
if (nextAtCharPos === -1) {
|
|
transSplitingList.push(text.substring(searchStartPos));
|
|
break;
|
|
}
|
|
let found = false;
|
|
for (let i = 0; i < splitString.length; ++i) {
|
|
const pos = text.indexOf(splitString[i], nextAtCharPos);
|
|
if (pos !== -1 && pos === nextAtCharPos) {
|
|
transSplitingList.push(text.substring(searchStartPos, pos));
|
|
atNickList.push(splitString[i]);
|
|
searchStartPos = pos + splitString[i].length;
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!found) {
|
|
transSplitingList.push(text.substring(searchStartPos));
|
|
break;
|
|
}
|
|
}
|
|
return {
|
|
transSplitingList,
|
|
atNickList
|
|
};
|
|
}
|
|
};
|
|
_Translator.instance = void 0;
|
|
let Translator = _Translator;
|
|
const translator = Translator.getInstance();
|
|
exports.translator = translator;
|
|
//# sourceMappingURL=../../../../../.sourcemap/mp-weixin/TUIKit/components/TUIChat/utils/translation.js.map
|