w"/>

关于数据库:您如何建立一个多语言的网站?

关于数据库:您如何建立一个多语言的网站?

How do you build a multi-language web site?

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

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

1
2
3
welcome.english ="Welcome!"
welcome.spanish ="?Bienvenido!"
...

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

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

谢谢。


警告:我不是Java黑客,所以YMMV但是...

使用"属性"列表的问题在于您需要进行大量的纪律检查。每次添加应该输出给用户的字符串时,您都需要打开属性文件,查看该字符串(或与之大致等效的字符串)是否已存在于文件中,然后去添加新属性如果不是这样。最重要的是,如果您希望将属性文件交给外部翻译团队处理,则必须希望该属性文件是人类可读/可编辑的。

基于数据库的方法对于所有基于数据库的内容很有用。理想情况下,您希望轻松将内容及其翻译联系在一起。对于您可能要输出数据库以外的某些内容(错误消息等)的所有地方,它实际上都下降了。

我们发现一种相当古老的技术仍然非常有效,那就是使用gettext。 Gettext或某些变体似乎可用于大多数语言和平台。基本前提是将输出包装在特殊的函数调用中,如下所示:

1
echo _("Please do not press this button again");

然后,在源代码上运行gettext工具,会将所有类似包装的实例提取到" po"文件中。这将包含如下条目:

1
2
3
#: myfolder/my.source:239
msgid"Please do not press this button again"
msgstr""

您可以将翻译添加到适当的位置:

1
2
3
#: 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页面


我以前设计数据库的方式是让一个News-table包含NewsID(int),NewsPubDate(datetime),NewsAuthor(varchar / int)之类的基本信息,然后拥有一个包含以下列的链接表NewsText:NewsID(int ),NewsText(文本),NewsLanguageID(int)。最后,您有了一个语言表,其中包含LanguageID(int)和LanguageName(varchar)。

然后,当您想向用户显示新闻页面时,您可以执行以下操作:

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

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


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

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

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

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

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


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


@奥龙

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

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


推荐阅读

    linux命令是什么语言?

    linux命令是什么语言?,系统,环境,代码,传播,管理,语言,操作系统,源码,自由,

    linux访问网站的命令?

    linux访问网站的命令?,地址,系统,服务,工作,网站,命令,网络,管理,信息,网址,L

    linux支持管道的命令?

    linux支持管道的命令?,通信,标准,系统,信息,地方,数据,管道,环境,设备,工具,L

    linux改语言命令行?

    linux改语言命令行?,系统,环境,工具,密码,概念,地方,软件,通信,管理,国际,lin

    linux命令行c语言?

    linux命令行c语言?,代码,系统,工具,环境,工作,保险,发行,命令,文件,终端,linu

    c语言在linux命令?

    c语言在linux命令?,系统,工作,管理,命令,保险,基础,环境,信息,文件,语言,linu

    linux编写c语言命令?

    linux编写c语言命令?,系统,基础,环境,代码,盘面,保险,百度,情况,数据,工具,在

    linux命令行登陆网站?

    linux命令行登陆网站?,网站,系统,密码,服务,地址,环境,网络,软件,状态,项目,

    linux登陆网站命令?

    linux登陆网站命令?,网络,工具,网站,标准,地址,软件,系统,命令,数据,环境,lin

    linux命令打开网站?

    linux命令打开网站?,网络,网站,系统,地址,密码,传播,工具,代码,环境,命令,大

    linux命令行登录网站?

    linux命令行登录网站?,系统,网站,地址,工作,软件,密码,网络,第一,环境,中心,

    linux改变语言命令?

    linux改变语言命令?,系统,管理,网上,官方网站,情况,服务,中文,语言,命令,终

    linux命令查询网站?

    linux命令查询网站?,地址,网络,信息,名称,档案,工具,网站,命令,传播,分析,lin

    c语言编译linux命令?

    c语言编译linux命令?,代码,工具,环境,系统,基础,保险,百度,语言,源程序,文件

    linux下备份网站命令?

    linux下备份网站命令?,工程,系统,软件,设备,服务,网站,管理,数据,环境,设计,

    linux常用命令语言?

    linux常用命令语言?,工作,地址,系统,信息,命令,目录,标准,管理,工具,服务,lin

    r语言命令行写linux?

    r语言命令行写linux?,环境,数据,系统,工具,简介,官网,语言,报告,软件,发展,如

    linux命令连接网站?

    linux命令连接网站?,网络,系统,信息,地址,名称,密码,设备,软件,网站,工具,Lin

    linux语言查找命令行?

    linux语言查找命令行?,系统,工作,位置,标准,地址,信息,命令,管理,时间,文件,