Als je vraagt: "Wat is Yii?" bekijk mijn eerdere tutorial: Introductie tot het Yii Framework, die de voordelen van Yii beoordeelt en een overzicht bevat van wat er nieuw is in Yii 2.0, uitgebracht op 12 oktober 2014.
In deze serie Programming With Yii2 begeleid ik lezers in gebruik van het onlangs bijgewerkte Yii2 Framework voor PHP. In deel een hebben we Yii2 lokaal opgezet, een Hello World-applicatie gebouwd, een externe server opgezet en Github gebruikt om onze code te implementeren. In deel twee hebben we geleerd over Yii's implementatie van de Model View Controller-architectuur en hoe je webpagina's en formulieren kunt bouwen die gegevens verzamelen en valideren. In deel drie hebben we Yii's database en actieve recordmogelijkheden gebruikt om het genereren van de code voor een eenvoudige webtoepassing te automatiseren. En in deel vier leerden we hoe we gebruikersregistratie integreerden.
In deze tutorial laat ik je zien hoe je Yii's ingebouwde I18n-internationaliseringsondersteuning kunt gebruiken om je applicatie klaar te maken voor vertaling in een aantal talen.
Voor deze voorbeelden blijven we ons voorstellen dat we een raamwerk bouwen voor het plaatsen van eenvoudige statusupdates, bijvoorbeeld onze eigen mini-Twitter.
Volgens Wikipedia is I18n een numeroniem voor internationalisering:
18 staat voor het aantal letters tussen de eerste letters ik en als laatste n in internationalisering, een gebruik gemunt op DEC in de jaren 70 of 80.
Met I18n worden alle tekenreeksen die door de toepassing aan de gebruiker worden getoond, vervangen door functieaanroepen die vertaalde reeksen dynamisch kunnen laden voor elke taal die de gebruiker selecteert.
Bij het bouwen van een webapplicatie is het handig om vanaf het begin globaal te denken. Moet uw app in andere talen voor gebruikers uit verschillende landen werken? Als dat zo is, zal de implementatie van I18n vanaf het begin u veel tijd en hoofdpijn besparen.
In ons geval biedt het Yii Framework ingebouwde ondersteuning voor I18n, dus het is relatief eenvoudig om support te bouwen voor I18n terwijl je doorgaat.
I18n werkt door alle verwijzingen naar tekst die aan de gebruiker wordt getoond te vervangen door functieaanroepen die zorgen voor vertaling wanneer dat nodig is.
Dit is bijvoorbeeld wat de namen van het attribuutveld in het Statusmodel eruit zien vóór I18n:
public function attributeLabels () return ['id' => 'ID', 'message' => 'Message', 'permissions' => 'Permissions', 'created_at' => 'Created At', 'updated_at' => 'Bijgewerkt bij',];
Het leveren van vertaalde versies van de code zou erg ingewikkeld worden. Niet-technische vertalers zouden de code moeten vertalen, waarschijnlijk de syntaxis.
Hier is hoe dezelfde code eruit ziet met I18n:
public function attributeLabels () return ['id' => Yii :: t ('app', 'ID'), 'message' => Yii :: t ('app', 'Message'), 'permissions' = > Yii :: t ('app', 'Permissions'), 'created_at' => Yii :: t ('app', 'Created At'), 'updated_at' => Yii :: t ('app', ' Bijgewerkt bij '),];
Yii: t ()
is een functieaanroep die controleert welke taal momenteel is geselecteerd en geeft de juiste vertaalde reeks weer. De 'App'
parameter verwijst naar een gedeelte van onze applicatie. Vertalingen kunnen naar keuze in verschillende categorieën worden georganiseerd. Maar waar verschijnen deze vertaalde reeksen?
De standaardtaal, in dit geval Engels, wordt in de code geschreven, zoals hierboven weergegeven. Taalbronbestanden zijn lijsten met rijen reeksen waarvan de sleutel de standaardtaal is, bijv. 'Bericht'
of 'Permissions'
-en elk bestand biedt vertaalde tekstwaarden voor de juiste taal.
Hier is een voorbeeld van ons voltooide Spaanse vertaalbestand, taalcode "es". De Yii: t ()
functie gebruikt dit bestand om de juiste vertaling te vinden om weer te geven:
'Comience con Yii', 'Heading' => 'título', 'My Yii Application' => 'Mi aplicación Yii', 'Yii Documentation' => 'Yii Documentación', 'Yii Extensions' => 'Extensiones Yii', 'Yii Forum' => 'Yii Foro', 'Weet je zeker dat je dit item wilt verwijderen?' => '¿Seguro que quieres borrar este artículo?', 'Gefeliciteerd!' => '¡Enhorabuena!', 'Create' => 'crear', 'Create modelClass' => 'crear modelClass', 'Created At' => 'Creado el', 'Delete' => 'borrar ',' ID '=>' identificación ',' Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minimus veniam, quis nostrud exercise ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in 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 enim admin veniam, nostrud quis ullamco exercitation nisi ut laboris aliquip commodo ex ea consequat. Duis Aute Irure dolor en reprehenderit en voluptate velita esse cillum dolore eu nulla fugiat pariatur. ',' Message '=>' mensaje ',' Permissions '=>' Permisos ',' Reset '=>' reajustar ',' Zoeken '= > 'búsqueda', 'Statuses' => 'Los estados', 'Update' => 'actualización', 'Update modelClass:' => 'actualización modelClass:', 'Bijgewerkt bij' => 'Actualizado A ',' U hebt met succes uw door Yii aangedreven toepassing gemaakt. ' => 'Ha creado su aplicación Yii con alimentación.',];
Hoewel dit tijdrovend lijkt, biedt Yii scripts om de generatie en organisatie van deze bestandssjablonen te automatiseren.
Door de tekst van de code te scheiden, maken we het eenvoudiger voor niet-technische meertalige experts om onze applicaties voor ons te vertalen - zonder de code te overtreden.
I18n biedt ook gespecialiseerde functies voor het vertalen van tijd, valuta, meervoudsvormen en andere. Ik zal hier niet in detail op ingaan in deze tutorial.
Helaas is de Yii2-documentatie voor I18n nog niet erg beschrijvend en was het moeilijk om werk- en stapsgewijze voorbeelden te vinden. Gelukkig voor jou, zal ik je laten doorlopen wat ik heb geleerd van het doorzoeken van de documenten en het web. Ik vond het I18n-voorbeeld van de Code Ninja en de Yii2 Definitive Guide on I18n nuttig, en Yii-medewerker Alexander Makarov bood me ook wat hulp aan.
We gebruiken de Yii2-basistoepassingssjabloon voor onze demonstratietoepassing. Dit plaatst onze codebasis onder de /Hallo
root directory. Yii's configuratiebestanden in / Hallo / config / *
worden geladen wanneer pagina-aanvragen worden gedaan. We zullen de I18n-berichtenscripts van Yii gebruiken om een configuratiebestand voor I18n uit te bouwen in de common / config
pad.
Van onze codebasiswortel, zullen we de Yii draaien message / config
script:
./ yii message / config @ app / config / i18n.php
Dit genereert de volgende bestandssjabloon die we kunnen aanpassen:
__DIR__, // array, vereist, lijst met taalcodes waarmee de uitgepakte berichten // moeten worden vertaald. Bijvoorbeeld ['zh-CN', 'de']. 'languages' => ['de'], // string, de naam van de functie voor het vertalen van berichten. // Standaard ingesteld op 'Yii :: t'. Dit wordt gebruikt als een markering om de berichten / // vertaald te vinden. U kunt een tekenreeks gebruiken voor een enkele functienaam of een array voor // meerdere functienamen. 'vertaler' => 'Yii :: t', // boolean, of berichten moeten worden gesorteerd op sleutels bij het samenvoegen van nieuwe berichten // met de bestaande berichten. De standaardinstelling is false, wat betekent dat de nieuwe (niet-vertaalde) // berichten gescheiden zijn van de oude (vertaalde) berichten. 'sort' => false, // boolean, of berichten moeten worden verwijderd die niet meer in de broncode voorkomen. // Standaard ingesteld op false, wat betekent dat elk van deze berichten wordt ingesloten met een paar '@@'-markeringen. 'removeUnused' => false, // array, lijst met patronen die aangeven welke bestanden / mappen NIET moeten worden verwerkt. // Als het leeg is of niet is ingesteld, worden alle bestanden / mappen verwerkt. // Een pad komt overeen met een patroon als het de patroonreeks aan het einde bevat. Bijvoorbeeld, // '/ a / b' komt overeen met alle bestanden en mappen die eindigen op '/ a / b'; // de '* .svn' komt overeen met alle bestanden en mappen waarvan de naam eindigt met '.svn'. // en de '.svn' komt overeen met alle bestanden en mappen met de naam '.svn'. // Let op, de '/' tekens in een patroon komen overeen met '/' en '\'. // Zie helpers / FileHelper :: findFiles () beschrijving voor meer informatie over patroonovereenkomstregels. 'alleen' => ['* .php'], // array, lijst met patronen die aangeven welke bestanden (geen mappen) moeten worden verwerkt. // Als het leeg is of niet is ingesteld, worden alle bestanden verwerkt. // Raadpleeg "behalve" voor meer informatie over de patronen. // Als een bestand / map overeenkomt met zowel een patroon in "alleen" als "behalve", wordt het NIET verwerkt. 'except' => ['.svn', '.git', '.gitignore', '.gitkeep', '.hgignore', '.hgkeep', '/ messages',], // 'php' uitvoerformaat is voor het opslaan van berichten naar php-bestanden. 'format' => 'php', // Rootdirectory met berichtenvertalingen. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. 'messages', // boolean, of het berichtbestand moet worden overschreven met het 'overschrijf' => true, / * // 'db' uitvoerformaat van de samengevoegde berichten dient om berichten in de database op te slaan. 'format' => 'db', // Verbindingscomponent om te gebruiken. Optioneel. 'db' => 'db', // Aangepaste bronberichtentabel. Optioneel. // 'sourceMessageTable' => '% source_message' // Aangepaste naam voor tabel met vertaalboodschappen. Optioneel. // 'messageTable' => '% message', * / / * // 'po' uitvoerindeling is voor het opslaan van berichten naar tekst-po-bestanden. 'format' => 'po', // Hoofddirectory met berichtenvertalingen. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. 'berichten', // Naam van het bestand dat zal worden gebruikt voor vertalingen. 'catalogus' => 'berichten', // boolean, of het berichtbestand moet worden overschreven met de samengevoegde berichten 'overschrijven' => waar, * /];
Ik ben het bestand aan het aanpassen als volgt. ik beweeg messagePath
naar de top en aanpassen SourcePath
en messagePath
. Ik specificeer ook de talen die ik wil dat mijn applicatie ondersteunt, naast Engels, in dit geval Spaans (es), Duits (de), Italiaans (it) en Japans (ja). Hier is een lijst met alle I18n-taalcodes.
__DIR__. DIRECTORY_SEPARATOR. '...', // Rootdirectory met berichtenvertalingen. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. '...'. DIRECTORY_SEPARATOR. 'messages', // array, vereist, lijst met taalcodes waar de uitgepakte berichten // naartoe moeten worden vertaald. Bijvoorbeeld ['zh-CN', 'de']. 'languages' => ['de', 'es', 'it', 'ja'], // string, de naam van de functie voor het vertalen van berichten. // Standaard ingesteld op 'Yii :: t'. Dit wordt gebruikt als een markering om de berichten / // vertaald te vinden. U kunt een tekenreeks gebruiken voor een enkele functienaam of een array voor // meerdere functienamen. 'vertaler' => 'Yii :: t',
In de volgende stap zullen we het extract-script van Yii uitvoeren dat alle code in het script zal scannen SourcePath
boom om standaard stringbestanden te genereren voor alle labels die in onze code worden gebruikt. Ik ben aan het aanpassen SourcePath
om de volledige codestructuur te scannen. Ik ben aan het aanpassen messagePath
om de resulterende bestanden in te genereren common / berichten
.
./ yii-bericht / extract @ app / config / i18n.php
Je ziet Yii al je codebestanden scannen:
Extracten van berichten van /Users/Jeff/Sites/hello/views/layouts/main.php... Extracten van berichten van /Users/Jeff/Sites/hello/views/site/about.php... Extracten van berichten van / Users / Jeff / Sites / hallo / views / site / contact.php ... Extraheren van berichten van /Users/Jeff/Sites/hello/views/site/error.php... Extracten van berichten van /Users/Jeff/Sites/hello/views/site/index.php... Extracten van berichten van /Users/Jeff/Sites/hello/views/site/login.php... Extracten van berichten van /Users/Jeff/Sites/hello/views/site/say.php... Extracten van berichten van / Users / Jeff / Sites / hallo / views / status / _form.php ... Extraheren van berichten van /Users/Jeff/Sites/hello/views/status/_search.php... Extracten van berichten van /Users/Jeff/Sites/hello/views/status/create.php... Extractie van berichten van /Users/Jeff/Sites/hello/views/status/index.php... Extractie van berichten van /Users/Jeff/Sites/hello/views/status/update.php... Extracten van berichten van / Users / Jeff / Sites / hallo / views / status / view.php ... Extractie van berichten van / Users / Je ff / Sites / hello / web / index-test.php ... Extraheren van berichten van /Users/Jeff/Sites/hello/web/index.php...
Als het voltooid is, zie je zoiets in je codebase:
In het algemene configuratiebestand, /hello/config/web.php
, we gaan Yii vertellen over onze nieuwe taalondersteuning. Ik zal Spaans mijn standaardtaal maken:
'basic', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['log'], 'language' => 'es', // spaanse 'componenten' => [
Maar er is nog meer te doen. We moeten onze code I18n bewust maken.
In deel drie van deze serie hebben we Yii's database en actieve opnamemogelijkheden gebruikt om het genereren van code te automatiseren. Maar we hebben I18n niet geactiveerd, dus al onze code bevatte tekenreeksen ingesloten. Laten we dit opnieuw doen.
We keren terug naar Gii, waarschijnlijk http: // localhost: 8888 / hello / gii in uw browser, en voeren de model- en controller-generators opnieuw uit met I18n geactiveerd.
Hier is een voorbeeld van het genereren van de modelcode van Meeting met geactiveerde I18n. Merk op dat we specificeren "App" voor onze berichtcategorie. We plaatsen al onze tekstreeksen in één app-categoriedossier.
Laten we hetzelfde doen voor de CRUD-generatie voor controllers en weergaven:
Als u in modellen, controllers en weergaven door de gegenereerde code bladert, ziet u dat de tekenreeksen worden vervangen door de Yii: t ('app', ...)
functie:
title = Yii :: t ('app', 'Statussen'); $ this-> params ['breadcrumbs'] [] = $ this-> title; ?>= Html::encode($this->titel)?>
render ('_ search', ['model' => $ searchModel]); ?>= Html::a(Yii::t('app', 'Create modelClass', [ 'modelClass' => 'Status',]), ['create'], ['class' => 'btn btn-success'])?>
= GridView::widget([ 'dataProvider' => $ dataProvider, 'filterModel' => $ searchModel, 'columns' => [['class' => 'yii \ grid \ SerialColumn'], 'id', 'message: ntext', 'permissions', 'created_at', 'updated_at', ['class' => 'yii \ grid \ ActionColumn'],],]); ?>
Omdat we een aantal weergaven in onze toepassing handmatig of in HTML genereren, moeten we deze handmatig converteren naar I18n. Bijvoorbeeld onze navigatiebalk in /views/layouts/main.php
en onze startpagina in /views/site/index.php
beide moeten met de hand worden bewerkt.
Dit is de navigatiebalk vóór I18n:
NavBar :: begin (['brandLabel' => 'Mijn bedrijf', 'brandUrl' => Yii :: $ app-> homeUrl, 'options' => ['class' => 'navbar-inverse navbar-fixed-top ',],]); $ navItems = [['label' => 'Home', 'url' => ['/ site / index']], ['label' => 'Status', 'url' => ['/ status / index ']], [' label '=>' Over ',' url '=> [' / site / over ']], [' label '=>' Contact ',' url '=> [' / site / contact ']]]; if (Yii :: $ app-> user-> isGuest) array_push ($ navItems, ['label' => 'Aanmelden', 'url' => ['/ user / login']], ['label' => 'Aanmelden', 'url' => ['/ user / register']]); else array_push ($ navItems, ['label' => 'Afmelden ('. Yii :: $ app-> gebruiker-> identiteit-> gebruikersnaam. ')', 'url' => ['/ site / logout' ], 'linkOptions' => ['data-methode' => 'plaatsen']]); echo Nav :: widget (['options' => ['class' => 'navbar-nav navbar-right'], 'items' => $ navItems,]); NavBar :: uiteinde ();
Dit is de navigatiebalk na I18n:
NavBar :: begin (['brandLabel' => Yii :: t ('app', 'Mijn bedrijf'), 'brandUrl' => Yii :: $ app-> homeUrl, 'options' => ['class' = > 'navbar-inverse navbar-fixed-top',],]); $ navItems = [['label' => Yii :: t ('app', 'Home'), 'url' => ['/ site / index']], ['label' => Yii :: t ( 'app', 'Status'), 'url' => ['/ status / index']], ['label' => Yii :: t ('app', 'About'), 'url' => [ '/ site / about']], ['label' => Yii :: t ('app', 'Contact'), 'url' => ['/ site / contact']]]; if (Yii :: $ app-> user-> isGuest) array_push ($ navItems, ['label' => Yii :: t ('app', 'Aanmelden'), 'url' => ['/ gebruiker / login ']], [' label '=> Yii :: t (' app ',' Aanmelden '),' url '=> [' / user / register ']]); else array_push ($ navItems, ['label' => Yii :: t ('app', 'Logout'). '('. Yii :: $ app-> user-> identity-> username. ')' , 'url' => ['/ site / logout'], 'linkOptions' => ['data-methode' => 'post']]); echo Nav :: widget (['options' => ['class' => 'navbar-nav navbar-right'], 'items' => $ navItems,]); NavBar :: uiteinde ();
Hier is een fragment van de inhoud van de startpagina van index.php na I18n - veel van de HTML is vervangen door PHP-oproepen naar Yii :: t ()
:
= Yii::t('app','Congratulations!'); ?>
= Yii::t('app','You have successfully created your Yii-powered application.'); ?>
= Yii::t('app','Get started with Yii'); ?>
= Yii::t('app','Heading'); ?>
= Yii::t('app','Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.'); ?>
= Yii::t('app','Yii Documentation') ?> »
Uw berichtenbestanden vertalen
Bekijk ons Spaanse berichtenbestand,
/common/messages/es/frontend.php
. Het is een lange lijst met lege arraywaarden:return ['About' => ", 'Contact' =>", 'Home' => ", 'Logout' =>", 'Mijn bedrijf' => ", 'Aanmelden' =>", 'Aanmelden' => ", 'Status' =>", ...Voor het invullen van onze Spaanse vertalingen voor deze zelfstudie gebruik ik Google Vertalen. Lastig, he?
Vervolgens gaan we wat knippen en plakken met die vertalingen terug in het berichtbestand.
return ['About' => 'Acerca de', 'Contact' => 'Contacto', 'Home' => 'Home', 'Logout' => 'Salir', 'Mijn bedrijf' => 'Mi Empresa', 'Aanmelden' => 'Entrar', 'Aanmelden' => 'Registrarse', 'Status' => 'Estado',Wanneer we de startpagina van de toepassing bezoeken, ziet u de Spaanse versie - mooi, hè?
Dit is het formulier Status maken:
Als ik wil terugschakelen naar het Engels, verander ik gewoon het configuratiebestand,
/config/web.php
, terug naar het Engels:'basic', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['log'], 'language' => 'en', // terug naar Engelse 'componenten' => [Je zult ook merken dat het vervangen van strings in JavaScript zijn eigen complexiteiten heeft. Ik heb het zelf niet onderzocht, maar de Yii 1.x JsTrans-extensie kan een nuttige richtlijn zijn om dit te ondersteunen.
Verder gaan met I18n
Uiteindelijk willen we onze applicatie mogelijk in een aantal talen vertalen. Ik heb een nieuwe zelfstudie geschreven met de naam De Google Translate API gebruiken om uw I18n-app te lokaliseren (Tuts +), waarmee uw toepassing automatisch in verschillende talen wordt vertaald. Als het nog niet is gepubliceerd, wordt het binnenkort gepubliceerd (kijk op mijn instructeurspagina). Dit levert natuurlijk alleen basisvertalingen op. Misschien wilt u professionele vertalers inhuren om de bestanden achteraf af te stemmen.
Sommige applicaties stellen gebruikers in staat hun moedertaal te kiezen, zodat wanneer ze inloggen, de gebruikersinterface automatisch voor hen vertaalt. In Yii stelt u de
$ App-> taal
variabele doet dit:\ Yii :: $ app-> language = 'es';
Andere toepassingen, zoals JScrambler.com hieronder, maken gebruik van het URL-pad om van taal te veranderen. De gebruiker klikt gewoon op het gewenste taalvoorvoegsel, bijvoorbeeld. "FR", en de app wordt automatisch vertaald:
Opmerking: lees mijn recente inleiding tot JScrambler voor meer informatie-het is een redelijk nuttige service.
Yii's URL Manager kan dit type functionaliteit ook bieden. Ik zal deze functies waarschijnlijk implementeren in een toekomstige zelfstudie in deze Yii2-serie wanneer ik me richt op Routering.
Wat is het volgende?
Ik hoop dat je enthousiast bent over de kracht van I18n en de voordelen van het gebruik van het Yii Framework op vanilla PHP. Bekijk de komende tutorials in onze Programming With Yii2-serie.
Als je wilt weten wanneer de volgende Yii2-handleiding aankomt, volg me dan @reifman op Twitter of bekijk mijn instructeurspagina. Op mijn instructeurspagina staan alle artikelen uit deze serie zodra ze zijn gepubliceerd. Je kunt me ook e-mailen op mijn Lookahead Consulting-website.
Gerelateerde Links
- Yii Framework Website
- Introductie van het Yii Framework (Tuts +)
- De Google Translate API gebruiken om uw I18n-app te lokaliseren (Tuts +)
- Bouw je Startup met PHP: Lokalisatie met I18n (Tuts +)
- Andere gratis en open source Yii-ontwikkelaarsvoorbeelden door de instructeur