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