i18n

Chcę być w stanie przetłumaczyć wiele ciągów w i18n w rails. Łańcuch może być :

You have 2 kids

Lub

You have 1 kid

Wiem, że mogę użyć metody pluralize helper, ale chcę osadzić to w tłumaczeniach i18n tak, że nie muszę bałagan z moimi poglądami w dowolnym momencie w przyszłości. Czytałem, że :count jest jakoś używany w tłumaczeniach dla liczby mnogiej, ale nie mogę znaleźć żadnych realnych zasobów na temat tego, jak to jest realizowane.

Zauważ, że wiem, że mogę przekazać zmienną w tłumaczenie ciąg. Próbowałem też czegoś takiego:

<%= t 'misc.kids', :kids_num => pluralize(1, 'kid') %>
Który działa dobrze, ale ma fundamentalny problem tej samej idei. Muszę podać łańcuch 'kid' w helperze pluralize. Nie chcę tego robić, ponieważ doprowadzi to do postrzegania problemów w przyszłości. Zamiast tego chcę zachować wszystko w tłumaczeniu i nic w widoku. Jak mogę to zrobić ?
Author: installero, 2011-05-29

7 answers

Spróbuj tego:

en.yml :

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

W widoku:

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

Zaktualizowana odpowiedź dla języków z wieloma pluralizacjami (testowana za pomocą Rails 3.0.7):

Plik config/initializers/pluralization.rb:

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

Plik 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`)

Plik config/locales/en.yml:

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

Plik config/locales/ru.yml:

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

Test :

$ 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! 
 161
Author: Zabba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-29 17:16:11

Mam nadzieję, że rosyjskojęzyczni Programiści Ruby on Rails znajdą to. Chcę tylko podzielić się moją własną, bardzo precyzyjną formułą pluralizacji Rosyjskiej. Opiera się na specyfikacji Unicode . Tutaj jest tylko zawartość pliku config/locales/plurals.rb, Wszystko inne powinno być zrobione tak samo jak w odpowiedzi powyżej.

{: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
        } 
      } 
    } 
  } 
}

Native speakers mogą korzystać z takich przypadków, jak 111 i 121. A tu wyniki testu:

  • zero: 0]}
  • 1: 1]}
  • kilka: 3 запроса/курицы/яблока
  • Wiele: 5]}
  • 1: 101 запрос/курица/яблоко
  • kilka: 102 запроса/курицы/яблока
  • wiele: 105 запросов/куриц/яблок
  • wiele: 111 запросов/куриц/яблок
  • wiele: 119 запросов/куриц/яблок
  • 1: 121 запрос/курица/яблоко
  • kilka: 122 запроса/курицы/яблока
  • wiele: 125 запросов/куриц/яблок

Dzięki za wstępną odpowiedź!

 31
Author: sashaegorov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-30 10:22:41

Po pierwsze, pamiętaj, że liczba mnoga zależy od języka, dla angielskiego są dwie, dla rumuńskiego są 3, a dla arabskiego jest 6 !.

Aby móc prawidłowo używać form liczby mnogiej musisz użyć gettext.

Dla Ruby i rails powinieneś to sprawdzić http://www.yotabanana.com/hiki/ruby-gettext-howto-rails.html

 11
Author: sorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-29 06:07:16

Rails 3 radzi sobie z tym solidnie ze zmienną interpolacji CLDR I count. Zobacz 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
 8
Author: Luke W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-23 19:06:26

Istnieje alternatywa dla uciążliwego podejścia i18n. Rozwiązanie nazywa się Tr8n.

Twój powyższy kod będzie po prostu:

 <%= tr("You have {num || kid}", num: 1) %>
To wszystko. Nie ma potrzeby wyodrębniania kluczy z kodu i utrzymywania ich w pakietach zasobów, nie ma potrzeby implementowania reguł pluralizacji dla każdego języka. Tr8n zawiera reguły kontekstu numerycznego dla wszystkich języków. Zawiera również reguły dotyczące płci, Zasady listy i przypadki językowe.

Pełna definicja powyższego tłumaczenia klucz faktycznie wyglądałby tak:

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

Ale ponieważ chcemy zaoszczędzić miejsce i czas, num jest automatycznie mapowane do reguł liczbowych i nie ma potrzeby podawania wszystkich opcji dla wartości reguł. Tr8n jest wyposażony w pluralizatory i inflatory, które wykonają pracę za Ciebie w locie.

Tłumaczenie Twojego klucza w języku rosyjskim brzmiałoby po prostu:

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

Przy okazji, Twoje tłumaczenie byłoby niedokładne w językach, w których obowiązują reguły dotyczące płci. Na przykład w języku hebrajskim, w rzeczywistości musisz podać co najmniej 2 tłumaczenia dla swojego przykładu, ponieważ "ty" będzie różny w zależności od płci oglądającego użytkownika. Tr8n radzi sobie bardzo dobrze. Oto Transliteracja przekładów hebrajskich:

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

Więc Twój pojedynczy klucz angielski, w tym przypadku, wymaga 4 tłumaczeń. Wszystkie tłumaczenia są wykonywane w kontekście - nie musisz łamać zdania. Tr8n posiada mechanizm mapowania jednego klucza do wielu tłumaczeń w oparciu o język i kontekst - wszystko odbywa się na leć.

Ostatnia rzecz. A co, jeśli będziesz musiał zrobić część z liczenia odważną? Byłoby po prostu:
<%= tr("You have [bold: {num || kid}]", num: 1, bold: "<strong>{$0}</strong>") %>

Na wypadek, gdybyś chciał później przedefiniować swoje "pogrubienie" - byłoby to bardzo proste - nie będziesz musiał przeglądać wszystkich plików YAML i zmieniać ich - po prostu robisz to w jednym miejscu.

Aby dowiedzieć się więcej, zajrzyj tutaj:

Https://github.com/tr8n/tr8n_rails_clientsdk

Ujawnienie: jestem deweloperem i opiekunem tr8n framework i wszystkich jego biblioteki.

 2
Author: Michael Berkovich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-24 22:25:55

Angielski

It just works out of the box

En.yml :

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

Użycie (można oczywiście pominąć I18n w pliku widoku):

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

> I18n.t :kid, count: 3
 => "3 kids"

Rosyjski (i inne języki z wieloma formami liczby mnogiej)

Zainstaluj rails-18N gem i dodaj tłumaczenia do plików .yml jak w przykładzie :

Ru.yml :

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

Użycie:

> 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: ''
 => "дети"
 0
Author: installero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-17 23:13:11

O Redmine. Jeśli skopiujesz reguły pliku liczby mnogiej w config / locales / jako liczby mnogie.rb i inne nie takie same jak nazwy miejscowe (ru.rb, pl.rb .. itp.) te nie działają. Musisz zmienić nazwę reguł plików na 'locale'.rb lub zmień metodę w pliku/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

A jeśli masz starszy redmine, dodaj

module Implementation
        include ::I18n::Backend::Base
        **include ::I18n::Backend::Pluralization**
 0
Author: Vladimir Kovalev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 09:44:34