如何构建一个多语言网站?

6
我的一个朋友正在使用J2EE和Struts构建一个Web应用程序,并准备显示多种语言的页面。
我听说支持多语言网站的最佳方式是使用属性文件来存储页面中的所有字符串,例如:
welcome.english = "Welcome!"
welcome.spanish = "¡Bienvenido!"
...

这个解决方案还不错,但如果你的网站显示新闻或类似的内容(博客),会发生什么情况呢?我的意思是,这些内容不是静态的,经常更新... 管理网站的人必须在每种支持的语言中编写每个新条目,并将每个版本存储在数据库中。应用程序仅加载用户选择语言的条目。
如何设计数据库来支持这种实现?
谢谢。
5个回答

12

警告:我不是Java黑客,所以您的情况可能有所不同,但...

使用“属性”列表的问题在于您需要很多纪律。每次您添加应输出给用户的字符串时,都需要打开您的属性文件,查看该字符串(或与其相当的内容)是否已经存在于文件中,然后如果不存在,则添加新的属性。除此之外,如果您想将其发送给外部翻译团队进行处理,您还必须希望属性文件相当易于人类阅读/编辑。

基于数据库的方法非常适用于所有基于数据库的内容。理想情况下,您希望轻松将内容片段与它们的翻译绑定在一起。它只会在所有您可能想要输出某些不来自数据库的东西(例如错误消息等)的地方出现问题。

我们发现仍然非常有效的一种相当古老的技术是使用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的信息,请参阅维基百科页面


6

我之前设计数据库的方式是创建一个新闻表,包含基本信息如NewsID(整型),NewsPubDate(日期时间型),NewsAuthor(字符串/整型),然后创建一个链接表NewsText,包含这些列:NewsID(整型),NewsText(文本型),NewsLanguageID(整型)。最后创建一个语言表,包含LanguageID(整型)和LanguageName(字符串)。

当你想向用户展示新闻页面时,你需要执行以下操作:

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

“Session-bit”是一个本地变量,用于在用户登录或首次进入网站时存储其语言。


2

Java web应用程序使用Java标准标签库支持国际化。

您有两个问题需要解决:静态内容和动态内容。

对于静态内容,您可以使用JSTL。它使用Java ResourceBundle来实现。我在这个网站的帮助下成功地使用数据库支持的bundle

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

这不是一件简单的事情,但只要提前做好一些规划,就可以完成。


1

@Auron

这就是我们应用它的地方。我们的应用程序都是PHP编写的,但gettext有着悠久的历史。

看起来有一个不错的Java实现


1

如果你正在使用JSP,标签库是不错的选择,但是你也可以使用基于模板的技术(如FreeMarker)来实现I18N。


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