如何建立多语言网站?
-
09-06-2019 - |
题
我的一个朋友现在正在使用 J2EE 和 Struts 构建一个 Web 应用程序,并且它将准备好以多种语言显示页面。
有人告诉我,支持多语言网站的最佳方法是使用属性文件,在其中存储页面的所有字符串,例如:
welcome.english = "Welcome!"
welcome.spanish = "¡Bienvenido!"
...
这个解决方案没问题,但是如果您的网站显示新闻或类似内容(博客),会发生什么情况?我的意思是,内容不是静态的,而是经常更新的......维护网站的人员必须用每种受支持的语言编写每个新条目,并将该条目的每个版本存储在数据库中。应用程序仅加载用户选择的语言的条目。
您如何设计数据库来支持这种实现?
谢谢。
解决方案
我之前设计数据库的方式是有一个包含基本信息的新闻表,如 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"]>>
该会话位是一个本地变量,用于存储用户首次登录或进入站点时的语言。
其他提示
警告:我不是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 文件可以编译以提高速度
- 有适用于大多数语言/平台的库
- 有很好的跨平台工具来处理翻译。实际上可以使用诸如以下的工具来建立您的翻译团队 po编辑 使他们能够轻松管理翻译项目
Gettext 缺点
- 解决您的网站“家具”需求,但您通常仍然需要基于数据库的方法来处理数据库驱动的内容
有关 gettext 的更多信息,请参阅 这个维基百科页面
如果您使用 JSP,标记库就可以了,但您也可以使用基于模板的技术实现 I18N,例如 自由标记.