Gettext w PHP

Gettext to system obsługi wielojęzycznych interfejsów stosowany w wielu aplikacjach desktopowych. W naszym przypadku potrzebujemy PHP, które posiada wsparcie dla gettext (sprawdź w phpinfo()):
GetText Support enabled
Przygotowujemy plik PHP, np.:
<?php
// ustawiamy język
putenv("LANGUAGE=pl_PL");

// nazwa pliku gettexta dla danej strony / ścieżka
bindtextdomain("pliczek", "/home/piotr/html/skrypt");
textdomain("pliczek");
// tłumaczenia będą szukane w /home/piotr/html/skrypt/pl_PL/LC_MESSAGES/pliczek.mo

// przykładowe stosowanie gettexta
echo gettext("Translate me");
echo '<br />';
echo _("I'm a string:");
Mimo iż nie mamy na razie plików gettexta wyświetlony zostanie tekst podany w kodzie. Dopóki gettext nie znajdzie tłumaczeń będzie wyświetlany zawarty w wywołaniu gettexta tekst. By wygenerować plik *pot wydajemy polecenie (zainstalowany gettext):
xgettext -n nazwa_pliku.php
Co stworzy nam plik messages.po, który kopiujemy jako pliczek.po. Jest to plik tekstowy i otwieramy go w edytorze tekstowym. Zawartość będzie mniej więcej taka:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION
"
"Report-Msgid-Bugs-To: 
"
"POT-Creation-Date: 2005-09-30 01:30+0200
"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
"
"Last-Translator: FULL NAME 
"
"Language-Team: LANGUAGE 
"
"MIME-Version: 1.0
"
"Content-Type: text/plain; charset=CHARSET
"
"Content-Transfer-Encoding: 8bit
"

#: gettext.php:15
msgid "Translate me"
msgstr ""

#: gettext.php:18
msgid "I'm a string:"
msgstr ""
Tłumaczenie polega na wpisaniu przetłumaczonej frazy do msgstr. W przypadku zwykłych programów kodowanie tego pliku musi być ustawione na UTF-8. W przypadku PHP również jest zalecane ale jeżeli masz z tym problemy możesz próbować z ISO-8859-2. Po przetłumaczeniu mamy:
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Tłumaczenie czegoś
"
"Report-Msgid-Bugs-To: 
"
"POT-Creation-Date: 2005-09-30 01:30+0200
"
"PO-Revision-Date: 2005-09-30 01:34+0200
"
"Last-Translator: Piotr M. 
"
"Language-Team: Polish 
"
"MIME-Version: 1.0
"
"Content-Type: text/plain; charset=UTF-8
"
"Content-Transfer-Encoding: 8bit
"

#: gettext.php:15
msgid "Translate me"
msgstr "Przetłumacz mnie"

#: gettext.php:18
msgid "I'm a string:"
msgstr "Jestem łańcuchem"
Oprócz msgstr edytowałem nagłówek podając autora, kodowanie i czas ostatniej edycji. Gdy już mamy tłumaczenie trzeba je przerobić na plik *.mo za pomocą polecenia:
msgfmt pliczek.po -o pliczek.mo
I wynikowy plik *.mo umieszczamy w miejscu na tłumaczenia - w podkatalogu /pl_PL/LC_MESSAGES/ od katalogu podanego w:
bindtextdomain("pliczek", "/home/piotr/html/skrypt");
By ustawić inny język należy przygotować dla nich tłumaczenia a następnie edytować wartość putenv("LANGUAGE=pl_PL"); z pl_PL na np. de_DE, en_EN itd.

By zaktualizować stary plik *.po z tłumaczeniem o nowe frazy / usunięcie już nieistniejących wystarczy wydać polecenie:
msgmerge stary.po messages.po --output-file=nowy.po
Gdzie messages.po to świeżo wygenerowany nieprzetłumaczony plik po.
RkBlog

PHP w Akcji, 14 July 2008

Comment article
Comment article RkBlog main page Search RSS Contact