2010-06-17 10 views
10

मेरे पास एक बहु-किरायेदार एप्लिकेशन है और मैं i18n मणि का उपयोग करने के साथ प्रयोग कर रहा हूं ताकि हमारे प्रत्येक क्लाइंट सिस्टम को अपनी पसंद के अनुसार सिस्टम को अनुकूलित कर सकें, विभिन्न पृष्ठों पर टेक्स्ट बदल सकें, ईमेल अनुकूलित कर सकें, और आगे भी। माना जाता है कि, मैं i18n का उपयोग नहीं कर रहा हूं क्योंकि इसका उपयोग किया जाना था, क्योंकि मैं वास्तव में विभिन्न "भाषाओं" का अनुवाद नहीं कर रहा हूं, सब कुछ अंग्रेजी में है, लेकिन प्रत्येक क्लाइंट के पास एक अलग अंग्रेजी है, अगर यह समझ में आता है।रेल i18n: क्या मैं "अनुवाद गायब" त्रुटियों को बंद कर सकता हूं?

फिर भी, मैं जो कुछ सोचता हूं वह आया है I18n मणि में एक बहुत ही खराब डिजाइन निर्णय है: अगर कभी अनुवाद नहीं होता है और जो कुछ भी सामान्य रूप से प्रिंट करता है, उसे प्रिंट करने के बजाय, यह कभी भी अनुवाद नहीं होता है, यह उठाता है एक त्रुटि। उदाहरण के लिए,

<%= distance_of_time_in_words_to_now @press_release.submitted_at %> 

translation missing: en, datetime, distance_in_words, x_days 

मेरा मतलब है, चलो के रूप में बाहर आता है! मैं भी अनुवाद नहीं करना चाहता हूं।

मैं समझता हूँ कि कारण यह हो रहा है है, क्योंकि मैं डिफ़ॉल्ट अनुवाद भरी हुई नहीं है, लेकिन मैं एक बैकेंड के रूप में ActiveRecord उपयोग कर रहा हूँ और मैं इसे साफ रखने के लिए करना चाहता था। "समाधान" सभी डेटाबेस अनुवाद फ़ाइलों को मेरे डेटाबेस अनुवाद स्टोर में आयात करना होगा, लेकिन यह एक अच्छा विचार प्रतीत नहीं होता है। अगर मैं भविष्य में रेल को अपग्रेड करता हूं तो क्या होगा? मुझे इन सभी अनुवादों को सिंक में रखने के बारे में चिंता करने की ज़रूरत है।

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

वैसे भी, मेरे सवाल है, वहाँ यह स्वचालित रूप से अनुवाद बंद कर देते हैं और ग़ैर-अनुवादित संदेश का उपयोग करता है, तो अनुवाद मौजूद नहीं है के लिए एक तरीका है? धन्यवाद!

उत्तर

6

यह चाल करने के लिए लगता है।

require 'i18n' # without this, the gem will be loaded in the server but not in the console, for whatever reason 

# store translations in the database's translations table 
I18n.backend = I18n::Backend::ActiveRecord.new 

# for translations that don't exist in the database, fallback to the Simple Backend which loads the default English Rails YAML files 
I18nSimpleBackend = I18n::Backend::Simple.new 
I18n.exception_handler = lambda do |exception, locale, key, options| 
    case exception 
    when I18n::MissingTranslationData 
    I18nSimpleBackend.translate(:en, key, options || {}) 
    else 
    raise exception 
    end 
end 
+2

आप इसे कहां रखेंगे? –

+2

शायद 'config/startizers /' के अंतर्गत '.rb' फ़ाइल में। – Dimitar

+1

'I18n.backend = I18n :: बैकएंड :: ActiveRecord.new' रेल 4.2 – user938363

7

आप डिफ़ॉल्ट अपवाद संचालक के साथ अन्य अपवाद को संभालने में रुचि रखते हैं, से फिलिप Brocoum के जवाब इस संशोधित कोड चाल करना चाहिए (रेल 3.2.2 संस्करण):

i18n_simple_backend = I18n::Backend::Simple.new 
old_handler = I18n.exception_handler 
I18n.exception_handler = lambda do |exception, locale, key, options| 
    case exception 
    when I18n::MissingTranslation 
    i18n_simple_backend.translate(:en, key, options || {}) 
    else 
    old_handler.call(exception, locale, key, options) 
    end 
end 

यह कोड आपको केवल उन अपवादों को कैप्चर करने की अनुमति देगा जिन्हें आपको अलग-अलग संभालने की आवश्यकता है।

+0

में अप्रारंभीकृत स्थिरांक त्रुटि होती है रेल 4.2 में। 'i18n_simple_backend.translate (: एन, कुंजी, विकल्प || {}) 'त्रुटि का कारण बनता है – user938363

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