rails multi locales language i18n ruby-on-rails ruby ruby-on-rails-4 deprecated rails-i18n

ruby-on-rails - multi - rails time format i18n



Advertencia de abandono de validación de Rails I18n (4)

Acabo de actualizar a Rails 4.0.2 y recibo esta advertencia:

[obsoleto] I18n.enforce_available_locales se establecerá de forma predeterminada en true en el futuro. Si realmente desea omitir la validación de su configuración regional, puede establecer I18n.enforce_available_locales = false para evitar este mensaje.

¿Hay algún problema de seguridad al establecerlo en falso?



Solo para completar, tenga en cuenta que también puede deshacerse de la advertencia configurando I18n.enforce_available_locales en true (o false ) en config/application.rb :

require File.expand_path(''../boot'', __FILE__) . . . module SampleApp class Application < Rails::Application . . . I18n.enforce_available_locales = true . . . end end


I18n.config.enforce_available_locales = true funcionó para mí en Rails 3.2.16 (lo puse en config / application.rb)


Importante : asegúrese de que su aplicación no esté utilizando I18n 0.6.8, tiene un error que impide que la configuración se establezca correctamente .

Respuesta corta

Para silenciar la advertencia, edite el archivo application.rb e incluya la siguiente línea dentro del cuerpo de Rails::Application

config.i18n.enforce_available_locales = true

Los valores posibles son:

  • falso : si tu
    • quiere omitir la validación de la configuración regional
    • no importa los lugares
  • cierto : si tu
    • desea que la aplicación genere un error si se pasa una configuración regional no válida (o)
    • desea por defecto a los nuevos comportamientos de Rails (o)
    • preocuparse por la validación de locale

Nota:

  • El comportamiento predeterminado anterior corresponde a false , no true .
  • Si está configurando la configuración config.i18n.default_locale u otras configuraciones i18n, asegúrese de hacerlo después de configurar la configuración config.i18n.enforce_available_locales .
  • Si utiliza gemas de terceros que incluyen características de I18n, configurar la variable a través del objeto de config la aplicación puede no tener efecto. En este caso, I18n directamente a I18n utilizando I18n.config.enforce_available_locales .

    Advertencias

Ejemplo

require File.expand_path(''../boot'', __FILE__) # ... module YouApplication class Application < Rails::Application # ... config.i18n.enforce_available_locales = true # or if one of your gem compete for pre-loading, use I18n.config.enforce_available_locales = true # ... end end

Respuesta larga

La advertencia de desaprobación ahora se muestra tanto en Rails 4 (> = 4.0.2) como en Rails 3.2 (> = 3.2.14). La razón se explica en este compromiso .

Hacer cumplir los locales disponibles

Cuando I18n.config.enforce_available_locales sea ​​verdadero, generaremos una excepción I18n :: InvalidLocale si la configuración regional pasada no está disponible.

El valor predeterminado está establecido en nil que mostrará un error de desaprobación.

Si se establece en false , omitiremos el cumplimiento de las configuraciones regionales disponibles en conjunto (comportamiento anterior).

Esto se ha implementado en los siguientes métodos:

  • I18n.config.default_locale =
  • I18n.config.locale =
  • I18n.translate
  • I18n.localize
  • Transliterado

Antes de este cambio, si pasaba una configuración regional no compatible, Rails cambiaría silenciosamente a ella si la configuración regional es válida (es decir, si hay un archivo de configuración regional correspondiente en la carpeta /config/locales ), de lo contrario, la configuración regional se establecería como predeterminada en config.i18n.default_locale Configuración de config.i18n.default_locale (que por defecto es: en).

La nueva versión de la gema I18n, obliga a los desarrolladores a ser un poco más conscientes de la administración de la configuración regional.

En el futuro, el comportamiento cambiará y si la configuración regional no es válida, la aplicación Rails generará un error.

En la preparación de dicho cambio (que potencialmente podría romper varias aplicaciones que hasta el día de hoy se basaban en valores predeterminados silenciosos), la advertencia lo obliga a declarar explícitamente qué validación desea realizar durante el período de transición actual.

Para restaurar el comportamiento anterior, simplemente configure la siguiente configuración en false

config.i18n.enforce_available_locales = false

de lo contrario, configúrelo en verdadero para que coincida con los nuevos valores predeterminados de Rails o si desea ser más rígido en la validación del dominio y evitar cambiar a los valores predeterminados en caso de una configuración regional no válida.

config.i18n.enforce_available_locales = true

Advertencia

  1. Si está configurando la configuración config.i18n.default_locale o está utilizando alguno de los métodos mencionados anteriormente ( default_locale= , locale= , translate , etc.), asegúrese de hacerlo después de establecer la configuración config.i18n.enforce_available_locales . De lo contrario, la advertencia de desaprobación seguirá apareciendo. (Gracias Fábio Batista ).

  2. Si usa gemas de terceros que incluyen características de I18n, establecer la variable a través puede no tener efecto. De hecho, el problema es el mismo que se describió en el punto anterior, un poco más difícil de depurar.

    Este tema es una cuestión de precedencia. Cuando configura la configuración en su aplicación Rails, el valor no se asigna inmediatamente a la gema I18n. Rails almacena cada configuración en un objeto interno, carga las dependencias (Railties y gemas de terceros) y luego pasa la configuración a las clases de destino. Si utiliza una gema (o el complemento Rails) que llama a cualquiera de los métodos I18n antes de que se asigne la configuración a I18n, recibirá la advertencia.

    En este caso, debe omitir la pila de Rails y establecer la configuración inmediatamente en la gema I18n llamando

    I18n.config.enforce_available_locales = true

    en lugar de

    config.i18n.enforce_available_locales = true

    El problema es fácil de probar. Intente generar una nueva aplicación de Rails vacía y verá que la configuración config.i18n en application.rb funciona bien.

    Si en su aplicación no lo hace, hay una forma fácil de depurar al culpable. ¡Localice la gema i18n en su sistema, abra el archivo i18n.rb y edite el método enforce_available_locales! para incluir la declaración puts caller.inspect .

    Esto hará que el método imprima el seguimiento de pila cuando se invoque. Podrás determinar qué gema la está llamando inspeccionando el seguimiento de pila (en mi caso fue Authlogic).

    ["/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/i18n-0.6.9/lib/i18n.rb:150:in `translate''", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/i18n/translator.rb:8:in `translate''", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/i18n.rb:79:in `translate''", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:68:in `validates_format_of_email_field_options''", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:in `block in included''", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `class_eval''", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `included''", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `include''", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `block in acts_as_authentic''", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `each''", "/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `acts_as_authentic''", "/Users/weppos/Projects/application/app/models/user.rb:8:in `<class:User>''", "/Users/weppos/Projects/application/app/models/user.rb:1:in `<top (required)>''",