2010-09-29 17 views
29

में yml फ़ाइलों से सभी अनुवादों को पुनर्प्राप्त करने के लिए कैसे मैं अनुमान लगा रहा हूं कि रेल सभी सरलीकृत अनुवाद yml फ़ाइलों को सरणी/हैश में संग्रहीत करता है। क्या इसका उपयोग करने का कोई तरीका है?रेल I18n

उदाहरण के लिए

, अगर मैं एक फ़ाइल है:

en: 
    test_string: "testing this" 
    warning: "This is just an example 

मैं कुछ पसंद करते हैं सकता है, I18n.translations_store [: en] [: test_string]? मैं yml फ़ाइल लोड के साथ yml फ़ाइल को पार्स कर सकता हूं, लेकिन मेरे मामले में मैंने संगठन के लिए उपफोल्डर में yml फ़ाइलों को विभाजित कर दिया है, और मुझे पूरा यकीन है कि रेल पहले से ही उन सभी को पार्स कर चुके हैं।

उत्तर

53

आपको बैकएंड पर एक निजी विधि कॉल करना है। इस प्रकार आप पहुंच प्राप्त करते हैं:

translations = I18n.backend.send(:translations) 
translations[:en][:test_string] # => "testing this" 
+22

ध्यान दें कि बैकएंड प्रारंभ नहीं होने पर 'अनुवाद' खाली हो जाएगा, यानी यदि आपने इसे अभी तक किसी और चीज़ के लिए उपयोग नहीं किया है। यदि आप एक नया कंसोल खोलते हैं और अनुवाद लोड करने का प्रयास करते हैं तो आप इसे देखेंगे। आप 'I18n.t (: foo) करके इसे प्राप्त कर सकते हैं; अनुवाद = I18n.backend.send (: अनुवाद) '(भले ही आपके पास 'foo' अनुवाद न हो)। मुझे यकीन है कि एक बेहतर तरीका है। –

+0

धन्यवाद, @ हेनरिक, आप मेरा दिन बचाओ। – lifecoder

+10

बहुत बहुत धन्यवाद। यदि बैकएंड अभी तक प्रारंभ नहीं हुआ है और हैश खाली है, तो आप इसे इस तरह से प्रारंभ कर सकते हैं: 'I18n.backend.send (: init_translations) जब तक I18n.backend.in प्रारंभ नहीं किया गया?' – Robin

2

डिफ़ॉल्ट I18n बैकएंड I18n :: बैकएंड :: सरल है, जो आपको अनुवादों का खुलासा नहीं करता है। (I18.backend.translations एक संरक्षित विधि है।)

यह आमतौर पर एक अच्छा विचार नहीं है, लेकिन यदि आपको वास्तव में इस जानकारी की आवश्यकता है और फ़ाइल को पार्स नहीं कर सकता है, तो आप बैकएंड क्लास का विस्तार कर सकते हैं।

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

आप पार्स किए गए अनुवाद प्राप्त करने के लिए I18n.backend.translations_store पर कॉल कर सकते हैं। आपको शायद इस पर दीर्घकालिक रणनीति के रूप में भरोसा नहीं करना चाहिए, लेकिन यह आपको वह जानकारी प्राप्त करता है जिसकी आपको अभी आवश्यकता है।

0

इस पुराने प्रश्न में घूमने वाले लोगों के लिए, एक समाधान है जिसे संरक्षित तरीकों को कॉल करने की आवश्यकता नहीं है। इस प्रकार अपने yml फ़ाइल को बदलें:

nl: &all 

    ... translations here ... 

    all: 
    <<: *all 

अब आप बस सभी अनुवाद I18n.t("all"), जो स्वत: प्रारंभ करने और (विकास मोड में अनुवाद पुन: लोड जो कुछ नहीं होता है, तो आप सुरक्षित फोन को लाभ मिलता है का उपयोग कर निकाल सकते हैं । विधि)

15

रूप 8xx8 की टिप्पणी प्रति, एक की सरल संस्करण:

I18n.t(:foo) 
I18n.backend.send(:translations)[:en][:test_string] 

0 है

यह कमेटी दोनों अनुवादों को प्रीलोड या लोकेल निर्दिष्ट करने के लिए होते हैं।

+0

यह मेरे लिए सबसे अच्छा समाधान था I18n.t ("।") '। धन्यवाद। – jordelver

0

आप एक रेक कार्य में इस कर रहे हैं, पर्यावरण शामिल करना न भूलें, या अन्यथा यह जो config/locales/

require "./config/environment.rb" # Do not forget this 

namespace :i18n do 
    desc "Import I18n to I18n_active_record" 
    task :setup do 
    I18n.t(:foo) 
    translations = I18n.backend.send(:translations) 
    end 
end 
2

के तहत रहता है आप I18n::Fallbacks दुर्भाग्य से आप कर सकते हैं का उपयोग कर रहे हैं, तो अपने स्वयं के स्थान लोड नहीं होगा ' टी I18n.t('.') का उपयोग करें क्योंकि यह केवल मौजूदा लोकेल (जैसे 'एन-जीबी') सामग्री देता है और किसी भी फॉलबैक लोकेशंस (जैसे 'एन') से कुछ भी नहीं। इसे पाने के लिए आप फॉलबैक पर फिर से शुरू कर सकते हैं और उन्हें गठबंधन करने के लिए deep_merge! का उपयोग कर सकते हैं।

module I18n 
    class << self 
    def all 
     fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback| 
     translations.deep_merge!(backend.translate(fallback, '.')) 
     end 
    end 
    end 
end 
संबंधित मुद्दे