localize.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. import { buildLocalizeFn } from "../../_lib/buildLocalizeFn.js";
  2. const numberValues = {
  3. locale: {
  4. 1: "১",
  5. 2: "২",
  6. 3: "৩",
  7. 4: "৪",
  8. 5: "৫",
  9. 6: "৬",
  10. 7: "৭",
  11. 8: "৮",
  12. 9: "৯",
  13. 0: "০",
  14. },
  15. number: {
  16. "১": "1",
  17. "২": "2",
  18. "৩": "3",
  19. "৪": "4",
  20. "৫": "5",
  21. "৬": "6",
  22. "৭": "7",
  23. "৮": "8",
  24. "৯": "9",
  25. "০": "0",
  26. },
  27. };
  28. const eraValues = {
  29. narrow: ["খ্রিঃপূঃ", "খ্রিঃ"],
  30. abbreviated: ["খ্রিঃপূর্ব", "খ্রিঃ"],
  31. wide: ["খ্রিস্টপূর্ব", "খ্রিস্টাব্দ"],
  32. };
  33. const quarterValues = {
  34. narrow: ["১", "২", "৩", "৪"],
  35. abbreviated: ["১ত্রৈ", "২ত্রৈ", "৩ত্রৈ", "৪ত্রৈ"],
  36. wide: ["১ম ত্রৈমাসিক", "২য় ত্রৈমাসিক", "৩য় ত্রৈমাসিক", "৪র্থ ত্রৈমাসিক"],
  37. };
  38. const monthValues = {
  39. narrow: [
  40. "জানু",
  41. "ফেব্রু",
  42. "মার্চ",
  43. "এপ্রিল",
  44. "মে",
  45. "জুন",
  46. "জুলাই",
  47. "আগস্ট",
  48. "সেপ্ট",
  49. "অক্টো",
  50. "নভে",
  51. "ডিসে",
  52. ],
  53. abbreviated: [
  54. "জানু",
  55. "ফেব্রু",
  56. "মার্চ",
  57. "এপ্রিল",
  58. "মে",
  59. "জুন",
  60. "জুলাই",
  61. "আগস্ট",
  62. "সেপ্ট",
  63. "অক্টো",
  64. "নভে",
  65. "ডিসে",
  66. ],
  67. wide: [
  68. "জানুয়ারি",
  69. "ফেব্রুয়ারি",
  70. "মার্চ",
  71. "এপ্রিল",
  72. "মে",
  73. "জুন",
  74. "জুলাই",
  75. "আগস্ট",
  76. "সেপ্টেম্বর",
  77. "অক্টোবর",
  78. "নভেম্বর",
  79. "ডিসেম্বর",
  80. ],
  81. };
  82. const dayValues = {
  83. narrow: ["র", "সো", "ম", "বু", "বৃ", "শু", "শ"],
  84. short: ["রবি", "সোম", "মঙ্গল", "বুধ", "বৃহ", "শুক্র", "শনি"],
  85. abbreviated: ["রবি", "সোম", "মঙ্গল", "বুধ", "বৃহ", "শুক্র", "শনি"],
  86. wide: [
  87. "রবিবার",
  88. "সোমবার",
  89. "মঙ্গলবার",
  90. "বুধবার",
  91. "বৃহস্পতিবার ",
  92. "শুক্রবার",
  93. "শনিবার",
  94. ],
  95. };
  96. const dayPeriodValues = {
  97. narrow: {
  98. am: "পূ",
  99. pm: "অপ",
  100. midnight: "মধ্যরাত",
  101. noon: "মধ্যাহ্ন",
  102. morning: "সকাল",
  103. afternoon: "বিকাল",
  104. evening: "সন্ধ্যা",
  105. night: "রাত",
  106. },
  107. abbreviated: {
  108. am: "পূর্বাহ্ন",
  109. pm: "অপরাহ্ন",
  110. midnight: "মধ্যরাত",
  111. noon: "মধ্যাহ্ন",
  112. morning: "সকাল",
  113. afternoon: "বিকাল",
  114. evening: "সন্ধ্যা",
  115. night: "রাত",
  116. },
  117. wide: {
  118. am: "পূর্বাহ্ন",
  119. pm: "অপরাহ্ন",
  120. midnight: "মধ্যরাত",
  121. noon: "মধ্যাহ্ন",
  122. morning: "সকাল",
  123. afternoon: "বিকাল",
  124. evening: "সন্ধ্যা",
  125. night: "রাত",
  126. },
  127. };
  128. const formattingDayPeriodValues = {
  129. narrow: {
  130. am: "পূ",
  131. pm: "অপ",
  132. midnight: "মধ্যরাত",
  133. noon: "মধ্যাহ্ন",
  134. morning: "সকাল",
  135. afternoon: "বিকাল",
  136. evening: "সন্ধ্যা",
  137. night: "রাত",
  138. },
  139. abbreviated: {
  140. am: "পূর্বাহ্ন",
  141. pm: "অপরাহ্ন",
  142. midnight: "মধ্যরাত",
  143. noon: "মধ্যাহ্ন",
  144. morning: "সকাল",
  145. afternoon: "বিকাল",
  146. evening: "সন্ধ্যা",
  147. night: "রাত",
  148. },
  149. wide: {
  150. am: "পূর্বাহ্ন",
  151. pm: "অপরাহ্ন",
  152. midnight: "মধ্যরাত",
  153. noon: "মধ্যাহ্ন",
  154. morning: "সকাল",
  155. afternoon: "বিকাল",
  156. evening: "সন্ধ্যা",
  157. night: "রাত",
  158. },
  159. };
  160. function dateOrdinalNumber(number, localeNumber) {
  161. if (number > 18 && number <= 31) {
  162. return localeNumber + "শে";
  163. } else {
  164. switch (number) {
  165. case 1:
  166. return localeNumber + "লা";
  167. case 2:
  168. case 3:
  169. return localeNumber + "রা";
  170. case 4:
  171. return localeNumber + "ঠা";
  172. default:
  173. return localeNumber + "ই";
  174. }
  175. }
  176. }
  177. const ordinalNumber = (dirtyNumber, options) => {
  178. const number = Number(dirtyNumber);
  179. const localeNumber = numberToLocale(number);
  180. const unit = options?.unit;
  181. if (unit === "date") {
  182. return dateOrdinalNumber(number, localeNumber);
  183. }
  184. if (number > 10 || number === 0) return localeNumber + "তম";
  185. const rem10 = number % 10;
  186. switch (rem10) {
  187. case 2:
  188. case 3:
  189. return localeNumber + "য়";
  190. case 4:
  191. return localeNumber + "র্থ";
  192. case 6:
  193. return localeNumber + "ষ্ঠ";
  194. default:
  195. return localeNumber + "ম";
  196. }
  197. };
  198. // function localeToNumber(locale: string): number {
  199. // const enNumber = locale.toString().replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
  200. // return numberValues.number[match as keyof typeof numberValues.number]
  201. // })
  202. // return Number(enNumber)
  203. // }
  204. export function numberToLocale(enNumber) {
  205. return enNumber.toString().replace(/\d/g, function (match) {
  206. return numberValues.locale[match];
  207. });
  208. }
  209. export const localize = {
  210. ordinalNumber,
  211. era: buildLocalizeFn({
  212. values: eraValues,
  213. defaultWidth: "wide",
  214. }),
  215. quarter: buildLocalizeFn({
  216. values: quarterValues,
  217. defaultWidth: "wide",
  218. argumentCallback: (quarter) => quarter - 1,
  219. }),
  220. month: buildLocalizeFn({
  221. values: monthValues,
  222. defaultWidth: "wide",
  223. }),
  224. day: buildLocalizeFn({
  225. values: dayValues,
  226. defaultWidth: "wide",
  227. }),
  228. dayPeriod: buildLocalizeFn({
  229. values: dayPeriodValues,
  230. defaultWidth: "wide",
  231. formattingValues: formattingDayPeriodValues,
  232. defaultFormattingWidth: "wide",
  233. }),
  234. };