如何以塞尔维亚语,俄语和阿拉伯语显示文本(JSF 2.0)

时间:2011-08-15 00:39:52

标签: java jsf java-ee internationalization jsf-2

在互联网上,我找到了一本名为JSF 2.0 cookbook的书。

我骑了第7章(国际化),我发现它非常简单,我自己尝试了一切,除了使用俄语,阿拉伯语,塞尔维亚语等语言中的字符外,一切正常...

这本书说:

  

使用阿拉伯语,中文,俄语字符时的常见问题(和   听起来像这样:“我可以在inputText中输入这样的字符   组件,但是当我提交表单时,会显示插入的文本   用Unicode字符代替人类可读的字符。如何   解决这个问题?”。   解决方案非常简单。你所要做的就是写下   JSF页面中的以下行:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

这就是我所做的。我在主JSF模板的第一行代码中添加了该行。但它没有用。 我错过了什么?我的所有本地化属性文件都配置为使用UTF-8:

enter image description here

我也在我的h:head标签中尝试了这一行:

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

我还需要在俄语,阿拉伯语中查看我的页面中的文字... 当我改为ru,ar或sr语言环境时,我唯一看到的是这样的文字:

  

¨Ø¨ØØ«ÙÙØμÙØاتÙÙÙØ©ÙسÙ

更新 在阅读了一些关于本地化的文章后,我得出结论,我的应用程序需要进行转换以便能够呈现特殊字符(我不喜欢属性文件中的scape字符的解决方案)。我在这个链接上关注了一个例子:http://jdevelopment.nl/internationalization-jsf-utf8-encoded-properties-files/

我理解其中的大部分,但是当我尝试在我的应用程序中执行此操作时,我看到我仍然在浏览器上看到了rubish。我试过各种各样的方式,但都没有用:

这是我组织文件的方式:

enter image description here

这是我的faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
    <application>
        <message-bundle>resources.application</message-bundle>
        <locale-config>
            <default-locale>en</default-locale>
            <supported-locale>en</supported-locale>
            <supported-locale>de</supported-locale>
            <supported-locale>it</supported-locale> 
            <supported-locale>es</supported-locale> 
            <supported-locale>fr</supported-locale> 
            <supported-locale>sr</supported-locale> 
            <supported-locale>ar</supported-locale>
            <supported-locale>ru</supported-locale>
        </locale-config>

        <!-- Localization files configuration -->
        <resource-bundle>
            <!-- Path to the file -->
            <base-name>resources.messages</base-name>
            <!-- Variable representation of the file -->
            <var>msgs</var>
        </resource-bundle>              
    </application>

</faces-config>

这是我在上面链接中找到的文件,可以进行转换:

package support;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

import javax.faces.context.FacesContext;

public class TextBunddle extends ResourceBundle {

    protected static final String BUNDLE_NAME = "resources.messages";
    protected static final String BUNDLE_EXTENSION = "properties";
    protected static final Control UTF8_CONTROL = new UTF8Control();

    public TextBunddle() {
        setParent(ResourceBundle.getBundle(BUNDLE_NAME,
            FacesContext.getCurrentInstance().getViewRoot().getLocale(), UTF8_CONTROL));
    }

    @Override
    protected Object handleGetObject(String key) {
        return parent.getObject(key);
    }

    @Override
    public Enumeration getKeys() {
        return parent.getKeys();
    }

    protected static class UTF8Control extends Control {
        public ResourceBundle newBundle
            (String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
                throws IllegalAccessException, InstantiationException, IOException
        {
            // The below code is copied from default Control#newBundle() implementation.
            // Only the PropertyResourceBundle line is changed to read the file as UTF-8.
            String bundleName = toBundleName(baseName, locale);
            String resourceName = toResourceName(bundleName, BUNDLE_EXTENSION);
            ResourceBundle bundle = null;
            InputStream stream = null;
            if (reload) {
                URL url = loader.getResource(resourceName);
                if (url != null) {
                    URLConnection connection = url.openConnection();
                    if (connection != null) {
                        connection.setUseCaches(false);
                        stream = connection.getInputStream();
                    }
                }
            } else {
                stream = loader.getResourceAsStream(resourceName);
            }
            if (stream != null) {
                try {
                    bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
                } finally {
                    stream.close();
                }
            }
            return bundle;
        }
    }

}

我认为错误在faces-config.xml中,但我不知道我应该配置文件的方式是什么,以便能够在我的页面中看到本地化消息时我使用这样的命令:

#{msgs.mainbaner}

当我要求更改语言时,这就是firebug所说的:

enter image description here

1 个答案:

答案 0 :(得分:4)

<%@page contentType="text/html" pageEncoding="UTF-8"%>

这就是JSP语法。这毫无意义。您正在使用默认情况下使用UTF-8的Facelets。

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

如果您通过HTTP提供页面而不是从本地磁盘文件系统打开,那么这一点毫无价值。


如果您看到垃圾,那么问题是由其他原因造成的。我建议花一些时间来完成这篇文章:Unicode - How to get the characters right?

至少,JSF2 / Facelets的关键点是:

  • 将IDE配置为使用UTF-8。
  • 将您的数据库/表配置为使用UTF-8。
  • 属性文件必须是ISO-8859-1,您必须使用unicode转义。但是JSF是一种自定义ResourceBundle风格的解决方法,因此您可以在属性文件中使用UTF-8。