【问题标题】:Microsoft translator AJAX API, dropdown to change languageTo and languageFrom?微软翻译器AJAX API,下拉更改languageTo和languageFrom?
【发布时间】:2015-11-07 20:29:13
【问题描述】:

我正在尝试为我的网站编写一个翻译框。到目前为止,我已经能够从教程中获得工作代码:

<input id="ori" type="text" />
<button onclick="translate();">Translate</button>
<div id="trans"></div>

<script>
var languageFrom = "en";
var languageTo = "fr";

function translate() {
document.getElementById('trans').innerHTML="Translating... please wait";
var text= document.getElementById('ori').value;
window.mycallback = function(response) {
document.getElementById('trans').innerHTML=response;
}

var s = document.createElement("script");
s.src = "http://api.microsofttranslator.com/V2/Ajax.svc/Translate?oncomplete=mycallback&appId=<MY-APP-ID>&from=" + languageFrom + "&to=" + languageTo + "&text=" + text;
document.getElementsByTagName("head")[0].appendChild(s);
}
</script>

(从这里编写脚本:http://wizardsoweb.com/microsoftbing-translator-ajax-example/2011/05/?wpmp_switcher=desktop

基本上,一旦我填写了我的 APPID,它就会将 ori 文本框中的文本翻译成法语。当然,这一切都很好,但这是我想要做的:

我希望有两个下拉菜单。一个将使用指定语言填充languageFrom 变量,另一个下拉菜单将使用指定语言填充languageTo 变量。

我已经在另一个帖子中发布了关于这个问题的帖子:Update script var's with value from drop down?。这样,当您从下拉菜单中选择一个值时,它会填充该变量。我在 jsFiddle 上有一个这样的工作示例:

http://jsfiddle.net/charlescarver/hk2bJ/1/

(我包含了我的 API 密钥,这样操作起来更容易)

SO,我认为问题在于控制翻译的脚本在变量为空时加载,然后在选择下拉选项时不更新。

我认为这可以通过在单击按钮而不是加载页面时调用脚本来解决。如何实现?微软的支持记录很差,我在那里或谷歌上找不到解决方案。这是 API 文档的链接:http://msdn.microsoft.com/en-us/library/ff512385.aspx

【问题讨论】:

    标签: javascript html api microsoft-translator


    【解决方案1】:

    您正在尝试将事件处理程序附加到对象 (select1 & select 2) 基本上还不存在 (查看您的 jsfiddle 示例) - 这会中断你脚本的其余部分,因为你实际上没有附加任何东西。

    所以你需要做这样的事情(不是最大的约定,但它证明了这一点)

    window.onload = function()
    {
        document.getElementById("select1").onchange = function() {
            languageFrom = this.value;
        }
        document.getElementById("select2").onchange = function() {
            languageTo = this.value;
        }
    }
    

    (这意味着您只有在所有内容都加载并可用后才能附加事件)

    你也可以在你的 html 元素中做一些事情,如下所示:

    From: <select id="select1" onchange="languageFrom=this.value">
    <option value="en">En</option>
    <option value="fr">Fr</option>
    </select>
    
    To: <select id="select2" onchange="languageTo=this.value">
    <option value="en">En</option>
    <option value="fr">Fr</option>
    </select>
    

    或者在你的翻译函数中做任何事情(这意味着你不需要在你的下拉列表中附加任何东西,也不需要定义任何全局变量)

    function translate() {
        document.getElementById('trans').innerHTML="";
        var text= document.getElementById('ori').value;
        window.mycallback = function(response) {
        document.getElementById('trans').innerHTML=response;
        }
    
        var languageFrom = document.getElementById("select1").value;
        var languageTo = document.getElementById("select2").value;
        var s = document.createElement("script");
        s.src = "http://api.microsofttranslator.com/V2/Ajax.svc/Translate?oncomplete=mycallback&appId=8B841CA7C1A03443682C52AD07B7775A7BD5B3AA&from=" + languageFrom + "&to=" + languageTo + "&text=" + text;
        document.getElementsByTagName("head")[0].appendChild(s);
    }
    

    【讨论】:

    • 我明白你在说什么。 Doesn't the script need to be updated though when a different language is selected?我把它放到jsFiddle中,我想我可能错过了一些东西:jsfiddle.net/hk2bJ/13
    • 我为你更新了你的小提琴,似乎工作 100% jsfiddle.net/hk2bJ/16
    • 现在很好用,谢谢。 2个问题。 1.) 看起来它需要在 head 部分才能工作,而不是像 API 示例中那样在 HTML 下方工作? 2.) 在获取翻译文本时可以有占位符文本吗?我认为我的示例链接中有一个示例:document.getElementById('trans').innerHTML="Translating... please wait";
    • 1.通常不是,但似乎小提琴应用程序需要它在那里。 2. 是的,在 translate 方法中设置 document.getElementById('trans').innerHTML 会起作用
    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多