Pregunta

Voy a añadir I18N para mi aplicación rails por el paso de la configuración regional con url params.Mi url de aspecto http://example.com/en/users y http://example.com/ar/users (para el inglés y el árabe locales, respectivamente).

En mi archivo de rutas, he definido mis rutas con un :path_prefix opción:

map.resources :users, :path_prefix => '/:locale'

Y la configuración regional se establece mediante un before_filter definido en el controlador de aplicación

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

Yo también define ApplicationController#default_url_options, para agregar la configuración regional a todas las url generadas por la aplicación:

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

Lo que quiero es agregar un enlace en la cabecera del layout (que se muestra en todas las páginas) que enlace a la misma página pero con la configuración regional.

Por ejemplo, si estoy navegando en árabe regional, quiero un "inglés" que aparece en el encabezado, que volverá a dirigir me regreso a mi página actual, y establecer la configuración regional de inglés.Hay una manera de hacerlo en rails?

¿Fue útil?

Solución

Me tomó un tiempo para encontrar esto, pero aquí está mi solución:

link_to 'English', url_for( :locale => 'en' )
link_to 'Deutch', url_for( :locale => 'de' ) 

A partir de los documentos aquí: http://api.rubyonrails.org/classes /ActionController/Base.html#M000649

  

Cuando se genera una nueva dirección URL, falta   valores pueden ser rellenados de la   parámetros de solicitud actual. por   ejemplo, url_for: action =>   ‘Some_action’ conservará el actual   controlador, como se esperaba. Este comportamiento   se extiende a otros parámetros, incluyendo   : Controlador,: id, y cualquier otro   parámetros que se colocan en una   el camino de la ruta.

Así que usando url_for pondrá por defecto a los parámetros de la petición actual, sólo cambia el uno que quiere en su código. En este caso, lo único que cambió fue: local, por lo que todo lo demás permanece igual.

Tenga en cuenta que esto también funciona para "ocultos": parámetros. Así que si usted tiene:

map.my_map ':locale/my_map', :controller => 'home', :action => 'my_map'

utilizando el anterior url_for en la página / es / my_map no tendrá 'hogar' en la URL (es decir, / es / home / my_map). Bonificación.

Otros consejos

Así que encontró una manera más explícita hacer esto con fuera depender de (como mucho) carriles de magia.

url_for(params.merge({:your_new_parameter => value}))

Esto debería funcionar en cualquier link_to.

Todo su haciendo es tomar los parámetros de la petición actual y la fusión de su nueva almohadilla deseada en ellos y luego la creación de un nuevo URL para eso.

Enlace a la página actual con diferentes lugares

Probado en los carriles 4

Hola a todos. Después de algún tiempo de la investigación decido a escribir mi propia solución para esto.

link_to 'English', url_for( :locale => 'en' )
link_to 'Deutch', url_for( :locale => 'de' ) 

Esto funciona perfecto, pero permite XSS vulnerabilidad acaba de pasar parámetros en la URL, como a continuación:

http://localhost:3000/en/about?host=www.fishingsiteorbadurl.com/%23&port=80

O peor de los casos:

http://localhost:3000/en/about?host=%D0%BE%D1%87%D0%B5%D0%BD%D1%8C%D0%BF%D0%BB%D0%BE%D1%85%D0%BE%D0%B9%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84

Checa lo URL obtendrá después de pasar a través de este enlace en su aplicación.

Mi solución de producción. Método redirecciones "cambio de idioma" a cualquier página con la configuración regional apropiada simplemente usando HTTP_REFERER en la solicitud objeto. Por favor nota: método para obtener URI.path único camino, no toda url

  

Hacer método "cambio de idioma" en cualquier controlador:

        def change_lang

        if request.referer.nil?
                 refer = root_url
        else
                 uri = URI(request.referer)
                 refer = uri.path
        end
        lang = params[:lang]
        cookies[:locale] = lang
        redirect_to refer

        end
  

application_controller.rb

before_action :set_locale

def set_locale

# -- Get lang from cookies or url parameter locale

user_locale = cookies[:locale] || params[:locale]

# -- If present

if user_locale.present? 

    # -- If it is has 2 symbols

    user_locale = user_locale.scan(/[a-zA-Z]{2}/) 
else

    # -- If no - use default en locale

    user_locale = 'en'
end


# -- Check, is this locale available for using.
# Please note: this needed for disable invalid locale warning.

if I18n.available_locales.include?(user_locale[0].to_sym)

    I18n.locale =  user_locale[0]
else
    I18n.locale =   "en"
end

end
  

añadir esto a su diseño

<%= link_to 'English', change_lang_path('en') %> <%= link_to 'Russian', change_lang_path('ru') %>
  

config / routes.rb

scope "(:locale)", locale: /[a-zA-Z]{2}/ do
get "change_lang/:lang" => "users#change_lang", :as => "change_lang"
end

No hay necesidad de utilizar params.merge o cualquier solución de mono-parche.

Espero que esta ayuda, porque yo personalmente pasé un montón de tiempo para resolverlo.

Usted puede analizar request_uri, y cambie la configuración regional en el camino con la expresión regular

Ok, aquí es ayudante de ejemplo.Si puedo entender correctamente el objetivo

def locale_url(url, locale)
  url.gsub(/\/\w*$/, "/#{locale}")
end

url = "http://www.domain.com/products/1/ru" # or request.request_uri
locale = "en"
locale_url(url, locale) #=> "http://www.domain.com/products/1/en"

Este es un punto de inicio, por lo que usted puede hacer algunas cosas diferentes que usted necesita

Tener un vistazo a esto, aunque puede que no sea seco y una adecuada, pero funciona perfectamente para mí. Se lee todos los parámetros que proporcionó sustituir únicamente la configuración regional EX direcciones URL: http://example.com:3000/us/users?t= 123 y m = 343 etc

  def us_link           
        link_to "US", form_locale_url("/us")            
  end

  def jp_link           
    link_to "Japan",form_locale_url("/jp")           
  end              

  def form_locale_url(locale)            
    new_url = request.request_uri          
    new_locale_url = new_us_url = new_jp_url = new_url           
    if new_url == "/"          
      new_locale_url.sub!(/\//,locale)           
    elsif (new_url =~/\/us/) == 0        
      new_us_url.sub!(/\/us/,locale)        
    elsif (new_url =~/\/jp/) == 0          
      new_jp_url.sub!(/\/jp/,locale)       
    end     
  end

Una gran avenida más rápido - y conveniente si tiene muchos parámetros que el cambio en diferentes lugares ... evita el desorden con una etiqueta de anclaje que simplemente se funde el nuevo parámetro local a los ya existentes (y, de hecho matar el viejo parámetro locale) .

<%= link_to "ру", request.params.merge( locale: 'ru' ) %>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top