IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

[Java][Multi-langues][Swing] Deux problèmes


Sujet :

AWT/Swing Java

  1. #1
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut [Java][Multi-langues][Swing] Deux problèmes
    Bonjour,

    Je suis actuellement confronté à un problème de changement de langues. J'ai mis en place un systeme en suivant le tutoriel de sun concernant les changement de langues http://java.sun.com/docs/books/tutorial/i18n/TOC.html qui marche merveilleusement bien pour le passage Français Anglais et inversement. Cependant, j'ai une troisième langue à ajouter, qui est le japonais.

    Tout d'abbord, voici ma classe de gestion des langues :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    import java.util.Locale;
    import java.util.ResourceBundle;
     
    /**
     * This class is to manage all languages switches
     **/
    public class LanguageManager
    {
    	public static final Locale ENGLISH_LANGUAGE;
    	public static final Locale FRENCH_LANGUAGE;
    	public static final Locale JAPANESE_LANGUAGE;
     
    	private static final String[] languagesList;
     
    	private static Locale currentLanguage;
     
    	private static ResourceBundle messages;
     
    	private static String currentLanguageString;
     
    	/**
             *Init static variables and constants
             **/	
    	static
    	{
    		languagesList=new String[]
    		{
    			"Francais",
    			"English",
    			"Japanese"
    		};
     
     
     
     
    		ENGLISH_LANGUAGE=new Locale("en","US");
    		FRENCH_LANGUAGE=new Locale("fr","FR");
    		JAPANESE_LANGUAGE=new Locale("ja","JP");
     
    		currentLanguage=ENGLISH_LANGUAGE;
     
    		messages=ResourceBundle.getBundle("Facturation",currentLanguage);
     
    		currentLanguageString = "English";
    	}
     
    	/**
             * Returns the Languages that can be used by the software.
             * @returns a String array containing all languages
             **/
    	public static String[] getLanguagesList()
    	{
    		return languagesList;
    	}
     
    	/**
             * 
             **/
    	public static String getLocalizedText(String text)
    	{
    		System.out.println(text+" "+messages.getString(text));
    		return messages.getString(text);
    	}
     
    	/**
             * This function is to change Language.
             * @param newLanguage The language to change to. The param should be one of the languages of the <a href="LanguageManager.html#getLanguagesList()">getLanguagesList()</a> array. If another String is given, nothing happens.
             **/
    	public static void setCurrentLanguage(final String newLanguage)
    	{
    		boolean change=false;
    		if(newLanguage.equalsIgnoreCase("Francais"))
    		{
    			currentLanguage=FRENCH_LANGUAGE;
    			currentLanguageString="Francais";
    			change=true;
    		}
    		else if (newLanguage.equalsIgnoreCase("English"))
    		{
    			currentLanguage=ENGLISH_LANGUAGE;
    			currentLanguageString="English";
    			change=true;
    		}
    		else if (newLanguage.equalsIgnoreCase("Japanese")) // à changer en caractères japonais
    		{	
    			currentLanguage=JAPANESE_LANGUAGE;
    			currentLanguageString="Japonais";
    			change=true;
    		}
     
    		if(change)
    		{
    			messages=ResourceBundle.getBundle("Facturation",currentLanguage);
    		}
    	}
     
    	/**
             *This functions returns the current language
             *@return The current language
             **/
    	public static Locale getCurrentLanguage()
    	{
    		return currentLanguage;
    	}
     
    	public static String getCurrentLanguageString()
    	{
    		return currentLanguageString;
    	}
     
    }
    Donc quand j'appelle via mon interface graphique setCurrentLanguage() avec en paramètre "English" ou "French" tout se passe bien, il va bien chercher dans les fichiers "Facturation_en_US.properties" et "Facturation_fr_FR.properties". Quand je passe Japanese, il ne va pas chercher dans le fichier "Facturation_ja_JP.properties" mais dans le fichier "Facturation.properties".
    Voici mon premier problème, pourquoi ne va-t-il pas chercher dans le fichier local et va-t-il dans le fichier par défaut ?

    Ensuite, j'ai voulu tester de mettre des caractères japonais dans le fichier .properties par défaut encodé en UTF-8. Je vous le mets en fichier joint (j'ai chagé l'extension du fichier parceque sinon le forum ne l'acceptait pas). Java ne les affiche pas bien. Il affiche n'importe quoi, comme si il ne pouvait pas gérer ces caractères.

    Je précise que mon affichage se fait sur des boutons, et que je fais un setText() sur ces boutons à chaque fois que je change de langue, ainsi qu'un setLocale juste avant à la locale définie dans mon fichier LanguageManager.

    Comment remédier à ces problèmes ?

    Voici quelques heures que j'y suis et je ne trouve pas de solution pour le japonais...

    Merci

    Fred
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mavina Voir le message
    Voici mon premier problème, pourquoi ne va-t-il pas chercher dans le fichier local et va-t-il dans le fichier par défaut ?
    J'avoue n'en avoir aucune idée ! J'ai essayé de reproduire ton problème en vain !
    Es-tu sûr qu'il ne s'agisse pas tout simplement d'un fichier mal nommé ?


    Citation Envoyé par mavina Voir le message
    Ensuite, j'ai voulu tester de mettre des caractères japonais dans le fichier .properties par défaut encodé en UTF-8. Je vous le mets en fichier joint (j'ai chagé l'extension du fichier parceque sinon le forum ne l'acceptait pas). Java ne les affiche pas bien. Il affiche n'importe quoi, comme si il ne pouvait pas gérer ces caractères.
    C'est normal : les fichiers *.properties doivent être encodé en ISO-8859-1, et les caractères spéciaux doivent utilisé la syntaxe \u0000 où 0000 correspond au code Unicode du caractères...

    Autant le dire clairement pour du Japonais c'est galère !
    Mais il y a des solutions :
    • Si tu utilises Java 6 tu peux ajouter un contrôleur au ResourceBundle qui permettrait de charger des fichiers properties avec un autre encodage http://www.developpez.net/forums/m2875596-9/

    • Sinon tu pourrais utiliser un éditeur de Properties qui gèrerait cela de manière transparente, ou implémenter ton propre ResourceBundle à la place d'utiliser un fichier *.properties...



    a++

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Pour ton problème de properties, je ne vois pas de problème avec ton fichier ni avec l'UTF-8.
    Netbeans m'a peut-être résolu le problème par enchantement.

    Par contre, pour l'affichage, tu dois choisir la police de
    caractère capable d'afficher ton texte, c'est à dire ayant les glyphes représentant tes caractères.

    Par exemple, sur mon PC, j'utilise "Batang".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     JButton button = new JButton(text);      
     Font font = Font.decode("Batang");
     button.setFont(font);
    Donc, cela dépends des polices installées sur ton système.
    A toi de trouver la bonne et t'assurer quelle sera présente sur les systèmes cibles.
    Ou alors, prévois le dans ta procédure d'install.

    Bon courage !

  4. #4
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    J'avoue n'en avoir aucune idée ! J'ai essayé de reproduire ton problème en vain !
    Es-tu sûr qu'il ne s'agisse pas tout simplement d'un fichier mal nommé ?
    Justement non, mais j'ai résolu en utilisant ta classe, cf en dessous.


    Citation Envoyé par adiGuba Voir le message
    C'est normal : les fichiers *.properties doivent être encodé en ISO-8859-1, et les caractères spéciaux doivent utilisé la syntaxe \u0000 où 0000 correspond au code Unicode du caractères...

    Autant le dire clairement pour du Japonais c'est galère !
    Mais il y a des solutions :
    • Si tu utilises Java 6 tu peux ajouter un contrôleur au ResourceBundle qui permettrait de charger des fichiers properties avec un autre encodage http://www.developpez.net/forums/m2875596-9/

    • Sinon tu pourrais utiliser un éditeur de Properties qui gèrerait cela de manière transparente, ou implémenter ton propre ResourceBundle à la place d'utiliser un fichier *.properties...



    a++
    Alors, j'ai suivi le lien que tu as donné, et j'utilise ta classe.
    Maintenant dans ton post, tu parles de faire attention à l'encodage (ca c'est bon) et à faire attention à ce qu'on affiche bien dans un élément qui supporte ces caracteres et l'encoding, mais comment je sais si mon JButton ou mon JMenu est compatible UTF-8 et si il affiche des caracteres jap ? Et surtout comment les rendre compatibles ? (puisque visiblement ce n'est pas le cas )

    Merci

    Fred

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mavina Voir le message
    Maintenant dans ton post, tu parles de faire attention à l'encodage (ca c'est bon) et à faire attention à ce qu'on affiche bien dans un élément qui supporte ces caracteres et l'encoding, mais comment je sais si mon JButton ou mon JMenu est compatible UTF-8 et si il affiche des caracteres jap ? Et surtout comment les rendre compatibles ? (puisque visiblement ce n'est pas le cas )
    Les composants Swing gère parfaitement cela ! En fait ils utilisent de l'UTF-16 (encodage utilisé pour les String en interne ).
    Ton problème a été signalé par Threaddeath : sur nos PCs européens la plupart des polices de caractères sont incomplètes, et ne possèdent donc pas forcément les caractères asiatiques...

    Elles se contentent donc de renvoyer un caractères bizarre, généralement un carré ou un point d'interrogation...

    Il faut donc que tu te trouves une polices de caractères qui contient les caractères asiatiques.


    Remarques :
    • Tu peux utiliser la méthode canDisplay(char) pour savoir si une police peut afficher un caractère donné.
    • Tu peux utiliser la méthode createFont() pour charger une police depuis un fichier et l'utiliser dans ton application Java sans qu'elle en soit forcément installé sur le système hôte.
    • Tu peux utiliser l'UIManager pour changer la police par défaut d'un composant, par exemple pour les JLabel :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      UIManager.put("Label.font", newFont);



    a++

  6. #6
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut Adiguba !

    Merci pour tes réponses. J'ai tout simplement résolu mon problème. En fait, la police par défaut de Swing gère parfaitement les caractères Japonais, mais il faut en effet les mettre sous la forme \uXXXX ou XXXX est une combinaison de chiffres et de lettres. Tu disais que c'était la galère, pas tant que ça avec native2ascii qui le fait tout seul et très bien !

    Donc au final ce n'était qu'un problème de lecture de caractères par java !

    Merci en tous cas !

    Voici la commande pour ceux qui seraient dans la même galère que moi :

    native2ascii -encoding utf8 fichier_source fichier_destination
    F.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tables de paramètre multi langue - problème de mapping
    Par arnovodao dans le forum Hibernate
    Réponses: 2
    Dernier message: 05/03/2013, 20h12
  2. Réponses: 8
    Dernier message: 22/01/2013, 23h49
  3. Problème rapport multi-langues
    Par e1230 dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 24/02/2009, 09h31
  4. Problème site multi langues
    Par dolf13 dans le forum Langage
    Réponses: 9
    Dernier message: 31/08/2006, 12h05
  5. [swing][JComboBox]Problème de taille
    Par n!co dans le forum Composants
    Réponses: 8
    Dernier message: 06/03/2004, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo