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::Application
thâ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_locale
cấ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 nil
sẽ hiển thị lỗi không dùng nữa.
Nếu được đặt thành false
chú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/locales
thư mục), nếu không, miền địa phương sẽ mặc định config.i18n.default_locale
cấ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
Nếu bạn đang thiết lập config.i18n.default_locale
cấ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_locales
thiế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 ).
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.i18n
trong application.rb
tá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.rb
tệ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)>'",
Rails 4.0.1
các ứng dụng.