Hello Readers ,
Today we will learn about the concept of " InterNationalization in CakePHP " .
"InterNationalization" simply means if you are making an application and you wants to make that applications to reach a larger audience to cater for multiple languages.
To do this below are the steps-
Create a new CakePHP project:
Download the latest version from http://cakephp.org/.
Now to initialise the default and other languages just create a file global.php file in /app/Config/ , you may give your own name instead of global.php.
Put these lines of code in global.php.
<?php
$config['defaultLanguage'] = 'eng'; // Default Language
$config['availableLanguages'] = array('eng' => 'English', 'spa' => 'Spanish', 'ron' => 'Romanian', 'rus' => 'Russian', 'fra' => 'French'); // Available Languages
?>
Now load our global.php config file. In /app/Config/core.php add the following line at the end:
Configure::load('global');
Now creates an AppController which will support InterNationalization.
Open /app/Controllers/AppController and place the following lines of codes.
<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
public $components = array('Session');
public $helpers = array('Html', 'Form', 'Text');
var $language, $availableLanguages;
public function beforeFilter() {
parent::beforeFilter();
if($this->Session->check('Config.language')) { // Check for existing language session
$this->language = $this->Session->read('Config.language'); // Read existing language
} else {
$this->language = Configure::read('defaultLanguage'); // No language session => get default language from Config file
}
$this->setLang($this->language); // call protected method setLang with the lang shortcode
$this->set('language',$this->language); // send $this->language value to the view
$this->availableLanguages = Configure::read('availableLanguages'); // get available languages from Config file
$this->set('availableLanguages', $this->availableLanguages); // send $this->availableLanguages value to the view
}
protected function setLang($lang) { // protected method used to set the language
$this->Session->write('Config.language', $lang); // write our language to session
Configure::write('Config.language', $lang); // tell CakePHP that we're using this language
}
}
?>
Now creates the PagesController for localization.
Open /app/Controller/PagesController and remove public function display() {}. Instead of that create a home() method for our base path and a changeLanguage() method.
<?php
App::uses('AppController', 'Controller');
class PagesController extends AppController {
public $uses = array(); // No model
public function home() { // Base path method
}
public function changeLanguage($lng) { // Change language method
if(isset($this->availableLanguages[$lng])) { // If we support this language (see /app/Config/global.php)
parent::setLang($lng); // call setLang() from AppController
$this->Session->setFlash(__('The language has been changed to %s', $this->availableLanguages[$lng])); // Send a success flash message
} else {
throw new NotFoundException(__('Language %s is not supported', $lng)); // Throw a not found exception
}
$this->redirect($this->referer()); // redirect the user to the last page (referer)
}
}
?>
Now we will create the View for our controller.
Create (or change the content from) /app/Views/Pages/home.ctp file. Our objective is to echo a test message in all the available languages, to list all the available languages and to put in evidence the current language.
Put the below lines codes.
<!-- Change Language H1 -->
<?php echo $this->Html->Tag('h1', __('Change language:')); ?>
<!-- Change Language list -->
<ul>
<?php foreach($availableLanguages as $key=>$value) {
$link = $this->Html->Link($value, array('controller' => 'pages', 'action' => 'changeLanguage', $key));
echo $this->Html->Tag('li', $link, array('class' => $key == $language ? 'selected' : ''));
} ?>
</ul>
<p> </p>
<!-- Change Language test -->
<?php echo $this->Html->Tag('h2', __('Hello!')); ?>
<!-- Put in evidence the selected language -->
<style>
ul li a {text-decoration: none;}
ul li.selected a {text-decoration: underline;}
</style>
Now delete all the tmp files from /app/tmp/cache/persistent/. and test your application.
You will see some links occur of different languages which will defines the concept of InterNationalization in CakePHP.
Good Luck!
0 Comment(s)