6

我的一个朋友现在正在使用 J2EE 和 Struts 构建一个 Web 应用程序,并且准备好以多种语言显示页面。

有人告诉我,支持多语言站点的最佳方法是使用属性文件来存储页面的所有字符串,例如:

welcome.english = "Welcome!"
welcome.spanish = "¡Bienvenido!"
...

这个解决方案没问题,但是如果您的网站显示新闻或类似的东西(博客)会发生什么?我的意思是,内容不是静态的,而是经常更新的……维护网站的人必须用每种支持的语言编写每个新条目,并将每个版本的条目存储在数据库中。应用程序仅加载用户所选语言的条目。

你如何设计数据库来支持这种实现?

谢谢。

4

5 回答 5

13

警告:我不是 Java 黑客,所以 YMMV 但是......

使用“属性”列表的问题在于您需要大量的纪律。每次添加应该输出给用户的字符串时,您都需要打开属性文件,查看该字符串(或大致等价的字符串)是否已在文件中,然后添加新属性如果不是。最重要的是,如果您想将属性文件交给外部翻译团队来处理,您必须希望属性文件具有相当的可读性/可编辑性。

基于数据库的方法对所有基于数据库的内容都很有用。理想情况下,您希望轻松地将内容片段与其翻译联系在一起。它仅适用于您可能想要输出不在数据库中的内容(错误消息等)的所有地方。

我们发现一种相当古老的技术仍然非常有效,那就是使用 gettext。Gettext 或某些变体似乎可用于大多数语言和平台。基本前提是您将输出包装在一个特殊的函数调用中,如下所示:

echo _("Please do not press this button again");

然后在您的源代码上运行 gettext 工具会将所有像这样包装的实例提取到“po”文件中。这将包含以下条目:

#: myfolder/my.source:239
msgid "Please do not press this button again"
msgstr ""

您可以将您的翻译添加到适当的位置:

#: myfolder/my.source:239
msgid "Please do not press this button again"
msgstr "s’il vous plaît ne pas appuyer sur le bouton ci-dessous à nouveau"

gettext 工具的后续运行只会更新您的 po 文件。您甚至不需要从源中提取 po 文件。如果您知道您可能想要翻译您的网站,那么您可以将上面显示的格式(下划线函数)用于所有输出。如果您不提供 po 文件,它只会返回您在引号中输入的任何内容。gettext 设计用于使用语言环境,因此用户语言环境用于检索适当的 po 文件。这使得添加新翻译变得非常容易。

Gettext 优点

  • 编码时不会妨碍您
  • 很容易添加翻译
  • PO文件可以编译下来以提高速度
  • 大多数语言/平台都有可用的库
  • 有很好的跨平台工具来处理翻译。实际上,可以使用poEdit之类的工具来设置您的翻译团队,以便他们轻松管理翻译项目

Gettext 缺点

  • 解决您的网站“家具”需求,但您通常仍需要基于数据库的方法来处理数据库驱动的内容

有关 gettext 的更多信息,请参阅此维基百科页面

于 2008-09-03T09:50:03.723 回答
6

我之前设计数据库的方法是拥有一个包含基本信息的新闻表,例如 NewsID (int)、NewsPubDate (datetime)、NewsAuthor (varchar/int),然后拥有一个包含以下列的链接表 NewsText:NewsID(int )、NewsText(文本)、NewsLanguageID(int)。最后你有一个具有 LanguageID(int) 和 LanguageName(varchar) 的语言表。

然后,当您想向用户展示您所做的新闻页面时:

SELECT NewsText FROM News INNER JOIN NewsText ON News.NewsID = NewsText.NewsID
WHERE NewsText.NewsLanguageID = <<Session["UserLanguageID"]>>

该会话位是一个本地变量,您在其中存储用户第一次登录或进入站点时的语言。

于 2008-09-02T14:01:01.867 回答
2

Java Web 应用程序使用 java 标准标记库支持国际化。

你真的有2个问题。静态内容和动态内容。

对于静态内容,您可以使用jstl。它使用 java ResourceBundle来完成此任务。在此站点的帮助下,我设法获得了一个支持数据库的捆绑包。

第二个问题是动态内容。要解决此问题,您需要存储数据,以便可以根据用户的区域设置检索不同的翻译。(区域设置包括国家和语言)。

这不是微不足道的,但是您可以通过预先进行一些计划来做到这一点。

于 2008-09-08T20:58:42.793 回答
1

@Auron

这就是我们应用它的目的。我们的应用程序都是 PHP,但 gettext 有着悠久的传统。

看起来有一个很好的Java实现

于 2008-09-03T22:02:47.083 回答
1

如果您使用 JSP,标记库很好,但您也可以使用基于模板的技术(如FreeMarker )来实现 I18N 。

于 2008-09-16T02:23:58.660 回答