Использование:

у иметь возможность переводить множественные строки в i18n в рельсы. Строка может быть:

You have 2 kids

или же

You have 1 kid

Я знаю, что могу использовать вспомогательный метод множественного числа, но я хочу встроить это в переводы i18n, чтобы в будущем мне не приходилось путаться с моими взглядами. Я прочитал это:count каким-то образом используется в переводах для множественного числа, но я не могу найти никаких реальных ресурсов о том, как это реализуется.

Обратите внимание, что я знаю, что могу передать переменную в строке перевода. Я также попробовал что-то вроде:

<%= t 'misc.kids', :kids_num => pluralize(1, 'kid') %>

Который работает хорошо, но имеет фундаментальную проблему той же идеи. Мне нужно указать строку'kid' во вспомогательном множественном числе. Я не хочу этого делать, потому что это приведет к проблемам в будущем. Вместо этого я хочу сохранить все в переводе и ничего в поле зрения.

Как я могу это сделать ?

 Spyros29 мая 2011 г., 08:53
Сорин, спасибо за ваш ответ, я просто не хочу использовать gettext для этого. Я думаю, что решение Zabba отлично подходит для моих нужд с i18n.
 Zabba29 мая 2011 г., 07:40
Обратите внимание, что «интерполятор» и кавычки"#{....}" не нужны в коде выше.
 sorin29 мая 2011 г., 08:50
у вас неправильный подход, потому что вы предполагаете, что множественные числа для других языков работают как на английском. Видетьмой ответ для правильного подхода.
 Luke W23 мая 2012 г., 21:02
Rails 3 обрабатывает более надежно, используя CLDR и интерполяционную переменную 'count':guides.rubyonrails.org/i18n.html#pluralization

Ответы на вопрос(7)

вается Tr8n.

Ваш код выше просто будет:

 <%= tr("You have {num || kid}", num: 1) %>

Вот и все. Не нужно извлекать ключи из кода и хранить их в пакетах ресурсов, не нужно реализовывать правила плюрализации для каждого языка. Tr8n поставляется с числовыми контекстными правилами для всех языков. Это также идет с полом, правилами, правилами списка и языковыми случаями.

Полное определение приведенного выше ключа перевода будет выглядеть так:

 <%= tr("You have {num:number || one: kid, other: kids}", num: 1) %>

Но поскольку мы хотим сэкономить пространство и время, num автоматически сопоставляется с числовыми правилами, и нет необходимости предоставлять все опции для значений правил. Tr8n поставляется с плюрализаторами и инфлекторами, которые сделают всю работу за вас на лету.

Перевод для вашего ключа на русский, будет просто:

 "У вас есть {num || ребенок, ребенка, детей}"

Кстати, ваш перевод был бы неточным на языках, которые имеют специфические для пола правила. Например, на иврите вам фактически нужно было бы указать как минимум 2 перевода для вашего примера, так как «вы» будет отличаться в зависимости от пола пользователя, просматривающего просмотр. Tr8n справляется с этим очень хорошо. Вот транслитерация еврейских переводов:

 "Yesh leha yeled ahad" with {context: {viewing_user: male, num: one}}
 "Yesh leha {num} yeladim" with {context: {viewing_user: male, num: other}}
 "Yesh lah yeled ahad" with {context: {viewing_user: female, num: one}}
 "Yesh lah {num} yeladim" with {context: {viewing_user: female, num: other}}

Таким образом, ваш единственный английский ключ, в этом случае, нуждается в 4 переводах. Все переводы выполняются в контексте - вам не нужно разбивать предложение. Tr8n имеет механизм для сопоставления одного ключа с несколькими переводами на основе языка и контекста - все это делается на лету.

Последняя вещь. Что если бы вам пришлось сделать часть подсчета жирным шрифтом? Это было бы просто:

<%= tr("You have [bold: {num || kid}]", num: 1, bold: "<strong>{$0}</strong>") %>

Просто на тот случай, если вы захотите переопределить ваш «жирный» позже - это будет очень легко - вам не нужно будет просматривать все ваши файлы YAML и изменять их - вы просто делаете это в одном месте.

Чтобы узнать больше, пожалуйста, посмотрите здесь:

https://github.com/tr8n/tr8n_rails_clientsdk

Раскрытие информации: я являюсь разработчиком и сопровождающим фреймворка Tr8n и всех его библиотек.

 doug6553622 мар. 2016 г., 22:15
Хотел бы я знать, для чего были отрицательные голоса, ответ, кажется, в порядке.

количество форм множественного числа зависит от языкадля английского - два, для румынского - 3, а для арабского - 6!

Если вы хотите иметь возможность правильно использовать множественные формы, вы должны использоватьgettext.

Для Ruby и rails вы должны проверить этоhttp://www.yotabanana.com/hiki/ruby-gettext-howto-rails.html

 Nikos D03 нояб. 2011 г., 14:34
Сорин, это то, о чем я тоже думал, но, похоже, это можно решить, следуя формату CLDR (unicode.org/repos/cldr-tmp/trunk/diff/supplemental/...). Я ошибаюсь?
 sorin03 нояб. 2011 г., 15:01
Вы правы и спасибо за добавление ссылки CLDR.
 gnasher72920 июл. 2015 г., 18:24
Также есть 1-й, 2-й, 3-й, 4-й, 11-й, 12-й и 13-й, но 21-й, 22-й, 23-й и так далее.

тчика. Видетьhttp://guides.rubyonrails.org/i18n.html#pluralization

# in view
t('actors', :count => @movie.actors.size)

# locales file, i.e. config/locales/en.yml
en:
  actors:
    one: Actor
    other: Actors
Решение Вопроса

en.yml :

en:
  misc:
    kids:
      zero: no kids
      one: 1 kid
      other: %{count} kids

В представлении:

You have <%= t('misc.kids', :count => 4) %>

Обновленный ответ для языков с множественным множественным числом (протестировано с Rails 3.0.7):

файл config/initializers/pluralization.rb:

require "i18n/backend/pluralization" 
I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization)

файл config/locales/plurals.rb:

{:ru => 
  { :i18n => 
    { :plural => 
      { :keys => [:one, :few, :other],
        :rule => lambda { |n| 
          if n == 1
            :one
          else
            if [2, 3, 4].include?(n % 10) && 
               ![12, 13, 14].include?(n % 100) && 
               ![22, 23, 24].include?(n % 100)

              :few 
            else
              :other 
            end
          end
        } 
      } 
    } 
  } 
}

#More rules in this file: https://github.com/svenfuchs/i18n/blob/master/test/test_data/locales/plurals.rb
#(copy the file into `config/locales`)

файл config/locales/en.yml:

en:
  kids:
    zero: en_zero
    one: en_one
    other: en_other

файл config/locales/ru.yml:

ru:
  kids:
    zero: ru_zero
    one: ru_one
    few: ru_few
    other: ru_other

Контрольная работа:

$ rails c
>> I18n.translate :kids, :count => 1
=> "en_one"
>> I18n.translate :kids, :count => 3
=> "en_other"
>> I18n.locale = :ru
=> :ru
>> I18n.translate :kids, :count => 1
=> "ru_one"
>> I18n.translate :kids, :count => 3
=> "ru_few"  #works! yay! 
>> I18n.translate :kids, :count => 5
=> "ru_other"  #works! yay! 
 sorin29 мая 2011 г., 08:55
Извините, но это не работает со многими языками. Плюрализация действительно сложная, см.translate.sourceforge.net/wiki/l10n/pluralforms В связи с этим я считаю, что мой ответ более уместен.
 Zabba29 мая 2011 г., 19:10
@sorin, обновил мой ответ, чтобы использовать несколько правил множественного числа.
 Spyros29 мая 2011 г., 08:51
отличное решение, спасибо!
 sorin29 мая 2011 г., 19:18
Это нормально, но теперь у вас есть новая работа на полную ставку, чтобы поддерживать словарь множественного числа !.
 Zabba03 янв. 2013 г., 18:15
@ThePablick, да, поскольку файлы в каталоге '/ initializer' загружаются только один раз - при запуске http-сервера.

что русскоязычные программисты на Ruby on Rails найдут это. Просто хочу поделиться своей очень точной русской формулой плюрализации. Основано наСпецификации Юникода, Вот содержимоеconfig/locales/plurals.rb только файл, все остальное должно быть сделано так же, как в ответе выше.

{:ru => 
  { :i18n => 
    { :plural => 
      { :keys => [:zero, :one, :few, :many],
        :rule => lambda { |n| 
          if n == 0
            :zero
          elsif
            ( ( n % 10 ) == 1 ) && ( ( n % 100 != 11 ) )
            # 1, 21, 31, 41, 51, 61...
            :one
          elsif
            ( [2, 3, 4].include?(n % 10) \
            && ![12, 13, 14].include?(n % 100) )
            # 2-4, 22-24, 32-34...
            :few
          elsif ( (n % 10) == 0 || \
            ![5, 6, 7, 8, 9].include?(n % 10) || \
            ![11, 12, 13, 14].include?(n % 100) )
            # 0, 5-20, 25-30, 35-40...
            :many
          end
        } 
      } 
    } 
  } 
}

Носителям языка могут понравиться такие случаи, как111 а также121, И вот результаты теста:

ноль: 0 запросов / куриц / яблокодин: 1 запрос / курица / яблоконесколько: 3 запроса / курицы / яблокамного: 5 запросов / куриц / яблокone: 101 запрос / курица / яблоконемногие: 102 запроса / курицы / яблокамного: 105 запросов / куриц / яблокмного: 111 запросов / куриц / яблокмного: 119 запросов / куриц / яблокone: 121 запрос / курица / яблоконемногие: 122 запроса / курицы / яблокамного: 125 запросов / куриц / яблок

Спасибо за первоначальный ответ!

 sashaegorov30 авг. 2016 г., 17:59
@silverdr Я исправил имя файла в ответе. Спасибо за чаевые!
 silverdr17 авг. 2016 г., 13:31
Другой ответ, на который вы ссылались, поместил его в другой файл. Таким образом, при таком подходе ваш контент должен перейти наconfig/locales/plurals.rb скорее, чемconfig/initializers/pluralization.rb

я в config / locales / как множественное число.rb и другие, отличные от имени локали (ru.rb, pl.rb и т. Д.), Они не будут работать. Вы должны переименовать правила файла в locale.rb или изменить метод в файле /lib/redmine/i18n.rb

def init_translations(locale)
  locale = locale.to_s
  paths = ::I18n.load_path.select {|path| File.basename(path, '.*') == locale}
  load_translations(paths)
  translations[locale] ||= {}
end

и если у вас есть старый Redmine, добавьте

module Implementation
        include ::I18n::Backend::Base
        **include ::I18n::Backend::Pluralization**
английский

работает из коробки

en.yml:

en:
  kid:
    one: '1 kid'
    other: '%{count} kids'

Использование (вы можете пропустить I18n в файле просмотра, конечно):

> I18n.t :kid, count: 1
 => "1 kid"

> I18n.t :kid, count: 3
 => "3 kids"
Русский (и другие языки с множественными формами множественного числа)

устанавливатьРельсы-18n жемчужина и добавить переводы к вашему.yml файлы как впример:

ru.yml:

ru:
  kid:
    zero: 'нет детей'
    one: '%{count} ребенок'
    few: '%{count} ребенка'
    many: '%{count} детей'
    other: 'дети'

Использование:

> I18n.t :kid, count: 0
 => "нет детей"

> I18n.t :kid, count: 1
 => "1 ребенок"

> I18n.t :kid, count: 3
 => "3 ребенка"

> I18n.t :kid, count: 5
 => "5 детей"

> I18n.t :kid, count: 21
 => "21 ребенок"

> I18n.t :kid, count: 114
 => "114 детей"

> I18n.t :kid, count: ''
 => "дети"

Ваш ответ на вопрос