【问题标题】:Translation in JavaScript like gettext in PHP?JavaScript 中的翻译就像 PHP 中的 gettext?
【发布时间】:2011-01-24 21:35:48
【问题描述】:

我在我的 PHP 代码中使用了gettext,但我遇到了一个大问题。我所有的 JavaScript 文件都不受翻译的影响,有人能告诉我一个简单的方法,将所选语言的翻译也转换成 JavaScript。

【问题讨论】:

    标签: javascript gettext translate


    【解决方案1】:

    最简单的方法是让 PHP 文件将 gettext 的翻译写入 JavaScript 变量。

    js_lang.php:

    word_hello = "<?php echo gettext("hello"); ?>"
    word_world = "<?php echo gettext("world"); ?>"
    word_how_are_you = "<?php echo gettext("how_are_you"); ?>"
    

    然后包含它:

    <script type="text/javascript" src="js_lang.php"></script>
    

    我还建议将此方法与 S.Mark 提到的翻译插件结合使用(非常有趣!)。

    您也可以在当前页面的标题中定义字典,而无需包含外部文件,但这样一来,您必须在每次页面加载时查找并发送数据 - 完全没有必要,因为字典往往会发生变化很少见。

    【讨论】:

    • Pekka,对于一个有很多翻译的非常大的网站,你应该如何管理这个?生成的语言文件会不会太大? (让我们说 Facebook 大小只是为了好玩)或者我们应该坚持生成 HTML 和文本服务器端并使用我们当前的 PHP 语言框架?谢谢
    • @Kenny 关于“非常大”方面,除非您谈论的是一次翻译所需的兆字节数据,否则我认为每种语言都有一个外部 JavaScript 翻译文件 - 手动设置,缓存,或由 PHP 生成 - 应该可以正常工作。它只会加载一次(确保缓存配置正确),并会为站点的所有上下文提供所有必要的单词。
    • 这并没有考虑到很多真实翻译面临的问题。最简单的例子是基于数据的多元化变化。因此,如果您的 javascript 代码没有任何国际化,您将无法对这些差异做出反应。
    • @AlexSexton 公平点。有没有可以处理多个复数之类的JS本地化库?
    • 不幸的是,似乎没有很多好的选择。如果您使用的是 Dojo,他们有很好的 i18n 支持。 JavaScript 中似乎有一个像样的gettext 兼容实现,可以处理这些情况:jsgettext.berlios.de - 我从来没有在实际中使用过它,所以我还不能完全推荐它。一个好的开始,无论如何。
    【解决方案2】:

    我通常以 JavaScript 结构导出翻译:

    var app = {};
    var app.translations = {
      en: {
        hello: "Hello, World!",
        bye: "Goodbye!"
      },
      nl: {
        hello: "Hallo, Wereld!",
        bye: "Tot ziens!"
      }
    };
    

    页面文本的当前语言可以定义为:&lt;html xml:lang="en" lang="nl"&gt;

    这可以用 JavaScript 读取:

    var currentLanguage = document.documentElement.lang || "en";
    app.lang = app.translations[ currentLanguage ] || app.translations.en;
    

    然后你可以这样写代码:

    alert( app.lang.hello );
    

    可选地,i18n()gettext() 函数可以带来一些智能,如果密钥不存在则返回默认文本)。例如:

    function gettext( key )
    {
      return app.lang[ key ] || app.translations.en[ key ] || "{translation key not found: " + key + "}";
    }
    

    【讨论】:

      【解决方案3】:

      试试,jQuery i18njQuery localisation

      jQuery i18n 的一个例子,当然你需要从 php 的语言文件生成基于 JSON 的字典

      var my_dictionary = { 
          "some text"  : "a translation",
          "some more text"  : "another translation"
      }
      $.i18n.setDictionary(my_dictionary);
      
      
      $('div#example').text($.i18n._('some text'));
      

      【讨论】:

      • 我从来没有尝试过,它结合了 json、警报等。
      • 或者你可以试试i18next.com 带有额外的gettext 到json 转换器。并且功能齐全。
      【解决方案4】:

      JSGettext (archived link) 是 GNU gettext 规范的最佳实现。 首先下载 JSGETTEXT 包并包含在你的页面中 /js/Gettext.js

      <?php
      $locale = "ja_JP.utf8";
      if(isSet($_GET["locale"]))$locale = $_GET["locale"];
      ?>
      <html>
      <head>
      <link rel="gettext" type="application/x-po" href="/locale/<?php echo $locale ?>/LC_MESSAGES/messages.po" />
      <script type="text/javascript" src="/js/Gettext.js"></script>
      <script type="text/javascript" src="/js/test.js"></script>
      </head>
      <body>
      Test!
      </body>
      </html>
      

      例如javascript代码

      window.onload = function init(){
      var gt = new Gettext({ 'domain' : 'messages' });
      alert(gt.gettext('Hello world'));
      }
      

      参考下面的链接。无需将 .js 文件转换为 .php 即可正常工作。

      Click here

      【解决方案5】:

      如果您改掉在代码中使用字符串字面量的坏习惯,您的生活会变得更轻松。也就是说,而不是

       alert("Some message")
      

      使用

      alert($("#some_message_id").text())
      

      其中“#some_message_id”是在服务器端生成的隐藏 div 或 span。

      【讨论】:

        【解决方案6】:

        作为进一步的提示,有一个名为 po2json 的 perl 脚本,它将从 .po 文件生成 json。

        【讨论】:

          【解决方案7】:

          对于 GNU gettext API 的 JavaScript 实现,这些链接也很有用:
          http://tnga.github.io/lib.ijs
          http://tnga.github.io/lib.ijs/docs/iJS.Gettext.html

          //set the locale in which the messages will be translated
          iJS.i18n.setlocale("fr_FR.utf8") ;
          //add domain where to find messages data. can also be in .json or .mo
          iJS.i18n.bindtextdomain("domain_po", "./path_to_locale", "po") ;
          //Always do this after a `setlocale` or a `bindtextdomain` call.
          iJS.i18n.try_load_lang() ; //will load and parse messages data from the setting catalog.
          //now print your messages
          alert( iJS.i18n.gettext("messages to be translated") ) ;
          //or use the common way to print your messages
          alert( iJS._("another way to get translated messages") ) ;
          

          【讨论】:

          • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果将来外部链接页面发生变化,仅链接的答案将没有任何用处
          【解决方案8】:

          这个库似乎是 javascript 中 getText 的最佳实现:

          http://messageformat.github.io/Jed/

          https://github.com/messageformat/Jed

          文档中的示例:

          <script src="jed.js"></script>
          <script>
          var i18n = new Jed({
            // Generally output by a .po file conversion
            locale_data : {
              "messages" : {
                "" : {
                  "domain" : "messages",
                  "lang"   : "en",
                  "plural_forms" : "nplurals=2; plural=(n != 1);"
                },
                "some key" : [ "some value"]
              }
            },
            "domain" : "messages"
          });
          
          alert( i18n.gettext( "some key" ) ); // alerts "some value"
          </script>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-05-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多