JSP国际化RTL/LTR

5
我想创建一个网站,可以用两种语言查看,一种从左到右(LTR),一种从右到左(RTL)。这意味着所有内容都应该以其中一种语言显示。
我的框架是Spring,并且我正在使用Tiles2,但我认为这个问题不是特定于框架的。
支持两种语言的明显解决方案是将所有内容加倍(所有JSP、片段等),然后获取适合所选语言的部分。但是,在更改网站时会出现问题(您可能会忘记更新其他JSP),而且不可扩展(尝试使用5或10种语言进行此操作)。
我知道我可以使用属性文件来存储不同语言的字符串,但是那样我的网站将成为大量spring:message标记的集合,并且将更难维护(如果我有一个100行的段落,会发生什么情况?所有内容都放在单个属性行中吗?)
是否有任何类型的框架、插件或其他工具可以解决这个问题?有没有人遇到过这个问题的聪明解决方案?

不考虑Tiles/Spring等,您可以在这里找到一个基本的JSP/JSTL示例:https://dev59.com/G2855IYBdhLWcg3wjlGL#4278571 - BalusC
我已经使用这些技术创建了一个国际化的网站,这就是为什么我正在寻找一些不同的东西。我在考虑创建一个 Eclipse 插件,可以神奇地将任何 JSP 片段嵌入国际化中,只是想知道是否有人遇到过类似的东西。 - TheZuck
6个回答

4

我从未完成过一个完整的项目,只是做了一些测试。如果你遵循一些简单的规则,我认为这个问题并不像看起来那么大。以下是我会尝试做的:

  • 使用 <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.

1

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

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

例如:

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

最佳实践是询问受众群体成员网页对他们产生了什么影响。

谢谢,但我正在寻找翻译解决方案。LTR / RTL 可以有很多解决方法,也许不完美,但至少可以工作。我无法想出如何在没有使代码中的所有文本变成变量的情况下,将数十页内容翻译成许多不同的语言,而不会产生大量重复的视图代码和使代码变得难以阅读的问题。 - TheZuck

1

我同意这里提供的大部分解决方案。你的问题更多地是设计(架构)导向,而不是技术性的。你需要选择路径,无论是在服务器(Java)端还是在静态文件中保留国际化逻辑。

如果你想选择Java端(首选方案),你需要保留两个属性文件并使用JSTL标签。这样可以最小化你未来添加另一种语言时的工作量。这是可维护的解决方案。我见过支持15种以上语言和时区的应用程序。实际上,发布流程变得非常容易。

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

说了这么多,我将把这个选择留给应用程序的架构师。他将能够根据应用程序的性质和给他的限制来判断哪种方式更好。


0

你不应该到处使用硬编码文本。这很遗憾,因为这是你应该做的方式。如果你需要国际化,把硬编码文本保留在jsp中是一种不好的实践。

此外,大多数现代IDE都允许你通过ctrl +左键单击(或悬停键)转到变量声明,因此在代码中有很多变量不应该成为维护问题。


0
首先,您必须区分每个文本元素是用户界面元素(例如按钮标签)还是编辑内容。
用户界面元素标签将存储在属性文件中,每种支持的语言都必须进行翻译(并提供默认值作为备用)。
编辑内容将存储在内容管理系统中,您需要组织它以便轻松找到本地化版本的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接