像PHP中的gettext一样在JavaScript中进行翻译?

时间:2010-03-08 08:41:52

标签: javascript gettext translate

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

8 个答案:

答案 0 :(得分:18)

最简单的方法是让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提及(非常有趣!)。

您也可以在当前页面的标题中定义字典,而不包含外部文件,但是这样,您必须在每个页面加载时查找并发送数据 - 这是非常不必要的,因为字典往往会更改很少。

答案 1 :(得分:13)

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

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

页面文本的当前语言可以使用:<html xml:lang="en" lang="nl">

定义

这可以在JavaScript中阅读:

var curentLanguage = 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 + "}";
}

答案 2 :(得分:7)

尝试,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'));

答案 3 :(得分:3)

JSGettextarchived 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

答案 4 :(得分:1)

如果你摆脱了在代码中使用字符串文字的坏习惯,你可以让你的生活更轻松。也就是说,而不是

 alert("Some message")

使用

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

对于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") ) ;

答案 7 :(得分:0)

该库似乎是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>