”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 带 API 的简单语言翻译器

带 API 的简单语言翻译器

发布于2024-10-31
浏览:952

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]删除
最新教程 更多>
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-07-03
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-07-03
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-07-03
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-07-03
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-07-03
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-07-03
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-07-03
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-07-03
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-07-03
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-07-03
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-07-02
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-07-02
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的Python功能Eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-07-02
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
    编程 发布于2025-07-02
  • PHP与C++函数重载处理的区别
    PHP与C++函数重载处理的区别
    作为经验丰富的C开发人员脱离谜题,您可能会遇到功能超载的概念。这个概念虽然在C中普遍,但在PHP中构成了独特的挑战。让我们深入研究PHP功能过载的复杂性,并探索其提供的可能性。在PHP中理解php的方法在PHP中,函数超载的概念(如C等语言)不存在。函数签名仅由其名称定义,而与他们的参数列表无关。...
    编程 发布于2025-07-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3