Aviso de reprovação da validação do Rails I18n

387

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?

Mauricio Moraes
fonte
Aparentemente, isso acontece também com Rails 4.0.1aplicativos.
precisa saber é o seguinte
2
Eu tenho o mesmo no Rails 3.2.16. De acordo com a resposta de Simone Carletti abaixo, está no Rails 4 (> = 4.0.2) e no Rails 3.2 (> = 3.2.14).
Mark Berry

Respostas:

615

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::Applicationcorpo

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_localeconfiguração ou outras configurações do i18n, certifique-se de fazê-lo após definir a config.i18n.enforce_available_localesconfiguração.
  • Se você usar gemas de terceiros que incluem recursos I18n, definir a variável por meio do configobjeto Aplicativo pode não ter efeito. Nesse caso, defina-o diretamente para I18nusar 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_localesfor verdade, criaremos uma exceção I18n :: InvalidLocale se o código do idioma transmitido estiver indisponível.

O padrão é definido para o nilqual 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/localespasta), caso contrário, o código de idioma será o padrão da config.i18n.default_localeconfiguraçã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

  1. Se você está definindo a config.i18n.default_localeconfiguraçã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_localesconfiguração. Caso contrário, o aviso de descontinuação continuará aparecendo. (Obrigado, Fábio Batista ).

  2. 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.i18nna application.rbfina 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.rbarquivo 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)>'",
Simone Carletti
fonte
20
Se você estiver definindo a config.i18n.default_localeconfiguração, certifique-se de fazê-lo após definir a nova config.i18n.enforce_available_localesconfiguração. Caso contrário, o aviso de descontinuação continuará sendo exibido.
Fábio Batista
3
Para mim, funciona apenas se eu definir I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = truenão funciona.
Pioz
11
@Pioz Pode ser causado pelas pedras preciosas da sua aplicação. Eu atualizei o post para explicar o porquê.
Simone Carletti
A chamada direta @SimoneCarletti I18n.config.enforce_available_localesnão deve ser I18n.config.i18n.enforce_available_locales, editei sua resposta. Thanx pela correção.
Fabio
11
Deve-se mencionar que é preciso definir, I18n.config.available_locales = [:your_locale, :en]por exemplo, caso contrário, você não poderá iniciar o servidor rails.
Tamer Shlash
45

Apenas para completar, observe que você também pode se livrar do aviso configurando I18n.enforce_available_localespara true(ou false) em config/application.rb:

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end
mhartl
fonte
9
Não seria melhor fazer isso config.i18n.enforce_available_locales = true?
precisa
2
Estou no 3.2.16, defino como I18n.enforce_available_locales = false, mas ainda tenho a mensagem ...
CLod 04/12/13
3
@ Mischa que não funcionou para mim, a resposta acima funciona.
Mike Atlas
11
@Mischa infelizmente não, teve que passar por I18n.configpara que isso tem um efeito
dolzenko
3
config.i18n.enforce_available_locales = trueem config / application.rb eliminou o aviso de reprovação para mim no Rails 4.0.2, mas apenas se eu o colocar acima das outras config.i18nlinhas.
amigos estão dizendo sobre balexand
15

I18n.config.enforce_available_locales = true trabalhou para mim no Rails 3.2.16 (eu o coloquei em config / application.rb)

SpeedyWizard
fonte
0

Se você deseja se preocupar com as localidades, escreva no appilcation.rbarquivo.

config.i18n.enforce_available_locales = true

Você pode escrever falso se a validação de localidade e não se importa com isso.

Foram Thakral
fonte