2009-05-16 14 views
6

He comenzado a usar gettext para traducir texto y mensajes que envío al usuario. Estoy usando poedit como editor, pero estoy luchando con mensajes dinámicos.poedit solución para gettext dinámico

Por ejemplo, tengo cosas como el inicio de sesión donde tengo una variable que indica el tipo de error.

$this->translate('page-error-' . $error); 

Cuando actualizo automáticamente de poedit esto se lee como "error de página-". Lo que hago es tener un archivo donde coloco llamadas ficticias al método de traducción con todas las claves posibles para que se agreguen en mi poedit cuando se actualicen automáticamente.

No me gusta especialmente esta situación. ¿Cómo lo hacen?

Gracias por sus ideas

+0

que no podía entender el problema. ¿Puedes describirlo más claro? – farzad

Respuesta

5

No - esto no es posible, porque el editor (y las herramientas gettext) están leyendo sus fuentes, no ejecutar su programa . Tendrá que guardar las llamadas ficticias o agregar las claves a los archivos de traducción usted mismo.

+0

¿cómo puedo agregar claves manualmente? No pude encontrar un camino. ¿También se eliminan manualmente las claves cuando se sincroniza con las fuentes? –

+0

Agregar page-error-% s – Blaise

2

¿Estás tratando algo así como

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

cómo hago las teclas dinámicas no es el problema, el problema es cómo las agrega en poedit. –

0

Me encontré con el mismo problema.

por ejemplo He

en php

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

Cuando i sincronía con poedit será recoger 'FORM_HEADER_' que no es un identificador que he (generado) en el código.

así que tuve que solucionar el problema dando mis identificadores completos Poedit He resuelto que al hacer lo siguiente en php

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

ACTUALIZACIÓN!

Seguí investigando este problema. Y actualmente renuncio a la importación desde la fuente. Así es como continúo hasta que encuentre una mejor solución

  1. Cree la aplicación y use tantos identificadores estáticos como sea posible.
  2. habilitar el registro de identificadores no traducidas (dinámicos)

    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. Uso Poedit para sincronizar con fuente y traducir las cadenas que se encuentran.

  4. Durante la fase de prueba/depuración, compruebe el registro de cadenas no traducidas.
  5. Agregue las cadenas sin traducir al archivo .po.

    msgid "IDENTIFIER" 
    msgstr "TRANSLATION STRING" 
    
  6. archivo po abierto y guardarlo para crear el archivo MO (NO sincronización con la fuente o todo está perdido).

ACTUALIZACIÓN 2.

Ahora uso un archivo separado para mis identificadores manuales, mediante el uso de un editor de texto (gedit/bloc de notas). Ahora tengo dos archivos:

  1. auto generada por poedit llamados <lenguaje> .po
  2. editted manualmente archivo llamado <lenguaje> _manual.po

i configurado mi traducirá en application.ini a buscará todos los archivos en el directorio de idioma

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 desea traducir en a otro idioma en poedit do file -> nuevo catálogo del archivo POT, y comienza a traducir las cadenas añadidas manualmente.

0

Si tiene un número finito de errores, puede agregar un código simulado dentro de una condición if (false), cuyo único propósito es que PoEdit recoja las traducciones.

Por ejemplo:

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

A continuación, puede traducirse en:

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

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