如何在JS中翻译字符串

6

我有一个项目需要翻译成多种语言,对于 PHP 部分,我使用了 Zend Frameworks 的 Zend_Translate 与 GetText 进行翻译。现在我也想翻译 JS 部分。

我使用的是 jQuery JS 框架,希望听听您对于 JS 文件翻译方面的想法。

7个回答

13

我已经在三个项目中成功使用GetText来翻译JavaScript文件。

当然,GetText本身不支持JavaScript,而JavaScript也不支持GetText。我的解决方案如下:

  • 在JavaScript中,我用gettext("你的文字在这里")来包围可翻译的字符串。
  • 然后我有一个脚本从JavaScript文件中提取字符串并创建一个C文件,因为C被GetText支持。
  • 然后我使用xgettext对生成的C文件和项目中的任何其他文件进行处理,以生成POT和PO文件。

在翻译完PO文件之后,我需要将翻译内容带回JavaScript文件...

  • 我再次解析JavaScript文件,记住可翻译字符串列表,然后针对每种语言:
  • 使用支持GetText的语言(例如PHP),我翻译所有字符串并输出JavaScript文件。

例如,爱沙尼亚语的语言文件(例如et_EE.js)可能如下所示:

var LOCALE = {
  "Hello": "Tere",
  "My name is %s": "Minu nimi on %s",
  "Enter your credit card number": "Sisesta oma krediitkaardi number"
};

function gettext(string) {
  return LOCALE[string] ? LOCALE[string] : string;
}

根据所选区域,您将包含et_EE.jsen_US.js或......

en_US.js可能仅包含以下内容:

en_US.js
function gettext(string) {
  return string;
}
ngettext() 有点棘手,但你应该能够理解大致意思。
重要的是我可以使用已有的所有 gettext 工具。特别是当我需要翻译 PHP 和 JavaScript 中的可翻译文本时 - 我可以使用同一个工具来翻译它们两个,并确保相同的字符串在 JavaScript 和 PHP 中以相同的方式翻译。
注意:如果您不处理 JavaScript 密集型 Web 应用程序,则应仔细考虑是否首先通过 JavaScript 创建页面内容。

3
"return LOCALE[string] ? LOCALE[string] : string;" 可以简化为 "return LOCALE[string] || string;"。这样可以使语句更加简洁,但不会改变原有的意思。 - Ates Goral
这种方法在复数形式或没有大量的gettext重新实现工作的情况下是行不通的。 - Nikolai Prokoschenko
@rassie:你能说得更具体一些吗?因为我已经实现了这个系统,并支持复数形式。虽然我没有使用上下文,但我认为也没有问题支持它们。 - Rene Saarsoo


3

好的,您可以将字符串扩展为具有翻译功能,该功能会在语言环境中查找接收器。

使用方法如下:

alert("你最喜欢的语言是英语!".translated());

然后您将得到一个弹出窗口,其中包含“你最喜欢的语言是西班牙语”或其他内容。

尼科


很好的想法!在我的看法中,将.translated()附加到字符串后面比用translate()将字符串包围起来更易读。 - Erich Kitzmueller

2
// just for some idea 
//var language ="fr_FR";
var language ="sp_SP";

var FRLOCALE = {
  "Hello": "bonjure ",
  "My name is %s": "mo nome oc ",
  "what": "some french thing"
};

var SPLOCALE = {
  "Hello": "Spanish for hello",
  "My name is %s": "spanish for my name is ",
  "what": "qu"
};

function translated(language, string){
    if (language.indexOf("fr") > -1) {
        return FRLOCALE[string] ? FRLOCALE[string] : string;
    } 

    if (language.indexOf("sp") > -1) {
      return SPLOCALE[string] ? SPLOCALE[string] : string;
    }

    return string; 
}

alert(translated(language,"Hello"));

alert(translated(language,"some thing not translated "));

2

链接已损坏。 - Duncanmoo

0

我有一个 PHP 网页,也存在于多种语言中。我已经在 PHP 中编写了自己的语言类,当需要本地化 JavaScript 文件时,我只需配置服务器将 .js 文件作为 PHP 执行,并使用我的 PHP 类来翻译 JavaScript 字符串。

就像这样:

alert ( '<?php echo $l->Get ( 'MyString' ); ?>' );

我只是在每个JavaScript文件的开头包含一个初始化"$l"的文件。我对此没有任何问题。


可行,但解决方案相当丑陋。 - Rene Saarsoo
除了将服务器配置为将js文件视为PHP文件,我没有看到任何问题。即使您拥有服务器,这也不是问题。请分享为什么这很丑陋 :) 也许我漏掉了什么。 - Jan Hančič
2
很丑,因为语法很丑。如果你的JS代码中到处都是 <?php echo $l->Get("..."); ?> ,那么它显然看起来不好。你实际要翻译的字符串几乎会在用于翻译它的PHP代码中丢失。 - Rene Saarsoo
这是一种可行的解决方案,但更易读的方法是使用静态方法,例如 <?= T::_('MyString') ?> ,因此不需要全局变量,特别是像 $l 这样的短名称。 - Iaroslav Vorozhko
当你将PHP混入JS中来翻译字符串时,代码就变得难以阅读。我喜欢这个问题的第一个答案...作为开发者,你应该倾向于创建干净而紧凑的代码,而不是“hack things to get them to work”,从而使生活更轻松。 - milosmns

-1

链接已经失效。 - Duncanmoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接