Hur man programmerar med Yii2 Lokalisering med I18n

Vad du ska skapa

Om du frågar, "Vad är Yii?" kolla in min tidigare handledning: Introduktion till Yii Framework, som granskar fördelarna med Yii och innehåller en översikt över vad som är nytt i Yii 2.0, släppt 12 oktober 2014.

I denna programmering med Yii2-serien guidar jag läsare som använder den nyuppgraderade Yii2 Framework for PHP. I del ett startade vi Yii2 lokalt, byggde ett Hello World-program, satte upp en fjärrserver och använde Github för att distribuera vår kod. I del två lärde vi oss om Yii: s genomförande av sin Model View Controller-arkitektur och hur man bygger webbsidor och formulär som samlar in och validerar data. I del tre använde vi Yiis databas och aktiva rekordmöjligheter för att automatisera kodgenerering för en grundläggande webbapplikation. Och i del fyra lärde vi oss att integrera användarregistrering.

I denna handledning kommer jag att visa dig hur du använder Yiis inbyggda I18n-internationaliseringsstöd för att göra din ansökan redo för översättning till ett antal språk.

För dessa exempel fortsätter vi att föreställa oss att vi bygger ett ramverk för att skicka enkla statusuppdateringar, t.ex. vår egen mini-Twitter.

Vad är I18n?

Enligt Wikipedia är I18n en siffra för internationalisering:

18 står för antalet bokstäver mellan den första jag och sist n i internationalisering, en användning myntade på DEC på 1970-talet eller 80-talet.

Med I18n ersätts alla textsträngar som visas till användaren från programmet med funktionssamtal som dynamiskt kan ladda översatta strängar för vilket språk användaren väljer.

Målen för internationalisering

När du bygger en webbapplikation är det användbart att tänka globalt från början. Måste din app arbeta på andra språk för användare från olika länder? Om så är fallet kommer sedan implementering av I18n från början att spara mycket tid och huvudvärk senare.

I vårt fall ger Yii Framework inbyggt stöd för I18n så det är relativt lätt att bygga in för I18n när du går.

Hur fungerar jag?

I18n fungerar genom att ersätta alla referenser till text som visas till användaren med funktionssamtal som tillhandahåller översättning vid behov. 

Till exempel, här är vad attributfältnamnen i Statusmodellen ser ut före I18n:

public function attributeLabels () return ['id' => 'ID', 'message' => 'Meddelande', 'behörigheter' => 'Tillstånd', 'created_at' => 'Skapad till', 'updated_at' => 'Uppdaterad vid',];  

Att tillhandahålla översatta versioner av koden skulle bli mycket komplicerat. Icke-tekniska översättare skulle behöva översätta kod på plats, troligen bryta syntax.

Så här ser samma kod ut med I18n:

public function attributeLabels () return ['id' => Yii :: t ('app', 'ID'), 'message' => Yii :: t ('app', 'Meddelande'), 'behörigheter' > Yii :: t ('app', 'Tillstånd'), 'created_at' => Yii :: t ('app', 'Skapad till'), 'updated_at' => Yii :: t ('app' Uppdaterad vid '),];  

Yii: t () är ett funktionsanrop som kontrollerar vilket språk som för närvarande är valt och visar rätt översatt sträng. De 'app' parameter hänvisar till en del av vår ansökan. Översättningar kan eventuellt organiseras enligt olika kategorier. Men var visas dessa översatta strängar?

Standardsproget, i detta fall engelska, skrivs in i koden, som visas ovan. Språkresursfiler är listor med uppsättningar av strängar vars nyckel är standardsprogtexten, t.ex.. 'Meddelande'eller 'Behörigheter'-och varje fil tillhandahåller översatta textvärden för sitt lämpliga språk.

Här är ett exempel på vår färdiga spanska översättningsfil, språkkod "es". De Yii: t () funktionen använder den här filen för att hitta rätt översättning som ska visas:

 'Kom ihåg Yii', 'Rubrik' => 'título', 'My Yii Application' => 'Mi Aplicación Yii', 'Yii Dokumentation' => 'Yii Documentación', 'Yii Extensions' => 'Extensions Yii' 'Yii Forum' => 'Yii Foro', 'Är du säker på att du vill radera detta föremål?' => 'Seguro que quieres borrar este artículo?', 'Grattis!' => '¡Enhorabuena!', 'Create' => 'crear', 'Skapa modelClass' => 'crear modelClass', 'Skapat' => 'Creado el', 'Delete' => 'borrar ',' ID '=>' identifieración ',' Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Utan minsta möjliga vänskap, det är inte nödvändigt att utöva arbetskraftsarbeten och utifrån det som följer. Duis aute irure dolor i reprehenderit i voluptate velit esse cillum dolore eu fugiat nulla pariatur. ' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed no tempor eiusmod ut labour et dolore incididunt magna aliqua. Utan minsta möjliga vänskap, är det viktigt att du utövar en utövande för att utföra arbetet med att följa. Duis Aute Irure dolor och avvisa en voluptate velita de cillum dolore eu nulla fugiat pariatur. ',' Meddelande '=>' mensaje ',' Tillstånd '=>' Permisos ',' Reset '=>' reajustar ',' Sök '= > 'búsqueda', 'Statuses' => 'Los estados', 'Uppdatera' => 'actualización', 'Uppdatera modelClass:' => 'actualización modelClass:', 'Uppdaterad till' => 'Actualizado A ',' Du har lyckats skapa din Yii-drivna applikation. ' => 'Det är ett sätt att göra en överenskommelse.',];

Även om detta ser tidskrävande ut, tillhandahåller Yii skript för att automatisera generationen och organisationen av dessa filmallar.

Genom att skilja texten från koden gör vi det lättare för icke-tekniska flerspråkiga experter att översätta våra applikationer för oss utan att bryta koden.

I18n erbjuder även specialfunktioner för att översätta tid, valuta, plurals et al. Jag kommer inte att gå in i detaljerna i dessa i handledningen. 

Konfigurera I18n Support

Tyvärr är Yii2-dokumentationen för I18n ännu inte mycket beskrivande, och det var svårt att hitta arbeten, stegvisa exempel. Lyckligtvis för dig ska jag gå igenom vad jag har lärt mig av att skura docs och webben. Jag hittade The Code Ninjas I18n-exempel och Yii2 Definitive Guide on I18n, och Yii-bidragsgivaren Alexander Makarov erbjöd mig också lite hjälp.

Generera I18n-konfigurationsfilen

Vi använder den grundläggande applikationsmallen Yii2 för vår demonstrationsapplikation. Detta placerar vår kodbas nedanför /Hej rotkatalogen. Yiis konfigurationsfiler i / Hello / config / * laddas när sidförfrågningar görs. Vi använder Yii: s I18n meddelandeskript för att bygga upp en konfigurationsfil för I18n i common / config väg.

Från vår codebase root kör vi Yii meddelande / config manus:

 ./ yii meddelande / config @ app / config / i18n.php

Detta genererar följande filmall som vi kan anpassa:

 __DIR__, // array, krävs, lista över språkkoder som de extraherade meddelandena // ska översättas till. Till exempel ['zh-CN', 'de']. 'languages' => ['de'], // string, namnet på funktionen för att översätta meddelanden. // Standard till 'Yii :: t'. Detta används som ett märke för att hitta meddelandena // översättas. Du kan använda en sträng för ensamfunktionsnamn eller en array för // flera funktionsnamn. 'translator' => 'Yii :: t', // booleska, om du vill sortera meddelanden med nycklar när du sammanfogar nya meddelanden // med de befintliga. Standardinställningar är falska, vilket innebär att de nya (otranslaterade) // meddelandena separeras från de gamla (översatta). 'sort' => false, // boolean, om du vill ta bort meddelanden som inte längre visas i källkoden. // Standardvärdena är falska, vilket innebär att var och en av dessa meddelanden kommer att bifogas ett par "@@" -märken. 'removeUnused' => false, // array, lista över mönster som anger vilka filer / kataloger som INTE ska behandlas. // Om det är tomt eller inte, kommer alla filer / kataloger att behandlas. // En sökväg matchar ett mönster om det innehåller mönstresträngen vid dess ände. Till exempel, // '/ a / b' matchar alla filer och kataloger som slutar med '/ a / b'; // '* .svn' matchar alla filer och kataloger vars namn slutar med '.svn'. // och ".svn" matchar alla filer och kataloger som heter ".svn". // Notera, '/' tecknen i ett mönster matchar både '/' och '\'. // Se hjälpmedel / FileHelper :: findFiles () beskrivning för mer information om mönster matchande regler. 'only' => ['* .php'], // array, lista över mönster som anger vilka filer (inte kataloger) ska behandlas. // Om det är tomt eller inte, kommer alla filer att behandlas. // Vänligen hänvisa till "utom" för detaljer om mönstren. // Om en fil / katalog matchar både ett mönster i "bara" och "utom", kommer det inte att behandlas. "except" => ['.svn', '.git', '.gitignore', '.gitkeep', '.hgignore', '.hgkeep', '/ messages',], // 'php' är för att spara meddelanden till php-filer. 'format' => 'php', // Root-katalog som innehåller meddelandeversioner. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. 'budskap', // booleskt, om meddelandets fil ska skrivas över med överföringsformaten för de sammanslagna meddelandena '=> true, / * //' db 'är för att spara meddelanden till databasen. 'format' => 'db', // Anslutningskomponent att använda. Valfri. 'db' => 'db', // Anpassad källmeddelande tabell. Valfri. // 'sourceMessageTable' => 'source_message', // Anpassat namn för översättningsmeddelande tabellen. Valfri. // 'messageTable' => '% message', * / / * // 'po' -utmatningsformatet är för att spara meddelanden till gettext po-filer. 'format' => 'po', // Root-katalog som innehåller meddelandeöversättningar. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. 'meddelanden', // Namnet på filen som ska användas för översättningar. 'catalog' => 'messages', // boolean, om meddelandets fil ska skrivas över med de sammanslagna meddelandena 'overwrite' => true, * /]; 

Jag anpassar filen enligt följande. jag flyttar messagePath upp till toppen och anpassa Source och messagePath. Jag specificerar också de språk jag vill ha min ansökan att stödja förutom engelska - i det här fallet spanska, tyska (de), italienska (det) och japanska (ja). Här är en lista över alla I18n språkkoder.

 __DIR__. DIRECTORY_SEPARATOR. '...', // Root-katalog som innehåller meddelandeöversättningar. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. '...'. DIRECTORY_SEPARATOR. 'meddelanden', // array, krävs, lista över språkkoder som de extraherade meddelandena // ska översättas till. Till exempel ['zh-CN', 'de']. 'languages' => ['de', 'es', 'it', 'ja'], // string, namnet på funktionen för att översätta meddelanden. // Standard till 'Yii :: t'. Detta används som ett märke för att hitta meddelandena // översättas. Du kan använda en sträng för ensamfunktionsnamn eller en array för // flera funktionsnamn. 'översättare' => 'Yii :: t', 

I nästa steg kör vi Yii extrakt manus som kommer att skanna all kod i Source träd för att generera standardsträngfiler för alla etiketter som används i vår kod. Jag anpassar mig Source att skanna hela kodträdet. Jag anpassar mig messagePath att generera de resulterande filerna i gemensamma / meddelanden.

 ./ yii meddelande / extrakt @ app / config / i18n.php

Du ser att Yii skannar alla dina kodfiler:

Utdrag av meddelanden från /Users/Jeff/Sites/hello/views/layouts/main.php... Utdrag av meddelanden från /Users/Jeff/Sites/hello/views/site/about.php... Utdrag av meddelanden från / Användare / Jeff / Sites / hej / visningar / webbplats / contact.php ... Utdrag av meddelanden från /Users/Jeff/Sites/hello/views/site/error.php... Utdrag av meddelanden från /Users/Jeff/Sites/hello/views/site/index.php... Utdrag av meddelanden från /Users/Jeff/Sites/hello/views/site/login.php... Utdrag av meddelanden från /Users/Jeff/Sites/hello/views/site/say.php... Utdrag av meddelanden från / Användare / Jeff / Sites / hej / visningar / status / _form.php ... Utdrag av meddelanden från /Users/Jeff/Sites/hello/views/status/_search.php... Utdrag av meddelanden från /Users/Jeff/Sites/hello/views/status/create.php... Extracting messages from /Users/Jeff/Sites/hello/views/status/index.php... Extracting messages from /Users/Jeff/Sites/hello/views/status/update.php... Extracting messages from / Användare / Jeff / Sites / hej / visningar / status / view.php ... Utdrag av meddelanden från / Användare / Je ff / Sites / hej / web / index-test.php ... Extrahera meddelanden från /Users/Jeff/Sites/hello/web/index.php... 

När det är klart kommer du se något så här i din kodbas:

Aktivera I18n och välja ett språk

I den gemensamma konfigurationsfilen, /hello/config/web.php, Vi ska berätta för Yii om vårt nya språkstöd. Jag gör spanska mitt standardspråk:

 'basic', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['logg'], 'language' => 'es', // spanska 'components' => 

Men det finns fortfarande mer att göra. Vi måste göra vår kod I18n medveten.

Använda Yi's Gii Code Generator Med I18n

I del tre av denna serie använde vi Yiis databas och aktiva rekordmöjligheter för att automatisera kodgenerering. Men vi aktiverade inte I18n, så all vår kod hade textsträngar inbäddade. Låt oss göra om det här.

Vi återvänder till Gii, sannolikt http: // localhost: 8888 / hej / gii i din webbläsare, och kör igen modell- och regulatorgeneratorerna med I18n aktiverad.

Här är ett exempel på att generera mötesmodellkoden med I18n aktiverad. Observera att vi anger "app" för vår meddelandekategori. Vi lägger alla våra textsträngar i en appkategorifil. 

Låt oss göra detsamma för CRUD-generationen för controllers och visningar:

Om du bläddrar i den genererade koden i modeller, kontroller och visningar ser du textsträngarna ersatt med Yii: t ("app", ...) fungera:

title = Yii :: t ('app', 'Statuses'); $ this-> params ['breadcrumbs'] [] = $ this-> title; ?> 

titel)?>

render ('_ search', ['model' => $ searchModel]); ?>

'Status',]), ['skapa'], ['class' => 'btn btn-framgång'])>>

$ dataProvider, 'filterModel' => $ searchModel, 'kolumner' => [['class' => 'yii \ grid \ SerialColumn'], 'id', 'meddelande: ntext', 'behörigheter', 'created_at' 'updated_at', ['class' => 'yii \ grid \ ActionColumn'],],]); ?>

Göra statiska synpunkter I18n Ready

Eftersom vi genererar ett antal visningar i vår ansökan manuellt eller i HTML, måste vi manuellt konvertera dessa för att använda I18n. Till exempel, vår navigeringsfält i /views/layouts/main.php och vår hemsida i /views/site/index.php båda måste redigeras för hand. 

Här är navigeringsfältet före I18n:

NavBar :: begin (['brandLabel' => 'Mitt företag', 'brandUrl' => Yii :: $ app-> homeUrl, 'options' => ['class' => 'navbar-inverse navbar-fixed-top ',],]); $ navItems = [['label' => 'Hem', 'url' => ['/ site / index']], ['label' => 'Status', 'url' => ['/ status / index '], [' label '=>' Om ',' url '=> [' / webbplats / om ']], [' label '=>' Kontakt ',' url '=> [' / webbplats / kontakt ']]]; om Yii :: $ app-> user-> isGuest) array_push ($ navItems, ['label' => 'Logga in', 'url' => ['/ user / login']], ['label' => 'Registrera', 'url' => ['/ användare / registrera']]);  else array_push ($ navItems, ['label' => 'Logga ut (' .Yii :: $ app-> user-> identity-> användarnamn. ')', 'url' => ['/ site / logout' ], 'linkOptions' => ['data-method' => 'post']]));  echo Nav :: widget (['options' => ['class' => 'navbar-nav navbar-right'], 'items' => $ navItems,]); NavBar :: ände ();

Här är navigeringsfältet efter I18n:

NavBar :: begin (['brandLabel' => Yii :: t ('app', 'Mitt företag'), 'brandUrl' => Yii :: $ app-> homeUrl, 'options' => ['class' = > 'navbar-inverse navbar-fixed-top',],]); $ navItems = [['label' => Yii :: t ('app', 'Hem'), 'url' => ['/ plats / index']], ['label' => Yii :: t 'app', 'Status'), 'url' => ['/ status / index']], ['label' => Yii :: t ('app', 'Om'), 'url' => '/ site / about']], ['label' => Yii :: t ('app', 'Kontakt'), 'url' => ['/ webbplats / kontakt']]]; om Yii :: $ app-> user-> isGuest) array_push ($ navItems, ['label' => Yii :: t ('app', 'Logga in'), 'url' => ['/ användare / login ']], [' label '=> Yii :: t (' app ',' Registrera '),' url '=> [' / användare / registrera ']]);  andra array_push ($ navItems, ['label' => Yii :: t ('app', 'Logga ut'). '' '' Yii :: $ app-> user-> identity-> användarnamn. ') , 'url' => ['/ site / logout'], 'linkOptions' => ['data-method' => 'inlägg']]));  echo Nav :: widget (['options' => ['class' => 'navbar-nav navbar-right'], 'items' => $ navItems,]); NavBar :: ände ();

Här är ett fragment av innehållet på hemsidan från index.php efter att I18n-mycket av HTML-filen har ersatts av PHP-samtal till Yii :: t ():

»

Översätta dina meddelandefiler

Ta en titt på vår spanska meddelandefil, /common/messages/es/frontend.php. Det är en lång lista över tomma array värden:

returnera ['Om' => ',' Kontakt '=> ",' Hem '=>",' Logga ut '=> "," Mitt företag "=>", "Logga in" => "," Registrera " => "," Status "=>", ... 

För att fylla i våra spanska översättningar för denna handledning använder jag Google Translate. Tricky, va?

Sedan ska vi göra några klipp och klistra in med de översättningarna tillbaka till meddelandefilen. 

returnera ['Om' => 'Acerca de', 'Kontakt' => 'Contacto', 'Home' => 'Hem', 'Logga ut' => 'Salir', 'My Company' => 'Mi Empresa' 'Logga in' => 'Entrar', 'Registrera' => 'Registrarse', 'Status' => 'Estado',

När vi besöker Applikations hemsida ser du den spanska versionen, trevligt, va?

Här är formuläret Skapa status:

Om jag vill byta tillbaka till engelska ändrar jag bara konfigurationsfilen, /config/web.php, tillbaka till engelska:

 'basic', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['logg'], 'language' => 'en', // tillbaka till engelska 'components' =>

Du kommer också märka när du fortsätter att byta strängar i JavaScript har sina egna komplexiteter. Jag har inte utforskat det själv, men Yii 1.x JsTrans-förlängningen kan ge en användbar riktlinje för att stödja detta.

Går vidare med I18n

I slutändan kanske vi vill översätta vår ansökan till ett antal språk. Jag har skrivit en ny handledning som heter "Använda Google Translate API för att lokalisera din I18n App (Tuts +)" som automatiskt översätter din ansökan till en mängd olika språk. Om det inte publiceras än, kommer det att publiceras snart (kolla min instruktörssida). Självklart ger detta bara grundläggande översättningar. Du kanske vill anställa professionella översättare för att ställa in filerna efteråt.

Vissa program tillåter användare att välja sitt modersmål så att användargränssnittet automatiskt översätts för dem när de loggar in. I Yii ställer du in $ App> språk variabel gör det här:

\ Yii :: $ app-> language = 'ES';

Andra applikationer, som JScrambler.com nedan, hävdar URL-banan för att byta språk. Användaren klickar bara på språkprefixet som de vill ha, t.ex.. "FR", och appen översätts automatiskt: 

Obs! Läs min senaste introduktion till JScrambler för att få reda på mer-Det är en ganska användbar tjänst.

Yiis webbadresshanterare kan också tillhandahålla denna typ av funktionalitet. Jag kommer förmodligen att implementera dessa funktioner i en framtida handledning i denna Yii2-serie när jag fokuserar på Routing.

Vad kommer härnäst?

Jag hoppas att du är upphetsad över kraften i I18n och fördelarna med att använda Yii Framework över vanilj PHP. Titta på kommande tutorials i vår programmering med Yii2-serien.

Om du vill veta när nästa Yii2 handledning kommer, följ mig @ reifman på Twitter eller kolla min instruktörssida. Min instruktörssida kommer att innehålla alla artiklar från denna serie så snart de publiceras. Du kan också maila mig på min Lookahead Consulting webbplats.

relaterade länkar

  • Yii Framework Website
  • Introduktion till Yii Framework (Tuts +)
  • Använda Google Translate API för att lokalisera din I18n App (Tuts +)
  • Bygg din start med PHP: Lokalisering med I18n (Tuts +)
  • Andra Gratis och Open Source Yii Developer-exempel av instruktören