JSF 2.0 中的 i18n 问题(乌克兰语和俄语)
目标:我想使用 jsf`s i18n
场景:
创建资源包(utf-8)
文件信息:
file -I ./messages.properties
./messages.properties: text/plain; charset=utf-8
使用它
通过faces-config
<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 futures 的帮助下为 jsf 做一个像 String (value.getBytes("ISO-8859-1"),"UTF-8") 这样的技巧?
Q3:maven配置有什么问题?
谢谢!
Goal: I want to use jsf`s i18n
Scenario:
creating resource bundle (utf-8)
file info:
file -I ./messages.properties
./messages.properties: text/plain; charset=utf-8
using it by
faces-config:
<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>
in some 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>
Problem:
In result I get wrong encoded text for those buttons.
I was tried to use 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>
I got different symbols, but still wrong.
I made I trick by passing messages with :
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 + '!';
}
}
}
it was successful, I got a valid text, but it is ugly to use in jsf..
info:
I am using glassfish v3, mac osx (so defaulst encoding latin1 or ISO-8859-1,- no shure.)
Q1: what could be a cause of problem (bad encoding for jsf i18n)? [closed]
Q2: is it possible to do a trick like String (value.getBytes("ISO-8859-1"),"UTF-8") for jsf with the help of maven or by some jsf futures ?
Q3: what is wrong with maven configuration?
Thank you!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不确定 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
,如下所示:这适用于我。
另请参阅:
I am not sure how native2ascii in Maven-2 is supposed to work, but the
java.util.ResourceBundle
indeed by default reads resources using ISO-8859-1. The native2ascii tool is supposed to create a new set of ISO-8859-1 encoded resource files based on UTF-8 encoded ones. I myself name all of those UTF-8 properties filesmessage_xx_XX.utf8.properties
and then use the commandline native2ascii tool to encode them tomessage_xx_XX.properties
as follows:This works for me.
See also:
Q1:原因是文件系统上的文件编码。
Q2:我还没有找到使用 maven 编码这些文件的正确方法,但是 jetBrains Idea 为我做了一些技巧 - 在属性中它有一个编码选项(文件编码) - 并且有配置“属性文件的默认编码” - 把将其设置为 UTF-8 并将“透明本机到 ASCII 转换”复选框设置为 true
有了这个选项,一切都很完美,但这不是我认为的正确方法,所以我将研究正确的 maven 的 native2ascii 插件配置。
如果有人知道我的配置出了什么问题,请回答问题3。
谢谢你!
Q1: the cause is file encoding on file system.
Q2: I have not find the right way to encode those file with maven, but jetBrains Idea do some trick for me - in Properties it have an Encoding options (File Encodings) - and there is configuration "Default encoding for properties files" - put it to UTF-8 and set ti true check box "Transparent native-to-ascii conversion"
With this option all work perfect, but it is not a right way as I think, so i will make research for right maven`s native2ascii plugin configuration.
if some one know what is wrong n my configuration, please answer on Q3.
Thank you!