PHP/Internacjonalizacja: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Beau (dyskusja | edycje)
sprzątanie kodu
Linia 1:
{{podświetl|php}}
 
{{prognaw|PHP|[[../Wysyłanie e-maili/]]|[[../System plików/]]}}
 
Linia 9 ⟶ 7:
Uruchom pewien prosty skrypt:
 
<nowikisource lang="php"><?php
 
echo strtolower('ŻÓŁTA WODA');
 
?></nowikisource>
 
W zależności od komputera, pokaże on napis ''żółta woda'' albo ''ŻóŁta woda''. Zastanówmy się, skąd jeden interpreter wiedział, że ''Ż'' jest literą polskiego alfabetu, która również podlega zamianie, a drugi nie? Odpowiedź kryje się w ustawieniach regionalnych tych maszyn, znanych z terminologii linuksowej pod nazwą ''locale''. PHP domyślnie wykonuje wszystkie operacje na tekstach, ustawia formatowanie walut oraz liczb na podstawie ustawień systemowych. Aby zmienić opcje regionalne dla aktualnie wykonywanego skryptu, należy skorzystać z funkcji ''setlocale()''. Za pierwszy parametr podajemy flagi określające, które aspekty regionalizacji chcemy zmodyfikować, a wszystkie kolejne to identyfikatory możliwych ustawień. PHP będzie próbował każdego z nich po kolei, aż trafi na taki, który jest zainstalowany w systemie. Dzięki temu jedną funkcją można przystosować skrypt do pracy zarówno z serwerami opartymi o Linux, jak i Windows. Poniżej przedstawiamy jeszcze raz skrypt ''strtolower()'' skonfigurowany do pracy z polskimi ustawieniami:
 
<nowikisource lang="php"><?php
 
setlocale(LC_ALL, 'pl_PL', 'pl', 'Polish_Poland.28592');
Linia 23 ⟶ 21:
echo strtolower('ŻÓŁTA WODA');
 
?></nowikisource>
 
Pierwsze dwa identyfikatory (''pl_PL'' oraz ''pl'') dotyczą systemu Linux. Trzeci przeznaczony jest dla rodziny Windows. Listę aktualnie zainstalowanych ustawień można znaleźć w ''Panel sterowania → Opcje regionalne → Zaawansowane''.
Linia 30 ⟶ 28:
 
=== Polska data ===
 
Pisząc aplikację przeznaczoną na rynek międzynarodowy, powinniśmy pomyśleć także o formatowaniu dat. Poznana już przez nas funkcja ''date()'' nawet przy pracy z polskimi ustawieniami wyświetli nam angielskie nazwy miesięcy. Sprawę rozwiązuje ''strftime()'', przy której musimy pamiętać o innej składni formatowania daty. Przyjrzyjmy się przykładowi:
 
<nowikisource lang="php"><?php
 
setlocale(LC_ALL, 'pl_PL', 'pl', 'Polish_Poland.28592');
Linia 40 ⟶ 37:
echo strftime('%d %B %Y');
 
?></nowikisource>
 
Po uruchomieniu okazuje się, że nawet ten skrypt nie jest doskonały, ponieważ wprawdzie generuje spolszczoną datę, ale niepoprawną gramatycznie! Otrzymujemy komunikat np. ''17 kwiecień 2006'', a tymczasem poprawną formą jest ''17 kwietnia 2006''. W niuanse gramatyczne wgłębiać się nie będziemy - po prostu jest tak, a nie inaczej i musimy samodzielnie napisać sobie funkcję, która nam to przeformatuje. Umożliwiając dodawanie obsługi nowych języków do aplikacji, powinniśmy pomyśleć o możliwości jej podmiany tak, aby twórca nakładki językowej mógł zaprogramować datę zgodnie z wymogami swego języka. Oto przykład takiej funkcji dla języka polskiego. Jest to modyfikacja ''strftime()'' dodająca nowy znacznik - '''%F''' będący właśnie odmienioną nazwą miesiąca:
 
<nowikisource lang="php"><?php
function localStrftime($format, $timestamp = 0)
Linia 107 ⟶ 104:
echo localStrftime('%d %F %Y');
 
?></nowikisource>
 
Teraz otrzymujemy prawidłowy tekst: ''17 kwietnia 2006''.
Linia 129 ⟶ 126:
Kolejnym krokiem na drodze umożliwienia obcokrajowcom przeglądania naszych witryn jest stworzenie kilku wersji językowych. Realizuje się to, tworząc nakładki językowe, w których poszczególnym komunikatom interfejsu przypisane są odpowiednie identyfikatory. Następnie w kodzie aplikacji, zamiast pisać odpowiednie teksty, wywołujemy specjalną funkcję i podajemy ID tekstu do wstawienia. Ta wprowadza w tym miejscu odpowiedni tekst w zależności od wybranego języka. Ponieważ nie znamy jeszcze programowania obiektowego, będziemy musieli napisać odpowiednią bibliotekę strukturalnie:
 
<nowikisource lang="php"><?php
 
$preferencje = array();
Linia 176 ⟶ 173:
} // end wstaw();
 
?></nowikisource>
W powyższym kodzie tekstom przypisane są nie tylko identyfikatory - podzielono je także na ładowane oddzielnie grupy. W ten sposób strona z newsami może załadować sobie tylko treści komunikatów dla newsów, z pominięciem np. tekstów przeznaczonych dla forum dyskusyjnego. Oto opis funkcji:
* ''zainstalowanyJezyk()'' - zwraca '''true''', jeżeli podany język jest obsługiwany przez nasz skrypt.
Linia 185 ⟶ 182:
Pliki językowe należy umieszczać w katalogu ''jezyki/kodjezyka/nazwagrupy.php''. Oto przykładowy plik ''jezyki/pl/global.php'':
 
<nowikisource lang="php">komunikat = "Komunikat"
hello_world = "Witaj swiecie!"</nowikisource>
 
Korzysta z niego poniższy przykład:
 
<nowikisource lang="php"><?php
 
require('./i18n.php');
Linia 201 ⟶ 198:
echo '<p>'.wstaw('global', 'hello_world').'</p>';
 
?></nowikisource>
 
Na początku ładujemy naszą bibliotekę i wybieramy język. Później wczytujemy grupę i wyświetlamy komunikaty. To wszystko - jesteśmy posiadaczami wielojęzycznego interfejsu. Pamiętaj, że jest to tylko przykładowy kod. Aby był on w pełni sprawny, powinieneś umożliwić użytkownikowi zmianę języka, a także zadbać o prawidłową obsługę błędów. Zwróć też uwagę, że dane obecnego systemu przechowywane są w tablicach globalnych. Nie jest to rozwiązanie najlepsze, ale na tym etapie wiedzy powinno nam wystarczyć. Kiedy poznamy programowanie obiektowe, będziesz mógł przepisać ten kod z jego wykorzystaniem, dzięki czemu zyska on na elegancji i bezpieczeństwie.
Linia 210 ⟶ 207:
Przeglądarka internetowa to cenne źródło informacji o internaucie. Przesyła ona m.in. informację o języku, w jakim ona pracuje. Możemy przyjąć, że jest to rodzimy język użytkownika i na podstawie tego automatycznie ustawić mu odpowiednią wersję językową strony. Całość zawarta jest w ''$_SERVER['HTTP_ACCEPT_LANGUAGE']''.
 
<nowikisource lang="php"><?php
 
$zainstalowane = array( // 1
Linia 239 ⟶ 236:
echo 'Wybrany język to '.$zainstalowane[$uzyty];
 
?></nowikisource>
 
Analiza powyższego skryptu:
Linia 252 ⟶ 249:
Takie wykonanie skryptu jest niewygodne. Najbardziej popularnym sposobem jest budowanie tego na plikach .mo.
Utwórz plik lang.php:
<nowikisource lang="php"><?php
if ($_SERVER['HTTP_ACCEPT_LANGUAGE'] == "pl_PL") // 1
{
Linia 264 ⟶ 261:
bind_textdomain_codeset("domena", 'UTF-8'); //3
textdomain("domena"); //4
?></nowikisource>
# Przeglądarki wysyłają informacje o języku. Jeśli użytkownik ma ustawiony w przeglądarce język polski, zobaczy polską wersję strony, jeśli nie - angielską.
# Przygotowuje domenę tekstową. Zmień "domena" na coś innego.
Linia 270 ⟶ 267:
# Wybiera domenę. Zmień "domena" na coś innego.
Ten plik dołączamy do każdych plików, które wymagają internacjonalizacji funkcją <nowiki><pre>include("./lang.php");</pre></nowiki> Teraz należy zamienić wszystkie teksty tak jak tu:
<nowikisource lang="php"><?php
echo "Polska wiadomość";
// =
echo _("Polska wiadomość");</nowikisource>
Pobieramy edytor plików .po, np. [http://www.poedit.net/download.php Poedit] i tworzymy pliki .mo (obsługa poniżej).
Ważna jest także budowa struktury katalogów.