Rails I18n 유효성 검사 사용 중단 경고


387

난 그냥 레일 4.0.2로 업데이트 하고이 경고가 나타납니다 :

[더 이상 사용되지 않음] I18n.enforce_available_locales는 향후 기본값이 true로 설정됩니다. 로캘의 유효성 검사를 정말로 건너 뛰려면이 메시지를 피하기 위해 I18n.enforce_available_locales = false를 설정할 수 있습니다.

false로 설정하는 데 보안 문제가 있습니까?


분명히 이것은 Rails 4.0.1응용 프로그램 에서도 발생 합니다.
lucke84

2
Rails 3.2.16에서도 동일합니다. 아래 Simone Carletti의 답변에 따르면 Rails 4 (> = 4.0.2) 및 Rails 3.2 (> = 3.2.14)에 있습니다.
Mark Berry

답변:


615

중요 : 앱에서 I18n 0.6.8을 사용하고 있지 않은지 확인하십시오 . 구성에 올바르게 설정되지 못하게 하는 버그가 있습니다 .


짧은 답변

경고를 끄려면 application.rb 파일을 편집하고 Rails::Application본문에 다음 줄을 포함하십시오.

config.i18n.enforce_available_locales = true

가능한 값은 다음과 같습니다.

  • 거짓 : 당신이 경우
    • 로캘 유효성 검사를 건너 뛰고 싶습니다
    • 로케일에 관심이 없다
  • 사실 : 만약 당신이
    • 유효하지 않은 로케일이 전달되면 응용 프로그램에서 오류가 발생하기를 원합니다.
    • 새로운 Rails 비헤이비어를 기본값으로 설정하려는 경우
    • 로캘 유효성 검사에주의

노트 :

  • 이전 기본 동작은 false아닙니다 true.
  • 당신이 설정하는 경우 config.i18n.default_locale구성 또는 다른 국제화 설정을 설정 한 후 그것을 할 수 있는지 확인 config.i18n.enforce_available_locales설정을.
  • I18n 기능이 포함 된 타사 보석을 사용하는 경우 Application config객체를 통해 변수를 설정해도 효과가 없을 수 있습니다. 이 경우을 I18n사용하여 직접 설정하십시오 I18n.config.enforce_available_locales.

    경고

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

긴 대답

사용 중단 경고가 이제 Rails 4 (> = 4.0.2)와 Rails 3.2 (> = 3.2.14)에 모두 표시됩니다. 이유는 이 커밋에 설명되어 있습니다.

사용 가능한 로캘 적용

I18n.config.enforce_available_locales사실 전달 된 로케일을 사용할 수없는 경우 우리는 국제화 :: InvalidLocale 예외를 발생시킬 수 있습니다.

nil더 이상 사용되지 않는 오류가 표시 되도록 기본값이 설정되어 있습니다.

로 설정하면 false사용 가능한 로캘을 모두 적용하지 않습니다 (오래된 동작).

이것은 다음 방법으로 구현되었습니다.

  • I18n.config.default_locale =
  • I18n.config.locale =
  • I18n. 번역
  • I18n. 현지화
  • I18n. 음역

이 변경 전에 지원되지 않는 로케일을 전달하면 로케일이 유효한 경우 (예 : /config/locales폴더 에 해당 로케일 파일이있는 경우) Rails가 자동으로 로케일로 전환합니다 . 그렇지 않으면 로케일의 기본값이 config.i18n.default_locale구성 (기본값 : : en)입니다 ).

I18n gem의 새로운 버전은 개발자가 로케일 관리를 조금 더 의식하게합니다.

앞으로 동작이 변경되고 로케일이 유효하지 않으면 Rails 앱에서 오류가 발생합니다.

이러한 변경을 준비 할 때 (오늘날까지 자동 기본값에 의존하는 여러 응용 프로그램이 중단 될 수 있음) 경고는 현재 전환 기간 동안 수행 할 유효성 검사를 명시 적으로 선언하도록합니다.

이전 동작을 복원하려면 다음 구성을 설정하십시오. false

config.i18n.enforce_available_locales = false

그렇지 않으면, 새로운 Rails 기본값과 일치하도록 또는 도메인 유효성 검사에 대해 더 엄격하게하고 유효하지 않은 로케일의 경우 기본값으로 전환하지 않으려면 true로 설정하십시오.

config.i18n.enforce_available_locales = true

경고

  1. 당신이 설정하는 경우 config.i18n.default_locale구성 또는 앞서 언급 한 방법 (의 사용 default_locale=, locale=, translate, 등)에 설정 한 후 그것을 할 수 있는지 확인 config.i18n.enforce_available_locales설정을. 그렇지 않으면 지원 중단 경고가 계속 나타납니다. ( Fábio Batista 감사합니다 ).

  2. I18n 기능이 포함 된 타사 보석을 사용하는 경우 변수를 통해 설정하면 효과가 없을 수 있습니다. 실제로, 문제는 이전 시점에서 설명한 것과 동일하지만 디버깅하기가 조금 더 어렵습니다.

    이 문제는 우선 순위입니다. Rails 앱에서 구성을 설정하면 해당 값이 I18n gem에 즉시 할당되지 않습니다. Rails는 각 설정을 내부 객체에 저장하고 의존성 (Railties 및 타사 gem)을로드 한 다음 구성을 대상 클래스로 전달합니다. 구성이 I18n에 할당되기 전에 I18n 메소드를 호출하는 gem (또는 Rails 플러그인)을 사용하면 경고가 표시됩니다.

    이 경우 Rails 스택을 건너 뛰고 config를 즉시 I18n gem으로 설정해야합니다.

    I18n.config.enforce_available_locales = true

    대신에

    config.i18n.enforce_available_locales = true

    이 문제는 쉽게 입증 할 수 있습니다. 빈 Rails 앱을 새로 생성하면 해당 설정 config.i18napplication.rb제대로 작동 하는 것을 볼 수 있습니다.

    앱에서 그렇지 않은 경우 범인을 디버깅하는 쉬운 방법이 있습니다. 시스템에서 i18n gem을 찾아 i18n.rb파일을 열고 enforce_available_locales!명령문을 포함하도록 메소드 를 편집하십시오 puts caller.inspect.

    이렇게하면 호출 될 때마다 메소드가 스택 추적을 인쇄합니다. 스택 트레이스 (제 경우에는 Authlogic)를 검사하여 어떤 gem을 호출하고 있는지 확인할 수 있습니다.

    ["/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)>'",

20
당신이 설정하는 경우 config.i18n.default_locale구성을, 당신이 그것을 확인 새로운 설정을 config.i18n.enforce_available_locales설정합니다. 그렇지 않으면 지원 중단 경고가 계속 나타납니다.
Fábio Batista

3
나를 위해, 내가 설정 한 경우에만 작동합니다 I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = true작동하지 않습니다.
Pioz December

1
@Pioz 응용 프로그램이 의존하는 보석으로 인해 발생할 수 있습니다. 이유를 설명하기 위해 게시물을 업데이트했습니다.
Simone Carletti 2014

@SimoneCarletti 직통 전화는 I18n.config.enforce_available_locales하지 않아야합니다 I18n.config.i18n.enforce_available_locales. 귀하의 답변을 편집했습니다. 수정에 대한 감사합니다.
Fabio

1
I18n.config.available_locales = [:your_locale, :en]예를 들어 하나를 설정해야하며 그렇지 않으면 Rails 서버를 시작할 수 없습니다.
Tamer Shlash

45

완전성 I18n.enforce_available_locales을 위해 다음에서 true(또는 false) 으로 설정하여 경고를 제거 할 수도 있습니다 config/application.rb.

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end

9
하는 것이 더 좋지 config.i18n.enforce_available_locales = true않습니까?
Mischa

2
나는 3.2.16에 있는데 I18n.enforce_available_locales = false로 설정했지만 여전히 메시지가 있습니다.
CLod

3
나를 위해 작동하지 않은 @Mischa, 그러나 위의 대답은 그렇지 않습니다.
Mike Atlas

1
@Mischa는 슬프게도 I18n.config이것이 효과를 발휘하기 위해
노력해야했다

3
config.i18n.enforce_available_locales = trueconfig / application.rb에서 Rails 4.0.2에서 더 이상 사용되지 않는 경고를 제거했지만 다른 config.i18n줄 위에 놓은 경우에만 해당됩니다 .
balexand

15

I18n.config.enforce_available_locales = true Rails 3.2.16에서 나를 위해 일했습니다 (config / application.rb에 넣었습니다)



0

로케일을 관리하려면 appilcation.rb파일에 쓰십시오 .

config.i18n.enforce_available_locales = true

로케일 유효성 검사가 마음에 들지 않으면 false를 쓸 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.