【问题标题】:How do you build a multi-language web site?你如何建立一个多语言的网站?
【发布时间】:2023-03-26 10:20:01
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: database jakarta-ee web-applications multilingual


    【解决方案1】:

    警告:我不是 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 的更多信息,请参阅this wikipedia page

    【讨论】:

      【解决方案2】:

      我之前设计数据库的方式是拥有一个包含基本信息的新闻表,例如 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 是一个本地变量,当用户第一次登录或进入网站时,您在其中存储用户的语言。

      【讨论】:

        【解决方案3】:

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

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

        对于静态内容,您可以使用jstl。它使用 java ResourceBundles 来完成此任务。在这个网站的帮助下,我设法获得了Databased backed bundle

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

        这不是微不足道的,但你可以通过预先计划来做一些事情。

        【讨论】:

          【解决方案4】:

          @Auron

          这就是我们应用它的目的。我们的应用程序都是 PHP,但 gettext 有着悠久的传统。

          好像有good Java implementation

          【讨论】:

            【解决方案5】:

            如果您使用 JSP,标签库很好,但您也可以使用基于模板的技术实现 I18N,例如 FreeMarker

            【讨论】:

              猜你喜欢
              • 2012-03-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-13
              • 2018-12-13
              • 1970-01-01
              • 2016-07-31
              相关资源
              最近更新 更多