2011-03-10 6 views
14

Si sigue el I18N Rails Guide, todos los enlaces generados contienen el parámetro locale (localhost/en/about, localhost/fr/about). Esto se debe a que utilizamos el método default_url_options añadir siempre el parámetro de configuración regional:¿Cómo evitar agregar la configuración regional predeterminada en las URL generadas?

def default_url_options(options={}) 
    { :locale => I18n.locale } 
end 

¿Es posible eliminar el parámetro de configuración regional de la URL generada cuando la configuración regional es desconocido o un defecto?

Lo que necesito:

  • Locale desconocida: mysite/about
  • Locale es: mysite/about (y no localhost/en/about)
  • configuración regional fr: mysite/fr/about

traté de establecer sólo el locale si no era el predeterminado, pero el resultado es que los enlaces generados nunca contienen el parámetro de configuración regional ...

He intentado muchas cosas como ésta

def default_url_options(options={}) 
    if I18n.locale == :fr 
    { :locale => I18n.locale } 
    else 
    { :locale => nil } 
    end 
end 

código entero:

ApplicationController.rb:

before_filter :set_locale 
def set_locale 
    I18n.locale = params[:locale] 
end 

def default_url_options(options={}) 
    { :locale => I18n.locale } 
end 

routes.rb

scope "(:locale)", :locale => /en|fr/ do 
    match 'about' => 'static_pages#about', :via => :get 
    match 'contact' => 'static_pages#contact', :via => :get 
    match '/' => 'search#index', :as => :search 
end 

root :to => 'search#index' 
+0

Si no desea pasar a través de URL, se debe considerar almacenarla en sesión o cookie. – apneadiving

+0

No quiero pasarlo en la url cuando la configuración regional actual es la predeterminada. Cuando esto no es lo predeterminado, está bien tenerlo en la url. – Tom

Respuesta

7

Ok, entiendo mucho mejor. De hecho, casi lo haces.

Sólo se necesita un operador muy útil en Ruby: ||

Si existe el primer valor, se utiliza, de lo contrario el segundo argumento es tomada en cuenta.

def set_locale 
    I18n.locale = params[:locale] || :en 
end 
+0

¡Funciona! Pensé que establecer nulo o lo que sea para I18n.locale sería ignorado si la configuración regional no era compatible, o nil simplemente se restablecería a la configuración regional predeterminada. Aparentemente este no es el caso. Muchas gracias por tu respuesta ! – Tom

-2

Yo sé que no es exactamente su pregunta, pero ...

prefiero la otra manera para internationalisations: Configuración de la localidad del nombre de dominio

Ejemplo: mysite.com/about, mysite.fr/about

Para mí es la mejor manera, pero debe comprar todas las d dominios.

+4

Sí, queremos evitar comprar todos los nombres de dominio. – Tom

+2

No confunda idiomas y configuraciones regionales con países. – molf

21

La respuesta seleccionada es totalmente a la derecha en y proporciona todo lo necesario para redirigir URL sin un local a su configuración regional predeterminada, pero quería hacer algo un poco más y pensé que me gustaría compartir con ustedes.

quería evitar tener que utilizar la configuración regional predeterminada en absoluto, es decir

  • mysite.com/en/page debe ser el mismo que
  • mysite.com/page

y todos los enlaces cuando se ve desde el la configuración regional predeterminada NO debe incluir la configuración regional, lo que significa que mysite.com debe tener enlaces que no incluyan la configuración regional predeterminada (en). En lugar de mysite.com ligarse a

  • mysite.com/en/page se debe vincular a
  • mysite.com/page

he logrado esto a través de las siguientes modificaciones a default_url_options:

def default_url_options(options={}) 
    { :locale => ((I18n.locale == I18n.default_locale) ? nil : I18n.locale) } 
end 

Debe definir config.i18n.default_locale en config/application.rb para que esto funcione También puede asignar restauraciones para configuraciones regionales no compatibles a través de config.i18n.fallbacks = [ :en ], donde esa matriz es una lista ordenada por prioridad de idiomas a los que recurrir.

+0

¿No crees que tendrás contenido duplicado desde el punto de vista de Google (el mismo contenido existe en dos ubicaciones diferentes)? – Tom

1

Carriles 4 + https://github.com/svenfuchs/routing-filter

def set_locale 
    I18n.locale = params[:locale] || I18n.default_locale 
end 

def default_url_options(options = {}) 
    (I18n.locale.to_sym.eql?(I18n.default_locale.to_sym) ? {} : {locale: I18n.locale}).merge options 
end 
Cuestiones relacionadas