我使用this英语到印地语Unicode转换器。生成的代码放在MessageBundle_hi_IN.properties
文件中。
违反约束时,如强制文本字段。应从此文件中选取相应的错误消息,并以印地语显示,但它显示与文件中相同的Unicode,不进行任何转换,如
खालि नहि रख शकते.
预计将以印地语显示。
खालिनहिरखशकते。
这意味着" 不能留空。"
XHTML页面。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="#{localeBean.language}"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<f:view locale="#{localeBean.locale}">
<h:head>
<title>Title</title>
</h:head>
<h:body>
<h:form>
<h:selectOneMenu id="languages" value="#{localeBean.language}" onchange="submit();" style="position: absolute; right: 0; top: 50px;">
<f:selectItem itemValue="en" itemLabel="English" />
<f:selectItem itemValue="hi" itemLabel="Hindi" />
</h:selectOneMenu>
</h:form>
</h:body>
</f:view>
</html>
相应的托管bean。
package admin.mangedbean;
import java.io.Serializable;
import java.util.Locale;
import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
@ManagedBean
@SessionScoped
public final class LocaleBean implements Serializable
{
private Locale locale;
private static final long serialVersionUID = 1L;
public LocaleBean() {}
@PostConstruct
private void init()
{
locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
}
public Locale getLocale()
{
return locale;
}
public String getLanguage()
{
return locale.getLanguage();
}
public void setLanguage(String language)
{
if(language.equals("hi"))
{
locale = new Locale(language, "IN");
}
else
{
locale = new Locale(language);
}
FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
}
}
faces-config.xml文件。
<application>
<message-bundle>
messages.MessageBundle
</message-bundle>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>hi_IN</supported-locale>
</locale-config>
<resource-bundle>
<base-name>messages.ResourceBundle</base-name>
<var>messages</var>
</resource-bundle>
</application>
这适用于JSP,例如
<fmt:setLocale value="hi_IN"/>
<fmt:setBundle basename="bundles.resourceBundle_hi_IN" var="resourceBundle"/>
<fmt:message key="someKey" bundle="${resourceBundle}"/>
这里出了什么问题?我使用了错误的converter吗? JSF不支持这种语言吗?
答案 0 :(得分:2)
此,
खालि नहि रख शकते.
是印度语的HTML转义形式。作为JSF's builtin XSS-attack prevention的一部分,任何输出文本都是隐式HTML转义的。因此,实际上,这个HTML转义的印地语最终会在生成的HTML中双重转义,如下所示(右键单击,查看源以便自己查看):
&#2326;&#2366;&#2354;&#2367; &#2344;&#2361;&#2367; &#2352;&#2326; &#2358;&#2325;&#2340;&#2375;&#46;
这使得它在Webbrowser解释后以其原始的HTML转义形式出现。
毕竟,在&#XXXX;
文件中使用HTML转义格式.properties
并不是正确的方法。您应该使用Unicode转义格式\uXXXX
。另请参阅javadoc of java.util.Properties
。当你在一个Java风格的项目中编辑一个扩展名为.properties
的文件时,像Eclipse这样有点不错的IDE已经自动完成了。你可以用通常的方式输入印地语,Eclipse会自动逃脱它。但是,如果您使用的是其他编辑器,或者无法确定如何正确配置编辑器,那么您需要使用JDK提供的native2ascii
工具。再次,请参阅前面提到的Javadoc以获取详细信息。
最终,你的印地语的正确的Unicode转义形式看起来像这样(我在Eclipse逃脱之后进行了复制):
\u0916\u093E\u0932\u093F \u0928\u0939\u093F \u0930\u0916 \u0936\u0915\u0924\u0947.
将此未修改内容放在.properties
文件中。
它在遗留JSP中的作用仅仅是因为它具有相当传统和劣质的视图技术,没有任何形式的隐式XSS攻击防御,因此不会HTML转义任何模板文本。
无关,对于您还不知道的情况,您也可以直接在Facelets文件的源代码中编写印地语。您只需确保编辑器配置为使用UTF-8保存文本文件。您找到的转换器对于现代JSF开发绝对没用。