我想创建一个可以用两种语言查看的网站,一个LTR和一个RTL。这意味着所有内容都应以两种语言中的任何一种显示。
我的框架是Spring,我正在使用Tiles2,但我认为这个问题不是特定于框架的。
支持两种语言的显而易见的解决方案是将所有内容加倍(所有JSP,片段等),并获得适合您选择的语言的树的一部分。但是这会在更改网站时导致问题(您可能忘记更新其他JSP),并且不可扩展(尝试使用5或10种语言)。
我知道我可以使用属性文件来托管不同语言的字符串,但是我的网站将是spring:message标签的大量集合,并且将更难维护(如果我有一段100行,这一切都进入一个属性行吗?)
是否有任何类型的框架,插件,其他,它解决了这个问题?有没有人遇到过这个问题的聪明解决方案?
答案 0 :(得分:4)
我从未意识到完整的项目,只是一些测试。我认为这个问题并不像你遵循一些简单的规则那么大。以下是我要做的事情:
使用<body dir='ltr/rtl'>
指定方向。这与CSS方向属性相比是首选。
避免在所有CSS中使用不同的左/右边距或填充。如果您必须违反此规则,可能需要使用包含所有这些不同元素的两个不同文件(ltr.css和rtl.css)。
有时你需要从左到右移动一些元素,反之亦然。例如,在LTR中,您需要左侧的菜单,但在RTL中,您希望它在右侧。您可以使用CSS实现此目的,但如果您不是专家并且必须在所有浏览器中对其进行测试,这有时会很复杂。另一种选择是根据具体情况使用一些IF。如果您使用基于网格的CSS库(如Bootstrap。
仔细选择您将使用的CSS和JS库。显然,选择提供RTL / LTR支持的那些。
不要太担心图像。如果您必须根据语言更改一个图像,可能是因为它中包含一些文本。所以,无论如何你必须使用不同的图像。这是与i18n相关的问题,而不是文本方向问题。
不要让您的客户对此过于挑剔。我认为通过这些规则(可能还有一些)你可以得到一个好的结果。但是如果你的客户开始抱怨这里有一个像素而另一个像素,那么你需要使所有这些都复杂化,而且可能没有必要。
关于语言属性文件。是的,使用它们。总是。即使您只使用一种语言,这也是一种很好的做法:HTML结构与内容分离,非常容易纠正或翻译,某些单词或句子只在一个文件中...
答案 1 :(得分:2)
通常,Web框架用于构建Web应用程序而不是Web站点,并且很少有长静态段落。大多数内容都是动态的,来自数据库。但是,通常的做法是将所有内容外部化为资源包,通常以属性文件的形式。
在属性文件中放一个长段不会造成太大问题,因为你可以通过反斜杠结束每一行来将长段落分成多行:
home.welcomeParagraph=This is a long \
paragraph splitted into several lines \
thanks to backslashes.
答案 2 :(得分:1)
RTL和LTR是上层问题和更困难的问题之一。
基本上它是MVC模型的视图范围的问题。这也可能包括图片和情感差异,如人的皮肤颜色。在这种情况下,您最好选择HTML + CSS为您提供的解决方案。
例如:
<style type="text/css">
*:lang(ar) { direction:rtl }
*:lang(de) { direction:ltr }
</style>
最佳做法是向受众群体成员询问网页对他们的影响。
答案 3 :(得分:1)
我同意这里提供的大部分解决方案。您的问题更多是设计(架构)而非技术。您需要选择路径是否需要在服务器(Java)端或静态文件中保留此国际化逻辑。
如果您想要使用java(最好的解决方案),您需要保留两个属性文件并使用jstl标记。如果您希望将来添加其他语言,这可以最大限度地减少您的工作量。这是可维护的解决方案。我见过应用程序支持超过15种语言和时区。事实上,发布过程非常简单。
如果您想要保留多个css和其他静态文件,很快就会发现很快就会出现问题。我不认为这是一个可维护的解决方案。
说这一切,我会把这个选择留给应用程序的架构师。他将能够根据申请的性质和给予他的限制来判断走哪条路。
答案 4 :(得分:0)
你不想到处使用。这很可惜,因为它只是你应该这样做的方式。如果需要国际化,将硬编码文本保存在jsp中是一种不好的做法。
此外,大多数现代IDE允许您通过执行ctrl +左键单击(或悬停键)来转到变量声明,这样在代码中包含大量变量不应该是维护的问题。
答案 5 :(得分:0)
首先,您必须为每个文本元素区分它是用户界面元素(例如按钮标签)还是redactionnal内容。
用户界面元素标签将存储在属性文件中,该文件必须针对每种受支持的语言进行翻译(并提供默认值作为后退)
redactionnal内容将存储在您将组织的内容管理系统中,以便轻松查找内容的本地化版本