2009-05-16 23 views
6

Ho iniziato a usare gettext per tradurre testo e messaggi che invio all'utente. Sto usando poedit come editor, ma sono alle prese con messaggi dinamici.soluzione alternativa per gettext dinamico

Ad esempio, ho cose come il login in cui ho una variabile che indica il tipo di errore.

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

quando aggiorno automatico da poedit questo viene letto come "pagina-degli errori". Quello che faccio è avere un file dove metto chiamate fittizie al metodo di traduzione con tutte le possibili chiavi per averle aggiunte nel mio poedit quando si aggiorna automaticamente.

Non mi piace particolarmente questa situazione. Come lo fate?

Grazie per le vostre idee

+0

non riuscivo a capire il problema. puoi descriverlo più chiaro? – farzad

risposta

5

No - questo non è possibile, perché l'editor (e gli strumenti gettext) stanno leggendo le tue fonti, non è in esecuzione il programma . Dovrai mantenere le chiamate fittizie o aggiungere le chiavi ai file di traduzione da solo.

+0

come posso aggiungere le chiavi manualmente? non ero in grado di trovare un modo. Inoltre, questi tasti vengono rimossi manualmente durante le sincronizzazioni con le fonti? –

+0

Aggiungi pagina-errore-% s – Blaise

2

Stai cercando qualcosa di simile

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

come faccio a rendere le chiavi dinamiche non è un problema, il problema è come li aggiungete in poedit. –

0

Mi sono imbattuto nello stesso problema.

Per esempio io ho

in php

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

durante la sincronizzazione con poedit si riprenderà 'FORM_HEADER_' che non è un identificatore che ho (generato) nel codice.

così ho dovuto risolvere il problema dando i miei identificatori pieni poedit ho risolto che facendo quanto segue in php

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

UPDATE!

Ho continuato a esaminare questo problema. E attualmente ho rinunciato all'importazione dalla fonte. Continuo così finché non trovo una soluzione migliore

  1. Creare un'applicazione e utilizzare quanti più identificatori statici possibili.
  2. attivare la registrazione di non tradotti identificatori (dinamici)

    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. Usa poedit per la sincronizzazione con la fonte e tradurre le stringhe che si trovano.

  4. Durante la fase di test/debug controllare il log per le stringhe non tradotte.
  5. Aggiungere le stringhe non tradotte al file .po.

    msgid "IDENTIFIER" 
    msgstr "TRANSLATION STRING" 
    
  6. Aprire file po e salvarlo per creare il file di mo (NON sincronia con origine o tutto è perduto).

UPDATE 2.

io uso un file separato per i miei identificatori manuali, utilizzando un editor di testo (gedit/notepad). Ora ho due file:

  1. automatica generata da poedit chiamati <lingua> .po
  2. editted manualmente file chiamato <lingua> _manual.po

ho configurato il mio tradursi in Application.ini a cercare tutti i file nella directory di lingua

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 

se si desidera tradurre in in un'altra lingua in poedit fai un file -> nuovo catalogo dal file POT, e inizia a tradurre le tue stringhe aggiunte manualmente.

0

Se si dispone di un numero finito di errori, è possibile aggiungere un codice fittizio all'interno di una condizione if (false), il cui unico scopo è quello di consentire a PoEdit di recuperare le traduzioni.

Ad esempio:

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

quindi tradurre con:

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

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

Problemi correlati