From cddd10f842e384e4f7b496035eb445ba9cf77160 Mon Sep 17 00:00:00 2001 From: Suhail Alkowaileet Date: Sat, 6 Dec 2025 13:58:06 +0300 Subject: [PATCH] Add Arabic number ar.sor Added Arabic number to text conversion support, covering basic numbers, ordinals, currency, and decimals. --- data/ar.sor | 249 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 data/ar.sor diff --git a/data/ar.sor b/data/ar.sor new file mode 100644 index 0000000..4a43ef6 --- /dev/null +++ b/data/ar.sor @@ -0,0 +1,249 @@ +# Arabic (Modern Standard Arabic) number to text conversion +# Supports masculine and feminine forms, ordinals, currency, and decimals + +# Basic numbers 0-10 (masculine forms - default) +^0 صفر +1 واحد +2 اثنان +3 ثلاثة +4 أربعة +5 خمسة +6 ستة +7 سبعة +8 ثمانية +9 تسعة +10 عشرة + +# Numbers 11-19 (masculine forms) +11 أحد عشر +12 اثنا عشر +13 ثلاثة عشر +14 أربعة عشر +15 خمسة عشر +16 ستة عشر +17 سبعة عشر +18 ثمانية عشر +19 تسعة عشر + +# Tens (20-90) - same for both genders +20 عشرون +30 ثلاثون +40 أربعون +50 خمسون +60 ستون +70 سبعون +80 ثمانون +90 تسعون + +# Compound numbers 21-99 +2(\d) $1 وعشرون +3(\d) $1 وثلاثون +4(\d) $1 وأربعون +5(\d) $1 وخمسون +6(\d) $1 وستون +7(\d) $1 وسبعون +8(\d) $1 وثمانون +9(\d) $1 وتسعون + +# Separator functions for proper conjunction usage +:0+ # exact thousand/million +:0*\d?\d " و" # with small remainder +:\d+ " و" # with larger remainder + +# Hundreds +1(\d\d) مائة[ و$1] +2(\d\d) مائتان[ و$1] +3(\d\d) ثلاثمائة[ و$1] +4(\d\d) أربعمائة[ و$1] +5(\d\d) خمسمائة[ و$1] +6(\d\d) ستمائة[ و$1] +7(\d\d) سبعمائة[ و$1] +8(\d\d) ثمانمائة[ و$1] +9(\d\d) تسعمائة[ و$1] + +# Thousands +1(\d{3}) ألف$(:\1)$1 +2(\d{3}) ألفان$(:\1)$1 +([3-9]|10)(\d{3}) $1 آلاف$(:\2)$2 +(\d{1,2})(\d{3}) $1 ألفاً$(:\2)$2 + +# Millions +1(\d{6}) مليون$(:\1)$1 +2(\d{6}) مليونان$(:\1)$1 +([3-9]|10)(\d{6}) $1 ملايين$(:\2)$2 +(\d{1,3})(\d{6}) $1 مليون$(:\2)$2 + +# Billions +1(\d{9}) مليار$(:\1)$1 +2(\d{9}) ملياران$(:\1)$1 +([3-9]|10)(\d{9}) $1 مليارات$(:\2)$2 +(\d{1,3})(\d{9}) $1 مليار$(:\2)$2 + +# Trillions +1(\d{12}) ترليون$(:\1)$1 +2(\d{12}) ترليونان$(:\1)$1 +([3-9]|10)(\d{12}) $1 ترليونات$(:\2)$2 +(\d{1,3})(\d{12}) $1 ترليون$(:\2)$2 + +# Quadrillions +1(\d{15}) كوادرليون$(:\1)$1 +2(\d{15}) كوادرليونان$(:\1)$1 +([3-9]|10)(\d{15}) $1 كوادرليونات$(:\2)$2 +(\d{1,3})(\d{15}) $1 كوادرليون$(:\2)$2 + +# Quintillions +1(\d{18}) كوينتليون$(:\1)$1 +2(\d{18}) كوينتليونان$(:\1)$1 +([3-9]|10)(\d{18}) $1 كوينتليونات$(:\2)$2 +(\d{1,3})(\d{18}) $1 كوينتليون$(:\2)$2 + +# Negative numbers +[-−](\d+) سالب |$1 + +# Decimals +0[.,] صفر فاصلة +([-−]?\d+)[.,] $1| فاصلة +([-−]?\d+[.,]\d*)(\d) $1| |$2 + +# Gender conversion functions +# Masculine to Feminine conversion +f:(.*)واحد \1واحدة +f:(.*)اثنان \1اثنتان +f:(.*)ثلاثة \1ثلاث +f:(.*)أربعة \1أربع +f:(.*)خمسة \1خمس +f:(.*)ستة \1ست +f:(.*)سبعة \1سبع +f:(.*)ثمانية \1ثمان +f:(.*)تسعة \1تسع +f:(.*)عشرة \1عشر + +f:(.*)أحد عشر \1إحدى عشرة +f:(.*)اثنا عشر \1اثنتا عشرة +f:(.*)ثلاثة عشر \1ثلاث عشرة +f:(.*)أربعة عشر \1أربع عشرة +f:(.*)خمسة عشر \1خمس عشرة +f:(.*)ستة عشر \1ست عشرة +f:(.*)سبعة عشر \1سبع عشرة +f:(.*)ثمانية عشر \1ثمان عشرة +f:(.*)تسعة عشر \1تسع عشرة + +# Keep masculine as-is (default) +m:(.*) \1 + +# Keep feminine or masculine +[mf]:(.*) \1 + +# Helper function for number before counted noun (masculine form) +mf:1 واحد +mf:2 اثنان +mf:3 ثلاثة +mf:4 أربعة +mf:5 خمسة +mf:6 ستة +mf:7 سبعة +mf:8 ثمانية +mf:9 تسعة +mf:10 عشرة +mf:(.*) $(m:\1) + +# Currency support +# Pattern: us/up/ss/sp for unit singular/plural, subunit singular/plural + +us:([^,]*),([^,]*),([^,]*),([^,]*) \1 +up:([^,]*),([^,]*),([^,]*),([^,]*) \2 +ss:([^,]*),([^,]*),([^,]*),([^,]*) \3 +sp:([^,]*),([^,]*),([^,]*),([^,]*) \4 + +# Major Arabic currencies +SAR:(\D+) $(\1: ريال سعودي, ريال سعودي, هللة, هللة) +AED:(\D+) $(\1: درهم إماراتي, درهم إماراتي, فلس, فلس) +EGP:(\D+) $(\1: جنيه مصري, جنيه مصري, قرش, قرش) +JOD:(\D+) $(\1: دينار أردني, دينار أردني, قرش, قرش) +KWD:(\D+) $(\1: دينار كويتي, دينار كويتي, فلس, فلس) +BHD:(\D+) $(\1: دينار بحريني, دينار بحريني, فلس, فلس) +OMR:(\D+) $(\1: ريال عماني, ريال عماني, بيسة, بيسة) +QAR:(\D+) $(\1: ريال قطري, ريال قطري, درهم, درهم) +IQD:(\D+) $(\1: دينار عراقي, دينار عراقي, فلس, فلس) +LBP:(\D+) $(\1: ليرة لبنانية, ليرة لبنانية, قرش, قرش) +SYP:(\D+) $(\1: ليرة سورية, ليرة سورية, قرش, قرش) +LYD:(\D+) $(\1: دينار ليبي, دينار ليبي, درهم, درهم) +TND:(\D+) $(\1: دينار تونسي, دينار تونسي, مليم, مليم) +DZD:(\D+) $(\1: دينار جزائري, دينار جزائري, سنتيم, سنتيم) +MAD:(\D+) $(\1: درهم مغربي, درهم مغربي, سنتيم, سنتيم) +SDG:(\D+) $(\1: جنيه سوداني, جنيه سوداني, قرش, قرش) +MRU:(\D+) $(\1: أوقية موريتانية, أوقية موريتانية, خمس, خمس) +YER:(\D+) $(\1: ريال يمني, ريال يمني, فلس, فلس) +SOS:(\D+) $(\1: شلن صومالي, شلن صومالي, سنت, سنت) +DJF:(\D+) $(\1: فرنك جيبوتي, فرنك جيبوتي, سنتيم, سنتيم) +KMF:(\D+) $(\1: فرنك قمري, فرنك قمري, سنتيم, سنتيم) + +# International currencies +USD:(\D+) $(\1: دولار أمريكي, دولار أمريكي, سنت, سنت) +EUR:(\D+) $(\1: يورو, يورو, سنت, سنت) +GBP:(\D+) $(\1: جنيه إسترليني, جنيه إسترليني, بنس, بنس) +CHF:(\D+) $(\1: فرنك سويسري, فرنك سويسري, سنتيم, سنتيم) +JPY:(\D+) $(\1: ين ياباني, ين ياباني, سن, سن) +CNY:(\D+) $(\1: يوان صيني, يوان صيني, فن, فن) + +# Currency patterns +"([A-Z]{3}) ([-−]?1)([.,]00?)?" $2$(\1:us) +"([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2$(\1:up) + +"(([A-Z]{3}) [-−]?\d+)[.,](01)" $1 و|$(1)$(\2:ss) +"(([A-Z]{3}) [-−]?\d+)[.,](\d)" $1 و|$(\30)$(\2:sp) +"(([A-Z]{3}) [-−]?\d+)[.,](\d\d)" $1 و|$3$(\2:sp) + +== money == + +"([A-Z]{3}) ([-−]?1)([.,]00?)?" $2$(\1:us) +"([A-Z]{3}) ([-−]?\d+)([.,]00?)?" $2$(\1:up) + +"(([A-Z]{3}) ([-−]?\d+))[.,](01)" $3 و1/100$(\2:us) +"(([A-Z]{3}) ([-−]?\d+))[.,](\d)" $3 و\40/100$(\2:up) +"(([A-Z]{3}) ([-−]?\d+))[.,](\d\d)" $3 و\4/100$(\2:up) +"(([A-Z]{3}) ([-−]?\d+))[.,](\d\d\d)" $3 و\4/1000$(\2:up) + +== ordinal == + +# Convert to text, then convert cardinal to ordinal +([-−]?\d+) $(ordinal |$1) + +# Ordinal forms (masculine by default) +(.*)واحد \1الأول +(.*)اثنان \1الثاني +(.*)ثلاثة \1الثالث +(.*)أربعة \1الرابع +(.*)خمسة \1الخامس +(.*)ستة \1السادس +(.*)سبعة \1السابع +(.*)ثمانية \1الثامن +(.*)تسعة \1التاسع +(.*)عشرة \1العاشر +(.*)أحد عشر \1الحادي عشر +(.*)اثنا عشر \1الثاني عشر +(.*)عشرون \1العشرون +(.*)ثلاثون \1الثلاثون +(.*)مائة \1المائة +(.*)ألف \1الألف +(.*) \1 + +== ordinal-number == + +# Ordinal abbreviation (no standard in Arabic, just append suffix) +1 الأول +2 الثاني +3 الثالث +4 الرابع +5 الخامس +6 السادس +7 السابع +8 الثامن +9 التاسع +10 العاشر +(.*) ال\1 + +== help == + +"" $(1)|، $(2)، $(3)\nمذكر: $(m:3) = |$(m:3)\nمؤنث: $(f:3) = |$(f:3)\nترتيبي: $(\0 ordinal)\nعملة: $(SAR 2.5)\nنقود: $(money USD 100.25) +"(ordinal(-number)?|SAR|USD)" \1: $(\1 1)، $(\1 2)، $(\1 3)\n