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

Tapestry Java Discussion :

Supprimer la locale dans URL


Sujet :

Tapestry Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut Supprimer la locale dans URL
    Comment est-ce possible d'éviter que Tapestry rajoute la locale dans l'url:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    http://host/fr/home/index
    http://host/en/home/index
    J'ai vu qu'il y avait des SymbolConstants à setter dans AppModule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    configuration.add(SymbolConstants.ENCODE_LOCALE_INTO_PATH, "false");
    Mais d'après l'API, il faudra gérer la persistance de la locale manuellement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LinkCreationListener/LinkCreationListener2(si Tapestry > 5.1.*)
     
    et LinkCreationHub
    Je n'ai rien trouvé sur le Net. Quelqu’un a une idée? Merci.

  2. #2
    Membre expérimenté
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Par défaut
    Bonjour,

    La locale est présente dans le nom des pages ou des assets ?

    Quelle est la version de Tapestry est utilisée ? Je n'ai jamais vu cette locale apparaitre !

  3. #3
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    J'ai défini les locales pour l'appli comme il faut dans AppModule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static void contributeApplicationDefaults(
    MappedConfiguration<String, String> configuration)
    {
    ..
    configuration.add("tapestry.supported-locales", "en,fr");
    }
    Pour changer de locale j'ai utilisé un link dqns la view:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <p align="right">
    <t:actionlink t:id="switchlocale">
    ${localeLabel}
    </t:actionlink>
    </p>
    avec PersistentLocale dans la classe de layout appropriée:
    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
     
    @Inject
    private PersistentLocale persistentLocale;
    @Inject
    private Locale currentLocale;
    @Persist
    private String localeLabel;
     
    public String getLocaleLabel()
    {
    if (localeLabel == null)
    {
    if (currentLocale.equals(Locale.FREBCH))
    {
    localeLabel =
    new Locale("en").getDisplayName(Locale.ENGLISH);
    }
    else
    {
    localeLabel =
    new Locale("de").getDisplayName(Locale.FRENCH);
    }
    }
     
    return localeLabel;
    }
     
    @OnEvent(component="switchlocale")
    void changeLocale()
    {
    localeLabel = currentLocale.getDisplayName(currentLocale);
    if (currentLocale.equals(Locale.FRENCH))
    {
    persistentLocale.set(Locale.ENGLISH);
    }
    else
    {
    persistentLocale.set(Locale.FRENCH);
    }
    }
    Tout fonctionne bien, mais Tapestry rajoute toujours un préfixe en ou fr ce que je voudrais éviter, car dans une appli réelle qui ne prévoyait pas d’internationalisation, ça ne marche pas car l'url genre domain/en/home ou domain/fr/home/ est inconnu.
    La version de Tapestry que j'utilise est 5.1.0.5.

  4. #4
    Membre expérimenté
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Par défaut
    Tu dois apparament redéfinir la méthode de gestion de la locale via Cookie ou autre en utilisant un RequestFilter.

    Je ne comprends pas par contre pourquoi cela ne fonctionne pas dans ton application, c'est censé être pris en charge par Tapestry.

  5. #5
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    La seule chose que j'ai trouvée dans API - c'est de rajouter une autre constante dans la config via Class SymbolConstants.ENCODE_LOCALE_INTO_PATH qui est à true par défaut:
    If "true" (the default), then the PersistentLocale will be encoded into the Link path by the ComponentEventLinkEncoder service. If overriden to "false" this does not occur, but you should provide a LinkCreationListener (registered with the LinkCreationHub) in order to add the locale as a query parameter (or provide some alternate means of persisting the locale between requests).
    Mais je ne trouve aucun exemple comment le définir avec LinkCreationListener ?

  6. #6
    Membre expérimenté
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Par défaut
    Le service PersistentLocale permet de faire persister la locale dans les URL.

    Si tu souhaites initialiser la locale de ta requête en cours, tu dois utiliser le service LocalizationSetter et gérer toi même la locale. Si j'ai bien compris tu aimerais la persister en session.

    Voici la démarche.

    Dans ta classe Module, contribue un RequestFilter qui se chargera de réinitialiser la locale pour la thread courante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void contributeComponentRequestHandler(OrderedConfiguration<ComponentRequestFilter> configuration)
        {
            configuration.addInstance("malocale", LocaleRequestFilter.class);
        }
    Ta classe LocaleRequestFilter ressemblera à ca :

    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
    public class LocaleRequestFilter implements ComponentRequestFilter
    {
     
        private final RequestGlobals request;
        private final LocalizationSetter ls;
     
        public LocaleRequestFilter(RequestGlobals request, LocalizationSetter ls)
        {
            this.request = request;
            this.ls = ls;
        }
     
        public void handleComponentEvent(ComponentEventRequestParameters parameters, ComponentRequestHandler handler) throws IOException
        {
            restoreSession();
            handler.handleComponentEvent(parameters);
        }
     
        public void handlePageRender(PageRenderRequestParameters parameters, ComponentRequestHandler handler) throws IOException
        {
            restoreSession();
            handler.handlePageRender(parameters);
        }
     
        private void restoreSession()
        {
            if (request.getRequest().getSession(true).getAttribute("_locale") != null)
            {
                ls.setNonPeristentLocaleFromLocaleName((String) request.getRequest().getSession(true).getAttribute("_locale"));
            }
        }
    }
    enfin, il ne te reste plus qu'à initialiser ta valeur _locale de la sorte dans ta page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Inject
        private RequestGlobals request;
     
    void onActionFromFr()
        {
            request.getRequest().getSession(true).setAttribute("_locale", "fr");
            System.out.println(msg.get("test"));
        }
    Testé en Tapestry 5.2.0.

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

Discussions similaires

  1. Obtenir l'URL d'un WSDL contenu en local dans le projet Eclipse
    Par thomas_31 dans le forum Services Web
    Réponses: 0
    Dernier message: 14/06/2015, 11h30
  2. [PHP 5.2] Supprimer valeur GET dans Url
    Par Invité dans le forum Langage
    Réponses: 7
    Dernier message: 15/04/2011, 14h58
  3. Supprimer "Localization" dans une Form
    Par Enyths dans le forum VB.NET
    Réponses: 2
    Dernier message: 04/06/2010, 14h06
  4. supprimer une table dans une base de donnée locale (sdf)
    Par vinowan dans le forum Windows Forms
    Réponses: 0
    Dernier message: 17/03/2009, 10h29
  5. [VB6] Supprimer un enregistrement dans une ListView ??
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/11/2002, 09h37

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