localize.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import { buildLocalizeFn } from "../../_lib/buildLocalizeFn.js";
  2. const eraValues = {
  3. narrow: ["av. J.-C", "ap. J.-C"],
  4. abbreviated: ["av. J.-C", "ap. J.-C"],
  5. wide: ["avant Jésus-Christ", "après Jésus-Christ"],
  6. };
  7. const quarterValues = {
  8. narrow: ["T1", "T2", "T3", "T4"],
  9. abbreviated: ["1er trim.", "2ème trim.", "3ème trim.", "4ème trim."],
  10. wide: ["1er trimestre", "2ème trimestre", "3ème trimestre", "4ème trimestre"],
  11. };
  12. const monthValues = {
  13. narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],
  14. abbreviated: [
  15. "janv.",
  16. "févr.",
  17. "mars",
  18. "avr.",
  19. "mai",
  20. "juin",
  21. "juil.",
  22. "août",
  23. "sept.",
  24. "oct.",
  25. "nov.",
  26. "déc.",
  27. ],
  28. wide: [
  29. "janvier",
  30. "février",
  31. "mars",
  32. "avril",
  33. "mai",
  34. "juin",
  35. "juillet",
  36. "août",
  37. "septembre",
  38. "octobre",
  39. "novembre",
  40. "décembre",
  41. ],
  42. };
  43. const dayValues = {
  44. narrow: ["D", "L", "M", "M", "J", "V", "S"],
  45. short: ["di", "lu", "ma", "me", "je", "ve", "sa"],
  46. abbreviated: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."],
  47. wide: [
  48. "dimanche",
  49. "lundi",
  50. "mardi",
  51. "mercredi",
  52. "jeudi",
  53. "vendredi",
  54. "samedi",
  55. ],
  56. };
  57. const dayPeriodValues = {
  58. narrow: {
  59. am: "AM",
  60. pm: "PM",
  61. midnight: "minuit",
  62. noon: "midi",
  63. morning: "mat.",
  64. afternoon: "ap.m.",
  65. evening: "soir",
  66. night: "mat.",
  67. },
  68. abbreviated: {
  69. am: "AM",
  70. pm: "PM",
  71. midnight: "minuit",
  72. noon: "midi",
  73. morning: "matin",
  74. afternoon: "après-midi",
  75. evening: "soir",
  76. night: "matin",
  77. },
  78. wide: {
  79. am: "AM",
  80. pm: "PM",
  81. midnight: "minuit",
  82. noon: "midi",
  83. morning: "du matin",
  84. afternoon: "de l’après-midi",
  85. evening: "du soir",
  86. night: "du matin",
  87. },
  88. };
  89. const ordinalNumber = (dirtyNumber, options) => {
  90. const number = Number(dirtyNumber);
  91. const unit = options?.unit;
  92. if (number === 0) return "0";
  93. const feminineUnits = ["year", "week", "hour", "minute", "second"];
  94. let suffix;
  95. if (number === 1) {
  96. suffix = unit && feminineUnits.includes(unit) ? "ère" : "er";
  97. } else {
  98. suffix = "ème";
  99. }
  100. return number + suffix;
  101. };
  102. const LONG_MONTHS_TOKENS = ["MMM", "MMMM"];
  103. export const localize = {
  104. preprocessor: (date, parts) => {
  105. // Replaces the `do` tokens with `d` when used with long month tokens and the day of the month is greater than one.
  106. // Use case "do MMMM" => 1er août, 29 août
  107. // see https://github.com/date-fns/date-fns/issues/1391
  108. if (date.getDate() === 1) return parts;
  109. const hasLongMonthToken = parts.some(
  110. (part) => part.isToken && LONG_MONTHS_TOKENS.includes(part.value),
  111. );
  112. if (!hasLongMonthToken) return parts;
  113. return parts.map((part) =>
  114. part.isToken && part.value === "do"
  115. ? { isToken: true, value: "d" }
  116. : part,
  117. );
  118. },
  119. ordinalNumber,
  120. era: buildLocalizeFn({
  121. values: eraValues,
  122. defaultWidth: "wide",
  123. }),
  124. quarter: buildLocalizeFn({
  125. values: quarterValues,
  126. defaultWidth: "wide",
  127. argumentCallback: (quarter) => quarter - 1,
  128. }),
  129. month: buildLocalizeFn({
  130. values: monthValues,
  131. defaultWidth: "wide",
  132. }),
  133. day: buildLocalizeFn({
  134. values: dayValues,
  135. defaultWidth: "wide",
  136. }),
  137. dayPeriod: buildLocalizeFn({
  138. values: dayPeriodValues,
  139. defaultWidth: "wide",
  140. }),
  141. };