Hello, Let's put it simple. The problem is that to_param generates URLS according to the current language. Suppose my current locale is 'nl' and I'm currently viewing an article with this URL : http://cms/nl/articles/86-wandeling-op-maat- On this page I need localized URLS for each language for this page. so if I generate an URLS like this (using the "translate routes" plugin) : url_for(params.merge(:locale=>'de')) url_for(params.merge(:locale=>'en')) I get this result : http://cms/de/articles/86-wandeling-op-maat- http://cms/en/articles/86-wandeling-op-maat- The links will direct my to the right page, but I can't figure out how to translate the to_params part ! The article id is correct but the last part should also be translated like this : http://cms/de/articles/86-wanderung-nach-mass- http://cms/en/articles/86-hiking-tour-to-measure- In the article model, my to_param looks like this: def to_param "#{id}-#{title($activelanguage.code).downcase.gsub(/[^[:alnum:]]/,'-')}".gsub(/-{2,}/,'-') end When the links are generated by url_for, the $activelanguage (=locale) is of course 'nl' (=current language) . Is there a way to make url_for pass it's parameters to to_param ? Any help would be appreciated
on 2010-05-12 10:16
on 2010-05-13 10:13
Hi,
I18n should know the current locale throughout the request, so there
should be no need to use a global variable.
You could do this:
def to_param
"#{id}-#{title(I18n.locale).downcase.gsub(/[^[:alnum:]]/,'-')}".gsub(/-{2,}/,'-')
end
But passing I18n.locale to the title-method seems a bit odd, since it
is available there as well.
Hope this helps,
Iain
http://iain.nl/
on 2010-05-17 11:02
Iain Hecker wrote: > Hi, > > I18n should know the current locale throughout the request, so there > should be no need to use a global variable. > > You could do this: > > def to_param > "#{id}-#{title(I18n.locale).downcase.gsub(/[^[:alnum:]]/,'-')}".gsub(/-{2,}/,'-') > end > > But passing I18n.locale to the title-method seems a bit odd, since it > is available there as well. > > Hope this helps, > > Iain > http://iain.nl/ Hi Lian, the thing about the global variable isn't the issue. I'm just storing the language record in a variable for global use in my CMS. I have e-mail the creator of the translate routes plugin, and he suggests the following: You may need to set your locale before generating each link: def i18n_link_for(resource, locale) current_i18n = I18n.locale I18n.locale = locale link = url_for(...) # now your model should use I18n.locale to set the correct text I18n.locale = current_i18n link end It's an improvised and untested code, but I think you can see the point. I still have to test it
on 2010-05-17 11:42
Hi Maarten, You should set I18n.locale on every request. This is what my application controller usually looks like: before_filter :set_locale def set_locale I18n.locale = params[:locale] end I don't know where your locale comes from. I use the params, but it could also come from the session (although that's not really RESTful). This way every request has it's own locale. Iain
on 2010-05-17 12:00
Iain Hecker wrote: > Hi Maarten, > > You should set I18n.locale on every request. This is what my > application controller usually looks like: > > before_filter :set_locale > def set_locale > I18n.locale = params[:locale] > end > > I don't know where your locale comes from. I use the params, but it > could also come from the session (although that's not really RESTful). > This way every request has it's own locale. > > Iain Lian, of course the locale is set every request ... But it's not solving the problem if you are on page X, and need links to the same page, translated in every language. Then you have to change the locale before generating each link. And then reset the locale back to the current locale. However the suggested solution by Raul (translate routes author) does not work ! It seems like you can't change the locale multiple times per request.
on 2010-05-17 13:58
Let's give some more random advice, hoping that one of these tips is the one you need ;) When I make a link to the same page in another locale I use a hash as url parameter: link_to "English", :locale => :en link_to "Dutch", :locale => :nl As for translating multiple times, you can pass the locale option to the translate method: I18n.t(:foo, :locale => :jp) Also, there is no reason as far as I'm aware of that prohibits setting I18n.locale multiple times during a request Hope the right advice is in here ;) PS. my name is "iain" not "Lian"
on 2010-05-18 10:33
Iain Hecker wrote: > Let's give some more random advice, hoping that one of these tips is > the one you need ;) > > When I make a link to the same page in another locale I use a hash as > url parameter: > > link_to "English", :locale => :en > link_to "Dutch", :locale => :nl > > As for translating multiple times, you can pass the locale option to > the translate method: > > I18n.t(:foo, :locale => :jp) > > Also, there is no reason as far as I'm aware of that prohibits setting > I18n.locale multiple times during a request > > > Hope the right advice is in here ;) > > > PS. my name is "iain" not "Lian" Hi Iain, thanks for the advice but I don't think you understand the problem. Passing the locale param to link_to generates indeed urls to translated pages. But I18n.locale always remains the same in to_param method of the model. So the article titles are not translated in the URL, they remain the same. It works but you end up with multiple urls to the same page, which is bad :)
on 2010-05-24 19:39
Any luck yet in solving this one? I'v got the same problem and have been googling around but haven't found a solution.
on 2010-05-26 11:45
Hi, The solution given by the translate_route plugin author is right. You have to switch the locale for every generated link. But there is still another issue, how do you create your title ? It's from an AR object ? If it is the case, maybe you should reload your Active Record object with the current switched locale, as your current object has been loaded with your primary locale. 2010/5/24 Lp Lp <lists@ruby-forum.com>
on 2010-05-27 18:10
Guillaume Luccisano wrote: > Hi, > > The solution given by the translate_route plugin author is right. You > have > to switch the locale for every generated link. > But there is still another issue, how do you create your title ? It's > from > an AR object ? > If it is the case, maybe you should reload your Active Record object > with > the current switched locale, as your current object has been loaded with > your primary locale. > Hi and thanks for replying! The links are generated based on the id and name fields of the loaded active record objects. I did a test and it seems the links do get generated corrently if I specify the locale in the object's to_param method. If I reload all of the objects in each page three times (the number of translations currently) my site gets a huge performance hit... I was wondering if it would be possible to generate the ids (id+name fields) for each locale in the to_param method and store them into the active record object (as an array for example)? Then this array could be utilized by overriding the link_to method that's used in the fragments?
on 2010-05-31 11:47
Hi, The better thing is to reload your objects, you do not have the choice. But maybe you can just load the name of your record, and not the full object ? After that, use fragment caching for your generated links and this will just be fine and performant. 2010/5/27 Lp Lp <lists@ruby-forum.com>
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.