2010-06-23 35 views
3

J'ai un site Web multilingue et je mets la langue dans l'URL comme domain.com/en/. Lorsque l'utilisateur ne met pas la langue dans l'URL, je veux le rediriger vers la page dans la langue principale comme "domain.com/posts" à "domain.com/en/posts". Existe-t-il un moyen facile de faire cela avec Sinatra?Comment détecter la langue de l'URL dans Sinatra

J'ai plus de cent routes. Donc faire cela pour chaque route n'est pas une très bonne option.

get "/: locale/messages" do ... end

get "/ messages" faire ... fin

quelqu'un peut me aider?

Merci

Répondre

9

Utilisez un avant filtre, un peu comme ceci:

set :locales, %w[en sv de] 
set :default_locale, 'en' 
set :locale_pattern, /^\/?(#{Regexp.union(settings.locals)})(\/.+)$/ 

helpers do 
    def locale 
    @locale || settings.default_locale 
    end 
end 

before do 
    @locale, request.path_info = $1, $2 if request.path_info =~ settings.locale_pattern 
end 

get '/example' do 
    case locale 
    when 'en' then 'Hello my friend!' 
    when 'de' then 'Hallo mein Freund!' 
    when 'sv' then 'Hallå min vän!' 
    else '???' 
    end 
end 

Avec la prochaine version de Sinatra, vous serez en mesure de le faire:

before('/:locale/*') { @locale = params[:locale] } 
+0

le remercie travaillé parfaitement – basex

+0

@Konstantin: est-il un moyen de le faire fonctionner pour les URL de racine? (ex:/et/en /) –

+0

peut-être avec "get" /?: locale?/'do "? mais de cette façon, il donne toujours la localisation par défaut, et je dois le pirater un peu pour se comporter comme les autres routes. Y a-t-il de bonnes pratiques à ce sujet? –