【问题标题】:JSP internationalization RTL/LTRJSP 国际化 RTL/LTR
【发布时间】:2012-12-29 13:45:30
【问题描述】:

我想创建一个可以用两种语言查看的网站,一种 LTR 和一种 RTL。这意味着所有内容都应以两种语言中的任何一种显示。

我的框架是 Spring,我正在使用 Tiles2,但我认为这个问题不是特定于框架的。

支持两种语言的明显解决方案是将所有内容加倍(所有 JSP、片段等),然后您将获得适合您选择的语言的树部分。但这会在更改网站时引起问题(您可能忘记更新其他 JSP),并且不可扩展(尝试对 5 或 10 种语言进行此操作)。

我知道我可以使用属性文件来托管不同语言的字符串,但是我的网站将是一个巨大的 spring:message 标签集合,并且会更难维护(如果我有一段100 行,这些都放在一个属性行吗?)

有没有什么框架、插件、其他可以解决这个问题?有没有人遇到过这个问题的巧妙解决方案?

【问题讨论】:

  • 不考虑 Tiles/Spring/etc,您可以在这里找到一个基本的 JSP/JSTL 示例:stackoverflow.com/questions/4276061/…
  • 我已经使用这些技术创建了一个国际化的网站,这就是为什么我正在寻找不同的东西。我正在考虑创建一个 Eclipse 插件,它可以神奇地采用任何 JSP 片段并将国际化嵌入其中,只是想知道是否有人遇到过这种情况。

标签: java jsp internationalization tiles2 right-to-left


【解决方案1】:

我从来没有实现过一个完整的项目,只是一些测试。如果您遵循一些简单的规则,我认为这个问题并不像看起来那么大。这是我会尝试做的事情:

  • <body dir='ltr/rtl'> 指定方向。与 CSS 方向属性相比,这是首选属性。

  • 在所有 CSS 中避免使用不同的左右边距或填充。如果你必须打破这个规则,你可能需要使用包含所有这些不同元素的两个不同文件(ltr.css 和 rtl.css)。

  • 有时您需要将某些元素从左向右移动,反之亦然。例如,在 LTR 中,您希望菜单在左侧,但在 RTL 中,您希望在右侧。您可以使用 CSS 来实现这一点,但如果您不是专家,这有时会很复杂,您必须在所有浏览器中进行测试。另一种选择是根据情况使用一些 IF。如果您使用基于网格的 CSS 库(如 Bootstrap),最后一个选项将非常适合。

  • 仔细选择要使用的 CSS 和 JS 库。显然,选择那些提供 RTL/LTR 支持的。

  • 不要太担心图像。如果您必须根据语言更改一张图像,可能是因为其中包含一些文本。所以,无论如何,你必须使用不同的图像。这是与 i18n 相关的问题,而不是文本方向问题。

  • 不要让您的客户对此过于挑剔。我认为通过这些规则(也许还有更多规则),你可以获得一个好的结果。但是,如果您的客户开始抱怨这里有一个像素而那里有另一个像素,那么您就需要将这一切复杂化,而且可能没有必要。

  • 关于您的语言属性文件。是的,使用它们。总是。即使您只使用一种语言,这也是一种很好的做法:HTML 结构与内容分离,很容易更正或翻译,一些单词或句子只在一个文件中......

【讨论】:

    【解决方案2】:

    通常,Web 框架用于构建 Web 应用程序而不是网站,并且很少有长的静态段落。大多数内容是动态的并且来自数据库。但是,是的,通常的做法是将所有内容外部化到资源包中,通常以属性文件的形式。

    将长段落放入属性文件不会造成太大问题,因为您可以通过以反斜杠结束每行将长段落分成多行:

    home.welcomeParagraph=This is a long \
        paragraph splitted into several lines \
        thanks to backslashes.
    

    【讨论】:

      【解决方案3】:

      RTL 和 LTR 是 i18n 的高级和更困难的问题之一。

      基本上这是 MVC 模型的视图范围的问题。这可能还包括图片和情感差异,例如人的皮肤颜色。在这种情况下,您最好放弃 HTML+CSS 为您提供的解决方案。

      例如:

      <style type="text/css">
          *:lang(ar) { direction:rtl }
          *:lang(de) { direction:ltr }
      </style>
      

      最佳做法是向受众群体成员询问网页对他们的影响。

      【讨论】:

      • 谢谢,但我正在寻找翻译解决方案,LTR/RTL 可以通过多种方式解决,也许并不完美,但至少可以。我想不通的问题是如何将几十页翻译成多种不同的语言,而不需要大量重复的视图代码,也不会使代码中的所有文本都变成变量而绝对不可读
      【解决方案4】:

      我同意此处提供的大多数解决方案。您的问题更多是面向设计(架构)而不是技术。您需要选择路径是否需要将此国际化逻辑保留在服务器(java)端或静态文件中。

      如果你想去java端(首选解决方案),你需要保留两个属性文件并使用jstl标签。如果您以后想添加另一种语言,这可以最大限度地减少您的工作。这是可维护的解决方案。我见过支持超过 15 种语言和时区的应用程序。事实上,发布过程变得非常简单。

      如果您想保留多个 css 和其他静态文件,您很快就会发现事情很快就用完了。我不认为这是一个可维护的解决方案。

      说了这么多,我会把这个选择留给应用程序的架构师。他将能够根据应用的性质和给予他的限制来判断走哪条路。

      【讨论】:

        【解决方案5】:

        你不想到处使用。很遗憾,因为这正是您应该这样做的方式。如果需要国际化,将硬编码文本保存在 jsp 中是一种不好的做法。

        此外,大多数现代 IDE 都允许您通过 ctrl+左键单击(或悬停键)进入变量声明,因此代码中包含大量变量不应该成为维护问题。

        【讨论】:

          【解决方案6】:

          首先,对于每个文本元素,您必须区分它是用户界面元素(例如按钮标签)还是编辑内容。

          用户界面元素标签将存储在必须为每种支持的语言翻译的属性文件中(并提供默认值作为后备)

          编校内容将存储在内容管理系统中,您将组织该系统以便轻松找到内容的本地化版本

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-13
            • 2014-01-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多