Ankündigung

Einklappen
Keine Ankündigung bisher.

i18n mittels gettext: Probleme bei Übersetzung und Platzhalten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • i18n mittels gettext: Probleme bei Übersetzung und Platzhalten

    Hallo,

    ich versuche mich grade zum ersten Mal an Internationalization mittels gettext


    Habe dabei aber einige Probleme:
    - Ich hab es soweit schon zum Laufen gebracht, allerdings switch die Übersetzung quasi willkürlich hin und her. Manchmal wird der englische Text angezeigt, manchmal auch der deutsche (übersetzte) Text, allerdings wurde in der Zwischenzeit nichts verändert (es scheint so als könnte die dazugehörige .mo File einfach nicht geladen werden, weswegen einfach der englische Text benutzt wird) - was mach ich falsch?
    Edit: Kann es allein daran liegen, dass die php File neu hochgeladen wurde, auch wenn nichts verändert wurde, dass es eine Zeit braucht, bis die Übersetzung "angenommen" wird?

    - Wie füge ich richtig Platzhalter in die Übersetzungen ein? Mit sprintf() hab ich mich schon gespielt aber das klappt dann mit der Übersetzung nicht mehr. Wie setze ich die Platzhalter richtig in diese Strings? (Nicht nur für andere Strings sondern auch für Zahlen, Kommazahlen, etc... - brauche quasi einen sprintf-Ersatz)

    - Wie nutze ich Gettext-Ext (default) - also nicht über die PHP-Extension (wenn ich das so richtig verstanden habe), wegen Performance

    Bitte keine englischen Tutorials!

    PHP:
    PHP-Code:
    <?php
    function setLocalization($code) {
        
    $langCodes = array(
                                
    "de" => "de_DE",
                                
    "fr" => "fr_FR"
                            
    );
        if(!isset(
    $langCodes[strtolower($code)])) {
            return;
        }
        
    $baseLangDir './locale';
        
    $appName     "test";
        
    $lang $langCodes[strtolower($code)];
        
    // Set language
        
    putenv('LC_ALL='.$lang);
        
    setlocale(LC_ALL$lang);

        
    // Specify the location of the translation tables
        
    bindtextdomain($appNamerealpath($baseLangDir));
        
    bind_textdomain_codeset($appName'UTF-8');
        
    // Choose domain
        
    textdomain($appName);
    }

    setLocalization("de");

    $testvariable _("Hello word.");
    echo 
    $testvariable;
    ?>
    .po (erstellt mit Poedit)
    Code:
    msgid ""
    msgstr ""
    "Project-Id-Version: test\n"
    "POT-Creation-Date: 2015-01-30 12:57+0100\n"
    "PO-Revision-Date: 2015-01-30 13:03+0100\n"
    "Last-Translator: Max Mustermann <max.mustermann@gmail.com>\n"
    "Language-Team: \n"
    "Language: de_DE\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=UTF-8\n"
    "Content-Transfer-Encoding: 8bit\n"
    "X-Generator: Poedit 1.7.4\n"
    "X-Poedit-Basepath: .\n"
    "Plural-Forms: nplurals=2; plural=(n != 1);\n"
    "X-Poedit-SearchPath-0: .\n"
    
    #: index.php:2
    msgid "Hello world."
    msgstr "Hallo Welt."
    Vielen Dank für jede Hilfe, brauche das nämlich dringend für ein Projekt und komme nicht weiter.


  • #2
    Was heißt die Übersetzungen switchen hin und her. Standardprozedere bei Übersetzungen:
    1) Sprache des Browsers auslesen und in einer Session festhalten.
    2) Nutzer die Möglichkeit geben eine Sprache auszuwählen; dann die Session überschreiben.

    Am Besten du arbeitest nach einer FrontController-Struktur. Das hat den Vorteil, dass du deine Applikation schon gut strukturiert hast und in einer zentralen Stelle die Übersetzungsdatei laden kannst. In den Templates hinterlegst du Platzhalter, die du dann beim Aufruf mit den entsprechenden Sprachdaten befüllst. Und wieso klappt sprintf() nicht? Sei mir nicht böse, aber für mich hört sich das wie Einsteiger an.

    Kommentar


    • #3
      PHP-Code:
      $bottles 5;
      echo 
      sprintf(_('There are %1$d bottles of beer on the wall...'), $bottles); 
      Sowas klappt einwandfrei.
      Mit der erweiterten (s)printf-Syntax taugt es auch für Übersetzungen, da die Position, an der der Wert eingesetzt wird, im übersetzten Text beliebig sein kann, d.h. der zweite Wert könnte problemlos vor dem ersten stehen, was ja bei der einfachen ('%s') Sytnax nicht möglich wäre.
      VokeIT GmbH & Co. KG - VokeIT-oss @ github

      Kommentar

      Lädt...
      X