Greasy Fork 还支持 简体中文。

chatgpt-page-translate-button

🍓 let ChatGPT translate the web page you are reading in one click

目前為 2023-04-20 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name chatgpt-page-translate-button
  3. // @description 🍓 let ChatGPT translate the web page you are reading in one click
  4. // @author mefengl
  5. // @version 0.3.1
  6. // @namespace https://github.com/mefengl
  7. // @require https://cdn.jsdelivr.net/npm/@mozilla/readability@0.4.3/Readability.min.js
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=openai.com
  9. // @license MIT
  10. // @match *://*/*
  11. // @grant GM_setValue
  12. // @grant GM_getValue
  13. // @grant GM_registerMenuCommand
  14. // @grant GM_unregisterMenuCommand
  15. // @grant GM_addValueChangeListener
  16.  
  17. // @name:en ChatGPT Page Translate Button
  18. // @description:en 🍓 let ChatGPT translate the web page you are reading in one click
  19. // @name:zh-CN ChatGPT 页面翻译按钮
  20. // @description:zh-CN 🍓 让 ChatGPT 一键翻译您正在阅读的网页
  21. // @name:es Botón de traducción de página de ChatGPT
  22. // @description:es 🍓 permite que ChatGPT traduzca la página web que estás leyendo con un solo clic
  23. // @name:hi ChatGPT पृष्ठ अनुवाद बटन
  24. // @description:hi 🍓 ChatGPT को वेबपेज जो आप पढ़ रहे हैं को एक क्लिक में अनुवाद करने दें
  25. // @name:ar زر ترجمة الصفحة لـ ChatGPT
  26. // @description:ar 🍓 دع ChatGPT يترجم صفحة الويب التي تقرأها بنقرة واحدة
  27. // @name:pt Botão de tradução de página do ChatGPT
  28. // @description:pt 🍓 permita que o ChatGPT traduza a página da web que você está lendo com um clique
  29. // @name:ru Кнопка перевода страницы ChatGPT
  30. // @description:ru 🍓 позволяет ChatGPT переводить веб-страницу, которую вы читаете, одним щелчком мыши
  31. // @name:ja ChatGPTページ翻訳ボタン
  32. // @description:ja 🍓 ChatGPTで読んでいるWebページをワンクリックで翻訳
  33. // @name:de ChatGPT-Seitenübersetzungs-Button
  34. // @description:de 🍓 Lassen Sie ChatGPT die Webseite, die Sie gerade lesen, mit einem Klick übersetzen
  35. // @name:fr Bouton de traduction de page ChatGPT
  36. // @description:fr 🍓 laissez ChatGPT traduire la page Web que vous lisez en un seul clic
  37. // ==/UserScript==
  38. "use strict";
  39. (() => {
  40. var __async = (__this, __arguments, generator) => {
  41. return new Promise((resolve, reject) => {
  42. var fulfilled = (value) => {
  43. try {
  44. step(generator.next(value));
  45. } catch (e) {
  46. reject(e);
  47. }
  48. };
  49. var rejected = (value) => {
  50. try {
  51. step(generator.throw(value));
  52. } catch (e) {
  53. reject(e);
  54. }
  55. };
  56. var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
  57. step((generator = generator.apply(__this, __arguments)).next());
  58. });
  59. };
  60.  
  61. // ../../packages/chatkit/dist/index.mjs
  62. var __defProp = Object.defineProperty;
  63. var __export = (target, all) => {
  64. for (var name in all)
  65. __defProp(target, name, { get: all[name], enumerable: true });
  66. };
  67. var chatgpt_exports = {};
  68. __export(chatgpt_exports, {
  69. getConversation: () => getConversation,
  70. getLastResponse: () => getLastResponse,
  71. getLastResponseElement: () => getLastResponseElement,
  72. getModelSelectButton: () => getModelSelectButton,
  73. getRegenerateButton: () => getRegenerateButton,
  74. getStopGeneratingButton: () => getStopGeneratingButton,
  75. getSubmitButton: () => getSubmitButton,
  76. getTextareaValue: () => getTextareaValue,
  77. isConversationStarted: () => isConversationStarted,
  78. isGenerating: () => isGenerating,
  79. isHorizontalConversation: () => isHorizontalConversation,
  80. onSend: () => onSend,
  81. regenerate: () => regenerate,
  82. send: () => send,
  83. setHorizontalConversation: () => setHorizontalConversation,
  84. setPromptListener: () => setPromptListener,
  85. setPureConversation: () => setPureConversation,
  86. setTextarea: () => setTextarea,
  87. waitForIdle: () => waitForIdle
  88. });
  89. function getTextarea() {
  90. const form = document.querySelector("form");
  91. if (!form)
  92. return;
  93. const textareas = form.querySelectorAll("textarea");
  94. const result = textareas[0];
  95. return result;
  96. }
  97. function getSubmitButton() {
  98. const textarea = getTextarea();
  99. if (!textarea)
  100. return;
  101. return textarea.nextElementSibling;
  102. }
  103. function getRegenerateButton() {
  104. const form = document.querySelector("form");
  105. if (!form)
  106. return;
  107. const buttons = form.querySelectorAll("button");
  108. const result = Array.from(buttons).find((button) => {
  109. var _a;
  110. return (_a = button.textContent) == null ? void 0 : _a.trim().toLowerCase().includes("regenerate");
  111. });
  112. return result;
  113. }
  114. function getStopGeneratingButton() {
  115. const form = document.querySelector("form");
  116. if (!form)
  117. return;
  118. const buttons = form.querySelectorAll("button");
  119. const result = Array.from(buttons).find((button) => {
  120. var _a;
  121. return (_a = button.textContent) == null ? void 0 : _a.trim().toLowerCase().includes("stop generating");
  122. });
  123. return result;
  124. }
  125. function getLastResponseElement() {
  126. const responseElements = document.querySelectorAll(".group.w-full");
  127. return responseElements[responseElements.length - 1];
  128. }
  129. function getLastResponse() {
  130. const lastResponseElement = getLastResponseElement();
  131. if (!lastResponseElement)
  132. return;
  133. const lastResponse = lastResponseElement.textContent;
  134. return lastResponse;
  135. }
  136. function getTextareaValue() {
  137. var _a;
  138. return ((_a = getTextarea()) == null ? void 0 : _a.value) || "";
  139. }
  140. function setTextarea(message) {
  141. const textarea = getTextarea();
  142. if (!textarea)
  143. return;
  144. textarea.value = message;
  145. textarea.dispatchEvent(new Event("input"));
  146. }
  147. function send(message) {
  148. setTextarea(message);
  149. const textarea = getTextarea();
  150. if (!textarea)
  151. return;
  152. textarea.dispatchEvent(new KeyboardEvent("keydown", { key: "Enter", bubbles: true }));
  153. }
  154. function regenerate() {
  155. const regenerateButton = getRegenerateButton();
  156. if (!regenerateButton)
  157. return;
  158. regenerateButton.click();
  159. }
  160. function onSend(callback) {
  161. const textarea = getTextarea();
  162. if (!textarea)
  163. return;
  164. textarea.addEventListener("keydown", function(event) {
  165. if (event.key === "Enter" && !event.shiftKey) {
  166. callback();
  167. }
  168. });
  169. const sendButton = getSubmitButton();
  170. if (!sendButton)
  171. return;
  172. sendButton.addEventListener("mousedown", callback);
  173. }
  174. function isGenerating() {
  175. var _a, _b;
  176. return ((_b = (_a = getSubmitButton()) == null ? void 0 : _a.firstElementChild) == null ? void 0 : _b.childElementCount) === 3;
  177. }
  178. function waitForIdle() {
  179. return new Promise((resolve) => {
  180. const interval = setInterval(() => {
  181. if (!isGenerating()) {
  182. clearInterval(interval);
  183. resolve();
  184. }
  185. }, 1e3);
  186. });
  187. }
  188. function setPromptListener(key = "prompt_texts") {
  189. let last_trigger_time = +/* @__PURE__ */ new Date();
  190. if (location.href.includes("chat.openai")) {
  191. GM_addValueChangeListener(key, (name, old_value, new_value) => __async(this, null, function* () {
  192. if (+/* @__PURE__ */ new Date() - last_trigger_time < 500) {
  193. return;
  194. }
  195. last_trigger_time = +/* @__PURE__ */ new Date();
  196. setTimeout(() => __async(this, null, function* () {
  197. const prompt_texts = new_value;
  198. if (prompt_texts.length > 0) {
  199. let firstTime = true;
  200. while (prompt_texts.length > 0) {
  201. if (!firstTime) {
  202. yield new Promise((resolve) => setTimeout(resolve, 2e3));
  203. }
  204. if (!firstTime && isGenerating()) {
  205. continue;
  206. }
  207. firstTime = false;
  208. const prompt_text = prompt_texts.shift() || "";
  209. send(prompt_text);
  210. }
  211. }
  212. }), 0);
  213. GM_setValue(key, []);
  214. }));
  215. }
  216. }
  217. function getConversation() {
  218. var _a, _b;
  219. return (_b = (_a = document.querySelector('div[class^="react-scroll-to-bottom"]')) == null ? void 0 : _a.firstChild) == null ? void 0 : _b.firstChild;
  220. }
  221. function getModelSelectButton() {
  222. const conversation = getConversation();
  223. if (!conversation)
  224. return;
  225. return Array.from(conversation.querySelectorAll("button")).find((button) => {
  226. var _a;
  227. return (_a = button.textContent) == null ? void 0 : _a.trim().toLowerCase().includes("model");
  228. });
  229. }
  230. function isConversationStarted() {
  231. return !getModelSelectButton();
  232. }
  233. function setPureConversation() {
  234. const conversation = getConversation();
  235. if (!conversation)
  236. return;
  237. const firstChild = conversation.firstChild;
  238. if (!firstChild)
  239. return;
  240. const newDiv = document.createElement("div");
  241. conversation.insertBefore(newDiv, firstChild.nextSibling);
  242. }
  243. function isHorizontalConversation() {
  244. const conversation = getConversation();
  245. if (!conversation)
  246. return true;
  247. if (!isConversationStarted())
  248. return true;
  249. return conversation.classList.contains("grid");
  250. }
  251. function setHorizontalConversation() {
  252. if (isHorizontalConversation())
  253. return;
  254. setPureConversation();
  255. const conversation = getConversation();
  256. if (!conversation)
  257. return;
  258. conversation.classList.remove("flex", "flex-col", "items-center");
  259. conversation.classList.add("grid", "grid-cols-2", "place-items-center");
  260. }
  261. var bard_exports = {};
  262. __export(bard_exports, {
  263. getInputArea: () => getInputArea,
  264. getLastPrompt: () => getLastPrompt,
  265. getLatestPromptText: () => getLatestPromptText,
  266. getRegenerateButton: () => getRegenerateButton2,
  267. getSubmitButton: () => getSubmitButton2,
  268. getTextarea: () => getTextarea2,
  269. onSend: () => onSend2,
  270. send: () => send2
  271. });
  272. function getSubmitButton2() {
  273. return document.querySelector('button[aria-label="Send message"]');
  274. }
  275. function getInputArea() {
  276. return document.querySelector(".input-area");
  277. }
  278. function getTextarea2() {
  279. const inputArea = getInputArea();
  280. return inputArea ? inputArea.querySelector("textarea") : null;
  281. }
  282. function getRegenerateButton2() {
  283. return document.querySelector('button[aria-label="Retry"]');
  284. }
  285. function getLastPrompt() {
  286. const promptElements = document.querySelectorAll(".query-text");
  287. const lastPrompt = promptElements[promptElements.length - 1];
  288. return lastPrompt;
  289. }
  290. function getLatestPromptText() {
  291. const lastPrompt = getLastPrompt();
  292. if (!lastPrompt)
  293. return "";
  294. const lastPromptText = lastPrompt.textContent;
  295. return lastPromptText || "";
  296. }
  297. function send2(text) {
  298. const textarea = getTextarea2();
  299. if (!textarea)
  300. return;
  301. textarea.value = text;
  302. textarea.dispatchEvent(new Event("input"));
  303. const submitButton = getSubmitButton2();
  304. if (!submitButton)
  305. return;
  306. submitButton.click();
  307. }
  308. function onSend2(callback) {
  309. const textarea = getTextarea2();
  310. if (!textarea)
  311. return;
  312. textarea.addEventListener("keydown", function(event) {
  313. if (event.key === "Enter" && !event.shiftKey) {
  314. callback();
  315. }
  316. });
  317. const sendButton = getSubmitButton2();
  318. if (!sendButton)
  319. return;
  320. sendButton.addEventListener("mousedown", callback);
  321. }
  322. var bingchat_exports = {};
  323. __export(bingchat_exports, {
  324. getActionBar: () => getActionBar,
  325. getChatTurns: () => getChatTurns,
  326. getConversation: () => getConversation2,
  327. getLastChatTurn: () => getLastChatTurn,
  328. getLastResponse: () => getLastResponse2,
  329. getLastResponseText: () => getLastResponseText,
  330. getNewChatButton: () => getNewChatButton,
  331. getRegenerateButton: () => getRegenerateButton3,
  332. getStopGeneratingButton: () => getStopGeneratingButton2,
  333. getSubmitButton: () => getSubmitButton3,
  334. getSuggestionBar: () => getSuggestionBar,
  335. getSuggestionBarButtons: () => getSuggestionBarButtons,
  336. getTextarea: () => getTextarea3,
  337. onSend: () => onSend3,
  338. send: () => send3
  339. });
  340. function getActionBar() {
  341. var _a, _b, _c;
  342. return ((_c = (_b = (_a = document.querySelector("cib-serp")) == null ? void 0 : _a.shadowRoot) == null ? void 0 : _b.querySelector("cib-action-bar")) == null ? void 0 : _c.shadowRoot) || null;
  343. }
  344. function getSubmitButton3() {
  345. const actionBar = getActionBar();
  346. if (!actionBar) {
  347. return null;
  348. }
  349. return actionBar.querySelector('button[aria-label="Submit"]');
  350. }
  351. function getTextarea3() {
  352. const actionBar = getActionBar();
  353. if (!actionBar) {
  354. return null;
  355. }
  356. return actionBar.querySelector("textarea");
  357. }
  358. function getStopGeneratingButton2() {
  359. var _a, _b;
  360. const actionBar = getActionBar();
  361. if (!actionBar) {
  362. return null;
  363. }
  364. const stopGeneratingButton = (_b = (_a = actionBar.querySelector("cib-typing-indicator")) == null ? void 0 : _a.shadowRoot) == null ? void 0 : _b.querySelector('button[aria-label="Stop Responding"]');
  365. if (!stopGeneratingButton) {
  366. return null;
  367. }
  368. if (stopGeneratingButton.disabled) {
  369. return null;
  370. }
  371. return stopGeneratingButton;
  372. }
  373. function getNewChatButton() {
  374. const actionBar = getActionBar();
  375. if (!actionBar) {
  376. return null;
  377. }
  378. return actionBar.querySelector('button[aria-label="New topic"]');
  379. }
  380. function getConversation2() {
  381. var _a, _b, _c;
  382. return ((_c = (_b = (_a = document.querySelector("cib-serp")) == null ? void 0 : _a.shadowRoot) == null ? void 0 : _b.querySelector("cib-conversation")) == null ? void 0 : _c.shadowRoot) || null;
  383. }
  384. function getChatTurns() {
  385. const conversation = getConversation2();
  386. if (!conversation) {
  387. return null;
  388. }
  389. return Array.from(conversation.querySelectorAll("cib-chat-turn")).map((t) => t.shadowRoot);
  390. }
  391. function getSuggestionBar() {
  392. var _a;
  393. const conversation = getConversation2();
  394. if (!conversation) {
  395. return null;
  396. }
  397. return ((_a = conversation.querySelector("cib-suggestion-bar")) == null ? void 0 : _a.shadowRoot) || null;
  398. }
  399. function getSuggestionBarButtons() {
  400. const suggestionBar = getSuggestionBar();
  401. if (!suggestionBar) {
  402. return [];
  403. }
  404. const suggestionItems = Array.from(suggestionBar.querySelectorAll("cib-suggestion-item"));
  405. return suggestionItems.map((i) => {
  406. var _a;
  407. return (_a = i.shadowRoot) == null ? void 0 : _a.querySelector("button");
  408. });
  409. }
  410. function getRegenerateButton3() {
  411. const suggestionBarButtons = getSuggestionBarButtons();
  412. if (!suggestionBarButtons.length) {
  413. return null;
  414. }
  415. return suggestionBarButtons[0];
  416. }
  417. function getLastChatTurn() {
  418. const chatTurns = getChatTurns();
  419. if (!chatTurns) {
  420. return null;
  421. }
  422. return chatTurns[chatTurns.length - 1];
  423. }
  424. function getLastResponse2() {
  425. var _a;
  426. const lastChatTurn = getLastChatTurn();
  427. if (!lastChatTurn) {
  428. return null;
  429. }
  430. return ((_a = lastChatTurn.querySelectorAll("cib-message-group")[1]) == null ? void 0 : _a.shadowRoot) || null;
  431. }
  432. function getLastResponseText() {
  433. var _a;
  434. const lastResponse = getLastResponse2();
  435. if (!lastResponse) {
  436. return null;
  437. }
  438. const message = Array.from(lastResponse.querySelectorAll("cib-message")).map((m) => m.shadowRoot).find((m) => m == null ? void 0 : m.querySelector("cib-shared"));
  439. return ((_a = message == null ? void 0 : message.textContent) == null ? void 0 : _a.trim()) || null;
  440. }
  441. function send3(text) {
  442. const textarea = getTextarea3();
  443. if (!textarea) {
  444. return;
  445. }
  446. textarea.value = text;
  447. textarea.dispatchEvent(new Event("input"));
  448. const submitButton = getSubmitButton3();
  449. if (!submitButton) {
  450. return;
  451. }
  452. submitButton.click();
  453. }
  454. function onSend3(callback) {
  455. const textarea = getTextarea3();
  456. if (!textarea)
  457. return;
  458. textarea.addEventListener("keydown", function(event) {
  459. if (event.key === "Enter" && !event.shiftKey) {
  460. callback();
  461. }
  462. });
  463. const sendButton = getSubmitButton3();
  464. if (!sendButton)
  465. return;
  466. sendButton.addEventListener("mousedown", callback);
  467. }
  468.  
  469. // src/createButton/index.ts
  470. function createButton(callback) {
  471. if (window.location.href.includes("chat.openai")) {
  472. return;
  473. }
  474. const hideRight = document.title.match(/[\u4e00-\u9fa5]/) ? "-130px" : "-120px";
  475. const button = document.createElement("button");
  476. button.innerHTML = "\u7F51\u9875\u7FFB\u8BD1";
  477. button.style.position = "fixed";
  478. button.style.width = "140px";
  479. button.style.top = "120px";
  480. button.style.right = hideRight;
  481. button.style.zIndex = "999999";
  482. button.style.backgroundColor = "#4285f4";
  483. button.style.color = "#fff";
  484. button.style.opacity = "0.8";
  485. button.style.border = "none";
  486. button.style.borderRadius = "4px";
  487. button.style.padding = "10px 16px";
  488. button.style.fontSize = "18px";
  489. button.style.cursor = "pointer";
  490. button.style.transition = "right 0.3s";
  491. document.body.appendChild(button);
  492. button.addEventListener("mouseenter", () => {
  493. button.style.right = "-10px";
  494. });
  495. button.addEventListener("mouseleave", () => {
  496. button.style.right = hideRight;
  497. });
  498. document.addEventListener("fullscreenchange", () => {
  499. if (document.fullscreenElement) {
  500. button.style.display = "none";
  501. } else {
  502. button.style.display = "block";
  503. }
  504. });
  505. button.addEventListener("click", callback);
  506. }
  507. var createButton_default = createButton;
  508.  
  509. // src/SimpleArticleSegmentation/index.ts
  510. var MIN_PARAGRAPH_LENGTH = 1600;
  511. var MAX_PARAGRAPH_LENGTH = 1800;
  512. var SimpleArticleSegmentation = class {
  513. constructor(text) {
  514. this.text = text;
  515. }
  516. segment() {
  517. const paragraphs = [];
  518. const sentences = this.text.split(new RegExp("(?<=[.!?])\\s+"));
  519. let paragraph = "";
  520. for (const sentence of sentences) {
  521. if (paragraph.length + sentence.length + 1 <= MAX_PARAGRAPH_LENGTH) {
  522. paragraph += (paragraph.length > 0 ? " " : "") + sentence;
  523. } else {
  524. if (paragraph.length >= MIN_PARAGRAPH_LENGTH) {
  525. paragraphs.push(paragraph);
  526. paragraph = sentence;
  527. } else {
  528. paragraph += " " + sentence;
  529. }
  530. }
  531. }
  532. if (paragraph.length >= MIN_PARAGRAPH_LENGTH) {
  533. paragraphs.push(paragraph);
  534. }
  535. return paragraphs;
  536. }
  537. };
  538. var SimpleArticleSegmentation_default = SimpleArticleSegmentation;
  539.  
  540. // src/getParagraphs/index.ts
  541. function getParagraphs() {
  542. try {
  543. let docClone = document.cloneNode(true);
  544. let article = new Readability(docClone).parse();
  545. if (article && article.textContent) {
  546. const segmenter = new SimpleArticleSegmentation_default(article.textContent);
  547. const paragraphs = segmenter.segment();
  548. for (let i = 0; i < paragraphs.length; i++) {
  549. paragraphs[i] = paragraphs[i].trim();
  550. }
  551. return paragraphs;
  552. } else {
  553. console.warn("Readability.js could not extract any text content from this page.");
  554. return [];
  555. }
  556. } catch (error) {
  557. console.error("An error occurred while using Readability.js:", error);
  558. return [];
  559. }
  560. }
  561. var getParagraphs_default = getParagraphs;
  562.  
  563. // src/MenuManger/index.ts
  564. var MenuManager = class {
  565. constructor(default_menu_all) {
  566. this.default_menu_all = default_menu_all;
  567. this.menu_all = GM_getValue("menu_all", this.default_menu_all);
  568. for (const name in this.default_menu_all) {
  569. if (!(name in this.menu_all)) {
  570. this.menu_all[name] = this.default_menu_all[name];
  571. }
  572. }
  573. this.menu_id = GM_getValue("menu_id", {});
  574. this.update_menu();
  575. }
  576. registerMenuCommand(name, value) {
  577. if (name === "chat_language") {
  578. return GM_registerMenuCommand(`${name}\uFF1A${value}`, () => {
  579. const language = prompt("Please input the language you want to use", value.toString());
  580. if (language) {
  581. this.menu_all[name] = language;
  582. GM_setValue("menu_all", this.menu_all);
  583. this.update_menu();
  584. location.reload();
  585. }
  586. });
  587. }
  588. const menuText = ` ${name}\uFF1A${value ? "\u2705" : "\u274C"}`;
  589. const commandCallback = () => {
  590. this.menu_all[name] = !this.menu_all[name];
  591. GM_setValue("menu_all", this.menu_all);
  592. this.update_menu();
  593. location.reload();
  594. };
  595. return GM_registerMenuCommand(menuText, commandCallback);
  596. }
  597. update_menu() {
  598. for (const name in this.menu_all) {
  599. const value = this.menu_all[name];
  600. if (this.menu_id[name]) {
  601. GM_unregisterMenuCommand(this.menu_id[name]);
  602. }
  603. this.menu_id[name] = this.registerMenuCommand(name, value);
  604. }
  605. GM_setValue("menu_id", this.menu_id);
  606. }
  607. getMenuValue(name) {
  608. return this.menu_all[name];
  609. }
  610. };
  611. var MenuManger_default = MenuManager;
  612.  
  613. // src/getLocalLanguage/index.ts
  614. function getLocalLanguage() {
  615. const userLanguage = navigator.language;
  616. const languageNames = new Intl.DisplayNames([userLanguage], { type: "language" });
  617. const readableLanguage = languageNames.of(userLanguage);
  618. return readableLanguage;
  619. }
  620. var getLocalLanguage_default = getLocalLanguage;
  621.  
  622. // src/index.ts
  623. function initialize() {
  624. return __async(this, null, function* () {
  625. yield new Promise((resolve) => window.addEventListener("load", resolve));
  626. yield new Promise((resolve) => setTimeout(resolve, 1e3));
  627. });
  628. }
  629. function main() {
  630. return __async(this, null, function* () {
  631. yield initialize();
  632. const defaultMenu = {
  633. "chat_language": getLocalLanguage_default() || "Chinese"
  634. };
  635. const menuManager = new MenuManger_default(defaultMenu);
  636. const chatLanguage = menuManager.getMenuValue("chat_language");
  637. const key = "prompt_texts";
  638. chatgpt_exports.setPromptListener(key);
  639. const translateWeb = () => __async(this, null, function* () {
  640. const paragraphs = getParagraphs_default();
  641. const prompt_texts = paragraphs.map((paragraph) => {
  642. return `"""
  643. ${paragraph}
  644. """
  645. translate above paragraphs in """ to ${chatLanguage} with compact and intuitive format (use Markdown syntax to optimize the display format):`;
  646. });
  647. GM_setValue(key, prompt_texts);
  648. });
  649. createButton_default(translateWeb);
  650. });
  651. }
  652. (function() {
  653. main();
  654. })();
  655. })();