目標: 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 で使用するのは醜いです。
情報: 私はグラスフィッシュ v3、mac osx を使用しています (つまり、デフォルトで latin1 または ISO-8859-1 をエンコードします。不明です。)
Q1: 問題の原因は何ですか (jsf i18n の不適切なエンコーディング)? [閉まっている]
Q2: maven の助けを借りて、またはいくつかの jsf futures を使用して、jsf の String (value.getBytes("ISO-8859-1"),"UTF-8") のようなトリックを行うことは可能ですか?
Q3: Maven 構成の何が問題になっていますか?
ありがとうございました!