Symfony kurzus 2014/2015 I. félév
Translation
Működési alapok •
Általános symfony service •
•
Minden Controllerben elérhető •
•
Így beállítása szükséges a config.yml fájlban. framework: translator: { fallback: en } Hiszen a Controllerben hozzáférünk a container-hez: $translator = $this->get(‘translator’); $translated = $translator ->trans(‘The translation is working successful!’); // $translated ‘A fordítás megfelelően működik!’
Egyéb helyeken: Command, Form, Service •
$container->get(‘translator) … •
A Container paraméterül adása szükséges.
Fordítási szótár Egyszerű fordítási módszer. Fő nyelv általában az angol. Adott Bundle / Resources / translations mappában messages.hu.yml fájl: ‘Entity’: ‘Entitás ‘The entity successfully created!’: ‘Az entitás sikeresen létrehozva!’ •
Hierarchikus kulcsrendszer alapú fordítási módszer Szintén a translations mappában történik a fordítások tárolása, de jelen esetben létezik a messages.en.yml is. messages.hu.yml fájl: bundle: entity: title: ‘Entitás’ new: ‘Az entitás sikeresen létrehozva’ •
Twig template fordítása 1. A fordítás fő felhasználási területe a template-ek. Itt mindig az alapértelmezés szerint nyelv (fallback) és a teljes alkalmazás fordítási arzenálja rendelkezésre áll. {% trans_default_domain "app" %}
{% trans %}Hello{% endtrans %}!
Üdv!
A HTML-szintaktikai elemek, írásjelek (azaz összefoglaló néven nyelv-független elemek) elhelyezésekor ügyeljünk rá, hogy lehetőleg hagyjuk ki őket a fordításból. A fenti példában ez biztosítja, hogy egységesen az angol és a magyar fordításban is megjelenjen a !-jel, elkerülve ezzel egy hiba kialakulásának lehetőségét.
Ha nem létezik a magyar fordításban ‘Hello’: … akkor magyarul is a Hello! - szöveg fog megjelenni.
Twig template fordítása 2. Ha egy összetett kifejezést szeretnénk kiíratni, ami több lefordítandó kifejezést vagy több közbeékelt nyelv-független elemet tartalmaz, akkor érdemes használnunk a másodlagos módszert, amelyet az alábbiakban ismertetek. Ha változóban szereplő sztringet szeretnénk lefordítani, akkor ez csak a másodlagos módszerrel lehetséges.
{{ ’Hello’|trans ~ ‘!’ }}
Üdv!
{% set message = ‘Hello’ %}
{{ message|trans ~ ‘!’ }}
Üdv!
Minden sztring elemet ‘’ vagy ”” jelek között kell megadni, hiszen ellenkező esetben a fordító változóként próbálná értelmezni a megadott szót. Mint látható a konkatenáció műveleti jele: ~ Ahogy a neve is mutatja, a másodlagos módszert használatát, csak akkor ajánlom, ha az elsődleges (1. oldalon szereplő) módszer valami miatt csődöt mond.
Plurization 1. {% transchoice count with {'%name%': ‘Steve'} from "app" %} 1. 2.
3.
{0} %name%, there are no apples| {1} %name%, there is one apple| ]1,Inf] %name%, there are %count% apples
{% endtranschoice %} 1. A kapott paraméter count értéke: 0 2. A kapott paraméter count értéke: 1 3. A kapott paraméter count értéke > 1 A with kulcsszó után megadott tömbben, akár több változó definiálása is lehetséges lenne, jelen esetben ez 1db: %name% A name paraméter értéke jelenleg egy statikus sztring de ez lehet egy Controllerből kapott változó értéke is. A from kulcsszó után megadott paraméterrel módosítható a translate_domain.
Plurization 2. {{ message|transchoice( 2.
count, {'%name%': 'Fabien'},
3.
”app”
1.
) }} Itt a paraméterek típusa határozza meg a jelentésüket. De be kell tartani a sorrendet, ha kettőt vagy hármat használunk. Az első paraméter egy szám típusú adat. A második paraméter egy tömb A harmadik paraméter egy sztring. A funkció helyes működéséhez legalább 1 paraméter megadása szükséges, de bármely másik két paraméter elhagyható. A pluraziáció másodlagos használati módját a |trans funkciónál leírt okok miatt érdemes használni.
Plurazitation 3. $translator->transChoice( '{0} %name%, There are no apples| {1} %name%, There is one apple| ]1,Inf[ %name%, There are %count% apples', 10, array('%name%' => ‘Steve’, '%count%' => 10), ”app” ) A count paraméter értékét 2 helyen is meg kell adni! Itt szintén a paraméterek típusa határozza meg a jelentésüket, valamint a sorrendet is be kell tartani. Ne felejtsük el, hogy a fordítási funkció nem a megadott statikus fordítandó sztring-ből olvassa ki a változókat, hanem elősször megkeresi a megfelelő lokalizációs fájlt és az ott található sztringben keresi meg a kicserélendő %paraméter%-eket.
Egyéb tudnivalók 1. {# text translated between tags is never escaped #} {% trans %}
foo
{% endtrans %} {% set message = '
foo
' %} {# strings and variables translated via a filter are escaped by default #} {{ message|trans|raw }} {{ '
bar
'|trans|raw }}
Egyéb tudnivalók 2. A fordítási szótárban szereplő sztringek megadásakor nem mindig kell aposztrófot használni: a hierarchikus fordítás esetében például csak akkor, ha kulcs után szereplő adat pluraziációs elemeket is tartalmaz. bundle: apple: exist: ‘{0} %name%, There are no apples| {1} %name%, There is one apple| ]1,Inf[ %name%, There are %count% apples’ A plurizációs elemek: {0} , {1} , ]1,Inf[ után ne felejtsünk el szóközt rakni, mert azzal értelmezési hibát okozunk.
Form elemek fordítása 1. •
Űrlapon szereplő szöveges elemek: •
•
Form field options tömb egyes kulcsai, amelyek szöveges adatot tartalmazhatnak – automatikusan fordításra kerülnek. •
•
•
Mező címkék, segítség-üzenetek, placeholder-szövegek, választható lista elemek, kijelölhető almezők.
$builder->add(‘name’, ‘text’, array( ‘label’ => ‘Full name’, // ‘Teljes név’ ‘attr’ => array( ‘help’ => ‘help’ // ‘segítség’ ) ); $builder->add(‘gender’, ‘choice’, array( ‘label’ => ‘Gender’, // ‘Nem’ ‘choices’ => array( 0 => ‘male’, // ‘férfi’ 1 => ‘female’ // ‘nő’ ) );
A fordítás természetesen csak akkor sikeres, ha létezik a szótárban megfelelő fordítás az adott sztringekhez.
Form elemek fordítása 2. •
Űrlapon szereplő leggyakoribb elem a ‘label’ – ‘címke’ •
•
Form field options tömb ‘label’-től eltérő kulcsainak hierarchikus kódját továbbra is nekünk kell megadni. •
•
•
Hiearchikus kulcsrendszerű fordítás használata esetén könnyebbséget jelenthet az ElaoFormTranslationBundle használata: https://github.com/Elao/ElaoFormTranslationBundle Mert beállítható, hogy az összes form field ‘label’ nevének generálását elvégezze helyettünk. A generált kód alapja, az elérési út és az adatmező megnevezése.
$builder->add(‘name’, ‘text’, array( //‘label’ => ‘form.sed_learn_bundle_entity.name.label’, // ‘Teljes név’, ‘attr’ => array(‘help’ => ‘form.sed_learn_bundle_entity.name.help’) ) ); $builder->add(‘gender’, ‘choice’, array( //‘label’ => ‘form.sed_learn_bundle_entity.gender.label’, // ‘Nem’ ‘choices’ => array( 0 => ‘form.sed_learn_bundle_entity.gender.type.0’, 1 => ‘form.sed_learn_bundle_entity.gender.type.1’ ) );
A fentiekben leírt példák feltételezik az ElaoFormTranslationBundle előzetes beállítását a config.yml-ben. Bővebb információ a fent megjelölt linken elérhető a bundle-dokumentációban.
Entity üzenetek fordítása 1. •
Az űrlapok feldolgozásakor a megadott adatoknak meg kell felelnie az űrlap hibaellenőrzési metódusainak és ha helyesen programozott rendszerről beszélünk, akkor ez esetben az feldolgozás eredményeként létrejövő új adatbázis elem, meg fog felelni az adatbázisbeli szabályoknak is. •
•
Symfony-ban meghívhatunk Assert (validációs) metódusokat Entity fájlokban és FormType fájlokban is. Elsődlegesen adjuk meg a Assert-eket az entitásban másodlagosan kollekcióknál pedig kerülhetnek Assert-ek a formba is.
Az Assert meghívásakor mindig van lehetőségünk speciális üzenetet adni meg paraméterként. •
•
/** * @Assert\NotBlank(message = ‘The name is empty.’) */ private $name; A fordítás természetesen csak akkor sikeres, ha létezik a szótárban megfelelő fordítás az adott sztringekhez.
Entity üzenetek fordítása 2. • •
A böngészőbeli alapértelmezett validációs eljárások elkerülésére használjunk novalidate-et. Speciális űrlapkezelési esetekben szükség lehet dinamikus validációs üzenetre is, amelyhez Symfony kellő eszköztárral lát el minket. •
•
Karakteres beviteli mezőknél: Assert\Length(…), amelynek min és max korlát-megadási lehetőségei is vannak. /** * @Assert\Length( * min = 2, * max = 50, * minMessage =”The name must be at least {{limit}}", * maxMessage =”The name cannot be longer than {{limit}}„ * //exactMessage = ”The name must be {{limit}}” *) */ private $name; Szám beviteli mezőknél: Assert\Range(…), amely hasonló működésű, mint a fent látható példában szemléltett funkció.
JMSTranslation bundle •
A teljes rendszerben használt lefordításra kerülő sztring gyűjteményt exportálja nekünk
•
Elsősorban ellenőrzésre ajánlom és figyeljünk rá, hogyne olyan mappába exportáljon, ahol vannak messages fájlok, mert automatikusan felülírja őket. php app/console translation:extract de --dir=./src/ -output-dir=./app/Resources/translations A használatát –bundle kapcsolóval ajánlom – ez egyszerre csak egy megadott bundle translate-jeit generálja. php app/console translation:extract de -bundle=MyFooBundle Ha le szeretnéd ellenőrizni mit tenne az parancs, de nem szeretnél fájlbeli módosítást végrehajtani, akkor használd a --dry-run kapcsolót. Segítség: php app/console translation:extract --help
•
•
•