Rails I18n cảnh báo khấu hao xác nhận


387

Tôi vừa cập nhật lên đường ray 4.0.2 và tôi nhận được cảnh báo này:

[deprecated] I18n.enforce_av Available_locales sẽ mặc định là true trong tương lai. Nếu bạn thực sự muốn bỏ qua xác thực ngôn ngữ của mình, bạn có thể đặt I18n.enforce_av Available_locales = false để tránh thông báo này.

Có bất kỳ vấn đề bảo mật trong việc đặt nó thành sai?


Rõ ràng điều này cũng xảy ra với Rails 4.0.1các ứng dụng.
lucke84

2
Tôi có điều tương tự trên Rails 3.2.16. Theo câu trả lời của Simone Carletti bên dưới, đó là trong Rails 4 (> = 4.0.2) và Rails 3.2 (> = 3.2.14).
Mark Berry

Câu trả lời:


615

Quan trọng : Đảm bảo ứng dụng của bạn không sử dụng I18n 0.6.8, nó có một lỗi khiến cấu hình không được đặt chính xác .


Câu trả lời ngắn

Để tắt tiếng cảnh báo, hãy chỉnh sửa tệp application.rb và bao gồm dòng sau bên trong phần Rails::Applicationthân

config.i18n.enforce_available_locales = true

Các giá trị có thể là:

  • sai : nếu bạn
    • muốn bỏ qua xác nhận miền địa phương
    • không quan tâm đến địa phương
  • thật : nếu bạn
    • muốn ứng dụng phát sinh lỗi nếu một ngôn ngữ không hợp lệ được thông qua (hoặc)
    • muốn mặc định cho các hành vi Rails mới (hoặc)
    • quan tâm đến xác nhận bản địa

Ghi chú:

  • Các hành vi mặc định cũ tương ứng với false, không true.
  • Nếu bạn đang cài đặt config.i18n.default_localecấu hình hoặc các cài đặt i18n khác, hãy đảm bảo thực hiện sau khi cài config.i18n.enforce_available_localesđặt.
  • Nếu bạn sử dụng đá quý của bên thứ ba bao gồm các tính năng I18n, đặt biến qua configđối tượng Ứng dụng , có thể không có hiệu lực. Trong trường hợp này, đặt trực tiếp thànhI18n sử dụng I18n.config.enforce_available_locales.

    Hãy cẩn thận

Thí dụ

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

Câu trả lời dài

Cảnh báo khấu hao hiện được hiển thị cả trong Rails 4 (> = 4.0.2) và Rails 3.2 (> = 3.2.14). Lý do được giải thích trong cam kết này .

Thi hành các địa phương có sẵn

Khi nào I18n.config.enforce_available_locales là đúng, chúng tôi sẽ đưa ra một ngoại lệ I18n :: UnlimitedLocale nếu ngôn ngữ được truyền không có sẵn.

Mặc định được đặt thành nilsẽ hiển thị lỗi không dùng nữa.

Nếu được đặt thành falsechúng tôi sẽ bỏ qua việc thực thi các địa phương có sẵn hoàn toàn (hành vi cũ).

Điều này đã được thực hiện trong các phương pháp sau:

  • I18n.config.default_locale =
  • I18n.config.locale =
  • I18n.transTable
  • I18n.localize
  • I18n.transliterate

Trước khi thay đổi này, nếu bạn đã chuyển một miền địa phương không được hỗ trợ, Rails sẽ âm thầm chuyển sang ngôn ngữ đó nếu miền địa phương hợp lệ (nghĩa là nếu có tệp ngôn ngữ tương ứng trong /config/localesthư mục), nếu không, miền địa phương sẽ mặc định config.i18n.default_localecấu hình (mặc định là: en ).

Phiên bản mới của đá quý I18n, buộc các nhà phát triển phải có ý thức hơn một chút về quản lý ngôn ngữ.

Trong tương lai, hành vi sẽ thay đổi và nếu một miền không hợp lệ, ứng dụng Rails sẽ phát sinh lỗi.

Để chuẩn bị cho sự thay đổi đó (có thể có khả năng phá vỡ một số ứng dụng mà cho đến ngày hôm nay vẫn dựa vào các mặc định im lặng), cảnh báo buộc bạn phải tuyên bố rõ ràng xác nhận nào bạn muốn thực hiện, trong giai đoạn chuyển tiếp hiện tại.

Để khôi phục hành vi trước đó, chỉ cần đặt cấu hình sau thành false

config.i18n.enforce_available_locales = false

mặt khác, đặt nó thành true để khớp với mặc định Rails mới hoặc nếu bạn muốn cứng nhắc hơn về xác thực tên miền và tránh chuyển sang mặc định trong trường hợp ngôn ngữ không hợp lệ.

config.i18n.enforce_available_locales = true

Hãy cẩn thận

  1. Nếu bạn đang thiết lập config.i18n.default_localecấu hình hoặc sử dụng bất kỳ phương pháp đã đề cập trước ( default_locale=, locale=, translate, vv), hãy chắc chắn để làm điều đó sau khi cài đặt config.i18n.enforce_available_localesthiết lập. Nếu không, cảnh báo khấu hao sẽ tiếp tục bật lên. (Cảm ơn Fábio Batista ).

  2. Nếu bạn sử dụng đá quý của bên thứ ba bao gồm các tính năng I18n, việc đặt biến qua có thể không có hiệu lực. Trong thực tế, vấn đề giống như được mô tả ở điểm trước, chỉ khó hơn một chút để gỡ lỗi.

    Vấn đề này là một vấn đề ưu tiên. Khi bạn đặt cấu hình trong ứng dụng Rails, giá trị không được gán ngay cho đá quý I18n. Rails lưu trữ từng cấu hình trong một đối tượng bên trong, tải các phụ thuộc (Rail Rail và đá quý của bên thứ ba) và sau đó nó chuyển cấu hình cho các lớp đích. Nếu bạn sử dụng gem (hoặc plugin Rails) gọi bất kỳ phương thức I18n nào trước khi cấu hình được gán cho I18n, thì bạn sẽ nhận được cảnh báo.

    Trong trường hợp này, bạn cần bỏ qua ngăn xếp Rails và đặt cấu hình ngay lập tức thành đá quý I18n bằng cách gọi

    I18n.config.enforce_available_locales = true

    thay vì

    config.i18n.enforce_available_locales = true

    Vấn đề rất dễ chứng minh. Cố gắng tạo ra một ứng dụng rỗng Rails mới và bạn sẽ thấy rằng thiết lập config.i18ntrong application.rbtác phẩm tốt.

    Nếu trong ứng dụng của bạn không có, có một cách dễ dàng để gỡ lỗi thủ phạm. Xác định vị trí đá quý i18n trong hệ thống của bạn, mở i18n.rbtệp và chỉnh sửa phương thức enforce_available_locales!để đưa vào câu lệnh puts caller.inspect.

    Điều này sẽ khiến phương thức in stacktrace bất cứ khi nào được gọi. Bạn sẽ có thể xác định loại đá quý nào đang gọi nó bằng cách kiểm tra stacktrace (trong trường hợp của tôi là 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)>'",

20
Nếu bạn đang cài đặt config.i18n.default_localecấu hình, hãy đảm bảo bạn thực hiện sau khi cài đặt cài đặt mới config.i18n.enforce_available_locales. Nếu không, cảnh báo khấu hao sẽ tiếp tục xuất hiện.
Fábio Batista

3
Đối với tôi, chỉ hoạt động nếu tôi thiết lập I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = truekhông hoạt động.
Pioz

1
@Pioz Nó có thể được gây ra bởi các viên đá quý mà ứng dụng của bạn phụ thuộc vào. Tôi cập nhật bài viết để giải thích tại sao.
Simone Carletti

@SimoneCarletti ghé cảng trực tiếp nên I18n.config.enforce_available_localeskhông I18n.config.i18n.enforce_available_locales, tôi đã chỉnh sửa câu trả lời của bạn. Thanx để sửa chữa.
Fabio

1
Cần phải đề cập rằng người ta phải đặt I18n.config.available_locales = [:your_locale, :en]ví dụ, nếu không bạn sẽ không thể khởi động máy chủ rails của mình.
Tamer Shlash

45

Để hoàn thiện, lưu ý rằng bạn cũng có thể thoát khỏi cảnh báo bằng cách đặt I18n.enforce_available_localesthành true(hoặc false) trong config/application.rb:

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

9
Nó sẽ không gọn gàng hơn để làm gì config.i18n.enforce_available_locales = true?
Mischa

2
Tôi vào ngày 3.2.16, tôi đặt thành I18n.enforce_av Available_locales = false, nhưng tôi vẫn có thông báo ...
CLod

3
@Mischa không hoạt động với tôi, câu trả lời ở trên không.
Mike Atlas

1
@Mischa thật đáng buồn, không phải trải qua I18n.configđiều này để có hiệu lực
dolzenko

3
config.i18n.enforce_available_locales = truetrong config / application.rb đã loại bỏ cảnh báo không dùng cho tôi trong Rails 4.0.2, nhưng chỉ khi tôi đặt nó lên trên các config.i18ndòng khác .
balexand

15

I18n.config.enforce_available_locales = true làm việc cho tôi trong Rails 3.2.16 (Tôi đặt nó trong config / application.rb)



0

Nếu bạn muốn quan tâm về địa phương ghi vào appilcation.rbtập tin.

config.i18n.enforce_available_locales = true

Bạn có thể viết sai nếu xác thực miền địa phương và không quan tâm đến điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.