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

Symfony PHP Discussion :

Traduction i18n qui ne remplace pas les chaines de mon interface


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut Traduction i18n qui ne remplace pas les chaines de mon interface
    Bonjour à tous,
    j'ai voulu utiliser la fonction I18n pour traduire l'interface d'une application que je suis en train de dévelloper.
    Après avoir pourtant suivi tout les tutoriels du site officiel, aucune de mes chaines n'est remplacée par celles contenues dans les fichiers message...

    Bien entendu, aucune erreur n'est produite et je ne sais donc pas ou se pose le soucis.

    Voila ce que j'ai fait :
    - Ajouté i18n comme helper par défaut
    - Ajouté dans settings.yml :
    default_culture:fr
    i18n: on
    - Utiliser la fonction d'extraction des chaines pour mes languages (en et fr)
    - Modifier ces fichiers pour ajouter (la balise d'ouverture <target> était absente du fichier:
    <target>Ma chaine traduite

    -Vérifier les droits sur l'ensemble des fichiers
    - Fait un clear-cache

    Ensuite, un rafraichissement de mon navigateur mais aucune chaine n'est traduite

    Je précise que j'affiche dans mes template les chaînes via __('Ma chaine')

    Si quelqu'un peut me dépanner, je pense qu'il s'agit que d'un réglage puisque je n'ai pas d'erreurs, mais je ne trouve pas lequel ....

    Merci d'avance

  2. #2
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Je refait un petit UP à mon topic,
    je n'ai toujours pas trouvé de solution et aucune erreur n'étant générée, cela ne m'indique vraiment aucune piste !

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 238
    Points
    20 238
    Par défaut
    Je ne connais pas symfony , mais petite question :
    L'internationalisation se base t'elle sous gettext ?
    Si oui , il y'a un bug sous PHP 5.3.0 et windows qui empèche gettext de fonctionner correctement.
    En gros le setlocale() retourne false et bloque gettext ce qui n'était pas le cas dans les version 5.2.x

    Si tu est dans ce cas , c'est sans doute la source du problème

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Merci pour ta réponse, mais mon serveur tourne sous PHP 5.2.10
    Avec Symfony, j'arrive bien via l'helper Date et Number à afficher mon nombre ou ma date selon la culture de l'utilisateur.
    Cela signifie à mes yeux que la culture est définie correctement puisqu'elle est prise en compte par ces helpers.

    J'ai commencé un nouveau projet sous Symfony 1.4 (j'étais en 1.2 auparavant), voila ce que j'ai fait pour activer i18n:

    Dans le fichiers config/settings.yml de mon application, j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    all:
      .settings:
        # Les réglages linguisitiques
        charset: utf-8
        default_culture: en_GB
     
        # Activation du support de l'internationnalisation
        i18n: true
     
        # Liste des helpers standard de l'application
        standard_helpers: [Partial, Cache, I18N]
    Cela me permet d'utiliser la commande __('Mon texte'); sans provoquer d'erreur, donc l'helper est bien actifs.

    Ensuite, j'ai généré les fichiers de langue comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    symfony i18n:extract intranet fr_FR --auto-save
    Puis j'ai modifié le fichier i18n/fr_FR/message.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN" "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd">
    <xliff version="1.0">
      <file source-language="EN" target-language="fr_FR" datatype="plaintext" original="messages" date="2009-12-15T14:32:32Z" product-name="messages">
        <header/>
        <body>
          <trans-unit id="1">
            <source>helloworld</source>
            <target>Bonjour le monde<target/>
          </trans-unit>
        </body>
      </file>
    </xliff>
    Dans mon action je change la culture par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->getUser()->setCulture('fr_FR');
    Et enfin dans mon template j'affiche ma chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo __('helloworld');
    Bien entendu, la phrase affiché est "helloworld" alors même que les nombre et les dates sont bien affichés en français....

    Qu'ai je loupé ?

  5. #5
    Membre averti Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 384
    Points
    384
    Par défaut
    Bonjour,

    As-tu essayé (rien que pour voir) de remplacer fr_FR par fr tout court ?

    Perso, je ne modifie pas le fichier message.xml, j'en crée un qui sera placé dans l'application : app/i18n/sf_admin.fr.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN" "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd" >
    <xliff version="1.0">
      <file original="global" source-language="en" datatype="plaintext">
        <header />
        <body>
          <trans-unit>
            <source>Hello world</source>
            <target>Bonjour le monde</target>
          </trans-unit>
        </body>
      </file>
    </xliff>
    Et j'utilise ce code pour l'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __('Hello world', array(), 'sf_admin')

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup, avec ton code cela fonctionne.

    Nous avons poussé un peut plus les recherches et il semble que le contenu du fichier message.xml soit la cause du non-fonctionnement.

    je m'explique, si je met dans mon fichier ce texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN" "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd" >
    <xliff version="1.0">
      <file original="global" source-language="en" datatype="plaintext">
        <header />
        <body>
          <trans-unit>
            <source>Hello world</source>
            <target>Bonjour le monde</target>
          </trans-unit>
        </body>
      </file>
    </xliff>
    Ça va fonctionner (après avoir correctement vidé le cache, même en mode dev)

    Par contre, si j'utilise le fichier généré par la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    symfony i18n:extract --auto-save frontend fr
    qui me produit le fichier suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN" "http://www.oasis-open.org/committees/xliff/documents/xliff.dtd">
    <xliff version="1.0">
      <file source-language="EN" target-language="de" datatype="plaintext" original="messages" date="2009-12-16T14:08:39Z" product-name="messages">
        <header/>
        <body>
          <trans-unit id="1">
            <source>Hello world</source>
            <target>Bonjour le monde<target/>
          </trans-unit>
        </body>
      </file>
    </xliff>
    Alors la, ça ne marche pas ....

    Je ne comprend toujours pas pourquoi l'utilitaire fournit avec symfony crée un fichier qui ne fonctionne pas, mais je suis heureux d'avoir pu avancé sur ce point grâce à ton aide.

    Si tu as plus d'explication sur le pourquoi du comment, je suis preneur !

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Eureka,
    en fait, il semble que l'outil de génération des fichiers de langue soit corrompue...

    La balise de fermeture "target" est mal formée :

    Alors qu'elle doit être écrite comme cela :
    Curieux que personne n'est relevé cette erreur, nous allons le signaler auprès des dév de symfony.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Je me réponds encore une fois,
    le problème se site dans le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /lib/vendor/symfony/lib/i18n/sfMessageSource_XLIFF.class.php
    ligne 202 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $target->appendChild($dom->createTextNode(''));
    Il n'y a pas d'espace entre les simple quotes '', ce qui génère, sur ma version de php, une balise mal formée (et non ouverte) :
    En ajoutant un espace dans les simples quotes, on obtient dans le fichier xml la balise :
    La balise est bien fermée, mais en cas de non-traduction, la chaine sera affichée vide sur l'application.

    Pour y remédier, nous pouvons aussi remplacer la ligne 202 par la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $target->appendChild($dom->createTextNode($message));
    En faisant ça, si la chaine n'est pas traduite, elle apparaitra dans sa traduction d'origine.

  9. #9
    Membre averti Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 384
    Points
    384
    Par défaut
    Tu as gagné le droit d'aller poster un ticket sur le site de symfony : http://trac.symfony-project.org/timeline


  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    J'ai surtout le droit de me taire,
    je viens de me rendre compte qu'il n'y a pas d'erreur dans la syntaxe des balises target.

    En fait, la balise étant vide au départ (pas de traduction) elle doit s'écrire non pas :
    <target></target>

    Mais bien :
    <target/>

    Or, le fichier généré par i18n:extract prend bien cette syntaxe en compte, mais nous n'avons pas fait attention à cela et nous nous étions contenté de rajouter la balise ouvrante <target> et le texte de traduction à la suite, sans modifier la balise de fermeture, qui, n'étant plus vide, s'écrit bien </target>

    Nous avons donc crié au loup trop tôt, mais, pour notre défense, j'accuse les tutoriaux de ne pas avoir mis en évidence ce point très peut visible

    Je laisse tout de même mes messages sur ce forum, cela permettra à d'autres têtes en l'air de trouver la solution

Discussions similaires

  1. [SQL 2000]Where in qui ne comprend pas les listes
    Par zooffy dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 02/05/2007, 16h36
  2. [RegEx] ereg qui ne trouve pas les accents
    Par Sephiroth Lune dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2007, 18h05
  3. [Requete] qui n'affiche pas les doublons mais sur un seul champs
    Par joseph.breham dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/12/2006, 14h57
  4. Le '%' en SQL ne remplace pas les espaces...
    Par njac dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/09/2004, 17h10

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