目标:我想使用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配置有什么问题?
谢谢!
答案 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季回答。
谢谢!