Translatable Controller URLs
You can easily translate CMS content with translatable or fluent, but what if you have an url that is just grabbed by a controller?
In my case i show the weather forecast from a controller which should serve English translation when called through /weatherforecast and German when called through /wetter. Setting up the routes is easy, and there you can pass additional parameters to the controller:
Director:
rules:
'weatherforecast':
Controller: 'WeatherForecastController'
Locale: en_US
'wetter':
Controller: 'WeatherForecastController'
Locale: de_DE
But how can i access this values in my controller? It's in the routeParams data of the current request which you get via $this->request->routeParams().
For some historical reasons my WeatherForecastController is a subclass of Page_Controller, so it has a SiteTree object with ID -1 attached, which defaults to one locale. So let's check for that in Page_Controller::init() and set the values we need:
public function init()
{
parent::init();
$routeParams = $this->request->routeParams();
$locale = ($this->dataRecord->ID < 1 && array_key_exists('Locale', $routeParams))
? $routeParams['Locale']
: $this->dataRecord->Locale;
i18n::set_locale($locale);
i18n::set_default_locale($locale);
i18n::include_by_locale($locale);
Translatable::set_current_locale($locale); //we use translatable extension...
setlocale(LC_TIME, i18n::get_locale() . ".utf8");
//other stuff
}
With this settings all templates are translated accordingly and we have a param for the current locale somehow "hidden" in the URL.
To see this in action you can visit this two URLS:
Post your comment
Comments
No one has commented on this page yet.
RSS feed for comments on this page | RSS feed for all comments