」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 帶有 API 的簡單語言翻譯器

帶有 API 的簡單語言翻譯器

發佈於2024-10-31
瀏覽:184

Simple Language Translator with API

#100daysofMiva 编码挑战的第 8 天,我研究了一个简单的翻译模型,可以将一种语言翻译成另一种语言?
这是JS,这很神奇✨?

?语言翻译器脚本文档

概述

此 JavaScript 代码旨在创建一个有趣的交互式语言翻译器!它利用 MyMemory API 在不同语言之间翻译文本,并允许您交换语言、复制翻译,甚至大声朗读文本。 ??


特征

  • ?语言选择:用户可以从多种语言中进行选择,从阿姆哈拉语到祖鲁语!
  • ?语言交换: 单击按钮即可轻松在源语言和目标语言之间交换。
  • ?文本转语音: 聆听所选语言的原始文本或翻译文本。
  • ?复制到剪贴板: 单击即可复制原始文本或翻译文本。

代码分解

语言数据

const countries = { /*...*/ } 

该对象包含可用的语言及其各自的国家代码。例如,“en-GB”:“English”将语言代码与其名称配对。

动态下拉菜单

selectTag.forEach((tag, id) => {
    /*...*/
});

此代码使用国家对象中列出的所有语言动态填充下拉菜单。第一个下拉列表默认为英语(“en-GB”),第二个下拉列表默认为印地语(“hi-IN”)。

语言交换

exchageIcon.addEventListener("click", () => {
    /*...*/
});

单击交换图标允许用户在“从”和“到”字段之间交换文本和所选语言。

实时翻译

translateBtn.addEventListener("click", () => {
    /*...*/
});

单击“翻译”按钮时,文本将发送到 MyMemory API,翻译后的文本将显示在“目标文本”字段中。在等待响应时,会显示“正在翻译...”占位符。

文本转语音和复制

icons.forEach(icon => {
    /*...*/
});

本部分处理文本转语音和复制功能:

  • 语音:以所选语言大声播放文本。
  • 复制:将文本复制到剪贴板。

它是如何运作的

  1. 选择语言 ?:从下拉列表中选择您的语言。
  2. 输入或粘贴文本 ✍️:输入要翻译的文本。
  3. 翻译 ?:点击“翻译”按钮,观看奇迹发生!
  4. 交换、聆听或复制 ???:交换语言、聆听翻译或将文本复制到剪贴板。

依赖关系

  • MyMemory API:翻译功能由 MyMemory API 提供支持。确保您有有效的互联网连接才能正常工作。

潜在的增强功能

  • 语言自动检测:自动检测输入文本的语言。
  • 高级错误处理:改进对翻译错误或 API 故障的响应。
  • 多种翻译:显示可用的替代翻译。

以下是代码的工作原理及其用途的逐步细分:

第 1 步:定义可用语言

const countries = { /*...*/ }
  • 它的作用:该对象包含键值对,其中键是语言国家代码(例如英语的“en-GB”),值是语言的名称(例如“English” ).
  • 目的:此数据用于填充语言选择下拉列表,以便用户可以选择其源语言和目标语言。

第 2 步:选择 DOM 元素

const fromText = document.querySelector(".from-text"),
      toText = document.querySelector(".to-text"),
      exchageIcon = document.querySelector(".exchange"),
      selectTag = document.querySelectorAll("select"),
      icons = document.querySelectorAll(".row i");
      translateBtn = document.querySelector("button"),
  • 它的作用:此代码从 HTML 文档中选择各种元素并将它们存储在变量中以便以后轻松访问。
    • fromText 和 toText:用户输入文本并查看翻译的文本区域。
    • exchageIcon: 用于交换语言和文本的图标。
    • selectTag:用于选择语言的下拉菜单。
    • 图标:复制和语音功能的图标。
    • translateBtn: 触发翻译的按钮。

第 3 步:填充语言下拉列表

selectTag.forEach((tag, id) => {
    for (let country_code in countries) {
        let selected = id == 0 ? country_code == "en-GB" ? "selected" : "" : country_code == "hi-IN" ? "selected" : "";
        let option = ``;
        tag.insertAdjacentHTML("beforeend", option);
    }
});
  • 它的作用:此循环遍历国家对象并将每种语言添加为语言选择下拉列表中的选项。
    • 如果下拉菜单是第一个(id == 0),则默认选择英语(“en-GB”)。
    • 如果下拉菜单是第二个(id == 1),则默认选择印地语(“hi-IN”)。

第 4 步:交换语言和文本

exchageIcon.addEventListener("click", () => {
    let tempText = fromText.value,
        tempLang = selectTag[0].value;
    fromText.value = toText.value;
    toText.value = tempText;
    selectTag[0].value = selectTag[1].value;
    selectTag[1].value = tempLang;
});
  • 它的作用:单击交换图标时,此功能会在“从”和“到”文本区域以及所选语言之间交换文本。
    • tempText 暂时保存“from-text”字段中的原始文本。
    • tempLang 暂时保留第一个下拉列表中的原始语言。
    • 然后将“源文本”替换为“目标文本”,反之亦然。所选语言也会交换。

第5步:清除翻译文本

fromText.addEventListener("keyup", () => {
    if(!fromText.value) {
        toText.value = "";
    }
});
  • 它的作用:如果用户删除“from-text”字段中的所有文本,此函数也会自动清除“to-text”字段。
  • 目的:确保如果输入文本被清除,翻译也被清除,防止混淆。

第 6 步:翻译文本

translateBtn.addEventListener("click", () => {
    let text = fromText.value.trim(),
        translateFrom = selectTag[0].value,
        translateTo = selectTag[1].value;
    if(!text) return;
    toText.setAttribute("placeholder", "Translating...");
    let apiUrl = `https://api.mymemory.translated.net/get?q=${text}&langpair=${translateFrom}|${translateTo}`;
    fetch(apiUrl).then(res => res.json()).then(data => {
        toText.value = data.responseData.translatedText;
        data.matches.forEach(data => {
            if(data.id === 0) {
                toText.value = data.translation;
            }
        });
        toText.setAttribute("placeholder", "Translation");
    });
});
  • 它的作用:当单击“翻译”按钮时,此功能:
    1. 从“from-text”字段中提取文本
    2. 从下拉列表中标识所选语言
    3. 使用文本和所选语言向 MyMemory API 发送请求
    4. 从 API 接收翻译并将其显示在“目标文本”字段中。
    5. 更新占位符文本,同时等待翻译以指示该过程正在进行。

概括

该脚本允许用户通过动态和交互式界面在不同语言之间翻译文本。用户可以选择语言、输入文本、单击翻译、交换语言和文本、大声朗读翻译或将其复制到剪贴板。

享受不同语言的乐趣,让您的翻译之旅充满乐趣和互动! ??到下一个?✌?✨

在这里查看
https://app.marvelly.com.ng/100daysofMiva/day-8/

源代码
https://github.com/Marvellye/100daysofMiva/blob/main/Projects/Day_8-Simple_language_translator

版本聲明 本文轉載於:https://dev.to/marvellye/simple-language-translator-with-api-3bd7?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Expo with Redux Toolkit、檔案系統與 Redux Persist:綜合指南
    Expo with Redux Toolkit、檔案系統與 Redux Persist:綜合指南
    Redux Toolkit 是一個流行的函式庫,它透過提供一組實用程式和約定來簡化 Redux 開發。它包括一個減速器和動作創建模式,可以簡化編寫 Redux 邏輯的過程。將 Redux Persist 與 Redux Toolkit 結合可以顯著提高 React Native 應用程式中狀態管理的...
    程式設計 發佈於2024-11-07
  • 如何處理非巢狀 Lambda 閉包中的變數作用域問題?
    如何處理非巢狀 Lambda 閉包中的變數作用域問題?
    Python Lambda 閉包作用域問題將變數封裝在閉包中以將其從函數簽章中刪除是一種常用於高效代碼結構的技術。但是,在非嵌套 lambda 的情況下,閉包保留變數的最終值,從而在嘗試基於迭代變數存取特定值時導致問題。 考慮提供的程式碼片段:names = ['a', 'b', 'c'] def ...
    程式設計 發佈於2024-11-07
  • 如何使用現代 CSS 將按鈕無縫整合到輸入欄位中?
    如何使用現代 CSS 將按鈕無縫整合到輸入欄位中?
    如何使用現代CSS 將按鈕整合到輸入中問題:創建視覺元素其中按鈕無縫整合在輸入欄位中,允許正常的使用者互動、保留文字可見性並保持可存取性和螢幕閱讀器相容性。 解決方案:Flexbox 和表單邊框最佳方法是使用彈性盒佈局以及包含元素(表單)上的邊框:定位:設定具有水平行佈局的彈性盒,允許輸入擴展以填充...
    程式設計 發佈於2024-11-07
  • 核心開發中的 C++:綜合指南
    核心開發中的 C++:綜合指南
    介紹 由於直接硬體存取和最小的運行時開銷,核心開發傳統上是 C 的領域。然而,由於其物件導向的特性,C 在核心程式設計中找到了自己的位置,這可以帶來更乾淨、更易於維護的程式碼。本指南將逐步介紹如何使用 C 進行核心開發,重點是設定環境、建置專案以及使用 C 功能編寫核心程式碼,同時...
    程式設計 發佈於2024-11-07
  • 在 React 專案中實作 CSS 模組
    在 React 專案中實作 CSS 模組
    React 中的 CSS 模組是一種透過自動產生唯一類別名稱來確定 CSS 範圍的方法。這可以防止大型應用程式中的類別名稱衝突並允許模組化樣式。以下是如何在 React 專案中使用 CSS 模組: 1. 設定 預設情況下,React 支援 CSS 模組。您只需使用擴展名 .modul...
    程式設計 發佈於2024-11-07
  • 有哪些資源可用於實現彗星模式?
    有哪些資源可用於實現彗星模式?
    Comet:伺服器推送模式伺服器推送是一種在伺服器和Web 用戶端之間實現雙向通訊的技術,已經獲得了顯著的成果最近的興趣。 Comet 設計模式是作為在 JavaScript 應用程式中實現伺服器推送的一種有前途的方法而出現。本問題探討了 Comet 模式的 jQuery 實作和通用資源的可用性。 ...
    程式設計 發佈於2024-11-07
  • 探索心理健康門診計畫的類型
    探索心理健康門診計畫的類型
    門診心理健康治療方法是一種不強調在醫療機構過夜的方案。這種療法主要在醫生辦公室、醫院或診所提供,在那裡人們可以進行定期治療,以進行高度結構化的定期治療。 在 COVID-19 大流行期間,全球約有 2.75 億名吸毒者。比前幾十年高出近 22%。吸毒成癮的增加導致全美吸毒過量人數創下歷史新高。好消...
    程式設計 發佈於2024-11-07
  • 如何在 C++ Builder 中初始化 OpenGL 幀:逐步指南
    如何在 C++ Builder 中初始化 OpenGL 幀:逐步指南
    如何在C Builder 中初始化OpenGL 幀在C Builder 中的窗體內初始化OpenGL 幀可能是一項具有挑戰性的任務。在嘗試調整現有 OpenGL 程式碼(例如問題中提供的範例)時,您可能會遇到困難。 要正確建立和渲染OpenGL 幀,請依照下列步驟操作:使用TForm::Handle...
    程式設計 發佈於2024-11-07
  • 利用這些罕見的 HTML 屬性來增強您的 Web 開發技能
    利用這些罕見的 HTML 屬性來增強您的 Web 開發技能
    Introduction HTML attributes are most often referred to as the overlooked heroes of web development, playing a crucial role in shaping the st...
    程式設計 發佈於2024-11-07
  • 如何在 Python 中將字串轉換為二進位:ASCII 與 Unicode?
    如何在 Python 中將字串轉換為二進位:ASCII 與 Unicode?
    在Python中將字串轉換為二進位在Python中,您可能會遇到需要將字串表示為二進位數字序列的情況。這對於多種原因都很有用,例如資料加密或二進位檔案操作。 使用 bin() 函數將字串轉換為二進位的最簡單方法就是使用bin()函數。該函數接受一個字串作為輸入,並將其二進位表示形式傳回為字串。例如:...
    程式設計 發佈於2024-11-07
  • 為什麼從 Java 中的匿名內部類別存取外部實例變數需要是 Final?
    為什麼從 Java 中的匿名內部類別存取外部實例變數需要是 Final?
    Java內部類別:為什麼必須使用「最終」外部實例變數在Java中定義匿名內部類別時,您可能會遇到將外部實例變數標記為“final”的要求。本文探討了這個約束背後的原因。 如同提供的程式碼中所提到的,實例變數 jtfContent 必須宣告為 Final 才能在內部類別中存取。這項要求源自於 Java...
    程式設計 發佈於2024-11-07
  • 理解 Python 中的關鍵字參數
    理解 Python 中的關鍵字參數
    When you're programming in Python, knowing how to pass arguments to functions is key for writing clear, flexible, and easy-to-maintain code. One powe...
    程式設計 發佈於2024-11-07
  • 如何防止列印時DIV跨頁分割?
    如何防止列印時DIV跨頁分割?
    列印問題:防止 DIV 跨頁分叉遇到動態 DIV 在頁面之間切成兩半的列印困境?當嘗試列印具有大量可變高度 DIV 元素的冗長文件時,就會出現此問題。 CSS 救援解決方案為了解決此問題,CSS 屬性打破了 -裡面來拯救。透過指定值避免,您可以確保渲染引擎防止 DIV 中途分割。這是程式碼片段:@m...
    程式設計 發佈於2024-11-07
  • Python 是強類型語言嗎?
    Python 是強類型語言嗎?
    Python 是強型別語嗎? Python 中的強型別概念造成了一些混亂,因為該語言允許變數改變執行期間的類型。然而,Python 確實是強型別的,儘管是動態的。 Python 中的強型別強型別可確保值維持其宣告的型別,除非明確轉換。在Python中,這意味著變數沒有固定的類型,而是它們所保存的值有...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3