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

Collection et Stream Java Discussion :

[i18n] Langue arabe, properties et utf-8


Sujet :

Collection et Stream Java

  1. #1
    Débutant
    [i18n] Langue arabe, properties et utf-8
    j'ai deja questionner cette question,mais les reponses netait pas clair du tout.svp est ce que vous pouvez me bien expliquer.car j'ai essayé de le tester mais quand je fait l'instruction :
    ResourceBundle table=ResourceBundle.getBundle(langue);
    il m'affiche un trait d'erreur sur langue que j'ai deja créer dans la meme package sous le nom langue.properties (fichier texte) ,.svp y-a-t-il quelqu'un qui peut me faire un code complet et lisible d'un interface en swing (juste un petit interface avec un ou deux menu ) et qui comporte un sous menu qui permet de basculer entre le langues (surtout entre français et arabe) et merci pour tout.

  2. #2
    Membre expert
    La question n'est pas très claire...
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  3. #3
    Rédacteur/Modérateur

    PS : j'ai supprime ton autre message puisque les reponses y sont apportees dans ce topic.

    Voici un petit exemple rapidement realise qui permet de basculer entre le francais, l'arabe et l'anglais (qui est la langue par defaut). Note : ne connaissant pas du tout l'arabe, le fichier de ressources arabe est donc vide (et les resources utilisees sont donc la langue par defaut) ; cependant les mecanismes de creation de l'interface sont fonctionnels. Comme la langue par defaut est l'anglais, les curseurs se deplacent dans le sens gauche->droite. Si le label utilise avait ete en arabe, le curseur se serait deplace dans le sens gauche<-droite.

    test005locale/Main.java
    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package test005locale;
     
    import java.awt.BorderLayout;
    import java.awt.ComponentOrientation;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.MessageFormat;
    import java.util.Locale;
    import java.util.ResourceBundle;
    import java.util.prefs.Preferences;
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.ButtonGroup;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.JRadioButtonMenuItem;
    import javax.swing.JScrollPane;
    import javax.swing.JTextPane;
    import javax.swing.JToolBar;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
     
    /**
     *
     * @author fabriceb
     */
    public class Main extends JFrame {
     
      private static final long serialVersionUID = 1L;
      private static final Locale[] LOCALES = {Locale.US, Locale.FRANCE, new Locale("ar")};
      private static final Locale DEFAULT_LOCALE = Locale.US;
     
      public Main() throws Exception {
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        buildGUI();
        setSize(500, 400);
        setLocationRelativeTo(null);
        setVisible(true);
      }
     
      private void buildGUI() throws Exception {
        Locale currentLocale = Locale.getDefault();
        ResourceBundle bundle = ResourceBundle.getBundle("test005locale/labels");
        JMenu languageMenu = new JMenu(bundle.getString("MENU_LANGUAGE"));
        ButtonGroup group = new ButtonGroup();
        for (Locale locale : LOCALES) {
          String label = locale.getDisplayName();
          if (!locale.equals(currentLocale)) {
            String pattern = "{0} - {1}";
            String name0 = locale.getDisplayName();
            String name1 = locale.getDisplayName(locale);
            label = MessageFormat.format(pattern, name0, name1);
          }
          JRadioButtonMenuItem item = new JRadioButtonMenuItem(label);
          final Locale loc = locale;
          item.addActionListener(new ActionListener() {
     
            public void actionPerformed(ActionEvent event) {
              setVisible(false);
              Preferences prefs = Preferences.userNodeForPackage(Main.class);
              prefs.put("language", loc.getLanguage());
              prefs.put("country", loc.getCountry());
              Locale.setDefault(loc);
              SwingUtilities.invokeLater(new Runnable() {
     
                public void run() {
                  try {
                    setJMenuBar(null);
                    getContentPane().removeAll();
                    buildGUI();
                    setVisible(true);
                  }
                  catch (Exception e) {
                    e.printStackTrace();
                  }
                }
              });
            }
          });
          if (locale.equals(currentLocale)) {
            item.setSelected(true);
          }
          group.add(item);
          languageMenu.add(item);
        }
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(languageMenu);
        setJMenuBar(menuBar);
        JLabel textLabel = new JLabel(bundle.getString("LABEL_TEXT"));
        JTextPane textPane = new JTextPane();
        textPane.setText(bundle.getString("MESSAGE_TEXT"));
        JScrollPane textScroll = new JScrollPane(textPane);
        textScroll.setPreferredSize(new Dimension(320, 200));
        JPanel sidePanel = new JPanel();
        sidePanel.setLayout(new BoxLayout(sidePanel,BoxLayout.Y_AXIS));
        sidePanel.add(textLabel);
        JLabel progressLabel = new JLabel(bundle.getString("LABEL_PROGRESS"));
        JProgressBar progressBar = new JProgressBar();
        progressBar.setValue(50);
        JPanel southPanel = new JPanel();
        southPanel.setLayout(new FlowLayout(FlowLayout.LEADING));
        southPanel.add(progressLabel);
        southPanel.add(progressBar);
        JToolBar toolBar = new JToolBar();
        toolBar.setFloatable(false);
        for (int i = 0 ; i < 10;i++) {
          String pattern = bundle.getString("ACTION_PATTERN");
          final String label = MessageFormat.format(pattern, i);
          toolBar.add(new AbstractAction(label) {
            public void actionPerformed(ActionEvent event) {
              System.out.println(getValue(Action.NAME));
            }
          });
        }
        ComponentOrientation orientation = ComponentOrientation.getOrientation(currentLocale);
        setLayout(new BorderLayout());
        add(sidePanel, orientation.isLeftToRight() ? BorderLayout.WEST : BorderLayout.EAST);
        add(Box.createHorizontalStrut(3), orientation.isLeftToRight() ? BorderLayout.EAST : BorderLayout.WEST);
        add(textScroll, BorderLayout.CENTER);
        add(southPanel, BorderLayout.SOUTH);
        add(toolBar, BorderLayout.NORTH);
        applyComponentOrientation(orientation);
      }
     
      /**
       * @param args the command line arguments
       */
      public static void main(String[] args) {
        // TODO code application logic here
        SwingUtilities.invokeLater(new Runnable() {
     
          public void run() {
            Preferences prefs = Preferences.userNodeForPackage(Main.class);
            String language = prefs.get("language", DEFAULT_LOCALE.getLanguage());
            String country = prefs.get("country", DEFAULT_LOCALE.getCountry());
            Locale.setDefault(new Locale(language, country));
            try {
              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
              Main frame = new Main();
            }
            catch (Exception e) {
              e.printStackTrace();
            }
          }
          });
      }
    }


    test005/labels.properties
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    # To change this template, choose Tools | Templates
    # and open the template in the editor.
     
    MENU_LANGUAGE=Language
    LABEL_TEXT=Text Box
    MESSAGE_TEXT=This is a text message. Type what you want!
    LABEL_PROGRESS=Progress
    ACTION_PATTERN=Action {0, number, integer}


    test005/labels_fr_FR.properties
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    # To change this template, choose Tools | Templates
    # and open the template in the editor.
     
    MENU_LANGUAGE=Langage
    LABEL_TEXT=Boite de texte
    MESSAGE_TEXT=Ceci est un message textuel. Écrivez ce que bon vous semble !
    LABEL_PROGRESS=Progression


    Note que tu peux reutiliser les meme composants plutot que de recreer toute l'interface a chaque fois. J'ai fait ca ici pour aller plus vite dans le codage de la demo.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Rédacteur/Modérateur

    Note que certains layouts comme le FlowLayout s'adaptent automatiquement a la Locale utilisee. J'ai ainsi donc specifie FlowLayout.LEADING (au lieu de FlowLayout.LEFT) qui indique les composants doivent etre positionnes du debut -> fin donc de gauche -> droite en anglais et en francais et de gauche <- droite en arabe.

    Pour d'autre layout comme le BorderLayout il faut faire des operations manuellement pour definir la bonne orientation (voir code).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Débutant
    eclipse + ResourceBundle +l angue arabe
    j'ai utilise le resource Bundle pour realiser une application multilangue,pour l'alternace entre le français et anglais ,ça marche ça va mais lorsue j'ai pensé a ajouter la langage arabe j'ai une probleme.quand j'ai crée mon fichier langue_ar.properties et j'essaye d'entre quelques mots en arabe il me refuse d'enregistrer ces mot arabes a cause de l'encodage ISO-8859-1 j'ai essayé de modifier l'encodage par un trouvé par defaut.mais in marche pas .y-a t-il un solutiion svp c'est tres urgent et merci a vos attentions

  6. #6
    Débutant
    merci + encore d'autres problemes
    merci pour votre reponse mais lorsque j'ai essayé de faire une resourcebundle pour la langue arabe avec eclipse l'opération a echoué a cause de l'encodage (selon le boite de dialogue warning affiché).donc comment faire pour ecrire en arabe sur un fichier properties.
    2-la deuxieme chose est comment faire la meme chose mais sans recreation .svp y-a-til un exemple simple et concret qui illustre la situation mais avec plus q'un menu,merci?

  7. #7
    Rédacteur/Modérateur

    Les fichiers properties "a plat" (pas en XML) utilisent l'encodage ISO 8859-1. A toi de configurer Eclipse pour qu'il te permette d'y saisir de l'arabe ou d'utiliser un editeur externe (Word ?) pour te permettre de creer le fichier approprie. Tu peux egalement essayer d'en programmer un en Java, ce n'est pas bien dur.

    2-la deuxieme chose est comment faire la meme chose mais sans recreation .
    Modifie donc le code pour que l'initialisation des composants ne soit realisee qu'une seule et unique fois et que la methode appellee lors d'un changement de langue soit uniquement chargee de remettre les bons labels sur les composants et actions et la bonne orientation sur certains containeur (il faudra donc garder des references sur chacun des composants et containers utilises dans cette fenetre).

    svp y-a-til un exemple simple et concret qui illustre la situation mais avec plus q'un menu,merci?
    Eh bien, il te suffit de rajouter les menus habituels (fichier, edition, fenetre, aide, etc...). Et de le remplir avec les actions/menu items appropries. Cela peut-etre un bon exercice...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Rédacteur

    Effectivement, tu ne peux pas mettre des caractères arabes dans un fichier ISO (encodage européen). Essaye d'utiliser un encodage UTF-8 (voire UTF-16 si ça ne marche pas): ce sont des encodage qui se veulent "universels".
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  9. #9
    Expert éminent sénior
    Salut,


    Les fichiers *.properties standard doivent bien être en ISO-8859-1, donc si tu veux y mettre de l'arabe il va falloir utilisé les notation \uxxxx (certains outils permettent de le faire facilement).
    Par contre du coup le fichier n'est pas très lisible


    Si tu utilises Java 6 tu peux utiliser la nouvelle classe ResourceBundle.Control pour modifier le processus de chargement des properties et gérer des fichiers en UTF8.


    Par exemple avec cette classe :
    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
    public class CharsetControl extends ResourceBundle.Control {
     
    	private final String name;
     
    	private final Charset charset;
    	private final String extension;
    	private final List<String> formats;
     
    	/**
             * 
             * @param charsetName Nom du charset à utiliser et de l'extension de fichier (suivi d'un .properties)
             */
    	public CharsetControl(String charsetName) {
    		this(charsetName, charsetName + ".properties");
    	}
     
    	/**
             * 
             * @param charsetName Le Nom du charset à utiliser pour décoder les fichiers properties.
             * @param extension L'extension associée au fichier properties.
             */
    	public CharsetControl(String charsetName, String extension) {
     
    		this.name = getClass().getName();
    		this.charset = Charset.forName(charsetName);
    		this.extension = extension;
    		if (this.extension==null) {
    			throw new NullPointerException();
    		}
     
    		// Liste des formats supportées
    		ArrayList<String> f = new ArrayList<String>();
    		f.add(this.name); // Le format courant (nom de la classe)
    		f.addAll(super.getFormats("")); // Les formats standards (classes et properties)
    		f.trimToSize();
    		this.formats = Collections.unmodifiableList(f);
    	}
     
    	@Override
    	public List<String> getFormats(String baseName) {
    		if (baseName == null) {
    			throw new NullPointerException();
    		}
    		return this.formats;
    	}
     
     
    	@Override
    	public ResourceBundle newBundle(String baseName, Locale locale,
    			String format, ClassLoader loader, boolean reload)
    			throws IllegalAccessException, InstantiationException, IOException {
     
    		if (this.name.equals(format)) {
    			ResourceBundle bundle = null;
    			// On récupère le nom de la ressource avec notre extension :
    			final String resourceName = toResourceName(toBundleName(baseName, locale),
    					this.extension);
     
    			// Et on charge la resource si elle existe :
    			URL source = loader.getResource(resourceName);
    			if (source!=null) {
    				// En utilisant le charset désiré :
    				Reader reader = new InputStreamReader(source.openStream(), this.charset);
    				try {
    					bundle = new PropertyResourceBundle(reader);
    				} finally {
    					reader.close();
    				}
    			}
    			return bundle;
    		}
    		// Sinon on effectue le traitement par défaut (classes ou properties standard)
    		return super.newBundle(baseName, locale, format, loader, reload);
    	}
     
    }


    Que tu utilises de la manière suivante :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    CharsetControl utf8control = new CharsetControl("utf8");
    ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_NAME, utf8control);


    En plus de la gestion standard des properties, tu pourras utiliser des fichiers avec l'extension *.utf8.properties qui ne sont ni plus ni moins que des properties encodé en UTF8.

    Par exemple tu aurais comme fichier :
    • langue_fr.properties, un fichier encodé en ISO-8859-1 pour la langue française.
    • langue_ar.utf8.properties, un fichier encodé en UTF8 pour la langue arabe.


    (attention toutefois à bien encodé ton fichier et à l'afficher dans un élément qui supporte bien cet encodage et ce langage).




    Maintenant si tu ne peux pas utiliser Java 6 je pense que la meilleure solution serait de passer par un ListResourceBundle...


    a++
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  10. #10
    Débutant
    encore non fonctionnel
    merci pour ta reponse ,j'ai insere la classe que vous m'avez donner telle qu'il est et je l'ai utilisé dans ma classe mais toujours la meme probleme.peut etre que j'ai pas compris ou q'u il y-a une autre astuce qu'il faut le faire.de toute façon n'hesitez pas a me repondre le plus tot possoble et merci pour tout
    a titre d'indication l'alternance entre l'anglais et le français est toujours en bon etat avec les nouveaux modifications mais pour l'arabe il m'affiche des mots bizarres
    J'ai ajouter ton classe CharsetControl telle qu'il est,y-a pas des modification ajouter dans mon application?

  11. #11
    Expert éminent sénior
    Le fichier langue_ar.utf8.properties est-il bien encodé en UTF8 ?
    Où est-ce que tu affiches les messages ?

    a++
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  12. #12
    Débutant
    pa clair
    pas clair

  13. #13
    Débutant
    Citation Envoyé par fraisa1985 Voir le message
    d'abord mon fichier properties arab est : mmessages_ar.properties et j'ai changé son codage avec eclipse . Elle m'affiche des mots bizarres .

  14. #14
    Débutant
    quoteSalut,


    Les fichiers *.properties standard doivent bien être en ISO-8859-1, donc si tu veux y mettre de l'arabe il va falloir utilisé les notation \uxxxx (certains outils permettent de le faire facilement).
    Par contre du coup le fichier n'est pas très lisible

    tu peux me donner des exemples des softs qui permet de faire cette fonctionnalité et merci ,car l'autre methde ne marche pas

  15. #15
    Expert éminent sénior
    Citation Envoyé par fraisa1985 Voir le message
    tu peux me donner des exemples des softs qui permet de faire cette fonctionnalité et merci ,
    native2ascii fournit avec le JDK de Sun...


    Citation Envoyé par fraisa1985 Voir le message
    car l'autre methde ne marche pas
    Elle marche...

    a++
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.