diff --git a/README.markdown b/README.markdown index 86452a3..c6448f4 100644 --- a/README.markdown +++ b/README.markdown @@ -91,7 +91,7 @@ Humanize.format(0.001) => "zero point zero zero one" ```ruby Humanize.configure do |config| - config.locale = :en # [:en, :es, :fr, :'fr-CH', :tr, :az, :de, :id, :th, :ru, :pt, :ms, :jp, :vi, :'zh-tw'], default: :en + config.locale = :en # [:en, :es, :fr, :'fr-CH', :tr, :az, :de, :id, :th, :ru, :pt, :ms, :jp, :vi, :'zh-tw', :ar], default: :en config.decimals_as = :digits # [:digits, :number], default: :digits end ``` @@ -145,6 +145,7 @@ Currently supported locales: * Japanese `:jp` * Vietnamese `:vi` * Traditional Chinese `:zh-tw` +* Arabic `:ar` ## Testing diff --git a/lib/humanize/locales.rb b/lib/humanize/locales.rb index a340d38..ad1c00b 100644 --- a/lib/humanize/locales.rb +++ b/lib/humanize/locales.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module Humanize - %w[az de en es fr fr_ch id ms pt ru th tr jp vi zh_tw].each do |locale| + %w[ar az de en es fr fr_ch id ms pt ru th tr jp vi zh_tw].each do |locale| autoload locale.split('_').map(&:capitalize).join.to_sym, "humanize/locales/#{locale}.rb" end end diff --git a/lib/humanize/locales/ar.rb b/lib/humanize/locales/ar.rb new file mode 100644 index 0000000..41e22b9 --- /dev/null +++ b/lib/humanize/locales/ar.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require_relative 'constants/ar' + +module Humanize + class Ar + def humanize(number) + iteration = 0 + parts = [] + use_and = false + until number.zero? + number, remainder = number.divmod(1000) + unless remainder.zero? + if iteration.zero? && remainder < 100 + use_and = true + else + add_grouping(parts, use_and, iteration) + end + + parts << SUB_ONE_GROUPING[remainder] + end + + iteration += 1 + end + + # parts + correct_lots(parts) + end + + private + + def conjunction(parts, use_and) + return '' if parts.empty? + + use_and ? ' و' : ' و' + end + + def add_grouping(parts, use_and, iteration) + grouping = LOTS[iteration] + + return unless grouping + + parts << "#{grouping}#{conjunction(parts, use_and)}" + end + + def correct_lots(parts) + parts = parts.reverse.join(' ').squeeze(' ') + SPECIFIC_LOTS.each do |wrong, right| + parts = parts.sub(wrong, right) if parts.include?(wrong) + end + + parts.split.reverse + end + end +end diff --git a/lib/humanize/locales/constants/ar.rb b/lib/humanize/locales/constants/ar.rb new file mode 100644 index 0000000..5928788 --- /dev/null +++ b/lib/humanize/locales/constants/ar.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Humanize + class Ar + INFINITY = 'لا نهاية' + UNDEFINED = 'غير معرف' + NEGATIVE = 'سالب' + POINT = 'فاصل' + LOTS = [nil, 'ألف', 'مليون', 'مليار', 'تريليون', 'كوادريليون', 'كوينتليون', 'سكستيليون', 'سبتيليون', 'أوكتيليون', 'نونيليون', 'ديشيليون', 'أونديسيليون', 'دوديسيليون', 'تريديسيليون', 'كواتورديسيليون', 'كوينديسيليون', 'سكستيديسيليون', 'سبتنديسيليون', 'أوكتوديسيليون', 'نوفيمديسيليون', 'فيجينتيليون', 'أونفيجينتيليون', 'ديوفيجينتيليون', 'تريفجينتيليون', 'كواتورفيجينتيليون', 'كوينفيجينتيليون', 'سكستفيجينتيليون', 'سبتنفيجينتيليون', 'أوكتوفيجينتيليون', 'نوفيمفيجينتيليون', 'تريجينتيليون', 'أونتريجينتيليون', 'ديوتريجينتيليون', 'تريستريجينتيليون', 'كواتورتريجينتيليون', 'كوينتريجينتيليون', 'سكستريجينتيليون', 'سبتنترجينتيليون', 'أوكتوترجينتيليون', 'نوفيمترجينتيليون', 'كوادراجينتيليون', 'أونكوادراجينتيليون', 'ديوكوادراجينتيليون', 'تريكوادراجينتيليون', 'كواتوركوادراجينتيليون', 'كوينكوادراجينتيليون', 'سيزكوادراجينتيليون', 'سبتنكوادراجينتيليون', 'أوكتوكوادراجينتيليون', 'نوفيمكوادراجينتيليون', 'كوينكواجينتيليون'].freeze + + SPECIFIC_LOTS = [ + ['واحد ألف', 'ألف'], ['اثنان ألف', 'ألفان'], ['ثلاثة ألف', 'ثلاثة آلاف'], ['أربعة ألف', 'أربعة آلاف'], ['خمسة ألف', 'خمسة آلاف'], ['ستة ألف', 'ستة آلاف'], ['سبعة ألف', 'سبعة آلاف'], ['ثمانية ألف', 'ثمانية آلاف'], ['تسعة ألف', 'تسعة آلاف'], ['عشرة ألف', 'عشرة آلاف'], ['واحد مليون', 'مليون'], ['اثنان مليون', 'مليونان'], ['ثلاثة مليون', 'ثلاثة ملايين'], ['أربعة مليون', 'أربعة ملايين'], ['خمسة مليون', 'خمسة ملايين'], ['ستة مليون', 'ستة ملايين'], ['سبعة مليون', 'سبعة ملايين'], ['ثمانية مليون', 'ثمانية ملايين'], ['تسعة مليون', 'تسعة ملايين'], ['عشرة مليون', 'عشرة ملايين'], ['واحد مليار', 'مليار'], ['اثنان مليار', 'ملياران'], ['ثلاثة مليار', 'ثلاثة مليارات'], ['أربعة مليار', 'أربعة مليارات'], ['خمسة مليار', 'خمسة مليارات'], ['ستة مليار', 'ستة مليارات'], ['سبعة مليار', 'سبعة مليارات'], ['ثمانية مليار', 'ثمانية مليارات'], ['تسعة مليار', 'تسعة مليارات'], ['تريليون واحد', 'تريليون'], ['اثنان تريليون', 'تريليونان'], ['ثلاثة تريليون', 'ثلاثة تريليونات'], ['أربعة تريليون', 'أربعة تريليونات'], ['خمسة تريليون', 'خمسة تريليونات'], ['ستة تريليون', 'ستة تريليونات'], ['سبعة تريليون', 'سبعة تريليونات'], ['ثمانية تريليون', 'ثمانية تريليونات'], ['تسعة تريليون', 'تسعة تريليونات'] + ].freeze + + SUB_ONE_GROUPING = ['صفر', 'واحد', 'اثنان', 'ثلاثة', 'أربعة', 'خمسة', 'ستة', 'سبعة', 'ثمانية', 'تسعة', 'عشرة', 'أحد عشر', 'اثنا عشر', 'ثلاثة عشر', 'أربعة عشر', 'خمسة عشر', 'ستة عشر', 'سبعة عشر', 'ثمانية عشر', 'تسعة عشر', 'عشرون', 'واحد وعشرون', 'اثنان وعشرون', 'ثلاثة وعشرون', 'أربعة وعشرون', 'خمسة وعشرون', 'ستة وعشرون', 'سبعة وعشرون', 'ثمانية وعشرون', 'تسعة وعشرون', 'ثلاثون', 'واحد وثلاثون', 'اثنان وثلاثون', 'ثلاثة وثلاثون', 'أربعة وثلاثون', 'خمسة وثلاثون', 'ستة وثلاثون', 'سبعة وثلاثون', 'ثمانية وثلاثون', 'تسعة وثلاثون', 'أربعون', 'واحد وأربعون', 'اثنان وأربعون', 'ثلاثة وأربعون', 'أربعة وأربعون', 'خمسة وأربعون', 'ستة وأربعون', 'سبعة وأربعون', 'ثمانية وأربعون', 'تسعة وأربعون', 'خمسون', 'واحد وخمسون', 'اثنان وخمسون', 'ثلاثة وخمسون', 'أربعة وخمسون', 'خمسة وخمسون', 'ستة وخمسون', 'سبعة وخمسون', 'ثمانية وخمسون', 'تسعة وخمسون', 'ستون', 'واحد وستون', 'اثنان وستون', 'ثلاثة وستون', 'أربعة وستون', 'خمسة وستون', 'ستة وستون', 'سبعة وستون', 'ثمانية وستون', 'تسعة وستون', 'سبعون', 'واحد وسبعون', 'اثنان وسبعون', 'ثلاثة وسبعون', 'أربعة وسبعون', 'خمسة وسبعون', 'ستة وسبعون', 'سبعة وسبعون', 'ثمانية وسبعون', 'تسعة وسبعون', 'ثمانون', 'واحد وثمانون', 'اثنان وثمانون', 'ثلاثة وثمانون', 'أربعة وثمانون', 'خمسة وثمانون', 'ستة وثمانون', 'سبعة وثمانون', 'ثمانية وثمانون', 'تسعة وثمانون', 'تسعون', 'واحد وتسعون', 'اثنان وتسعون', 'ثلاثة وتسعون', 'أربعة وتسعون', 'خمسة وتسعون', 'ستة وتسعون', 'سبعة وتسعون', 'ثمانية وتسعون', 'تسعة وتسعون', 'مائة', 'مائة وواحد', 'مائة واثنان', 'مائة وثلاثة', 'مائة وأربعة', 'مائة وخمسة', 'مائة وستة', 'مائة وسبعة', 'مائة وثمانية', 'مائة وتسعة', 'مائة وعشرة', 'مائة وأحد عشر', 'مائة واثنا عشر', 'مائة وثلاثة عشر', 'مائة وأربعة عشر', 'مائة وخمسة عشر', 'مائة وستة عشر', 'مائة وسبعة عشر', 'مائة وثمانية عشر', 'مائة وتسعة عشر', 'مائة وعشرون', 'مائة وواحد وعشرون', 'مائة واثنان وعشرون', 'مائة وثلاثة وعشرون', 'مائة وأربعة وعشرون', 'مائة وخمسة وعشرون', 'مائة وستة وعشرون', 'مائة وسبعة وعشرون', 'مائة وثمانية وعشرون', 'مائة وتسعة وعشرون', 'مائة وثلاثون', 'مائة وواحد وثلاثون', 'مائة واثنان وثلاثون', 'مائة وثلاثة وثلاثون', 'مائة وأربعة وثلاثون', 'مائة وخمسة وثلاثون', 'مائة وستة وثلاثون', 'مائة وسبعة وثلاثون', 'مائة وثمانية وثلاثون', 'مائة وتسعة وثلاثون', 'مائة وأربعون', 'مائة وواحد وأربعون', 'مائة واثنان وأربعون', 'مائة وثلاثة وأربعون', 'مائة وأربعة وأربعون', 'مائة وخمسة وأربعون', 'مائة وستة وأربعون', 'مائة وسبعة وأربعون', 'مائة وثمانية وأربعون', 'مائة وتسعة وأربعون', 'مائة وخمسون', 'مائة وواحد وخمسون', 'مائة واثنان وخمسون', 'مائة وثلاثة وخمسون', 'مائة وأربعة وخمسون', 'مائة وخمسة وخمسون', 'مائة وستة وخمسون', 'مائة وسبعة وخمسون', 'مائة وثمانية وخمسون', 'مائة وتسعة وخمسون', 'مائة وستون', 'مائة وواحد وستون', 'مائة واثنان وستون', 'مائة وثلاثة وستون', 'مائة وأربعة وستون', 'مائة وخمسة وستون', 'مائة وستة وستون', 'مائة وسبعة وستون', 'مائة وثمانية وستون', 'مائة وتسعة وستون', 'مائة وسبعون', 'مائة وواحد وسبعون', 'مائة واثنان وسبعون', 'مائة وثلاثة وسبعون', 'مائة وأربعة وسبعون', 'مائة وخمسة وسبعون', 'مائة وستة وسبعون', 'مائة وسبعة وسبعون', 'مائة وثمانية وسبعون', 'مائة وتسعة وسبعون', 'مائة وثمانون', 'مائة وواحد وثمانون', 'مائة واثنان وثمانون', 'مائة وثلاثة وثمانون', 'مائة وأربعة وثمانون', 'مائة وخمسة وثمانون', 'مائة وستة وثمانون', 'مائة وسبعة وثمانون', 'مائة وثمانية وثمانون', 'مائة وتسعة وثمانون', 'مائة وتسعون', 'مائة وواحد وتسعون', 'مائة واثنان وتسعون', 'مائة وثلاثة وتسعون', 'مائة وأربعة وتسعون', 'مائة وخمسة وتسعون', 'مائة وستة وتسعون', 'مائة وسبعة وتسعون', 'مائة وثمانية وتسعون', 'مائة وتسعة وتسعون', 'مائتان', 'مائتان وواحد', 'مائتان واثنان', 'مائتان وثلاثة', 'مائتان وأربعة', 'مائتان وخمسة', 'مائتان وستة', 'مائتان وسبعة', 'مائتان وثمانية', 'مائتان وتسعة', 'مائتان وعشرة', 'مائتان وأحد عشر', 'مائتان واثنا عشر', 'مائتان وثلاثة عشر', 'مائتان وأربعة عشر', 'مائتان وخمسة عشر', 'مائتان وستة عشر', 'مائتان وسبعة عشر', 'مائتان وثمانية عشر', 'مائتان وتسعة عشر', 'مائتان وعشرون', 'مائتان وواحد وعشرون', 'مائتان واثنان وعشرون', 'مائتان وثلاثة وعشرون', 'مائتان وأربعة وعشرون', 'مائتان وخمسة وعشرون', 'مائتان وستة وعشرون', 'مائتان وسبعة وعشرون', 'مائتان وثمانية وعشرون', 'مائتان وتسعة وعشرون', 'مائتان وثلاثون', 'مائتان وواحد وثلاثون', 'مائتان واثنان وثلاثون', 'مائتان وثلاثة وثلاثون', 'مائتان وأربعة وثلاثون', 'مائتان وخمسة وثلاثون', 'مائتان وستة وثلاثون', 'مائتان وسبعة وثلاثون', 'مائتان وثمانية وثلاثون', 'مائتان وتسعة وثلاثون', 'مائتان وأربعون', 'مائتان وواحد وأربعون', 'مائتان واثنان وأربعون', 'مائتان وثلاثة وأربعون', 'مائتان وأربعة وأربعون', 'مائتان وخمسة وأربعون', 'مائتان وستة وأربعون', 'مائتان وسبعة وأربعون', 'مائتان وثمانية وأربعون', 'مائتان وتسعة وأربعون', 'مائتان وخمسون', 'مائتان وواحد وخمسون', 'مائتان واثنان وخمسون', 'مائتان وثلاثة وخمسون', 'مائتان وأربعة وخمسون', 'مائتان وخمسة وخمسون', 'مائتان وستة وخمسون', 'مائتان وسبعة وخمسون', 'مائتان وثمانية وخمسون', 'مائتان وتسعة وخمسون', 'مائتان وستون', 'مائتان وواحد وستون', 'مائتان واثنان وستون', 'مائتان وثلاثة وستون', 'مائتان وأربعة وستون', 'مائتان وخمسة وستون', 'مائتان وستة وستون', 'مائتان وسبعة وستون', 'مائتان وثمانية وستون', 'مائتان وتسعة وستون', 'مائتان وسبعون', 'مائتان وواحد وسبعون', 'مائتان واثنان وسبعون', 'مائتان وثلاثة وسبعون', 'مائتان وأربعة وسبعون', 'مائتان وخمسة وسبعون', 'مائتان وستة وسبعون', 'مائتان وسبعة وسبعون', 'مائتان وثمانية وسبعون', 'مائتان وتسعة وسبعون', 'مائتان وثمانون', 'مائتان وواحد وثمانون', 'مائتان واثنان وثمانون', 'مائتان وثلاثة وثمانون', 'مائتان وأربعة وثمانون', 'مائتان وخمسة وثمانون', 'مائتان وستة وثمانون', 'مائتان وسبعة وثمانون', 'مائتان وثمانية وثمانون', 'مائتان وتسعة وثمانون', 'مائتان وتسعون', 'مائتان وواحد وتسعون', 'مائتان واثنان وتسعون', 'مائتان وثلاثة وتسعون', 'مائتان وأربعة وتسعون', 'مائتان وخمسة وتسعون', 'مائتان وستة وتسعون', 'مائتان وسبعة وتسعون', 'مائتان وثمانية وتسعون', 'مائتان وتسعة وتسعون', 'ثلاثمائة', 'ثلاثمائة وواحد', 'ثلاثمائة واثنان', 'ثلاثمائة وثلاثة', 'ثلاثمائة وأربعة', 'ثلاثمائة وخمسة', 'ثلاثمائة وستة', 'ثلاثمائة وسبعة', 'ثلاثمائة وثمانية', 'ثلاثمائة وتسعة', 'ثلاثمائة وعشرة', 'ثلاثمائة وأحد عشر', 'ثلاثمائة واثنا عشر', 'ثلاثمائة وثلاثة عشر', 'ثلاثمائة وأربعة عشر', 'ثلاثمائة وخمسة عشر', 'ثلاثمائة وستة عشر', 'ثلاثمائة وسبعة عشر', 'ثلاثمائة وثمانية عشر', 'ثلاثمائة وتسعة عشر', 'ثلاثمائة وعشرون', 'ثلاثمائة وواحد وعشرون', 'ثلاثمائة واثنان وعشرون', 'ثلاثمائة وثلاثة وعشرون', 'ثلاثمائة وأربعة وعشرون', 'ثلاثمائة وخمسة وعشرون', 'ثلاثمائة وستة وعشرون', 'ثلاثمائة وسبعة وعشرون', 'ثلاثمائة وثمانية وعشرون', 'ثلاثمائة وتسعة وعشرون', 'ثلاثمائة وثلاثون', 'ثلاثمائة وواحد وثلاثون', 'ثلاثمائة واثنان وثلاثون', 'ثلاثمائة وثلاثة وثلاثون', 'ثلاثمائة وأربعة وثلاثون', 'ثلاثمائة وخمسة وثلاثون', 'ثلاثمائة وستة وثلاثون', 'ثلاثمائة وسبعة وثلاثون', 'ثلاثمائة وثمانية وثلاثون', 'ثلاثمائة وتسعة وثلاثون', 'ثلاثمائة وأربعون', 'ثلاثمائة وواحد وأربعون', 'ثلاثمائة واثنان وأربعون', 'ثلاثمائة وثلاثة وأربعون', 'ثلاثمائة وأربعة وأربعون', 'ثلاثمائة وخمسة وأربعون', 'ثلاثمائة وستة وأربعون', 'ثلاثمائة وسبعة وأربعون', 'ثلاثمائة وثمانية وأربعون', 'ثلاثمائة وتسعة وأربعون', 'ثلاثمائة وخمسون', 'ثلاثمائة وواحد وخمسون', 'ثلاثمائة واثنان وخمسون', 'ثلاثمائة وثلاثة وخمسون', 'ثلاثمائة وأربعة وخمسون', 'ثلاثمائة وخمسة وخمسون', 'ثلاثمائة وستة وخمسون', 'ثلاثمائة وسبعة وخمسون', 'ثلاثمائة وثمانية وخمسون', 'ثلاثمائة وتسعة وخمسون', 'ثلاثمائة وستون', 'ثلاثمائة وواحد وستون', 'ثلاثمائة واثنان وستون', 'ثلاثمائة وثلاثة وستون', 'ثلاثمائة وأربعة وستون', 'ثلاثمائة وخمسة وستون', 'ثلاثمائة وستة وستون', 'ثلاثمائة وسبعة وستون', 'ثلاثمائة وثمانية وستون', 'ثلاثمائة وتسعة وستون', 'ثلاثمائة وسبعون', 'ثلاثمائة وواحد وسبعون', 'ثلاثمائة واثنان وسبعون', 'ثلاثمائة وثلاثة وسبعون', 'ثلاثمائة وأربعة وسبعون', 'ثلاثمائة وخمسة وسبعون', 'ثلاثمائة وستة وسبعون', 'ثلاثمائة وسبعة وسبعون', 'ثلاثمائة وثمانية وسبعون', 'ثلاثمائة وتسعة وسبعون', 'ثلاثمائة وثمانون', 'ثلاثمائة وواحد وثمانون', 'ثلاثمائة واثنان وثمانون', 'ثلاثمائة وثلاثة وثمانون', 'ثلاثمائة وأربعة وثمانون', 'ثلاثمائة وخمسة وثمانون', 'ثلاثمائة وستة وثمانون', 'ثلاثمائة وسبعة وثمانون', 'ثلاثمائة وثمانية وثمانون', 'ثلاثمائة وتسعة وثمانون', 'ثلاثمائة وتسعون', 'ثلاثمائة وواحد وتسعون', 'ثلاثمائة واثنان وتسعون', 'ثلاثمائة وثلاثة وتسعون', 'ثلاثمائة وأربعة وتسعون', 'ثلاثمائة وخمسة وتسعون', 'ثلاثمائة وستة وتسعون', 'ثلاثمائة وسبعة وتسعون', 'ثلاثمائة وثمانية وتسعون', 'ثلاثمائة وتسعة وتسعون' , 'أربعمائة', 'أربعمائة وواحد', 'أربعمائة واثنان', 'أربعمائة وثلاثة', 'أربعمائة وأربعة', 'أربعمائة وخمسة', 'أربعمائة وستة', 'أربعمائة وسبعة', 'أربعمائة وثمانية', 'أربعمائة وتسعة', 'أربعمائة وعشرة', 'أربعمائة وأحد عشر', 'أربعمائة واثنا عشر', 'أربعمائة وثلاثة عشر', 'أربعمائة وأربعة عشر', 'أربعمائة وخمسة عشر', 'أربعمائة وستة عشر', 'أربعمائة وسبعة عشر', 'أربعمائة وثمانية عشر', 'أربعمائة وتسعة عشر', 'أربعمائة وعشرون', 'أربعمائة وواحد وعشرون', 'أربعمائة واثنان وعشرون', 'أربعمائة وثلاثة وعشرون', 'أربعمائة وأربعة وعشرون', 'أربعمائة وخمسة وعشرون', 'أربعمائة وستة وعشرون', 'أربعمائة وسبعة وعشرون', 'أربعمائة وثمانية وعشرون', 'أربعمائة وتسعة وعشرون', 'أربعمائة وثلاثون', 'أربعمائة وواحد وثلاثون', 'أربعمائة واثنان وثلاثون', 'أربعمائة وثلاثة وثلاثون', 'أربعمائة وأربعة وثلاثون', 'أربعمائة وخمسة وثلاثون', 'أربعمائة وستة وثلاثون', 'أربعمائة وسبعة وثلاثون', 'أربعمائة وثمانية وثلاثون', 'أربعمائة وتسعة وثلاثون', 'أربعمائة وأربعون', 'أربعمائة وواحد وأربعون', 'أربعمائة واثنان وأربعون', 'أربعمائة وثلاثة وأربعون', 'أربعمائة وأربعة وأربعون', 'أربعمائة وخمسة وأربعون', 'أربعمائة وستة وأربعون', 'أربعمائة وسبعة وأربعون', 'أربعمائة وثمانية وأربعون', 'أربعمائة وتسعة وأربعون', 'أربعمائة وخمسون', 'أربعمائة وواحد وخمسون', 'أربعمائة واثنان وخمسون', 'أربعمائة وثلاثة وخمسون', 'أربعمائة وأربعة وخمسون', 'أربعمائة وخمسة وخمسون', 'أربعمائة وستة وخمسون', 'أربعمائة وسبعة وخمسون', 'أربعمائة وثمانية وخمسون', 'أربعمائة وتسعة وخمسون', 'أربعمائة وستون', 'أربعمائة وواحد وستون', 'أربعمائة واثنان وستون', 'أربعمائة وثلاثة وستون', 'أربعمائة وأربعة وستون', 'أربعمائة وخمسة وستون', 'أربعمائة وستة وستون', 'أربعمائة وسبعة وستون', 'أربعمائة وثمانية وستون', 'أربعمائة وتسعة وستون', 'أربعمائة وسبعون', 'أربعمائة وواحد وسبعون', 'أربعمائة واثنان وسبعون', 'أربعمائة وثلاثة وسبعون', 'أربعمائة وأربعة وسبعون', 'أربعمائة وخمسة وسبعون', 'أربعمائة وستة وسبعون', 'أربعمائة وسبعة وسبعون', 'أربعمائة وثمانية وسبعون', 'أربعمائة وتسعة وسبعون', 'أربعمائة وثمانون', 'أربعمائة وواحد وثمانون', 'أربعمائة واثنان وثمانون', 'أربعمائة وثلاثة وثمانون', 'أربعمائة وأربعة وثمانون', 'أربعمائة وخمسة وثمانون', 'أربعمائة وستة وثمانون', 'أربعمائة وسبعة وثمانون', 'أربعمائة وثمانية وثمانون', 'أربعمائة وتسعة وثمانون', 'أربعمائة وتسعون', 'أربعمائة وواحد وتسعون', 'أربعمائة واثنان وتسعون', 'أربعمائة وثلاثة وتسعون', 'أربعمائة وأربعة وتسعون', 'أربعمائة وخمسة وتسعون', 'أربعمائة وستة وتسعون', 'أربعمائة وسبعة وتسعون', 'أربعمائة وثمانية وتسعون', 'أربعمائة وتسعة وتسعون', 'خمسمائة', 'خمسمائة وواحد', 'خمسمائة واثنان', 'خمسمائة وثلاثة', 'خمسمائة وأربعة', 'خمسمائة وخمسة', 'خمسمائة وستة', 'خمسمائة وسبعة', 'خمسمائة وثمانية', 'خمسمائة وتسعة', 'خمسمائة وعشرة', 'خمسمائة وأحد عشر', 'خمسمائة واثنا عشر', 'خمسمائة وثلاثة عشر', 'خمسمائة وأربعة عشر', 'خمسمائة وخمسة عشر', 'خمسمائة وستة عشر', 'خمسمائة وسبعة عشر', 'خمسمائة وثمانية عشر', 'خمسمائة وتسعة عشر', 'خمسمائة وعشرون', 'خمسمائة وواحد وعشرون', 'خمسمائة واثنان وعشرون', 'خمسمائة وثلاثة وعشرون', 'خمسمائة وأربعة وعشرون', 'خمسمائة وخمسة وعشرون', 'خمسمائة وستة وعشرون', 'خمسمائة وسبعة وعشرون', 'خمسمائة وثمانية وعشرون', 'خمسمائة وتسعة وعشرون', 'خمسمائة وثلاثون', 'خمسمائة وواحد وثلاثون', 'خمسمائة واثنان وثلاثون', 'خمسمائة وثلاثة وثلاثون', 'خمسمائة وأربعة وثلاثون', 'خمسمائة وخمسة وثلاثون', 'خمسمائة وستة وثلاثون', 'خمسمائة وسبعة وثلاثون', 'خمسمائة وثمانية وثلاثون', 'خمسمائة وتسعة وثلاثون', 'خمسمائة وأربعون', 'خمسمائة وواحد وأربعون', 'خمسمائة واثنان وأربعون', 'خمسمائة وثلاثة وأربعون', 'خمسمائة وأربعة وأربعون', 'خمسمائة وخمسة وأربعون', 'خمسمائة وستة وأربعون', 'خمسمائة وسبعة وأربعون', 'خمسمائة وثمانية وأربعون', 'خمسمائة وتسعة وأربعون', 'خمسمائة وخمسون', 'خمسمائة وواحد وخمسون', 'خمسمائة واثنان وخمسون', 'خمسمائة وثلاثة وخمسون', 'خمسمائة وأربعة وخمسون', 'خمسمائة وخمسة وخمسون', 'خمسمائة وستة وخمسون', 'خمسمائة وسبعة وخمسون', 'خمسمائة وثمانية وخمسون', 'خمسمائة وتسعة وخمسون', 'خمسمائة وستون', 'خمسمائة وواحد وستون', 'خمسمائة واثنان وستون', 'خمسمائة وثلاثة وستون', 'خمسمائة وأربعة وستون', 'خمسمائة وخمسة وستون', 'خمسمائة وستة وستون', 'خمسمائة وسبعة وستون', 'خمسمائة وثمانية وستون', 'خمسمائة وتسعة وستون', 'خمسمائة وسبعون', 'خمسمائة وواحد وسبعون', 'خمسمائة واثنان وسبعون', 'خمسمائة وثلاثة وسبعون', 'خمسمائة وأربعة وسبعون', 'خمسمائة وخمسة وسبعون', 'خمسمائة وستة وسبعون', 'خمسمائة وسبعة وسبعون', 'خمسمائة وثمانية وسبعون', 'خمسمائة وتسعة وسبعون', 'خمسمائة وثمانون', 'خمسمائة وواحد وثمانون', 'خمسمائة واثنان وثمانون', 'خمسمائة وثلاثة وثمانون', 'خمسمائة وأربعة وثمانون', 'خمسمائة وخمسة وثمانون', 'خمسمائة وستة وثمانون', 'خمسمائة وسبعة وثمانون', 'خمسمائة وثمانية وثمانون', 'خمسمائة وتسعة وثمانون', 'خمسمائة وتسعون', 'خمسمائة وواحد وتسعون', 'خمسمائة واثنان وتسعون', 'خمسمائة وثلاثة وتسعون', 'خمسمائة وأربعة وتسعون', 'خمسمائة وخمسة وتسعون', 'خمسمائة وستة وتسعون', 'خمسمائة وسبعة وتسعون', 'خمسمائة وثمانية وتسعون', 'خمسمائة وتسعة وتسعون', 'ستمائة', 'ستمائة وواحد', 'ستمائة واثنان', 'ستمائة وثلاثة', 'ستمائة وأربعة', 'ستمائة وخمسة', 'ستمائة وستة', 'ستمائة وسبعة', 'ستمائة وثمانية', 'ستمائة وتسعة', 'ستمائة وعشرة', 'ستمائة وأحد عشر', 'ستمائة واثنا عشر', 'ستمائة وثلاثة عشر', 'ستمائة وأربعة عشر', 'ستمائة وخمسة عشر', 'ستمائة وستة عشر', 'ستمائة وسبعة عشر', 'ستمائة وثمانية عشر', 'ستمائة وتسعة عشر', 'ستمائة وعشرون', 'ستمائة وواحد وعشرون', 'ستمائة واثنان وعشرون', 'ستمائة وثلاثة وعشرون', 'ستمائة وأربعة وعشرون', 'ستمائة وخمسة وعشرون', 'ستمائة وستة وعشرون', 'ستمائة وسبعة وعشرون', 'ستمائة وثمانية وعشرون', 'ستمائة وتسعة وعشرون', 'ستمائة وثلاثون', 'ستمائة وواحد وثلاثون', 'ستمائة واثنان وثلاثون', 'ستمائة وثلاثة وثلاثون', 'ستمائة وأربعة وثلاثون', 'ستمائة وخمسة وثلاثون', 'ستمائة وستة وثلاثون', 'ستمائة وسبعة وثلاثون', 'ستمائة وثمانية وثلاثون', 'ستمائة وتسعة وثلاثون', 'ستمائة وأربعون', 'ستمائة وواحد وأربعون', 'ستمائة واثنان وأربعون', 'ستمائة وثلاثة وأربعون', 'ستمائة وأربعة وأربعون', 'ستمائة وخمسة وأربعون', 'ستمائة وستة وأربعون', 'ستمائة وسبعة وأربعون', 'ستمائة وثمانية وأربعون', 'ستمائة وتسعة وأربعون', 'ستمائة وخمسون', 'ستمائة وواحد وخمسون', 'ستمائة واثنان وخمسون', 'ستمائة وثلاثة وخمسون', 'ستمائة وأربعة وخمسون', 'ستمائة وخمسة وخمسون', 'ستمائة وستة وخمسون', 'ستمائة وسبعة وخمسون', 'ستمائة وثمانية وخمسون', 'ستمائة وتسعة وخمسون', 'ستمائة وستون', 'ستمائة وواحد وستون', 'ستمائة واثنان وستون', 'ستمائة وثلاثة وستون', 'ستمائة وأربعة وستون', 'ستمائة وخمسة وستون', 'ستمائة وستة وستون', 'ستمائة وسبعة وستون', 'ستمائة وثمانية وستون', 'ستمائة وتسعة وستون', 'ستمائة وسبعون', 'ستمائة وواحد وسبعون', 'ستمائة واثنان وسبعون', 'ستمائة وثلاثة وسبعون', 'ستمائة وأربعة وسبعون', 'ستمائة وخمسة وسبعون', 'ستمائة وستة وسبعون', 'ستمائة وسبعة وسبعون', 'ستمائة وثمانية وسبعون', 'ستمائة وتسعة وسبعون', 'ستمائة وثمانون', 'ستمائة وواحد وثمانون', 'ستمائة واثنان وثمانون', 'ستمائة وثلاثة وثمانون', 'ستمائة وأربعة وثمانون', 'ستمائة وخمسة وثمانون', 'ستمائة وستة وثمانون', 'ستمائة وسبعة وثمانون', 'ستمائة وثمانية وثمانون', 'ستمائة وتسعة وثمانون', 'ستمائة وتسعون', 'ستمائة وواحد وتسعون', 'ستمائة واثنان وتسعون', 'ستمائة وثلاثة وتسعون', 'ستمائة وأربعة وتسعون', 'ستمائة وخمسة وتسعون', 'ستمائة وستة وتسعون', 'ستمائة وسبعة وتسعون', 'ستمائة وثمانية وتسعون', 'ستمائة وتسعة وتسعون', 'سبعمائة', 'سبعمائة وواحد', 'سبعمائة واثنان', 'سبعمائة وثلاثة', 'سبعمائة وأربعة', 'سبعمائة وخمسة', 'سبعمائة وستة', 'سبعمائة وسبعة', 'سبعمائة وثمانية', 'سبعمائة وتسعة', 'سبعمائة وعشرة', 'سبعمائة وأحد عشر', 'سبعمائة واثنا عشر', 'سبعمائة وثلاثة عشر', 'سبعمائة وأربعة عشر', 'سبعمائة وخمسة عشر', 'سبعمائة وستة عشر', 'سبعمائة وسبعة عشر', 'سبعمائة وثمانية عشر', 'سبعمائة وتسعة عشر', 'سبعمائة وعشرون', 'سبعمائة وواحد وعشرون', 'سبعمائة واثنان وعشرون', 'سبعمائة وثلاثة وعشرون', 'سبعمائة وأربعة وعشرون', 'سبعمائة وخمسة وعشرون', 'سبعمائة وستة وعشرون', 'سبعمائة وسبعة وعشرون', 'سبعمائة وثمانية وعشرون', 'سبعمائة وتسعة وعشرون', 'سبعمائة وثلاثون', 'سبعمائة وواحد وثلاثون', 'سبعمائة واثنان وثلاثون', 'سبعمائة وثلاثة وثلاثون', 'سبعمائة وأربعة وثلاثون', 'سبعمائة وخمسة وثلاثون', 'سبعمائة وستة وثلاثون', 'سبعمائة وسبعة وثلاثون', 'سبعمائة وثمانية وثلاثون', 'سبعمائة وتسعة وثلاثون', 'سبعمائة وأربعون', 'سبعمائة وواحد وأربعون', 'سبعمائة واثنان وأربعون', 'سبعمائة وثلاثة وأربعون', 'سبعمائة وأربعة وأربعون', 'سبعمائة وخمسة وأربعون', 'سبعمائة وستة وأربعون', 'سبعمائة وسبعة وأربعون', 'سبعمائة وثمانية وأربعون', 'سبعمائة وتسعة وأربعون', 'سبعمائة وخمسون', 'سبعمائة وواحد وخمسون', 'سبعمائة واثنان وخمسون', 'سبعمائة وثلاثة وخمسون', 'سبعمائة وأربعة وخمسون', 'سبعمائة وخمسة وخمسون', 'سبعمائة وستة وخمسون', 'سبعمائة وسبعة وخمسون', 'سبعمائة وثمانية وخمسون', 'سبعمائة وتسعة وخمسون', 'سبعمائة وستون', 'سبعمائة وواحد وستون', 'سبعمائة واثنان وستون', 'سبعمائة وثلاثة وستون', 'سبعمائة وأربعة وستون', 'سبعمائة وخمسة وستون', 'سبعمائة وستة وستون', 'سبعمائة وسبعة وستون', 'سبعمائة وثمانية وستون', 'سبعمائة وتسعة وستون', 'سبعمائة وسبعون', 'سبعمائة وواحد وسبعون', 'سبعمائة واثنان وسبعون', 'سبعمائة وثلاثة وسبعون', 'سبعمائة وأربعة وسبعون', 'سبعمائة وخمسة وسبعون', 'سبعمائة وستة وسبعون', 'سبعمائة وسبعة وسبعون', 'سبعمائة وثمانية وسبعون', 'سبعمائة وتسعة وسبعون', 'سبعمائة وثمانون', 'سبعمائة وواحد وثمانون', 'سبعمائة واثنان وثمانون', 'سبعمائة وثلاثة وثمانون', 'سبعمائة وأربعة وثمانون', 'سبعمائة وخمسة وثمانون', 'سبعمائة وستة وثمانون', 'سبعمائة وسبعة وثمانون', 'سبعمائة وثمانية وثمانون', 'سبعمائة وتسعة وثمانون', 'سبعمائة وتسعون', 'سبعمائة وواحد وتسعون', 'سبعمائة واثنان وتسعون', 'سبعمائة وثلاثة وتسعون', 'سبعمائة وأربعة وتسعون', 'سبعمائة وخمسة وتسعون', 'سبعمائة وستة وتسعون', 'سبعمائة وسبعة وتسعون', 'سبعمائة وثمانية وتسعون', 'سبعمائة وتسعة وتسعون', 'ثمانمائة', 'ثمانمائة وواحد', 'ثمانمائة واثنان', 'ثمانمائة وثلاثة', 'ثمانمائة وأربعة', 'ثمانمائة وخمسة', 'ثمانمائة وستة', 'ثمانمائة وسبعة', 'ثمانمائة وثمانية', 'ثمانمائة وتسعة', 'ثمانمائة وعشرة', 'ثمانمائة وأحد عشر', 'ثمانمائة واثنا عشر', 'ثمانمائة وثلاثة عشر', 'ثمانمائة وأربعة عشر', 'ثمانمائة وخمسة عشر', 'ثمانمائة وستة عشر', 'ثمانمائة وسبعة عشر', 'ثمانمائة وثمانية عشر', 'ثمانمائة وتسعة عشر', 'ثمانمائة وعشرون', 'ثمانمائة وواحد وعشرون', 'ثمانمائة واثنان وعشرون', 'ثمانمائة وثلاثة وعشرون', 'ثمانمائة وأربعة وعشرون', 'ثمانمائة وخمسة وعشرون', 'ثمانمائة وستة وعشرون', 'ثمانمائة وسبعة وعشرون', 'ثمانمائة وثمانية وعشرون', 'ثمانمائة وتسعة وعشرون', 'ثمانمائة وثلاثون', 'ثمانمائة وواحد وثلاثون', 'ثمانمائة واثنان وثلاثون', 'ثمانمائة وثلاثة وثلاثون', 'ثمانمائة وأربعة وثلاثون', 'ثمانمائة وخمسة وثلاثون', 'ثمانمائة وستة وثلاثون', 'ثمانمائة وسبعة وثلاثون', 'ثمانمائة وثمانية وثلاثون', 'ثمانمائة وتسعة وثلاثون', 'ثمانمائة وأربعون', 'ثمانمائة وواحد وأربعون', 'ثمانمائة واثنان وأربعون', 'ثمانمائة وثلاثة وأربعون', 'ثمانمائة وأربعة وأربعون', 'ثمانمائة وخمسة وأربعون', 'ثمانمائة وستة وأربعون', 'ثمانمائة وسبعة وأربعون', 'ثمانمائة وثمانية وأربعون', 'ثمانمائة وتسعة وأربعون', 'ثمانمائة وخمسون', 'ثمانمائة وواحد وخمسون', 'ثمانمائة واثنان وخمسون', 'ثمانمائة وثلاثة وخمسون', 'ثمانمائة وأربعة وخمسون', 'ثمانمائة وخمسة وخمسون', 'ثمانمائة وستة وخمسون', 'ثمانمائة وسبعة وخمسون', 'ثمانمائة وثمانية وخمسون', 'ثمانمائة وتسعة وخمسون', 'ثمانمائة وستون', 'ثمانمائة وواحد وستون', 'ثمانمائة واثنان وستون', 'ثمانمائة وثلاثة وستون', 'ثمانمائة وأربعة وستون', 'ثمانمائة وخمسة وستون', 'ثمانمائة وستة وستون', 'ثمانمائة وسبعة وستون', 'ثمانمائة وثمانية وستون', 'ثمانمائة وتسعة وستون', 'ثمانمائة وسبعون', 'ثمانمائة وواحد وسبعون', 'ثمانمائة واثنان وسبعون', 'ثمانمائة وثلاثة وسبعون', 'ثمانمائة وأربعة وسبعون', 'ثمانمائة وخمسة وسبعون', 'ثمانمائة وستة وسبعون', 'ثمانمائة وسبعة وسبعون', 'ثمانمائة وثمانية وسبعون', 'ثمانمائة وتسعة وسبعون', 'ثمانمائة وثمانون', 'ثمانمائة وواحد وثمانون', 'ثمانمائة واثنان وثمانون', 'ثمانمائة وثلاثة وثمانون', 'ثمانمائة وأربعة وثمانون', 'ثمانمائة وخمسة وثمانون', 'ثمانمائة وستة وثمانون', 'ثمانمائة وسبعة وثمانون', 'ثمانمائة وثمانية وثمانون', 'ثمانمائة وتسعة وثمانون', 'ثمانمائة وتسعون', 'ثمانمائة وواحد وتسعون', 'ثمانمائة واثنان وتسعون', 'ثمانمائة وثلاثة وتسعون', 'ثمانمائة وأربعة وتسعون', 'ثمانمائة وخمسة وتسعون', 'ثمانمائة وستة وتسعون', 'ثمانمائة وسبعة وتسعون', 'ثمانمائة وثمانية وتسعون', 'ثمانمائة وتسعة وتسعون', 'تسعمائة', 'تسعمائة وواحد', 'تسعمائة واثنان', 'تسعمائة وثلاثة', 'تسعمائة وأربعة', 'تسعمائة وخمسة', 'تسعمائة وستة', 'تسعمائة وسبعة', 'تسعمائة وثمانية', 'تسعمائة وتسعة', 'تسعمائة وعشرة', 'تسعمائة وأحد عشر', 'تسعمائة واثنا عشر', 'تسعمائة وثلاثة عشر', 'تسعمائة وأربعة عشر', 'تسعمائة وخمسة عشر', 'تسعمائة وستة عشر', 'تسعمائة وسبعة عشر', 'تسعمائة وثمانية عشر', 'تسعمائة وتسعة عشر', 'تسعمائة وعشرون', 'تسعمائة وواحد وعشرون', 'تسعمائة واثنان وعشرون', 'تسعمائة وثلاثة وعشرون', 'تسعمائة وأربعة وعشرون', 'تسعمائة وخمسة وعشرون', 'تسعمائة وستة وعشرون', 'تسعمائة وسبعة وعشرون', 'تسعمائة وثمانية وعشرون', 'تسعمائة وتسعة وعشرون', 'تسعمائة وثلاثون', 'تسعمائة وواحد وثلاثون', 'تسعمائة واثنان وثلاثون', 'تسعمائة وثلاثة وثلاثون', 'تسعمائة وأربعة وثلاثون', 'تسعمائة وخمسة وثلاثون', 'تسعمائة وستة وثلاثون', 'تسعمائة وسبعة وثلاثون', 'تسعمائة وثمانية وثلاثون', 'تسعمائة وتسعة وثلاثون', 'تسعمائة وأربعون', 'تسعمائة وواحد وأربعون', 'تسعمائة واثنان وأربعون', 'تسعمائة وثلاثة وأربعون', 'تسعمائة وأربعة وأربعون', 'تسعمائة وخمسة وأربعون', 'تسعمائة وستة وأربعون', 'تسعمائة وسبعة وأربعون', 'تسعمائة وثمانية وأربعون', 'تسعمائة وتسعة وأربعون', 'تسعمائة وخمسون', 'تسعمائة وواحد وخمسون', 'تسعمائة واثنان وخمسون', 'تسعمائة وثلاثة وخمسون', 'تسعمائة وأربعة وخمسون', 'تسعمائة وخمسة وخمسون', 'تسعمائة وستة وخمسون', 'تسعمائة وسبعة وخمسون', 'تسعمائة وثمانية وخمسون', 'تسعمائة وتسعة وخمسون', 'تسعمائة وستون', 'تسعمائة وواحد وستون', 'تسعمائة واثنان وستون', 'تسعمائة وثلاثة وستون', 'تسعمائة وأربعة وستون', 'تسعمائة وخمسة وستون', 'تسعمائة وستة وستون', 'تسعمائة وسبعة وستون', 'تسعمائة وثمانية وستون', 'تسعمائة وتسعة وستون', 'تسعمائة وسبعون', 'تسعمائة وواحد وسبعون', 'تسعمائة واثنان وسبعون', 'تسعمائة وثلاثة وسبعون', 'تسعمائة وأربعة وسبعون', 'تسعمائة وخمسة وسبعون', 'تسعمائة وستة وسبعون', 'تسعمائة وسبعة وسبعون', 'تسعمائة وثمانية وسبعون', 'تسعمائة وتسعة وسبعون', 'تسعمائة وثمانون', 'تسعمائة وواحد وثمانون', 'تسعمائة واثنان وثمانون', 'تسعمائة وثلاثة وثمانون', 'تسعمائة وأربعة وثمانون', 'تسعمائة وخمسة وثمانون', 'تسعمائة وستة وثمانون', 'تسعمائة وسبعة وثمانون', 'تسعمائة وثمانية وثمانون', 'تسعمائة وتسعة وثمانون', 'تسعمائة وتسعون', 'تسعمائة وواحد وتسعون', 'تسعمائة واثنان وتسعون', 'تسعمائة وثلاثة وتسعون', 'تسعمائة وأربعة وتسعون', 'تسعمائة وخمسة وتسعون', 'تسعمائة وستة وتسعون', 'تسعمائة وسبعة وتسعون', 'تسعمائة وثمانية وتسعون', 'تسعمائة وتسعة وتسعون'].freeze + end +end diff --git a/lib/humanize/module.rb b/lib/humanize/module.rb index ede681a..bdd0e79 100644 --- a/lib/humanize/module.rb +++ b/lib/humanize/module.rb @@ -32,7 +32,7 @@ def format(number, def for_locale(locale) case locale.to_sym # NOTE: add locales here in alphabetical order - when :az, :de, :en, :es, :fr, :id, :ms, :pt, :ru, :vi + when :ar, :az, :de, :en, :es, :fr, :id, :ms, :pt, :ru, :vi [Object.const_get("Humanize::#{locale.capitalize}"), ' '] when :th [Humanize::Th, ''] diff --git a/spec/locales/ar_spec.rb b/spec/locales/ar_spec.rb new file mode 100644 index 0000000..36de71a --- /dev/null +++ b/spec/locales/ar_spec.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Humanize, 'ar locale' do + before do + Humanize.configure do |config| + config.locale = :ar + end + end + + tests = [ + [1, 'واحد'], + [11, 'أحد عشر'], + [23, 'ثلاثة وعشرون'], + [102, 'مائة واثنان'], + [233, 'مائتان وثلاثة وثلاثون'], + [678, 'ستمائة وثمانية وسبعون'], + [876, 'ثمانمائة وستة وسبعون'], + [1000, 'ألف'], + [1756, 'ألف و سبعمائة وستة وخمسون'], + [2000, 'ألفان'], + [5000, 'خمسة آلاف'], + [10_000, 'عشرة آلاف'], + [20_000, 'عشرون ألف'], + [202_000, "مائتان وألفان"], + [1_000_000, 'مليون'], + [2_000_000, 'مليونان'], + [3_000_000, 'ثلاثة ملايين'], + [5_000_000, 'خمسة ملايين'], + [9_000_000, 'تسعة ملايين'], + [10_000_000, 'عشرة ملايين'], + [1_000_000_000, 'مليار'], + [9_000_000_000_000, 'تسعة تريليونات'] + ] + + tests.each do |num, output| + it "#{num} equals #{output}" do + expect(num.humanize).to eql(output) + end + end + + describe 'when called on conceptual number' do + it 'reads correctly' do + inf = Float::INFINITY + neg_inf = - inf + nan = inf + neg_inf + + expect(inf.humanize).to eq('لا نهاية') + expect(neg_inf.humanize).to eq('سالب لا نهاية') + expect(nan.humanize).to eq('غير معرف') + end + end +end