diff --git a/package.json b/package.json
index 2e09a1f7..77def313 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
 		"react-flip-toolkit": "7.0.14",
 		"react-github-calendar": "3.3.1",
 		"react-helmet": "6.1.0",
-		"react-intl": "6.0.4",
+		"react-intl": "7.1.2",
 		"react-markdown": "^8.0.3",
 		"react-query": "3.39.1",
 		"react-router-dom": "6.3.0",
@@ -70,7 +70,7 @@
 		"@babel/core": "7.18.2",
 		"@babel/preset-env": "7.18.2",
 		"@cypress/code-coverage": "3.10.0",
-		"@formatjs/cli": "5.0.2",
+		"@formatjs/cli": "6.4.3",
 		"@nabla/vite-plugin-eslint": "1.4.0",
 		"@rollup/plugin-yaml": "3.1.0",
 		"@tailwindcss/line-clamp": "0.4.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a0d3f90e..5d91100f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -99,8 +99,8 @@ importers:
         specifier: 6.1.0
         version: 6.1.0(react@17.0.2)
       react-intl:
-        specifier: 6.0.4
-        version: 6.0.4(react@17.0.2)(typescript@4.7.2)
+        specifier: 7.1.2
+        version: 7.1.2(react@17.0.2)(typescript@4.7.2)
       react-markdown:
         specifier: ^8.0.3
         version: 8.0.3(@types/react@17.0.45)(react@17.0.2)
@@ -130,8 +130,8 @@ importers:
         specifier: 3.10.0
         version: 3.10.0(@babel/core@7.18.2)(@babel/preset-env@7.18.2(@babel/core@7.18.2))(babel-loader@8.2.5(@babel/core@7.18.2)(webpack@5.72.1))(cypress@9.7.0)(webpack@5.72.1)
       '@formatjs/cli':
-        specifier: 5.0.2
-        version: 5.0.2
+        specifier: 6.4.3
+        version: 6.4.3
       '@nabla/vite-plugin-eslint':
         specifier: 1.4.0
         version: 1.4.0(eslint@8.16.0)(vite@2.9.9)
@@ -1047,41 +1047,68 @@ packages:
     resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
 
-  '@formatjs/cli@5.0.2':
-    resolution: {integrity: sha512-I25CK1NjqBPab50VZxUHeIwYtDx6C/upjuNQCUUD/Ehte0EoGQk2QOkpwqRScuiFVjLiD2dNxGbq+5n5NGRq7g==}
-    engines: {node: '>= 16.5.0'}
+  '@formatjs/cli@6.4.3':
+    resolution: {integrity: sha512-96y9oOJ38Tecqf5BT/jCpEnBWwZvJfsuUIZwYl9g/FNfTwNSZw/zJCOmgoLedx9dV4A4pi6ZZz9Jm7Ou00GV8g==}
+    engines: {node: '>= 16'}
     hasBin: true
     peerDependencies:
-      '@vue/compiler-sfc': ^3.2.34
+      '@glimmer/env': ^0.1.7
+      '@glimmer/reference': ^0.91.1 || ^0.92.0 || ^0.93.0
+      '@glimmer/syntax': ^0.92.0 || ^0.93.0
+      '@glimmer/validator': ^0.92.0 || ^0.93.0
+      '@vue/compiler-core': ^3.4.0
+      content-tag: ^2.0.1 || ^3.0.0
+      ember-template-recast: ^6.1.4
+      vue: ^3.4.0
     peerDependenciesMeta:
-      '@vue/compiler-sfc':
+      '@glimmer/env':
+        optional: true
+      '@glimmer/reference':
+        optional: true
+      '@glimmer/syntax':
+        optional: true
+      '@glimmer/validator':
+        optional: true
+      '@vue/compiler-core':
+        optional: true
+      content-tag:
+        optional: true
+      ember-template-recast:
+        optional: true
+      vue:
         optional: true
 
   '@formatjs/ecma402-abstract@1.11.7':
     resolution: {integrity: sha512-uNaok4XWMJBtPZk/veTDamFCm5HeWJUk2jwoVfH5/+wenQ60QHjH6T3UQ0GOOCz9jpKmed7vqOri7xSf//Dt7g==}
 
-  '@formatjs/fast-memoize@1.2.4':
-    resolution: {integrity: sha512-9ARYoLR8AEzXvj2nYrOVHY/h1dDMDWGTnKDLXSISF1uoPakSmfcZuSqjiqZX2wRkEUimPxdwTu/agyozBtZRHA==}
+  '@formatjs/ecma402-abstract@2.3.2':
+    resolution: {integrity: sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg==}
+
+  '@formatjs/fast-memoize@2.2.6':
+    resolution: {integrity: sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==}
 
   '@formatjs/icu-messageformat-parser@2.1.3':
     resolution: {integrity: sha512-hsdAn1dXcujW/G8DHw0iiIy7357pw10yOulCrL6xrQOKJAxT7m7EgpG0Hm1OW9xqaLEzqWyE/jA2AGVnOCaCQw==}
 
+  '@formatjs/icu-messageformat-parser@2.10.1':
+    resolution: {integrity: sha512-lB+NjlwmiJAajFWP4Lmn6Qdc5N02I90S7NUTRvLplz00urgAqN3n2DZGQNc+AQ7k+pADnxEVYviZzmtyk5+fqw==}
+
   '@formatjs/icu-skeleton-parser@1.3.9':
     resolution: {integrity: sha512-s9THwwhiiSzbGSk73FP6Ur2MBwEj1vfgYDHKa5FiXGQMfYzdRdRvyH1dgqNgSFJPB6PM3DKtkloJLjpqpSDNUg==}
 
-  '@formatjs/intl-displaynames@6.0.2':
-    resolution: {integrity: sha512-h9Id/6vbSHpARHKMVsjWag3KMZJpop9s67CZTd+AMxhjHb5xDG2b5rlSRJKx/UdIDQ+GzESK7a4fv32yylG3cw==}
-
-  '@formatjs/intl-listformat@7.0.2':
-    resolution: {integrity: sha512-K+HXrYIvEcAH/dS8XXnSHQYC/z4w0eHjPlDx43HOoDY87/xV7rpHxFVXWXTgwLYC6iAPUO72Y/AaT9iq873juw==}
+  '@formatjs/icu-skeleton-parser@1.8.12':
+    resolution: {integrity: sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg==}
 
   '@formatjs/intl-localematcher@0.2.28':
     resolution: {integrity: sha512-FLsc6Gifs1np/8HnCn/7Q+lHMmenrD5fuDhRT82yj0gi9O19kfaFwjQUw1gZsyILuRyT93GuzdifHj7TKRhBcw==}
 
-  '@formatjs/intl@2.3.0':
-    resolution: {integrity: sha512-mE8zGqP+Flrd8tS3AsdvSucnblqwR5gsGM4Bd5711abkabrz52F2TDrU88rVvVfCdHV4dFHFYEmUBVZZ4pATtg==}
+  '@formatjs/intl-localematcher@0.5.10':
+    resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==}
+
+  '@formatjs/intl@3.1.2':
+    resolution: {integrity: sha512-hgcnKSF7Hs2YTEKRKdV0m2efhObSAh2mFSwzjoBYPGrKO+Y3txqKm1/S5sCck3ei3zigvYOhPeYI4VP4cxLIow==}
     peerDependencies:
-      typescript: ^4.5
+      typescript: '5'
     peerDependenciesMeta:
       typescript:
         optional: true
@@ -1728,6 +1755,7 @@ packages:
   '@xmldom/xmldom@0.7.5':
     resolution: {integrity: sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==}
     engines: {node: '>=10.0.0'}
+    deprecated: this version is no longer supported, please update to at least 0.8.*
 
   '@xtuc/ieee754@1.2.0':
     resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
@@ -1744,6 +1772,7 @@ packages:
 
   acorn-import-assertions@1.8.0:
     resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==}
+    deprecated: package has been renamed to acorn-import-attributes
     peerDependencies:
       acorn: ^8
 
@@ -2880,6 +2909,7 @@ packages:
   eslint@8.16.0:
     resolution: {integrity: sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
     hasBin: true
 
   espree@9.3.2:
@@ -3417,8 +3447,8 @@ packages:
     resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==}
     engines: {node: '>= 0.4'}
 
-  intl-messageformat@10.1.0:
-    resolution: {integrity: sha512-diGMDv9Zo2Mggf6AkJszq/BIR5+rarkwcr4g5JGgREwbwAHY9hR/dYd8FbIgQx2RTxhJsABfAWCiENFLbaTZjg==}
+  intl-messageformat@10.7.13:
+    resolution: {integrity: sha512-WMaGd3v055IQwY7fs0N3ZLMC8lVf2Fw2jB45mRhb257rh7HU4cfNpp4wExUqdkxDp4UCLpOjVzKeTQ4U7ciatA==}
 
   is-arrayish@0.2.1:
     resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
@@ -4584,11 +4614,11 @@ packages:
     peerDependencies:
       react: '>=16.3.0'
 
-  react-intl@6.0.4:
-    resolution: {integrity: sha512-eBIP4QuFOdr67+ZmNOA7WGzJ6dj0qgsGQbx3phzcel2B0kVLvfojTJuvYiFuLgbZTrRJMjHwYJZO5zsmibsfug==}
+  react-intl@7.1.2:
+    resolution: {integrity: sha512-fETQeAoRPDkyXXY8pk6AaHsrX4o14j6C+JMgY1mjn4a8OnsKnr/UfFgQLV8I59tZot90N+MDVlWJYjZK7yuUTQ==}
     peerDependencies:
       react: ^16.6.0 || 17 || 18
-      typescript: ^4.5
+      typescript: '5'
     peerDependenciesMeta:
       typescript:
         optional: true
@@ -6788,14 +6818,21 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@formatjs/cli@5.0.2': {}
+  '@formatjs/cli@6.4.3': {}
 
   '@formatjs/ecma402-abstract@1.11.7':
     dependencies:
       '@formatjs/intl-localematcher': 0.2.28
       tslib: 2.4.0
 
-  '@formatjs/fast-memoize@1.2.4':
+  '@formatjs/ecma402-abstract@2.3.2':
+    dependencies:
+      '@formatjs/fast-memoize': 2.2.6
+      '@formatjs/intl-localematcher': 0.5.10
+      decimal.js: 10.3.1
+      tslib: 2.4.0
+
+  '@formatjs/fast-memoize@2.2.6':
     dependencies:
       tslib: 2.4.0
 
@@ -6805,35 +6842,36 @@ snapshots:
       '@formatjs/icu-skeleton-parser': 1.3.9
       tslib: 2.4.0
 
-  '@formatjs/icu-skeleton-parser@1.3.9':
+  '@formatjs/icu-messageformat-parser@2.10.1':
     dependencies:
-      '@formatjs/ecma402-abstract': 1.11.7
+      '@formatjs/ecma402-abstract': 2.3.2
+      '@formatjs/icu-skeleton-parser': 1.8.12
       tslib: 2.4.0
 
-  '@formatjs/intl-displaynames@6.0.2':
+  '@formatjs/icu-skeleton-parser@1.3.9':
     dependencies:
       '@formatjs/ecma402-abstract': 1.11.7
-      '@formatjs/intl-localematcher': 0.2.28
       tslib: 2.4.0
 
-  '@formatjs/intl-listformat@7.0.2':
+  '@formatjs/icu-skeleton-parser@1.8.12':
     dependencies:
-      '@formatjs/ecma402-abstract': 1.11.7
-      '@formatjs/intl-localematcher': 0.2.28
+      '@formatjs/ecma402-abstract': 2.3.2
       tslib: 2.4.0
 
   '@formatjs/intl-localematcher@0.2.28':
     dependencies:
       tslib: 2.4.0
 
-  '@formatjs/intl@2.3.0(typescript@4.7.2)':
+  '@formatjs/intl-localematcher@0.5.10':
     dependencies:
-      '@formatjs/ecma402-abstract': 1.11.7
-      '@formatjs/fast-memoize': 1.2.4
-      '@formatjs/icu-messageformat-parser': 2.1.3
-      '@formatjs/intl-displaynames': 6.0.2
-      '@formatjs/intl-listformat': 7.0.2
-      intl-messageformat: 10.1.0
+      tslib: 2.4.0
+
+  '@formatjs/intl@3.1.2(typescript@4.7.2)':
+    dependencies:
+      '@formatjs/ecma402-abstract': 2.3.2
+      '@formatjs/fast-memoize': 2.2.6
+      '@formatjs/icu-messageformat-parser': 2.10.1
+      intl-messageformat: 10.7.13
       tslib: 2.4.0
     optionalDependencies:
       typescript: 4.7.2
@@ -9470,11 +9508,11 @@ snapshots:
       has: 1.0.3
       side-channel: 1.0.4
 
-  intl-messageformat@10.1.0:
+  intl-messageformat@10.7.13:
     dependencies:
-      '@formatjs/ecma402-abstract': 1.11.7
-      '@formatjs/fast-memoize': 1.2.4
-      '@formatjs/icu-messageformat-parser': 2.1.3
+      '@formatjs/ecma402-abstract': 2.3.2
+      '@formatjs/fast-memoize': 2.2.6
+      '@formatjs/icu-messageformat-parser': 2.10.1
       tslib: 2.4.0
 
   is-arrayish@0.2.1: {}
@@ -10758,17 +10796,15 @@ snapshots:
       react-fast-compare: 3.2.0
       react-side-effect: 2.1.1(react@17.0.2)
 
-  react-intl@6.0.4(react@17.0.2)(typescript@4.7.2):
+  react-intl@7.1.2(react@17.0.2)(typescript@4.7.2):
     dependencies:
-      '@formatjs/ecma402-abstract': 1.11.7
-      '@formatjs/icu-messageformat-parser': 2.1.3
-      '@formatjs/intl': 2.3.0(typescript@4.7.2)
-      '@formatjs/intl-displaynames': 6.0.2
-      '@formatjs/intl-listformat': 7.0.2
+      '@formatjs/ecma402-abstract': 2.3.2
+      '@formatjs/icu-messageformat-parser': 2.10.1
+      '@formatjs/intl': 3.1.2(typescript@4.7.2)
       '@types/hoist-non-react-statics': 3.3.1
       '@types/react': 17.0.45
       hoist-non-react-statics: 3.3.2
-      intl-messageformat: 10.1.0
+      intl-messageformat: 10.7.13
       react: 17.0.2
       tslib: 2.4.0
     optionalDependencies: