2010-06-23 72 views
1

目标国际化:我想用jsf`s国际化问题与JSF 2.0(乌克兰和俄罗斯)

场景:

创建资源包(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行家

的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版(所以defaulst编码LATIN1或ISO-8859-1, - 没有舒尔)

Q1:什么可能是问题的原因(jsf i18n的编码不好)? Q2:是否有可能通过maven或某些jsf期货为jsf做类似String(value.getBytes(“ISO-8859-1”),“UTF-8”)的技巧?

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

谢谢!

回答

1

Q1:病因文件系统上的文件的编码。 Q2:我没有找到用maven编码这些文件的正确方法,但jetBrains Idea为我做了一些技巧 - 在属性中它有一个编码选项(文件编码) - 并且有配置“属性的默认编码文件“ - 将其设置为UTF-8并设置为真复选框”透明的本地到ASCII转换“ 使用此选项,所有工作都很完美,但它不是我想的正确方式,所以我将对正确的方式进行研究maven的native2ascii插件配置。

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

谢谢!

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 

这对我的作品。

参见:

+0

感谢您的回复。看起来我有maven床配置..需要做一些研究。我目前发现了一些不同的方式,但它不适合我。我的更新和答案。 – 2010-06-24 09:59:20