i18n বহুবচন


89

আমি রেলগুলিতে i18n তে বহুবচনযুক্ত স্ট্রিংগুলি অনুবাদ করতে সক্ষম হতে চাই। একটি স্ট্রিং হতে পারে:

You have 2 kids

বা

You have 1 kid

আমি জানি যে আমি বহুবিধ সাহায্যকারী পদ্ধতিটি ব্যবহার করতে পারি, তবে আমি এটি আই 18 টি অনুবাদগুলিতে এম্বেড করতে চাই যাতে ভবিষ্যতে আমার যে কোনও পয়েন্টে আমার মতামত নিয়ে ঝামেলা পোহাতে না হয়। আমি পড়েছি যে :countএটি কোনওভাবে বহুবচন অনুবাদে ব্যবহৃত হয়, তবে কীভাবে এটি বাস্তবায়িত হয় তার কোনও সত্যিকারের উত্স খুঁজে পাচ্ছি না।

লক্ষ্য করুন যে আমি জানি যে আমি একটি অনুবাদ স্ট্রিংয়ে একটি ভেরিয়েবল পাস করতে পারি। আমিও এরকম কিছু চেষ্টা করেছি:

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

যা সূক্ষ্মভাবে কাজ করে তবে একই ধারণার একটি মৌলিক সমস্যা রয়েছে। আমার 'kid'বহুবচন হেল্পারে স্ট্রিং নির্দিষ্ট করতে হবে । আমি এটি করতে চাই না কারণ এটি ভবিষ্যতে সমস্যাগুলি দেখায়। পরিবর্তে আমি সমস্ত কিছু অনুবাদে এবং কিছুই দেখতে চাই না।

আমি এটা কিভাবে করবো ?


4
নোট করুন যে "#{....}"উপরের কোডে "ইন্টারপোলটার" এবং উদ্ধৃতিগুলি প্রয়োজনীয় নয়।
জাব্বা

4
আপনার একটি ভুল দৃষ্টিভঙ্গি রয়েছে কারণ আপনি ধরে নিচ্ছেন যে অন্যান্য ভাষার বহুবচন ইংরেজির মতো কাজ করছে। একটি সঠিক পদ্ধতির জন্য আমার উত্তর দেখুন ।
29:11

সোরিন, আপনার উত্তরের জন্য আপনাকে ধন্যবাদ, আমি কেবল এইটির জন্য গেটেক্সট ব্যবহার করতে চাই না। আমি মনে করি আই 18n দিয়ে আমার প্রয়োজনের জন্য জাব্বার সমাধানটি দুর্দান্ত।
স্পাইরোস

রেল 3 সিএলডিআর এবং 'কাউন্ট' ইন্টারপোলেশন ভেরিয়েবলটি আরও দৃly়তার সাথে পরিচালনা করে: গাইড.আরবিউনরেইলস.আর
লুক ডাব্লু

কয়েক বছর পর, কিন্তু আপনি একটি অনুবাদ STRING 'ছাগলছানা' উপর ব্যবহার করতে পারেন - যাতে আপনি আছে: <%= t 'misc.kids', :kids_num => pluralize(1, t('kid')) %>। সম্ভবত এটি ২০১১ (!) এ কাজ করেনি তবে এটি এখন অবশ্যই 5.2.2 জেলগুলিতে রয়েছে
জার্ভিস জনসন

উত্তর:


176

এটা চেষ্টা কর:

en.yml :

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

একটি দৃষ্টিতে:

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

একাধিক বহুবচনকরণের সাথে ভাষার জন্য আপডেট উত্তর (রেল 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! 

দুঃখিত তবে এটি প্রচুর ভাষার সাথে কাজ করে না। Pluralization সত্যিই জটিল, দেখতে translate.sourceforge.net/wiki/l10n/pluralforms ফলে আমি মনে করি যে আমার উত্তর আরো উপযুক্ত।
29:56

4
@ সোরিন, একাধিক বহুবচন বিধি ব্যবহার করতে আমার উত্তর আপডেট করেছেন।
জাব্বা

4
ঠিক আছে, তবে বহুত্বকরণের অভিধান বজায় রাখতে এখন আপনার একটি নতুন ফুলটাইম কাজ রয়েছে!
সোরিন

এটা অসাধারণ! %{count}কাজ করার জন্য আমাকে পুরো ব্লকের চারপাশে অর্থাত ব্যবহার করতে হয়েছিল। one: "%{count} kid"
বরখাস্ত

4
@ দ্যাপাব্লিক, হ্যাঁ, যেহেতু '/ ইনিশিয়ালাইজার' ডিরেক্টরিতে ফাইলগুলি একবারে লোড করা হয় - HTTP সার্ভার প্রারম্ভকালে।
জাবাবা

37

আমি আশা করি রেল প্রোগ্রামিংকারীদের উপর রাশিয়ান ভাষী রুবি এটির সন্ধান করতে পারে। কেবল আমার নিজের খুব সুনির্দিষ্ট রাশিয়ান বহুবচন সূত্রটি ভাগ করতে চাই। এটি ইউনিকোড স্পেসের উপর ভিত্তি করে । এখানে 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 запросов / куриц / яблок
  • এক: 101 запрос / курица / яблоко
  • কয়েকটি: 102 запроса / курицы / яблока
  • অনেক: 105 запросов / куриц / яблок
  • অনেকগুলি: 111 запросов / куриц / яблок яблок
  • অনেক: 119 запросов / куриц / яблок
  • এক: 121 запрос / курица / яблоко
  • কয়েকটি: 122 запроса / курицы / яблока
  • অনেক: 125 запросов / куриц / яблок

প্রাথমিক উত্তরের জন্য ধন্যবাদ!


4
আপনি যে অন্য উত্তরটি উল্লেখ করেছেন, এটি একটি আলাদা ফাইলে রেখেছেন। সুতরাং সেই পদ্ধতির সাথে আপনার বিষয়বস্তুর config/locales/plurals.rbপরিবর্তে যাওয়া উচিতconfig/initializers/pluralization.rb
সিলভারড্রেড

@ সিলভার্ডার উত্তরে আমি ফাইলের নাম স্থির করেছি। বখশিশের জন্য ধন্যবাদ!
শাশায়েরোভ

11

প্রথমত, মনে রাখবেন যে বহুবচন রূপগুলি ভাষার উপর নির্ভর করে , ইংরেজির জন্য দুটি আছে, রোমানিয়ার জন্য 3 আছে এবং আরবিতে 6 রয়েছে!

আপনি যদি ব্যবহার করতে চান তবে বহুবচন রূপগুলি সঠিকভাবে ব্যবহার করতে সক্ষম হতে চান gettext

রুবি এবং রেলগুলির জন্য আপনার এই http://www.yotabanana.com/hiki/ruby-gettext-howto-rails.html চেক করা উচিত


4
সোরিন, এটি আমিও ভাবছিলাম কিন্তু এটি সিএলডিআর ফর্ম্যাট ( unicode.org/repos/cldr-tmp/trunk/diff/supplemental/… ) অনুসরণ করেই সমাধান হয়ে গেছে বলে মনে হচ্ছে । আমি কি ভূল?
নিকস ডি

এছাড়াও 1 ম, দ্বিতীয়, তৃতীয়, চতুর্থ, 11 তম, 12 এবং 13 তম কিন্তু 21, 22, 23 তম এবং আরও রয়েছে।
gnasher729

8

রেল 3 সিএলডিআর বিবেচনার সাথে আন্তঃপোলেশন ভেরিয়েবলের সাথে এই দৃ rob়তার সাথে পরিচালনা করে। Http://guides.rubyonrails.org/i18n.html#pluraization দেখুন

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

# locales file, i.e. config/locales/en.yml
en:
  actors:
    one: Actor
    other: Actors

5

ভারী আই 18n পদ্ধতির আসলে একটি বিকল্প রয়েছে। সমাধানটিকে ট্র 8 এন বলা হয়।

আপনার উপরের কোডটি সহজভাবে হবে:

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

এটাই. আপনার কোড থেকে আপনার কীগুলি বের করে নেওয়ার দরকার নেই এবং এগুলিকে সংস্থান বান্ডলে বজায় রাখতে হবে না, প্রতিটি ভাষার জন্য বহুবচন বিধি প্রয়োগ করার দরকার নেই। Tr8n সমস্ত ভাষার জন্য সংখ্যার প্রসঙ্গ নিয়ম নিয়ে আসে। এটি লিঙ্গ বিধি, তালিকা বিধি এবং ভাষার ক্ষেত্রেও আসে।

উপরোক্ত অনুবাদ কীটির সম্পূর্ণ সংজ্ঞাটি আসলে এর মতো দেখাবে:

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

তবে যেহেতু আমরা স্থান এবং সময় বাঁচাতে চাই, সংখ্যাটি স্বয়ংক্রিয়ভাবে সংখ্যার নিয়মে ম্যাপ করা হয় এবং নিয়মের মানগুলির জন্য সমস্ত বিকল্প সরবরাহ করার দরকার নেই। 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 ফ্রেমওয়ার্ক এবং এর সমস্ত লাইব্রেরির বিকাশকারী এবং রক্ষণাবেক্ষণকারী।


4
আশা করি আমি জানতাম ডাউনভোটগুলি কীসের জন্য ছিল, উত্তরটি ঠিক আছে বলে মনে হচ্ছে।
ডগ 65536

5

ইংরেজি

এটি কেবল বাক্সের বাইরে কাজ করে

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:
  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: ''
 => "дети"

0

রেডমাইন সম্পর্কে। আপনি যদি কনফিগারেশন / লোকাল / বহুবচন.আরবি হিসাবে বহুবচন ফাইলের বিধিগুলি অনুলিপি করেন এবং লোকেলের নাম হিসাবে একই নয় (রু.আরবি, pl.rb .. ইত্যাদি) এগুলি কাজ করে না। আপনার অবশ্যই ফাইলের নিয়মের নাম 'স্থানীয়'.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

এবং আপনার যদি পুরানো redines থাকে, যোগ করুন

module Implementation
        include ::I18n::Backend::Base
        **include ::I18n::Backend::Pluralization**
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.