Advertencia de desuso de validación de Rails I18n

387

Acabo de actualizar a rails 4.0.2 y recibo esta advertencia:

[en desuso] I18n.enforce_available_locales tendrá el valor predeterminado verdadero 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 establecerlo en falso?

Mauricio Moraes
fuente
Aparentemente, esto también sucede con las Rails 4.0.1aplicaciones.
lucke84
2
Tengo lo mismo en Rails 3.2.16. De acuerdo con la respuesta de Simone Carletti a continuación, está en Rails 4 (> = 4.0.2) y Rails 3.2 (> = 3.2.14).
Mark Berry

Respuestas:

615

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 Rails::Applicationcuerpo

config.i18n.enforce_available_locales = true

Los valores posibles son:

  • falso : si tu
    • desea omitir la validación local
    • no me importan los locales
  • cierto : si tu
    • desea que la aplicación genere un error si se pasa una configuración regional no válida (o)
    • desea predeterminar los nuevos comportamientos de Rails (o)
    • preocuparse por la validación local

Nota:

  • El antiguo comportamiento predeterminado corresponde a false, no true.
  • Si está configurando la config.i18n.default_localeconfiguración u otras configuraciones de i18n, asegúrese de hacerlo después de establecer la config.i18n.enforce_available_localesconfiguración.
  • Si utiliza gemas de terceros que incluyen características I18n, establecer la variable a través del configobjeto Aplicación puede no tener efecto. En este caso, configúrelo directamente para I18nusar 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 commit .

Hacer cumplir las configuraciones regionales disponibles

Cuando I18n.config.enforce_available_localeses cierto, generaremos una excepción I18n :: InvalidLocale si la configuración regional no está disponible.

El valor predeterminado se establece en nilque mostrará un error de desuso.

Si se establece en false, omitiremos la aplicación de las configuraciones regionales disponibles por completo (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 pasaba una configuración regional no admitida, 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 /config/localescarpeta), de lo contrario, la configuración predeterminada de la config.i18n.default_localeconfiguración regional sería predeterminada : en )

La nueva versión de la gema I18n obliga a los desarrolladores a ser un poco más conscientes de la gestión local.

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

En preparación de dicho cambio (que podría romper varias aplicaciones que hasta hoy dependían de 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 en false

config.i18n.enforce_available_locales = false

de lo contrario, configúrelo como 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 predeterminado en caso de configuración regional no válida.

config.i18n.enforce_available_locales = true

Consideración

  1. Si va a configurar la config.i18n.default_localeconfiguración o utilizando cualquiera de los métodos mencionados anteriormente ( default_locale=, locale=, translate, etc.), asegúrese de hacerlo después de establecer el config.i18n.enforce_available_localesajuste. De lo contrario, la advertencia de desaprobación seguirá apareciendo. (Gracias Fábio Batista ).

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

    Este problema 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 objetivo. Si usa una gema (o complemento 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 pila de Rails y establecer la configuración inmediatamente en la gema I18n llamando

    I18n.config.enforce_available_locales = true

    en vez de

    config.i18n.enforce_available_locales = true

    El problema es fácil de probar. Tratar de generar una nueva aplicación Rails vacías y verá que la configuración config.i18nde la application.rbfina obras.

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

    Esto hará que el método imprima el stacktrace siempre que se invoque. Podrá determinar qué gema lo llama inspeccionando el stacktrace (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)>'",
Simone Carletti
fuente
20
Si está configurando la config.i18n.default_localeconfiguración, asegúrese de hacerlo después de configurar la nueva config.i18n.enforce_available_localesconfiguración. De lo contrario, la advertencia de desaprobación seguirá apareciendo.
Fábio Batista
3
Para mí, funciona solo si lo configuro I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = trueno funciona
Pioz
1
@Pioz Puede ser causado por las gemas de las que depende su aplicación. Actualicé la publicación para explicar por qué.
Simone Carletti
La llamada directa a @SimoneCarletti I18n.config.enforce_available_localesno debería ser así I18n.config.i18n.enforce_available_locales, he editado su respuesta. Gracias por la solución.
Fabio
1
Cabe mencionar que uno tiene que configurar, I18n.config.available_locales = [:your_locale, :en]por ejemplo, de lo contrario no podrá iniciar su servidor rails.
Tamer Shlash
45

Simplemente para la corrección, nota que también puede deshacerse de la advertencia estableciendo I18n.enforce_available_localesa 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
mhartl
fuente
99
¿No sería más ordenado hacerlo config.i18n.enforce_available_locales = true?
Mischa
2
Estoy en 3.2.16, configuré en I18n.enforce_available_locales = false, pero todavía tengo el mensaje ...
CLod
3
@Mischa que no funcionó para mí, la respuesta anterior sí.
Mike Atlas
1
Lamentablemente, @Mischa no tuvo que pasar por I18n.configesto para que tuviera efecto
dolzenko
3
config.i18n.enforce_available_locales = trueen config / application.rb eliminó la advertencia de desaprobación en Rails 4.0.2, pero solo si la pongo por encima de las otras config.i18nlíneas.
balexand
15

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

SpeedyWizard
fuente
0

Si desea preocuparse por las configuraciones regionales, escriba en el appilcation.rbarchivo.

config.i18n.enforce_available_locales = true

Puede escribir falso si la validación de la configuración regional no le importa.

Foram Thakral
fuente