Użycie Zend_LocaleZend_Locale udostępnia zlokalizowane informacje o innych locale.
Włączając w to nazwy innych locale, dni tygodnia, miesięcy itp.
Kopiowanie, klonowanie oraz serializowanie obiektów locale
Aby pomyślnie zduplikować obiekt locale należy użyć
klonowania obiektów.
Większość metod świadomych locale przyjmują w argumencie nazwę locale, taką jaka
jest zwracana przez $locale->toString().
Klonowanieserialize();
// odtworzenie oryginalnego obiektu
$localeObject = unserialize($serializedLocale);
// Uzyskanie identyfikatora locale
$stringLocale = $locale->toString();
// Utworzenie kopii obiektu $locale
$copiedLocale = clone $locale;
print "copied: ", $copiedLocale->toString();
// PHP automatycznie wywołuje toString() poprzez __toString()
print "copied: ", $copiedLocale;
]]>RównośćZend_Locale udostępnia wygodną funkcję służącą do porównania
dwóch locale. Wszystkie klasy świadome locale powinny umożliwiać podobną funkcjonalność.
Sprawdzenie równoważnych localeequals($mylocale)) {
print "Locales are equal";
}
]]>Domyślne locale
Metoda getDefault() zwraca tablicę identyfikatorów locale
na podstawie informacji udostępnianych przez przeglądarkę użytkownika (jeśli
jest dostępna), informacji pochodzących ze środowiska serwera hostingowego lub z
ustawień Zend Framework. Pierwszy parametr określa preferencję źródła
((BROWSER,
ENVIRONMENT, or FRAMEWORK).
Drugi parametr określa czy mają być zwrócone wszystkie locale wyszczególnione w
źródle czy tylko pierwsze z nich. Komponenty świadome locale używają przeważnie
jedynie pierwszego locale, w zależności od oceny ich preferencji (jeśli jest dostępna).
Zwrócenie domyślnego localegetDefault();
print_r($found);
// Zwrócenie jedynie locale domyślnego dla przeglądarki
$found2 = $locale->getDefault(Zend_Locale::BROWSER,TRUE);
print_r($found2);
]]>
Aby uzyskać locale domyślne dla określonego źródła:
BROWSER,
ENVIRONMENT lub FRAMEWORK, należy
skorzystać z odpowiedniej metody:
getEnvironment()getBrowser()Ustawienie nowego locale
Nowe locale może zostać ustawione za pomocą metody setLocale().
Przyjmuje ona łańcuch znaków identyfikatora locale jako parametr. Jeśli argument
nie zostanie podany to nastąpi próba
automatycznego wyboru.
Ponieważ obiekty Zend_Locale są "lekkie" metoda ta istnieje
głównie po to aby wykluczyć efekty uboczne w kodzie, który odnosi się do
już istniejącej instancji.
Metoda setLocale()toString();
// Nowe locale
$locale->setLocale('aa_DJ');
print $locale->toString();
]]>Zwrócenie języka i regionu
Aby uzyskać skrót języka z identyfikatora locale należy skorzystać z metody
getLanguage(). Do uzyskania skrótu regionu służy
metoda getRegion().
getLanguage oraz getRegiongetLanguage();
// jeśli locale to 'de_AT' wtedy 'AT' zostanie zwrócone region
print $locale->getRegion();
]]>Uzyskanie zlokalizowanych łańcuchów znaków
Metoda getTranslationList() umożliwia dostęp do zlokalizowanych
danych różnego rodzaju. Te informacje są przydatne jeśli zajdzie potrzeba
zaprezentowania użytkownikowi zlokalizowanych danych. W takiej sytuacji nie ma
potrzeby własnoręcznego tłumaczenia - odpowiednie dane są dostępne do użytku.
Lista żądanych danych jest zawsze zwracana w postaci tablic asocjacyjnych.
Jeśli istnieje potrzeba przekazania więcej niż jednego parametru do określonego
typu, z którego chce się pobrać wartości to należy przekazać te parametry w
postaci tablicy.
getTranslationList wartość
// [de] -> Deutsch
// [en] -> Englisch
// użycie jednego ze zwróconych kluczy jako parametru metody getTranslation()
// dla innego języka
print Zend_Locale::getTranslation('de', 'language', 'zh');
// zwraca tłumaczenie nazwy języka określonego jako 'de' w języku chińskim
]]>
Podobne informacje można uzyskać dla wszystkich języków ale w niektórych przypadkach
nie wszystkie dane są dostępne. Aby ułatwić dostęp do nich, pewne typy
informacji są również dostępne poprzez dedykowane metody. Niżej znajduje
się obszerniejszy opis.
Jeśli potrzebna jest pojedyncza przetłumaczona wartość można skorzystać z metody
getTranslation(). Zawsze zwracany jest łańcuch znaków zaś
przyjmowane argumenty są różne od tych przyjmowanych przez
getTranslationList().
Parametr wartości jest taki sam jak wcześniej z jedną różnicą - identyfikator
żądanego detalu musi zostać przekazany jako dodatkowy parametr.
Ponieważ wartość prawie zawsze musi być przekazana to staje się ona pierwszym
parametrem. Jest to różnica w stosunku do metody
getTranslationList().
Poniżej przedstawiono tabelę zawierającą bardziej szczegółowe informacje:
Z nadejściem Zend Framework 1.5 wiele starszych typów zostało przemianowanych.
Zostało to wymuszone przez wprowadzenie szeregu nowych typów i występowanie błędów
w starych nazwach. Zmiany te zwiększają użyteczność powyższych metod. Poniżej
znajduje się lista zmian:
Różnica pomiędzy Zend Framework 1.0 oraz 1.5Stary typNowy typCountryTerritory (z wartością '2')CalendarType (z wartością 'calendar')Month_ShortMonth (z tablicą array('gregorian', 'format', 'abbreviated')Month_NarrowMonth (z tablicą array('gregorian', 'stand-alone', 'narrow')Month_CompleteMonthsDay_ShortDay (z tablicą array('gregorian', 'format', 'abbreviated')Day_NarrowDay (z tablicą array('gregorian', 'stand-alone', 'narrow')DateFormatDateTimeFormatTimeTimezonesCityToTimezoneCurrencyNameToCurrencyCurrency_SignCurrencySymbolCurrency_DetailCurrencyToRegionTerritory_DetailTerritoryToRegionLanguage_DetailLanguageToTerritory
Poniższy przykład pokazuje sposób pozyskania określonych nazw w żądanym języku.
getTranslationList
Następny przykład pokazuje sposób odnalezienia nazwy locale w innym języku, jeśli
nieznany jest kod ISO kraju.
Zamiana nazwy kraju z jednego języka na drugi
Aby wygenerować listę wszystkich języków znanych przez
Zend_Locale, z każdą nazwą w oryginalnej formie można skorzystać
z poniższego przykładu. Podobnie metody
getCountryTranslationList() oraz
getCountryTranslation() mogą zostać użyte do utworzenia tabeli
mapującej nazwy regionów w języku użytkownika do nazw regionów w innym języku.
Aby wyłapać wyjątki spowodowane przez nieistniejące locale należy użyć konstrukcji
try .. catch.
Nie wszystkie języki stanowią locale. W poniższym przykładzie wyjątki są ignorowane
aby zapobiec przedwczesnemu zakończeniu skryptu.
Nazwy wszystkich języków w oryginalnym brzmieniu $content) {
try {
$output = Zend_Locale::getLanguageTranslation($language, $language);
if (is_string($output)) {
print "\n [".$language."] ".$output;
}
} catch (Exception $e) {
continue;
}
}
]]>Uzyskanie tłumaczenia dla "yes" oraz "no"
Często może dochodzić do sytuacji, w której niezbędne jest uzyskanie od użytkownika
odpowiedzi "tak" lub "nie". Aby uzyskać tablicę zawierającą odpowiednie słowa
lub wyrażenia regularne w zależności od określonego locale (domyślnie jest to locale
bieżącego obiektu) należy użyć metody getQuestion(). Tablica
zwrotna zawiera następujące dane:
yes and no: Generyczny łańcuch znaków z odpowiedziami
oznaczającymi zgodę oraz odmowę. Będzie to najprostszy element tablicy
yesarray oraz noarray.
yesarray and noarray: Tablica ze wszystkimi znanymi
odpowiedziami oznaczającymi zgodę oraz odmowę. Wiele języków posiada więcej niż
jeden zestaw odpowiedzi. Generalnie zawarte są tu pełne odpowiedzi oraz skróty.
yesexpr and noexpr: Wyrażenie regularne ułatwiające
odpowiednie zakwalifikowanie odpowiedzi dostarczonej przez użytkownika oraz
wyszukanie odpowiedzi oznaczających zgodę oraz odmowę.
Wszystkie powyższe informacje są zlokalizowane. Poniższy przykład przedstawia zestaw
danych, jakie można otrzymać:
getQuestion()getQuestion('de'));
- - - Output - - -
Array
(
[yes] => ja
[no] => nein
[yesarray] => Array
(
[0] => ja
[1] => j
)
[noarray] => Array
(
[0] => nein
[1] => n
)
[yesexpr] => ^([jJ][aA]?)|([jJ]?)
[noexpr] => ^([nN]([eE][iI][nN])?)|([nN]?)
)
]]>
Do wersji 1.0.3 była dostępna również tablica yesabbr.
Od 1.5 te informacje nie są dostępne bezpośrednio ale można je odnaleźć w
yesarray.
Uzyskanie listy wszystkich znanych locale
Może nastąpić sytuacja w której niezbędne okaże się uzyskanie listy wszystkich znanych
locale. Może to być użyteczne przy wielu czynnościach jak np. utworzenie listy wyboru.
Aby to osiągnąć należy użyć statycznej metody getLocaleList().
getLocaleList()
Należy zwrócić uwagę na fakt iż nazwy locale znajdują się w kluczach tablicy
zwrotnej. Wartości każdego jej elementu to boolean TRUE.
Rozpoznanie locale
Jeśli zaistnieje potrzeba rozpoznania czy dana zmienna, niezależnie z jakiego źródła
pochodzi, jest poprawnym locale można do tego celu użyć statycznej metody
isLocale(). Jej pierwszy parametr to łańcuch znaków do
sprawdzenia.
Proste rozpoznanie locale
Jak widać, powyższa metoda zawsze zwraca wartość logiczną. Istnieje jeden powód,
który powoduje rzucenie wyjątku w tej metodzie. Dzieje się tak jeśli system
operacyjny nie dostarcza żadnego locale a Zend Framework nie jest w stanie
go wykryć automatycznie. Często może to oznaczać problem istniejący na styku systemu
i środowiska PHP i jego funkcji setlocale().
Należy też zauważyć, iż każdy podany łańcuch locale zostanie automatycznie ograniczony
do kodu języka jeśli kod regionu nie jest poprawny. W poprzednim przykładzie kod
języka 'to' nie istnieje w regionie 'RU' ale klasa
Zend_Locale zwróci TRUE ponieważ możliwe
jest dostosowanie podanego stringu do poprawnego locale.
Niekiedy, przydatne może okazać się ograniczenie wyżej opisanego zachowania. W takiej
sytuacji należy skorzystać z drugiego parametru metody
isLocale(). Parametr strict przyjmuje domyślnie
wartość FALSE ale można zadeklarować jego wartość jako
TRUE i wyłączyć dostosowywanie przekazanego locale.
Ścisłe rozpoznanie locale
Teraz, kiedy możliwe jest rozpoznanie czy określony łańcuch znaków jest poprawnym
locale, nic nie stoi na przeszkodzie aby samemu tworzyć klasy świadome locale. Jednak
wprowadzając podobne rozwiązanie szybko dochodzi się do wniosku, że implementacja
będzie stanowiła bardzo podobne 15 linijek kodu. Przykładowo:
Implementacja kodu świadomego localetoString();
}
]]>
Z nadejściem Zend Framework 1.8 dodano statyczną metodę
findLocale(), która zwraca łańcuch znaków zawierający locale.
Oto lista jej zadań:
Sprawdzenie czy podany string jest poprawnym locale
Ograniczenie locale jeśli region nie jest poprawny
Zwrócenie uprzednio ustawionego locale aplikacji w przypadku braku argumentów
Sprawdzenie locale pobranego z przeglądarki jeśli wcześniejsze detekcje
zawiodły
Sprawdzenie locale środowiska serwera jeśli wcześniejsze detekcje zawiodły
Sprawdzenie locale frameworka jeśli wcześniejsze detekcje zawiodły
Zwrócenie łańcucha znaków reprezentującego znalezione locale
Poniższy przykład pokazuje sposób użycia tej metody zamiast, wcześniej opisanych,
kilkunastu linijek:
Implementacja kodu świadomego locale z Zend Framework 1.8