在JSF 2.0中使用i18n的问题(乌克兰语和俄语)

时间:2010-06-23 15:18:15

标签: maven-2 encoding internationalization jsf-2

目标:我想使用jsf的i18n

情景:

创建资源包(utf-8)

档案信息:

 file -I ./messages.properties
./messages.properties: text/plain; charset=utf-8

使用它

面-配置:

<application>
        <locale-config>
            <default-locale>uk_UA</default-locale>
            <supported-locale>en_US</supported-locale>
            <supported-locale>ru_RU</supported-locale>
        </locale-config>        
        <resource-bundle>
            <base-name>ua.eset.oasys.hydra.i18n.messages</base-name>
            <var>i18n</var>
        </resource-bundle>
    </application>

在某些index.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 xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:vt="http://java.sun.com/jsf/composite/security">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>

<ui:composition template="layout/template.xhtml">
    <ui:define name="top">
        <h:form>
            <h:panelGrid border="4">

...
                <f:view>                    
                    <h:commandButton value="#{i18n['logout']}" action="#{securityBacking.logout}"/>
                </f:view>
            </h:panelGrid>
        </h:form>
    </ui:define>

    ...

</ui:composition>

</body>
</html>

问题: 结果我得到了这些按钮的错误编码文本。

我曾尝试使用native2asciiin maven

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>oasys</artifactId>
        <groupId>ua.co.oasys</groupId>
        <version>1.0</version>
    </parent>

    <groupId>ua.co.oasys</groupId>
    <artifactId>hydra</artifactId>
    <packaging>war</packaging>
    <name>Hydra</name>


    <properties>
        <project.build.sourceEncoding>
            UTF-8
        </project.build.sourceEncoding>

        <project.reporting.outputEncoding>
            UTF-8
        </project.reporting.outputEncoding>
    </properties>


    <dependencies>

        <!-- SL4J API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.0</version>
        </dependency>

        <!-- SLF4J JDK14 Binding  -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>1.6.0</version>
        </dependency>

        <!-- Injectable Weld-Logger -->
        <dependency>
            <groupId>org.jboss.weld</groupId>
            <artifactId>weld-logger</artifactId>
            <version>1.0.0-CR2</version>
        </dependency>

        <!--<dependency>-->
        <!--<groupId>org.jboss.weld</groupId>-->
        <!--<artifactId>weld-extensions</artifactId>-->
        <!--<version>1.0.0.Alpha2</version>-->
        <!--</dependency>-->
        <!--<dependency>-->
        <!--<groupId>org.jboss.weld</groupId>-->
        <!--<artifactId>weld-api</artifactId>-->
        <!--<version>1.0-CR4</version>-->
        <!--</dependency>-->


        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <scope>provided</scope>
            <version>1.0-CR1</version>
        </dependency>
        <dependency>
            <groupId>javax.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.ejb</artifactId>
            <version>3.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.servlet</artifactId>
            <version>3.0-b70</version>
            <type>jar</type>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>hydra</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <encoding>utf8</encoding>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>native2ascii-maven-plugin</artifactId>
                <version>1.0-alpha-1</version>
                <configuration>
                    <dest>target/classes</dest>
                    <src>src/main/resources</src>
                </configuration>
                <executions>
                    <execution>
                        <id>native2ascii-utf8</id>
                        <goals>
                            <goal>native2ascii</goal>
                        </goals>
                        <!-- specific configurations -->
                        <configuration>
                            <!--<encoding>UTF8</encoding>-->
                            <tasks>
                                <native2ascii encoding="UTF-8"
                                              src="."
                                              dest="src/main/resources" includes="**/*.properties">
                                    <mapper type="glob" from="*.properties.utf8"
                                            to="*.properties"/>
                                </native2ascii>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

我有不同的符号,但仍然错了。

我通过以下方式传递消息:

String (value.getBytes("ISO-8859-1"),"UTF-8") ;

Messages.java:

public class Messages {
    private static final String BUNDLE_NAME = "ua.eset.oasys.hydra.i18n.messages"; 
    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);

    private Messages() {

    }

    public static String getString(String key) {
        try {
            String value = (String) RESOURCE_BUNDLE.getString(key);
            try {
                   return new String (value.getBytes("ISO-8859-1"),"UTF-8") ;
            } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    return null;
            }
        } catch (MissingResourceException e) {
                return '!' + key + '!';
        }
    }
}

它成功了,我得到了一个有效的文本,但在jsf中使用它很难看。

信息: 我正在使用glassfish v3,mac osx(所以默认编码为latin1或ISO-8859-1, - 没有shure。)

Q1:可能导致问题的原因(jsf i18n编码错误)? [关闭]

Q2:是否可以在maven或某些jsf期货的帮助下为jsf做一个像String(value.getBytes(“ISO-8859-1”),“UTF-8”)这样的技巧?

问题3:maven配置有什么问题?

谢谢!

2 个答案:

答案 0 :(得分:1)

我不确定Maven-2中的native2ascii应该如何工作,但java.util.ResourceBundle确实默认使用ISO-8859-1读取资源。 native2ascii工具应该基于UTF-8编码的资源文件创建一组新的ISO-8859-1编码资源文件。我自己命名所有UTF-8属性文件message_xx_XX.utf8.properties,然后使用命令行native2ascii工具将它们编码为message_xx_XX.properties,如下所示:

native2ascii.exe -encoding UTF-8 text_xx_XX.utf8.properties text_xx_XX.properties

这适合我。

另见

答案 1 :(得分:1)

Q1:原因是文件系统上的文件编码。

Q2:我没有找到用maven编码这些文件的正确方法,但jetBrains Idea为我做了一些技巧 - 在Properties中它有一个编码选项(文件编码) - 并且有配置“属性文件的默认编码“ - 把它放到UTF-8并设置ti true复选框”透明的native-to-ascii转换“ 有了这个选项,所有工作都很完美,但我认为这不是正确的方法,因此我将研究正确的maven的native2ascii插件配置。

如果有人知道我的配置有什么问题,请在第3季回答。

谢谢!