CakePHP projekt lokalizálás

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.

Poedit ctp as 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'));

3 thoughts on “CakePHP projekt lokalizálás

  1. 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.

  2. É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…

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.