Advertencia de depreciación de validación Rails I18n

Acabo de actualizar a rails 4.0.2 y recibo esta advertencia:

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

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

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


Respuesta corta

Para silenciar la advertencia, edite el archivo application.rb e incluya la siguiente línea dentro del cuerpo 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 me importan los locales
  • cierto : si
    • desea que la aplicación genere un error si se pasa una ubicación no válida (o)
    • querer establecer de manera predeterminada los nuevos comportamientos de Rails (o)
    • preocuparse por la validación del lugar

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 establecer la configuración config.i18n.enforce_available_locales .
  • Si utiliza gems de terceros que incluyen funciones I18n, establecer la variable a través del objeto de config la aplicación puede no tener efecto. En este caso, I18n directamente en I18n usando 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 desactivación se muestra ahora en Rails 4 (> = 4.0.2) y Rails 3.2 (> = 3.2.14). La razón se explica en este compromiso .

Aplicar las configuraciones regionales disponibles

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

El valor predeterminado se establece en nil que mostrará un error de desactivación.

Si se establece en false , omitiremos la aplicación de las configuraciones regionales disponibles (comportamiento anterior).

Esto se ha implementado en los siguientes métodos:

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

Antes de este cambio, si pasó una configuración regional no compatible, Rails cambiaría de manera silenciosa 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 sería predeterminada config.i18n.default_locale configuration (que por defecto es: en).

La nueva versión de la joya 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 una configuración regional no es válida, la aplicación Rails generará un error.

En la preparación de dicho cambio (que potencialmente puede romper varias aplicaciones que hasta el día de hoy se basaban en los valores predeterminados silenciosos), la advertencia le 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 como false

 config.i18n.enforce_available_locales = false 

de lo contrario, establézcalo 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 evite cambiar al valor predeterminado en caso de que la configuración regional no sea válida.

 config.i18n.enforce_available_locales = true 

Advertencia

  1. Si está configurando la configuración config.i18n.default_locale o utilizando cualquiera 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 desactivación seguirá apareciendo. (Gracias Fábio Batista ).

  2. Si usa gems de terceros que incluyan características I18n, puede que la configuración de la variable no tenga efecto. De hecho, el problema es el mismo que el descrito en el punto anterior, un poco más difícil de depurar.

    Este problema es una cuestión de precedencia. Cuando configuras la configuración en tu aplicación Rails, el valor no se asigna inmediatamente a la joya I18n. Rails almacena cada configuración en un objeto interno, carga las dependencias (Railties y gems de terceros) y luego pasa la configuración a las clases de destino. Si usa una gem (o plugin Rails) que llama a cualquiera de los métodos I18n antes de que la configuración se asigne a I18n, recibirá la advertencia.

    En este caso, debe omitir la stack de Rails y establecer la configuración inmediatamente a la joya I18n llamando

     I18n.config.enforce_available_locales = true 

    en lugar de

     config.i18n.enforce_available_locales = true 

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

    Si en su aplicación no es así, hay una manera fácil de eliminar errores del culpable. Ubique la gem i18n en su sistema, abra el archivo i18n.rb y edite el método enforce_available_locales! para incluir la statement puts caller.inspect .

    Esto hará que el método imprima el stacktrace siempre que se invoque. Podrás determinar qué gem lo está llamando al inspeccionar la stack (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 `'", "/Users/weppos/Projects/application/app/models/user.rb:1:in `'", 

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)

No parece de esa manera, ese sería el comportamiento anterior de la forma en que i18n funciona, un comportamiento nuevo (verdadero) generará un error cuando solicite una configuración regional no implementada / disponible.

Consulte la confirmación que agregó esta advertencia: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c