2

我正在使用这个英语到印地语 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}"/>

这里出了什么问题?我使用了错误的转换器吗?JSF 不支持这种语言吗?

4

1 回答 1

2

这,

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

是印地语的 HTML 转义形式。作为JSF 内置的 XSS 攻击预防的一部分,任何输出文本都被隐式 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;

一旦被网络浏览器解释,这会导致它以原始的 HTML 转义形式出现。

毕竟,&#XXXX;.properties文件中使用 HTML 转义的表单不是正确的方法。您应该改用 Unicode 转义形式\uXXXX。另请参见java.util.Properties. .properties当您在 Java 风格的项目中编辑带有扩展名的文件时,像 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 开发绝对没用。

于 2013-08-20T19:41:00.377 回答