7

मैं अपने रूबी पर रेल 3 आवेदन में तारीख अनुवाद के साथ एक अजीब समस्या मिल गया है, और मैं वास्तव में समझ में नहीं आता क्यों ...अजीब I18n तारीख उत्पादन

यहाँ मेरी हैं en.yml और fr.yml:

fr: 
    date: 
    formats: 
     default: "%d/%m/%Y" 
     short: "%e %b" 
     long: "%e %B %Y" 
    time: 
    formats: 
     default: "%d %B %Y %H:%M:%S" 
     short: "%d %b %H:%M" 
     long: "%A %d %B %Y %H:%M" 
    am: 'am' 
    pm: 'pm' 



en: 
    date: 
    formats: 
     default: "%Y-%m-%d" 
     long: "%B %d, %Y" 
     short: "%b %d" 
    time: 
    am: am 
    formats: 
     default: ! '%a, %d %b %Y %H:%M:%S %z' 
     long: ! '%B %d, %Y %H:%M' 
     short: ! '%d %b %H:%M' 
    pm: pm 

यह एक particuliar देखने के लिए विशिष्ट नहीं है, लेकिन मेरे विचार में से एक में, उदाहरण के लिए:

<td><%=l job_application.created_at, :format => :default %></td> 

मैं उन अजीब आउटपुट मिलता है:

With locale = :en 
=> t, 30 o 2012 18:09:33 +0000 

With locale = :fr 
=> 30 o 2012 18:09:33 

ये गलत "प्रारूप" कहां से आते हैं?

मैं रेल्स 3.2.8 (पोस्टग्रेस्क्ल/मणि पीजी के साथ) का उपयोग कर रहा हूं, और I18n से संबंधित सब कुछ ठीक को छोड़कर ठीक काम करता है।

किसी भी मदद के लिए धन्यवाद!

+0

हाँ मेरे पास भी है ... (पोस्ट अपडेट) – Tricote

+0

आउटपुट प्रारूप के तारों से मेल खाता है सिवाय इसके कि स्ट्रिंग पार्ट्स को एक वर्ण में छोटा कर दिया जा रहा है? कोई विचार जहां से 'ओ' आता है? स्वरूपित संस्करण क्या होना चाहिए? –

+0

ठीक नहीं है, एकल चरित्र हमेशा महीने या दिन का पहला अक्षर नहीं होता है।उदाहरण के लिए: सोम, 01 अक्टूबर 2012 17:11:55 यूटीसी +00: 00 का अनुवाद इस प्रकार किया जाएगा: "01 एन 2012 17:11:55" – Tricote

उत्तर

11

मैं मैं अंत में यह समझ गए होंगे बाहर, इतने लंबे समय लेने के लिए खेद है।

रेल l सहायक केवल I18n.localize पर कॉल करता है। आप I18n.localize कोड के माध्यम से पता लगाने के हैं, तो आप here पहुंच जाएंगे:

format = format.to_s.gsub(/%[aAbBp]/) do |match| 
    case match 
    when '%a' then I18n.t(:"date.abbr_day_names",     :locale => locale, :format => format)[object.wday] 
    when '%A' then I18n.t(:"date.day_names",      :locale => locale, :format => format)[object.wday] 
    when '%b' then I18n.t(:"date.abbr_month_names",    :locale => locale, :format => format)[object.mon] 
    when '%B' then I18n.t(:"date.month_names",      :locale => locale, :format => format)[object.mon] 
    when '%p' then I18n.t(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format) if object.respond_to? :hour 
    end 
end 

तो localize सहायक दिनांक/समय के "रेशेदार" भागों के लिए strftime उपयोग नहीं करता है, यह अपने आप में यह करने के लिए कोशिश करता है । महीने और दिन के नामों के लिए अनुवाद (आपके YAML में सरणी के रूप में) जोड़ें और आपकी स्थानीय तिथियां और समय काम करना शुरू कर देना चाहिए।

तार आप अपने YAML में उन लोगों के अनुवाद सरणियों की जरूरत नहीं है, तो I18n.t(:"date.abbr_month_names") आप दे देंगे इस तरह:

"translation missing: en.date.abbr_month_names" 

और फिर I18n.localize इस तरह मूर्खतापूर्ण बातें कर खत्म हो जाएगा:

"translation missing: en.date.abbr_month_names"[10] 

यह String#[] का उपयोग Array#[] के बजाय करेगा और आप यादृच्छिक दिखने वाले सिंगल कैरेक्टर महीने और दिन के नामों के साथ समाप्त हो जाएंगे।

+3

मुझे समस्या मिली आपके उत्तर के लिए धन्यवाद! असल में, मेरे पास सभी "date.abbr_day_names"/"date.abbr_month_names"/... मेरी अनुवाद फ़ाइलों में कुंजी थी, लेकिन मैंने "दिनांक" शब्द (नामस्थान के बिना वैश्विक कुंजी) का अनुवाद करने के लिए "दिनांक" कुंजी को ओवरराइड कर दिया था! मुझे बहुत चालाक नहीं है ... आपके समय के लिए धन्यवाद! – Tricote

+0

"उपर्युक्त महीने और दिन के नामों के लिए अनुवाद (अपने YAML में सरणी के रूप में) जोड़ें और आपकी स्थानीय तिथियां और समय काम करना शुरू कर देना चाहिए।" क्या? कहा पे? मुझे खेद है कि मुझे यह नहीं मिला, क्या कोई उदाहरण दे सकता है? –

+2

यहां स्पष्ट किया गया: http://stackoverflow.com/a/20839490/1417223 –