1

目標: 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 構成の何が問題になっていますか?

ありがとうございました!

4

2 に答える 2

1

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 files message_xx_XX.utf8.properties and then use the commandline native2ascii tool to encode them to message_xx_XX.properties as follows:

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

This works for me.

See also:

于 2010-06-24T00:18:50.457 に答える
1

Q1: 原因はファイル システム上のファイル エンコーディングです。

Q2: これらのファイルを Maven でエンコードする正しい方法が見つかりませんでしたが、jetBrains Idea は私のためにいくつかのトリックを行います.Properties には Encoding オプション (File Encodings) があり、「Default encoding for properties files」という設定があります.それを UTF-8 に設定し、「透過的なネイティブから ascii への変換」チェック ボックスを true に設定します。構成。

私の設定で何が間違っているのか誰かが知っているなら、Q3で答えてください。

ありがとうございました!

于 2010-06-24T09:56:13.623 に答える