Importante : verifique se o aplicativo não está usando o I18n 0.6.8, ele possui um bug que impede a configuração correta da configuração .
Resposta curta
Para silenciar o aviso, edite o arquivo application.rb e inclua a seguinte linha dentro do Rails::Application
corpo
config.i18n.enforce_available_locales = true
Os valores possíveis são:
- falso : se você
- deseja pular a validação de localidade
- não me importo com localidades
- verdadeiro : se você
- deseja que o aplicativo gere um erro se um código de idioma inválido for passado (ou)
- deseja padronizar os novos comportamentos do Rails (ou)
- se preocupam com a validação de localidade
Nota:
- O antigo comportamento padrão corresponde a
false
, não true
.
- Se você estiver definindo a
config.i18n.default_locale
configuração ou outras configurações do i18n, certifique-se de fazê-lo após definir a config.i18n.enforce_available_locales
configuração.
- Se você usar gemas de terceiros que incluem recursos I18n, definir a variável por meio do
config
objeto Aplicativo pode não ter efeito. Nesse caso, defina-o diretamente para I18n
usar I18n.config.enforce_available_locales
.
Ressalvas
Exemplo
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
Resposta longa
O aviso de descontinuação agora é exibido no Rails 4 (> = 4.0.2) e no Rails 3.2 (> = 3.2.14). O motivo é explicado neste commit .
Aplicar localidades disponíveis
Quando I18n.config.enforce_available_locales
for verdade, criaremos uma exceção I18n :: InvalidLocale se o código do idioma transmitido estiver indisponível.
O padrão é definido para o nil
qual exibirá um erro de reprovação.
Se definido como false
, pularemos a imposição de todos os códigos de idioma disponíveis (comportamento antigo).
Isso foi implementado nos seguintes métodos:
- I18n.config.default_locale =
- I18n.config.locale =
- I18n.translate
- I18n.localize
- I18n.transliterate
Antes dessa alteração, se você passasse um código de idioma não suportado, o Rails mudaria silenciosamente para ele se o código de idioma fosse válido (ou seja, se houver um arquivo de código de idioma correspondente na /config/locales
pasta), caso contrário, o código de idioma será o padrão da config.i18n.default_locale
configuração (o padrão é: en )
A nova versão da gema I18n força os desenvolvedores a ficarem um pouco mais conscientes do gerenciamento de localidade.
No futuro, o comportamento mudará e, se um código de idioma for inválido, o aplicativo Rails gerará um erro.
Na preparação de tais alterações (que podem potencialmente interromper vários aplicativos que até hoje dependiam de padrões silenciosos), o aviso está forçando você a declarar explicitamente qual validação deseja executar durante o período de transição atual.
Para restaurar o comportamento anterior, basta definir a seguinte configuração como false
config.i18n.enforce_available_locales = false
caso contrário, defina-o como true para corresponder aos novos padrões do Rails ou se você quiser ser mais rígido na validação de domínio e evitar mudar para o padrão em caso de localidade inválida.
config.i18n.enforce_available_locales = true
Embargo
Se você está definindo a config.i18n.default_locale
configuração ou utilizando qualquer um dos métodos mencionados anteriormente ( default_locale=
, locale=
, translate
, etc), certifique-se de fazê-lo após a definição da config.i18n.enforce_available_locales
configuração. Caso contrário, o aviso de descontinuação continuará aparecendo. (Obrigado, Fábio Batista ).
Se você usar gemas de terceiros que incluem recursos I18n, a configuração da variável pode não ter efeito. De fato, o problema é o mesmo descrito no ponto anterior, apenas um pouco mais difícil de depurar.
Esse problema é uma questão de precedência. Quando você define a configuração no seu aplicativo Rails, o valor não é imediatamente atribuído à gema I18n. O Rails armazena cada configuração em um objeto interno, carrega as dependências (Railties e gemas de terceiros) e depois passa a configuração para as classes de destino. Se você usar uma gema (ou plugin do Rails) que chame qualquer um dos métodos I18n antes que a configuração seja atribuída a I18n, você receberá o aviso.
Nesse caso, você precisa pular a pilha do Rails e definir a configuração imediatamente para a gema I18n chamando
I18n.config.enforce_available_locales = true
ao invés de
config.i18n.enforce_available_locales = true
A questão é fácil de provar. Tentar gerar um novo aplicativo Rails vazios e você verá que a configuração config.i18n
na application.rb
fina obras.
Se no seu aplicativo não existir, existe uma maneira fácil de depurar o culpado. Localize a gema i18n no seu sistema, abra o i18n.rb
arquivo e edite o método enforce_available_locales!
para incluir a instrução puts caller.inspect
.
Isso fará com que o método imprima o rastreamento de pilha sempre que chamado. Você poderá determinar qual gema está chamando, inspecionando o rastreamento de pilha (no meu caso, era 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
aplicativos.