12
votes

I18N avec des fichiers de propriétés codés UTF-8 dans l'application JSF 2.0

J'utilise JSF-RI 2.0.3 où le soutien en hébreu et en russe est nécessaire. Le problème est que je vois Gibberish sur l'écran au lieu du texte correct.

Tout d'abord, j'ai défini des paquets (* _locale.properties) pour chaque langue. Les fichiers sont en codage UTF-8. Deuxièmement, j'ai défini les paramètres par défaut et pris en charge dans les visages-config.xml xxx

que ce que j'ai ajouté un filtre personnalisé qui définira l'encodage du charcutage de réponse à UTF- 8. xxx

et enfin lorsque je crée un simple xhtml pour déboguer la sortie, je vois des résultats très étranges xxx

Le résultat est la suivante: xxx

Qu'est-ce qui ne va pas avec ma configuration?


0 commentaires

3 Réponses :


5
votes

Eh bien, après une enquête profonde, j'ai trouvé la solution.

plus tôt vers Java 1.6 PropertyTyresourcebundle code> n'avait qu'un seul constructeur qui dispose de la documentation suivante le fichier de propriété lire avec ce constructeur doit être codé dans ISO-8859-1. Code> Cela signifie qu'il est possible d'utiliser uniquement du texte anglais dans les paquets de ressources. P>

Il existe deux solutions pour ce numéro: p>

La première rédaction d'un composant LoadBundle personnalisé Wich utilisera La méthode de l'instanciation p>

Le second (mon choix) utilise le Convertisseur Native-TO-ASCII qui peut être utilisé avec Maven à l'aide de NATIVE2ASCII Maven Plugin . P>

Voici l'exemple de configuration: P>

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>native2ascii-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>native2ascii</goal>
            </goals>
            <configuration>
                <src>${basedir}/src/main/resources</src>                
                <dest>${project.build.directory}/native2ascii</dest>
                <encoding>UTF8</encoding>
                <includes>**/*.properties</includes>
            </configuration>
        </execution>
    </executions>
</plugin>


0 commentaires

27
votes

Droite, vous pouvez créer une personnalisation ResourceBundle ou utilisez le convertisseur Native2ASCII (si nécessaire avec le plugin Maven 2 pour rendre la conversion plus transparente). Étant donné que l'autre réponse ne va qu'avec la dernière approche en détail, voici une autre réponse sur la manière dont vous pourriez créer un fichier CustomsBundle pour charger des fichiers de propriétés comme UTF-8 dans une application JSF 2.x sur Java SE 1.6 Environnement.

faces-config.xml xxx

com.example.i18n.texample xxx

ceci attend des fichiers de propriétés codés UTF-8 comme text.properties , text_en.properties , etc dans com.example .i18n paquet. Pas besoin de natif2asciii.

D'ailleurs, avec le nouveau style JSF 2.0 Déclaration dans Face-config.xml , vous Vous n'avez pas besoin dans les vues plus. Tout le texte sera directement disponible par # {texte} sous toutes les vues.


3 commentaires

C'est un excellent outil. Sera-t-il ajouté à omnifacer un jour?


@Med: J'en ai considéré cela, mais j'ai décidé que c'était sur le bord avec "Hacky". Utilisez plutôt les bons éditeurs et créez des outils tels que Eclipse et / ou Maven / ant. E.G., Lors de l'utilisation de l'éditeur de fichiers Propriétés intégré Eclipse, UTF-8 sera enregistré de manière transparente en tant que ISO-8859-1 avec des points de code Unicode si nécessaire.


C'est très utile @Ballusc. Merci beaucoup. J'ai une question ici, dans les pages XHTML, nous pouvons obtenir une valeur de n'importe quelle clé à l'aide de texte de variable, mais si nous voulons l'obtenir dans le code Java, comment pouvons-nous faire cela?



0
votes

J'ai le même problème avec l'application SWT autonome. Ceci est le chargeur de ressources modifié généré par WindowBuilder. Idée de base - La classe de messages contient uniquement des ressources dans des champs de chaîne. Donc, je les convertis en UTF8 (si possible) après le chargement RAW ISO-8859-1.

import java.lang.reflect.Field;

import org.eclipse.osgi.util.NLS;

public class Messages extends NLS {
private static final String BUNDLE_NAME = "org.digimead.tabuddy.desktop.res.messages"; //$NON-NLS-1$
public static String MainWindow_newShell_text;
public static String MainWindow_actionOpenFile_text;
public static String MainWindow_actionCloseFile_text;

// //////////////////////////////////////////////////////////////////////////
//
// Constructor
//
// //////////////////////////////////////////////////////////////////////////
private Messages() {
    // do not instantiate
}

// //////////////////////////////////////////////////////////////////////////
//
// Class initialization
//
// //////////////////////////////////////////////////////////////////////////
static {
    // load message values from bundle file
    NLS.initializeMessages(BUNDLE_NAME, Messages.class);
    final Field[] fieldArray = Messages.class.getDeclaredFields();
    final int len = fieldArray.length;
    for (int i = 0; i < len; i++) {
        final Field field = (Field) fieldArray[i];
        if (field.getType() == java.lang.String.class) {
            if (!field.isAccessible())
                field.setAccessible(true);
            try {
                final String rawValue = (String) field.get(null);
                field.set(null, new String(rawValue.getBytes("ISO-8859-1"),
                        "UTF-8"));
            } catch (Exception e) {
                // skip field modification
            }
        }
    }
}


0 commentaires