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::Application
cuerpo
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_locale
configuración u otras configuraciones de i18n, asegúrese de hacerlo después de establecer la config.i18n.enforce_available_locales
configuración.
- Si utiliza gemas de terceros que incluyen características I18n, establecer la variable a través del
config
objeto Aplicación puede no tener efecto. En este caso, configúrelo directamente para I18n
usar 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_locales
es cierto, generaremos una excepción I18n :: InvalidLocale si la configuración regional no está disponible.
El valor predeterminado se establece en nil
que 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/locales
carpeta), de lo contrario, la configuración predeterminada de la config.i18n.default_locale
configuració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
Si va a configurar la config.i18n.default_locale
configuració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_locales
ajuste. De lo contrario, la advertencia de desaprobación seguirá apareciendo. (Gracias Fábio Batista ).
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.i18n
de la application.rb
fina 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.rb
archivo 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)>'",
Rails 4.0.1
aplicaciones.