2009-12-03 23 views
7

को ओवरराइड शब्दों, मैं एक डिफ़ॉल्ट अंग्रेज़ी लोकेल फ़ाइल "en.yml" सामग्री के साथ है:रेल कैसे गतिशील रूप से जोड़ने के लिए/एक उदाहरण के रूप i18n YAML

en: 
    messages: messages 
    users: users 
अब

, वहाँ एक ग्राहक जो संदेशों चाहता है अपने उत्पाद में चर्चा का नाम दिया जाना चाहिए, लेकिन उपयोगकर्ताओं को उपयोगकर्ताओं को रहना चाहिए। तो क्या मैं करना चाहता हूँ "customer.en.yml" फ़ाइल बनाने के लिए है

en: 
messages: discussions 

जो डिफ़ॉल्ट "संदेश" अनुवाद ओवरराइड कर देगा, लेकिन अन्य सभी शब्द ही रखना होगा। मैं इसे कैसे प्राप्त कर सकता हूं?

क्योंकि अगर मैं साथ en.yml लोड:

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'locales', '*.{rb,yml}')] 

और बाद में customer.en.yml लोड

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'custom_locales', APP_CONFIG['customer_name']+'.{rb|yml}')] 

साथ (APP_CONFIG [ 'customer_name'] से पहले परिभाषित किया गया है) यह सिर्फ होगा मेरे "एन" लोकेल को ओवरराइट करें, और "उपयोगकर्ता" अनुवाद गायब हो जाएगा, है ना?

उत्तर

3

इसे आपके "एन" लोकेल को ओवरराइट नहीं करना चाहिए। अनुवाद विलय कर रहे हैं। सरल I18n बैकएंड में store_translationsmerge_translations कहता है, जो इस प्रकार है:

# Deep merges the given translations hash with the existing translations 
# for the given locale 
def merge_translations(locale, data) 
    locale = locale.to_sym 
    translations[locale] ||= {} 
    data = deep_symbolize_keys(data) 

    # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809 
    merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 } 
    translations[locale].merge!(data, &merger) 
end 

आप देख सकते हैं, केवल कुंजी यदि आप बाद अनुवाद YML फाइल में दर्ज ओवरराइट किया जाएगा।

1

जब हम एक समुद्री डाकू.आईएमएल अनुवाद लिख रहे थे, तो मुझे कुछ ऐसा ही चाहिए था, लेकिन मैं चाहता था कि pirate.yml में परिभाषित कुछ भी जो हमारे पास en.yml में था।

जो मैंने लिखा है वह Github पर पाया जा सकता है।

+0

गिथब लिंक अब मान्य नहीं है! –

+0

मान्य नहीं है? हालांकि यह एक बहुत पुरानी परियोजना है, लिंक अभी भी मेरे लिए काम करता है। क्या आपको 404 मिल रहा है? –

+0

बिल्कुल 'पृष्ठ नहीं मिला' जो मुझे मिल रहा है! –

-1

मुझे लगता है कि आप दो अलग-अलग चीजों को मिश्रित कर सकते हैं।

i18n फ़ाइल अनुवाद के लिए है।

यदि आपके पास कोई ऐसा क्लाइंट है जिसके लिए कुछ फ़ील्ड के लिए एक विशिष्ट नाम की आवश्यकता है, तो यह अनुवाद समस्या नहीं है, लेकिन कार्यक्षमता है।

en: 
    messages: messages 
    users: users 
    discussions: discussions 

और फिर अपने दृश्य में, उदाहरण के लिए कहीं और विशिष्ट कार्यक्षमता जोड़ने के लिए,:

if(customer.needs_discussions?) 
<%= t(:discussions) %> 
else 
<%= t(:messages) %> 
end 

वैकल्पिक रूप से, आप जोड़ सकते

दूसरे शब्दों में, मैं तुम्हें कुछ इस तरह की जरूरत है आपके संदेशों को एक स्ट्रिंग विशेषता, 'संदेशों' को डिफॉल्ट करना। तब आपके विचार इस प्रकार दिखाई देगा:

<%= t(customer.messages_field_name) %> 
+2

अच्छी तरह से, यदि उसे शब्द में 200 परिवर्तनों की आवश्यकता है, तो मुझे 200 आईएसएस लिखना होगा और 200 ग्राहक सेटिंग्स जोड़ना होगा, और एक दूसरे के लिए उत्पाद का उपयोग करके अपने दूसरे ग्राहक के लिए। इससे कोड की मात्रा में भारी वृद्धि होगी। और, यदि विशिष्ट ग्राहक छोड़ देता है, तो वे सभी ifs कोड में रहेंगे, जबकि अन्यथा मैं केवल अनुवाद ओवरराइड हटा दूंगा। –

+0

कोड सिर्फ एक उदाहरण था - मेरा मतलब यह था कि आपको इसके लिए i18n का उपयोग नहीं करना चाहिए। मैंने अन्य समाधानों के साथ अपनी टिप्पणी संपादित की है। यदि आप i18n का उपयोग करने के बारे में सोचते रहें, तो उदाहरण के लिए, जब आपको अपने एप्लिकेशन को फ्रेंच में अनुवाद करना होगा, तो क्या होगा। – kikito

+1

मेरे पास पहले से ही फ्रेंच और अंग्रेजी i18n है, और उनमें से शीर्ष पर मैं ग्राहक ओवरराइड लोड करता हूं। मेरे पास लोकेशंस/en.yml, लोकेशंस/fr.yml हैं और उनमें से शीर्ष पर मैं स्थानीय/ग्राहक.en.yml और लोकेशंस/customer.fr.yml लोड करता हूं, यदि आवश्यक हो। मुझे खेद है, लेकिन मुझे सच में लगता है कि इस तरह सरल शब्द अनुकूलन के लिए बेहतर तरीका है –

5

उपयोग

i18n.fallbacks मुझे यकीन है कि जब इस रेल को जोड़ा गया है, लेकिन 4.2 में नहीं हूँ।2 आप कर सकते हैं:

# application.rb 
# If key is not found in a locale, we look in fallback 
config.i18n.fallbacks = { 
    "locale_1" => "en", 
    "locale_2" => "en", 
    "locale_3" => "de", 
} 

आप भी config.action_view.raise_on_missing_translations = true (जो मैं विकास और परीक्षण में करते हैं) की स्थापना की, तो वह केवल बढ़ा है, तो एक महत्वपूर्ण स्थान या वापस आने में नहीं पाया जाता होगा।

संबंधित मुद्दे