localize.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import { buildLocalizeFn } from "../../_lib/buildLocalizeFn.js";
  2. const eraValues = {
  3. narrow: ["да н.э.", "н.э."],
  4. abbreviated: ["да н. э.", "н. э."],
  5. wide: ["да нашай эры", "нашай эры"],
  6. };
  7. const quarterValues = {
  8. narrow: ["1", "2", "3", "4"],
  9. abbreviated: ["1-ы кв.", "2-і кв.", "3-і кв.", "4-ы кв."],
  10. wide: ["1-ы квартал", "2-і квартал", "3-і квартал", "4-ы квартал"],
  11. };
  12. const monthValues = {
  13. narrow: ["С", "Л", "С", "К", "М", "Ч", "Л", "Ж", "В", "К", "Л", "С"],
  14. abbreviated: [
  15. "студз.",
  16. "лют.",
  17. "сак.",
  18. "крас.",
  19. "май",
  20. "чэрв.",
  21. "ліп.",
  22. "жн.",
  23. "вер.",
  24. "кастр.",
  25. "ліст.",
  26. "снеж.",
  27. ],
  28. wide: [
  29. "студзень",
  30. "люты",
  31. "сакавік",
  32. "красавік",
  33. "май",
  34. "чэрвень",
  35. "ліпень",
  36. "жнівень",
  37. "верасень",
  38. "кастрычнік",
  39. "лістапад",
  40. "снежань",
  41. ],
  42. };
  43. const formattingMonthValues = {
  44. narrow: ["С", "Л", "С", "К", "М", "Ч", "Л", "Ж", "В", "К", "Л", "С"],
  45. abbreviated: [
  46. "студз.",
  47. "лют.",
  48. "сак.",
  49. "крас.",
  50. "мая",
  51. "чэрв.",
  52. "ліп.",
  53. "жн.",
  54. "вер.",
  55. "кастр.",
  56. "ліст.",
  57. "снеж.",
  58. ],
  59. wide: [
  60. "студзеня",
  61. "лютага",
  62. "сакавіка",
  63. "красавіка",
  64. "мая",
  65. "чэрвеня",
  66. "ліпеня",
  67. "жніўня",
  68. "верасня",
  69. "кастрычніка",
  70. "лістапада",
  71. "снежня",
  72. ],
  73. };
  74. const dayValues = {
  75. narrow: ["Н", "П", "А", "С", "Ч", "П", "С"],
  76. short: ["нд", "пн", "аў", "ср", "чц", "пт", "сб"],
  77. abbreviated: ["нядз", "пан", "аўт", "сер", "чац", "пят", "суб"],
  78. wide: [
  79. "нядзеля",
  80. "панядзелак",
  81. "аўторак",
  82. "серада",
  83. "чацвер",
  84. "пятніца",
  85. "субота",
  86. ],
  87. };
  88. const dayPeriodValues = {
  89. narrow: {
  90. am: "ДП",
  91. pm: "ПП",
  92. midnight: "поўн.",
  93. noon: "поўд.",
  94. morning: "ран.",
  95. afternoon: "дзень",
  96. evening: "веч.",
  97. night: "ноч",
  98. },
  99. abbreviated: {
  100. am: "ДП",
  101. pm: "ПП",
  102. midnight: "поўн.",
  103. noon: "поўд.",
  104. morning: "ран.",
  105. afternoon: "дзень",
  106. evening: "веч.",
  107. night: "ноч",
  108. },
  109. wide: {
  110. am: "ДП",
  111. pm: "ПП",
  112. midnight: "поўнач",
  113. noon: "поўдзень",
  114. morning: "раніца",
  115. afternoon: "дзень",
  116. evening: "вечар",
  117. night: "ноч",
  118. },
  119. };
  120. const formattingDayPeriodValues = {
  121. narrow: {
  122. am: "ДП",
  123. pm: "ПП",
  124. midnight: "поўн.",
  125. noon: "поўд.",
  126. morning: "ран.",
  127. afternoon: "дня",
  128. evening: "веч.",
  129. night: "ночы",
  130. },
  131. abbreviated: {
  132. am: "ДП",
  133. pm: "ПП",
  134. midnight: "поўн.",
  135. noon: "поўд.",
  136. morning: "ран.",
  137. afternoon: "дня",
  138. evening: "веч.",
  139. night: "ночы",
  140. },
  141. wide: {
  142. am: "ДП",
  143. pm: "ПП",
  144. midnight: "поўнач",
  145. noon: "поўдзень",
  146. morning: "раніцы",
  147. afternoon: "дня",
  148. evening: "вечара",
  149. night: "ночы",
  150. },
  151. };
  152. const ordinalNumber = (dirtyNumber, options) => {
  153. const unit = String(options?.unit);
  154. const number = Number(dirtyNumber);
  155. let suffix;
  156. /** Though it's an incorrect ordinal form of a date we use it here for consistency with other similar locales (ru, uk)
  157. * For date-month combinations should be used `d` formatter.
  158. * Correct: `d MMMM` (4 верасня)
  159. * Incorrect: `do MMMM` (4-га верасня)
  160. *
  161. * But following the consistency leads to mistakes for literal uses of `do` formatter (ordinal day of month).
  162. * So for phrase "5th day of month" (`do дзень месяца`)
  163. * library will produce: `5-га дзень месяца`
  164. * but correct spelling should be: `5-ы дзень месяца`
  165. *
  166. * So I guess there should be a stand-alone and a formatting version of "day of month" formatters
  167. */
  168. if (unit === "date") {
  169. suffix = "-га";
  170. } else if (unit === "hour" || unit === "minute" || unit === "second") {
  171. suffix = "-я";
  172. } else {
  173. suffix =
  174. (number % 10 === 2 || number % 10 === 3) &&
  175. number % 100 !== 12 &&
  176. number % 100 !== 13
  177. ? "-і"
  178. : "-ы";
  179. }
  180. return number + suffix;
  181. };
  182. export const localize = {
  183. ordinalNumber,
  184. era: buildLocalizeFn({
  185. values: eraValues,
  186. defaultWidth: "wide",
  187. }),
  188. quarter: buildLocalizeFn({
  189. values: quarterValues,
  190. defaultWidth: "wide",
  191. argumentCallback: (quarter) => quarter - 1,
  192. }),
  193. month: buildLocalizeFn({
  194. values: monthValues,
  195. defaultWidth: "wide",
  196. formattingValues: formattingMonthValues,
  197. defaultFormattingWidth: "wide",
  198. }),
  199. day: buildLocalizeFn({
  200. values: dayValues,
  201. defaultWidth: "wide",
  202. }),
  203. dayPeriod: buildLocalizeFn({
  204. values: dayPeriodValues,
  205. defaultWidth: "any",
  206. formattingValues: formattingDayPeriodValues,
  207. defaultFormattingWidth: "wide",
  208. }),
  209. };