Az 1.2-es CakePHP sok mindenben megkönnyíti a dolgunkat, köztük a projektünk nemzetközivé tételében is. Ha több nyelven is elérhetővé akarjuk tenni a webalkalmazásunkat akkor a következőket kell tennünk.
Az AppController osztály
Feltételezve, hogy a teljes alkalmazást lokalizálni akarjuk létre kell hoznunk a /app/app_controller.php fájlt ha esetleg korábban még nem tettük volna meg.
<?php uses('L10n'); class AppController extends Controller { var $helpers = array('Html', 'Form', 'Javascript', 'Ajax'); function beforeFilter(){ //lokalizálás $this->L10n = new L10n(); $this->L10n->get('hu'); Configure::write('Config.language', 'hu'); } } ?>
Az első sorban a vezérlő tudtára adjuk, hogy használja az L10n
osztályt. Ezután mivel azt szeretnénk, hogy minden vezérlőbeli függvényben elérhető legyen a szolgáltatást a beforeFilter()
függvényben hajtjuk végre a továbbiakat.
Létrehozunk egy új L10n objektumot, beállítjuk számára a magyar nyelvet, aztán habár enélkül is remekül el lehet lenni a config értékek közé is betesszük a kiválasztott nyelvet.
default.po
Ezek után létre kell hoznunk a /app/locale/hun/LC_MESSAGES
könyvtárat, mivel a CakePHP itt fogja majd keresni a magyar nyelvhez tartozó default.po fájlt.
Ezután mondjuk a Poedittel létrehozhatjuk az új katalógus fájlt. Az általános információknál érdemes a nyelvnél beállítani a magyart, a karakterkészleteknél pedig az utf8-at.
Az elérési útvonalaknál két választásunk van. Vagy megadjuk a projekt gyökérkönyvtárát, vagy korlátozhatjuk magunkat a /app könyvtárra is. Mivel többnyire úgy sem használom a CakePHP alapértelmezett sztringjeit a magam részéről ide általában az /app könyvtár elérési útját állítom be, nem a gyökérét.
A kulcsszavaknál meg kell adnunk a __
függvénynevet, hogy a Poedit tudja miket kell kigyűjtögetnie.
Ezután arról kell gondoskodnunk, hogy a Poedit a .ctp fájlokat is úgy kezelje mint a .php fájlokat. Ehhez a Poedit Fájl / Beállítások / Elemzők menüben ki kell választanunk a PHP-t és eltalálni a Szerkesztés gombot. Itt a kiterjesztéseket át kell írnunk *.php;*.ctp
-re, az Elemző program parancsának a végére pedig be kell pötyögnünk, hogy --language=php
.
Ezután el kell mentenünk a katalógust fájlt a fent létrehozott könyvtárba. Ha a katalógust szinkronizáljuk a forrásokkal akkor már szépen meg is kapunk minden lokalizálható sztringet, lehet fordítani.
Lokalizálásra jelölés
Erre többféle lehetőségünk is van.
Az első és legtisztább a __()
függvény meghívása.
<?php __('Vegamania'); ?>
Ez egyszerűen kiírja a megadott szöveg kiválasztott locale szerinti változatát, vagy ha az még nem létezik akkor kiírja a szöveget.
Ha vezérlőben akarjuk használni, akkor a második elhagyható paraméternek true-t kell adnunk, hogy ne kiírás történjen, hanem csak visszatérési értékként adódjon át a lokalizált szöveg.
$this->pageTitle = __('Vegamania', true) . ' ' . __('Slogan', true);
Ha szeretnénk a szövegben változókat is használni akkor a __()
függvény hívást össze kell drótoznunk a printf()
függvénnyel.
<?php
printf(__('Planned start: %s', true), $starDate);
?>
Végül pedig a helperekben is használhatjuk a lokalizált szövegeket.
print $html->link(__('Send a receipt', true), array( 'controller'=> 'recipesuggestions', 'action'=>'new'));
Szia!
Drupalból tudom, hogy a .po fájlokban lehet többesszámot is használni, erre tudnál mutatni pár példát? Azt látom, hogy __n() függvényt kell használnom, de nem tiszta, hogy hogyan.
És az adatbázisból valló többnyelvű adatok kinyerésére van valami jó módszered?
Próbálkoztam a CakePHP beépített módszerével: http://book.cakephp.org/2.0/en/core-libraries/behaviors/translate.html
csak ez még nagyon félkész állapotban van. Egy táblával teljesen jól működik, viszont ha már legalább két táblát akarok összekapcsolni, akkor a második tábla tartalmához nem keresi meg a fordítást.
Illetve egy táblánál is ha van mondjuk hat nyelvem és én lekérdezem pl egy cikk francia címét és tartalmát, akkor ugyan visszaadja nekem azt teljesen jól franciául, viszont a háttérben szépen lekérdezi az összes többi nyelven is, ami totál felesleges és erőforrás pazarlás…
Bármelyikre tudsz jó módszert? Google-el nem találok semmi használhatót. Elsősorban az összekapcsolt táblák ([inner] join) tartalmának fordítására keresek kis erőforrás igényű megoldást, de érdekelne megoldás a ‘ne kérdezzen le minden nyelvet, ha nekem csak egyre van szükségem’ problémára is…
Hát ez több mindentől függ. Talán egy unbind segít neked.