Acabei de atualizar para o rails 4.0.2 e estou recebendo este aviso:
[descontinuado] I18n.enforce_available_locales será padronizado como true no futuro. Se você realmente deseja ignorar a validação do seu código do idioma, pode definir I18n.enforce_available_locales = false para evitar esta mensagem.
Existe algum problema de segurança ao defini-lo como falso?
ruby-on-rails
ruby
ruby-on-rails-4
deprecated
rails-i18n
Mauricio Moraes
fonte
fonte
Rails 4.0.1
aplicativos.Respostas:
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
corpoOs valores possíveis são:
Nota:
false
, nãotrue
.config.i18n.default_locale
configuração ou outras configurações do i18n, certifique-se de fazê-lo após definir aconfig.i18n.enforce_available_locales
configuração.config
objeto Aplicativo pode não ter efeito. Nesse caso, defina-o diretamente paraI18n
usarI18n.config.enforce_available_locales
.Ressalvas
Exemplo
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 .
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 daconfig.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
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.
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 daconfig.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
ao invés de
A questão é fácil de provar. Tentar gerar um novo aplicativo Rails vazios e você verá que a configuração
config.i18n
naapplication.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étodoenforce_available_locales!
para incluir a instruçãoputs 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).
fonte
config.i18n.default_locale
configuração, certifique-se de fazê-lo após definir a novaconfig.i18n.enforce_available_locales
configuração. Caso contrário, o aviso de descontinuação continuará sendo exibido.I18n.enforce_available_locales = true
.config.i18n.enforce_available_locales = true
não funciona.I18n.config.enforce_available_locales
não deve serI18n.config.i18n.enforce_available_locales
, editei sua resposta. Thanx pela correção.I18n.config.available_locales = [:your_locale, :en]
por exemplo, caso contrário, você não poderá iniciar o servidor rails.Apenas para completar, observe que você também pode se livrar do aviso configurando
I18n.enforce_available_locales
paratrue
(oufalse
) emconfig/application.rb
:fonte
config.i18n.enforce_available_locales = true
?I18n.config
para que isso tem um efeitoconfig.i18n.enforce_available_locales = true
em config / application.rb eliminou o aviso de reprovação para mim no Rails 4.0.2, mas apenas se eu o colocar acima das outrasconfig.i18n
linhas.I18n.config.enforce_available_locales = true
trabalhou para mim no Rails 3.2.16 (eu o coloquei em config / application.rb)fonte
Não parece assim - esse seria o comportamento anterior da maneira como o i18n funciona - o novo comportamento (verdadeiro) gera um erro quando você solicita um código de idioma não implementado / disponível.
Consulte o commit que adicionou este aviso: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c
fonte
Se você deseja se preocupar com as localidades, escreva no
appilcation.rb
arquivo.Você pode escrever falso se a validação de localidade e não se importa com isso.
fonte