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

Par*_*ser 28 javascript gettext translate

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

Pek*_*ica 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"); ?>"
Run Code Online (Sandbox Code Playgroud)

然后包括它:

<script type="text/javascript" src="js_lang.php"></script>
Run Code Online (Sandbox Code Playgroud)

我还建议将此方法与翻译插件S.Mark提及(这非常有趣!).

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

  • 不幸的是,似乎没有很多很好的选择.如果你正在使用Dojo,他们有很好的i18n支持.在JavaScript中似乎有一个不错的`gettext`兼容实现,可以处理这些情况:http://jsgettext.berlios.de/ - 我没有在真实单词中使用它,所以我不能完全推荐它.无论如何,一个好的开始. (3认同)
  • 这没有考虑到真正翻译面临的许多问题。最简单的示例是基于数据的多元化更改。因此,如果您的JavaScript代码没有任何国际化,您将无法对这些差异做出反应。 (2认同)
  • @AlexSexton 公平点。有没有可以处理多个复数等的JS本地化库? (2认同)

vdb*_*oor 13

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

var app = {}
var app.translations = {
  en:  { hello: "Hello, World!"
       , bye:   "Goodbye!"
       }
, nl:  { hello: "Hallo, Wereld!"
       , bye:   "Tot ziens!"
       }
};
Run Code Online (Sandbox Code Playgroud)

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

这可以在JavaScript中阅读:

var curentLanguage = document.documentElement.lang || "en";
app.lang = app.translations[ currentLanguage ] || app.translations.en;
Run Code Online (Sandbox Code Playgroud)

然后你可以编写这样的代码:

alert( app.lang.hello );
Run Code Online (Sandbox Code Playgroud)

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

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


YOU*_*YOU 7

尝试,jQuery i18njQuery本地化

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'));
Run Code Online (Sandbox Code Playgroud)