2009-05-16 12 views
6

Ich habe angefangen mit gettext für die Übersetzung von Text und Nachrichten, die ich an den Benutzer senden. Ich benutze Poedit als Editor, aber ich kämpfe mit dynamischen Nachrichten.Poedit Workaround für dynamische gettext

Zum Beispiel habe ich Dinge wie die Anmeldung, wo ich eine Variable habe, die den Typ des Fehlers angibt.

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

Wenn ich automatisch von poedit aktualisiere wird dies wie "page-error-" gelesen. Was ich tue, ist eine Datei, wo ich Dummy-Aufrufe an die Translate-Methode mit allen möglichen Schlüssel, um sie in meinem poedit bei der automatischen Aktualisierung hinzugefügt haben.

Ich mag diese Situation nicht besonders. Wie geht es euch?

Vielen Dank für Ihre Ideen

+0

ich das Problem nicht verstehen konnte. Kannst du es klarer beschreiben? – farzad

Antwort

5

Nein - das ist nicht möglich, da der Editor (und die gettext Tools) sind Ihre Quellen zu lesen, nicht Ihr Programm ausführt . Sie müssen die Dummy-Aufrufe behalten oder die Schlüssel selbst den Übersetzungsdateien hinzufügen.

+0

Wie kann ich Schlüssel manuell hinzufügen? Ich war nicht in der Lage, einen Weg zu finden. Werden diese manuellen Schlüssel auch entfernt, wenn eine Synchronisierung mit Quellen durchgeführt wird? –

+0

Seitenfehler hinzufügen-% s – Blaise

2

Versuchen Sie, so etwas wie

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

Wie ich die Dinamic-Tasten mache, ist nicht das Problem, das Problem ist, wie Sie sie in Poedit hinzufügen. –

0

Ich stieß auf das gleiche Problem.

Zum Beispiel habe ich

in PHP

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

Wenn ich mit poedit synchronisiert wird es abholen 'FORM_HEADER_' das kein Identifikator i (generiert) haben im Code. So

Ich hatte das Problem meiner geben Poedit vollen Kennungen i gelöst zu beheben, dass die folgenden in PHP, indem Sie

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

UPDATE!

Ich habe dieses Problem untersucht. Und ich habe den Import aus der Quelle aufgegeben. Dies ist, wie ich fortfahren, bis ich eine bessere Lösung finden

  1. Build-Anwendung und verwenden Sie so viele statische Identifikatoren wie möglich.
  2. Protokollierung von untranslatierte Identifikatoren Aktivieren (dynamisch)

    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. Verwenden Poedit mit Quelle zu synchronisieren und die Saiten übersetzen, die gefunden werden.

  4. Während der Test-/Debugging-Phase das Protokoll für nicht übersetzte Zeichenketten prüfen.
  5. Fügen Sie die nicht übersetzten Zeichenfolgen der .po-Datei hinzu.

    msgid "IDENTIFIER" 
    msgstr "TRANSLATION STRING" 
    
  6. öffnen po-Datei und speichern Sie die mo-Datei zu erstellen (synchronisiere NICHT MIT QUELLE ODER alles verloren).

UPDATE 2.

ich jetzt eine separate Datei für meine manuellen Bezeichner verwenden, indem Sie einen Texteditor (gedit/Notepad) verwenden. Jetzt habe ich zwei Dateien:

  1. Auto von poedit erzeugt genannt <Sprache> .po
  2. manuell editierte Datei namens <Sprache> _manual.po

i konfiguriert meine in application.ini übersetzen zu Suche nach allen Dateien im Sprachverzeichnis

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 

wenn Sie übersetzen möchten zu einer anderen Sprache in poedit do-Datei -> neuer Katalog aus POT-Datei, und beginnen Sie mit der Übersetzung Ihrer manuell hinzugefügten Zeichenfolgen.

0

Wenn Sie eine endliche Anzahl von Fehlern haben, können Sie Dummy-Code innerhalb einer if (false) Bedingung hinzufügen, deren einziger Zweck darin besteht, PoEdit die Übersetzungen abholen zu lassen.

Zum Beispiel:

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

Sie können dann übersetzen mit:

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

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

Verwandte Themen