I am using ui-router for routing and angular-translate for translations. What i would like to achieve is having the selected language bind to the url like so:
www.mydomain.com/en/
www.mydomain.com/ru/
www.mydomain.com/en/about
www.mydomain.com/ru/about
and it will respond accordingly.
Tried to look for examples, but did not find anything. If someone implemented similar solution, i would love to hear how you did it.
Thanks
I've written a blog post on the exact matter: http://fadeit.dk/post/angular-translate-ui-router-seo
I use something along these lines:
CoffeeScript
JavaScript
With this, you can inject
$stateParams
into your controller and get access to the locale there:CoffeeScript
JavaScript
Or, if you want to affect the whole page automatically, use the
$stateChangeStart
event in an application controller or similar:CoffeeScript
JavaScript
Note that if you're using angular-translate v1.x you should use
$translate.uses
instead of$translate.use
.The solution is valid only if you want to have URLs of the below format:
domain.com/{locale}/about
hence:
domain.com/en/about domain.com/mt/about
Recently we were required to implement translations for the full URL, therefore:
domain.com/{locale}/{about}
where
{about}
is translated in the respective language:domain.com/en/about domain.com/mt/fuqna
I don't know if the below approach is the best one, however it does work.
For starters, the first difference is that we set up ui-router states to be generated dynamically using a service which retrieves the routes from a JSON file. This is done similarly to @ChrisT's answer in: Angular - UI Router - programmatically add states
We would then consume the above
routingService
in therun
block of the application:And finally the
stateService
simply parses the JSON file and creates the routing hierarchy using ChrisT's runtimeStates.addState.I will try to include a working demo in the near future.
Credits also go to @karl-agius.
For people that would like to include the URL using ngRoute (I came here googling for exactly that), I've implemented it as follows.
(1) In my
.htaccess
I caught all URLs without a language subdomain and redirected it to the default (fr in my case). The only real downside is that I have to specify every language manually.(2) In my Angular project's
config
block I then simply parsed the URL to get the current language.(3) In order to get the language in my HTML files I also added it to the
$rootScope
.