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?
No parece de esa manera, que sería el comportamiento anterior de la forma en que funciona i18n, el nuevo comportamiento (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
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
, notrue
. - Si está configurando la configuración
config.i18n.default_locale
u otras configuraciones i18n, asegúrese de hacerlo después de configurar la configuraciónconfig.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 aI18n
utilizandoI18n.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
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ónconfig.i18n.enforce_available_locales
. De lo contrario, la advertencia de desaprobación seguirá apareciendo. (Gracias Fábio Batista ).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
enapplication.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étodoenforce_available_locales!
para incluir la declaraciónputs 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)>''",