我的一位朋友正在使用J2EE和Struts构建一个Web应用程序,它将准备以多种语言显示页面。
有人告诉我,支持多语言网站的最佳方法是使用属性文件来存储网页的所有字符串,例如:
welcome.english = "Welcome!"
welcome.spanish = "¡Bienvenido!"
...
此解决方案没问题,但如果您的网站显示新闻或类似内容(博客)会怎样?我的意思是,非静态的内容,经常更新...保留网站的人必须在每种支持的语言中编写每个新条目,并将条目的每个版本存储在数据库中。应用程序仅加载用户所选语言的条目。
如何设计数据库以支持此类实施?
感谢。
答案 0 :(得分:14)
警告:我不是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的更多信息,请参阅this wikipedia page
答案 1 :(得分:6)
我之前设计数据库的方法是要有一个包含基本信息的新闻表,如NewsID(int),NewsPubDate(datetime),NewsAuthor(varchar / int),然后有一个包含这些列的链接表NewsText: NewsID(int),NewsText(text),NewsLanguageID(int)。最后你有一个语言表,它有LanguageID(int)和LanguageName(varchar)。
然后,当您想要向用户显示您所做的新闻页面时:
SELECT NewsText FROM News INNER JOIN NewsText ON News.NewsID = NewsText.NewsID
WHERE NewsText.NewsLanguageID = <<Session["UserLanguageID"]>>
Session-bit是一个局部变量,您可以在第一次登录或进入站点时存储用户语言。
答案 2 :(得分:2)
Java Web应用程序支持使用java标准标记库进行国际化。
你真的遇到了2个问题。静态内容和动态内容。
对于静态内容,您可以使用jstl。它使用java ResourceBundle来完成此任务。我设法在这个网站的帮助下得到Databased backed bundle。
第二个问题是动态内容。 要解决此问题,您需要存储数据,以便根据用户的区域设置检索不同的翻译。 (区域设置包括国家/地区和语言)。
这不是微不足道的,但是你可以通过前面的一些计划来做。
答案 3 :(得分:1)
答案 4 :(得分:1)
如果您使用JSP,标记库很好,但您也可以使用基于模板的技术(例如FreeMarker)来实现I18N。