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

GWT et Vaadin Java Discussion :

[i18n] Internationalisation dynamique


Sujet :

GWT et Vaadin Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut [i18n] Internationalisation dynamique
    Bonjour,

    Je veux internationaliser mon application GWT mais j'ai l'impression de me retrouver face à un mur.

    Après avoir lu et tenter d'appliquer ceci :
    http://projectpossibility.org/projec...alization.html
    http://code.google.com/p/google-web-...ingStartedI18n

    Je n'arrive pas à faire fonctionner ma pauvre classe dynamique d'internationalisation :
    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
    package fr.societe.projet.i18n;
     
    import java.util.MissingResourceException;
    import java.util.ResourceBundle;
     
    public class Messages implements com.google.gwt.i18n.client.Messages {
    	private static final String BUNDLE_NAME = "fr.societe.projet.i18n.messages"; //$NON-NLS-1$
     
    	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
     
    	private Messages() {
    	}
     
    	public String getString(String key) {
    		try {
    			return RESOURCE_BUNDLE.getString(key);
    		}
    		catch (MissingResourceException e) {
    			return '!' + key + '!';
    		}
    	}
    }
    Avec le fichier messages.properties dans le même package :
    Code properties : Sélectionner tout - Visualiser dans une fenêtre à part
    label.test=Test

    Dans le XML GWT, on trouve bien :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.7.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.0/distro-source/core/src/gwt-module.dtd">
    <module rename-to='monmodule'>
    	<inherits name='com.google.gwt.user.User'/>
    	<inherits name='com.google.gwt.user.theme.chrome.Chrome'/>
     
    	<entry-point class='fr.societe.projet.client.MonModule'/>
     
    	<inherits name="com.google.gwt.i18n.I18N"/>
    	<extend-property name="locale" values="fr"/>
    	<set-property name="locale" value="fr" />
    </module>

    Et dans ma classe de démarrage :
    Code Java : 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
    package fr.societe.projet.client;
     
    import com.google.gwt.core.client.EntryPoint;
    import com.google.gwt.user.client.ui.RootPanel;
     
    import fr.societe.projet.i18n.Messages;
     
    public class MonModule implements EntryPoint {
    	public void onModuleLoad() {
    		Label labelTest = new Label();
     
    		// Technique 1
    		Messages messages = GWT.create(Messages.class);
    		labelTest.setText(messages.getString("label.test"));
     
    		// Technique 2
    		labelTest.setText(Messages.getString("label.test"));
     
    		RootPanel.get().add(labelTest);
    	}
    }

    Technique 3 :

    Et dans mon XML GWT principal, j'ai ajouté la ligne :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <entry-point class='fr.societe.projet.i18n.Messages'/>

    Technique 4 :

    Dans mon package fr.societe.projet.i18n, j'ai rajouté le fichier Messages.gwt.xml avec le contenu suivant :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.7.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.0/distro-source/core/src/gwt-module.dtd">
    <module>
    	<inherits name="com.google.gwt.user.User" />
    	<entry-point class='fr.societe.projet.i18n.Messages'/>
    </module>

    Et dans mon XML GWT principal, j'ai remplacé com.google.gwt.i18n.I18N par fr.scoiete.projet.i18n.Messages.

    Résultat :

    Et malgré toutes ces techniques, j'ai toujours l'erreur :
    [ERROR] Line XX: No source code is available for type fr.societe.projet.i18n.Messages; did you forget to inherit a required module?
    J'ai loupé un truc ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 36
    Par défaut
    Je ne vois pas trop pourquoi cela ne fonctionne pas mais je vais poster qques bout de code correspondant à mon internationalisation peut être que cela t'aidera.

    mon gwt.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <inherits name='com.google.gwt.i18n.I18N' />
    <extend-property name="locale" values="fr_FR" />
    <extend-property name="locale" values="en_GB" />
    <extend-property name="locale" values="es_ES" />
    comme tu peux le voir je n'ai pas la balise <set-property>

    ma classe d'internationalisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class i18n {
    	public interface TextEditor extends Messages {
    	    String black();
    	    String blue();
    	}
    	public interface AccountFolderView extends Messages {
    		String myAccount();
    		String informations();
    	}
    }
    J'ai séparé l'i18n de chaque fichier .java afin de ne retrouvé que les string correspondants au fichier dans lequel je me trouve. Ça fait quelques doublons au final mais je trouve ça plus simple pour s'y retrouver dans le code.

    Mes fichiers properties pour la langue par défaut doivent donc se nommer i18n$TextEditor.properties, i18n$AccountFolderView.properties. Et ceux pour les différentes autres langues doivent avoir le préfixe de la locale comme je l'ai nommé dans le gwt.xml (i18n$AccountFolderView_es_ES.properties par exemple pour l'espagnol)

    mon i18n$TextEditor.properties :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    black = Noir
    blue = Bleu
    Et l'appel à la classe dans le code se fait ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class TextEditor extends Composite {
      private i18n.TextEditor strings = (i18n.TextEditor) GWT.create(i18n.TextEditor.class);
    ....
        lb.addItem(strings.black(), "black");
        lb.addItem(strings.blue(), "blue");
    ....
    en espérant que cela t'aide

  3. #3
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Bonjour,

    En fait ça, pour moi, c'est de l'internationalisation statique. A chaque fois que tu crées un libellé, tu dois créer une méthode correspondante .

    Ce que je veux, c'est faire comme dans l'internationalisation classique I18N, appeler une méthode avec le nom du libellé qui me renverras son contenu. D'où la seule et unique méthode Messages.getString(String key) mais GWT n'a pas l'air d'apprécier ce genre de choses (méchant !!).

    PS : Pour information le set-property permet de définir la locale par défaut qui sera utilisée

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 36
    Par défaut
    Effectivement j'ai répondu sans avoir tout lu.

    J'avais rêvé moi aussi d'un i18n de ce genre au début mais n'ai pas trouvé de solution et comme il fallait internationalisé fissa je l'ai fais de façon classique.

    Si jamais tu trouves une solution je suis preneur

  5. #5
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Une réponse rapide :

    L'erreur :
    No source code is available for type fr.societe.projet.i18n.Messages

    Comprendre l'erreur
    Gwt ne trouve pas le code source java pour le compiler en javascript !

    Ton fichier Messages.java est dans le dossier "fr.societe.projet.i18n"
    mais dans ton module (merci de l'avoir poster pour aider à la résolution), comme il n'y a pas de package client indiqué explicitement, GWT ne voit que le source se trouvant dans le package fr.societe.projet.client.
    Il ne voit donc pas ta classe.

    2 Solutions :
    1) Déplacer Messages (ou le package i18n) dans le package client.
    ou
    2) Ajouter les dossiers sources dans le module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <source path="client"/>
    <source path="i18n"/>

  6. #6
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Ah bah là je dis : MERCI !

    Mais pas moyen de trouver un doc sur *.gwt.xml pour savoir ce qu'on peut y mettre. D'autre part, j'ai plein de sous-packages donc je voulais savoir si j'avais moyen de dire d'inclure tous les sous-packages de client par exemple ?

    (Ou alors une doc de *.gwt.xml ? )

Discussions similaires

  1. problème d'internationalisation "dynamique"
    Par NajaChris dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 06/09/2011, 10h56
  2. Internationalisation dynamique fichiers properties
    Par MortDansLAme dans le forum GWT et Vaadin
    Réponses: 8
    Dernier message: 29/01/2011, 20h01
  3. [2.3.x] Internationalisation "dynamique" sous Birt
    Par Bulbichou dans le forum BIRT
    Réponses: 9
    Dernier message: 30/04/2010, 17h02
  4. [I18n] Internationalisation d'une image?
    Par questionneuse dans le forum Struts 1
    Réponses: 6
    Dernier message: 22/06/2006, 12h22
  5. [I18N] internationalisation ne marche pas
    Par gloglo dans le forum Struts 1
    Réponses: 44
    Dernier message: 31/05/2006, 10h59

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