CodeIgniter has a beautiful and simple Localization framework with each language in it’s folder and using aliases in views to get the localized version of a specific text. I will not go into details about this as I’m assuming you already have been using it for a while. For more details on it, please visit the Official Documentation
I did mention in a different post that I prefer working with Twig in conjunction with CI and, since the current Twig does not know where to pick-up my localized text from, I will show you how to create a quick and dirty fix.
Adding the Twig Function
Assuming that you’ve already implemented Twig in your BaseController as described in a previous post (Twig Integration with Codeigniter) the quick method for adding a TwigFunction is within the same initController function where you’ve declared you Twig instance:
public function initController(RequestInterface $request , ResponseInterface $response , LoggerInterface $logger ) { ........... $loader = new \Twig\Loader\FilesystemLoader( $appViewPaths ); $this ->twig = new \Twig\Environment( $loader , [ 'cache' => WRITEPATH. '/cache/twig' , 'auto_reload' => true ]); $this ->twig->addFunction( new \Twig\TwigFunction( 'lang' , function ( $var , $args =[]){ $localizedString = lang( $var , $args , $this ->language); return vsprintf( $localizedString , $args ); })); ............. } |
Note that $this->language is the locale. You should take care of it before using the function. The good news is that the above function allows you to also pass an array of variables (arguments) to the lang function in order to pre-fill a text.
using the lang function
Let’s say you have a language file in App/Language/en (for English locale) called Home.php
<?php return [ 'title' => 'Hello %s, nice to see you again!' , // <-this takes one variable passed as argument to the twig lang function 'subtitle' => 'Welcome to %s, the capital of %s' // <-this takes two variables passed as arguments to the twig lang function 'text' => 'Enjoy your stay' , ]; |
In your HTML all you now need to do is:
< html > < h1 >{{ lang('Home.title',['Stefan']) }}</ h1 > < h3 >{{ lang('Home.subtitle',['Bucharest','Romania'] }}</ h3 > < p >{{ lang('Home.text') }}</ p > </ html > |
and you will get the expected result:
Hello Stefan, nice to see you again!
Welcome to Bucharest, the capital of Romania
Enjoy your stay
Simple and effective!
More functions to come!
Leave a Reply