2009-05-16 9 views
6

J'ai commencé à utiliser gettext pour traduire le texte et les messages que j'envoie à l'utilisateur. J'utilise poedit en tant qu'éditeur, mais je suis aux prises avec des messages dynamiques. Par exemple, j'ai des choses comme la connexion où j'ai une variable qui indique le type d'erreur. Quand je mets à jour automatiquement de poedit cela se lit comme "page-error-". Ce que je fais est d'avoir un fichier où je place des appels fictifs à la méthode translate avec toutes les clés possibles pour les ajouter dans mon poedit lors de la mise à jour automatique.Solution de contournement poedit pour gettext dynamique

Je n'aime pas particulièrement cette situation. Comment faites-vous les gars.

Merci pour vos idées

+0

Je ne pouvais pas comprendre le problème. pouvez-vous le décrire plus clairement? – farzad

Répondre

5

Non - cela est impossible, parce que l'éditeur (et les gettext outils) sont en train de lire vos sources, et non pas l'exécution de votre programme . Vous devrez garder les appels fictifs ou ajouter les clés aux fichiers de traduction vous-même.

+0

comment puis-je ajouter des touches manuellement? Je n'étais pas capable de trouver un moyen. Est-ce que ces touches manuelles sont également supprimées lors d'une synchronisation avec les sources? –

+0

Ajouter une erreur de page-% s – Blaise

2

Êtes-vous essayer quelque chose comme

$this->translate(sprintf('page-error-%s', $error)); 
+3

comment je fais les clés dinamic n'est pas le problème, le problème est comment vous les ajoutez dans poedit. –

0

Je suis tombé sur le même problème.

par exemple i ont

en php

//Gives FORM_HEADER_ADD or FORM_HEADER_EDIT 
echo $this->translate('FORM_HEADER_' . strtoupper($this->data)); 

Lorsque i synchronisation avec poedit il reprendra 'FORM_HEADER_' qui ne soit pas un identificateur i ai (généré) dans le code.

donc je devais résoudre le problème de mes identifiants donnant pleins Poedit je résolus qu'en procédant comme suit en php

echo ($this->data === 'add') ? $this->translate('FORM_HEADER_ADD') : $this->translate('FORM_HEADER_EDIT'); 

MISE A JOUR!

J'ai continué à chercher dans ce problème. Et j'ai actuellement abandonné l'importation de la source. Voilà comment je continue jusqu'à ce que je trouve une meilleure solution

  1. Construire l'application et utiliser autant d'identifiants statiques que possible.
  2. activer l'enregistrement des identificateurs non traduites (dynamiques)

    protected function _initMyTranslate(){ 
    
        $date = new Zend_Date(); 
        $fileName = sprintf('/../logs/translation_%1$s.log', $date->toString('dd-MM')); 
    
        $writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . $fileName); 
        $log = new Zend_Log($writer); 
    
        // get the translate resource from the ini file and fire it up 
        $resource = $this->getPluginResource('translate'); 
        $translate = $resource->getTranslate(); 
    
        // add the log to the translate 
        $translate->setOptions(
          array(
           'log'    => $log, 
           'logUntranslated' => true 
          ) 
         ); 
    
        // return the translate to get it in the registry and so on 
        return $translate; 
    } 
    
  3. Utilisation Poedit pour la synchronisation avec la source et traduire les chaînes qui sont trouvées.

  4. Pendant la phase de test/débogage, vérifiez le journal pour les chaînes non traduites.
  5. Ajoutez les chaînes non traduites au fichier .po.

    msgid "IDENTIFIER" 
    msgstr "TRANSLATION STRING" 
    
  6. Ouvrir le fichier po et de l'enregistrer pour créer le fichier mo (NE PAS AVEC SOURCE SYNC OU TOUT EST PERDU).

MISE À JOUR 2.

J'utilise maintenant un fichier séparé pour mes identifiants manuellement, à l'aide d'un éditeur de texte (gedit/bloc-notes). Maintenant, j'ai deux fichiers:

  1. généré automatiquement par poedit <langue> appelés .po
  2. fichier manuellement appelé editted <langue> _manual.po

i configuré mon traduire en application.ini à rechercher tous les fichiers dans le répertoire des langues

resources.translate.adapter = gettext 
resources.translate.content = APPLICATION_PATH "/../library/languages/" 
resources.translate.locale = auto ;use en to force english or nl for dutch..etc 
resources.translate.scan = directory 
resources.translate.options.disableNotices = false 

si vous voulez traduire dans vers une autre langue dans poedit do fichier -> nouveau catalogue du fichier POT, et commencer à traduire vos chaînes ajoutées manuellement.

0

Si vous avez un nombre fini d'erreurs, vous pouvez ajouter un code fictif dans une condition if (false), dont le seul but est que PoEdit prenne les traductions.

Par exemple:

if (false) { 
    _('role_visitor'); 
    _('role_hiker_reader'); 
    _('role_hiker'); 
    _('role_translator'); 
    _('role_proofreader'); 
    _('role_moderator'); 
    _('role_moderator_2'); 
    _('role_moderator_3'); 
    _('role_admin'); 
} 

Vous pouvez ensuite traduire par:

$translated_role = _('role_' . $role); 

Crédits à: http://eng.marksw.com/2012/12/05/how-to-expose-dynamic-translatable-text-to-translation-tools-like-poedit/