php - solución de poedit para gettext dinámico
gettext php (4)
Empecé 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.
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 coloque las 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 particularmente esta situación. Como lo hacen ustedes.
Gracias por tus ideas
¿Estás tratando algo así como
$this->translate(sprintf(''page-error-%s'', $error));
No, esto no es posible porque el editor (y las herramientas de gettext
) leen sus fuentes, no ejecutan su programa. Tendrá que guardar las llamadas ficticias o agregar las claves a los archivos de traducción usted mismo.
Me encontré con el mismo problema.
por ejemplo tengo
en php
//Gives FORM_HEADER_ADD or FORM_HEADER_EDIT
echo $this->translate(''FORM_HEADER_'' . strtoupper($this->data));
Cuando me sincronizo con poedit, elegirá ''FORM_HEADER_'', que no es un identificador que tengo (generado) en el código.
Así que tuve que arreglar el problema. Le di a Poedit los identificadores completos y lo resolví haciendo lo siguiente en php.
echo ($this->data === ''add'') ? $this->translate(''FORM_HEADER_ADD'') : $this->translate(''FORM_HEADER_EDIT'');
¡ACTUALIZAR!
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
- Cree aplicaciones y use tantos identificadores estáticos como sea posible.
Habilitar el registro de identificadores no traducidos (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; }
Use Poedit para sincronizar con la fuente y traducir las cadenas que se encuentran.
- Durante la fase de prueba / depuración, compruebe el registro de cadenas no traducidas.
Agregue las cadenas sin traducir al archivo .po.
msgid "IDENTIFIER" msgstr "TRANSLATION STRING"
Abra el archivo po y guárdelo para crear el archivo mo (NO SINCRONICE CON LA FUENTE O TODO SE HA PERDIDO).
ACTUALIZACIÓN 2.
Ahora uso un archivo separado para mis identificadores manuales, usando un editor de texto (gedit / notepad). Ahora tengo dos archivos:
- Auto generado por poedit llamado <language> .po
- archivo editado manualmente llamado <language> _manual.po
configuré mi traducción en application.ini para buscar todos los archivos en el directorio de idiomas
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 a otro idioma en poedit, haga clic en archivo -> nuevo catálogo del archivo POT, y comience a traducir sus cadenas agregadas manualmente.
Si tiene un número finito de errores, puede agregar un código ficticio 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 traducir con:
$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/