Internationalisering (I18N) avser processen att utforma en applikations mjukvara så att den, utan konstruktionsändringar, kan anpassas till varierande språk och regioner. För webbapplikationer är detta av speciell vikt, eftersom basen av potentiella användare är världsomspännande.
Ramverket Yii stöder I18N ur flera aspekter. Det tillhandahåller:
I följande underavsnitt, kommer varje aspekt ovan att utvecklas närmare.
Locale är en uppsättning parametrar som definierar användarens språk, land samt
eventuella mer speciella variationer som användare kan föredra att se i sina
användargränssnitt. Den identifieras vanligen genom ett ID bestående av ett
språk-ID och ett region-ID. Till exempel, ID:t en_US
står för engelska språket
och USA. För enhetlighetens skull har alla locale-ID:n i Yii kanoniserats till
formatet LanguageID
eller LanguageID_RegionID
i gemena (t.ex. en
,
en_us
).
Locale representeras som en instans av CLocale. Den tillhandahåller localeberoende information, inkluderat valutasymboler, talsymboler, valutaformat, talformat, datum- och tidformat samt datumrelaterade namn. Eftersom information om språk impliceras av locale-ID, tillhandahålls den inte av CLocale. Av samma skäl, används i många fall termerna locale och språk utbytbart.
Givet ett locale-ID, kan man erhålla motsvarande CLocale-instans genom
CLocale::getInstance($localeID)
eller CApplication::getLocale($localeID)
.
Info: Yii kommer med locale-data för nästan varje språk och region. Dessa data erhålls från Common Locale Data Repository (CLDR). För varje locale används endast en delmängd av data CLDR tillhandahåller, eftersom originaldata även omfattar mycket sällan använd information.
I en Yii-applikation skiljer vi på dess målspråk och dess källspråk. Målspråket är det språk (locale) som applikationens användare önskar använda sig av, medan källspråket refererar till det språk (locale) som applikationens källkodsfiler använder. Internationalisering är endast aktuell om de två språken är olika.
Man kan konfigurera målspråk i applikationskonfigurationen, eller ändra det dynamiskt innan någon internationalisering uppträder.
Tips: Ibland vill vi kunna sätta målspråket till det språk en användare föredrar (specificerat som användarens preferenser i webbläsaren). För att åstadkomma detta kan vi hämta ID för det språk användaren föredrar med hjälp av CHttpRequest::preferredLanguage.
Den I18N-finess som behövs mest är kanske översättningsfinessen, inkluderat meddelanden och vyer. För meddelanden översätts ett textmeddelande till det önskade språket, för vyer tillgängliggörs en hel fil på önskat språk.
En översättningsbegäran består av objektet som skall översättas, källspråket för objektet, samt målspråket objektet behöver översättas till. I Yii är källspråket som standard applikationens källspråk medan målspråket som standard är applikationsspråket. Om de båda språken är identiska, sker ingen översättning.
Översättning av meddelanden sker genom anrop till Yii::t(). Metoden översätter det givna meddelandet från källspråk till målspråk.
Vid översättning av ett meddelande behöver dess kategori specificeras eftersom
ett meddelande kan ha olika översättningar i olika kategorier (kontext).
Kategorin yii
är reserverad för systemmeddelanden från koden i Yii:s ramverk.
Meddelanden kan innehålla platshållare för parametrar som kommer att ersättas
med aktuella parametervärden vid anrop till Yii::t(). Till exempel,
följande meddelandeöversättningsbegäran skulle ersätta platshållaren {alias}
i
originalmeddelandet med aktuellt aliasvärde.
Yii::t('yii', 'Path alias "{alias}" is redefined.',
array('{alias}'=>$alias))
Märk: Meddelanden som skall översättas måste bestå av strängkonstanter. De får inte innehålla variabler som skulle kunna förändra meddelandeinnehållet (t.ex.
"Invalid {$message} content."
). Använd platshållare för parametrar om ett meddelande behöver varieras beroende på någon parameter.
Översatta meddelanden lagras ett förråd som kallas meddelandekälla (message source). En meddelandekälla representeras av en CMessageSource-instans eller nedärvd klass. När Yii::t() anropas, söker den efter meddelandet i meddelandekällan och returnerar dess översatta version om den hittades.
Yii kommer med följande typer av meddelandekällor. Man kan även ärva och utvidga CMessageSource för att skapa egna typer av meddelandekällor.
CPhpMessageSource: översättningarna av meddelanden lagras i form av nyckel-värdepar i en PHP-array. Originalmeddelandet bildar nyckel och det översatta meddelandet värde. Varje array representerar översättningar för en viss kategori av meddelanden och lagras i en separat PHP-skriptfil med samma namn som kategorin. PHP-filerna med översättning tillhörande samma språk samlas i samma katalog namngiven med locale-ID. Alla dessa kataloger är i sin tur placerade under katalogen specificerad i basePath.
CGettextMessageSource: översättningarna av meddelanden lagras som GNU Gettext-filer.
CDbMessageSource: översättningarna av meddelanden lagras i databastabeller. För fler detaljer, se API-dokumentationen för CDbMessageSource.
En meddelandekälla laddas som en
applikationskomponent.
Yii innehåller en fördeklarerad applikationskomponent vid namn
messages vilken lagrar meddelanden som användarens
applikation använder. Som standard är typen på denna meddelandekälla
CPhpMessageSource och rotsökvägen till de översatta PHP-filerna
protected/messages
.
Sammanfattningsvis, för att använda översatta meddelanden krävs följande steg:
Anropa Yii::t() på de ställen som är relevanta;
Skapa PHP-filer med översättningar som
protected/messages/LocaleID/CategoryName.php
. Varje fil returnerar kort och
gott en array bestående av meddelandeöversättningar. Märk att detta
förutsätter att CPhpMessageSource, vilken är standardvalet, används för
lagring av översatta meddelanden.
Konfigurera CApplication::sourceLanguage och CApplication::language.
Tips: Verktyget
yiic
i Yii kan användas för att hantera meddelandeöversättningar när CPhpMessageSource används som meddelandekälla. Kommandotmessage
kan automatiskt extrahera meddelanden som är kandidater för översättning från utvalda källkodsfiler samt, om så erfordras, sammanfoga dessa översättningskandidater med redan befintliga översättningar.
Med start från och med version 1.0.2, har Yii stöd för variantformat (choice format). Variantformat avser val av översättning beroende på given kvantitet. Till exempel, det engelska ordet 'book' kan antingen ha singularisform eller pluralisform beroende på antal böcker, medan andra språk (såsom kinesiska) inte gör skillnad på formerna eller (såsom ryska) kan ha mer komplexa regler för pluralisform. Variantformat löser detta problem på ett enkelt men ändå effektivt sätt.
För att använda variantformat måste ett översatt meddelande bestå av en sekvens
av uttryck-meddelandepar separerade av |
, så som visas nedan:
'expr1#message1|expr2#message2|expr3#message3'
där exprN
avser ett giltigt PHP-uttryck vilket kan utvärderas till ett boolskt
värde indikerande huruvida motsvarande meddelande skall returneras. Endast det
meddelande kommer att returneras, som motsvarar det första uttrycket vilket
utvärderas till true. Ett uttryck kan innehålla en specialvariabel, n
(märk,
det är inte $n
), som kommer att anta värdet lämnat som den första
meddelandeparametern. Till exempel, antag att ett översatt meddelande är:
'n==1#one book|n>1#many books'
och vi lämnar det numeriska värdet 2 i arrayen av meddelandeparameter när
Yii::t() anropas, erhåller vi many books
som det slutliga
översatta meddelandet.
Som kortform om uttrycket är ett tal, kommer det att behandlas som n==Number
.
Ovanstående översatta meddelande kan därför även skrivas:
'1#one book|n>1#many books'
Filöversättning åstadkommes genom anrop till metoden
CApplication::findLocalizedFile()]. Givet sökvägen till en fil som skall
översättas, kommer denna metod att leta i underkatalogen LocaleID
efter en fil
med samma namn. Om den hittas kommer filsökvägen (file path) att returneras; i
annat fall returneras originalsökvägen.
Översatta filer används huvudsakligen vid rendering av vyer. När en av
renderingsmetoderna anropas i en kontroller eller widget, kommer vyfilerna att
översättas automatiskt. Till exempel, om målspråket är
zh_cn
medan källspråket är en_us
, leder
rendering av en vy vid namn edit
till att vyfilen
protected/views/ControllerID/zh_cn/edit.php
eftersöks. Om filen hittas, kommer
denna översatta version att användas för rendering; i annat fall används i stället
filen protected/views/ControllerID/edit.php`.
Översatta filer kan även användas för andra ändamål, till exempel för att visa en översatt bild eller ladda en locale-beroende datafil.
Datum och tid har ofta skilda format i olika länder eller regioner. Uppgiften att formatera datum och tid består därför av att generera en datum- eller tidsträng som passar för angiven locale. Yii tillhandahåller CDateFormatter för detta ändamål.
Varje instans av CDateFormatter är associerad med en (mål-)locale. Datumformateraren för hela applikationens locale kan nås via applikationens property dateFormatter.
Klassen CDateFormatter tillhandahåller huvudsakligen två metoder för formatering av datumtid i UNIX-stil.
format: denna metod formaterar den givna UNIX-
tidstämpeln till en sträng enligt ett anpassat mönster (t.ex.
$dateFormatter->format('yyyy-MM-dd',$timestamp)
).
formatDateTime: denna metod formaterar den
givna UNIX-tidstämpeln till en sträng enligt ett fördefinierat mönster i mål-
localens data (t.ex. short
-formatet för datum, long
-formatet för tid).
Liksom datum och tid formateras även tal olika i olika länder och regioner. Formatering av tal inkluderar decimalformatering, valutaformatering och procentformatering. Yii tillhandahåller CNumberFormatter för dessa ändamål.
Talformateraren för hela applikationens locale kan nås via applikationens property numberFormatter.
Följande metoder tillhandahålls av CNumberFormatter för formatering av heltal eller flyttal (double).
format: denna metod formaterar det givna talet
till en sträng enligt ett anpassat mönster (t.ex.
$numberFormatter->format('#,##0.00',$number)
).
formatDecimal: denna metod formaterar det givna talet genom användning av det fördefinierade decimalmönstret i mål-localens data.
formatCurrency: denna metod formaterar det givna talet med valutakod genom användning av det fördefinierade valutamönstret i mål-localens data.
formatPercentage: denna metod formaterar det givna talet genom användning av det fördefinierade procentmönstret i mål-localens data.
Signup or Login in order to comment.