我们如何建立一个多语言的网站?

时间:2020-03-05 18:46:27  来源:igfitidea点击:

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

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

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

这种解决方案是可以的,但是如果站点显示新闻或者类似内容(博客)会怎样?我的意思是,不是静态的内容,经常更新的内容...保留网站的人员必须用每种支持的语言编写每个新条目,并将该条目的每个版本存储在数据库中。该应用程序仅加载用户选择的语言中的条目。

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

谢谢。

解决方案

回答

我以前设计数据库的方式是让News-table包含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"]>>

该会话位是一个局部变量,我们可以在用户首次登录或者进入站点时在其中存储用户的语言。

回答

警告:我不是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的更多信息,请参见此Wikipedia页面

回答

@Auron

多数民众赞成在我们应用它。我们的应用程序都是PHP,但是gettext具有悠久的历史。

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

回答

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

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

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

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

这并非微不足道,但是我们可以通过预先计划就可以做到。

回答

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