Niezalogowany (Zaloguj się)

Kategorie

Vanilla 1.0.3 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • CommentAuthoradmirau
    • CommentTimeDec 27th 2006
     
    Ten przykład pokazuje,
    jak wykorzystać zalety PHPTAL do stworzenia strony w kilku językach.

    Co będzie potrzebne?

    1. Odpowiednia konfiguracja serwera

    a) Serwer musi wspierać gettext (czyli PHP musi zostać skompilowane z parametrem '--with-gettext'

    Czy tak jest,
    sprawdzamy uruchamiając skrypt:
    <code lang="php">
    <?php
    phpinfo();
    ?>
    </code>

    i sprawdzamy czy w 'Configure Command' jest opcja '--with-gettext'.

    Jeśli nie ma, trzeba się postarać o to, żeby tam się znalazła.
    Dla administratora serwera, to chwilka roboty.

    b) Serwer musi być skonfigurowany do obsługi danego języka.

    Jeśli Twój serwer nie obsługuje danego języka,
    trzeba sprawdzić konfigurację w pliku /etc/locale.gen

    Na Debianie/Ubuntu najlepiej użyć polecenia 'dpkg-reconfigure locales'

    2. Będziemy potrzebowali layoutu strony, najpierw w jednym języku, który posłuży jako szablon strony.

    Powiedzmy, że będzie wyglądała tak:

    ---
    plik: strona.html

    <code lang="xml">
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
    <head>
    <title>
    miejsce na tytuł strony
    </title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>

    <body>
    <h1>miejsce na tytuł strony</h1>
    miejsce na treść strony
    </body>

    </html>
    </code>

    3. Teraz przygotowujemy plik PHP wyświetlający szablon

    ---
    plik: strona.php
    <code lang="php">
    <?php
    // konfiguracja PHPTAL
    require_once 'PHPTAL_config.php';
    // klasy PHPTAL
    require_once 'PHPTAL.php';
    // klasy PHPTAL odpowiedzialne za tłumaczenie
    require_once 'PHPTAL/GetTextTranslator.php';

    try {

    $jezyk = new PHPTAL_GetTextTranslator();

    /* w tym miejscu, można dorobić przełączanie języków
    np. w zależności od tablicy $_GET
    lub wartości z tablicy $_SESSION
    */
    // określamy jakiego języka używać
    // w formacie: język_kraj
    $jezyk->setLanguage('pl_PL', 'pl_PL');

    // uczymy gettext, gdzie szukać plików i z jakimi nazwami
    $jezyk->addDomain('domena', '/sciezka/do/katalogu/z/wersjami/jezykowymi/');

    // określenie, której domeny (których plików językowych użyć, jeśli mamy więcej zestawów niż jeden)
    $jezyk->useDomain('domena');

    // tworzymy nowy szablon;
    $szablon = new PHPTAL('strona.html');

    // mówimi szablonowi, którego języka używać
    $szablon->setTranslator($jezyk);
    }
    // obsługa ew. błędu
    catch (Exception $e){
    echo $e;
    }

    // wyświetlenie szbalonu i obsługa ew. błędu
    try {
    echo $szablon->execute();
    }
    catch (Exception $e){
    echo $e;
    }
    ?>
    </code>

    4. Pliki wersji językowych

    Teksty w różnych wersjach językowych będziemy przechowywali w plikach tekstowych, w następującej strukturze katalogów:

    <code>
    /sciezka/do/katalogu/z/wersjami/jezykowymi/jezyk_KRAJ/LC_MESSAGES/domena.po
    </code>


    czyli w praktyce, np:

    <code>
    /var/www/pl_PL/LC_MESSAGES/domena.po
    /var/www/en_US/LC_MESSAGES/domena.po
    /var/www/de_DE/LC_MESSAGES/domena.po
    </code>
    itd.

    pliki domena.po są zwykłymi plikami tekstowymi w formacie:

    <code>
    msgid ""
    msgstr ""
    "Content-Type: text/plain; charset=utf-8\n"
    "Content-Transfer-Encoding: 8bit\n"

    msgid "nazwa_tekstu"
    msgstr "To jest tekst w danym języku"
    </code>

    Dla każdego języka, musimy utworzyć plik .po zgodnie z powyższym wzorem, umieszczając w nich wszystkie teksty do tłumaczenia.

    Ale niestety, w tej postaci, pliki nie nadają .po się jeszcze do użytku przez gettext.
    Trzeba je jeszcze skompilować poleceniem msgfmt.

    W tym celu wykonujemy polecenie:

    <code>
    msgfmt domena.po -o domena.mo
    </code>

    które kompiluje plik do postaci .mo.

    w praktyce, dla każdego słownika .po, należy wykonać to polecenie z uwzględnieniem ścieżek, np:

    <code>
    /msgfmt domena.po -o /www/lang/pl_PL/LC_MESSAGES/domena.mo --directory=/www/lang/pl_PL/LC_MESSAGES/
    </code>

    Uwaga: folder docelowy (na plik .mo) powinien posiadać prawa do zapisu

    Jeśli nie masz dostępu do shella,
    możesz się posłużyć skryptem PHP, który będzie wyglądał podobnie do poniższego:

    <code lang="php">
    <?php
    $lang='pl_PL';
    $dir='/www/lang/'.$lang.'/LC_MESSAGES/';
    $command='/msgfmt domena.po -o '.$dir.'domena.mo --directory='.$dir;
    $output = exec($command);
    echo "<pre>$command<br /> - $output<br /></pre>";
    ?>
    </code>

    Po kompilacji wszystkich słowników, mamy w każdym katalogu po dwa pliki: domena.po i domena.mo

    5. Kolejnym krokiem, jest modyfikacja szablonu HTML, tak aby strona wyświetlana była w danym języku.

    Po modyfikacji nasz szablon będzie wyglądał mniej więcej tak:

    ---
    plik: strona.html
    <code lang="xml">
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
    <head>
    <title i18n:translate="nazwa_tekstu1">
    miejsce na tytuł strony
    </title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>

    <body>
    <h1 nazwa_tekstu1>miejsce na tytuł strony</h1>
    <span i18n:translate="nazwa_tekstu2">miejsce na treść strony</span>
    </body>

    </html>
    </code>

    Cała sprawa skupia się na dodaniu do tagu:

    <code>
    i18n:translate="nazwa_tekstu"
    </code>

    gdzie 'nazwa_tekstu' jest msgid użytym w plikach .ro

    I to by było tyle :)