Umiędzynaradawianie (I18N) odnosi się do procesu projektowania oprogramowania, tak aby mogło ono być dostosowane do różnych języków oraz regionów bez potrzeby zmian w mechanice aplikacji. Dla aplikacji sieciowych ma to szczególne znaczenie ponieważ użytkownicy mogą pochodzić z całego świata.
Yii dostarcza wsparcia dla I18N w kilku aspektach.
In the following subsections, we will elaborate each of the above aspects.
Ustawienia lokalne są zestawem parametrów, które określają język użytkownika,
jego kraj oraz specjalny wariant preferencji, które użytkownik chce zobaczyć
w interfejsie użytkownika. Najczęściej identyfikacja odbywa się poprzez ID zawierające
ID języka oraz ID regionu. Na przykład, ID en_US
oznacza angielskie ustawienia lokalne
dla USA. Aby zachować spójność wszystkie ID ustawień lokalnych w Yii zostały
sprowadzone do postaci kanonicznych w formacie LanguageID
lub LanguageID_RegionID
zapisanych małymi literami (np. en
, en_us
).
Dane lokalne są reprezentowane jako instancja CLocale. Dostarcza ona zależne od ustawień
lokalnych informacje, w tym symbole waluty, symbole liczb, formaty walut, formaty liczb,
formaty daty i czasu oraz nazwy dni i miesięcy. Ponieważ informacja o języku znajduje się
już w ID ustawień lokalnych nie jest ona dostarczona przez CLocale. Z tego samego
powodu często zamiennie używamy terminów ustawienia lokalne i język.
Mając ID ustawień lokalnych można otrzymać odpowiadającą mu instancję CLocale poprzez
CLocale::getInstance($localeID)
lub CApplication::getLocale($localeID)
.
Info: Yii dostarcza dane lokalne dla prawie każdego języka oraz regionu. Dane uzyskano z Wspólnego repozytorium danych lokalnych (CLDR). Dla każdego ustawienia lokalnego wyłącznie zbiór danych pochodzących z CLDR jest dostarczany, gdyż w oryginalnych danych dostępnych jest wiele rzadko używanych informacji.
Dla aplikacji Yii rozróżniamy jej język docelowy od języka źródłowego. Język docelowy jest językiem (lokalnego) użytkownika do którego skierowana jest aplikacja, zaś język źródłowy odnosi się do języka (lokalnego) w którym pliki źródłowe aplikacji zostały napisane. Umiędzynaradawianie występuje tylko wtedy, gdy te dwa języki są różne. different.
Można skonfigurować język docelowy w konfiguracji aplikacji lub zmienić go dynamicznie zanim jakiekolwiek umiędzynaradawianie będzie miało miejsce., or
Wskazówka: Czasami, możemy chcieć ustawić język docelowy jako język preferowany przez użytkownika (zdefiniowany w ustawieniach przeglądarki użytkownika). Aby tak zrobić, możemy pobrać preferowane przez użytkownika ID języka używając CHttpRequest::preferredLanguage.
Najbardziej pożądaną funkcjonalnością I18N jest tłumaczenie, włączając w to tłumaczenie
komunikatów raz tłumaczenie widoków. Pierwsze tłumaczy treść komunikatu na pożądany
język, drugie zaś tłumaczy cały plik na pożądany język. Żądanie tłumaczenia zawiera
obiekt, który ma zostać przetłumaczony, język źródłowy obiektu oraz język docelowy
na który obiekt powinien zostać przetłumaczony. W Yii domyślnie językiem źródłowym
język źródłowy aplikacji zaś językiem docelowym jest domyślnie
język aplikacji. Jeśli język źródłowy oraz docelowy są
takie same, translacja nie zachodzi.
Tłumaczenie komunikatów odbywa się poprzez wywołanie metody Yii::t(). Metoda ta tłumaczy podaną wiadomość w języku źródłowym na język docelowy.
Podczas tłumaczenia komunikatu jego kategoria powinna zostać określona, ponieważ
komunikat może zostać różnie przetłumaczony w różnych kategoriach (kontekstach).
Kategoria yii
jest zarezerwowana dla komunikatów używanych przez kod kod źródłowy frameworku.
Komunikaty mogą posiadać symbol zastępczy (placeholder), który będzie zastąpiony przez
aktulną wartość parametru podczas wywoływania metody Yii::t()|YiiBase::t]. Na przykład
następujące żądanie tłumaczenia komunikatu zastąpi symbol zastępczy {alias}
w oryginalnym komunikacie aktualną wartością zmiennej alias.
Yii::t('yii', 'Path alias "{alias}" is redefined.',
array('{alias}'=>$alias))
Uwaga: Aby móc przetłumaczyć komunikat musi on być stałym łańcuchem znaków. Nie powinien on zawierać zmiennych, które mogą zmienić zawartość wiadomości (no.
"Invalid {$message} content."
). Używaj symbolów zastępczych jeśli komunikat musi się zmieniać w zależności od parametrów.
Przetłumaczone komunikaty znajdują się w repozytorium nazwanym źródłem komunikatów. Źródło komunikatów reprezentowane jest poprzez instancję klasy CMessageSource lub jej klas pochodnych. Podczas wywołania Yii::t(), szuka ona komunikatu w źródle komunikatów i zwraca jego przetłumaczoną wersję jeśli taką znajdzie.
Yii dostarcza następujących typów źródeł komunikatów. Możesz również rozszerzyć klasę CMessageSource aby utworzyć swoje własne źródło komunikatów.
CPhpMessageSource: tłumaczenia komunikatów przechowywane są jako pary
klucz-wartość w tablicy PHP. Oryginalny komunikat jest kluczem a przetłumaczony wartością.
Każda tablica reprezentuje tłumaczenie dla konkretnej kategorii komunikatów i przechowywana
jest w oddzielnym pliku skryptu PHP, którego nazwa jest nazwą kategorii.
Pliki z tłumaczeniami PHP dla tych samych języków przechowywane są w tym
samym folderze o nazwie takiej jak lokalne ID. Te wszystkie katalogi
znajdują się w katalogu określonym przez zmienną bazePath.
CGettextMessageSource: tłumaczenia komunikatów przechowywane są jako GNU Gettext files.
CDbMessageSource: tłumaczenia komunikatów przechowywane są w tabeli bazy danych. Aby uzyskać więcej szczegółów spójrz w dokumentację API dla CDbMessageSource.
Źródło komunikatów jest ładowane jako komponent aplikacji.
Yii predefiniuje komponent o nazwie messages w celu przechowywania
komunikatów, które będą używane w aplikacji. Domyślnym typem źródła komunikatów jest
CPhpMessageSource zaś ścieżką bazowa gdzie przechowywane są pliki z tłumaczeniami
jest protected/messages
.
Podsumowując, w celu korzystania z tłumaczenia komunikatów, nastepujące kroki są wymagane:
Wywołaj Yii::t() w odpowiednim miejscu;
Utwórz plik tłumaczenia PHP jako protected/messages/LokalneID/NazwaKategorii.php
.
Każdy plik po prostu zwraca tablicę tłumaczeń komunikatów. Zauważ, oznacza to, że
założyliśmy iż używasz domyślnej klasy CPhpMessageSource w celu przechowywania
przetłumaczonych komunikatów.
Skonfiguruj właściwości CApplication::sourceLanguage oraz CApplication::language.
Wskazówka: Narzędzie
yiic
może zostać użyte do zarządzania tłumaczeniami komunikatów jeśli używamy CPhpMessageSource jako źródło komunikatów. Jego poleceniemessage
może automatycznie wydobyć komunikaty, które powinny zostać przetłumaczone z wybranego pliku źródłowego oraz połączyć je do istniejącymi tłumaczeniami, jeśli jest to konieczne.
Od wersji 1.0.2, Yii posiada dodane wsparcie dla alternatywnych formatów.
Alternatywny format odnosi się do wybierania tłumaczenia w zależności od podanej wartości numerycznej.
Na przykład w języku angielskim słowo 'book' oznaczające książkę może przyjmować formę liczby pojedynczej
lub też formę liczby mnogiej, w zależności od ilości książek, gdy zaś w innych językach,
słowo to może nie posiadać różnych form (tak jak w języku chińskim) albo też może mieć dużo
bardziej skomplikowaną liczbę mnogą (tak jak w rosyjskim). Format alternatywny rozwiązuje
ten problem w najprostszy ale skuteczny sposób. Aby móc używać formatu alternatywnego, przetłumaczony
komunikat musi podsiadać sekwencję par wyrażenie-komunikat rozdzielonych znakiem |
,
tak jak pokazano poniżej:
'expr1#message1|expr2#message2|expr3#message3'
gdzie exprN
odnosi się do poprawnego wyrażenia PHP, którego wynik ma postać boolean,
która determinuje czy odpowiedni komunikat powinien zostać zwrócony. Wyłącznie
komunikat odpowiadający pierwszemu wyrażeniu, którego ewaluacji zakończyła się wynikiem
true, zostanie zwrócony. Wyrażenie może zawierać specjalną zmienną o nazwie n
(zauważ, że to nie $n
),
która przejmie wartość liczby przekazaną jako pierwszy parametr komunikatu. Na przykład,
zakładając, ze tłumaczona wiadomość to:
'n==1#one book|n>1#many books'
i że przekazujemy wartość liczbową 2 w w tablicy parametrów komunikatu podczas wywoływania
metody Yii::t(), otrzymamy many books
jako końcowy wynik tłumaczenia komunikatu.
W skróconej notacji, jeśli wyrażenie jest liczbą, będzie ono potraktowane jako n==Liczba
.
Dlatego, powyższej tłumaczony komunikat, może również być zapisany jako:
'1#one book|n>1#many books'
Tłumaczenie plików dokonuje się poprzez wywołanie metody CApplication::findLocalizedFile().
Podając ścieżkę do pliku, który ma zostać przetłumaczony, metoda będzie szukała pliku o tej samej nazwie
w podkatalogu LokalneId
. Jeśli znajdzie plik, ścieżka do plik zostanie zwrócona;
w przeciwnym przypadku, oryginalna ścieżka do pliku zostanie zwrócona.
Tłumaczenie plików jest głównie używane podczas generowania widoku. Podczas wywoływania
jednej z metod generowania w kontrolerze albo w widżecie, plik widoku będzie przetłumaczony
automatycznie. Na przykład, jeśli językiem docelowym jest zh_cn
a językiem źródłowym jest en_us
, generowanie widoku o nazwie
edit
zakończy się poszukiwaniem następującego pliku widoku
protected/views/ControllerID/zh_cn/edit.php
. Jeśli plik zostanie znaleziony, ta przetłumaczona
wersja będzie używana do generowania; w przeciwnym przypadku plik
protected/views/ControllerID/edit.php
będzie używany do renderowania w zamian.
Tłumaczenie plików może również być używane dla innych celów na przykład, do wyświetlania przetłumaczonych obrazków czy też zależnych od ustawień lokalnych plików danych.
Data i czas są posiadają często różne formaty w poszczególnych państwach czy też regionach. Dlatego też zadanie formatowania daty i czasu polega na generowaniu ciągu reprezentującego ate lub czas, który zgadza się z tym określonym przez ustawienia lokalne. Yii dostarcza w tym celu klasę CDateFormatter.
Każda instancja CDateFormatter jest powiązana z docelowymi ustawieniami lokalnymi. Aby uzyskać klasę formatującą powiązaną z docelowymi ustawieniami lokalnymi aplikacji możemy po prostu skorzystać z właściwości aplikacji dateFormatter.
Klasa CDateFormatter dostarcza przede wszystkim dwóch metod do formatowania znacznika czasu (ang. timestamp) UNIX.
format: metoda ta formatuje podany znacznik czasowy UNIX
do łańcucha odpowiadającego spersonalizowanemu wzorcowi (np.$dateFormatter->format('yyyy-MM-dd',$timestamp)
).
formatDateTime: metoda ta formatuje dany znacznik czasu UNIX
do łańcucha odpowiadającemu wzorcowi predefiniowanemu w danych docelowych ustawień lokalnych
(np. short
krótki format daty, long
długi format czasu).
Tak jak data i czas, liczby również mogą być formatowanie różnie w zależności od kraju
czy też regionu. Formatowanie licz obejmuje formatowanie dziesiętne, formatowanie walut
oraz formatowanie procentów. Dla tych zadań, Yii dostarcza klasy CNumberFormatter.
Aby uzyskać klasę formatowania powiązaną z docelowymi ustawieniami lokalnymi aplikacji, możemy skorzystać z właściwości numberFormatter danej aplikacji.
Następujące metody są dostarczane przez klasę CNumberFormatter aby sformatować wartość całkowitą lub zmiennoprzeciwkową.
format: metoda ta formatuje podany numer do łańcucha uwzględniając
spersonalizowany wzorzec (np. $numberFormatter->format('#,##0.00',$number)
).
formatDecimal: metoda ta formatuje podany numer przy użyciu wzorca dziesiętnego z danych docelowych ustawień lokalnych.
formatCurrency: metoda ta formatuje podaną liczbę oraz kod waluty używając wzorca walutowego predefiniowanego w danych docelowych, lokalnych ustawień.
formatPercentage: metoda ta formatuje podaną liczbę używając wzorca procentowego predefiniowanego w danych źródłowych lokalnych ustawień.
Signup or Login in order to comment.