在JSF 2.0中使用印地语进行本地化

时间:2013-08-20 18:53:56

标签: jsf jsf-2 localization hindi

我使用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不支持这种语言吗?

1 个答案:

答案 0 :(得分:2)

此,

&#2326;&#2366;&#2354;&#2367; &#2344;&#2361;&#2367; &#2352;&#2326; &#2358;&#2325;&#2340;&#2375;&#46;

是印度语的HTML转义形式。作为JSF's builtin XSS-attack prevention的一部分,任何输出文本都是隐式HTML转义的。因此,实际上,这个HTML转义的印地语最终会在生成的HTML中双重转义,如下所示(右键单击,查看源以便自己查看):

&amp;#2326;&amp;#2366;&amp;#2354;&amp;#2367; &amp;#2344;&amp;#2361;&amp;#2367; &amp;#2352;&amp;#2326; &amp;#2358;&amp;#2325;&amp;#2340;&amp;#2375;&amp;#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开发绝对没用。