localize.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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: [
  11. "1-во тримесечие",
  12. "2-ро тримесечие",
  13. "3-то тримесечие",
  14. "4-то тримесечие",
  15. ],
  16. };
  17. const monthValues = {
  18. abbreviated: [
  19. "яну",
  20. "фев",
  21. "мар",
  22. "апр",
  23. "май",
  24. "юни",
  25. "юли",
  26. "авг",
  27. "сеп",
  28. "окт",
  29. "ное",
  30. "дек",
  31. ],
  32. wide: [
  33. "януари",
  34. "февруари",
  35. "март",
  36. "април",
  37. "май",
  38. "юни",
  39. "юли",
  40. "август",
  41. "септември",
  42. "октомври",
  43. "ноември",
  44. "декември",
  45. ],
  46. };
  47. const dayValues = {
  48. narrow: ["Н", "П", "В", "С", "Ч", "П", "С"],
  49. short: ["нд", "пн", "вт", "ср", "чт", "пт", "сб"],
  50. abbreviated: ["нед", "пон", "вто", "сря", "чет", "пет", "съб"],
  51. wide: [
  52. "неделя",
  53. "понеделник",
  54. "вторник",
  55. "сряда",
  56. "четвъртък",
  57. "петък",
  58. "събота",
  59. ],
  60. };
  61. const dayPeriodValues = {
  62. wide: {
  63. am: "преди обяд",
  64. pm: "след обяд",
  65. midnight: "в полунощ",
  66. noon: "на обяд",
  67. morning: "сутринта",
  68. afternoon: "следобед",
  69. evening: "вечерта",
  70. night: "през нощта",
  71. },
  72. };
  73. function isFeminine(unit) {
  74. return (
  75. unit === "year" || unit === "week" || unit === "minute" || unit === "second"
  76. );
  77. }
  78. function isNeuter(unit) {
  79. return unit === "quarter";
  80. }
  81. function numberWithSuffix(number, unit, masculine, feminine, neuter) {
  82. const suffix = isNeuter(unit)
  83. ? neuter
  84. : isFeminine(unit)
  85. ? feminine
  86. : masculine;
  87. return number + "-" + suffix;
  88. }
  89. const ordinalNumber = (dirtyNumber, options) => {
  90. const number = Number(dirtyNumber);
  91. const unit = options?.unit;
  92. if (number === 0) {
  93. return numberWithSuffix(0, unit, "ев", "ева", "ево");
  94. } else if (number % 1000 === 0) {
  95. return numberWithSuffix(number, unit, "ен", "на", "но");
  96. } else if (number % 100 === 0) {
  97. return numberWithSuffix(number, unit, "тен", "тна", "тно");
  98. }
  99. const rem100 = number % 100;
  100. if (rem100 > 20 || rem100 < 10) {
  101. switch (rem100 % 10) {
  102. case 1:
  103. return numberWithSuffix(number, unit, "ви", "ва", "во");
  104. case 2:
  105. return numberWithSuffix(number, unit, "ри", "ра", "ро");
  106. case 7:
  107. case 8:
  108. return numberWithSuffix(number, unit, "ми", "ма", "мо");
  109. }
  110. }
  111. return numberWithSuffix(number, unit, "ти", "та", "то");
  112. };
  113. export const localize = {
  114. ordinalNumber,
  115. era: buildLocalizeFn({
  116. values: eraValues,
  117. defaultWidth: "wide",
  118. }),
  119. quarter: buildLocalizeFn({
  120. values: quarterValues,
  121. defaultWidth: "wide",
  122. argumentCallback: (quarter) => quarter - 1,
  123. }),
  124. month: buildLocalizeFn({
  125. values: monthValues,
  126. defaultWidth: "wide",
  127. }),
  128. day: buildLocalizeFn({
  129. values: dayValues,
  130. defaultWidth: "wide",
  131. }),
  132. dayPeriod: buildLocalizeFn({
  133. values: dayPeriodValues,
  134. defaultWidth: "wide",
  135. }),
  136. };