我的一个朋友现在正在使用J2EE和Struts构建一个Web应用程序,它将准备以多种语言显示页面.
有人告诉我,支持多语言网站的最佳方法是使用属性文件存储页面的所有字符串,例如:
welcome.english = "Welcome!" welcome.spanish = "¡Bienvenido!" ...
这个解决方案没问题,但如果您的网站显示新闻或类似内容(博客)会发生什么?我的意思是,非静态的内容,经常更新...保留网站的人必须在每种支持的语言中编写每个新条目,并将条目的每个版本存储在数据库中.应用程序仅加载用户所选语言的条目.
您如何设计数据库以支持这种实现?
谢谢.
警告:我不是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文件.这使得添加新翻译变得非常容易.
在编码时不会妨碍你
很容易添加翻译
可以向下编译PO文件以提高速度
大多数语言/平台都有可用的库
有很好的跨平台工具来处理翻译.实际上,您可以使用poEdit等工具设置您的翻译团队,以便他们轻松管理翻译项目
解决您的网站"家具"需求,但您通常仍需要基于数据库的方法来处理数据库驱动的内容
有关gettext的更多信息,请参阅此维基百科页面
我之前设计数据库的方式是让一个包含基本信息的新闻表,如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-bit是一个局部变量,您可以在第一次登录或进入站点时存储用户语言.