2012-01-09 34 views

Trả lời

29

Bạn có thể thêm một tùy chỉnh cho nó. Theo mặc định, Rails sẽ thêm inflections.rb vào config/initializers. Ở đó bạn có thể thêm:

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

Sau đó, bạn có thể sử dụng pluralize(@total_users, "is") để trả lại đang/đang sử dụng quy tắc tương tự như người dùng/người dùng.

EDIT: Bạn đã làm rõ câu hỏi về cách đa định hóa câu. Điều này là khó khăn hơn nhiều để làm chung, nhưng nếu bạn muốn làm điều đó, bạn sẽ phải dive into NLP.

Như nhận xét gợi ý, bạn có thể làm điều gì đó với i18n nếu bạn chỉ muốn làm điều đó với một vài câu, bạn có thể xây dựng một cái gì đó như thế này:

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") 

Và trong config/locales/en.yml:

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

Trên thực tế, tôi nghĩ rằng câu hỏi là thêm về cách suy số lượng người dùng, ví dụ: một cái gì đó mà có thể trông giống như một sự pha trộn giữa i18n và pluralisation ví dụ 'số nhiều (@total_users," có $ 1 người dùng ")' ... rõ ràng sẽ thất bại thảm hại :) – Pierre

+0

Trong [Phát triển nhanh với Rails, Ấn bản thứ tư] (http://pragprog.com/book/rails4/agile- web-development-with-rails), trang 217, họ sử dụng 'one' và' other' trong tập tin YAML để thực hiện các thông báo lỗi. Điều này được sử dụng mà không cần thêm bất kỳ mã nào để hiển thị các lỗi trang, do đó nó sẽ hoạt động trực tiếp với 't()'. – l0b0

+0

Một vấn đề tôi gặp phải với giải pháp này là nếu bạn có một mô hình kết thúc bằng 'là' (trong trường hợp của tôi ExtendedCare), tất cả các ngắt mã của bạn – Doug

4

Tôi nghĩ phần đầu tiên của câu trả lời của Martin Gordon là khá tốt.

Ngoài ra, nó là loại lộn xộn nhưng bạn luôn có thể chỉ cần viết logic mình:

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

Đây có lẽ là tốt nhất bao phủ bởi các tính năng Rails i18n pluralization. Phỏng theo 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' 
Các vấn đề liên quan