Slik programmerer du med Yii2 Lokalisering med I18n

Hva du skal skape

Hvis du spør, "Hva er Yii?" sjekk ut min tidligere opplæring: Introduksjon til Yii Framework, som vurderer fordelene med Yii og inneholder en oversikt over hva som er nytt i Yii 2.0, utgitt 12. oktober 2014.

I denne programmeringen med Yii2-serien, er jeg veiledende lesere i bruk av den nylig oppgraderte Yii2 Framework for PHP. I del ett opprettet vi Yii2 lokalt, bygget et Hello World-program, opprettet en ekstern server og brukte Github til å distribuere koden vår. I del to lærte vi om Yiis implementering av sin Model View Controller-arkitektur og hvordan man bygger nettsider og skjemaer som samler og validerer data. I del tre brukte vi Yiis database og aktive rekordmuligheter for å automatisere kodegenerering for en grunnleggende webapplikasjon. Og i del fire lærte vi å integrere brukerregistrering.

I denne opplæringen skal jeg vise deg hvordan du kan benytte deg av Yiis innebygde I18n internasjonaliseringstøtte for å gjøre søknaden din klar for oversettelse til en rekke språk.

For disse eksemplene fortsetter vi å forestille oss at vi bygger et rammeverk for å legge ut enkle statusoppdateringer, f.eks. vår egen mini-Twitter.

Hva er I18n?

I følge Wikipedia er I18n et tall for internasjonalisering:

18 står for antall bokstaver mellom den første Jeg og sist n i internasjonalisering, en bruk mente på DEC på 1970-tallet eller 80-tallet.

Med I18n blir alle tekststrenger som vises til brukeren fra applikasjonen, erstattet av funksjonssamtaler som dynamisk kan laste oversatte strenger for hvilket språk brukeren velger.

Målene for internasjonalisering

Når du bygger et webprogram, er det nyttig å tenke globalt fra begynnelsen. Må din app jobbe på andre språk for brukere fra forskjellige land? Hvis det er tilfelle, vil da du implementere I18n fra begynnelsen, spare mye tid og hodepine senere.

I vårt tilfelle gir Yii Framework innebygd støtte for I18n, så det er relativt enkelt å bygge støtte for I18n mens du går.

Hvordan fungerer jeg?

I18n fungerer ved å erstatte alle referanser til tekst som vises til brukeren med funksjonssamtaler som gir oversettelse når det er nødvendig. 

For eksempel, her er hva attributtfeltnavnene i Statusmodellen ser ut før I18n:

offentlig funksjon attributtLabels () return ['id' => 'ID', 'message' => 'Melding', 'permissions' => 'Tillatelser', 'created_at' => 'Created At', 'updated_at' => 'Oppdatert på',];  

Å gi oversatte versjoner av koden vil bli svært komplisert. Ikke-tekniske oversettere må oversette koden på plass, sannsynligvis bryte syntaks.

Slik ser den samme koden ut med I18n:

offentlig funksjon attributtLabels () return ['id' => Yii :: t ('app', 'ID'), 'message' => Yii :: t ('app', 'Message'), 'permissions' > Yii :: t ('app', 'Tillatelser'), 'created_at' => Yii :: t ('app', 'Created At'), 'updated_at' => Yii :: t Oppdatert på '),];  

Yii: t () er et funksjonsanrop som sjekker hvilket språk som er valgt for øyeblikket og viser riktig oversatt streng. De 'App' parameter refererer til en del av vår søknad. Oversettelser kan eventuelt organiseres i henhold til ulike kategorier. Men hvor vises disse oversatte strengene?

Standardspråket, i dette tilfellet engelsk, er skrevet inn i koden, som vist ovenfor. Språkressursfiler er lister over arrays av strenger hvis nøkkel er standard språktekst, f.eks. 'Budskap'eller 'tillatelser'-og hver fil gir oversatte tekstverdier for sitt eget språk.

Her er et eksempel på vår ferdige spanske oversettelsesfil, språkkode "es". De Yii: t () funksjonen bruker denne filen for å finne den riktige oversettelsen som skal vises:

 'Komme i gang Yii', 'Overskrift' => 'Tittulo', 'My Yii Application' => 'Melding, Yii', 'Yii Documentation' => 'Yii Documentación', 'Yii Extensions' => 'Extensions Yii' 'Yii Forum' => 'Yii Foro', 'Er du sikker på at du vil slette dette elementet?' => 'Seguro que quieres borrar este artículo?', 'Gratulerer!' => '¡Enhorabuena!', 'Create' => 'crear', 'Lag modelClass' => 'crear modelClass', 'Created At' => 'Creado el', 'Slett' => 'borrar ',' ID '=>' identifikasjon ',' Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed gjør eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut som et minimum, det er en utfordring å utøve arbeidet med å utvide ut fra dette. 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 labore et dolore incididunt magna aliqua. Ut er det minimal, og du trenger ikke å utøve arbeidet med å utøve det som en følge av dette. Duis Aute Du har ikke tilgang til å starte et nytt emne her, men du kan ikke redigere meldingen. ',' Message '=>' mensaje ',' Permissions '=>' Permisos ',' Reset '=>' reajustar ',' Søk '= > 'búsqueda', 'Statuses' => 'Los estados', 'Oppdater' => 'actualización', 'Oppdater modelClass:' => 'actualización modelClass:', 'Oppdatert på' => 'Actualizado A ',' Du har opprettet din Yii-drevne applikasjon. ' => 'Har gjort det lettere for deg.',];

Selv om dette ser tidkrevende ut, gir Yii skript for å automatisere genereringen og organisasjonen av disse filmalene.

Ved å skille teksten fra koden, gjør vi det lettere for ikke-tekniske flerspråklige eksperter å oversette våre applikasjoner for oss uten å bryte koden.

I18n tilbyr også spesialiserte funksjoner for å oversette tid, valuta, flertall og et al. Jeg vil ikke gå inn i detaljene til disse i denne opplæringen. 

Konfigurere I18n-støtte

Dessverre er Yii2-dokumentasjonen for I18n ennå ikke veldig beskrivende, og det var vanskelig å finne arbeid, trinnvise eksempler. Heldigvis for deg, jeg kommer til å gå deg gjennom det jeg har lært fra å skure docs og nettet. Jeg fant The Code Ninja's I18n eksempel og Yii2 Definitive Guide on I18n nyttig, og Yii bidragsyter Alexander Makarov tilbød meg også litt hjelp.

Generering av I18n-konfigurasjonsfilen

Vi bruker Yii2 grunnleggende applikasjonsmal for vårt demonstrasjonsprogram. Dette plasserer vår kodebase under /Hallo rotkatalogen. Yii er konfigurasjonsfiler i / Hei / config / * er lastet når sideforespørsler blir gjort. Vi bruker Yiis I18n meldingsskript for å bygge ut en konfigurasjonsfil for I18n i felles / config sti.

Fra vår kodebase rot, kjører vi Yii melding / config manus:

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

Dette genererer følgende filmal som vi kan tilpasse:

 __DIR__, // array, required, liste over språkkoder som de utpakkede meldingene // skal oversettes til. For eksempel ['zh-CN', 'de']. 'languages' => ['de'], // streng, navnet på funksjonen for å oversette meldinger. // Standard til 'Yii :: t'. Dette brukes som et merke for å finne meldingene som // oversettes. Du kan bruke en streng for enkeltfunksjonsnavn eller en rekkefølge for // flere funksjonsnavn. 'translator' => 'Yii :: t', // boolean, om du vil sortere meldinger med nøkler når du slår sammen nye meldinger // med de eksisterende. Standard er falsk, noe som betyr at de nye (utranslaterte) // meldingene vil bli skilt fra de gamle (oversatte). 'sort' => false, // boolean, om du vil fjerne meldinger som ikke lenger vises i kildekoden. // Standard til falsk, som betyr at hver av disse meldingene vil bli vedlagt et par '@@' merker. 'removeUnused' => false, // array, liste over mønstre som spesifiserer hvilke filer / kataloger som IKKE skal behandles. // Hvis tom eller ikke, vil alle filer / kataloger bli behandlet. // En sti samsvarer med et mønster hvis det inneholder mønsterstrengen ved slutten. For eksempel, // '/ a / b' vil samsvare med alle filer og kataloger som slutter med '/ a / b'; // '* .svn' vil samsvare med alle filer og kataloger hvis navn slutter med '.svn'. // og '.svn' vil samsvare med alle filer og kataloger som heter ".vn". // Merk, '/' tegnene i et mønster matcher både '/' og '\'. // Se hjelpere / FileHelper :: findFiles () beskrivelse for flere detaljer om mønster matching regler. 'only' => ['* .php'], // array, liste over mønstre som spesifiserer hvilke filer (ikke kataloger) skal behandles. // Hvis det er tomt eller ikke satt, vil alle filer bli behandlet. // Vennligst henvis til "unntatt" for detaljer om mønstrene. // Hvis en fil / katalog samsvarer med både et mønster i "bare" og "unntatt", vil det IKKE bli behandlet. 'except' => ['.svn', '.git', '.gitignore', '.gitkeep', '.hgignore', '.hgkeep', '/ messages',], // 'php' er for å lagre meldinger til php-filer. 'format' => 'php', // Root-katalog som inneholder meldingsoversettelser. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. 'meldinger', // boolsk, om meldingsfilen skal overskrives med de fusjonerte meldingene 'overwrite' => true, / * // 'db' utdataformatet er for å lagre meldinger til databasen. 'format' => 'db', // Tilkoblingskomponent som skal brukes. Valgfri. 'db' => 'db', // Tilpasset kildemeldingstabell. Valgfri. // 'sourceMessageTable' => '% source_message', // Egendefinert navn for oversettelse meldingstabell. Valgfri. // 'messageTable' => '% message', * / / * // 'po'-utdataformatet er for å lagre meldinger til gettext po-filer. 'format' => 'po', // Root-katalog som inneholder meldingsoversettelser. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. 'meldinger', // Navn på filen som skal brukes til oversettelser. 'catalog' => 'messages', // boolean, om meldingsfilen skal overskrives med de fusjonerte meldingene 'overwrite' => true, * /]; 

Jeg tilpasser filen som følger. jeg flytter messagePath opp til toppen og tilpasse SourcePath og messagePath. Jeg spesifiserer også språkene jeg ønsker at søknaden min skal støtte i tillegg til engelsk - i dette tilfellet spansk, tysk (de), italiensk (det) og japansk (ja). Her er en liste over alle I18n språkkoder.

 __DIR__. DIRECTORY_SEPARATOR. '...', // Root-katalog som inneholder meldingsoversettelser. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. '...'. DIRECTORY_SEPARATOR. 'meldinger', // array, kreves, liste over språkkoder som de utpakkede meldingene // skal oversettes til. For eksempel ['zh-CN', 'de']. 'languages' => ['de', 'es', 'it', 'ja'], // streng, navnet på funksjonen for å oversette meldinger. // Standard til 'Yii :: t'. Dette brukes som et merke for å finne meldingene som // oversettes. Du kan bruke en streng for enkeltfunksjonsnavn eller en rekkefølge for // flere funksjonsnavn. 'oversetter' => 'yii :: t', 

I det neste trinnet løper vi Yii ekstrakt skript som vil skanne all koden i SourcePath tre for å generere standardstrengfiler for alle etikettene som brukes i vår kode. Jeg tilpasser SourcePath å skanne hele kode treet. Jeg tilpasser messagePath å generere de resulterende filene i felles / meldinger.

 ./ yii melding / ekstrakt @ app / config / i18n.php

Du får se Yii skanne alle kodefilene dine:

Utdrag av meldinger fra /Users/Jeff/Sites/hello/views/layouts/main.php... Utdrag av meldinger fra /Users/Jeff/Sites/hello/views/site/about.php... Utdrag av meldinger fra / Brukere / Jeff / Nettsteder / hei / visninger / nettsted / contact.php ... Utdrag av meldinger fra /Users/Jeff/Sites/hello/views/site/error.php... Utdrag av meldinger fra /Users/Jeff/Sites/hello/views/site/index.php... Utdrag av meldinger fra /Users/Jeff/Sites/hello/views/site/login.php... Utdrag av meldinger fra /Users/Jeff/Sites/hello/views/site/say.php... Utdrag av meldinger fra / Brukere / Jeff / Nettsteder / hei / visninger / status / _form.php ... Utdrag av meldinger fra /Users/Jeff/Sites/hello/views/status/_search.php... Utdrag av meldinger fra /Users/Jeff/Sites/hello/views/status/create.php... Utdrag av meldinger fra /Users/Jeff/Sites/hello/views/status/index.php... Utdrag av meldinger fra /Users/Jeff/Sites/hello/views/status/update.php... Utdrag av meldinger fra / Brukere / Jeff / Nettsteder / hei / visninger / status / view.php ... Utdrag av meldinger fra / Brukere / Je ff / Sites / hei / web / index-test.php ... Utdrag av meldinger fra /Users/Jeff/Sites/hello/web/index.php... 

Når det er ferdig, ser du noe slikt i kodebase:

Aktivere I18n og Velge et språk

I den vanlige konfigurasjonsfilen, /hello/config/web.php, Vi skal fortelle Yii om vår nye språkstøtte. Jeg lager spansk mitt standard språk:

 'basic', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['logg'], 'språk' => 'es', // spansk 'komponenter' => 

Men det er fortsatt mer å gjøre. Vi må gjøre koden I18n oppmerksom.

Bruke Yii's Gii Code Generator Med I18n

I del tre av denne serien brukte vi Yiis database og aktive rekordfunksjoner for å automatisere kodegenerering. Men vi aktiverte ikke I18n, så all vår kode hadde tekststrenger innebygd. La oss gjøre dette igjen.

Vi kommer tilbake til Gii, sannsynligvis http: // localhost: 8888 / hei / gii i nettleseren din, og kjøre modell- og regulatorgeneratorene igjen med I18n aktivert.

Her er et eksempel på å generere møtemodellkoden med I18n aktivert. Legg merke til at vi spesifiserer "App" for vårt Meldingskategori. Vi plasserer alle tekststrenger i en appkategorifil. 

La oss gjøre det samme for CRUD-generasjonen for kontrollere og visninger:

Hvis du blar gjennom den genererte koden i modeller, kontroller og visninger, ser du tekststrengene erstattet med Yii: t ('app', ...) funksjon:

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

tittel)?>

gjengivelse ('_ søk', ['modell' => $ søkemodell]); ?>

'Status',]), ['create'], ['class' => 'btn btn-suksess'])>>

$ dataProvider, 'filterModel' => $ searchModel, 'columns' => [['class' => 'yii \ grid \ SerialColumn'], 'id', 'melding: ntext', 'tillatelser', 'created_at' 'updated_at', ['class' => 'yii \ grid \ ActionColumn'],],]); ?>

Gjør statiske synspunkter I18n Klar

Fordi vi genererer flere visninger i vår søknad for hånd eller i HTML, må vi manuelt konvertere disse til å bruke I18n. For eksempel, vår navigasjonslinje i /views/layouts/main.php og vår hjemmeside i /views/site/index.php begge må redigeres for hånd. 

Her er navigasjonslinjen før I18n:

NavBar :: start (['brandLabel' => 'Mitt firma', 'brandUrl' => Yii :: $ app-> homeUrl, 'options' => ['class' => 'navbar-inverse navbar-fast-top ',],]); $ navItems = [['label' => 'Hjem', 'url' => ['/ nettsted / indeks']], ['label' => 'Status', 'url' => ['/ status / indeks ''], ['label' => 'Om', 'url' => ['/ side / om']], ['label' => 'Kontakt', 'url' => ['/ nettsted / kontakt ']]]; hvis Yii :: $ app-> user-> isGuest) array_push ($ navItems, ['label' => 'Logg inn', 'url' => ['/ bruker / login']], ['label' => 'Registrer deg', 'url' => ['/ bruker / registrer']]);  ellers array_push ($ navItems, ['label' => 'Logout (' .Yii :: $ app-> bruker-> identitet-> brukernavn. ')', 'url' => ['/ site / logout' ], 'linkOptions' => ['data-method' => 'innlegg']]);  echo Nav :: widget (['options' => ['class' => 'navbar-nav navbar-right'], 'items' => $ navItems,]); NavBar :: ende ();

Her er navigeringslinjen etter I18n:

NavBar :: start (['brandLabel' => Yii :: t ('app', 'My Company'), 'brandUrl' => Yii :: $ app-> homeUrl, 'options' => ['class' = > 'navbar-inverse navbar-fixed-top',],]); $ navItems = [['label' => Yii :: t ('app', 'Hjem'), 'url' => ['/ site / index']], ['label' => Yii :: t 'app', 'Status'), 'url' => ['/ status / indeks']], ['label' => Yii :: t ('app', 'Om'), 'url' => '/ site / about']], ['label' => Yii :: t ('app', 'Kontakt'), 'url' => ['/ nettsted / kontakt']]]; hvis (Yii :: $ app-> user-> isGuest) array_push ($ navItems, ['label' => Yii :: t ('app', 'Logg på'), 'url' => ['/ bruker / logg inn]], ['label' => Yii :: t ('app', 'Registrer deg'), 'url' => ['/ bruker / register']]);  ellers array_push ($ navItems, ['label' => Yii :: t ('app', 'Logout'). '' 'Yii :: $ app-> user-> identity-> brukernavn.') ' , 'url' => ['/ site / logout'], 'linkOptions' => ['data-method' => 'innlegg']]));  echo Nav :: widget (['options' => ['class' => 'navbar-nav navbar-right'], 'items' => $ navItems,]); NavBar :: ende ();

Her er et fragment av innholdet på hjemmesiden fra index.php etter at I18n-mye av HTML er blitt erstattet av PHP-anrop til Yii :: t ():

»

Oversette meldingsfilene dine

Ta en titt på vår spanske meldingsfil, /common/messages/es/frontend.php. Det er en lang liste over tomme arrayverdier:

returnere ['Om' => ',' Kontakt '=> ",' Hjem '=>",' Logg ut '=> ",' My Company '=>",' Logg på '=> "," Registrer " => ", 'Status' =>", ... 

For å fylle ut våre spanske oversettelser for denne opplæringen, bruker jeg Google Translate. Tricky, hei?

Da skal vi gjøre noe kutt og lim inn med disse oversettelsene tilbake i meldingsfilen. 

returnere ['Om' => 'Acerca de', 'Kontakt' => 'Contacto', 'Hjem' => 'Hjem', 'Logout' => 'Salir', 'My Company' => 'Mi Empresa' 'Sign In' => 'Entrar', 'Sign Up' => 'Registrarse', 'Status' => 'Estado',

Når vi besøker Applikasjonens hjemmeside, ser du den spanske versjonen, fint, hei?

Her er Create Status-skjemaet:

Hvis jeg vil bytte tilbake til engelsk, endrer jeg bare konfigurasjonsfilen, /config/web.php, tilbake til engelsk:

 'basic', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['logg'], 'språk' => 'no', // tilbake til engelsk 'components' =>

Du vil også legge merke til når du fortsetter å bytte strenger i JavaScript har sine egne kompleksiteter. Jeg har ikke utforsket det selv, men Yii 1.x JsTrans-utvidelsen kan gi en nyttig retningslinje for å støtte dette.

Går videre med I18n

Til slutt vil vi kanskje oversette søknaden vår til en rekke språk. Jeg har skrevet en ny opplæring kalt Bruke Google Translate API til å lokalisere din I18n App (Tuts +) som automatisk oversetter applikasjonen din til en rekke språk. Hvis det ikke er publisert ennå, vil det bli publisert snart (sjekk min instruktørside). Selvfølgelig gir dette bare grunnleggende oversettelser. Du vil kanskje leie profesjonelle oversettere for å stille inn filene etterpå.

Noen applikasjoner lar brukerne velge sitt morsmål slik at brukergrensesnittet automatisk oversettes til dem når de logger på. I Yii, setter du inn $ App-> språk variabel gjør dette:

\ Yii :: $ app-> språk = 'es';

Andre programmer, som JScrambler.com nedenfor, utnytter URL-banen for å bytte språk. Brukeren klikker bare på språkprefikset de vil ha, f.eks. "FR", og appen blir automatisk oversatt: 

Merk: Les min siste introduksjon til JScrambler for å finne ut mer-det er en ganske nyttig tjeneste.

Yii's URL Manager kan også gi denne typen funksjonalitet. Jeg vil trolig implementere disse funksjonene i en fremtidig opplæring i denne Yii2-serien når jeg fokuserer på ruting.

Hva blir det neste?

Jeg håper du er spent på kraften til I18n og fordelene med å bruke Yii Framework over vanilje PHP. Se etter kommende opplæringsprogrammer i vår programmering med Yii2-serien.

Hvis du vil vite når neste Yii2 opplæring kommer, følg meg @ reifman på Twitter eller sjekk min instruktørside. Min instruktørside vil inkludere alle artiklene fra denne serien så snart de er publisert. Du kan også sende meg en e-post på Lookahead Consulting.

Relaterte linker

  • Yii Framework Website
  • Introduksjon til Yii Framework (Tuts +)
  • Bruk Google Translate API til å lokalisere din I18n App (Tuts +)
  • Bygg din oppstart med PHP: Lokalisering med I18n (Tuts +)
  • Andre gratis og åpen kildekode-utviklereksempler av instruktøren