![](/img/trans.png)
[英]gettext translation in PHP works fine, but not with javascript
[英]Translation in JavaScript like gettext in PHP?
我在 PHP 代码中使用了gettext
,但我遇到了一个大问题。 我所有的 JavaScript 文件都不受翻译的影响,有人能告诉我一种将所选语言的翻译也转换成 JavaScript 的简单方法吗?
最简单的方法是让 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 提到的翻译插件(非常有趣!)。
您也可以在当前页面的标题中定义字典,而无需包含外部文件,但那样的话,您将不得不在每次页面加载时查找并发送数据——这是非常不必要的,因为字典往往很少更改。
我通常以 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 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 + "}";
}
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'));
JSGettext ( 存档链接)是 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 即可正常工作。
如果您改掉在代码中使用字符串字面量的坏习惯,您的生活就会变得更加轻松。 也就是说,而不是
alert("Some message")
用
alert($("#some_message_id").text())
其中“#some_message_id”是在服务器端生成的隐藏 div 或 span。
对于 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") ) ;
作为进一步的提示,有一个名为 po2json 的 perl 脚本,它将从 .po 文件生成 json。
这个库似乎是 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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.