2012-01-09 14 views
18

एक शब्द pluralizing सरल है:बहुल कैसे करें "एन ऑब्जेक्ट/ऑब्जेक्ट्स हैं/हैं"?

pluralize(@total_users, "user") 

लेकिन क्या होगा अगर मैं प्रिंट करना चाहते हैं "वहाँ है/हैं उपयोगकर्ता N/उपयोगकर्ताओं":

हैं 0 उपयोगकर्ताओं
नहीं है 1 उपयोगकर्ता
रहे हैं 2 उपयोगकर्ताओं

, यानी, कैसे वाक्य को बहुवचन करने के लिए?

उत्तर

29

आप इसके लिए एक कस्टम बदलाव जोड़ सकते हैं। डिफ़ॉल्ट रूप से, रेल inflections.rbconfig/initializers जोड़ देंगे। वहाँ आप जोड़ सकते हैं:

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.irregular "is", "are" 
end 

फिर आप pluralize(@total_users, "is") उपयोग करने के लिए वापस जाने के लिए/है उपयोगकर्ता/उपयोगकर्ताओं के रूप में ही नियमों का उपयोग कर रहे हैं सक्षम हो जाएगा।

EDIT: आपने इस वाक्य को स्पष्ट किया कि वाक्य को बहुवचन कैसे करें। सामान्य रूप से ऐसा करना अधिक कठिन होता है, लेकिन यदि आप इसे करना चाहते हैं, तो आपको dive into NLP करना होगा।

टिप्पणी पता चलता है, आप I18n साथ कुछ कर सकते हैं अगर आप केवल कुछ वाक्यों के साथ क्या करना चाहते हैं, तो आप कुछ इस तरह बना सकते हैं:

def pluralize_sentence(count, i18n_id, plural_i18n_id = nil) 
    if count == 1 
     I18n.t(i18n_id, :count => count) 
    else 
     I18n.t(plural_i18n_id || (i18n_id + "_plural"), :count => count) 
    end 
    end 

    pluralize_sentence(@total_users, "user_count") 

और config/locales/en.yml में:

en: 
    user_count: "There is %{count} user." 
    user_count_plural: "There are %{count} users." 
+0

दरअसल से अनुकूलित, मुझे लगता है कि सवाल यह है कि उपयोगकर्ताओं की संख्या को जोड़ के, अर्थात जो कुछ i18n और pluralisation उदा के बीच एक मिश्रण की तरह लग रहे हो सकता है के बारे में अधिक है 'pluralize (@total_users," $ 1 उपयोगकर्ता है ") '... जो स्पष्ट रूप से दुर्भाग्य से विफल हो जाएगा :) – Pierre

+0

[रेल के साथ Agile विकास, चौथा संस्करण] (http://pragprog.com/book/rails4/agile- वेब-डेवलपमेंट-साथ-रेल), पृष्ठ 217, वे त्रुटि संदेशों को बहुल करने के लिए वाईएएमएल फ़ाइल में 'एक' और' अन्य 'का उपयोग करते हैं। इसका उपयोग पृष्ठ त्रुटियों को प्रदर्शित करने के लिए किसी भी अतिरिक्त कोड के बिना किया जाता है, इसलिए इसे सीधे 't() 'के साथ काम करना चाहिए। – l0b0

+0

इस समाधान के साथ मैंने एक समस्या आई है यदि आपके पास एक मॉडल है जो 'हैं' में समाप्त होता है (मेरे मामले में विस्तारित कर) आपके सभी कोड ब्रेक – Doug

4

मुझे लगता है कि मार्टिन गॉर्डन के जवाब का पहला हिस्सा बहुत अच्छा है।

वैकल्पिक रूप से, यह एक तरह से गंदा है, लेकिन आप हमेशा ही तर्क अपने आप को लिख सकते हैं:

"There #{@users.size == 1 ? 'is' : 'are'} #{@users.size} user#{'s' unless @users.size == 1}." 
5

यह शायद सबसे अच्छा रेल i18n pluralization सुविधाओं से आच्छादित है। http://guides.rubyonrails.org/i18n.html#pluralization

I18n.backend.store_translations :en, :user_msg => { 
    :one => 'There is 1 user', 
    :other => 'There are %{count} users' 
} 
I18n.translate :user_msg, :count => 2 
# => 'There are 2 users'