【问题标题】:How to add Google Translate link that triggers translation?如何添加触发翻译的谷歌翻译链接?
【发布时间】:2012-01-09 23:13:40
【问题描述】:

我有一个保加利亚语网页,我希望我的用户能够一键将其翻译成英语。此外,当用户进入页面时,页面顶部不应有任何翻译横幅(用户点击翻译链接后可以)。我曾尝试使用#googtrans(bg|en) (doc) 但它不起作用,而且由于此代码,它还在页面顶部显示了一个横幅:

<script>
function googleTranslateElementInit() {
  new google.translate.TranslateElement({
    pageLanguage: 'bg',
    autoDisplay: false,
    layout: google.translate.TranslateElement.InlineLayout.SIMPLE
  }, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>

(doc)

代码在这里krumovgrad.eu点击右上角的标志。

【问题讨论】:

  • 带有无效链接的翻译横幅。我不想要横幅,我想要有效/翻译的链接。
  • 更新:在 Firefox 中;带有有效链接的横幅。在 IE 8 中什么都没有。
  • 您能否发布代码或 jsfiddle,以便我们尝试提供帮助?
  • 更新:我已经删除了 Fx 中的 cookie,但我什么也没有。根据旧 cookie 运行。

标签: javascript google-translate


【解决方案1】:

例如,您的网络 URI 是 http://localhost/cars/index.php

把它改成

http://localhost/cars/index.php#googtrans(fr)

将页面翻译成法语,顶部带有 google-translate-iframe

要禁用 iframe 横幅,请在页面 CSS 中添加以下代码

.goog-te-banner-frame {
    display: none;
}

请参考Sibin John Mattappallil's answer to this question

【讨论】:

    【解决方案2】:

    几天前我遇到了同样的问题,并想出了一个可行的解决方案。我有一个西班牙语网站,在我们将其翻译成英文之前,我们会为用户提供使用 Google 网站翻译的可能性。当用户单击英文标志时,它会打开一个 Twitter Bootstrap 模式,告诉用户该网站尚未翻译,并且他们可以单击一个按钮来触发翻译。我使用 JavaScript 捕获事件,将 cookie 'googtrans' 设置为值 '/es/en' 并重新加载页面。其余的由 Google 的脚本完成。重新加载后,我检查 cookie 是否存在并将英文标志更改为西班牙标志。当用户点击它时,我将 cookie 设置为 ''(空字符串),然后重新加载页面。

    为简单起见,我不会包含 Bootstrap 模态部分。

    HTML

    <!DOCTYPE html>
    <html>
        <head>
        (...)
        <meta name="google-translate-customization" content="(YOUR_TRANSLATE_CUSTOMIZATION_ID)" />
        (...)
        </head>
        <body>
            (...)
            <a id="lang-change-en" class="lang-change" href="javascript:void(0);">
                <img src="images/en-flag.png" alt="English Flag">
            </a>
            (...)
            <script src="js/script.js"></script>
            <script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
        </body>
    </html>
    

    Javascript (script.js)

    function setCookie(cname, cvalue, exdays) {
        var expires;
        if (exdays === 0) {
            expires = '';
        } else {
            var d = new Date();
            d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
            expires = "expires=" + d.toGMTString();
        }
        var domain = (typeof domain === "undefined") ? '' : "; domain="+domain;
        document.cookie = cname + "=" + cvalue + "; " + expires + "path=" + path + domain;
    }
    
    function getCookie(cname) {
        var name = cname + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i].trim();
            if (c.indexOf(name) == 0) {
                return c.substring(name.length, c.length);
            }
        }
        return "";
    }
    
    //Google provides this function
    function googleTranslateElementInit() {
        new google.translate.TranslateElement({
            pageLanguage: 'es',
            includedLanguages: 'en',
            layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
           autoDisplay: false
        },'google_translate_element');
    }
    
    //Using jQuery
    $(document).ready(function() {
        $(document).on('click','#lang-change-en', function() {
            setCookie('googtrans', '/es/en', 0, '.viajoasalta.com');
            setCookie('googtrans', '', 0, '/');
            location.reload();
        });
    
        $(document).on('click', '#lang-change-es', function() {
            setCookie('googtrans', '', 0, '/', '.viajoasalta.com');
            setCookie('googtrans', '', 0, '/');
            location.reload();
        });
    
        var googTrans = getCookie('googtrans');
    
        if (googTrans === '/es/en') {
            var src = $('#lang-change-en > img').attr('src').replace('en-flag', 'es-flag');
            $('#lang-change-en > img').attr('src', src);
            $('#lang-change-en').attr('id', 'lang-change-es');
        }
    });
    

    在网站翻译器设置向导中,您可以选择要在列表中显示的语言。然后,您可以拥有自己的&lt;select&gt;,其中每个&lt;option&gt; 具有作为value 它应该具有的cookie 的值,或者带有data-cookie="value" 之类的标志的普通列表。然后使用 JavaScript 捕获列表的“更改”事件(用于选择)或“单击”事件,并适当地设置 cookie。

    注意:我故意删除了呈现网站翻译器的 div:

    <div id="google_translate_element"></div>
    

    要查看它的工作情况,您可以访问www.viajoasalta.com;至少在我们最终翻译之前。

    【讨论】:

    • 代码中的问题是setCookie() 函数,因为它写入了第二个同名cookie,因为您没有指定路径。看这里,第 1 点:sitepoint.com/3-things-about-cookies-you-may-not-know 在您的 viajoasalta.com 网站上,您也可以看到这一点。当您点击翻译栏中的“查看原文”时,Google 脚本编写的 googtrans cookie 会被删除,但重复的 cookie 仍会强制翻译页面,并且还会弄乱您的标记。这是一个简单的修复:function setCookie(cname, cvalue) { document.cookie = cname + "=" + cvalue + "; path=/"; }
    • @FFish 感谢您的评论。我修改了setCookie() 函数,使其同时接受pathdomain 参数。我需要 domain 参数,因为 Google 的网站翻译器为“www.viajoasalta.com”和“.viajoasalta.com”设置了 cookie。我使用 'exdays' 等于 0,所以 cookie 的生命周期就是会话的生命周期。当您单击翻译栏中的“查看原文”时,我仍然不知道如何更新标志。如果我知道怎么做,我会发表新评论。
    【解决方案3】:

    我的朋友,Google 已经提前考虑了。请看这个页面:http://translate.google.com/translate_tools

    编辑:对不起,我刚刚意识到您正在使用页面提供的内容!您可以使用简单的 javascript 隐藏显示的元素并创建一个英文链接,其中 onClick 会更改隐藏选择元素的值......并且您的整个页面都会被翻译。

    它有点乱,但它完成了工作,用户不知道它的存在!

    您还可以考虑捕获发送到谷歌翻译服务器的请求,并捕获当您选择英语并使用该链接时调用的链接。

    Chrome 有一个很好的实用程序来捕获请求(请参阅 ctrl+shift+j 以获取开发者控制台)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2015-05-19
      • 2011-09-12
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多