Iam*_*MAN 80 java unicode jsp internationalization
我从谷歌那里了解到,国际化是我使用我的网络应用程序来使用所有语言的过程.我想了解Unicode的国际化过程,所以我从这里和那里学习了Unicode .
我能够理解Unicode如何将字符集设置为字节并再次将字节解码为字符集.但我不知道如何进一步前进.我想学习如何比较字符串,我需要知道如何在我的Web应用程序中实现国际化.有什么建议吗?请指导我.
我的目标:
我的主要目标是开发一个用于翻译的Web应用程序(英语到阿拉伯语,反之亦然).我想遵循国际化.我希望在所有三种浏览器中运行我的Web应用程序进行翻译,即FF,Chrome,IE.我该如何实现这一目标?
Bal*_*usC 219
对于基本的JSP/Servlet Web应用程序,基本方法是将JSTL fmt
taglib与资源包结合使用.资源包包含键值对,其中键是常量,对于所有语言都是相同的,并且每种语言的值不同.资源包通常是由API 加载的属性文件ResourceBundle
.但是,可以对其进行自定义,以便您可以从例如数据库加载键值对.
以下是如何使用基于属性文件的资源包来使webapplication的登录表单国际化的示例.
创建以下文件并将它们放在某个包中,例如com.example.i18n
(在Maven的情况下,将它们放在包结构中src/main/resources
).
text.properties
(包含默认语言的键值对,通常为英语)
login.label.username = Username login.label.password = Password login.button.submit = Sign in
text_nl.properties
(包含Dutch(nl
)键值对)
login.label.username = Gebruikersnaam login.label.password = Wachtwoord login.button.submit = Inloggen
text_es.properties
(包含西班牙语(es
)键值对)
login.label.username = Nombre de usuario login.label.password = Contraseña login.button.submit = Acceder
资源包文件名应遵循以下模式name_ll_CC.properties
.该_ll
部分应为小写的ISO 693-1语言代码.它是可选的,只有在_CC
零件存在时才需要.该_CC
部分应为大写的ISO 3166-1 Alpha-2国家代码.它是可选的,通常仅用于区分国家特定的语言方言,如美式英语(_en_US
)和英式英语(_en_GB
).
如果尚未完成,请安装JSTL.如果您正在运行Servlet 2.5容器或更新版本(Tomcat 6.0等)并且web.xml
声明符合Servlet 2.5规范,那么只需将jstl-1.2.jar放在webapp的/WEB-INF/lib
文件夹中即可.
创建以下示例JSP文件并将其放在Web内容文件夹中.
login.jsp
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />
<fmt:setBundle basename="com.example.i18n.text" />
<!DOCTYPE html>
<html lang="${language}">
<head>
<title>JSP/JSTL i18n demo</title>
</head>
<body>
<form>
<select id="language" name="language" onchange="submit()">
<option value="en" ${language == 'en' ? 'selected' : ''}>English</option>
<option value="nl" ${language == 'nl' ? 'selected' : ''}>Nederlands</option>
<option value="es" ${language == 'es' ? 'selected' : ''}>Español</option>
</select>
</form>
<form method="post">
<label for="username"><fmt:message key="login.label.username" />:</label>
<input type="text" id="username" name="username">
<br>
<label for="password"><fmt:message key="login.label.password" />:</label>
<input type="password" id="password" name="password">
<br>
<fmt:message key="login.button.submit" var="buttonValue" />
<input type="submit" name="submit" value="${buttonValue}">
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
该<c:set var="language">
管理当前语言.如果语言是作为请求参数提供的(通过语言下拉列表),那么它将被设置.否则如果语言先前已在会话中设置,则坚持使用它.否则,请在请求标头中使用用户提供的区域设置.
该<fmt:setLocale>
套语言环境资源包.重要的是,这条线是之前的<fmt:setBundle>
.
在<fmt:setBundle>
通过其基本名称初始化资源包(即,完全限定的包名称,直到与没有唯一名称_ll_CC
指定符).
所述<fmt:message>
检索由指定捆密钥的消息值.
该<html lang="${language}">
通知searchbots的页面是什么语言,这样就不会被重复的内容标记(因此,有利于搜索引擎优化).
当选择其他语言时,语言下拉列表将立即通过JavaScript提交,并且页面将使用新选择的语言刷新.
但是,您需要记住,默认情况下,使用ISO-8859-1字符编码读取属性文件.你需要通过unicode转义逃脱它们.这可以使用JDK提供的native2ascii.exe
工具完成.有关更多详细信息,另请参阅本文章节.
理论上的替代方案是提供一个带有自定义的bundle Control
来将这些文件加载为UTF-8,但遗憾的是,基本的JSTL fmt
taglib 不支持.你需要在a的帮助下自己管理它Filter
.有一些(MVC)框架可以以更透明的方式处理这个问题,比如JSF,另见本文.
Paw*_*yda 26
除了BalusC所说的,你必须要注意方向性(因为英语是从左到右,而阿拉伯语是相反的).最简单的方法是将dir
属性添加到html
JSP网页的元素并将其外部化,因此值来自属性文件(就像其他元素或属性一样):
<html dir="${direction}">
...
</html>
Run Code Online (Sandbox Code Playgroud)
此外,设置这样的应用程序几乎没有问题 - 你应该说至少避免绝对定位.如果你出于某种原因无法避免这种情况,你可以使用不同的样式表(每种?)语言或做一些禁止使用的表格,即使用表格来管理布局.如果你想使用div元素,我建议使用具有"对称"左右风格属性的相对定位(两者都具有相同的值),因为这是使切换方向性起作用的原因.
您可以在此处找到有关双向网站的更多信息.