2013-02-01 38 views
8

Trong Rails i18n, làm thế nào để có được tất cả các giá trị cho một phím nào đó bằng cách sử dụng sau đây:Rails i18n cách lấy tất cả các giá trị cho một khóa nhất định?

translations = I18n.backend.send(:translations) 

nhận được tất cả các phím

tôi cần để có thể có được một nhất định phần ví dụ chỉ trả lại tất cả mọi thứ trong "nhà"

en: 
    home: 
    test: test 

Trả lời

12

Giá trị trả lại của I18n.backend.send(:translations) chỉ là một băm, vì vậy bạn có thể truy cập tập hợp con chỉ bằng cách truyền vào các phím thích hợp.

ví dụ: nếu bạn có:

en: 
    foo: 
    bar: 
     some_term: "a translation" 
     some_other_term: "another translation" 

Sau đó, bạn có thể nhận được các tập hợp con của các hash dưới bar với:

I18n.backend.send(:translations)[:en][:foo][:bar] 
#=> { :some_term=>"a translation", :some_other_term => "another translation"} 
+2

Cảm ơn i phát hiện ra trong thời gian chờ đợi rằng I18n.t ('home') hoạt động cũng – Rubytastic

+0

Rất tốt, cảm ơn! điều này làm việc tuyệt vời cho tôi khi tôi đang tìm kiếm một cách để có được tên khóa thực sự. – richddr

5

Phụ trợ I18n mặc định là I18n::Backend::Simple, không hiển thị tran slations cho bạn. (I18.backend.translations là phương pháp được bảo vệ.)

Đây không phải là ý tưởng hay, nhưng nếu bạn thực sự cần thông tin này và không thể phân tích tệp, bạn có thể mở rộng lớp phụ trợ.

class I18n::Backend::Simple 
    def translations_store 
    translations 
    end 
end 

Sau đó, bạn có thể gọi I18n.backend.translations_store để nhận các bản dịch được phân tích cú pháp. Bạn có lẽ không nên dựa vào điều này như một chiến lược dài hạn, nhưng nó giúp bạn có được thông tin bạn cần ngay bây giờ.

0

Thiết I18n.locale sau đó làm I18n.t hoạt động tốt, ví dụ:

def self.all_t(string) 
    I18n.locale = :en 
    en = I18n.t("pages.home.#{string}") 
    I18n.locale = :fr 
    fr = I18n.("pages.home.#{string}") 
    [en, fr] 
end 
Các vấn đề liên quan