当前位置:   article > 正文

DiscordApp 翻译插件_discord翻译插件

discord翻译插件

2023-04-14更新:

 

 

替换key: "xxxxxxxxxxxxxxxxxxxx xxxxxxxxxx",申请百度翻译api key 

百度翻译开放平台

---------------------------------------------------------------------------------------------------------------------------

使用方法:

1.下载BetterDiscord-Windows.exe_discord翻译插件-互联网文档类资源-CSDN下载中的exe,点击安装。

BetterDiscord-Windows v1.2.1.exe - 蓝奏云 (lanzouw.com)

ps:官方地址:https://github.com/BetterDiscord/Installer/releases/latest/download/BetterDiscord-Windows.exe

2.在discord设置中会出现BD(BETTERDISCORD)的菜单,选择插件(Plugins)菜单,会有打开插件文件夹(Open Plugin Folder)

3.新建一个文本文件,重名为Translator.plugin.js,复制下面的js代码,保存

plugins.zip - 蓝奏云 (lanzouw.com)

ps:官方Translator.plugin.js地址:Downloader (mwittrien.github.io)

4.启动翻译插件,重启Discord,在频道输入框就会出现翻译按钮

 

ps:选择在发送之前翻译您的信息就可以输入中文直接发送英文

 5,在频道信息中右键点击会出现翻译信息的按钮,就可以翻译英文了

ps:百度翻译api 错误 

54004账户余额不足请前往管理控制台为账户充值

  1. /**
  2. * @name Translator
  3. * @author DevilBro
  4. * @authorId 278543574059057154
  5. * @version 2.5.5
  6. * @description Allows you to translate Messages and your outgoing Messages within Discord
  7. * @invite Jx3TjNS
  8. * @donate https://www.paypal.me/MircoWittrien
  9. * @patreon https://www.patreon.com/MircoWittrien
  10. * @website https://mwittrien.github.io/
  11. * @source https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/Translator/
  12. * @updateUrl https://mwittrien.github.io/BetterDiscordAddons/Plugins/Translator/Translator.plugin.js
  13. */
  14. module.exports = (_ => {
  15. const changeLog = {
  16. };
  17. return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class {
  18. constructor (meta) {for (let key in meta) this[key] = meta[key];}
  19. getName () {return this.name;}
  20. getAuthor () {return this.author;}
  21. getVersion () {return this.version;}
  22. getDescription () {return `The Library Plugin needed for ${this.name} is missing. Open the Plugin Settings to download it. \n\n${this.description}`;}
  23. downloadLibrary () {
  24. require("request").get("https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js", (e, r, b) => {
  25. if (!e && b && r.statusCode == 200) require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0BDFDB.plugin.js"), b, _ => BdApi.showToast("Finished downloading BDFDB Library", {type: "success"}));
  26. else BdApi.alert("Error", "Could not download BDFDB Library Plugin. Try again later or download it manually from GitHub: https://mwittrien.github.io/downloader/?library");
  27. });
  28. }
  29. load () {
  30. if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue: []});
  31. if (!window.BDFDB_Global.downloadModal) {
  32. window.BDFDB_Global.downloadModal = true;
  33. BdApi.showConfirmationModal("Library Missing", `The Library Plugin needed for ${this.name} is missing. Please click "Download Now" to install it.`, {
  34. confirmText: "Download Now",
  35. cancelText: "Cancel",
  36. onCancel: _ => {delete window.BDFDB_Global.downloadModal;},
  37. onConfirm: _ => {
  38. delete window.BDFDB_Global.downloadModal;
  39. this.downloadLibrary();
  40. }
  41. });
  42. }
  43. if (!window.BDFDB_Global.pluginQueue.includes(this.name)) window.BDFDB_Global.pluginQueue.push(this.name);
  44. }
  45. start () {this.load();}
  46. stop () {}
  47. getSettingsPanel () {
  48. let template = document.createElement("template");
  49. template.innerHTML = `<div style="color: var(--header-primary); font-size: 16px; font-weight: 300; white-space: pre; line-height: 22px;">The Library Plugin needed for ${this.name} is missing.\nPlease click <a style="font-weight: 500;">Download Now</a> to install it.</div>`;
  50. template.content.firstElementChild.querySelector("a").addEventListener("click", this.downloadLibrary);
  51. return template.content.firstElementChild;
  52. }
  53. } : (([Plugin, BDFDB]) => {
  54. var _this;
  55. const translateIconGeneral = `<svg name="Translate" width="24" height="24" viewBox="0 0 24 24"><mask/><path fill="currentColor" mask="url(#translateIconMask)" d="M 4 2 C 2.9005593 2 2 2.9005593 2 4 L 2 17 C 2 18.10035 2.9005593 19 4 19 L 11 19 L 12 22 L 20 22 C 21.10035 22 22 21.099441 22 20 L 22 7 C 22 5.9005592 21.099441 5 20 5 L 10.880859 5 L 10 2 L 4 2 z M 11.173828 6 L 20 6 C 20.550175 6 21 6.4498249 21 7 L 21 20 C 21 20.550175 20.550176 21 20 21 L 13 21 L 15 19 L 14.185547 16.236328 L 15.105469 15.314453 L 17.791016 18 L 18.521484 17.269531 L 15.814453 14.583984 C 16.714739 13.54911 17.414914 12.335023 17.730469 11.080078 L 19 11.080078 L 19 10.039062 L 15.365234 10.039062 L 15.365234 9 L 14.324219 9 L 14.324219 10.039062 L 12.365234 10.039062 L 11.173828 6 z M 7.1660156 6.4160156 C 8.2063466 6.4160156 9.1501519 6.7857022 9.9003906 7.4804688 L 9.9648438 7.5449219 L 8.7441406 8.7246094 L 8.6855469 8.6699219 C 8.4009108 8.3998362 7.9053417 8.0859375 7.1660156 8.0859375 C 5.8555986 8.0859375 4.7890625 9.1708897 4.7890625 10.505859 C 4.7890625 11.84083 5.8555986 12.925781 7.1660156 12.925781 C 8.5364516 12.925781 9.1309647 12.050485 9.2910156 11.464844 L 7.0800781 11.464844 L 7.0800781 9.9160156 L 11.03125 9.9160156 L 11.044922 9.984375 C 11.084932 10.194442 11.099609 10.379777 11.099609 10.589844 C 11.094109 12.945139 9.4803883 14.583984 7.1660156 14.583984 C 4.9107525 14.583984 3.0800781 12.749807 3.0800781 10.5 C 3.0800781 8.2501934 4.9162088 6.4160156 7.1660156 6.4160156 z M 12.675781 11.074219 L 16.669922 11.074219 C 16.669922 11.074219 16.330807 12.390095 15.111328 13.810547 C 14.576613 13.195806 14.206233 12.595386 13.970703 12.115234 L 12.980469 12.115234 L 12.675781 11.074219 z M 13.201172 12.884766 C 13.535824 13.484957 13.940482 14.059272 14.390625 14.583984 L 13.855469 15.115234 L 13.201172 12.884766 z"/><extra/></svg>`;
  56. const translateIconMask = `<mask id="translateIconMask" fill="black"><path fill="white" d="M 0 0 H 24 V 24 H 0 Z"/><path fill="black" d="M24 12 H 12 V 24 H 24 Z"/></mask>`;
  57. const translateIcon = translateIconGeneral.replace(`<extra/>`, ``).replace(`<mask/>`, ``).replace(` mask="url(#translateIconMask)"`, ``);
  58. const translateIconUntranslate = translateIconGeneral.replace(`<extra/>`, `<path fill="none" stroke="#f04747" stroke-width="2" d="m 14.702359,14.702442 8.596228,8.596148 m 0,-8.597139 -8.59722,8.596147 z"/>`).replace(`<mask/>`, translateIconMask);
  59. const TranslateButtonComponent = class TranslateButton extends BdApi.React.Component {
  60. render() {
  61. const enabled = _this.isTranslationEnabled(this.props.channelId);
  62. return BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ChannelTextAreaButton, {
  63. className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN._translatortranslatebutton, _this.isTranslationEnabled(this.props.channelId) && BDFDB.disCN._translatortranslating, BDFDB.disCN.textareapickerbutton),
  64. isActive: this.props.isActive,
  65. iconSVG: translateIcon,
  66. nativeClass: true,
  67. tooltip: enabled && {
  68. text: (_ => `${BDFDB.LanguageUtils.getName(languages[_this.getLanguageChoice(languageTypes.INPUT, messageTypes.SENT, this.props.channelId)])}${BDFDB.LanguageUtils.getName(languages[_this.getLanguageChoice(languageTypes.OUTPUT, messageTypes.SENT, this.props.channelId)])}`),
  69. tooltipConfig: {style: "max-width: 400px"}
  70. },
  71. onClick: _ => {
  72. this.props.isActive = true;
  73. BDFDB.ReactUtils.forceUpdate(this);
  74. BDFDB.ModalUtils.open(_this, {
  75. size: "LARGE",
  76. header: BDFDB.LanguageUtils.LanguageStrings.SETTINGS,
  77. subHeader: "",
  78. onClose: _ => {
  79. this.props.isActive = false;
  80. BDFDB.ReactUtils.forceUpdate(this);
  81. },
  82. children: BDFDB.ReactUtils.createElement(TranslateSettingsComponent, {
  83. guildId: this.props.guildId,
  84. channelId: this.props.channelId
  85. })
  86. });
  87. },
  88. onContextMenu: _ => {
  89. _this.toggleTranslation(this.props.channelId);
  90. BDFDB.ReactUtils.forceUpdate(this);
  91. }
  92. });
  93. }
  94. };
  95. const TranslateSettingsComponent = class TranslateSettings extends BdApi.React.Component {
  96. filterLanguages(direction, place) {
  97. let isOutput = direction == languageTypes.OUTPUT;
  98. return BDFDB.ObjectUtils.toArray(BDFDB.ObjectUtils.map(isOutput ? BDFDB.ObjectUtils.filter(languages, lang => !lang.auto) : languages, (lang, id) => ({
  99. value: id,
  100. label: BDFDB.LanguageUtils.getName(lang),
  101. backup: this.isOnlyBackup(lang)
  102. }))).filter(isOutput && this.isOnlyBackup(languages[_this.getLanguageChoice(languageTypes.INPUT, place, this.props.channelId)]) ? (n => n.backup) : (n => n));
  103. }
  104. isOnlyBackup(lang) {
  105. return lang && (lang.auto && !translationEngines[_this.settings.engines.translator].auto || !lang.auto && !lang.special && !translationEngines[_this.settings.engines.translator].languages.includes(lang.id));
  106. }
  107. render() {
  108. return [
  109. BDFDB.ArrayUtils.is(_this.settings.exceptions.wordStart) && _this.settings.exceptions.wordStart.length && [
  110. BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, {
  111. className: BDFDB.disCN.marginbottom8,
  112. children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsLabel, {
  113. label: _this.labels.exception_text.replace("{{var0}}", _this.settings.exceptions.wordStart.map(n => '"' + n + '"').join(", "))
  114. })
  115. }),
  116. BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormDivider, {
  117. className: BDFDB.disCN.marginbottom8
  118. })
  119. ],
  120. Object.keys(_this.defaults.choices).map(place => {
  121. let isChannelSpecific = channelLanguages[this.props.channelId] && channelLanguages[this.props.channelId][place];
  122. let isGuildSpecific = !isChannelSpecific && guildLanguages[this.props.guildId] && guildLanguages[this.props.guildId][place];
  123. return Object.keys(_this.defaults.choices[place].value).map(direction => [
  124. BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, {
  125. title: _this.labels[`language_choice_${direction.toLowerCase()}_${place.toLowerCase()}`] + ": ",
  126. titleChildren: direction == languageTypes.OUTPUT && [{
  127. text: _ => isChannelSpecific ? _this.labels.language_selection_channel : isGuildSpecific ? _this.labels.language_selection_server : _this.labels.language_selection_global,
  128. name: isChannelSpecific || isGuildSpecific ? BDFDB.LibraryComponents.SvgIcon.Names.LOCK_CLOSED : BDFDB.LibraryComponents.SvgIcon.Names.LOCK_OPEN,
  129. color: isChannelSpecific ? "var(--status-danger)" : isGuildSpecific ? "var(--status-warning)" : null,
  130. onClick: _ => {
  131. if (channelLanguages[this.props.channelId] && channelLanguages[this.props.channelId][place]) {
  132. isChannelSpecific = false;
  133. delete channelLanguages[this.props.channelId][place];
  134. if (BDFDB.ObjectUtils.isEmpty(channelLanguages[this.props.channelId])) delete channelLanguages[this.props.channelId];
  135. }
  136. else if (guildLanguages[this.props.guildId] && guildLanguages[this.props.guildId][place]) {
  137. isGuildSpecific = false;
  138. isChannelSpecific = true;
  139. delete guildLanguages[this.props.guildId][place];
  140. if (BDFDB.ObjectUtils.isEmpty(guildLanguages[this.props.guildId])) delete guildLanguages[this.props.guildId];
  141. if (!channelLanguages[this.props.channelId]) channelLanguages[this.props.channelId] = {};
  142. channelLanguages[this.props.channelId][place] = {};
  143. for (let l in languageTypes) channelLanguages[this.props.channelId][place][languageTypes[l]] = _this.getLanguageChoice(languageTypes[l], place, null);
  144. }
  145. else {
  146. isGuildSpecific = true;
  147. if (!guildLanguages[this.props.guildId]) guildLanguages[this.props.guildId] = {};
  148. guildLanguages[this.props.guildId][place] = {};
  149. for (let l in languageTypes) guildLanguages[this.props.guildId][place][languageTypes[l]] = _this.getLanguageChoice(languageTypes[l], place, null);
  150. }
  151. BDFDB.DataUtils.save(channelLanguages, _this, "channelLanguages");
  152. BDFDB.DataUtils.save(guildLanguages, _this, "guildLanguages");
  153. BDFDB.ReactUtils.forceUpdate(this);
  154. }
  155. }, {
  156. iconSVG: `<svg width="21" height="21" fill="currentColor"><path d="M 0, 10.515 c 0, 2.892, 1.183, 5.521, 3.155, 7.361 L 0, 21.031 h 7.887 V 13.144 l -2.892, 2.892 C 3.549, 14.722, 2.629, 12.75, 2.629, 10.515 c 0 -3.418, 2.235 -6.309, 5.258 -7.492 v -2.629 C 3.418, 1.577, 0, 5.652, 0, 10.515 z M 21.031, 0 H 13.144 v 7.887 l 2.892 -2.892 C 17.482, 6.309, 18.402, 8.281, 18.402, 10.515 c 0, 3.418 -2.235, 6.309 -5.258, 7.492 V 20.768 c 4.469 -1.183, 7.887 -5.258, 7.887 -10.121 c 0 -2.892 -1.183 -5.521 -3.155 -7.361 L 21.031, 0 z"/></svg>`,
  157. onClick: _ => {
  158. let input = _this.getLanguageChoice(languageTypes.INPUT, place, this.props.channelId);
  159. let output = _this.getLanguageChoice(languageTypes.OUTPUT, place, this.props.channelId);
  160. input = input == "auto" ? "en" : input;
  161. _this.saveLanguageChoice(output, languageTypes.INPUT, place, this.props.channelId);
  162. _this.saveLanguageChoice(input, languageTypes.OUTPUT, place, this.props.channelId);
  163. _this.setLanguages();
  164. BDFDB.ReactUtils.forceUpdate(this);
  165. }
  166. }].map(data => {
  167. const icon = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Clickable, {
  168. className: BDFDB.disCN._translatorconfigbutton,
  169. onClick: data.onClick,
  170. children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, {
  171. width: 24,
  172. height: 24,
  173. color: data.color || "currentColor",
  174. name: data.name,
  175. iconSVG: data.iconSVG
  176. })
  177. });
  178. return data.text ? BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, {tooltipConfig: {type: "bottom"}, text: data.text, children: icon}) : icon;
  179. }),
  180. className: BDFDB.disCN.marginbottom8,
  181. children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Select, {
  182. value: _this.getLanguageChoice(direction, place, this.props.channelId),
  183. options: this.filterLanguages(direction, place),
  184. optionRenderer: lang => languages[lang.value] ? BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, {
  185. align: BDFDB.LibraryComponents.Flex.Align.CENTER,
  186. children: [
  187. BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex.Child, {
  188. grow: 1,
  189. children: lang.label
  190. }),
  191. lang.backup && BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, {
  192. text: _this.labels.backup_engine_warning,
  193. tooltipConfig: {
  194. color: "red"
  195. },
  196. children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, {
  197. nativeClass: true,
  198. width: 20,
  199. height: 20,
  200. color: "var(--status-danger)",
  201. name: BDFDB.LibraryComponents.SvgIcon.Names.WARNING
  202. })
  203. }),
  204. BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FavButton, {
  205. isFavorite: languages[lang.value].fav == 0,
  206. onClick: value => {
  207. if (value) favorites.push(lang.value);
  208. else BDFDB.ArrayUtils.remove(favorites, lang.value, true);
  209. BDFDB.DataUtils.save(favorites.sort(), _this, "favorites");
  210. _this.setLanguages();
  211. }
  212. })
  213. ]
  214. }) : null,
  215. onChange: value => {
  216. _this.saveLanguageChoice(value, direction, place, this.props.channelId);
  217. BDFDB.ReactUtils.forceUpdate(this);
  218. }
  219. })
  220. }),
  221. direction == languageTypes.OUTPUT && BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormDivider, {
  222. className: BDFDB.disCN.marginbottom8
  223. })
  224. ]);
  225. }),
  226. Object.keys(_this.defaults.engines).map(key => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, {
  227. title: _this.labels[`${key}_engine`],
  228. className: BDFDB.disCN.marginbottom8,
  229. children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Select, {
  230. value: _this.settings.engines[key],
  231. options: (key == "backup" ? ["----"] : []).concat(Object.keys(translationEngines)).filter(key == "backup" ? (n => n != _this.settings.engines.translator) : (n => n)).map(engineKey => ({value: engineKey, label: translationEngines[engineKey] ? translationEngines[engineKey].name : "----"})),
  232. maxVisibleItems: 3,
  233. onChange: value => {
  234. _this.settings.engines[key] = value;
  235. BDFDB.DataUtils.save(_this.settings.engines, _this, "engines");
  236. _this.setLanguages();
  237. BDFDB.ReactUtils.forceUpdate(this);
  238. }
  239. })
  240. })),
  241. Object.keys(_this.defaults.general).filter(key => _this.defaults.general[key].popout).map(key => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, {
  242. type: "Switch",
  243. plugin: _this,
  244. keys: ["general", key],
  245. label: _this.labels[`general_${key}`],
  246. tag: BDFDB.LibraryComponents.FormComponents.FormTags.H5,
  247. value: _this.settings.general[key]
  248. })),
  249. BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, {
  250. type: "Switch",
  251. label: _this.labels.translate_your_message,
  252. tag: BDFDB.LibraryComponents.FormComponents.FormTags.H5,
  253. value: _this.isTranslationEnabled(this.props.channelId),
  254. onChange: value => {
  255. _this.toggleTranslation(this.props.channelId);
  256. BDFDB.ReactUtils.forceUpdate(this);
  257. }
  258. })
  259. ].flat(10).filter(n => n);
  260. }
  261. };
  262. const brailleConverter = {
  263. "0":"⠴", "1":"⠂", "2":"⠆", "3":"⠒", "4":"⠲", "5":"⠢", "6":"⠖", "7":"⠶", "8":"⠦", "9":"⠔", "!":"⠮", "\"":"⠐", "#":"⠼", "$":"⠫", "%":"⠩", "&":"⠯", "'":"⠄", "(":"⠷", ")":"⠾", "*":"⠡", "+":"⠬", ",":"⠠", "-":"⠤", ".":"⠨", "/":"⠌", ":":"⠱", ";":"⠰", "<":"⠣", "=":"⠿", ">":"⠜", "?":"⠹", "@":"⠈", "a":"⠁", "b":"⠃", "c":"⠉", "d":"⠙", "e":"⠑", "f":"⠋", "g":"⠛", "h":"⠓", "i":"⠊", "j":"⠚", "k":"⠅", "l":"⠇", "m":"⠍", "n":"⠝", "o":"⠕", "p":"⠏", "q":"⠟", "r":"⠗", "s":"⠎", "t":"⠞", "u":"⠥", "v":"⠧", "w":"⠺", "x":"⠭", "y":"⠽", "z":"⠵", "[":"⠪", "\\":"⠳", "]":"⠻", "^":"⠘", "⠁":"a", "⠂":"1", "⠃":"b", "⠄":"'", "⠅":"k", "⠆":"2", "⠇":"l", "⠈":"@", "⠉":"c", "⠊":"i", "⠋":"f", "⠌":"/", "⠍":"m", "⠎":"s", "⠏":"p", "⠐":"\"", "⠑":"e", "⠒":"3", "⠓":"h", "⠔":"9", "⠕":"o", "⠖":"6", "⠗":"r", "⠘":"^", "⠙":"d", "⠚":"j", "⠛":"g", "⠜":">", "⠝":"n", "⠞":"t", "⠟":"q", "⠠":", ", "⠡":"*", "⠢":"5", "⠣":"<", "⠤":"-", "⠥":"u", "⠦":"8", "⠧":"v", "⠨":".", "⠩":"%", "⠪":"[", "⠫":"$", "⠬":"+", "⠭":"x", "⠮":"!", "⠯":"&", "⠰":";", "⠱":":", "⠲":"4", "⠳":"\\", "⠴":"0", "⠵":"z", "⠶":"7", "⠷":"(", "⠸":"_", "⠹":"?", "⠺":"w", "⠻":"]", "⠼":"#", "⠽":"y", "⠾":")", "⠿":"=", "_":"⠸"
  264. };
  265. const morseConverter = {
  266. "0":"−−−−−", "1":"·−−−−", "2":"··−−−", "3":"···−−", "4":"····−", "5":"·····", "6":"−····", "7":"−−···", "8":"−−−··", "9":"−−−−·", "!":"−·−·−−", "\"":"·−··−·", "$":"···−··−", "&":"·−···", "'":"·−−−−·", "(":"−·−−·", ")":"−·−−·−", "+":"·−·−·", ",":"−−··−−", "-":"−····−", ".":"·−·−·−", "/":"−··−·", ":":"−−−···", ";":"−·−·−·", "=":"−···−", "?":"··−−··", "@":"·−−·−·", "a":"·−", "b":"−···", "c":"−·−·", "d":"−··", "e":"·", "f":"··−·", "g":"−−·", "h":"····", "i":"··", "j":"·−−−", "k":"−·−", "l":"·−··", "m":"−−", "n":"−·", "o":"−−−", "p":"·−−·", "q":"−−·−", "r":"·−·", "s":"···", "t":"−", "u":"··−", "v":"···−", "w":"·−−", "x":"−··−", "y":"−·−−", "z":"−−··", "·":"e", "··":"i", "···":"s", "····":"h", "·····":"5", "····−":"4", "···−":"v", "···−··−":"$", "···−−":"3", "··−":"u", "··−·":"f", "··−−··":"?", "··−−·−":"_", "··−−−":"2", "·−":"a", "·−·":"r", "·−··":"l", "·−···":"&", "·−··−·":"\"", "·−·−·":"+", "·−·−·−":".", "·−−":"w", "·−−·":"p", "·−−·−·":"@", "·−−−":"j", "·−−−−":"1", "·−−−−·":"'", "−":"t", "−·":"n", "−··":"d", "−···":"b", "−····":"6", "−····−":"-", "−···−":"=", "−··−":"x", "−··−·":"/", "−·−":"k", "−·−·":"c", "−·−·−·":";", "−·−·−−":"!", "−·−−":"y", "−·−−·":"(", "−·−−·−":")", "−−":"m", "−−·":"g", "−−··":"z", "−−···":"7", "−−··−−":",", "−−·−":"q", "−−−":"o", "−−−··":"8", "−−−···":":", "−−−−·":"9", "−−−−−":"0", "_":"··−−·−"
  267. };
  268. const googleLanguages = ["af","am","ar","az","be","bg","bn","bs","ca","ceb","co","cs","cy","da","de","el","en","eo","es","et","eu","fa","fi","fr","fy","ga","gd","gl","gu","ha","haw","hi","hmn","hr","ht","hu","hy","id","ig","is","it","iw","ja","jw","ka","kk","km","kn","ko","ku","ky","la","lb","lo","lt","lv","mg","mi","mk","ml","mn","mr","ms","mt","my","ne","nl","no","ny","or","pa","pl","ps","pt","ro","ru","rw","sd","si","sk","sl","sm","sn","so","sq","sr","st","su","sv","sw","ta","te","tg","th","tk","tl","tr","tt","ug","uk","ur","uz","vi","xh","yi","yo","zh-CN","zh-TW","zu"];
  269. const translationEngines = {
  270. googleapi: {
  271. name: "Google",
  272. auto: true,
  273. funcName: "googleApiTranslate",
  274. languages: googleLanguages
  275. },
  276. deepl: {
  277. name: "DeepL",
  278. auto: true,
  279. funcName: "deepLTranslate",
  280. languages: ["bg","cs","da","de","en","el","es","et","fi","fr","hu","id","it","ja","ko","lt","lv","nl","no","pl","pt","ro","ru","sk","sl","sv","tr","uk","zh"],
  281. premium: true,
  282. key: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:fx"
  283. },
  284. itranslate: {
  285. name: "iTranslate",
  286. auto: true,
  287. funcName: "iTranslateTranslate",
  288. languages: [...new Set(["af","ar","az","be","bg","bn","bs","ca","ceb","cs","cy","da","de","el","en","eo","es","et","eu","fa","fi","fil","fr","ga","gl","gu","ha","he","hi","hmn","hr","ht","hu","hy","id","ig","is","it","ja","jw","ka","kk","km","kn","ko","la","lo","lt","lv","mg","mi","mk","ml","mn","mr","ms","mt","my","ne","nl","no","ny","pa","pl","pt-BR","pt-PT","ro","ru","si","sk","sl","so","sq","sr","st","su","sv","sw","ta","te","tg","th","tr","uk","ur","uz","vi","we","yi","yo","zh-CN","zh-TW","zu"].concat(googleLanguages))].sort(),
  289. key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  290. },
  291. yandex: {
  292. name: "Yandex",
  293. auto: true,
  294. funcName: "yandexTranslate",
  295. languages: ["af","am","ar","az","ba","be","bg","bn","bs","ca","ceb","cs","cy","da","de","el","en","eo","es","et","eu","fa","fi","fr","ga","gd","gl","gu","he","hi","hr","ht","hu","hy","id","is","it","ja","jv","ka","kk","km","kn","ko","ky","la","lb","lo","lt","lv","mg","mhr","mi","mk","ml","mn","mr","ms","mt","my","ne","nl","no","pa","pap","pl","pt","ro","ru","si","sk","sl","sq","sr","su","sv","sw","ta","te","tg","th","tl","tr","tt","udm","uk","ur","uz","vi","xh","yi","zh"],
  296. key: "trnsl.x.x.xxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  297. },
  298. papago: {
  299. name: "Papago",
  300. auto: false,
  301. funcName: "papagoTranslate",
  302. languages: ["en","es","fr","id","ja","ko","th","vi","zh-CN","zh-TW"],
  303. key: "xxxxxxxxxxxxxxxxxxxx xxxxxxxxxx"
  304. },
  305. baidu: {
  306. name: "Baidu",
  307. auto: true,
  308. funcName: "baiduTranslate",
  309. languages: ["ar","bg","cs","da","de","el","en","es","et","fi","fr","hu","it","jp","ko","nl","pl","pt","ro","ru","sl","sv","th","vi","zh","zh-CN","zh-TW"],
  310. parser: {
  311. "ar": "ara",
  312. "bg": "bul",
  313. "da": "dan",
  314. "es": "spa",
  315. "et": "est",
  316. "fi": "fin",
  317. "fr": "fra",
  318. "ko": "kor",
  319. "ro": "rom",
  320. "sl": "slo",
  321. "sv": "swe",
  322. "vi": "vie",
  323. "zh": "wyw",
  324. "zh-CN": "zh",
  325. "zh-TW": "cht"
  326. },
  327. key: "xxxxxxxxxx xxxxxxxxxxxxxxxxxxxx"
  328. }
  329. };
  330. var languages = {};
  331. var favorites = [];
  332. var authKeys = {};
  333. var channelLanguages = {}, guildLanguages = {};
  334. var translationEnabledStates = [], isTranslating;
  335. var translatedMessages = {}, oldMessages = {};
  336. const defaultLanguages = {
  337. INPUT: "auto",
  338. OUTPUT: "$discord"
  339. };
  340. const languageTypes = {
  341. INPUT: "input",
  342. OUTPUT: "output"
  343. };
  344. const messageTypes = {
  345. RECEIVED: "received",
  346. SENT: "sent",
  347. };
  348. return class Translator extends Plugin {
  349. onLoad () {
  350. _this = this;
  351. this.defaults = {
  352. general: {
  353. addTranslateButton: {value: true, popout: false},
  354. usePerChatTranslation: {value: true, popout: false},
  355. sendOriginalMessage: {value: false, popout: true},
  356. showOriginalMessage: {value: false, popout: true}
  357. },
  358. choices: {},
  359. exceptions: {
  360. wordStart: {value: ["!"], max: 1}
  361. },
  362. engines: {
  363. translator: {value: "googleapi"},
  364. backup: {value: "----"}
  365. }
  366. };
  367. for (let m in messageTypes) this.defaults.choices[messageTypes[m]] = {value: Object.keys(languageTypes).reduce((newObj, l) => (newObj[languageTypes[l]] = defaultLanguages[l], newObj), {})};
  368. this.modulePatches = {
  369. before: [
  370. "ChannelTextAreaContainer",
  371. "ChannelTextAreaEditor",
  372. "Embed",
  373. "MessageReply",
  374. "Messages"
  375. ],
  376. after: [
  377. "ChannelTextAreaButtons",
  378. "Embed",
  379. "MessageActionsContextMenu",
  380. "MessageContent",
  381. "MessageToolbar"
  382. ]
  383. };
  384. this.css = `
  385. ${BDFDB.dotCN._translatortranslatebutton + BDFDB.dotCNS._translatortranslating + BDFDB.dotCN.textareaicon} {
  386. color: var(--status-danger) !important;
  387. }
  388. ${BDFDB.dotCN._translatorconfigbutton} {
  389. margin: 2px 3px 0 6px;
  390. }
  391. `;
  392. }
  393. onStart () {
  394. BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.MessageUtils, "startEditMessage", {before: e => {
  395. if (e.methodArguments[1] && oldMessages[e.methodArguments[1]] && oldMessages[e.methodArguments[1]].content) e.methodArguments[2] = oldMessages[e.methodArguments[1]].content;
  396. }});
  397. BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.MessageUtils, "editMessage", {before: e => {
  398. delete translatedMessages[e.methodArguments[1]];
  399. delete oldMessages[e.methodArguments[1]];
  400. }});
  401. this.forceUpdateAll();
  402. }
  403. onStop () {
  404. this.forceUpdateAll();
  405. }
  406. getSettingsPanel (collapseStates = {}) {
  407. let settingsPanel;
  408. return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, {
  409. collapseStates: collapseStates,
  410. children: _ => {
  411. let settingsItems = [];
  412. for (let key in this.defaults.general) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, {
  413. type: "Switch",
  414. plugin: this,
  415. keys: ["general", key],
  416. label: this.labels[`general_${key}`],
  417. value: this.settings.general[key]
  418. }));
  419. settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormDivider, {
  420. className: BDFDB.disCNS.dividerdefault + BDFDB.disCN.marginbottom8
  421. }));
  422. settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsPanelList, {
  423. title: "Own Auth Keys:",
  424. children: Object.keys(translationEngines).filter(key => translationEngines[key].key).map(key => BDFDB.ReactUtils.createElement("div", {
  425. className: BDFDB.disCN.marginbottom8,
  426. children: [
  427. BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, {
  428. className: BDFDB.disCN.marginbottom8,
  429. align: BDFDB.LibraryComponents.Flex.Align.CENTER,
  430. direction: BDFDB.LibraryComponents.Flex.Direction.HORIZONTAL,
  431. children: [
  432. BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormTitle, {
  433. className: BDFDB.disCN.marginreset,
  434. tag: BDFDB.LibraryComponents.FormComponents.FormTags.H5,
  435. children: translationEngines[key].name
  436. }),
  437. translationEngines[key].premium && BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, {
  438. type: "Switch",
  439. margin: 0,
  440. grow: 0,
  441. label: "Paid Version",
  442. tag: BDFDB.LibraryComponents.FormComponents.FormTags.H5,
  443. value: authKeys[key] && authKeys[key].paid,
  444. onChange: value => {
  445. if (!authKeys[key]) authKeys[key] = {};
  446. authKeys[key].paid = value;
  447. BDFDB.DataUtils.save(authKeys, this, "authKeys");
  448. }
  449. })
  450. ]
  451. }),
  452. BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, {
  453. placeholder: translationEngines[key].key,
  454. value: authKeys[key] && authKeys[key].key,
  455. onChange: value => {
  456. if (!authKeys[key]) authKeys[key] = {};
  457. authKeys[key].key = (value || "").trim();
  458. BDFDB.DataUtils.save(authKeys, this, "authKeys");
  459. }
  460. })
  461. ]
  462. }))
  463. }));
  464. settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormDivider, {
  465. className: BDFDB.disCNS.dividerdefault + BDFDB.disCN.marginbottom8
  466. }));
  467. for (let key in this.defaults.exceptions) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, {
  468. title: this.labels.exception_text.replace("{{var0}}", "").split(" ").filter(n => n).join(" "),
  469. className: BDFDB.disCN.marginbottom8,
  470. children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ListInput, {
  471. placeholder: "New Exception",
  472. maxLength: this.defaults.exceptions[key].max,
  473. items: this.settings.exceptions[key],
  474. onChange: value => {
  475. this.SettingsUpdated = true;
  476. BDFDB.DataUtils.save(value, this, "exceptions", key);
  477. }
  478. })
  479. }));
  480. return settingsItems.flat(10);
  481. }
  482. });
  483. }
  484. onSettingsClosed () {
  485. if (this.SettingsUpdated) {
  486. delete this.SettingsUpdated;
  487. this.forceUpdateAll();
  488. }
  489. }
  490. forceUpdateAll () {
  491. favorites = BDFDB.DataUtils.load(this, "favorites");
  492. favorites = !BDFDB.ArrayUtils.is(favorites) ? [] : favorites;
  493. authKeys = BDFDB.DataUtils.load(this, "authKeys");
  494. channelLanguages = BDFDB.DataUtils.load(this, "channelLanguages");
  495. guildLanguages = BDFDB.DataUtils.load(this, "guildLanguages");
  496. translationEnabledStates = BDFDB.DataUtils.load(this, "translationEnabledStates");
  497. translationEnabledStates = BDFDB.ArrayUtils.is(translationEnabledStates) ? translationEnabledStates : [];
  498. this.setLanguages();
  499. BDFDB.PatchUtils.forceAllUpdates(this);
  500. BDFDB.MessageUtils.rerenderAll();
  501. }
  502. onMessageContextMenu (e) {
  503. if (e.instance.props.message && e.instance.props.channel) {
  504. let translated = !!translatedMessages[e.instance.props.message.id];
  505. let hint = BDFDB.BDUtils.isPluginEnabled("MessageUtilities") ? BDFDB.BDUtils.getPlugin("MessageUtilities").getActiveShortcutString("__Translate_Message") : null;
  506. let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: ["pin", "unpin"]});
  507. if (index == -1) [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: ["edit", "add-reaction", "quote"]});
  508. children.splice(index > -1 ? index + 1 : 0, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
  509. label: translated ? this.labels.context_messageuntranslateoption : this.labels.context_messagetranslateoption,
  510. id: BDFDB.ContextMenuUtils.createItemId(this.name, translated ? "untranslate-message" : "translate-message"),
  511. hint: hint && (_ => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.MenuItems.MenuHint, {
  512. hint: hint
  513. })),
  514. icon: _ => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.MenuItems.MenuIcon, {
  515. icon: translated ? translateIconUntranslate : translateIcon
  516. }),
  517. disabled: !translated && isTranslating,
  518. action: _ => this.translateMessage(e.instance.props.message, e.instance.props.channel)
  519. }));
  520. this.injectSearchItem(e);
  521. }
  522. }
  523. onTextAreaContextMenu (e) {
  524. this.injectSearchItem(e);
  525. }
  526. injectSearchItem (e) {
  527. let text = document.getSelection().toString();
  528. if (text) {
  529. let translating, foundTranslation, foundInput, foundOutput;
  530. let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: ["devmode-copy-id", "search-google"], group: true});
  531. children.splice(index > -1 ? index + 1 : 0, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, {
  532. children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
  533. id: BDFDB.ContextMenuUtils.createItemId(this.name, "search-translation"),
  534. icon: _ => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.MenuItems.MenuIcon, {
  535. icon: translateIcon
  536. }),
  537. disabled: isTranslating,
  538. label: this.labels.context_translator,
  539. persisting: true,
  540. action: event => {
  541. let item = BDFDB.DOMUtils.getParent(BDFDB.dotCN.menuitem, event.target);
  542. if (item) {
  543. let createTooltip = _ => {
  544. BDFDB.TooltipUtils.create(item, !foundTranslation ? this.labels.toast_translating_failed : [
  545. `${BDFDB.LanguageUtils.LibraryStrings.from} ${foundInput.name}:`,
  546. text,
  547. `${BDFDB.LanguageUtils.LibraryStrings.to} ${foundOutput.name}:`,
  548. foundTranslation
  549. ].map(n => BDFDB.ReactUtils.createElement("div", {children: n})), {
  550. type: "right",
  551. color: foundTranslation ? "black" : "red",
  552. className: "googletranslate-tooltip"
  553. });
  554. };
  555. if (foundTranslation && foundInput && foundOutput) {
  556. if (document.querySelector(".googletranslate-tooltip")) {
  557. BDFDB.ContextMenuUtils.close(e.instance);
  558. BDFDB.DiscordUtils.openLink(this.getGoogleTranslatePageURL(foundInput.id, foundOutput.id, text));
  559. }
  560. else createTooltip();
  561. }
  562. else if (!translating) {
  563. translating = true;
  564. this.translateText(text, messageTypes.RECEIVED, (translation, input, output) => {
  565. if (translation) {
  566. foundTranslation = translation, foundInput = input, foundOutput = output;
  567. createTooltip();
  568. }
  569. else createTooltip();
  570. });
  571. }
  572. }
  573. }
  574. })
  575. }));
  576. }
  577. }
  578. processMessageActionsContextMenu (e) {
  579. if (e.instance.props.message && e.instance.props.channel) {
  580. let translated = !!translatedMessages[e.instance.props.message.id];
  581. let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: ["pin", "unpin"]});
  582. children.splice(index + 1, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
  583. label: translated ? this.labels.context_messageuntranslateoption : this.labels.context_messagetranslateoption,
  584. disabled: isTranslating,
  585. id: BDFDB.ContextMenuUtils.createItemId(this.name, translated ? "untranslate-message" : "translate-message"),
  586. icon: _ => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.MenuItems.MenuIcon, {
  587. icon: translated ? translateIconUntranslate : translateIcon
  588. }),
  589. action: _ => this.translateMessage(e.instance.props.message, e.instance.props.channel)
  590. }));
  591. }
  592. }
  593. processMessageToolbar (e) {
  594. if (!e.instance.props.message || !e.instance.props.channel) return;
  595. let expanded = !BDFDB.LibraryStores.AccessibilityStore.keyboardModeEnabled && !e.instance.props.showEmojiPicker && !e.instance.props.showEmojiBurstPicker && !e.instance.props.showMoreUtilities && BDFDB.ListenerUtils.isPressed(16);
  596. if (!expanded) return;
  597. let translated = !!translatedMessages[e.instance.props.message.id];
  598. e.returnvalue.props.children.unshift();
  599. e.returnvalue.props.children.unshift(BDFDB.ReactUtils.createElement(class extends BdApi.React.Component {
  600. render() {
  601. return BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, {
  602. key: translated ? "untranslate-message" : "translate-message",
  603. text: _ => translated ? _this.labels.context_messageuntranslateoption : _this.labels.context_messagetranslateoption,
  604. children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Clickable, {
  605. className: BDFDB.disCN.messagetoolbarbutton,
  606. onClick: _ => {
  607. if (!isTranslating) _this.translateMessage(e.instance.props.message, e.instance.props.channel).then(_ => {
  608. translated = !!translatedMessages[e.instance.props.message.id];
  609. BDFDB.ReactUtils.forceUpdate(this);
  610. });
  611. },
  612. children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, {
  613. className: BDFDB.disCN.messagetoolbaricon,
  614. iconSVG: translated ? translateIconUntranslate : translateIcon
  615. })
  616. })
  617. });
  618. }
  619. }));
  620. }
  621. processChannelTextAreaContainer (e) {
  622. if (e.instance.props.type != BDFDB.DiscordConstants.ChannelTextAreaTypes.NORMAL && e.instance.props.type != BDFDB.DiscordConstants.ChannelTextAreaTypes.NORMAL_WITH_ACTIVITY && e.instance.props.type != BDFDB.DiscordConstants.ChannelTextAreaTypes.SIDEBAR) return;
  623. BDFDB.PatchUtils.patch(this, e.instance.props, "onSubmit", {instead: e2 => {
  624. if (this.isTranslationEnabled(e.instance.props.channel.id) && e2.methodArguments[0].value) {
  625. e2.stopOriginalMethodCall();
  626. this.translateText(e2.methodArguments[0].value, messageTypes.SENT, (translation, input, output) => {
  627. translation = !translation ? e2.methodArguments[0].value : (this.settings.general.sendOriginalMessage ? (translation + "\n\n> *" + e2.methodArguments[0].value.split("\n").join("*\n> *") + "*") : translation);
  628. e2.originalMethod(Object.assign({}, e2.methodArguments[0], {value: translation}));
  629. });
  630. return Promise.resolve({
  631. shouldClear: true,
  632. shouldRefocus: true
  633. });
  634. }
  635. return e2.callOriginalMethodAfterwards();
  636. }}, {noCache: true});
  637. }
  638. processChannelTextAreaEditor (e) {
  639. if (this.isTranslationEnabled(e.instance.props.channel.id) && isTranslating) e.instance.props.disabled = true;
  640. }
  641. processChannelTextAreaButtons (e) {
  642. if (!this.settings.general.addTranslateButton || e.instance.props.disabled || e.instance.props.type != BDFDB.DiscordConstants.ChannelTextAreaTypes.NORMAL && e.instance.props.type != BDFDB.DiscordConstants.ChannelTextAreaTypes.NORMAL_WITH_ACTIVITY && e.instance.props.type != BDFDB.DiscordConstants.ChannelTextAreaTypes.SIDEBAR) return;
  643. if (e.returnvalue) e.returnvalue.props.children.unshift(BDFDB.ReactUtils.createElement(TranslateButtonComponent, {
  644. guildId: e.instance.props.channel.guild_id ? e.instance.props.channel.guild_id : "@me",
  645. channelId: e.instance.props.channel.id
  646. }));
  647. }
  648. processMessages (e) {
  649. e.instance.props.channelStream = [].concat(e.instance.props.channelStream);
  650. for (let i in e.instance.props.channelStream) {
  651. let message = e.instance.props.channelStream[i].content;
  652. if (message) {
  653. if (BDFDB.ArrayUtils.is(message.attachments)) this.checkMessage(e.instance.props.channelStream[i], message);
  654. else if (BDFDB.ArrayUtils.is(message)) for (let j in message) {
  655. let childMessage = message[j].content;
  656. if (childMessage && BDFDB.ArrayUtils.is(childMessage.attachments)) this.checkMessage(message[j], childMessage);
  657. }
  658. }
  659. }
  660. }
  661. checkMessage (stream, message) {
  662. let translation = translatedMessages[message.id];
  663. if (translation) stream.content.content = translation.content;
  664. else if (oldMessages[message.id] && Object.keys(message).some(key => !BDFDB.equals(oldMessages[message.id][key], message[key]))) {
  665. stream.content.content = oldMessages[message.id].content;
  666. delete oldMessages[message.id];
  667. }
  668. }
  669. processMessageReply (e) {
  670. if (!e.instance.props.referencedMessage || !e.instance.props.referencedMessage.message || !translatedMessages[e.instance.props.referencedMessage.message.id]) return;
  671. e.instance.props.referencedMessage = Object.assign({}, e.instance.props.referencedMessage);
  672. e.instance.props.referencedMessage.message = new BDFDB.DiscordObjects.Message(e.instance.props.referencedMessage.message);
  673. e.instance.props.referencedMessage.message.content = translatedMessages[e.instance.props.referencedMessage.message.id].content;
  674. }
  675. processMessageContent (e) {
  676. if (!e.instance.props.message) return;
  677. let translation = translatedMessages[e.instance.props.message.id];
  678. if (translation && translation.content) e.returnvalue.props.children.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, {
  679. text: `${BDFDB.LanguageUtils.getName(translation.input)}${BDFDB.LanguageUtils.LibraryStrings.to} ${BDFDB.LanguageUtils.getName(translation.output)}`,
  680. tooltipConfig: {style: "max-width: 400px"},
  681. children: BDFDB.ReactUtils.createElement("span", {
  682. className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.messagetimestamp, BDFDB.disCN.messagetimestampinline, BDFDB.disCN._translatortranslated),
  683. children: BDFDB.ReactUtils.createElement("span", {
  684. className: BDFDB.disCN.messageedited,
  685. children: `(${this.labels.translated_watermark})`
  686. })
  687. })
  688. }));
  689. }
  690. processEmbed (e) {
  691. if (!e.instance.props.embed || !e.instance.props.embed.message_id) return;
  692. let translation = translatedMessages[e.instance.props.embed.message_id];
  693. if (translation && Object.keys(translation.embeds).length) {
  694. if (!e.returnvalue) e.instance.props.embed = Object.assign({}, e.instance.props.embed, {
  695. rawDescription: translation.embeds[e.instance.props.embed.id],
  696. originalDescription: e.instance.props.embed.originalDescription || e.instance.props.embed.rawDescription
  697. });
  698. else {
  699. let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {props: [["className", BDFDB.disCN.embeddescription]]});
  700. if (index > -1) children[index].props.children.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, {
  701. text: `${BDFDB.LanguageUtils.getName(translation.input)}${BDFDB.LanguageUtils.getName(translation.output)}`,
  702. tooltipConfig: {style: "max-width: 400px"},
  703. children: BDFDB.ReactUtils.createElement("span", {
  704. className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.messagetimestamp, BDFDB.disCN.messagetimestampinline, BDFDB.disCN._translatortranslated),
  705. children: BDFDB.ReactUtils.createElement("span", {
  706. className: BDFDB.disCN.messageedited,
  707. children: `(${this.labels.translated_watermark})`
  708. })
  709. })
  710. }));
  711. }
  712. }
  713. else if (!e.returnvalue && e.instance.props.embed.originalDescription) {
  714. e.instance.props.embed = Object.assign({}, e.instance.props.embed, {rawDescription: e.instance.props.embed.originalDescription});
  715. delete e.instance.props.embed.originalDescription;
  716. }
  717. }
  718. toggleTranslation (channelId) {
  719. if (!this.isTranslationEnabled(channelId)) translationEnabledStates.push(this.settings.general.usePerChatTranslation ? channelId : "global");
  720. else BDFDB.ArrayUtils.remove(translationEnabledStates, this.settings.general.usePerChatTranslation ? channelId : "global", true);
  721. BDFDB.DataUtils.save(translationEnabledStates, this, "translationEnabledStates");
  722. }
  723. isTranslationEnabled (channelId) {
  724. return translationEnabledStates.includes(this.settings.general.usePerChatTranslation ? channelId : "global");
  725. }
  726. setLanguages () {
  727. if (this.settings.engines.translator == this.settings.engines.backup) {
  728. this.settings.engines.backup = Object.keys(translationEngines).filter(n => n != this.settings.engines.translator)[0];
  729. BDFDB.DataUtils.save(this.settings.engines, this, "engines");
  730. }
  731. let engine = translationEngines[this.settings.engines.translator] || {};
  732. let backup = translationEngines[this.settings.engines.backup] || {};
  733. let languageIds = [].concat(engine.languages, backup.languages).flat(10).filter(n => n);
  734. languages = BDFDB.ObjectUtils.deepAssign(
  735. !engine.auto && !backup.auto ? {} : {
  736. auto: {
  737. auto: true,
  738. name: this.labels.detect_language,
  739. id: "auto"
  740. }
  741. },
  742. BDFDB.ObjectUtils.filter(BDFDB.LanguageUtils.languages, lang => languageIds.includes(lang.id)),
  743. {
  744. binary: {
  745. special: true,
  746. name: "Binary",
  747. id: "binary"
  748. },
  749. braille: {
  750. special: true,
  751. name: "Braille 6-dot",
  752. id: "braille"
  753. },
  754. morse: {
  755. special: true,
  756. name: "Morse",
  757. id: "morse"
  758. }
  759. }
  760. );
  761. for (let id in languages) languages[id].fav = favorites.includes(id) ? 0 : 1;
  762. languages = BDFDB.ObjectUtils.sort(languages, "fav");
  763. }
  764. getLanguageChoice (direction, place, channelId) {
  765. this.setLanguages();
  766. let choice;
  767. let channel = channelId && BDFDB.LibraryStores.ChannelStore.getChannel(channelId);
  768. let guildId = channel ? (channel.guild_id ? channel.guild_id : "@me") : null;
  769. if (channelLanguages[channelId] && channelLanguages[channelId][place]) choice = channelLanguages[channelId][place][direction];
  770. else if (guildId && guildLanguages[guildId] && guildLanguages[guildId][place]) choice = guildLanguages[guildId][place][direction];
  771. else choice = this.settings.choices[place] && this.settings.choices[place][direction];
  772. choice = languages[choice] ? choice : Object.keys(languages)[0];
  773. choice = direction == languageTypes.OUTPUT && choice == "auto" ? "en" : choice;
  774. return choice;
  775. }
  776. saveLanguageChoice (choice, direction, place, channelId) {
  777. let channel = channelId && BDFDB.LibraryStores.ChannelStore.getChannel(channelId);
  778. let guildId = channel ? (channel.guild_id ? channel.guild_id : "@me") : null;
  779. if (channelLanguages[channelId] && channelLanguages[channelId][place]) {
  780. channelLanguages[channelId][place][direction] = choice;
  781. BDFDB.DataUtils.save(channelLanguages, this, "channelLanguages");
  782. }
  783. else if (guildLanguages[guildId] && guildLanguages[guildId][place]) {
  784. guildLanguages[guildId][place][direction] = choice;
  785. BDFDB.DataUtils.save(guildLanguages, this, "guildLanguages");
  786. }
  787. else {
  788. this.settings.choices[place][direction] = choice;
  789. BDFDB.DataUtils.save(this.settings.choices, this, "choices");
  790. }
  791. }
  792. translateMessage (message, channel) {
  793. return new Promise(callback => {
  794. if (!message) return callback(null);
  795. if (translatedMessages[message.id]) {
  796. delete translatedMessages[message.id];
  797. BDFDB.MessageUtils.rerenderAll(true);
  798. callback(false);
  799. }
  800. else {
  801. let orignalContent = message.content || "";
  802. for (let embed of message.embeds) orignalContent += ("\n__________________ __________________ __________________\n" + embed.rawDescription);
  803. this.translateText(orignalContent, messageTypes.RECEIVED, (translation, input, output) => {
  804. if (translation) {
  805. oldMessages[message.id] = new BDFDB.DiscordObjects.Message(message);
  806. let oldStrings = orignalContent.split(/\n{0,1}__________________ __________________ __________________\n{0,1}/);
  807. let strings = translation.split(/\n{0,1}__________________ __________________ __________________\n{0,1}/);
  808. let oldContent = this.settings.general.showOriginalMessage && (oldStrings.shift() || "").trim();
  809. let content = (strings.shift() || "").trim() + (oldContent ? `\n\n${oldContent}` : "");
  810. let embeds = {};
  811. for (let i in message.embeds) {
  812. message.embeds[i].message_id = message.id;
  813. let oldEmbedString = this.settings.general.showOriginalMessage && (oldStrings.shift() || "").trim();
  814. embeds[message.embeds[i].id] = (strings.shift() || message.embeds[i].rawDescription).trim() + (oldEmbedString ? `\n\n${oldEmbedString}` : "");
  815. }
  816. translatedMessages[message.id] = {content, embeds, input, output};
  817. BDFDB.MessageUtils.rerenderAll(true);
  818. }
  819. callback(true);
  820. });
  821. }
  822. });
  823. }
  824. translateText (text, place, callback) {
  825. let toast = null, toastInterval, finished = false, finishTranslation = translation => {
  826. isTranslating = false;
  827. if (toast) toast.close();
  828. if (finished) return;
  829. finished = true;
  830. if (translation) translation = this.addExceptions(translation, excepts);
  831. callback(translation == text ? "" : translation, input, output);
  832. };
  833. let [newText, excepts, translate] = this.removeExceptions(text.trim(), place);
  834. let channelId = BDFDB.LibraryStores.SelectedChannelStore.getChannelId();
  835. let input = Object.assign({}, languages[this.getLanguageChoice(languageTypes.INPUT, place, channelId)]);
  836. let output = Object.assign({}, languages[this.getLanguageChoice(languageTypes.OUTPUT, place, channelId)]);
  837. if (translate && input.id != output.id) {
  838. let specialCase = this.checkForSpecialCase(newText, input);
  839. if (specialCase) {
  840. input.name = specialCase.name;
  841. switch (specialCase.id) {
  842. case "binary": newText = this.binary2string(newText); break;
  843. case "braille": newText = this.braille2string(newText); break;
  844. case "morse": newText = this.morse2string(newText); break;
  845. }
  846. }
  847. if (output.special) {
  848. switch (output.id) {
  849. case "binary": newText = this.string2binary(newText); break;
  850. case "braille": newText = this.string2braille(newText); break;
  851. case "morse": newText = this.string2morse(newText); break;
  852. }
  853. finishTranslation(newText);
  854. }
  855. else {
  856. const startTranslating = engine => {
  857. isTranslating = true;
  858. if (toast) toast.close();
  859. BDFDB.TimeUtils.clear(toastInterval);
  860. toast = BDFDB.NotificationUtils.toast(`${this.labels.toast_translating} (${translationEngines[engine].name}) - ${BDFDB.LanguageUtils.LibraryStrings.please_wait}`, {
  861. timeout: 0,
  862. ellipsis: true,
  863. position: "center",
  864. onClose: _ => BDFDB.TimeUtils.clear(toastInterval)
  865. });
  866. toastInterval = BDFDB.TimeUtils.interval((_, count) => {
  867. if (count < 40) return;
  868. finishTranslation("");
  869. BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed} (${translationEngines[engine].name}) - ${this.labels.toast_translating_tryanother}`, {
  870. type: "danger",
  871. position: "center"
  872. });
  873. }, 500);
  874. };
  875. if (this.validTranslator(this.settings.engines.translator, input, output, specialCase)) {
  876. startTranslating(this.settings.engines.translator);
  877. this[translationEngines[this.settings.engines.translator].funcName].apply(this, [{input, output, text: newText, specialCase, engine: translationEngines[this.settings.engines.translator]}, translation => {
  878. if (!translation && this.validTranslator(this.settings.engines.backup, input, output, specialCase)) {
  879. startTranslating(this.settings.engines.backup);
  880. this[translationEngines[this.settings.engines.backup].funcName].apply(this, [{input, output, text: newText, specialCase, engine: translationEngines[this.settings.engines.backup]}, finishTranslation]);
  881. }
  882. else finishTranslation(translation);
  883. }]);
  884. }
  885. else if (this.validTranslator(this.settings.engines.backup, input, output, specialCase)) {
  886. startTranslating(this.settings.engines.backup);
  887. this[translationEngines[this.settings.engines.backup].funcName].apply(this, [{input, output, text: newText, specialCase, engine: translationEngines[this.settings.engines.backup]}, finishTranslation]);
  888. }
  889. else finishTranslation();
  890. }
  891. }
  892. else finishTranslation();
  893. }
  894. validTranslator (key, input, output, specialCase) {
  895. return translationEngines[key] && typeof this[translationEngines[key].funcName] == "function" && (specialCase || input.auto && translationEngines[key].auto || translationEngines[key].languages.includes(input.id) && translationEngines[key].languages.includes(output.id));
  896. }
  897. googleApiTranslate (data, callback) {
  898. BDFDB.LibraryRequires.request(`https://translate.googleapis.com/translate_a/single?client=gtx&sl=${data.input.id}&tl=${data.output.id}&dt=t&dj=1&source=input&q=${encodeURIComponent(data.text)}`, (error, response, body) => {
  899. if (!error && body && response.statusCode == 200) {
  900. try {
  901. body = JSON.parse(body);
  902. if (!data.specialCase && body.src && body.src && languages[body.src]) {
  903. data.input.name = languages[body.src].name;
  904. data.input.ownlang = languages[body.src].ownlang;
  905. }
  906. callback(body.sentences.map(n => n && n.trans).filter(n => n).join(""));
  907. }
  908. catch (err) {callback("");}
  909. }
  910. else {
  911. if (response.statusCode == 429) BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_hourlylimit}`, {
  912. type: "danger",
  913. position: "center"
  914. });
  915. else BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_serverdown}`, {
  916. type: "danger",
  917. position: "center"
  918. });
  919. callback("");
  920. }
  921. });
  922. }
  923. deepLTranslate (data, callback) {
  924. BDFDB.LibraryRequires.request(`${authKeys.deepl && authKeys.deepl.paid ? "https://api.deepl.com/v2/translate" : "https://api-free.deepl.com/v2/translate"}?auth_key=${authKeys.deepl && authKeys.deepl.key || "75cc2f40-fdae-14cd-7242-6a384e2abb9c:fx"}&text=${encodeURIComponent(data.text)}${data.input.auto ? "" : `&source_lang=${data.input.id}`}&target_lang=${data.output.id}`, (error, response, body) => {
  925. if (!error && body && response.statusCode == 200) {
  926. try {
  927. body = JSON.parse(body);
  928. if (!data.specialCase && body.translations[0] && body.translations[0].detected_source_language && languages[body.translations[0].detected_source_language.toLowerCase()]) {
  929. data.input.name = languages[body.translations[0].detected_source_language.toLowerCase()].name;
  930. data.input.ownlang = languages[body.translations[0].detected_source_language.toLowerCase()].ownlang;
  931. }
  932. callback(body.translations.map(n => n && n.text).filter(n => n).join(""));
  933. }
  934. catch (err) {callback("");}
  935. }
  936. else {
  937. if (response.statusCode == 429 || response.statusCode == 456) BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_dailylimit}`, {
  938. type: "danger",
  939. position: "center"
  940. });
  941. else if (response.statusCode == 403) BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_keyoutdated}`, {
  942. type: "danger",
  943. position: "center"
  944. });
  945. else BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_serverdown}`, {
  946. type: "danger",
  947. position: "center"
  948. });
  949. callback("");
  950. }
  951. });
  952. }
  953. iTranslateTranslate (data, callback) {
  954. let translate = _ => {
  955. BDFDB.LibraryRequires.request("https://web-api.itranslateapp.com/v3/texts/translate", {
  956. method: "post",
  957. headers: {
  958. "API-KEY": authKeys.itranslate && authKeys.itranslate.key || data.engine.APIkey
  959. },
  960. body: JSON.stringify({
  961. source: {
  962. dialect: data.input.id,
  963. text: data.text
  964. },
  965. target: {
  966. dialect: data.output.id
  967. }
  968. })
  969. }, (error, response, body) => {
  970. if (!error && response && response.statusCode == 200) {
  971. try {
  972. body = JSON.parse(body);
  973. if (!data.specialCase && body.source && body.source.dialect && languages[body.source.dialect]) {
  974. data.input.name = languages[body.source.dialect].name;
  975. data.input.ownlang = languages[body.source.dialect].ownlang;
  976. }
  977. callback(body.target.text);
  978. }
  979. catch (err) {callback("");}
  980. }
  981. else {
  982. if (response.statusCode == 429) BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_dailylimit}`, {
  983. type: "danger",
  984. position: "center"
  985. });
  986. else if (response.statusCode == 403) BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_keyoutdated}`, {
  987. type: "danger",
  988. position: "center"
  989. });
  990. else BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_serverdown}`, {
  991. type: "danger",
  992. position: "center"
  993. });
  994. callback("");
  995. }
  996. });
  997. };
  998. if (authKeys.itranslate && authKeys.itranslate.key || data.engine.APIkey) translate();
  999. else BDFDB.LibraryRequires.request("https://www.itranslate.com/js/webapp/main.js", {gzip: true}, (error, response, body) => {
  1000. if (!error && body) {
  1001. let APIkey = /var API_KEY = "(.+)"/.exec(body);
  1002. if (APIkey) {
  1003. data.engine.APIkey = APIkey[1];
  1004. translate();
  1005. }
  1006. else callback("");
  1007. }
  1008. else callback("");
  1009. });
  1010. }
  1011. yandexTranslate (data, callback) {
  1012. BDFDB.LibraryRequires.request(`https://translate.yandex.net/api/v1.5/tr/translate?key=${authKeys.yandex && authKeys.yandex.key || "trnsl.1.1.20191206T223907Z.52bd512eca953a5b.1ec123ce4dcab3ae859f312d27cdc8609ab280de"}&text=${encodeURIComponent(data.text)}&lang=${data.specialCase || data.input.auto ? data.output.id : (data.input.id + "-" + data.output.id)}&options=1`, (error, response, body) => {
  1013. if (!error && body && response.statusCode == 200) {
  1014. try {
  1015. body = BDFDB.DOMUtils.create(body);
  1016. let translation = body.querySelector("text");
  1017. let detected = body.querySelector("detected");
  1018. if (translation && detected) {
  1019. let detectedLang = detected.getAttribute("lang");
  1020. if (!data.specialCase && detectedLang && languages[detectedLang]) {
  1021. data.input.name = languages[detectedLang].name;
  1022. data.input.ownlang = languages[detectedLang].ownlang;
  1023. }
  1024. callback(translation.innerText);
  1025. }
  1026. else callback("");
  1027. }
  1028. catch (err) {callback("");}
  1029. }
  1030. else if (body && body.indexOf('code="408"') > -1) {
  1031. BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_monthlylimit}`, {
  1032. type: "danger",
  1033. position: "center"
  1034. });
  1035. callback("");
  1036. }
  1037. else {
  1038. BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_serverdown}/${this.labels.error_keyoutdated}`, {
  1039. type: "danger",
  1040. position: "center"
  1041. });
  1042. callback("");
  1043. }
  1044. });
  1045. }
  1046. papagoTranslate (data, callback) {
  1047. const credentials = (authKeys.papago && authKeys.papago.key || "kUNGxtAmTJQFbaFehdjk zC70k3VhpM").split(" ");
  1048. BDFDB.LibraryRequires.request("https://openapi.naver.com/v1/papago/n2mt", {
  1049. method: "post",
  1050. form: {
  1051. source: data.input.id,
  1052. target: data.output.id,
  1053. text: data.text
  1054. },
  1055. headers: {
  1056. "X-Naver-Client-Id": credentials[0],
  1057. "X-Naver-Client-Secret": credentials[1]
  1058. }
  1059. }, (error, response, body) => {
  1060. if (!error && body && response.statusCode == 200) {
  1061. try {
  1062. let message = (JSON.parse(body) || {}).message;
  1063. let result = message && (message.body || message.result);
  1064. if (result && result.translatedText) callback(result.translatedText);
  1065. else callback("");
  1066. }
  1067. catch (err) {callback("");}
  1068. }
  1069. else {
  1070. if (response.statusCode == 429) BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_hourlylimit}`, {
  1071. type: "danger",
  1072. position: "center"
  1073. });
  1074. else BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_serverdown}/${this.labels.error_keyoutdated}`, {
  1075. type: "danger",
  1076. position: "center"
  1077. });
  1078. callback("");
  1079. }
  1080. });
  1081. }
  1082. baiduTranslate (data, callback) {
  1083. const credentials = (authKeys.baidu && authKeys.baidu.key || "20221009001380882 TOPnUKz8jJ32AZNOuUhX").split(" ");
  1084. const salt = BDFDB.NumberUtils.generateId();
  1085. BDFDB.LibraryRequires.request("https://fanyi-api.baidu.com/api/trans/vip/translate", {
  1086. method: "post",
  1087. form: {
  1088. from: translationEngines.baidu.parser[data.input.id] || data.input.id,
  1089. to: translationEngines.baidu.parser[data.output.id] || data.output.id,
  1090. q: encodeURIComponent(data.text),
  1091. appid: credentials[0],
  1092. salt: salt,
  1093. sign: this.MD5(credentials[0] + data.text + salt + (credentials[2] || credentials[1]))
  1094. }
  1095. }, (error, response, result) => {
  1096. if (!error && result && response.statusCode == 200) {
  1097. try {
  1098. result = JSON.parse(result) || {};
  1099. if (!result.error_code) {
  1100. let messages = result.trans_result;
  1101. if (messages && messages.length > 0 && result.from != result.to) callback(messages.map(message => decodeURIComponent(message.dst)).join("\n"));
  1102. else {callback("");}
  1103. }
  1104. else {
  1105. BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${result.error_code} : ${result.error_msg}.`, {
  1106. type: "danger",
  1107. position: "center"
  1108. });
  1109. callback("");
  1110. }
  1111. }
  1112. catch (err) {callback("");}
  1113. }
  1114. else {
  1115. BDFDB.NotificationUtils.toast(`${this.labels.toast_translating_failed}. ${this.labels.toast_translating_tryanother}. ${this.labels.error_serverdown}`, {
  1116. type: "danger",
  1117. position: "center"
  1118. });
  1119. callback("");
  1120. }
  1121. });
  1122. }
  1123. MD5 (e) {
  1124. function h(a, b) {
  1125. var e = a & 2147483648, f = b & 2147483648, c = a & 1073741824, d = b & 1073741824, g = (a & 1073741823) + (b & 1073741823);
  1126. return c & d ? g ^ 2147483648 ^ e ^ f : c | d ? g & 1073741824 ? g ^ 3221225472 ^ e ^ f : g ^ 1073741824 ^ e ^ f : g ^ e ^ f
  1127. }
  1128. function k(a, b, c, d, e, f, g) {
  1129. a = h(a, h(h(b & c | ~b & d, e), g));
  1130. return h(a << f | a >>> 32 - f, b);
  1131. }
  1132. function l(a, b, c, d, e, f, g) {
  1133. a = h(a, h(h(b & d | c & ~d, e), g));
  1134. return h(a << f | a >>> 32 - f, b);
  1135. }
  1136. function m(a, b, d, c, e, f, g) {
  1137. a = h(a, h(h(b ^ d ^ c, e), g));
  1138. return h(a << f | a >>> 32 - f, b)
  1139. }
  1140. function n(a, b, d, c, e, f, g) {
  1141. a = h(a, h(h(d ^ (b | ~c), e), g));
  1142. return h(a << f | a >>> 32 - f, b);
  1143. }
  1144. function p(a) {
  1145. var b = "", d = "", c;
  1146. for (c = 0; 3 >= c; c++) d = a >>> 8 * c & 255, d = "0" + d.toString(16), b += d.substr(d.length - 2, 2);
  1147. return b;
  1148. }
  1149. var f = [], q, r, s, t, a, b, c, d;
  1150. e = function(a) {
  1151. a = a.replace(/\r\n/g, "\n");
  1152. for (var b = "", d = 0; d < a.length; d++) {
  1153. var c = a.charCodeAt(d);
  1154. 128 > c ? b += String.fromCharCode(c) : (127 < c && 2048 > c ? b += String.fromCharCode(c >> 6 | 192) : (b += String.fromCharCode(c >> 12 | 224), b += String.fromCharCode(c >> 6 & 63 | 128)), b += String.fromCharCode(c & 63 | 128))
  1155. }
  1156. return b;
  1157. }(e);
  1158. f = function(b) {
  1159. var a, c = b.length;
  1160. a = c + 8;
  1161. for (var d = 16 * ((a - a % 64) / 64 + 1), e = Array(d - 1), f = 0, g = 0; g < c;) a = (g - g % 4) / 4, f = g % 4 * 8, e[a] |= b.charCodeAt(g) << f, g++;
  1162. a = (g - g % 4) / 4;
  1163. e[a] |= 128 << g % 4 * 8;
  1164. e[d - 2] = c << 3;
  1165. e[d - 1] = c >>> 29;
  1166. return e
  1167. }(e);
  1168. a = 1732584193, b = 4023233417, c = 2562383102, d = 271733878;
  1169. for (e = 0; e < f.length; e += 16) q = a, r = b, s = c, t = d, a = k(a, b, c, d, f[e + 0], 7, 3614090360), d = k(d, a, b, c, f[e + 1], 12, 3905402710), c = k(c, d, a, b, f[e + 2], 17, 606105819), b = k(b, c, d, a, f[e + 3], 22, 3250441966), a = k(a, b, c, d, f[e + 4], 7, 4118548399), d = k(d, a, b, c, f[e + 5], 12, 1200080426), c = k(c, d, a, b, f[e + 6], 17, 2821735955), b = k(b, c, d, a, f[e + 7], 22, 4249261313), a = k(a, b, c, d, f[e + 8], 7, 1770035416), d = k(d, a, b, c, f[e + 9], 12, 2336552879), c = k(c, d, a, b, f[e + 10], 17, 4294925233), b = k(b, c, d, a, f[e + 11], 22, 2304563134), a = k(a, b, c, d, f[e + 12], 7, 1804603682), d = k(d, a, b, c, f[e + 13], 12, 4254626195), c = k(c, d, a, b, f[e + 14], 17, 2792965006), b = k(b, c, d, a, f[e + 15], 22, 1236535329), a = l(a, b, c, d, f[e + 1], 5, 4129170786), d = l(d, a, b, c, f[e + 6], 9, 3225465664), c = l(c, d, a, b, f[e + 11], 14, 643717713), b = l(b, c, d, a, f[e + 0], 20, 3921069994), a = l(a, b, c, d, f[e + 5], 5, 3593408605), d = l(d, a, b, c, f[e + 10], 9, 38016083), c = l(c, d, a, b, f[e + 15], 14, 3634488961), b = l(b, c, d, a, f[e + 4], 20, 3889429448), a = l(a, b, c, d, f[e + 9], 5, 568446438), d = l(d, a, b, c, f[e + 14], 9, 3275163606), c = l(c, d, a, b, f[e + 3], 14, 4107603335), b = l(b, c, d, a, f[e + 8], 20, 1163531501), a = l(a, b, c, d, f[e + 13], 5, 2850285829), d = l(d, a, b, c, f[e + 2], 9, 4243563512), c = l(c, d, a, b, f[e + 7], 14, 1735328473), b = l(b, c, d, a, f[e + 12], 20, 2368359562), a = m(a, b, c, d, f[e + 5], 4, 4294588738), d = m(d, a, b, c, f[e + 8], 11, 2272392833), c = m(c, d, a, b, f[e + 11], 16, 1839030562), b = m(b, c, d, a, f[e + 14], 23, 4259657740), a = m(a, b, c, d, f[e + 1], 4, 2763975236), d = m(d, a, b, c, f[e + 4], 11, 1272893353), c = m(c, d, a, b, f[e + 7], 16, 4139469664), b = m(b, c, d, a, f[e + 10], 23, 3200236656), a = m(a, b, c, d, f[e + 13], 4, 681279174), d = m(d, a, b, c, f[e + 0], 11, 3936430074), c = m(c, d, a, b, f[e + 3], 16, 3572445317), b = m(b, c, d, a, f[e + 6], 23, 76029189), a = m(a, b, c, d, f[e + 9], 4, 3654602809), d = m(d, a, b, c, f[e + 12], 11, 3873151461), c = m(c, d, a, b, f[e + 15], 16, 530742520), b = m(b, c, d, a, f[e + 2], 23, 3299628645), a = n(a, b, c, d, f[e + 0], 6, 4096336452), d = n(d, a, b, c, f[e + 7], 10, 1126891415), c = n(c, d, a, b, f[e + 14], 15, 2878612391), b = n(b, c, d, a, f[e + 5], 21, 4237533241), a = n(a, b, c, d, f[e + 12], 6, 1700485571), d = n(d, a, b, c, f[e + 3], 10, 2399980690), c = n(c, d, a, b, f[e + 10], 15, 4293915773), b = n(b, c, d, a, f[e + 1], 21, 2240044497), a = n(a, b, c, d, f[e + 8], 6, 1873313359), d = n(d, a, b, c, f[e + 15], 10, 4264355552), c = n(c, d, a, b, f[e + 6], 15, 2734768916), b = n(b, c, d, a, f[e + 13], 21, 1309151649), a = n(a, b, c, d, f[e + 4], 6, 4149444226), d = n(d, a, b, c, f[e + 11], 10, 3174756917), c = n(c, d, a, b, f[e + 2], 15, 718787259), b = n(b, c, d, a, f[e + 9], 21, 3951481745), a = h(a, q), b = h(b, r), c = h(c, s), d = h(d, t);
  1170. return (p(a) + p(b) + p(c) + p(d)).toLowerCase();
  1171. }
  1172. checkForSpecialCase (text, input) {
  1173. if (input.special) return input;
  1174. else if (input.auto) {
  1175. if (/^[0-1]*$/.test(text.replace(/\s/g, ""))) {
  1176. return {id: "binary", name: "Binary"};
  1177. }
  1178. else if (/^[⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿]*$/.test(text.replace(/\s/g, ""))) {
  1179. return {id: "braille", name: "Braille 6-dot"};
  1180. }
  1181. else if (/^[/|·−._-]*$/.test(text.replace(/\s/g, ""))) {
  1182. return {id: "morse", name: "Morse"};
  1183. }
  1184. }
  1185. return null;
  1186. }
  1187. string2binary (string) {
  1188. let binary = "";
  1189. for (let character of string) binary += parseInt(character.charCodeAt(0).toString(2)).toPrecision(8).split(".").reverse().join("").toString() + " ";
  1190. return binary;
  1191. }
  1192. string2braille (string) {
  1193. let braille = "";
  1194. for (let character of string) braille += brailleConverter[character.toLowerCase()] ? brailleConverter[character.toLowerCase()] : character;
  1195. return braille;
  1196. }
  1197. string2morse (string) {
  1198. string = string.replace(/ /g, "%%%%%%%%%%");
  1199. let morse = "";
  1200. for (let character of string) morse += (morseConverter[character.toLowerCase()] ? morseConverter[character.toLowerCase()] : character) + " ";
  1201. morse = morse.split("\n");
  1202. for (let i in morse) morse[i] = morse[i].trim();
  1203. return morse.join("\n").replace(/% % % % % % % % % % /g, "/ ");
  1204. }
  1205. binary2string (binary) {
  1206. let string = "";
  1207. binary = binary.replace(/\n/g, "00001010").replace(/\r/g, "00001101").replace(/\t/g, "00001001").replace(/\s/g, "");
  1208. if (/^[0-1]*$/.test(binary)) {
  1209. let eightDigits = "";
  1210. let counter = 0;
  1211. for (let digit of binary) {
  1212. eightDigits += digit;
  1213. counter++;
  1214. if (counter > 7) {
  1215. string += String.fromCharCode(parseInt(eightDigits, 2).toString(10));
  1216. eightDigits = "";
  1217. counter = 0;
  1218. }
  1219. }
  1220. }
  1221. else BDFDB.NotificationUtils.toast("Invalid binary format. Only use 0s and 1s.", {
  1222. type: "danger",
  1223. position: "center"
  1224. });
  1225. return string;
  1226. }
  1227. braille2string (braille) {
  1228. let string = "";
  1229. for (let character of braille) string += brailleConverter[character.toLowerCase()] ? brailleConverter[character.toLowerCase()] : character;
  1230. return string;
  1231. }
  1232. morse2string (morse) {
  1233. let string = "";
  1234. for (let word of morse.replace(/[_-]/g, "−").replace(/\./g, "·").replace(/\r|\t/g, "").split(/\/|\||\n/g)) {
  1235. for (let characterstr of word.trim().split(" ")) string += morseConverter[characterstr] ? morseConverter[characterstr] : characterstr;
  1236. string += " ";
  1237. }
  1238. return string.trim();
  1239. }
  1240. addExceptions (string, excepts) {
  1241. for (let count in excepts) {
  1242. let exception = BDFDB.ArrayUtils.is(this.settings.exceptions.wordStart) && this.settings.exceptions.wordStart.some(n => excepts[count].indexOf(n) == 0) ? excepts[count].slice(1) : excepts[count];
  1243. let newString = string.replace(new RegExp(`[{\{]\\s*[{\{]\\s*${count}\\s*[}\}]\\s*[}\}]`), exception);
  1244. if (newString == string) string = newString + " " + exception;
  1245. else string = newString;
  1246. }
  1247. return string;
  1248. }
  1249. removeExceptions (string, place) {
  1250. let emojiRegex = /[\uD83C-\uDBFF\uDC00-\uDFFF]+/;
  1251. let excepts = {}, newString = [], count = 0;
  1252. if (place == messageTypes.RECEIVED) {
  1253. let text = [], i = 0;
  1254. string.split("").forEach((chara, index, array) => {
  1255. if (chara == "<" && text[i] || emojiRegex.test(chara) && emojiRegex.test(array[index+1])) i++;
  1256. text[i] = text[i] ? text[i] + chara : chara;
  1257. if (chara == ">" || emojiRegex.test(chara) && emojiRegex.test(array[index-1])) i++;
  1258. });
  1259. for (let j in text) {
  1260. if (text[j].indexOf("<") == 0 || emojiRegex.test(text[j])) {
  1261. newString.push(`{{${count}}}`);
  1262. excepts[count] = text[j];
  1263. count++;
  1264. }
  1265. else newString.push(text[j]);
  1266. }
  1267. }
  1268. else {
  1269. let usedExceptions = BDFDB.ArrayUtils.is(this.settings.exceptions.wordStart) ? this.settings.exceptions.wordStart : [];
  1270. string.split(" ").forEach(word => {
  1271. if (emojiRegex.test(word) || word.indexOf("<@!") == 0 || word.indexOf("<#") == 0 || word.indexOf(":") == 0 || word.indexOf("<:") == 0 || word.indexOf("<a:") == 0 || word.indexOf("@") == 0 || word.indexOf("#") == 0 || usedExceptions.some(n => word.indexOf(n) == 0 && word.length > 1)) {
  1272. newString.push(`{{${count}}}`);
  1273. excepts[count] = word;
  1274. count++;
  1275. }
  1276. else newString.push(word);
  1277. });
  1278. }
  1279. return [newString.join(" "), excepts, newString.length-count != 0];
  1280. }
  1281. getGoogleTranslatePageURL (input, output, text) {
  1282. return `https://translate.google.com/#${BDFDB.LanguageUtils.languages[input] ? input : "auto"}/${output}/${encodeURIComponent(text)}`;
  1283. }
  1284. setLabelsByLanguage () {
  1285. switch (BDFDB.LanguageUtils.getLanguage().id) {
  1286. case "bg": // Bulgarian
  1287. return {
  1288. backup_engine: "Резервен-Преводач",
  1289. backup_engine_warning: "Ще използва Резервен-Преводач",
  1290. context_messagetranslateoption: "Превод на съобщението",
  1291. context_messageuntranslateoption: "Превод на съобщението",
  1292. context_translator: "Търсене превод",
  1293. detect_language: "Разпознаване на езика",
  1294. error_dailylimit: "Дневният лимит на заявките е достигнат.",
  1295. error_hourlylimit: "Почасовият лимит на заявките е достигнат.",
  1296. error_keyoutdated: "API-ключът е остарял.",
  1297. error_monthlylimit: "Месечният лимит на заявките е достигнат.",
  1298. error_serverdown: "Сървърът за превод може да е офлайн.",
  1299. exception_text: "Думите, започващи с {{var0}}, ще бъдат игнорирани",
  1300. general_addTranslateButton: "Добавя бутон за превод към текстовото поле на канала",
  1301. general_sendOriginalMessage: "Също така изпраща оригиналното съобщение, когато превежда вашето изпратено съобщение",
  1302. general_showOriginalMessage: "Също така показва оригиналното съобщение при превод на получено съобщение",
  1303. general_usePerChatTranslation: "Активира/деактивира състоянието на бутона за преводач за всеки канал, а не глобално",
  1304. language_choice_input_received: "Език на въвеждане в получените съобщения",
  1305. language_choice_input_sent: "Език на въвеждане в изпратените от вас съобщения",
  1306. language_choice_output_received: "Изходен език в получените съобщения",
  1307. language_choice_output_sent: "Изходен език в изпратените ви съобщения",
  1308. language_selection_channel: "Изборът на език ще бъде променен специално за този канал",
  1309. language_selection_global: "Изборът на език ще бъде променен за всички сървъри",
  1310. language_selection_server: "Изборът на език ще бъде променен специално за този сървър",
  1311. popout_translateoption: "Превод",
  1312. popout_untranslateoption: "Непревод",
  1313. toast_translating: "Превод",
  1314. toast_translating_failed: "Преводът не бе успешен",
  1315. toast_translating_tryanother: "Опитайте друг преводач",
  1316. translate_your_message: "Преведете вашите съобщения преди изпращане",
  1317. translated_watermark: "преведено",
  1318. translator_engine: "Преводач"
  1319. };
  1320. case "cs": // Czech
  1321. return {
  1322. backup_engine: "Backup-Překladatel",
  1323. backup_engine_warning: "Použije Backup-Překladatel",
  1324. context_messagetranslateoption: "Přeložit zprávu",
  1325. context_messageuntranslateoption: "Přeložit zprávu",
  1326. context_translator: "Hledat Překlad",
  1327. detect_language: "Rozpoznat jazyk",
  1328. error_dailylimit: "Denní limit požadavků byl dosažen.",
  1329. error_hourlylimit: "Bylo dosaženo limitu hodinového požadavku.",
  1330. error_keyoutdated: "Klíč API je zastaralý.",
  1331. error_monthlylimit: "Byl dosažen limit měsíčních požadavků.",
  1332. error_serverdown: "Překladový server může být offline.",
  1333. exception_text: "Slova začínající na {{var0}} budou ignorována",
  1334. general_addTranslateButton: "Přidá tlačítko Přeložit do textové oblasti kanálu",
  1335. general_sendOriginalMessage: "Při překladu odeslané zprávy také odešle původní zprávu",
  1336. general_showOriginalMessage: "Také zobrazuje původní zprávu při překladu přijaté zprávy",
  1337. general_usePerChatTranslation: "Povolí/zakáže stav tlačítka překladače pro kanál, nikoli globálně",
  1338. language_choice_input_received: "Vstupní jazyk do přijatých zpráv",
  1339. language_choice_input_sent: "Zadejte jazyk do odeslaných zpráv",
  1340. language_choice_output_received: "Výstupní jazyk v přijatých zprávách",
  1341. language_choice_output_sent: "Jazyk výstupu ve vašich odeslaných zprávách",
  1342. language_selection_channel: "Výběr jazyka bude změněn speciálně pro tento kanál",
  1343. language_selection_global: "Výběr jazyka se změní pro všechny servery",
  1344. language_selection_server: "Výběr jazyka bude změněn speciálně pro tento server",
  1345. popout_translateoption: "Přeložit",
  1346. popout_untranslateoption: "Nepřeložit",
  1347. toast_translating: "Překládání",
  1348. toast_translating_failed: "Překlad se nezdařil",
  1349. toast_translating_tryanother: "Zkuste jiný překladač",
  1350. translate_your_message: "Před odesláním si zprávy přeložte",
  1351. translated_watermark: "přeloženo",
  1352. translator_engine: "Překladatel"
  1353. };
  1354. case "da": // Danish
  1355. return {
  1356. backup_engine: "Backup-Oversætter",
  1357. backup_engine_warning: "Vil bruge Backup-Oversætter",
  1358. context_messagetranslateoption: "Oversæt besked",
  1359. context_messageuntranslateoption: "Ikke-oversat besked",
  1360. context_translator: "Søg oversættelse",
  1361. detect_language: "Find sprog",
  1362. error_dailylimit: "Daglig anmodningsgrænse nået.",
  1363. error_hourlylimit: "Timegrænsen for anmodning er nået.",
  1364. error_keyoutdated: "API-nøgle forældet.",
  1365. error_monthlylimit: "Månedlig anmodningsgrænse nået.",
  1366. error_serverdown: "Oversættelsesserveren er muligvis offline.",
  1367. exception_text: "Ord, der begynder med {{var0}}, ignoreres",
  1368. general_addTranslateButton: "Tilføjer en Oversæt-knap til kanaltekstområdet",
  1369. general_sendOriginalMessage: "Sender også den originale besked, når du oversætter din sendte besked",
  1370. general_showOriginalMessage: "Viser også den originale besked, når du oversætter modtaget besked",
  1371. general_usePerChatTranslation: "Aktiverer/deaktiverer oversætterknappens tilstand pr. kanal og ikke globalt",
  1372. language_choice_input_received: "Inputsprog i modtagne beskeder",
  1373. language_choice_input_sent: "Indtast sprog i dine sendte beskeder",
  1374. language_choice_output_received: "Outputsprog i modtagne beskeder",
  1375. language_choice_output_sent: "Outputsprog i dine sendte beskeder",
  1376. language_selection_channel: "Valg af sprog vil blive ændret specifikt for denne kanal",
  1377. language_selection_global: "Valg af sprog vil blive ændret for alle servere",
  1378. language_selection_server: "Sprogvalg vil blive ændret specifikt for denne server",
  1379. popout_translateoption: "Oversætte",
  1380. popout_untranslateoption: "Untranslate",
  1381. toast_translating: "Oversætter",
  1382. toast_translating_failed: "Kunne ikke oversætte",
  1383. toast_translating_tryanother: "Prøv en anden oversætter",
  1384. translate_your_message: "Oversæt dine beskeder før afsendelse",
  1385. translated_watermark: "oversat",
  1386. translator_engine: "Oversætter"
  1387. };
  1388. case "de": // German
  1389. return {
  1390. backup_engine: "Backup-Übersetzer",
  1391. backup_engine_warning: "Wird Backup-Übersetzer verwenden",
  1392. context_messagetranslateoption: "Nachricht übersetzen",
  1393. context_messageuntranslateoption: "Nachricht unübersetzen",
  1394. context_translator: "Übersetzung suchen",
  1395. detect_language: "Sprache erkennen",
  1396. error_dailylimit: "Tägliches Anforderungslimit erreicht.",
  1397. error_hourlylimit: "Stündliches Anforderungslimit erreicht.",
  1398. error_keyoutdated: "API-Schlüssel veraltet.",
  1399. error_monthlylimit: "Monatliches Anforderungslimit erreicht.",
  1400. error_serverdown: "Der Übersetzungsserver ist möglicherweise offline.",
  1401. exception_text: "Wörter, die mit {{var0}} beginnen, werden ignoriert",
  1402. general_addTranslateButton: "Fügt dem Textbereich des Kanals eine Schalter zum Übersetzen hinzu",
  1403. general_sendOriginalMessage: "Sendet auch die ursprüngliche Nachricht, wenn die gesendete Nachricht übersetzt wird",
  1404. general_showOriginalMessage: "Zeigt auch die ursprüngliche Nachricht an, wenn eine empfangene Nachricht übersetzt wird",
  1405. general_usePerChatTranslation: "Aktiviert/deaktiviert die Übersetzung pro Kanal und nicht global",
  1406. language_choice_input_received: "Eingabesprache in empfangenen Nachrichten",
  1407. language_choice_input_sent: "Eingabesprache in gesendeten Nachrichten",
  1408. language_choice_output_received: "Ausgabesprache in empfangenen Nachrichten",
  1409. language_choice_output_sent: "Ausgabesprache in gesendeten Nachrichten",
  1410. language_selection_channel: "Die Sprachauswahl wird speziell für diesen Kanal geändert",
  1411. language_selection_global: "Die Sprachauswahl wird für alle Server geändert",
  1412. language_selection_server: "Die Sprachauswahl wird speziell für diesen Server geändert",
  1413. popout_translateoption: "Übersetzen",
  1414. popout_untranslateoption: "Unübersetzen",
  1415. toast_translating: "Übersetzen",
  1416. toast_translating_failed: "Übersetzung fehlgeschlagen",
  1417. toast_translating_tryanother: "Versuch einen anderen Übersetzer",
  1418. translate_your_message: "Übersetzt Nachrichten vor dem Senden",
  1419. translated_watermark: "übersetzt",
  1420. translator_engine: "Übersetzer"
  1421. };
  1422. case "el": // Greek
  1423. return {
  1424. backup_engine: "Μεταφράστης-Αντίγραφο ασφαλείας",
  1425. backup_engine_warning: "Θα χρησιμοποιηθεί Μεταφράστης-Αντίγραφο ασφαλείας",
  1426. context_messagetranslateoption: "Μετάφραση μηνύματος",
  1427. context_messageuntranslateoption: "Αναίρεση μετάφρασης μηνύματος",
  1428. context_translator: "Αναζήτηση μετάφρασης",
  1429. detect_language: "Εντοπισμός γλώσσας",
  1430. error_dailylimit: "Συμπληρώθηκε το ημερήσιο όριο αιτημάτων.",
  1431. error_hourlylimit: "Συμπληρώθηκε το ωριαίο όριο αιτημάτων.",
  1432. error_keyoutdated: "Το κλειδί API δεν είναι ενημερωμένο.",
  1433. error_monthlylimit: "Συμπληρώθηκε το μηνιαίο όριο αιτημάτων.",
  1434. error_serverdown: "Ο διακομιστής μετάφρασης ενδέχεται να είναι εκτός σύνδεσης.",
  1435. exception_text: "Οι λέξεις θα αγνοηθούν που ξεκινούν με {{var0}}",
  1436. general_addTranslateButton: "Προσθήκη κουμπιού μετάφρασης στην Περιοχή κειμένου του Καναλιού",
  1437. general_sendOriginalMessage: "Αποστολή αρχικού Μηνύματος με τη μετάφραση απεσταλμένου μηνύματος",
  1438. general_showOriginalMessage: "Εμφάνιση αρχικού Μηνύματος με τη μετάφραση ενός ληφθέντος μηνύματος",
  1439. general_usePerChatTranslation: "(Απ)Ενεργοποίηση κατάστασης κουμπιού μεταφραστή ανά κανάλι",
  1440. language_choice_input_received: "Γλώσσα εισαγωγής στα ληφθέντα μηνύματα",
  1441. language_choice_input_sent: "Γλώσσα εισαγωγής στα απεσταλμένα μηνύματά σας",
  1442. language_choice_output_received: "Γλώσσα εξαγωγής στα ληφθέντα μηνύματα",
  1443. language_choice_output_sent: "Γλώσσα εξαγωγής στα απεσταλμένα μηνύματά σας",
  1444. language_selection_channel: "Η επιλογή γλώσσας θα αλλάξει ειδικά για αυτό το κανάλι",
  1445. language_selection_global: "Η Επιλογή Γλώσσας θα αλλάξει για όλους τους Διακομιστές",
  1446. language_selection_server: "Η επιλογή γλώσσας θα αλλάξει ειδικά για αυτόν τον διακομιστή",
  1447. popout_translateoption: "Μετάφραση",
  1448. popout_untranslateoption: "Αναίρεση μετάφρασης",
  1449. toast_translating: "Μετάφραση",
  1450. toast_translating_failed: "Αποτυχία μετάφρασης",
  1451. toast_translating_tryanother: "Δοκιμάστε έναν άλλο Μεταφραστή",
  1452. translate_your_message: "Μεταφράστε τα Μηνύματά σας πριν την αποστολή",
  1453. translated_watermark: "μεταφρασμένο",
  1454. translator_engine: "Μεταφράστης"
  1455. };
  1456. case "es": // Spanish
  1457. return {
  1458. backup_engine: "Backup-Traductor",
  1459. backup_engine_warning: "Utilizará Backup-Traductor",
  1460. context_messagetranslateoption: "Traducir mensaje",
  1461. context_messageuntranslateoption: "Mensaje sin traducir",
  1462. context_translator: "Buscar traducción",
  1463. detect_language: "Detectar idioma",
  1464. error_dailylimit: "Se alcanzó el límite de solicitudes diarias.",
  1465. error_hourlylimit: "Se alcanzó el límite de solicitudes por hora.",
  1466. error_keyoutdated: "API-Key obsoleta.",
  1467. error_monthlylimit: "Se alcanzó el límite de solicitudes mensuales.",
  1468. error_serverdown: "El servidor de traducción puede estar fuera de línea.",
  1469. exception_text: "Las palabras que comienzan con {{var0}} serán ignoradas",
  1470. general_addTranslateButton: "Agrega un botón de traducción al área de texto del canal",
  1471. general_sendOriginalMessage: "También envía el mensaje original al traducir su mensaje enviado",
  1472. general_showOriginalMessage: "También muestra el mensaje original al traducir un mensaje recibido",
  1473. general_usePerChatTranslation: "Habilita/deshabilita el estado del botón del traductor por canal y no globalmente",
  1474. language_choice_input_received: "Idioma de entrada en los mensajes recibidos",
  1475. language_choice_input_sent: "Idioma de entrada en sus mensajes enviados",
  1476. language_choice_output_received: "Idioma de salida en los mensajes recibidos",
  1477. language_choice_output_sent: "Idioma de salida en sus mensajes enviados",
  1478. language_selection_channel: "La selección de idioma se cambiará específicamente para este canal",
  1479. language_selection_global: "La selección de idioma se cambiará para todos los servidores",
  1480. language_selection_server: "La selección de idioma se cambiará específicamente para este servidor",
  1481. popout_translateoption: "Traducir",
  1482. popout_untranslateoption: "No traducir",
  1483. toast_translating: "Traductorio",
  1484. toast_translating_failed: "No se pudo traducir",
  1485. toast_translating_tryanother: "Prueba con otro traductor",
  1486. translate_your_message: "Traduce tus mensajes antes de enviarlos",
  1487. translated_watermark: "traducido",
  1488. translator_engine: "Traductor"
  1489. };
  1490. case "fi": // Finnish
  1491. return {
  1492. backup_engine: "Backup-Kääntäjä",
  1493. backup_engine_warning: "Käyttää Backup-Kääntäjä",
  1494. context_messagetranslateoption: "Käännä viesti",
  1495. context_messageuntranslateoption: "Käännä viesti",
  1496. context_translator: "Hae käännöstä",
  1497. detect_language: "Tunnista kieli",
  1498. error_dailylimit: "Päivittäinen pyyntöraja saavutettu.",
  1499. error_hourlylimit: "Tuntikohtainen pyyntöraja saavutettu.",
  1500. error_keyoutdated: "API-avain vanhentunut.",
  1501. error_monthlylimit: "Kuukauden pyyntöraja saavutettu.",
  1502. error_serverdown: "Käännöspalvelin saattaa olla offline-tilassa.",
  1503. exception_text: "{{var0}} alkavat sanat ohitetaan",
  1504. general_addTranslateButton: "Lisää käännöspainikkeen kanavan tekstialueeseen",
  1505. general_sendOriginalMessage: "Lähettää myös alkuperäisen viestin kääntäessään lähettämääsi viestiä",
  1506. general_showOriginalMessage: "Näyttää myös alkuperäisen viestin käännettäessä vastaanotettua viestiä",
  1507. general_usePerChatTranslation: "Ottaa käyttöön/poistaa käytöstä kääntäjän painikkeen tilan kanavakohtaisesti, ei maailmanlaajuisesti",
  1508. language_choice_input_received: "Syöttökieli vastaanotetuissa viesteissä",
  1509. language_choice_input_sent: "Syötä kieli lähettämiisi viesteihin",
  1510. language_choice_output_received: "Tulostuskieli vastaanotetuissa viesteissä",
  1511. language_choice_output_sent: "Lähetyskieli lähetetyissä viesteissä",
  1512. language_selection_channel: "Kielen valintaa muutetaan erityisesti tätä kanavaa varten",
  1513. language_selection_global: "Kielen valintaa muutetaan kaikille palvelimille",
  1514. language_selection_server: "Kielen valintaa muutetaan erityisesti tätä palvelinta varten",
  1515. popout_translateoption: "Kääntää",
  1516. popout_untranslateoption: "Käännä",
  1517. toast_translating: "Kääntäminen",
  1518. toast_translating_failed: "Käännös epäonnistui",
  1519. toast_translating_tryanother: "Kokeile toista kääntäjää",
  1520. translate_your_message: "Käännä viestisi ennen lähettämistä",
  1521. translated_watermark: "käännetty",
  1522. translator_engine: "Kääntäjä"
  1523. };
  1524. case "fr": // French
  1525. return {
  1526. backup_engine: "Backup-Traducteur",
  1527. backup_engine_warning: "Utilisera Backup-Traducteur",
  1528. context_messagetranslateoption: "Traduire le message",
  1529. context_messageuntranslateoption: "Message non traduit",
  1530. context_translator: "Recherche de traduction",
  1531. detect_language: "Détecter la langue",
  1532. error_dailylimit: "Limite quotidienne de requêtes atteinte.",
  1533. error_hourlylimit: "Limite horaire de demandes atteinte.",
  1534. error_keyoutdated: "Clé API obsolète.",
  1535. error_monthlylimit: "Limite mensuelle de demandes atteinte.",
  1536. error_serverdown: "Le serveur de traduction est peut-être hors ligne.",
  1537. exception_text: "Les mots commençant par {{var0}} seront ignorés",
  1538. general_addTranslateButton: "Ajoute un bouton de traduction à la zone de texte du canal",
  1539. general_sendOriginalMessage: "Envoie également le message d'origine lors de la traduction de votre message envoyé",
  1540. general_showOriginalMessage: "Affiche également le message d'origine lors de la traduction d'un message reçu",
  1541. general_usePerChatTranslation: "Active/désactive l'état du bouton du traducteur par canal et non globalement",
  1542. language_choice_input_received: "Langue d'entrée dans les messages reçus",
  1543. language_choice_input_sent: "Langue d'entrée dans vos messages envoyés",
  1544. language_choice_output_received: "Langue de sortie dans les messages reçus",
  1545. language_choice_output_sent: "Langue de sortie dans vos messages envoyés",
  1546. language_selection_channel: "La sélection de la langue sera modifiée spécifiquement pour ce canal",
  1547. language_selection_global: "La sélection de la langue sera modifiée pour tous les serveurs",
  1548. language_selection_server: "La sélection de la langue sera modifiée spécifiquement pour ce serveur",
  1549. popout_translateoption: "Traduire",
  1550. popout_untranslateoption: "Non traduit",
  1551. toast_translating: "Traduction en cours",
  1552. toast_translating_failed: "Échec de la traduction",
  1553. toast_translating_tryanother: "Essayez un autre traducteur",
  1554. translate_your_message: "Traduisez vos messages avant de les envoyer",
  1555. translated_watermark: "traduit",
  1556. translator_engine: "Traducteur"
  1557. };
  1558. case "hi": // Hindi
  1559. return {
  1560. backup_engine: "बैकअप-अनुवादक",
  1561. backup_engine_warning: "बैकअप-अनुवादक का उपयोग करेंगे",
  1562. context_messagetranslateoption: "संदेश का अनुवाद करें",
  1563. context_messageuntranslateoption: "संदेश का अनुवाद न करें",
  1564. context_translator: "अनुवाद खोजें",
  1565. detect_language: "भाषा की जांच करो",
  1566. error_dailylimit: "दैनिक अनुरोध सीमा पूरी हो गई है।",
  1567. error_hourlylimit: "घंटे के अनुरोध की सीमा पूरी हो गई है.",
  1568. error_keyoutdated: "एपीआई-कुंजी पुरानी हो चुकी है।",
  1569. error_monthlylimit: "मासिक अनुरोध सीमा पूरी हो गई है।",
  1570. error_serverdown: "अनुवाद सर्वर ऑफ़लाइन हो सकता है।",
  1571. exception_text: "{{var0}} से शुरू होने वाले शब्दों पर ध्यान नहीं दिया जाएगा",
  1572. general_addTranslateButton: "चैनल Textarea में एक अनुवाद बटन जोड़ता है",
  1573. general_sendOriginalMessage: "आपके भेजे गए संदेश का अनुवाद करते समय मूल संदेश भी भेजता है",
  1574. general_showOriginalMessage: "प्राप्त संदेश का अनुवाद करते समय मूल संदेश भी दिखाता है",
  1575. general_usePerChatTranslation: "प्रति चैनल अनुवादक बटन स्थिति को सक्षम/अक्षम करता है और विश्व स्तर पर नहीं",
  1576. language_choice_input_received: "प्राप्त संदेशों में इनपुट भाषा",
  1577. language_choice_input_sent: "आपके भेजे गए संदेशों में इनपुट भाषा",
  1578. language_choice_output_received: "प्राप्त संदेशों में आउटपुट भाषा",
  1579. language_choice_output_sent: "आपके भेजे गए संदेशों में आउटपुट भाषा",
  1580. language_selection_channel: "इस चैनल के लिए भाषा चयन विशेष रूप से बदला जाएगा",
  1581. language_selection_global: "सभी सर्वरों के लिए भाषा चयन बदल दिया जाएगा",
  1582. language_selection_server: "इस सर्वर के लिए भाषा चयन विशेष रूप से बदल दिया जाएगा",
  1583. popout_translateoption: "अनुवाद करना",
  1584. popout_untranslateoption: "अनुवाद न करें",
  1585. toast_translating: "अनुवाद",
  1586. toast_translating_failed: "अनुवाद करने में विफल",
  1587. toast_translating_tryanother: "दूसरे अनुवादक का प्रयास करें",
  1588. translate_your_message: "भेजने से पहले अपने संदेशों का अनुवाद करें",
  1589. translated_watermark: "अनुवाद",
  1590. translator_engine: "अनुवादक"
  1591. };
  1592. case "hr": // Croatian
  1593. return {
  1594. backup_engine: "Rezervni-Prevoditelj",
  1595. backup_engine_warning: "Koristit će se Rezervni-Prevoditelj",
  1596. context_messagetranslateoption: "Prevedi poruku",
  1597. context_messageuntranslateoption: "Prevedi poruku",
  1598. context_translator: "Pretraži prijevod",
  1599. detect_language: "Prepoznaj jezik",
  1600. error_dailylimit: "Dosegnuto je dnevno ograničenje zahtjeva.",
  1601. error_hourlylimit: "Dosegnuto je ograničenje zahtjeva po satu.",
  1602. error_keyoutdated: "API-ključ zastario.",
  1603. error_monthlylimit: "Dosegnuto je mjesečno ograničenje zahtjeva.",
  1604. error_serverdown: "Translation Server možda je offline.",
  1605. exception_text: "Riječi koje počinju s {{var0}} bit će zanemarene",
  1606. general_addTranslateButton: "Dodaje gumb Prevedi tekstualnom području kanala",
  1607. general_sendOriginalMessage: "Također šalje izvornu poruku prilikom prijevoda vaše poslane poruke",
  1608. general_showOriginalMessage: "Također prikazuje izvornu poruku prilikom prijevoda primljene poruke",
  1609. general_usePerChatTranslation: "Omogućuje/onemogućuje stanje gumba prevoditelja po kanalu, a ne globalno",
  1610. language_choice_input_received: "Jezik unosa u primljenim porukama",
  1611. language_choice_input_sent: "Jezik unosa u vaše poslane poruke",
  1612. language_choice_output_received: "Izlazni jezik u primljenim porukama",
  1613. language_choice_output_sent: "Izlazni jezik u vašim poslanim porukama",
  1614. language_selection_channel: "Odabir jezika bit će promijenjen posebno za ovaj kanal",
  1615. language_selection_global: "Odabir jezika bit će promijenjen za sve poslužitelje",
  1616. language_selection_server: "Odabir jezika bit će promijenjen posebno za ovaj poslužitelj",
  1617. popout_translateoption: "Prevedi",
  1618. popout_untranslateoption: "Neprevedi",
  1619. toast_translating: "Prevođenje",
  1620. toast_translating_failed: "Prijevod nije uspio",
  1621. toast_translating_tryanother: "Pokušajte s drugim prevoditeljem",
  1622. translate_your_message: "Prevedite svoje poruke prije slanja",
  1623. translated_watermark: "prevedeno",
  1624. translator_engine: "Prevoditelj"
  1625. };
  1626. case "hu": // Hungarian
  1627. return {
  1628. backup_engine: "Backup-Fordító",
  1629. backup_engine_warning: "A Backup-Fordító programot fogja használni",
  1630. context_messagetranslateoption: "Üzenet lefordítása",
  1631. context_messageuntranslateoption: "Az üzenet lefordítása",
  1632. context_translator: "Keresés a fordításban",
  1633. detect_language: "Nyelvfelismerés",
  1634. error_dailylimit: "Elérte a napi igénylési korlátot.",
  1635. error_hourlylimit: "Elérte az óránkénti igénylési korlátot.",
  1636. error_keyoutdated: "API-kulcs elavult.",
  1637. error_monthlylimit: "Elérte a havi igénylési limitet.",
  1638. error_serverdown: "Lehet, hogy a Fordítószerver offline állapotban van.",
  1639. exception_text: "A(z) {{var0}} kezdetű szavak figyelmen kívül maradnak",
  1640. general_addTranslateButton: "Fordítási gombot ad a csatorna szövegterületéhez",
  1641. general_sendOriginalMessage: "Az eredeti üzenetet is elküldi az elküldött üzenet fordítása során",
  1642. general_showOriginalMessage: "A fogadott üzenet lefordításakor az eredeti üzenetet is megjeleníti",
  1643. general_usePerChatTranslation: "Engedélyezi/letiltja a Fordító gomb állapotát csatornánként, nem pedig globálisan",
  1644. language_choice_input_received: "Beviteli nyelv a fogadott üzenetekben",
  1645. language_choice_input_sent: "Írja be a nyelvet az elküldött üzenetekben",
  1646. language_choice_output_received: "Kimeneti nyelv a fogadott üzenetekben",
  1647. language_choice_output_sent: "Kimeneti nyelv az elküldött üzenetekben",
  1648. language_selection_channel: "A nyelvválasztás kifejezetten ehhez a csatornához fog módosulni",
  1649. language_selection_global: "A nyelv kiválasztása minden szerveren módosul",
  1650. language_selection_server: "A nyelvválasztás kifejezetten ehhez a szerverhez módosul",
  1651. popout_translateoption: "fordít",
  1652. popout_untranslateoption: "Fordítás le",
  1653. toast_translating: "Fordítás",
  1654. toast_translating_failed: "Nem sikerült lefordítani",
  1655. toast_translating_tryanother: "Próbálkozzon másik fordítóval",
  1656. translate_your_message: "Küldés előtt fordítsa le az üzeneteit",
  1657. translated_watermark: "lefordított",
  1658. translator_engine: "Fordító"
  1659. };
  1660. case "it": // Italian
  1661. return {
  1662. backup_engine: "Backup-Traduttore",
  1663. backup_engine_warning: "Utilizzerà Backup-Traduttore",
  1664. context_messagetranslateoption: "Traduci messaggio",
  1665. context_messageuntranslateoption: "Annulla traduzione messaggio",
  1666. context_translator: "Cerca traduzione",
  1667. detect_language: "Rileva lingua",
  1668. error_dailylimit: "Limite di richieste giornaliere raggiunto.",
  1669. error_hourlylimit: "Limite di richiesta oraria raggiunto.",
  1670. error_keyoutdated: "Chiave API obsoleta.",
  1671. error_monthlylimit: "Limite di richieste mensili raggiunto.",
  1672. error_serverdown: "Il server di traduzione potrebbe essere offline.",
  1673. exception_text: "Le parole che iniziano con {{var0}} verranno ignorate",
  1674. general_addTranslateButton: "Aggiunge un pulsante Traduci all'area di testo del canale",
  1675. general_sendOriginalMessage: "Invia anche il messaggio originale durante la traduzione del messaggio inviato",
  1676. general_showOriginalMessage: "Mostra anche il messaggio originale durante la traduzione di un messaggio ricevuto",
  1677. general_usePerChatTranslation: "Abilita/disabilita lo stato del pulsante Translator per canale e non globalmente",
  1678. language_choice_input_received: "Lingua di input nei messaggi ricevuti",
  1679. language_choice_input_sent: "Inserisci la lingua nei tuoi messaggi inviati",
  1680. language_choice_output_received: "Lingua di output nei messaggi ricevuti",
  1681. language_choice_output_sent: "Lingua di output nei messaggi inviati",
  1682. language_selection_channel: "La selezione della lingua verrà modificata in modo specifico per questo canale",
  1683. language_selection_global: "La selezione della lingua verrà modificata per tutti i server",
  1684. language_selection_server: "La selezione della lingua verrà modificata in modo specifico per questo server",
  1685. popout_translateoption: "Tradurre",
  1686. popout_untranslateoption: "Non tradurre",
  1687. toast_translating: "Tradurre",
  1688. toast_translating_failed: "Impossibile tradurre",
  1689. toast_translating_tryanother: "Prova un altro traduttore",
  1690. translate_your_message: "Traduci i tuoi messaggi prima di inviarli",
  1691. translated_watermark: "tradotto",
  1692. translator_engine: "Traduttore"
  1693. };
  1694. case "ja": // Japanese
  1695. return {
  1696. backup_engine: "バックアップ翻訳者",
  1697. backup_engine_warning: "バックアップ翻訳者 を使用します",
  1698. context_messagetranslateoption: "メッセージの翻訳",
  1699. context_messageuntranslateoption: "メッセージの翻訳解除",
  1700. context_translator: "翻訳を検索",
  1701. detect_language: "言語を検出",
  1702. error_dailylimit: "1 日のリクエスト上限に達しました。",
  1703. error_hourlylimit: "1 時間あたりのリクエスト制限に達しました。",
  1704. error_keyoutdated: "API キーが古くなっています。",
  1705. error_monthlylimit: "月間リクエスト制限に達しました。",
  1706. error_serverdown: "翻訳サーバーがオフラインになっている可能性があります。",
  1707. exception_text: "{{var0}} で始まる単語は無視されます",
  1708. general_addTranslateButton: "チャンネルのテキストエリアに翻訳ボタンを追加します",
  1709. general_sendOriginalMessage: "送信したメッセージを翻訳するときに元のメッセージも送信します",
  1710. general_showOriginalMessage: "受信したメッセージを翻訳するときに元のメッセージも表示します",
  1711. general_usePerChatTranslation: "グローバルではなく、チャネルごとに翻訳者ボタンの状態を有効/無効にします",
  1712. language_choice_input_received: "受信メッセージの入力言語",
  1713. language_choice_input_sent: "送信メッセージの入力言語",
  1714. language_choice_output_received: "受信メッセージの出力言語",
  1715. language_choice_output_sent: "送信メッセージの出力言語",
  1716. language_selection_channel: "言語の選択は、このチャンネル専用に変更されます",
  1717. language_selection_global: "すべてのサーバーの言語選択が変更されます",
  1718. language_selection_server: "言語の選択は、このサーバー専用に変更されます",
  1719. popout_translateoption: "翻訳する",
  1720. popout_untranslateoption: "翻訳しない",
  1721. toast_translating: "翻訳",
  1722. toast_translating_failed: "翻訳に失敗しました",
  1723. toast_translating_tryanother: "別の翻訳者を試す",
  1724. translate_your_message: "送信する前にメッセージを翻訳する",
  1725. translated_watermark: "翻訳済み",
  1726. translator_engine: "翻訳者"
  1727. };
  1728. case "ko": // Korean
  1729. return {
  1730. backup_engine: "백업 번역기",
  1731. backup_engine_warning: "백업 번역기를 사용합니다",
  1732. context_messagetranslateoption: "메시지 번역",
  1733. context_messageuntranslateoption: "메시지 번역 취소",
  1734. context_translator: "번역 검색",
  1735. detect_language: "언어를 감지",
  1736. error_dailylimit: "일일 요청 한도에 도달했습니다.",
  1737. error_hourlylimit: "시간당 요청 한도에 도달했습니다.",
  1738. error_keyoutdated: "API 키가 오래되었습니다.",
  1739. error_monthlylimit: "월간 요청 한도에 도달했습니다.",
  1740. error_serverdown: "번역 서버가 오프라인일 수 있습니다.",
  1741. exception_text: "{{var0}}로 시작하는 단어는 무시됩니다.",
  1742. general_addTranslateButton: "채널 텍스트 영역에 번역 버튼 추가",
  1743. general_sendOriginalMessage: "또한 보낸 메시지를 번역할 때 원본 메시지를 보냅니다.",
  1744. general_showOriginalMessage: "또한 수신된 메시지를 번역할 때 원본 메시지를 표시합니다.",
  1745. general_usePerChatTranslation: "전역이 아닌 채널별로 번역기 버튼 상태를 활성화/비활성화합니다.",
  1746. language_choice_input_received: "수신된 메시지의 입력 언어",
  1747. language_choice_input_sent: "보낸 메시지의 입력 언어",
  1748. language_choice_output_received: "수신된 메시지의 출력 언어",
  1749. language_choice_output_sent: "보낸 메시지의 출력 언어",
  1750. language_selection_channel: "이 채널에 대해 특별히 언어 선택이 변경됩니다.",
  1751. language_selection_global: "모든 서버에 대해 언어 선택이 변경됩니다.",
  1752. language_selection_server: "이 서버에 대해 특별히 언어 선택이 변경됩니다.",
  1753. popout_translateoption: "옮기다",
  1754. popout_untranslateoption: "번역 취소",
  1755. toast_translating: "번역 중",
  1756. toast_translating_failed: "번역하지 못했습니다.",
  1757. toast_translating_tryanother: "다른 번역기 시도",
  1758. translate_your_message: "보내기 전에 메시지 번역",
  1759. translated_watermark: "번역",
  1760. translator_engine: "역자"
  1761. };
  1762. case "lt": // Lithuanian
  1763. return {
  1764. backup_engine: "Backup-Vertėjas",
  1765. backup_engine_warning: "Naudos Backup-Vertėjas",
  1766. context_messagetranslateoption: "Versti pranešimą",
  1767. context_messageuntranslateoption: "Išversti pranešimą",
  1768. context_translator: "Paieškos vertimas",
  1769. detect_language: "Aptikti kalbą",
  1770. error_dailylimit: "Pasiektas dienos užklausų limitas.",
  1771. error_hourlylimit: "Pasiektas valandinių užklausų limitas.",
  1772. error_keyoutdated: "API raktas pasenęs.",
  1773. error_monthlylimit: "Pasiektas mėnesio užklausų limitas.",
  1774. error_serverdown: "Vertimo serveris gali būti neprisijungęs.",
  1775. exception_text: "Žodžiai, prasidedantys {{var0}}, bus ignoruojami",
  1776. general_addTranslateButton: "Prie kanalo teksto srities pridedamas vertimo mygtukas",
  1777. general_sendOriginalMessage: "Taip pat siunčia originalų pranešimą verčiant jūsų išsiųstą žinutę",
  1778. general_showOriginalMessage: "Taip pat rodomas pradinis pranešimas, kai verčiamas gautas pranešimas",
  1779. general_usePerChatTranslation: "Įjungia / išjungia Vertėjo mygtuko būseną kiekvienam kanalui, o ne visame pasaulyje",
  1780. language_choice_input_received: "Įvesties kalba gautuose pranešimuose",
  1781. language_choice_input_sent: "Įveskite kalbą siunčiamuose pranešimuose",
  1782. language_choice_output_received: "Išvesties kalba gautuose pranešimuose",
  1783. language_choice_output_sent: "Išvesties kalba jūsų išsiųstuose pranešimuose",
  1784. language_selection_channel: "Kalbos pasirinkimas bus pakeistas specialiai šiam kanalui",
  1785. language_selection_global: "Kalbos pasirinkimas bus pakeistas visiems serveriams",
  1786. language_selection_server: "Kalbos pasirinkimas bus pakeistas specialiai šiam serveriui",
  1787. popout_translateoption: "Išversti",
  1788. popout_untranslateoption: "Neišversti",
  1789. toast_translating: "Vertimas",
  1790. toast_translating_failed: "Nepavyko išversti",
  1791. toast_translating_tryanother: "Išbandykite kitą vertėją",
  1792. translate_your_message: "Prieš siųsdami išverskite savo pranešimus",
  1793. translated_watermark: "išverstas",
  1794. translator_engine: "Vertėjas"
  1795. };
  1796. case "nl": // Dutch
  1797. return {
  1798. backup_engine: "Backup-Vertaler",
  1799. backup_engine_warning: "Zal Backup-Vertaler gebruiken",
  1800. context_messagetranslateoption: "Bericht vertalen",
  1801. context_messageuntranslateoption: "Bericht onvertalen",
  1802. context_translator: "Zoek vertaling",
  1803. detect_language: "Taal detecteren",
  1804. error_dailylimit: "Dagelijkse verzoeklimiet bereikt.",
  1805. error_hourlylimit: "Verzoeklimiet per uur bereikt.",
  1806. error_keyoutdated: "API-sleutel verouderd.",
  1807. error_monthlylimit: "Maandelijkse aanvraaglimiet bereikt.",
  1808. error_serverdown: "Vertaalserver is mogelijk offline.",
  1809. exception_text: "Woorden die beginnen met {{var0}} worden genegeerd",
  1810. general_addTranslateButton: "Voegt een vertaalknop toe aan het kanaaltekstgebied",
  1811. general_sendOriginalMessage: "Verzendt ook het originele bericht bij het vertalen van uw verzonden bericht",
  1812. general_showOriginalMessage: "Toont ook het originele bericht bij het vertalen van een ontvangen bericht",
  1813. general_usePerChatTranslation: "Schakelt de status van de vertaalknop in/uit per kanaal en niet globaal",
  1814. language_choice_input_received: "Invoertaal in ontvangen berichten",
  1815. language_choice_input_sent: "Invoertaal in uw verzonden berichten",
  1816. language_choice_output_received: "Uitvoertaal in ontvangen berichten",
  1817. language_choice_output_sent: "Uitvoertaal in uw verzonden berichten",
  1818. language_selection_channel: "De taalselectie wordt specifiek voor dit kanaal gewijzigd",
  1819. language_selection_global: "Taalkeuze wordt voor alle servers gewijzigd",
  1820. language_selection_server: "Taalselectie wordt specifiek voor deze server gewijzigd",
  1821. popout_translateoption: "Vertalen",
  1822. popout_untranslateoption: "Onvertalen",
  1823. toast_translating: "Vertalen",
  1824. toast_translating_failed: "Kan niet vertalen",
  1825. toast_translating_tryanother: "Probeer een andere vertaler",
  1826. translate_your_message: "Vertaal uw berichten voordat u ze verzendt",
  1827. translated_watermark: "vertaald",
  1828. translator_engine: "Vertaler"
  1829. };
  1830. case "no": // Norwegian
  1831. return {
  1832. backup_engine: "Backup-Oversetter",
  1833. backup_engine_warning: "Vil bruke Backup-Oversetter",
  1834. context_messagetranslateoption: "Oversett melding",
  1835. context_messageuntranslateoption: "Ikke oversett melding",
  1836. context_translator: "Søk i oversettelse",
  1837. detect_language: "Oppdage språk",
  1838. error_dailylimit: "Daglig forespørselsgrense nådd.",
  1839. error_hourlylimit: "Forespørselsgrensen for time nådd.",
  1840. error_keyoutdated: "API-nøkkel utdatert.",
  1841. error_monthlylimit: "Månedlig forespørselsgrense nådd.",
  1842. error_serverdown: "Oversettelsesserveren kan være frakoblet.",
  1843. exception_text: "Ord som begynner med {{var0}} vil bli ignorert",
  1844. general_addTranslateButton: "Legger til en oversettknapp til kanaltekstområdet",
  1845. general_sendOriginalMessage: "Sender også den originale meldingen når du oversetter den sendte meldingen",
  1846. general_showOriginalMessage: "Viser også den originale meldingen når du oversetter en mottatt melding",
  1847. general_usePerChatTranslation: "Aktiverer/deaktiverer oversetterknappens tilstand per kanal og ikke globalt",
  1848. language_choice_input_received: "Inndataspråk i mottatte meldinger",
  1849. language_choice_input_sent: "Inntastingsspråk i sendte meldinger",
  1850. language_choice_output_received: "Utdataspråk i mottatte meldinger",
  1851. language_choice_output_sent: "Utdataspråk i dine sendte meldinger",
  1852. language_selection_channel: "Språkvalg vil bli endret spesifikt for denne kanalen",
  1853. language_selection_global: "Språkvalg vil bli endret for alle servere",
  1854. language_selection_server: "Språkvalg vil bli endret spesifikt for denne serveren",
  1855. popout_translateoption: "Oversette",
  1856. popout_untranslateoption: "Ikke oversett",
  1857. toast_translating: "Oversetter",
  1858. toast_translating_failed: "Kunne ikke oversette",
  1859. toast_translating_tryanother: "Prøv en annen oversetter",
  1860. translate_your_message: "Oversett meldingene dine før sending",
  1861. translated_watermark: "oversatt",
  1862. translator_engine: "Oversetter"
  1863. };
  1864. case "pl": // Polish
  1865. return {
  1866. backup_engine: "Backup-Tłumacz",
  1867. backup_engine_warning: "Użyje Backup-Tłumacz",
  1868. context_messagetranslateoption: "Przetłumacz wiadomość",
  1869. context_messageuntranslateoption: "Nieprzetłumacz wiadomość",
  1870. context_translator: "Wyszukaj tłumaczenie",
  1871. detect_language: "Wykryj język",
  1872. error_dailylimit: "Osiągnięto dzienny limit żądań.",
  1873. error_hourlylimit: "Osiągnięto godzinowy limit żądań.",
  1874. error_keyoutdated: "Klucz API jest nieaktualny.",
  1875. error_monthlylimit: "Osiągnięto miesięczny limit żądań.",
  1876. error_serverdown: "Serwer tłumaczeń może być w trybie offline.",
  1877. exception_text: "Słowa zaczynające się od {{var0}} będą ignorowane",
  1878. general_addTranslateButton: "Dodaje przycisk Tłumacz do obszaru tekstowego kanału",
  1879. general_sendOriginalMessage: "Wysyła również oryginalną wiadomość podczas tłumaczenia wysłanej wiadomości",
  1880. general_showOriginalMessage: "Pokazuje również oryginalną wiadomość podczas tłumaczenia otrzymanej wiadomości",
  1881. general_usePerChatTranslation: "Włącza/wyłącza stan przycisku translatora na kanał, a nie globalnie",
  1882. language_choice_input_received: "Język wprowadzania w odebranych wiadomościach",
  1883. language_choice_input_sent: "Język wprowadzania w wysyłanych wiadomościach",
  1884. language_choice_output_received: "Język wyjściowy w odebranych wiadomościach",
  1885. language_choice_output_sent: "Język wyjściowy w wysłanych wiadomościach",
  1886. language_selection_channel: "Wybór języka zostanie zmieniony specjalnie dla tego kanału",
  1887. language_selection_global: "Wybór języka zostanie zmieniony dla wszystkich serwerów",
  1888. language_selection_server: "Wybór języka zostanie zmieniony specjalnie dla tego serwera",
  1889. popout_translateoption: "Tłumaczyć",
  1890. popout_untranslateoption: "Nie przetłumacz",
  1891. toast_translating: "Tłumaczenie",
  1892. toast_translating_failed: "Nie udało się przetłumaczyć",
  1893. toast_translating_tryanother: "Wypróbuj innego tłumacza",
  1894. translate_your_message: "Przetłumacz swoje wiadomości przed wysłaniem",
  1895. translated_watermark: "przetłumaczony",
  1896. translator_engine: "Tłumacz"
  1897. };
  1898. case "pt-BR": // Portuguese (Brazil)
  1899. return {
  1900. backup_engine: "Backup-Tradutor",
  1901. backup_engine_warning: "Usará o Backup-Tradutor",
  1902. context_messagetranslateoption: "Traduzir mensagem",
  1903. context_messageuntranslateoption: "Mensagem não traduzida",
  1904. context_translator: "Tradução de pesquisa",
  1905. detect_language: "Detectar idioma",
  1906. error_dailylimit: "Limite de solicitações diárias atingido.",
  1907. error_hourlylimit: "Limite de solicitação por hora atingido.",
  1908. error_keyoutdated: "Chave de API desatualizada.",
  1909. error_monthlylimit: "Limite de solicitação mensal atingido.",
  1910. error_serverdown: "O servidor de tradução pode estar offline.",
  1911. exception_text: "Palavras que começam com {{var0}} serão ignoradas",
  1912. general_addTranslateButton: "Adiciona um botão de tradução à área de texto do canal",
  1913. general_sendOriginalMessage: "Também envia a Mensagem original ao traduzir sua Mensagem enviada",
  1914. general_showOriginalMessage: "Também mostra a Mensagem original ao traduzir uma Mensagem recebida",
  1915. general_usePerChatTranslation: "Habilita/desabilita o estado do botão do tradutor por canal e não globalmente",
  1916. language_choice_input_received: "Idioma de entrada nas mensagens recebidas",
  1917. language_choice_input_sent: "Idioma de entrada em suas mensagens enviadas",
  1918. language_choice_output_received: "Idioma de saída nas mensagens recebidas",
  1919. language_choice_output_sent: "Idioma de saída em suas mensagens enviadas",
  1920. language_selection_channel: "A seleção de idioma será alterada especificamente para este canal",
  1921. language_selection_global: "A seleção de idioma será alterada para todos os servidores",
  1922. language_selection_server: "A seleção de idioma será alterada especificamente para este servidor",
  1923. popout_translateoption: "Traduzir",
  1924. popout_untranslateoption: "Não traduzido",
  1925. toast_translating: "Traduzindo",
  1926. toast_translating_failed: "Falha ao traduzir",
  1927. toast_translating_tryanother: "Tente outro tradutor",
  1928. translate_your_message: "Traduza suas mensagens antes de enviar",
  1929. translated_watermark: "traduzido",
  1930. translator_engine: "Tradutor"
  1931. };
  1932. case "ro": // Romanian
  1933. return {
  1934. backup_engine: "Backup-Traducător",
  1935. backup_engine_warning: "Va folosi Backup-Traducător",
  1936. context_messagetranslateoption: "Traduceți mesajul",
  1937. context_messageuntranslateoption: "Untraduceți mesajul",
  1938. context_translator: "Căutare traducere",
  1939. detect_language: "Detecteaza limba",
  1940. error_dailylimit: "Limita zilnică de solicitare a fost atinsă.",
  1941. error_hourlylimit: "Limita orară de solicitare a fost atinsă.",
  1942. error_keyoutdated: "API-Key este învechită.",
  1943. error_monthlylimit: "Limita lunară de solicitare a fost atinsă.",
  1944. error_serverdown: "Serverul de traducere ar putea fi offline.",
  1945. exception_text: "Cuvintele care încep cu {{var0}} vor fi ignorate",
  1946. general_addTranslateButton: "Adaugă un buton de traducere în zona de text a canalului",
  1947. general_sendOriginalMessage: "De asemenea, trimite mesajul original atunci când traduceți mesajul trimis",
  1948. general_showOriginalMessage: "Afișează, de asemenea, mesajul original atunci când traduceți un mesaj primit",
  1949. general_usePerChatTranslation: "Activează/dezactivează starea butonului de traducător pe canal și nu la nivel global",
  1950. language_choice_input_received: "Limba de intrare în mesajele primite",
  1951. language_choice_input_sent: "Introduceți limba în mesajele trimise",
  1952. language_choice_output_received: "Limba de ieșire în mesajele primite",
  1953. language_choice_output_sent: "Limba de ieșire în mesajele trimise",
  1954. language_selection_channel: "Selectarea limbii va fi modificată special pentru acest canal",
  1955. language_selection_global: "Selectarea limbii va fi modificată pentru toate serverele",
  1956. language_selection_server: "Selectarea limbii va fi modificată special pentru acest Server",
  1957. popout_translateoption: "Traduceți",
  1958. popout_untranslateoption: "Netradus",
  1959. toast_translating: "Traducere",
  1960. toast_translating_failed: "Nu s-a putut traduce",
  1961. toast_translating_tryanother: "Încercați un alt traducător",
  1962. translate_your_message: "Traduceți mesajele înainte de a le trimite",
  1963. translated_watermark: "tradus",
  1964. translator_engine: "Traducător"
  1965. };
  1966. case "ru": // Russian
  1967. return {
  1968. backup_engine: "Резервный-Переводчик",
  1969. backup_engine_warning: "Буду использовать Резервный-Переводчик",
  1970. context_messagetranslateoption: "Перевести сообщение",
  1971. context_messageuntranslateoption: "Непереведенное сообщение",
  1972. context_translator: "Искать перевод",
  1973. detect_language: "Определить язык",
  1974. error_dailylimit: "Достигнут дневной лимит запросов.",
  1975. error_hourlylimit: "Достигнут лимит почасовых запросов.",
  1976. error_keyoutdated: "API-ключ устарел.",
  1977. error_monthlylimit: "Достигнут месячный лимит запросов.",
  1978. error_serverdown: "Сервер переводов может быть отключен.",
  1979. exception_text: "Слова, начинающиеся с {{var0}}, будут игнорироваться.",
  1980. general_addTranslateButton: "Добавляет кнопку перевода в текстовую область канала",
  1981. general_sendOriginalMessage: "Также отправляет исходное сообщение при переводе отправленного сообщения.",
  1982. general_showOriginalMessage: "Также показывает исходное сообщение при переводе полученного сообщения.",
  1983. general_usePerChatTranslation: "Включает/отключает состояние кнопки переводчика для каждого канала, а не глобально",
  1984. language_choice_input_received: "Язык ввода в полученных сообщениях",
  1985. language_choice_input_sent: "Язык ввода в ваших отправленных сообщениях",
  1986. language_choice_output_received: "Язык вывода в полученных сообщениях",
  1987. language_choice_output_sent: "Язык вывода в ваших отправленных сообщениях",
  1988. language_selection_channel: "Выбор языка будет изменен специально для этого канала.",
  1989. language_selection_global: "Выбор языка будет изменен для всех серверов.",
  1990. language_selection_server: "Выбор языка будет изменен специально для этого сервера",
  1991. popout_translateoption: "Переведите",
  1992. popout_untranslateoption: "Неперевести",
  1993. toast_translating: "Идет перевод",
  1994. toast_translating_failed: "Не удалось перевести",
  1995. toast_translating_tryanother: "Попробуйте другой переводчик",
  1996. translate_your_message: "Переводите свои сообщения перед отправкой",
  1997. translated_watermark: "переведено",
  1998. translator_engine: "Переводчик"
  1999. };
  2000. case "sv": // Swedish
  2001. return {
  2002. backup_engine: "Backup-Översättare",
  2003. backup_engine_warning: "Kommer att använda Backup-Översättare",
  2004. context_messagetranslateoption: "Översätt meddelande",
  2005. context_messageuntranslateoption: "Untranslate meddelande",
  2006. context_translator: "Sök översättning",
  2007. detect_language: "Upptäck språk",
  2008. error_dailylimit: "Daglig förfrågningsgräns nådd.",
  2009. error_hourlylimit: "Begäran per timme nådd.",
  2010. error_keyoutdated: "API-nyckel föråldrad.",
  2011. error_monthlylimit: "Gränsen för månatlig begäran har nåtts.",
  2012. error_serverdown: "Översättningsservern kan vara offline.",
  2013. exception_text: "Ord som börjar med {{var0}} kommer att ignoreras",
  2014. general_addTranslateButton: "Lägger till en Översätt-knapp i kanaltextområdet",
  2015. general_sendOriginalMessage: "Skickar också det ursprungliga meddelandet när du översätter ditt skickade meddelande",
  2016. general_showOriginalMessage: "Visar även det ursprungliga meddelandet när ett mottaget meddelande översätts",
  2017. general_usePerChatTranslation: "Aktiverar/inaktiverar översättarknappens status per kanal och inte globalt",
  2018. language_choice_input_received: "Inmatningsspråk i mottagna meddelanden",
  2019. language_choice_input_sent: "Inmatningsspråk i dina skickade meddelanden",
  2020. language_choice_output_received: "Utmatningsspråk i mottagna meddelanden",
  2021. language_choice_output_sent: "Utmatningsspråk i dina skickade meddelanden",
  2022. language_selection_channel: "Språkval kommer att ändras specifikt för denna kanal",
  2023. language_selection_global: "Språkval kommer att ändras för alla servrar",
  2024. language_selection_server: "Språkval kommer att ändras specifikt för denna server",
  2025. popout_translateoption: "Översätt",
  2026. popout_untranslateoption: "Untranslate",
  2027. toast_translating: "Översätter",
  2028. toast_translating_failed: "Det gick inte att översätta",
  2029. toast_translating_tryanother: "Prova en annan översättare",
  2030. translate_your_message: "Översätt dina meddelanden innan du skickar",
  2031. translated_watermark: "översatt",
  2032. translator_engine: "Översättare"
  2033. };
  2034. case "th": // Thai
  2035. return {
  2036. backup_engine: "สำรอง-นักแปล",
  2037. backup_engine_warning: "จะใช้การสำรองข้อมูล-นักแปล",
  2038. context_messagetranslateoption: "แปลข้อความ",
  2039. context_messageuntranslateoption: "ยกเลิกการแปลข้อความ",
  2040. context_translator: "ค้นหาคำแปล",
  2041. detect_language: "ตรวจจับภาษา",
  2042. error_dailylimit: "ถึงขีดจำกัดคำขอรายวันแล้ว",
  2043. error_hourlylimit: "ถึงขีดจำกัดคำขอรายชั่วโมงแล้ว",
  2044. error_keyoutdated: "API-Key ล้าสมัยแล้ว",
  2045. error_monthlylimit: "ถึงขีดจำกัดคำขอรายเดือนแล้ว",
  2046. error_serverdown: "เซิร์ฟเวอร์การแปลอาจออฟไลน์อยู่",
  2047. exception_text: "คำที่ขึ้นต้นด้วย {{var0}} จะถูกละเว้น",
  2048. general_addTranslateButton: "เพิ่มปุ่มแปลภาษาไปยัง Textarea ของช่อง",
  2049. general_sendOriginalMessage: "ส่งข้อความต้นฉบับเมื่อแปลข้อความที่ส่งของคุณ",
  2050. general_showOriginalMessage: "ยังแสดงข้อความต้นฉบับเมื่อแปลข้อความที่ได้รับ",
  2051. general_usePerChatTranslation: "เปิด/ปิดสถานะปุ่มนักแปลต่อช่องและไม่ใช่ทั่วโลก",
  2052. language_choice_input_received: "ป้อนภาษาในข้อความที่ได้รับ",
  2053. language_choice_input_sent: "ป้อนภาษาในข้อความที่คุณส่ง",
  2054. language_choice_output_received: "ภาษาเอาต์พุตในข้อความที่ได้รับ",
  2055. language_choice_output_sent: "ภาษาที่ส่งออกในข้อความที่ส่งของคุณ",
  2056. language_selection_channel: "การเลือกภาษาจะมีการเปลี่ยนแปลงเฉพาะสำหรับช่องนี้",
  2057. language_selection_global: "การเลือกภาษาจะมีการเปลี่ยนแปลงสำหรับเซิร์ฟเวอร์ทั้งหมด",
  2058. language_selection_server: "การเลือกภาษาจะมีการเปลี่ยนแปลงโดยเฉพาะสำหรับเซิร์ฟเวอร์นี้",
  2059. popout_translateoption: "แปลภาษา",
  2060. popout_untranslateoption: "ไม่แปล",
  2061. toast_translating: "กำลังแปล",
  2062. toast_translating_failed: "แปลไม่สำเร็จ",
  2063. toast_translating_tryanother: "ลองใช้นักแปลคนอื่น",
  2064. translate_your_message: "แปลข้อความของคุณก่อนส่ง",
  2065. translated_watermark: "แปล",
  2066. translator_engine: "นักแปล"
  2067. };
  2068. case "tr": // Turkish
  2069. return {
  2070. backup_engine: "Yedekleme-Çevirmen",
  2071. backup_engine_warning: "Yedekleme-Çevirmen kullanacak",
  2072. context_messagetranslateoption: "Mesajı Çevir",
  2073. context_messageuntranslateoption: "Çeviriyi Kaldır Mesajı",
  2074. context_translator: "Çeviri ara",
  2075. detect_language: "Dili Algıla",
  2076. error_dailylimit: "Günlük İstek Sınırına ulaşıldı.",
  2077. error_hourlylimit: "Saatlik İstek Sınırına ulaşıldı.",
  2078. error_keyoutdated: "API Anahtarı güncel değil.",
  2079. error_monthlylimit: "Aylık İstek Sınırına ulaşıldı.",
  2080. error_serverdown: "Çeviri Sunucusu çevrimdışı olabilir.",
  2081. exception_text: "{{var0}} ile başlayan kelimeler yok sayılacak",
  2082. general_addTranslateButton: "Kanal Metin Alanına Çevir Düğmesi Ekler",
  2083. general_sendOriginalMessage: "Gönderilen Mesajınızı çevirirken orijinal Mesajı da gönderir",
  2084. general_showOriginalMessage: "Alınan bir Mesajı tercüme ederken orijinal Mesajı da gösterir.",
  2085. general_usePerChatTranslation: "Genel olarak değil, Kanal başına Çevirmen Düğmesi Durumunu Etkinleştirir/Devre Dışı Bırakır",
  2086. language_choice_input_received: "Alınan Mesajlarda Giriş Dili",
  2087. language_choice_input_sent: "Gönderilen Mesajlarınızda Dil Girin",
  2088. language_choice_output_received: "Alınan Mesajlarda Çıktı Dili",
  2089. language_choice_output_sent: "Gönderilen Mesajlarınızda Çıktı Dili",
  2090. language_selection_channel: "Dil Seçimi bu Kanal için özel olarak değiştirilecektir.",
  2091. language_selection_global: "Tüm Sunucular için Dil Seçimi değiştirilecek",
  2092. language_selection_server: "Dil Seçimi bu Sunucuya özel olarak değiştirilecektir.",
  2093. popout_translateoption: "Çevirmek",
  2094. popout_untranslateoption: "Çevirmeyi kaldır",
  2095. toast_translating: "Çeviri",
  2096. toast_translating_failed: "Tercüme edilemedi",
  2097. toast_translating_tryanother: "Başka bir Çevirmen deneyin",
  2098. translate_your_message: "Göndermeden önce Mesajlarınızı çevirin",
  2099. translated_watermark: "tercüme",
  2100. translator_engine: "Çevirmen"
  2101. };
  2102. case "uk": // Ukrainian
  2103. return {
  2104. backup_engine: "Резервний-перекладач",
  2105. backup_engine_warning: "Використовуватиме Резервний-Перекладач",
  2106. context_messagetranslateoption: "Перекласти повідомлення",
  2107. context_messageuntranslateoption: "Неперекладене повідомлення",
  2108. context_translator: "Пошук перекладу",
  2109. detect_language: "Визначити мову",
  2110. error_dailylimit: "Денний ліміт запитів досягнуто.",
  2111. error_hourlylimit: "Досягнуто погодинного ліміту запитів.",
  2112. error_keyoutdated: "API-ключ застарів.",
  2113. error_monthlylimit: "Досягнуто місячного ліміту запитів.",
  2114. error_serverdown: "Сервер перекладу може бути офлайн.",
  2115. exception_text: "Слова, що починаються з {{var0}}, ігноруватимуться",
  2116. general_addTranslateButton: "Додає кнопку перекладу до текстової області каналу",
  2117. general_sendOriginalMessage: "Також надсилає оригінальне повідомлення під час перекладу вашого надісланого повідомлення",
  2118. general_showOriginalMessage: "Також показує оригінальне повідомлення під час перекладу отриманого повідомлення",
  2119. general_usePerChatTranslation: "Вмикає/вимикає стан кнопки перекладача для кожного каналу, а не глобально",
  2120. language_choice_input_received: "Мова введення в отриманих повідомленнях",
  2121. language_choice_input_sent: "Мова введення у ваших надісланих повідомленнях",
  2122. language_choice_output_received: "Мова виводу в отриманих повідомленнях",
  2123. language_choice_output_sent: "Мова виведення у ваших надісланих повідомленнях",
  2124. language_selection_channel: "Вибір мови буде змінено спеціально для цього каналу",
  2125. language_selection_global: "Вибір мови буде змінено для всіх серверів",
  2126. language_selection_server: "Вибір мови буде змінено спеціально для цього сервера",
  2127. popout_translateoption: "Перекласти",
  2128. popout_untranslateoption: "Неперекласти",
  2129. toast_translating: "Переклад",
  2130. toast_translating_failed: "Не вдалося перекласти",
  2131. toast_translating_tryanother: "Спробуйте іншого перекладача",
  2132. translate_your_message: "Перекладіть свої повідомлення перед надсиланням",
  2133. translated_watermark: "переклав",
  2134. translator_engine: "Перекладач"
  2135. };
  2136. case "vi": // Vietnamese
  2137. return {
  2138. backup_engine: "Backup-Gười phiên dịch",
  2139. backup_engine_warning: "Sẽ sử dụng Backup-Gười phiên dịch",
  2140. context_messagetranslateoption: "Dịch tin nhắn",
  2141. context_messageuntranslateoption: "Thư chưa dịch",
  2142. context_translator: "Tìm kiếm bản dịch",
  2143. detect_language: "Phát hiện ngôn ngữ",
  2144. error_dailylimit: "Đã đạt đến Giới hạn Yêu cầu Hàng ngày.",
  2145. error_hourlylimit: "Đã đạt đến Giới hạn Yêu cầu Hàng giờ.",
  2146. error_keyoutdated: "API-Key đã lỗi thời.",
  2147. error_monthlylimit: "Đã đạt đến Giới hạn Yêu cầu Hàng tháng.",
  2148. error_serverdown: "Máy chủ dịch có thể ngoại tuyến.",
  2149. exception_text: "Các từ bắt đầu bằng {{var0}} sẽ bị bỏ qua",
  2150. general_addTranslateButton: "Thêm nút dịch vào vùng văn bản của kênh",
  2151. general_sendOriginalMessage: "Đồng thời gửi Tin nhắn gốc khi dịch Tin nhắn đã gửi của bạn",
  2152. general_showOriginalMessage: "Đồng thời hiển thị Tin nhắn gốc khi dịch một Tin nhắn đã nhận",
  2153. general_usePerChatTranslation: "Bật / tắt Trạng thái nút dịch trên mỗi kênh và không bật trên toàn cầu",
  2154. language_choice_input_received: "Nhập Ngôn ngữ trong Tin nhắn đã nhận",
  2155. language_choice_input_sent: "Nhập Ngôn ngữ trong Tin nhắn đã gửi của bạn",
  2156. language_choice_output_received: "Ngôn ngữ đầu ra trong Tin nhắn đã nhận",
  2157. language_choice_output_sent: "Ngôn ngữ đầu ra trong Tin nhắn đã gửi của bạn",
  2158. language_selection_channel: "Lựa chọn ngôn ngữ sẽ được thay đổi cụ thể cho Kênh này",
  2159. language_selection_global: "Lựa chọn ngôn ngữ sẽ được thay đổi cho tất cả các Máy chủ",
  2160. language_selection_server: "Lựa chọn ngôn ngữ sẽ được thay đổi cụ thể cho Máy chủ này",
  2161. popout_translateoption: "Phiên dịch",
  2162. popout_untranslateoption: "Chưa dịch",
  2163. toast_translating: "Phiên dịch",
  2164. toast_translating_failed: "Không dịch được",
  2165. toast_translating_tryanother: "Thử một Trình dịch khác",
  2166. translate_your_message: "Dịch Tin nhắn của bạn trước khi gửi",
  2167. translated_watermark: "đã dịch",
  2168. translator_engine: "Người phiên dịch"
  2169. };
  2170. case "zh-CN": // Chinese (China)
  2171. return {
  2172. backup_engine: "备份翻译器",
  2173. backup_engine_warning: "将使用备份翻译器",
  2174. context_messagetranslateoption: "翻译消息",
  2175. context_messageuntranslateoption: "取消翻译消息",
  2176. context_translator: "搜索翻译",
  2177. detect_language: "检测语言",
  2178. error_dailylimit: "已达到每日请求限制。",
  2179. error_hourlylimit: "已达到每小时请求限制。",
  2180. error_keyoutdated: "API 密钥已过时。",
  2181. error_monthlylimit: "已达到每月请求限制。",
  2182. error_serverdown: "翻译服务器可能离线。",
  2183. exception_text: "以 {{var0}} 开头的单词将被忽略",
  2184. general_addTranslateButton: "将翻译按钮添加到频道文本区域",
  2185. general_sendOriginalMessage: "翻译您发送的消息时也会发送原始消息",
  2186. general_showOriginalMessage: "翻译收到的消息时还显示原始消息",
  2187. general_usePerChatTranslation: "启用/禁用每个通道而不是全局的转换器按钮状态",
  2188. language_choice_input_received: "收到消息中的输入语言",
  2189. language_choice_input_sent: "在您发送的消息中输入语言",
  2190. language_choice_output_received: "接收消息中的输出语言",
  2191. language_choice_output_sent: "您发送的消息中的输出语言",
  2192. language_selection_channel: "将专门为此频道更改语言选择",
  2193. language_selection_global: "将更改所有服务器的语言选择",
  2194. language_selection_server: "语言选择将专门为此服务器更改",
  2195. popout_translateoption: "翻译",
  2196. popout_untranslateoption: "取消翻译",
  2197. toast_translating: "正在翻译",
  2198. toast_translating_failed: "翻译失败",
  2199. toast_translating_tryanother: "尝试其它翻译器",
  2200. translate_your_message: "发送前翻译您的消息",
  2201. translated_watermark: "已翻译",
  2202. translator_engine: "译者"
  2203. };
  2204. case "zh-TW": // Chinese (Taiwan)
  2205. return {
  2206. backup_engine: "備份翻譯器",
  2207. backup_engine_warning: "將使用備份翻譯器",
  2208. context_messagetranslateoption: "翻譯訊息",
  2209. context_messageuntranslateoption: "取消翻譯訊息",
  2210. context_translator: "搜尋翻譯",
  2211. detect_language: "檢測語言",
  2212. error_dailylimit: "已達到每日請求限制。",
  2213. error_hourlylimit: "已達到每小時請求限制。",
  2214. error_keyoutdated: "API 密鑰已過時。",
  2215. error_monthlylimit: "已達到每月請求限制。",
  2216. error_serverdown: "翻譯服務器可能離線。",
  2217. exception_text: "以 {{var0}} 開頭的單詞將被忽略",
  2218. general_addTranslateButton: "將翻譯按鈕添加到頻道文本區域",
  2219. general_sendOriginalMessage: "翻譯您發送的消息時也會發送原始消息",
  2220. general_showOriginalMessage: "翻譯收到的消息時還顯示原始消息",
  2221. general_usePerChatTranslation: "啟用/禁用每個通道而不是全局的轉換器按鈕狀態",
  2222. language_choice_input_received: "收到消息中的輸入語言",
  2223. language_choice_input_sent: "在您發送的消息中輸入語言",
  2224. language_choice_output_received: "接收消息中的輸出語言",
  2225. language_choice_output_sent: "您發送的消息中的輸出語言",
  2226. language_selection_channel: "將專門為此頻道更改語言選擇",
  2227. language_selection_global: "將更改所有服務器的語言選擇",
  2228. language_selection_server: "語言選擇將專門為此服務器更改",
  2229. popout_translateoption: "翻譯",
  2230. popout_untranslateoption: "取消翻譯",
  2231. toast_translating: "正在翻譯",
  2232. toast_translating_failed: "無法翻譯",
  2233. toast_translating_tryanother: "嘗試其它翻譯器",
  2234. translate_your_message: "發送前翻譯您的消息",
  2235. translated_watermark: "已翻譯",
  2236. translator_engine: "譯者"
  2237. };
  2238. default: // English
  2239. return {
  2240. backup_engine: "Backup-Translator",
  2241. backup_engine_warning: "Will use Backup-Translator",
  2242. context_messagetranslateoption: "Translate Message",
  2243. context_messageuntranslateoption: "Untranslate Message",
  2244. context_translator: "Search Translation",
  2245. detect_language: "Detect Language",
  2246. error_dailylimit: "Daily Request Limit reached.",
  2247. error_hourlylimit: "Hourly Request Limit reached.",
  2248. error_keyoutdated: "API-Key outdated.",
  2249. error_monthlylimit: "Monthly Request Limit reached.",
  2250. error_serverdown: "Translation Server might be offline.",
  2251. exception_text: "Words starting with {{var0}} will be ignored",
  2252. general_addTranslateButton: "Adds a Translate Button to the Channel Textarea",
  2253. general_sendOriginalMessage: "Also sends the original Message when translating your sent Message",
  2254. general_showOriginalMessage: "Also shows the original Message when translating a received Message",
  2255. general_usePerChatTranslation: "Enables/Disables the Translator Button State per Channel and not globally",
  2256. language_choice_input_received: "Input Language in received Messages",
  2257. language_choice_input_sent: "Input Language in your sent Messages",
  2258. language_choice_output_received: "Output Language in received Messages",
  2259. language_choice_output_sent: "Output Language in your sent Messages",
  2260. language_selection_channel: "Language Selection will be changed specifically for this Channel",
  2261. language_selection_global: "Language Selection will be changed for all Servers",
  2262. language_selection_server: "Language Selection will be changed specifically for this Server",
  2263. popout_translateoption: "Translate",
  2264. popout_untranslateoption: "Untranslate",
  2265. toast_translating: "Translating",
  2266. toast_translating_failed: "Failed to translate",
  2267. toast_translating_tryanother: "Try another Translator",
  2268. translate_your_message: "Translate your Messages before sending",
  2269. translated_watermark: "translated",
  2270. translator_engine: "Translator"
  2271. };
  2272. }
  2273. }
  2274. };
  2275. })(window.BDFDB_Global.PluginUtils.buildPlugin(changeLog));
  2276. })();

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/189444
推荐阅读
相关标签
  

闽ICP备14008679号