Просмотр исходного кода

Merge branch 'master' into feat/page-bulk-export

Futa Arai 1 год назад
Родитель
Сommit
92d176fe37

+ 1 - 0
.devcontainer/compose.yml

@@ -7,6 +7,7 @@ services:
       - node_modules:/workspace/growi/node_modules
       - node_modules:/workspace/growi/node_modules
       - buildcache_app:/workspace/growi/apps/app/.next
       - buildcache_app:/workspace/growi/apps/app/.next
       - ../../growi-docker-compose:/workspace/growi-docker-compose:delegated
       - ../../growi-docker-compose:/workspace/growi-docker-compose:delegated
+      - ../../share:/workspace/share:delegated
     tty: true
     tty: true
 
 
   mongo:
   mongo:

+ 3 - 3
.github/workflows/codeql-analysis.yml

@@ -47,7 +47,7 @@ jobs:
 
 
     # Initializes the CodeQL tools for scanning.
     # Initializes the CodeQL tools for scanning.
     - name: Initialize CodeQL
     - name: Initialize CodeQL
-      uses: github/codeql-action/init@v2
+      uses: github/codeql-action/init@v3
       with:
       with:
         languages: ${{ matrix.language }}
         languages: ${{ matrix.language }}
         # If you wish to specify custom queries, you can do so here or in a config file.
         # If you wish to specify custom queries, you can do so here or in a config file.
@@ -58,7 +58,7 @@ jobs:
     # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
     # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
     # If this step fails, then you should remove it and run the build manually (see below)
     # If this step fails, then you should remove it and run the build manually (see below)
     - name: Autobuild
     - name: Autobuild
-      uses: github/codeql-action/autobuild@v2
+      uses: github/codeql-action/autobuild@v3
 
 
     # ℹ️ Command-line programs to run using the OS shell.
     # ℹ️ Command-line programs to run using the OS shell.
     # 📚 https://git.io/JvXDl
     # 📚 https://git.io/JvXDl
@@ -72,4 +72,4 @@ jobs:
     #   make release
     #   make release
 
 
     - name: Perform CodeQL Analysis
     - name: Perform CodeQL Analysis
-      uses: github/codeql-action/analyze@v2
+      uses: github/codeql-action/analyze@v3

+ 2 - 2
.github/workflows/release-rc-scheduled.yml

@@ -27,7 +27,7 @@ jobs:
       id: package-json
       id: package-json
 
 
     - name: Docker meta for docker.io
     - name: Docker meta for docker.io
-      uses: docker/metadata-action@v4
+      uses: docker/metadata-action@v5
       id: meta
       id: meta
       with:
       with:
         images: docker.io/weseek/growi
         images: docker.io/weseek/growi
@@ -36,7 +36,7 @@ jobs:
           type=raw,value=${{ steps.package-json.outputs.packageVersion }}.{{sha}}
           type=raw,value=${{ steps.package-json.outputs.packageVersion }}.{{sha}}
 
 
     - name: Docker meta for ghcr.io
     - name: Docker meta for ghcr.io
-      uses: docker/metadata-action@v4
+      uses: docker/metadata-action@v5
       id: meta-ghcr
       id: meta-ghcr
       with:
       with:
         images: ghcr.io/weseek/growi
         images: ghcr.io/weseek/growi

+ 1 - 1
.github/workflows/release-rc.yml

@@ -27,7 +27,7 @@ jobs:
       id: package-json
       id: package-json
 
 
     - name: Docker meta for docker.io
     - name: Docker meta for docker.io
-      uses: docker/metadata-action@v4
+      uses: docker/metadata-action@v5
       id: meta
       id: meta
       with:
       with:
         images: docker.io/weseek/growi
         images: docker.io/weseek/growi

+ 1 - 1
.github/workflows/release-slackbot-proxy.yml

@@ -24,7 +24,7 @@ jobs:
 
 
     - name: Docker meta
     - name: Docker meta
       id: meta
       id: meta
-      uses: docker/metadata-action@v4
+      uses: docker/metadata-action@v5
       with:
       with:
         images: weseek/growi-slackbot-proxy,asia.gcr.io/${{ secrets.GCP_PRJ_ID_SLACKBOT_PROXY }}/growi-slackbot-proxy
         images: weseek/growi-slackbot-proxy,asia.gcr.io/${{ secrets.GCP_PRJ_ID_SLACKBOT_PROXY }}/growi-slackbot-proxy
         tags: |
         tags: |

+ 1 - 1
.github/workflows/release.yml

@@ -90,7 +90,7 @@ jobs:
       id: package-json
       id: package-json
 
 
     - name: Docker meta for docker.io
     - name: Docker meta for docker.io
-      uses: docker/metadata-action@v4
+      uses: docker/metadata-action@v5
       id: meta
       id: meta
       with:
       with:
         images: docker.io/weseek/growi
         images: docker.io/weseek/growi

+ 1 - 1
.github/workflows/reusable-app-create-manifests.yml

@@ -29,7 +29,7 @@ jobs:
     steps:
     steps:
     - name: Docker meta for extra-images
     - name: Docker meta for extra-images
       id: meta-extra-images
       id: meta-extra-images
-      uses: docker/metadata-action@v4
+      uses: docker/metadata-action@v5
       with:
       with:
         images: ${{ inputs.registry }}/${{ inputs.image-name }}
         images: ${{ inputs.registry }}/${{ inputs.image-name }}
         sep-tags: ','
         sep-tags: ','

+ 33 - 1
CHANGELOG.md

@@ -1,9 +1,41 @@
 # Changelog
 # Changelog
 
 
-## [Unreleased](https://github.com/weseek/growi/compare/v7.1.5...HEAD)
+## [Unreleased](https://github.com/weseek/growi/compare/v7.1.7...HEAD)
 
 
 *Please do not manually update this file. We've automated the process.*
 *Please do not manually update this file. We've automated the process.*
 
 
+## [v7.1.7](https://github.com/weseek/growi/compare/v7.1.6...v7.1.7) - 2025-01-16
+
+### 🐛 Bug Fixes
+
+* fix: Unable to select group viewing permissions (#9541) @miya
+* fix: Fix i18n of oidc settings (#9536) @ryu-sato
+
+### 🧰 Maintenance
+
+* support: Update Swagger documentation for the PUT endpoint to update a page (#9529) @tkfm1991
+* ci(deps): bump docker/metadata-action from 4 to 5 (#9181) @dependabot
+* ci(deps): bump github/codeql-action from 2 to 3 (#9180) @dependabot
+* ci(deps): bump next from 14.2.15 to 14.2.21 (#9538) @dependabot
+* ci(deps-dev): bump @marp-team/marp-core from 3.9.0 to 3.9.1 (#9530) @dependabot
+
+## [v7.1.6](https://github.com/weseek/growi/compare/v7.1.5...v7.1.6) - 2024-12-26
+
+### 💎 Features
+
+* feat(ai): Save file to VectorStore in HTML format   (#9462) @miya
+
+### 🐛 Bug Fixes
+
+* fix: remark-lsx pagination (#9513) @miya
+* fix: Spelling miss of external_link in i18n (#9456) @reiji-h
+* fix: Wider copy to clipboard area (#9450) @Ryosei-Fukushima
+* fix: Error when creating pages with deep hierarchy (#9487) @reiji-h
+
+### 🧰 Maintenance
+
+* ci(deps): bump next from 14.2.13 to 14.2.15 (#9501) @dependabot
+
 ## [v7.1.5](https://github.com/weseek/growi/compare/v7.1.4...v7.1.5) - 2024-12-13
 ## [v7.1.5](https://github.com/weseek/growi/compare/v7.1.4...v7.1.5) - 2024-12-13
 
 
 ### 🚀 Improvement
 ### 🚀 Improvement

+ 1 - 0
apps/app/bin/swagger-jsdoc/definition-apiv3.js

@@ -81,6 +81,7 @@ module.exports = {
         'UserGroups',
         'UserGroups',
         'Users Management',
         'Users Management',
         'FullTextSearch Management',
         'FullTextSearch Management',
+        'Install',
       ],
       ],
     },
     },
     {
     {

+ 2 - 2
apps/app/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "@growi/app",
   "name": "@growi/app",
-  "version": "7.1.6-RC.0",
+  "version": "7.1.8-RC.0",
   "license": "MIT",
   "license": "MIT",
   "private": "true",
   "private": "true",
   "scripts": {
   "scripts": {
@@ -157,7 +157,7 @@
     "multer": "~1.4.0",
     "multer": "~1.4.0",
     "multer-autoreap": "^1.0.3",
     "multer-autoreap": "^1.0.3",
     "mustache": "^4.2.0",
     "mustache": "^4.2.0",
-    "next": "^14.2.15",
+    "next": "^14.2.21",
     "next-dynamic-loading-props": "^0.1.1",
     "next-dynamic-loading-props": "^0.1.1",
     "next-i18next": "^15.3.1",
     "next-i18next": "^15.3.1",
     "next-superjson": "^1.0.7",
     "next-superjson": "^1.0.7",

+ 2 - 2
apps/app/public/static/locales/en_US/admin.json

@@ -201,9 +201,9 @@
         "id_detail": "Specification of the name of attribute which can identify the user in OIDC claims",
         "id_detail": "Specification of the name of attribute which can identify the user in OIDC claims",
         "username_detail": "Specification of mappings for <code>username</code> when creating new users",
         "username_detail": "Specification of mappings for <code>username</code> when creating new users",
         "name_detail": "Specification of mappings for <code>name</code> when creating new users",
         "name_detail": "Specification of mappings for <code>name</code> when creating new users",
-        "mapping_detail": "Specification of mappings for %s when creating new users",
+        "mapping_detail": "Specification of mappings for {{target}} when creating new users",
         "register_1": "Contact to OIDC IdP Administrator",
         "register_1": "Contact to OIDC IdP Administrator",
-        "register_2": "Register your OIDC App with \"Authorization callback URL\" as <code>%s</code>",
+        "register_2": "Register your OIDC App with \"Authorization callback URL\" as <code>{{url}}</code>",
         "register_3": "Copy and paste your ClientID and Client Secret above",
         "register_3": "Copy and paste your ClientID and Client Secret above",
         "updated_oidc": "Succeeded to update OpenID Connect",
         "updated_oidc": "Succeeded to update OpenID Connect",
         "Use discovered URL if empty": "Use discovered URL from \"Issuer Host\" if empty"
         "Use discovered URL if empty": "Use discovered URL from \"Issuer Host\" if empty"

+ 102 - 102
apps/app/public/static/locales/fr_FR/admin.json

@@ -3,7 +3,7 @@
     "display_name": "Français"
     "display_name": "Français"
   },
   },
   "last_login": "Dernière connexion",
   "last_login": "Dernière connexion",
-  "wiki_management_homepage": "Gestion du wiki",
+  "wiki_management_homepage": "Système",
   "public": "Public",
   "public": "Public",
   "anyone_with_the_link": "Tous les utilisateurs disposant du lien",
   "anyone_with_the_link": "Tous les utilisateurs disposant du lien",
   "specified_users": "Utilisateurs spécifiés",
   "specified_users": "Utilisateurs spécifiés",
@@ -12,7 +12,7 @@
   "optional": "Optionnel",
   "optional": "Optionnel",
   "days": "jours",
   "days": "jours",
   "security_settings": {
   "security_settings": {
-    "security_settings": "Paramètres de sécurité",
+    "security_settings": "Sécurité",
     "scope_of_page_disclosure": "Confidentialité de la page",
     "scope_of_page_disclosure": "Confidentialité de la page",
     "set_point": "Valeur",
     "set_point": "Valeur",
     "Guest Users Access": "Accès invité",
     "Guest Users Access": "Accès invité",
@@ -30,13 +30,13 @@
     "for_example": " Par exemple, pour restreindre l'inscription aux utilisateurs dans le domaine growi.org, ajouter ",
     "for_example": " Par exemple, pour restreindre l'inscription aux utilisateurs dans le domaine growi.org, ajouter ",
     "in_this_case": "; dans ce cas particulier, seul les utilisateurs du domaine growi.org peuvent s'inscrire.",
     "in_this_case": "; dans ce cas particulier, seul les utilisateurs du domaine growi.org peuvent s'inscrire.",
     "insert_single": "Insérer une adresse courriel par ligne",
     "insert_single": "Insérer une adresse courriel par ligne",
-    "page_list_and_search_results": "Liste et recherche de pages",
+    "page_list_and_search_results": "Affichage des pages",
     "page_listing_1": "Liste et recherche de pages<br>restreint à 'Seulement moi'",
     "page_listing_1": "Liste et recherche de pages<br>restreint à 'Seulement moi'",
     "page_listing_1_desc": "Voir les pages restreintes à 'Seulement moi' lors de la recherche",
     "page_listing_1_desc": "Voir les pages restreintes à 'Seulement moi' lors de la recherche",
     "page_listing_2": "Liste et recherche de pages<br>restreint au groupe utilisateur",
     "page_listing_2": "Liste et recherche de pages<br>restreint au groupe utilisateur",
     "page_listing_2_desc": "Voir les pages restreintes au groupe utilisateur lors de la recherche",
     "page_listing_2_desc": "Voir les pages restreintes au groupe utilisateur lors de la recherche",
-    "page_access_rights": "Droits de lecture",
-    "page_delete_rights": "Droits de suppression",
+    "page_access_rights": "Lecture",
+    "page_delete_rights": "Suppression",
     "page_delete": "Suppression de page",
     "page_delete": "Suppression de page",
     "page_delete_completely": "Suppression complète de page",
     "page_delete_completely": "Suppression complète de page",
     "comment_manage_rights": "Droits de gestion des commentaires",
     "comment_manage_rights": "Droits de gestion des commentaires",
@@ -53,8 +53,8 @@
     "anyone": "Tout le monde",
     "anyone": "Tout le monde",
     "user_homepage_deletion": {
     "user_homepage_deletion": {
       "user_homepage_deletion": "Suppression de page d'accueil utilisateur",
       "user_homepage_deletion": "Suppression de page d'accueil utilisateur",
-      "enable_user_homepage_deletion": "Activer la suppression de page d'accueil utilisateur",
-      "enable_force_delete_user_homepage_on_user_deletion": "Lorsqu'un utilisateur est supprimé, sa page d'accueil et ses sous-pages sont supprimées.",
+      "enable_user_homepage_deletion": "Suppression de page d'accueil utilisateur",
+      "enable_force_delete_user_homepage_on_user_deletion": "Supprimer la page d'accueil et ses pages enfants",
       "desc": "Les pages d'accueil utilisateurs pourront être supprimées."
       "desc": "Les pages d'accueil utilisateurs pourront être supprimées."
     },
     },
     "session": "Session",
     "session": "Session",
@@ -89,8 +89,8 @@
       "readonly": "Autoriser (Lecture seule)"
       "readonly": "Autoriser (Lecture seule)"
     },
     },
     "read_only_users_comment": {
     "read_only_users_comment": {
-      "deny": "Refuser (Interdire la gestion des commentaires aux utilisateurs lecture seule)",
-      "accept": "Autoriser (Les utilisateurs lecture seule peuvent gérer les commentaires)"
+      "deny": "Ne peut pas commenter",
+      "accept": "Peut commenter"
     },
     },
     "registration_mode": {
     "registration_mode": {
       "open": "Ouvert (Tout le monde peut s'inscrire)",
       "open": "Ouvert (Tout le monde peut s'inscrire)",
@@ -98,9 +98,9 @@
       "closed": "Fermé (Invitation seulement)"
       "closed": "Fermé (Invitation seulement)"
     },
     },
     "share_link_management": "Gestion des liens de partage",
     "share_link_management": "Gestion des liens de partage",
-    "No_share_links":"Aucun liens de partage",
-    "share_link_notice":"Retirer les liens de partage",
-    "delete_all_share_links":"Supprimer tout les liens de partage",
+    "No_share_links": "Aucun liens de partage",
+    "share_link_notice": "Retirer les liens de partage",
+    "delete_all_share_links": "Supprimer tout les liens de partage",
     "share_link_rights": "Permissions de liens de partage",
     "share_link_rights": "Permissions de liens de partage",
     "enable_link_sharing": "Activer les liens de partage",
     "enable_link_sharing": "Activer les liens de partage",
     "all_share_links": "Liens de partage",
     "all_share_links": "Liens de partage",
@@ -201,9 +201,9 @@
         "id_detail": "Specification of the name of attribute which can identify the user in OIDC claims",
         "id_detail": "Specification of the name of attribute which can identify the user in OIDC claims",
         "username_detail": "Spécifications des liaisons <code>username</code> lors de la création de nouveaux utilisateurs",
         "username_detail": "Spécifications des liaisons <code>username</code> lors de la création de nouveaux utilisateurs",
         "name_detail": "Spécifications des liaisons <code>name</code> lors de la création de nouveaux utilisateurs",
         "name_detail": "Spécifications des liaisons <code>name</code> lors de la création de nouveaux utilisateurs",
-        "mapping_detail": "Spécifications des liaisons pour %s lors de la création de nouveaux utilisateurs",
+        "mapping_detail": "Spécifications des liaisons pour {{target}} lors de la création de nouveaux utilisateurs",
         "register_1": "Contacter votre administrateur OIDC",
         "register_1": "Contacter votre administrateur OIDC",
-        "register_2": "Configurer l'application OAuth avec l'un des URL de redirection autorisés avec <code>%s</code>",
+        "register_2": "Configurer l'application OAuth avec l'un des URL de redirection autorisés avec <code>{{url}}</code>",
         "register_3": "Copier l'ID client et Secret client ci-dessus",
         "register_3": "Copier l'ID client et Secret client ci-dessus",
         "updated_oidc": "Paramètres mis à jour",
         "updated_oidc": "Paramètres mis à jour",
         "Use discovered URL if empty": "Use discovered URL from \"Issuer Host\" if empty"
         "Use discovered URL if empty": "Use discovered URL from \"Issuer Host\" if empty"
@@ -233,7 +233,7 @@
     "prioritize_webhook_desc": "Activer cette option utilisera les webhook entrants plutôt que Slack.",
     "prioritize_webhook_desc": "Activer cette option utilisera les webhook entrants plutôt que Slack.",
     "slack_app_configuration": "Configuration de l'application Slack",
     "slack_app_configuration": "Configuration de l'application Slack",
     "slack_app_configuration_desc": "Cette méthode n'est pas recommandée, car trop complexe.",
     "slack_app_configuration_desc": "Cette méthode n'est pas recommandée, car trop complexe.",
-    "use_instead":"Utiliser plutôt les webhook entrants Slack",
+    "use_instead": "Utiliser plutôt les webhook entrants Slack",
     "how_to": {
     "how_to": {
       "header": "Comment configurer un webhook entrant?",
       "header": "Comment configurer un webhook entrant?",
       "workspace": "(Dans le Workspace) Ajouter un webhook",
       "workspace": "(Dans le Workspace) Ajouter un webhook",
@@ -278,7 +278,7 @@
     "not_found_global_notification_triggerid": "ID global de notification introuvable"
     "not_found_global_notification_triggerid": "ID global de notification introuvable"
   },
   },
   "full_text_search_management": {
   "full_text_search_management": {
-    "full_text_search_management": "Configuration de la recherche",
+    "full_text_search_management": "Moteur de recherche",
     "elasticsearch_management": "Configuration Elasticsearch",
     "elasticsearch_management": "Configuration Elasticsearch",
     "connection_status": "Statut",
     "connection_status": "Statut",
     "connection_status_label_unconfigured": "UNCONFIGURED",
     "connection_status_label_unconfigured": "UNCONFIGURED",
@@ -300,23 +300,23 @@
     "rebuild_description_1": "Reconstruire l'index est les données de pages",
     "rebuild_description_1": "Reconstruire l'index est les données de pages",
     "rebuild_description_2": "Cela peut prendre un certain temps."
     "rebuild_description_2": "Cela peut prendre un certain temps."
   },
   },
-  "mailer_setup_required":"<a href='/admin/app'>Configuration Email</a> sont requis pour envoyer.",
+  "mailer_setup_required": "La <a href='/admin/app'>configuration du SMTP</a> est requise.",
   "admin_top": {
   "admin_top": {
     "management_wiki": "Configuration du wiki",
     "management_wiki": "Configuration du wiki",
     "system_information": "Information système",
     "system_information": "Information système",
-    "wiki_administrator": "Seuls les administrateurs peuvent accéder à cette page",
+    "wiki_administrator": "Seuls les administrateurs peuvent accéder à cette page.",
     "assign_administrator": "Il est possible d'assigner l'accès administrateur en utilisant le bouton 'Ajouter accès administrateur'",
     "assign_administrator": "Il est possible d'assigner l'accès administrateur en utilisant le bouton 'Ajouter accès administrateur'",
     "package_name": "Nom du paquet",
     "package_name": "Nom du paquet",
     "specified_version": "Version spécifiée",
     "specified_version": "Version spécifiée",
     "installed_version": "Version installée",
     "installed_version": "Version installée",
-    "list_of_env_vars":"Variables d'environnement",
-    "env_var_priority": "Les valeurs de la base de données sont priorisées.",
-    "about_security": "Voir les <a href='/admin/security'>paramètres de sécurité</a> pour les variables d'environnement de sécurité.",
+    "list_of_env_vars": "Variables d'environnement",
+    "env_var_priority": "Les valeurs enregistrées dans la base de données sont priorisées.",
+    "about_security": "Pour les variables des paramètres de sécurité, consulter les <a href='/admin/security'>paramètres de sécurité.</a>",
     "copy_prefilled_host_information": {
     "copy_prefilled_host_information": {
       "default": "Copier les informations",
       "default": "Copier les informations",
       "done": "Copié dans le presse-papier!"
       "done": "Copié dans le presse-papier!"
     },
     },
-    "bug_report": "Soumettre un rapport de bogue",
+    "bug_report": "Informations de diagnostic",
     "submit_bug_report": "<a href='https://github.com/weseek/growi/issues/new?assignees=&labels=bug&template=bug-report.md&title=Bug%3A' target='_blank' rel='noreferrer'>soummettre ensuite sur GitHub.</a>"
     "submit_bug_report": "<a href='https://github.com/weseek/growi/issues/new?assignees=&labels=bug&template=bug-report.md&title=Bug%3A' target='_blank' rel='noreferrer'>soummettre ensuite sur GitHub.</a>"
   },
   },
   "v5_page_migration": {
   "v5_page_migration": {
@@ -346,36 +346,36 @@
     "description": "Le mode maintenance restreint l'utilisation de GROWI. Toujours démarrer le mode maintenance avant l'\"import de données\" et la \"conversion vers la V5\"."
     "description": "Le mode maintenance restreint l'utilisation de GROWI. Toujours démarrer le mode maintenance avant l'\"import de données\" et la \"conversion vers la V5\"."
   },
   },
   "app_setting": {
   "app_setting": {
-    "site_name": "Nom du site",
+    "site_name": "Nom",
     "sitename_change": "Le nom du site utilisé dans l'en-tête et le titre HTML.",
     "sitename_change": "Le nom du site utilisé dans l'en-tête et le titre HTML.",
     "header_content": "Le contenu entré ici sera affiché dans l'en-tête, etc. ",
     "header_content": "Le contenu entré ici sera affiché dans l'en-tête, etc. ",
     "site_url": {
     "site_url": {
-      "title": "Configuration de l'URL du site",
-      "desc": "Configuration de l'URL du site",
-      "warn": "Certaines fonctionnalitées peuvent ne pas fonctionner tant que l'URL du site n'est pas définie.",
-      "help": "URL complet du site démarrant par <code>http://</code> ou <code>https://</code>.",
+      "title": "Adresse publique",
+      "desc": "Adresse URL publique de l'application.",
+      "warn": "Certaines fonctionnalitées sont restreintes tant que l'URL du site n'est pas définie.",
+      "help": "URL complète démarrant par <code>http://</code> ou <code>https://</code>.",
       "note_for_the_only_env_option": "Les paramètres sont définis par des variables d'environnement.<br>Pour modifier ce paramètre, supprimer la variable d'environnement <code>{{env}}</code> ."
       "note_for_the_only_env_option": "Les paramètres sont définis par des variables d'environnement.<br>Pour modifier ce paramètre, supprimer la variable d'environnement <code>{{env}}</code> ."
     },
     },
-    "confidential_name": "Nom confidentiel",
+    "confidential_name": "Nom interne",
     "confidential_example": "ex): usage interne seulement",
     "confidential_example": "ex): usage interne seulement",
     "default_language": "Langue par défaut",
     "default_language": "Langue par défaut",
-    "default_mail_visibility": "Afficher l'adresse courriel pour les nouveaux utilisateurs",
+    "default_mail_visibility": "Mode d'affichage de l'adresse courriel",
     "file_uploading": "Téléversement de fichiers",
     "file_uploading": "Téléversement de fichiers",
-    "enable_files_except_image": "Autorise le téléversement de fichiers de n'importe quel type. Lorsque désactivé, seul les fichiers de type image sont autorisés.",
-    "attach_enable": "Autorise le téléversement de fichiers de n'importe quel type",
+    "enable_files_except_image": "Autoriser tout les types de fichiers",
+    "attach_enable": "Autorise le téléversement de tout les types de fichiers.",
     "page_bulk_export_settings": "Paramètres d'exportation de pages par lots",
     "page_bulk_export_settings": "Paramètres d'exportation de pages par lots",
     "enable_page_bulk_export": "Activer l'exportation groupée",
     "enable_page_bulk_export": "Activer l'exportation groupée",
     "page_bulk_export_explanation": "Active une fonctionnalité qui permet à tous les utilisateurs d'exporter simultanément toutes les pages sélectionnées dans le menu des pages et leurs pages subordonnées. Les données exportées seront automatiquement supprimées une fois la période de conservation écoulée.",
     "page_bulk_export_explanation": "Active une fonctionnalité qui permet à tous les utilisateurs d'exporter simultanément toutes les pages sélectionnées dans le menu des pages et leurs pages subordonnées. Les données exportées seront automatiquement supprimées une fois la période de conservation écoulée.",
     "page_bulk_export_warning": "La fonctionnalité d’exportation de pages en masse est disponible pour tous les utilisateurs. Afin de maintenir les ressources du système, nous demandons votre coopération pour utiliser le montant minimum nécessaire. Si vous êtes administrateur, veuillez en informer tous les utilisateurs.",
     "page_bulk_export_warning": "La fonctionnalité d’exportation de pages en masse est disponible pour tous les utilisateurs. Afin de maintenir les ressources du système, nous demandons votre coopération pour utiliser le montant minimum nécessaire. Si vous êtes administrateur, veuillez en informer tous les utilisateurs.",
     "page_bulk_export_storage_period": "Date limite de téléchargement",
     "page_bulk_export_storage_period": "Date limite de téléchargement",
     "update": "Sauvegarder",
     "update": "Sauvegarder",
-    "mail_settings": "Configuration e-mail",
-    "mailer_is_not_set_up": "Paramètres e-mail non configurés.",
+    "mail_settings": "SMTP",
+    "mailer_is_not_set_up": "Paramètres d'envoi de courriels non configurés.",
     "from_e-mail_address": "Adresse courriel <code>from</code>",
     "from_e-mail_address": "Adresse courriel <code>from</code>",
-    "transmission_method":"Méthode de transmission",
-    "smtp_label":"SMTP",
-    "ses_label":"SES(AWS)",
-    "send_test_email": "Envoi d'un courriel d'essai",
+    "transmission_method": "Mode",
+    "smtp_label": "SMTP",
+    "ses_label": "SES(AWS)",
+    "send_test_email": "Courriel d'essai",
     "success_to_send_test_email": "Courriel d'essai envoyé",
     "success_to_send_test_email": "Courriel d'essai envoyé",
     "smtp_settings": "Configuration SMTP",
     "smtp_settings": "Configuration SMTP",
     "host": "Hôte",
     "host": "Hôte",
@@ -384,13 +384,13 @@
     "initialize_mail_settings": "réinitialiser les paramètres e-mail",
     "initialize_mail_settings": "réinitialiser les paramètres e-mail",
     "initialize_mail_modal_header": "Réinitialiser les paramètres e-mail",
     "initialize_mail_modal_header": "Réinitialiser les paramètres e-mail",
     "confirm_to_initialize_mail_settings": "Les valeurs existantes seront écrasées. Réinitialiser les paramètres e-mail?",
     "confirm_to_initialize_mail_settings": "Les valeurs existantes seront écrasées. Réinitialiser les paramètres e-mail?",
-    "file_upload_settings":"Configuration du téléversement",
-    "file_upload_method":"Méthode de téléversement",
-    "file_delivery_method":"Méthode de récupération",
-    "file_delivery_method_redirect":"Rediriger",
-    "file_delivery_method_relay":"Relai interne du système",
-    "file_delivery_method_redirect_info":"Rediriger: Redirige vers une URL signé, performance excellente.",
-    "file_delivery_method_relay_info":"Relai interne du système: Le serveur GROWI sert les fichiers directement au client, sécurité complète.",
+    "file_upload_settings": "Téléversement de fichiers",
+    "file_upload_method": "Mode",
+    "file_delivery_method": "Méthode de récupération",
+    "file_delivery_method_redirect": "Rediriger",
+    "file_delivery_method_relay": "Relai interne du système",
+    "file_delivery_method_redirect_info": "Rediriger: Redirige vers une URL signé, performance excellente.",
+    "file_delivery_method_relay_info": "Relai interne du système: Le serveur GROWI sert les fichiers directement au client, sécurité complète.",
     "fixed_by_env_var": "Défini par une variable d'environnement <code>{{envKey}}={{envVar}}</code>.",
     "fixed_by_env_var": "Défini par une variable d'environnement <code>{{envKey}}={{envVar}}</code>.",
     "gcs_label": "GCP(GCS)",
     "gcs_label": "GCP(GCS)",
     "aws_label": "AWS(S3)",
     "aws_label": "AWS(S3)",
@@ -416,7 +416,7 @@
     "disable": "Désactiver",
     "disable": "Désactiver",
     "use_env_var_if_empty": "Si la valeur dans la base de données est vide, la valeur de variable d'environnement <code>{{variable}}</code> est utilisé.",
     "use_env_var_if_empty": "Si la valeur dans la base de données est vide, la valeur de variable d'environnement <code>{{variable}}</code> est utilisé.",
     "note_for_the_only_env_option": "Les paramètres sont définis par des variables d'environnement.<br>Pour modifier ce paramètre, supprimer la variable d'environnement <code>{{env}}</code> .",
     "note_for_the_only_env_option": "Les paramètres sont définis par des variables d'environnement.<br>Pour modifier ce paramètre, supprimer la variable d'environnement <code>{{env}}</code> .",
-    "questionnaire_settings": "Données analytiques",
+    "questionnaire_settings": "Sondages anonymes",
     "questionnaire_settings_explanation": "Paramètres d'activation des données analytiques. L'utilisateur peut choisir ce paramètre individuellement dans \"Autres paramètres\".",
     "questionnaire_settings_explanation": "Paramètres d'activation des données analytiques. L'utilisateur peut choisir ce paramètre individuellement dans \"Autres paramètres\".",
     "about_data_sent": "À propos",
     "about_data_sent": "À propos",
     "docs_link": "https://docs.growi.org/en/admin-guide/management-cookbook/app-settings.html#questionnaire-settings",
     "docs_link": "https://docs.growi.org/en/admin-guide/management-cookbook/app-settings.html#questionnaire-settings",
@@ -428,46 +428,46 @@
     "enable_questionnaire": "Activer les données analytiques"
     "enable_questionnaire": "Activer les données analytiques"
   },
   },
   "markdown_settings": {
   "markdown_settings": {
-    "markdown_settings": "Configuration Markdown",
-    "lineBreak_header": "Configuration du saut de ligne",
-    "lineBreak_desc": "Configuration du saut de ligne.",
+    "markdown_settings": "Markdown",
+    "lineBreak_header": "Saut de ligne",
+    "lineBreak_desc": "Conversion du saut de ligne automatique.",
     "lineBreak_options": {
     "lineBreak_options": {
-      "enable_lineBreak": "Activer le saut de ligne",
+      "enable_lineBreak": "Saut de ligne",
       "enable_lineBreak_desc": "Convertir le saut de ligne<code>&lt;br&gt;</code>en HTML",
       "enable_lineBreak_desc": "Convertir le saut de ligne<code>&lt;br&gt;</code>en HTML",
-      "enable_lineBreak_for_comment": "Activer le saut de ligne dans les commentaires",
+      "enable_lineBreak_for_comment": "Saut de ligne dans les commentaires",
       "enable_lineBreak_for_comment_desc": "Convertir le saut de ligne dans les commentaires<code>&lt;br&gt;</code>en HTML"
       "enable_lineBreak_for_comment_desc": "Convertir le saut de ligne dans les commentaires<code>&lt;br&gt;</code>en HTML"
     },
     },
-    "indent_header": "Configuration de l'indentation",
-    "indent_desc": "Configuration de l'indentation",
+    "indent_header": "Indentation",
+    "indent_desc": "Taille d'indentation dans une page.",
     "indent_options": {
     "indent_options": {
-      "indentSize": "Taille par défaut",
+      "indentSize": "Valeur par défaut",
       "indentSize_desc": "Taille par défaut de l'indentation dans l'éditeur Markdown",
       "indentSize_desc": "Taille par défaut de l'indentation dans l'éditeur Markdown",
-      "disallow_indent_change": "Empêcher le changement de taille d'indentation",
-      "disallow_indent_change_desc": "Forcer l'usage de la taille par défaut"
+      "disallow_indent_change": "Empêcher la modification",
+      "disallow_indent_change_desc": "Impose l'usage de la valeur par défaut définie dans les paramètres"
     },
     },
-    "xss_header": "Configuration prévention XSS",
+    "xss_header": "Prévention des attaques XSS",
     "xss_desc": "Configuration de la prévention des attaques XSS (cross-site scripting).",
     "xss_desc": "Configuration de la prévention des attaques XSS (cross-site scripting).",
     "xss_options": {
     "xss_options": {
-      "enable_xss_prevention": "Activer prévention XSS",
+      "enable_xss_prevention": "Prévention XSS",
       "remove_all_tags": "Retirer tout les tags",
       "remove_all_tags": "Retirer tout les tags",
       "remove_all_tags_desc": "Retire tout les tags HTML et CSS",
       "remove_all_tags_desc": "Retire tout les tags HTML et CSS",
       "recommended_setting": "Paramètres recommandés",
       "recommended_setting": "Paramètres recommandés",
       "custom_whitelist": "Liste autorisée",
       "custom_whitelist": "Liste autorisée",
       "tag_names": "Nom de tags",
       "tag_names": "Nom de tags",
       "tag_attributes": "Attributs de tags",
       "tag_attributes": "Attributs de tags",
-      "import_recommended": "Importer les recommendations {{target}}"
+      "import_recommended": "Importer {{target}}"
     }
     }
   },
   },
   "customize_settings": {
   "customize_settings": {
-    "customize_settings": "Personnalisation",
+    "customize_settings": "Interface",
     "default_sidebar_mode": {
     "default_sidebar_mode": {
-      "title": "Mode par défaut de la barre latérale",
-      "desc": "Le mode d'affichage par défaut de la barre latérale pour les utilisateurs.",
+      "title": "Barre latérale",
+      "desc": "Mode d'affichage et comportement par défaut de la barre latérale.",
       "dock_mode_default_desc": "État initial de la barre latérale lorsque le mode Dock est sélectionné.",
       "dock_mode_default_desc": "État initial de la barre latérale lorsque le mode Dock est sélectionné.",
       "dock_mode_default_open": "Afficher la page comme si elle était ouverte",
       "dock_mode_default_open": "Afficher la page comme si elle était ouverte",
       "dock_mode_default_close": "Afficher la page comme si elle était fermée"
       "dock_mode_default_close": "Afficher la page comme si elle était fermée"
     },
     },
-    "layout": "Agencement",
+    "layout": "Largeur du contenu",
     "layout_options": {
     "layout_options": {
       "default": "Largeur par défaut",
       "default": "Largeur par défaut",
       "expanded": "100%"
       "expanded": "100%"
@@ -487,8 +487,8 @@
       "tab_switch": "Sauvegarder le changement d'onglets",
       "tab_switch": "Sauvegarder le changement d'onglets",
       "tab_switch_desc1": "Sauvegarde l'état de navigation dans le navigateur de l'utilisateur.",
       "tab_switch_desc1": "Sauvegarde l'état de navigation dans le navigateur de l'utilisateur.",
       "tab_switch_desc2": "Lorsque désactivé, la navigation est forcé par l'interface.",
       "tab_switch_desc2": "Lorsque désactivé, la navigation est forcé par l'interface.",
-      "attach_title_header": "Ajouter automatiquement une section h1",
-      "attach_title_header_desc": "Ajoute le chemin de la page en tant que h1 lors de création d'une page.",
+      "attach_title_header": "Ajout automatique de titre",
+      "attach_title_header_desc": "Ajoute le chemin de la page en tant que titre de niveau 1 lors de création d'une page.",
       "list_num_s": "Nombre de pages modales",
       "list_num_s": "Nombre de pages modales",
       "list_num_desc_s": "Nombre de pages affichées sur les modales",
       "list_num_desc_s": "Nombre de pages affichées sur les modales",
       "list_num_m": "Nombre de pages articles",
       "list_num_m": "Nombre de pages articles",
@@ -497,20 +497,20 @@
       "list_num_desc_l": "Nombre de pages affichées lors de la recherche",
       "list_num_desc_l": "Nombre de pages affichées lors de la recherche",
       "list_num_xl": "Nombre de pages articles",
       "list_num_xl": "Nombre de pages articles",
       "list_num_desc_xl": "Nombre de pages affichées dans la 'corbeille' ou '404'.",
       "list_num_desc_xl": "Nombre de pages affichées dans la 'corbeille' ou '404'.",
-      "stale_notification": "Afficher les anciennes notifications",
+      "stale_notification": "Anciennes notifications",
       "stale_notification_desc": "Affiche les notifications sur les pages mises à jour il y a plus d'un an",
       "stale_notification_desc": "Affiche les notifications sur les pages mises à jour il y a plus d'un an",
       "show_all_reply_comments": "Afficher tout les commentaires",
       "show_all_reply_comments": "Afficher tout les commentaires",
       "show_all_reply_comments_desc": "Lorsque désactivé, seul les deux commentaires les plus récents sont affichés",
       "show_all_reply_comments_desc": "Lorsque désactivé, seul les deux commentaires les plus récents sont affichés",
       "select_search_scope_children_as_default": "'Seulement enfant de ce chemin' lors de la recherche",
       "select_search_scope_children_as_default": "'Seulement enfant de ce chemin' lors de la recherche",
       "select_search_scope_children_as_default_desc": "Lorsque désactivé, utilise 'Toutes les pages' en portée de recherche."
       "select_search_scope_children_as_default_desc": "Lorsque désactivé, utilise 'Toutes les pages' en portée de recherche."
     },
     },
-      "presentation": "Présentation",
+    "presentation": "Présentation",
     "presentation_options": {
     "presentation_options": {
-      "enable_marp": "Activer Marp",
-      "enable_marp_desc": "Marp est utilisable dans la visualisation de présentation. Potentiellement vulnérable aux attaques XSS.",
+      "enable_marp": "Marp",
+      "enable_marp_desc": "Marp est un syntaxe utilisable dans la visualisation de présentation. Potentiellement vulnérable aux attaques XSS.",
       "marp_official_site": "Site officiel Marp",
       "marp_official_site": "Site officiel Marp",
       "marp_official_site_link": "https://marp.app",
       "marp_official_site_link": "https://marp.app",
-      "marp_in_growi" : "GROWI Docs - Créer des présentations avec Marp",
+      "marp_in_growi": "GROWI Docs - Créer des présentations avec Marp",
       "marp_in_growi_link": "https://docs.growi.org/en/guide/features/marp.html"
       "marp_in_growi_link": "https://docs.growi.org/en/guide/features/marp.html"
     },
     },
     "custom_title": "Titre personnalisé",
     "custom_title": "Titre personnalisé",
@@ -524,10 +524,10 @@
     "write_css": "CSS personnalisé.",
     "write_css": "CSS personnalisé.",
     "ctrl_space": "Ctrl+Space pour l'autocomplétion",
     "ctrl_space": "Ctrl+Space pour l'autocomplétion",
     "custom_script": "Script personnalisé",
     "custom_script": "Script personnalisé",
-    "custom_presentation": "Presentation personnalisé",
+    "custom_presentation": "Mode présentation",
     "write_java": "Code javascript qui sera appliqué au système entier.",
     "write_java": "Code javascript qui sera appliqué au système entier.",
     "reflect_change": "Un rechargement de la page est nécessaire pour afficher les changements.",
     "reflect_change": "Un rechargement de la page est nécessaire pour afficher les changements.",
-    "custom_logo" : "Logo personnalisé",
+    "custom_logo": "Logo personnalisé",
     "default_logo": "Logo par défaut",
     "default_logo": "Logo par défaut",
     "upload_logo": "Téléverser un logo",
     "upload_logo": "Téléverser un logo",
     "current_logo": "Logo actuel",
     "current_logo": "Logo actuel",
@@ -601,9 +601,9 @@
     },
     },
     "import": "Importer",
     "import": "Importer",
     "skip_username_and_email_when_overlapped": "Passe le nom et adresse courriel exactes dans le nouvel environnement",
     "skip_username_and_email_when_overlapped": "Passe le nom et adresse courriel exactes dans le nouvel environnement",
-    "prepare_new_account_for_migration":"Préparer le compte pour la migration",
-    "archive_data_import_detail":"En savoir plus",
-    "admin_archive_data_import_guide_url":"https://docs.growi.org/en/admin-guide/management-cookbook/import.html",
+    "prepare_new_account_for_migration": "Préparer le compte pour la migration",
+    "archive_data_import_detail": "En savoir plus",
+    "admin_archive_data_import_guide_url": "https://docs.growi.org/en/admin-guide/management-cookbook/import.html",
     "page_skip": "Les pages ayant le nom d'une page déjà existante ne seront pas importées.",
     "page_skip": "Les pages ayant le nom d'une page déjà existante ne seront pas importées.",
     "Directory_hierarchy_tag": "Tag de hiérarchie"
     "Directory_hierarchy_tag": "Tag de hiérarchie"
   },
   },
@@ -673,7 +673,7 @@
     "delete": "Supprimer",
     "delete": "Supprimer",
     "integration_procedure": "Procédure d'intégration",
     "integration_procedure": "Procédure d'intégration",
     "custom_bot_without_proxy_settings": "Bot Personnalisé sans proxy",
     "custom_bot_without_proxy_settings": "Bot Personnalisé sans proxy",
-    "integration_failed":"Échec de l'intégration",
+    "integration_failed": "Échec de l'intégration",
     "reset": "Réinitialiser",
     "reset": "Réinitialiser",
     "reset_all_settings": "Réinitialiser tout les paramètres",
     "reset_all_settings": "Réinitialiser tout les paramètres",
     "delete_slackbot_settings": "Supprimer les paramètres du bot Slack",
     "delete_slackbot_settings": "Supprimer les paramètres du bot Slack",
@@ -720,7 +720,7 @@
       "allow_specified_long": "Autoriser sélectionnés (Depuis les canaux sélectionnés)",
       "allow_specified_long": "Autoriser sélectionnés (Depuis les canaux sélectionnés)",
       "test_connection": "Tester la connexion",
       "test_connection": "Tester la connexion",
       "test_connection_by_pressing_button": "Cliquer sur le bouton pour tester la connexion",
       "test_connection_by_pressing_button": "Cliquer sur le bouton pour tester la connexion",
-      "test_connection_only_public_channel":"Testez la connexion dans un canal publique.",
+      "test_connection_only_public_channel": "Testez la connexion dans un canal publique.",
       "error_check_logs_below": "Une erreur est survenue.",
       "error_check_logs_below": "Une erreur est survenue.",
       "send_message_to_slack_work_space": "Envoyer un message vers l'espace de travail Slack.",
       "send_message_to_slack_work_space": "Envoyer un message vers l'espace de travail Slack.",
       "add_slack_workspace": "Ajouter un espace de travail Slack"
       "add_slack_workspace": "Ajouter un espace de travail Slack"
@@ -749,16 +749,16 @@
     "alert_deplicated": "'Ancienne intégration Slack' sera discontinué dans le futur. Utiliser plutôt <a href='/admin/slack-integration'>les nouveaux paramètres</a> "
     "alert_deplicated": "'Ancienne intégration Slack' sera discontinué dans le futur. Utiliser plutôt <a href='/admin/slack-integration'>les nouveaux paramètres</a> "
   },
   },
   "user_management": {
   "user_management": {
-    "user_management": "Configuration des utilisateurs",
-    "invite_users": "Créer un nouvel utilisateur temporaire",
+    "user_management": "Utilisateurs",
+    "invite_users": "Nouvel utilisateur temporaire",
     "click_twice_same_checkbox": "Il est nécessaire de sélectionner une option.",
     "click_twice_same_checkbox": "Il est nécessaire de sélectionner une option.",
     "status": "Statut",
     "status": "Statut",
     "invite_modal": {
     "invite_modal": {
-      "emails": "Adresse Courriel (Supporte l'usage de plusieurs lignes)",
-      "description1":"Créer des utilisateurs temporaires avec une adresse courriel.",
-      "description2":"Un mot de passe temporaire sera généré..",
-      "invite_thru_email": "Envoyer courriel d'invitation",
-      "mail_setting_link":"<span className='material-symbols-outlined me-2'>settings</span><a href='/admin/app'>Paramètres courriel</a>",
+      "emails": "Adresse(s) courriel(s) (Supporte l'usage de plusieurs lignes)",
+      "description1": "Créer des utilisateurs temporaires avec une adresse courriel.",
+      "description2": "Un mot de passe temporaire est généré automatiquement.",
+      "invite_thru_email": "Courriel d'invitation",
+      "mail_setting_link": "<span className='material-symbols-outlined me-2'>settings</span><a href='/admin/app'>Paramètres courriel</a>",
       "valid_email": "Adresse courriel valide requise",
       "valid_email": "Adresse courriel valide requise",
       "temporary_password": "Cette utilisateur a un mot de passe temporaire",
       "temporary_password": "Cette utilisateur a un mot de passe temporaire",
       "send_new_password": "Envoyez le nouveau mot de passe à l'utilisateur.",
       "send_new_password": "Envoyez le nouveau mot de passe à l'utilisateur.",
@@ -780,7 +780,7 @@
       "cannot_revoke": "Vous ne pouvez pas révoquer votre propre permission d'administration",
       "cannot_revoke": "Vous ne pouvez pas révoquer votre propre permission d'administration",
       "grant_admin_access": "Ajouter permission administrateur",
       "grant_admin_access": "Ajouter permission administrateur",
       "revoke_read_only_access": "Révoquer permission de lecture",
       "revoke_read_only_access": "Révoquer permission de lecture",
-      "grant_read_only_access": "Ajouter permission de lecture",
+      "grant_read_only_access": "Permission de lecture-seule",
       "send_invitation_email": "Envoyer courriel d'invitation",
       "send_invitation_email": "Envoyer courriel d'invitation",
       "resend_invitation_email": "Renvoyer courriel d'invitation"
       "resend_invitation_email": "Renvoyer courriel d'invitation"
     },
     },
@@ -793,10 +793,10 @@
       "new_password": "Nouveau mot de passe"
       "new_password": "Nouveau mot de passe"
     },
     },
     "external_account": "Configuration des comptes externes",
     "external_account": "Configuration des comptes externes",
-    "external_accounts":"Comptes externes",
-    "create_external_account":"Créer compte externe",
+    "external_accounts": "Comptes externes",
+    "create_external_account": "Créer compte externe",
     "external_account_list": "Liste des comptes externes",
     "external_account_list": "Liste des comptes externes",
-    "external_account_none":"Pas de compte externe",
+    "external_account_none": "Pas de compte externe",
     "invite": "Inviter",
     "invite": "Inviter",
     "invited": "Utilisateur invité",
     "invited": "Utilisateur invité",
     "back_to_user_management": "Gestion des utilisateurs",
     "back_to_user_management": "Gestion des utilisateurs",
@@ -811,17 +811,17 @@
     "current_users": "Utilisateurs:"
     "current_users": "Utilisateurs:"
   },
   },
   "user_group_management": {
   "user_group_management": {
-    "user_group_management": "Configuration des groupes",
-    "create_group": "Créer nouveau groupe",
+    "user_group_management": "Gestion des groupes",
+    "create_group": "Nouveau groupe",
     "add_child_group": "Ajouter groupe enfant",
     "add_child_group": "Ajouter groupe enfant",
     "remove_child_group": "Retirer",
     "remove_child_group": "Retirer",
     "deny_create_group": "Les paramètres actuels ne permettent pas la création du groupe",
     "deny_create_group": "Les paramètres actuels ne permettent pas la création du groupe",
-    "group_name": "Nom du groupe",
+    "group_name": "Nom",
     "group_example": "e.g. : Group1",
     "group_example": "e.g. : Group1",
     "child_user_group": "Groupe utilisateur enfant",
     "child_user_group": "Groupe utilisateur enfant",
-    "parent_group": "Groupe parent",
+    "parent_group": "Parent",
     "select_parent_group": "Sélectionner groupe parent",
     "select_parent_group": "Sélectionner groupe parent",
-    "release_parent_group": "Libérer groupe parent",
+    "release_parent_group": "Retirer groupe parent",
     "add_modal": {
     "add_modal": {
       "description": "L'utilisateur sera ajouté au groupe parent.",
       "description": "L'utilisateur sera ajouté au groupe parent.",
       "add_user": "Ajouter utilisateur au groupe",
       "add_user": "Ajouter utilisateur au groupe",
@@ -831,14 +831,14 @@
       "partial_match": "Correspondance partielle",
       "partial_match": "Correspondance partielle",
       "backward_match": "Correspondance inversée"
       "backward_match": "Correspondance inversée"
     },
     },
-    "group_list": "Liste des groupes",
-    "child_group_list": "Liste des groupes enfants",
+    "group_list": "Groupes",
+    "child_group_list": "Groupes enfants",
     "back_to_list": "Retour à la liste",
     "back_to_list": "Retour à la liste",
-    "basic_info": "Information de base",
-    "user_list": "Liste des utilisateurs",
+    "basic_info": "Création du groupe",
+    "user_list": "Utilisateurs assignés",
     "created_group": "Groupe crée",
     "created_group": "Groupe crée",
     "is_loading_data": "Chargement...",
     "is_loading_data": "Chargement...",
-    "no_pages": "Le groupe n'a pas la permission de voir la page.",
+    "no_pages": "Le groupe n'a pas de pages assignées.",
     "remove_from_group": "Retirer l'utilisateur",
     "remove_from_group": "Retirer l'utilisateur",
     "delete_modal": {
     "delete_modal": {
       "header": "Supprimer groupe",
       "header": "Supprimer groupe",
@@ -859,7 +859,7 @@
     }
     }
   },
   },
   "audit_log_management": {
   "audit_log_management": {
-    "audit_log": "Journal d'audit",
+    "audit_log": "Audit",
     "audit_log_settings": "Configuration des journaux d'audit",
     "audit_log_settings": "Configuration des journaux d'audit",
     "user": "Utilisateur",
     "user": "Utilisateur",
     "username": "Nom d'utilisateur",
     "username": "Nom d'utilisateur",
@@ -889,12 +889,12 @@
   },
   },
   "plugins": {
   "plugins": {
     "plugins": "Plugins",
     "plugins": "Plugins",
-    "plugin_installer": "Configuration de plugins",
+    "plugin_installer": "Installer un plugin",
     "form": {
     "form": {
       "label_url": "URL du plugin",
       "label_url": "URL du plugin",
-      "desc_url": "Les plugins sont installables par URL",
+      "desc_url": "URL vers le code source du plugin. L'URL doit être accessible publiquement.",
       "label_branch": "Branche",
       "label_branch": "Branche",
-      "desc_branch": "Spécification du nom de la branche. Par défaut: `main`"
+      "desc_branch": "Nom de la branche du dépôt"
     },
     },
     "plugin_card": "Plugins",
     "plugin_card": "Plugins",
     "plugin_is_not_installed": "Aucun plugins installés",
     "plugin_is_not_installed": "Aucun plugins installés",
@@ -980,7 +980,7 @@
     "ADMIN_SITE_URL_UPDATE": "Modifier les paramètres d'URL",
     "ADMIN_SITE_URL_UPDATE": "Modifier les paramètres d'URL",
     "ADMIN_MAIL_SMTP_UPDATE": "Modifier les paramètres d'e-mail",
     "ADMIN_MAIL_SMTP_UPDATE": "Modifier les paramètres d'e-mail",
     "ADMIN_MAIL_SES_UPDATE": "Modifier les paramètres d'e-mail (SES)",
     "ADMIN_MAIL_SES_UPDATE": "Modifier les paramètres d'e-mail (SES)",
-    "ADMIN_MAIL_TEST_SUBMIT" : "Envoyer courriel de test",
+    "ADMIN_MAIL_TEST_SUBMIT": "Envoyer courriel de test",
     "ADMIN_FILE_UPLOAD_CONFIG_UPDATE": "Modifier paramètres de téléversemetnt de fichiers",
     "ADMIN_FILE_UPLOAD_CONFIG_UPDATE": "Modifier paramètres de téléversemetnt de fichiers",
     "ADMIN_PLUGIN_UPDATE": "Mettre à jour les paramètres de plugins",
     "ADMIN_PLUGIN_UPDATE": "Mettre à jour les paramètres de plugins",
     "ADMIN_MAINTENANCEMODE_ENABLED": "Activer mode maintenance",
     "ADMIN_MAINTENANCEMODE_ENABLED": "Activer mode maintenance",

+ 16 - 30
apps/app/public/static/locales/fr_FR/commons.json

@@ -7,7 +7,6 @@
   "Sign out": "Se déconnecter",
   "Sign out": "Se déconnecter",
   "New": "Nouveau",
   "New": "Nouveau",
   "Delete": "Supprimer",
   "Delete": "Supprimer",
-
   "meta": {
   "meta": {
     "display_name": "Français"
     "display_name": "Français"
   },
   },
@@ -28,9 +27,8 @@
     "email_is_already_in_use": "La configuration SMTP est déjà faite."
     "email_is_already_in_use": "La configuration SMTP est déjà faite."
   },
   },
   "headers": {
   "headers": {
-    "app_settings": "Paramètres de l'application"
+    "app_settings": "Application"
   },
   },
-
   "header_search_box": {
   "header_search_box": {
     "label": {
     "label": {
       "All pages": "Toutes les pages",
       "All pages": "Toutes les pages",
@@ -41,30 +39,26 @@
       "This tree": "Enfants de cette arbre"
       "This tree": "Enfants de cette arbre"
     }
     }
   },
   },
-
   "search_method_menu_item": {
   "search_method_menu_item": {
     "search_in_all": "Rechercher dans tout",
     "search_in_all": "Rechercher dans tout",
     "only_children_of_this_tree": "Enfants de cet arbre",
     "only_children_of_this_tree": "Enfants de cet arbre",
     "exact_mutch": "Correspondance exacte"
     "exact_mutch": "Correspondance exacte"
   },
   },
-
   "share_links": {
   "share_links": {
     "Share Link": "Liens de partage",
     "Share Link": "Liens de partage",
     "Page Path": "Chemin de la page",
     "Page Path": "Chemin de la page",
     "expire": "Expiration",
     "expire": "Expiration",
     "description": "Description"
     "description": "Description"
   },
   },
-
   "in_app_notification": {
   "in_app_notification": {
     "notification_list": "Notifications d'application",
     "notification_list": "Notifications d'application",
     "see_all": "Voir tout",
     "see_all": "Voir tout",
-    "no_notification": "Vous n'avez pas de notifications.",
+    "no_notification": "Aucune notification.",
     "all": "Toutes",
     "all": "Toutes",
     "unopend": "Non-lues",
     "unopend": "Non-lues",
     "mark_all_as_read": "Tout marquer comme lu",
     "mark_all_as_read": "Tout marquer comme lu",
     "no_unread_messages": "aucun message non lu"
     "no_unread_messages": "aucun message non lu"
   },
   },
-
   "personal_dropdown": {
   "personal_dropdown": {
     "home": "Accueil",
     "home": "Accueil",
     "settings": "Paramètres",
     "settings": "Paramètres",
@@ -72,24 +66,21 @@
     "sidebar_mode": "Navigation latérale",
     "sidebar_mode": "Navigation latérale",
     "sidebar_mode_editor": "Navigation latérale dans l'éditeur",
     "sidebar_mode_editor": "Navigation latérale dans l'éditeur",
     "use_os_settings": "Utiliser les paramètres système",
     "use_os_settings": "Utiliser les paramètres système",
-    "feedback": "Avis"
+    "feedback": "Sondage"
   },
   },
-
-
   "create_page_dropdown": {
   "create_page_dropdown": {
-    "new_page": "Créer nouvelle page",
-    "open_page_create_modal": "Ouvrir une nouvelle page créer une fenêtre modale",
+    "new_page": "Nouvelle page",
+    "open_page_create_modal": "Modale de création de page",
     "todays": {
     "todays": {
-      "desc": "Créer le mémo du jour",
+      "desc": "Mémo du jour",
       "memo": "mémo"
       "memo": "mémo"
     },
     },
     "template": {
     "template": {
-      "desc": "Créer/modifier page modèle",
-      "children": "Modèle page enfant",
-      "descendants": "Modèle pour descendants"
+      "desc": "Modèles",
+      "children": "Modèle pour page enfant",
+      "descendants": "Modèle pour page adjacentes"
     }
     }
   },
   },
-
   "copy_to_clipboard": {
   "copy_to_clipboard": {
     "Copy to clipboard": "Copier dans le presse-papier",
     "Copy to clipboard": "Copier dans le presse-papier",
     "Page path": "Chemin de la page",
     "Page path": "Chemin de la page",
@@ -99,30 +90,27 @@
     "Markdown link": "Lien Markdown",
     "Markdown link": "Lien Markdown",
     "Append params": "Affixer les paramètres"
     "Append params": "Affixer les paramètres"
   },
   },
-
   "crop_image_modal": {
   "crop_image_modal": {
     "image_crop": "Recadrage d'image",
     "image_crop": "Recadrage d'image",
     "crop": "Recadrer",
     "crop": "Recadrer",
     "save": "Sauvegarder",
     "save": "Sauvegarder",
     "cancel": "Annuler"
     "cancel": "Annuler"
   },
   },
-
   "handsontable_modal": {
   "handsontable_modal": {
-    "title": "Modifier table",
-    "data_import": "Import de données",
+    "title": "Tableau",
+    "data_import": "Importer des données",
     "save": "Sauvegarder",
     "save": "Sauvegarder",
     "cancel": "Annuler",
     "cancel": "Annuler",
-    "done": "Terminer",
+    "done": "Mettre à jour",
     "data_import_form": {
     "data_import_form": {
-      "select_data_format": "Sélectionner format de données",
-      "import_data": "Importer données",
-      "paste_table_data": "Coller les données de la table",
-      "parse_error": "Erreur d'analyse",
+      "select_data_format": "Format",
+      "import_data": "Données du fichier",
+      "paste_table_data": "Coller les données de la fichier",
+      "parse_error": "Erreur lors de l'importation des données",
       "cancel": "Annuler",
       "cancel": "Annuler",
       "import": "Importer"
       "import": "Importer"
     }
     }
   },
   },
-
   "questionnaire_modal": {
   "questionnaire_modal": {
     "required": "Requis",
     "required": "Requis",
     "submit": "Soumettre",
     "submit": "Soumettre",
@@ -146,11 +134,9 @@
     "successfully_submitted": "Questionnaire soumis.",
     "successfully_submitted": "Questionnaire soumis.",
     "thanks_for_answering": "Merci pour votre avis."
     "thanks_for_answering": "Merci pour votre avis."
   },
   },
-
   "not_found_page": {
   "not_found_page": {
     "page_not_exist": "Cette page est introuvable."
     "page_not_exist": "Cette page est introuvable."
   },
   },
-
   "g2g_data_transfer": {
   "g2g_data_transfer": {
     "tab": "Transfert de données",
     "tab": "Transfert de données",
     "data_transfer": "Transfert de données",
     "data_transfer": "Transfert de données",

+ 65 - 64
apps/app/public/static/locales/fr_FR/translation.json

@@ -3,7 +3,7 @@
     "display_name": "Français"
     "display_name": "Français"
   },
   },
   "Help": "Aide",
   "Help": "Aide",
-  "view": "Voir",
+  "View": "Voir",
   "Edit": "Modifier",
   "Edit": "Modifier",
   "Delete": "Supprimer",
   "Delete": "Supprimer",
   "delete_all": "Tout supprimer",
   "delete_all": "Tout supprimer",
@@ -60,7 +60,7 @@
   "Timeline View": "Chronologie",
   "Timeline View": "Chronologie",
   "History": "Historique",
   "History": "Historique",
   "attachment_data": "Pièces jointes",
   "attachment_data": "Pièces jointes",
-  "No_attachments_yet": "Aucunes pièces jointes.",
+  "No_attachments_yet": "Aucune pièce jointe.",
   "Presentation Mode": "Mode présentation",
   "Presentation Mode": "Mode présentation",
   "Not available for guest": "Indisponible pour les invités",
   "Not available for guest": "Indisponible pour les invités",
   "Not available in this version": "Indisponible dans cette version",
   "Not available in this version": "Indisponible dans cette version",
@@ -90,24 +90,25 @@
   "No diff": "Aucune différences",
   "No diff": "Aucune différences",
   "Latest": "Dernière version",
   "Latest": "Dernière version",
   "User ID": "Identifiant utilisateur",
   "User ID": "Identifiant utilisateur",
-  "User Information": "Informations utilisateur",
+  "User Settings": "Paramètres utilisateur",
+  "User Information": "Mon compte",
   "User Activation": "Activation utilisateur",
   "User Activation": "Activation utilisateur",
-  "Basic Info": "Informations de base",
+  "Basic Info": "Informations du compte",
   "Name": "Nom",
   "Name": "Nom",
   "Email": "Adresse courriel",
   "Email": "Adresse courriel",
   "Language": "Langue",
   "Language": "Langue",
   "English": "Anglais",
   "English": "Anglais",
   "Japanese": "Japonais",
   "Japanese": "Japonais",
-  "Set Profile Image": "Sélectionner image de profil",
-  "Upload Image": "Téléverser image",
-  "Current Image": "Image actuelle",
-  "Delete Image": "Supprimer image",
-  "Delete this image?": "Supprimer cette image?",
+  "Set Profile Image": "Photo de profil",
+  "Upload Image": "Photo personalisée",
+  "Current Image": "Photo actuelle",
+  "Delete Image": "Supprimer photo",
+  "Delete this image?": "Supprimer cette photo?",
   "Updated": "Modifié",
   "Updated": "Modifié",
-  "Upload new image": "Téléverser nouvelle image",
+  "Upload new image": "Téléverser une photo",
   "Connected": "Connecté",
   "Connected": "Connecté",
   "Loading": "Chargement...",
   "Loading": "Chargement...",
-  "Disclose E-mail": "Afficher adresse courriel",
+  "Disclose E-mail": "Divulguer adresse courriel",
   "page exists": "cette page est déjà existante",
   "page exists": "cette page est déjà existante",
   "Error occurred": "Une erreur est survenue",
   "Error occurred": "Une erreur est survenue",
   "Input page name": "Nom de la page",
   "Input page name": "Nom de la page",
@@ -122,21 +123,21 @@
   "UserGroup": "Groupe utilisateur",
   "UserGroup": "Groupe utilisateur",
   "Basic Settings": "Paramètres de base",
   "Basic Settings": "Paramètres de base",
   "The contents entered here will be shown in the header etc": "Le contenu entré ici sera visible dans l'en-tête",
   "The contents entered here will be shown in the header etc": "Le contenu entré ici sera visible dans l'en-tête",
-  "Public": "Public",
+  "Public": "Tout le monde",
   "Anyone with the link": "Tous les utilisateurs disposant du lien",
   "Anyone with the link": "Tous les utilisateurs disposant du lien",
   "Specified users only": "Utilisateurs spécifiés",
   "Specified users only": "Utilisateurs spécifiés",
   "Only me": "Seulement moi",
   "Only me": "Seulement moi",
   "Only inside the group": "Utilisateurs du groupe",
   "Only inside the group": "Utilisateurs du groupe",
-  "page_list": "Liste de pages",
+  "page_list": "Pages enfants",
   "comments": "Commentaires",
   "comments": "Commentaires",
   "Reselect the group": "Resélectionner ce groupe",
   "Reselect the group": "Resélectionner ce groupe",
   "Shareable link": "Lien partageable",
   "Shareable link": "Lien partageable",
   "The whitelist of registration permission E-mail address": "Les adresses courriel permises lors de l'inscription",
   "The whitelist of registration permission E-mail address": "Les adresses courriel permises lors de l'inscription",
   "Add tags for this page": "Ajouter des étiquettes",
   "Add tags for this page": "Ajouter des étiquettes",
   "tag_list": "Étiquettes",
   "tag_list": "Étiquettes",
-  "popular_tags": "Étiquettes populaires",
-  "Check All tags": "voir toutes les étiquettes",
-  "You have no tag, You can set tags on pages": "Vous n'avez aucunes étiquettes, vous pouvez assigner des étiquettes aux pages",
+  "popular_tags": "Étiquettes fréquentes",
+  "Check All tags": "Toutes les étiquettes",
+  "You have no tag, You can set tags on pages": "Aucune étiquette existante.",
   "Show latest": "Voir le plus récent",
   "Show latest": "Voir le plus récent",
   "Load latest": "Charger le plus récent",
   "Load latest": "Charger le plus récent",
   "edited this page": "à modifié cette page.",
   "edited this page": "à modifié cette page.",
@@ -147,9 +148,9 @@
   "No bookmarks yet": "Aucuns favoris",
   "No bookmarks yet": "Aucuns favoris",
   "add_bookmark": "Ajouter aux favoris",
   "add_bookmark": "Ajouter aux favoris",
   "remove_bookmark": "Retirer des favoris",
   "remove_bookmark": "Retirer des favoris",
-  "wide_view": "Vue élargie",
+  "wide_view": "Affichage large",
   "Recent Changes": "Modifications récentes",
   "Recent Changes": "Modifications récentes",
-  "Page Tree": "Arbre",
+  "Page Tree": "Arborescence",
   "Bookmarks": "Favoris",
   "Bookmarks": "Favoris",
   "In-App Notification": "Notifications",
   "In-App Notification": "Notifications",
   "original_path": "Chemin originel",
   "original_path": "Chemin originel",
@@ -227,7 +228,7 @@
     "form_help": {}
     "form_help": {}
   },
   },
   "Password": "Mot de passe",
   "Password": "Mot de passe",
-  "Password Settings": "Paramètres de mot passe",
+  "Password Settings": "Sécurité",
   "personal_settings": {
   "personal_settings": {
     "disassociate_external_account": "Dissocier compte externe",
     "disassociate_external_account": "Dissocier compte externe",
     "disassociate_external_account_desc": "Dissocier le compte externe <strong>{{providerType}}</strong> <strong>{{accountId}}</strong>?",
     "disassociate_external_account_desc": "Dissocier le compte externe <strong>{{providerType}}</strong> <strong>{{accountId}}</strong>?",
@@ -241,7 +242,7 @@
   "share_links": {
   "share_links": {
     "Shere this page link to public": "Partager cette page publiquement",
     "Shere this page link to public": "Partager cette page publiquement",
     "share_link_list": "Liens de partage",
     "share_link_list": "Liens de partage",
-    "share_link_management": "Gestion des liens de partage",
+    "share_link_management": "Liens de partage",
     "delete_all_share_links": "Supprimer tout les liens de partage",
     "delete_all_share_links": "Supprimer tout les liens de partage",
     "expire": "Expiration",
     "expire": "Expiration",
     "Days": "Jour",
     "Days": "Jour",
@@ -254,23 +255,23 @@
     "Invalid_Number_of_Date": "Valeurs invalides",
     "Invalid_Number_of_Date": "Valeurs invalides",
     "link_sharing_is_disabled": "Le partage est désactivé"
     "link_sharing_is_disabled": "Le partage est désactivé"
   },
   },
-  "API Settings": "Configuration API",
+  "API Settings": "API GROWI",
   "Other Settings": "Autres paramètres",
   "Other Settings": "Autres paramètres",
-  "API Token Settings": "Paramètres de jetons",
-  "Current API Token": "Jeton d'API actuel",
-  "Update API Token": "Modifier jeton",
+  "API Token Settings": "Jetons d'API",
+  "Current API Token": "Mon jeton d'API",
+  "Update API Token": "Regénérer",
   "in_app_notification_settings": {
   "in_app_notification_settings": {
-    "in_app_notification_settings": "Paramètres de notifications",
+    "in_app_notification_settings": "Notifications",
     "subscribe_settings": "Paramètres d'abonnement automatique aux notifications de pages",
     "subscribe_settings": "Paramètres d'abonnement automatique aux notifications de pages",
     "default_subscribe_rules": {
     "default_subscribe_rules": {
-      "page_create": "S'abonner à la page lors de sa création."
+      "page_create": "S'abonner aux modifications d'une page lors de sa création."
     }
     }
   },
   },
   "ui_settings": {
   "ui_settings": {
-    "ui_settings": "Paramètres UI",
+    "ui_settings": "Interface",
     "side_bar_mode": {
     "side_bar_mode": {
       "settings": "Paramètres navigation latérale",
       "settings": "Paramètres navigation latérale",
-      "side_bar_mode_setting": "Activer la navigation latérale",
+      "side_bar_mode_setting": "Épingler la navigation latérale",
       "description": "Activer pour toujours afficher la barre de navigation latérale lorsque l'écran est large. Si la largeur d'écran est faible, le cas inverse est applicable."
       "description": "Activer pour toujours afficher la barre de navigation latérale lorsque l'écran est large. Si la largeur d'écran est faible, le cas inverse est applicable."
     }
     }
   },
   },
@@ -278,7 +279,7 @@
     "light": "Clair",
     "light": "Clair",
     "dark": "Sombre",
     "dark": "Sombre",
     "system": "Système",
     "system": "Système",
-    "settings": "Paramètres de thème",
+    "settings": "Thème",
     "description": "Affichage en mode clair, sombre ou selon les paramètres système.<br>Seuls les thèmes supportés seront modifiés."
     "description": "Affichage en mode clair, sombre ou selon les paramètres système.<br>Seuls les thèmes supportés seront modifiés."
   },
   },
   "editor_settings": {
   "editor_settings": {
@@ -331,17 +332,17 @@
   "page_edit": {
   "page_edit": {
     "input_channels": "Canal Slack...",
     "input_channels": "Canal Slack...",
     "theme": "Thème",
     "theme": "Thème",
-    "keymap": "Touches",
+    "keymap": "Raccourcis",
     "indent": "Indentation",
     "indent": "Indentation",
     "paste": {
     "paste": {
       "title": "Comportement du collage",
       "title": "Comportement du collage",
-      "both": "Les deux",
+      "both": "Texte et fichier",
       "text": "Texte seulement",
       "text": "Texte seulement",
       "file": "Fichier seulement"
       "file": "Fichier seulement"
     },
     },
-    "editor_config": "Configuration de l'éditeur",
-    "Show active line": "Montrer la ligne active",
-    "auto_format_table": "Formattage les tables",
+    "editor_config": "Préférences de l'éditeur",
+    "Show active line": "Surligner la ligne active",
+    "auto_format_table": "Formatter les tableaux",
     "overwrite_scopes": "{{operation}} et écraser les scopes des pages enfants",
     "overwrite_scopes": "{{operation}} et écraser les scopes des pages enfants",
     "notice": {
     "notice": {
       "conflict": "Sauvegarde impossible, la page est en cours de modification par un autre utilisateur. Recharger la page."
       "conflict": "Sauvegarde impossible, la page est en cours de modification par un autre utilisateur. Recharger la page."
@@ -370,28 +371,28 @@
   },
   },
   "page_history": {
   "page_history": {
     "revision_list": "Historique des modifications",
     "revision_list": "Historique des modifications",
-    "revision": "version",
+    "revision": "Révision",
     "comparing_source": "Source",
     "comparing_source": "Source",
-    "comparing_target": "Destination",
+    "comparing_target": "Cible",
     "comparing_revisions": "Comparer les modifications",
     "comparing_revisions": "Comparer les modifications",
     "compare_latest": "Comparer avec la version la plus récente",
     "compare_latest": "Comparer avec la version la plus récente",
-    "compare_previous": "Compare avec une version précédente"
+    "compare_previous": "Comparer avec la version précédente"
   },
   },
   "modal_rename": {
   "modal_rename": {
     "label": {
     "label": {
       "Move/Rename page": "Déplacer/renommer page",
       "Move/Rename page": "Déplacer/renommer page",
-      "New page name": "Nom de la page",
+      "New page name": "Nouveau chemin",
       "Failed to get subordinated pages": "échec de récupération des pages subordinnées",
       "Failed to get subordinated pages": "échec de récupération des pages subordinnées",
       "Failed to get exist path": "échec de la récupération du chemin",
       "Failed to get exist path": "échec de la récupération du chemin",
-      "Current page name": "Nom de la page courante",
+      "Current page name": "Chemin actuel",
       "Rename this page only": "Renommer cette page",
       "Rename this page only": "Renommer cette page",
       "Force rename all child pages": "Forcer le renommage des pages",
       "Force rename all child pages": "Forcer le renommage des pages",
       "Other options": "Autres options",
       "Other options": "Autres options",
       "Do not update metadata": "Ne pas modifier les métadonnées",
       "Do not update metadata": "Ne pas modifier les métadonnées",
-      "Redirect": "Rediriger"
+      "Redirect": "Redirection automatique"
     },
     },
     "help": {
     "help": {
-      "redirect": "Rediriger vers la nouvelle page",
+      "redirect": "Redirige automatiquement vers le nouveau chemin de la page.",
       "metadata": "Conserve les métadonnées d'édition de la page",
       "metadata": "Conserve les métadonnées d'édition de la page",
       "recursive": "Déplacer/renommer les pages enfants récursivement"
       "recursive": "Déplacer/renommer les pages enfants récursivement"
     }
     }
@@ -515,7 +516,7 @@
     "initialize_successed": "Initialisation de {{target}} réussie",
     "initialize_successed": "Initialisation de {{target}} réussie",
     "remove_share_link_success": "Suppression de {{shareLinkId}} réussie",
     "remove_share_link_success": "Suppression de {{shareLinkId}} réussie",
     "issue_share_link": "Lien de partage ajouté",
     "issue_share_link": "Lien de partage ajouté",
-    "remove_share_link": "{{count}} liens de partage supprimés",
+    "remove_share_link": "{{count}} liens supprimés",
     "switch_disable_link_sharing_success": "Paramètres des liens de partage modifiés",
     "switch_disable_link_sharing_success": "Paramètres des liens de partage modifiés",
     "failed_to_reset_password": "Échec de la réinitialisation du mot de passe",
     "failed_to_reset_password": "Échec de la réinitialisation du mot de passe",
     "save_succeeded": "Sauvegarde réussie"
     "save_succeeded": "Sauvegarde réussie"
@@ -759,9 +760,9 @@
     "select_page_to_see": "Sélectionner une page"
     "select_page_to_see": "Sélectionner une page"
   },
   },
   "user_group": {
   "user_group": {
-    "select_group": "Sélectionner groupe",
-    "belonging_to_no_group": "Appartenance au groupe introuvable.",
-    "manage_user_groups": "Gestion des groupes utilisateurs"
+    "select_group": "Groupes autorisés",
+    "belonging_to_no_group": "Vous n'appartenez à aucun groupe.",
+    "manage_user_groups": "Gestion des groupes"
   },
   },
   "fix_page_grant": {
   "fix_page_grant": {
     "modal": {
     "modal": {
@@ -792,11 +793,11 @@
   "tooltip": {
   "tooltip": {
     "like": "Like!",
     "like": "Like!",
     "cancel_like": "Annuler",
     "cancel_like": "Annuler",
-    "bookmark": "Favori",
-    "cancel_bookmark": "Annuler favori",
-    "receive_notifications": "Recevoir les notifications",
-    "stop_notification": "Stopper les notifications",
-    "footprints": "Visiteurs",
+    "bookmark": "Ajouter aux favoris",
+    "cancel_bookmark": "Retirer des favoris",
+    "receive_notifications": "S'abonner",
+    "stop_notification": "Se désabonner",
+    "footprints": "Lecteurs",
     "login_required": "Connexion requise",
     "login_required": "Connexion requise",
     "operation": {
     "operation": {
       "attention": {
       "attention": {
@@ -810,7 +811,7 @@
   },
   },
   "user_home_page": {
   "user_home_page": {
     "bookmarks": "Favoris",
     "bookmarks": "Favoris",
-    "recently_created": "Crée récemment"
+    "recently_created": "Page récentes"
   },
   },
   "bookmark_folder": {
   "bookmark_folder": {
     "bookmark_folder": "dossier de favoris",
     "bookmark_folder": "dossier de favoris",
@@ -843,18 +844,18 @@
     "disagree": "En désaccord",
     "disagree": "En désaccord",
     "answer": "Répondre",
     "answer": "Répondre",
     "no_answer": "Aucune réponse",
     "no_answer": "Aucune réponse",
-    "settings": "Configuration du questionnaire",
-    "failed_to_send": "Échec de l'envoi du questionnaire",
-    "denied": "Le questionnaire ne sera plus montré",
-    "personal_settings_explanation": "Les questionnaires de satisfaction seront actifs.",
-    "enable_questionnaire": "Activer questionnaire",
-    "disabled_by_admin": "Questionnaire désactivé par l'administrateur"
+    "settings": "Sondages anonymes",
+    "failed_to_send": "Échec de l'envoi du sondage",
+    "denied": "Les sondages ne seront plus affichés.",
+    "personal_settings_explanation": "Sondages de satisfaction anonymes.",
+    "enable_questionnaire": "Sondages anonymes",
+    "disabled_by_admin": "Sondages anonymes désactivés par l'administrateur"
   },
   },
   "tag_edit_modal": {
   "tag_edit_modal": {
-    "edit_tags": "Modifier étiquettes",
-    "done": "Terminer",
+    "edit_tags": "Étiquettes",
+    "done": "Mettre à jour",
     "tags_input": {
     "tags_input": {
-      "tag_name": "nom de l'étiquette"
+      "tag_name": "Choisir ou créer une étiquette"
     }
     }
   },
   },
   "delete_attachment_modal": {
   "delete_attachment_modal": {
@@ -881,11 +882,11 @@
     "size_l": "Taille: G"
     "size_l": "Taille: G"
   },
   },
   "sync-latest-revision-body": {
   "sync-latest-revision-body": {
-    "menuitem": "Synchroniser le texte de l'éditeur avec le corps de la dernière révision",
-    "confirm": "Delete the draft data being entered into the editor and synchronize the latest text. Are you sure you want to run it?",
+    "menuitem": "Synchroniser avec la dernière révision",
+    "confirm": "Supprime les données en brouillon et synchronise avec la dernière révision. Synchroniser?",
     "alert": "Il se peut que le texte le plus récent n'ait pas été synchronisé. Veuillez recharger et vérifier à nouveau.",
     "alert": "Il se peut que le texte le plus récent n'ait pas été synchronisé. Veuillez recharger et vérifier à nouveau.",
     "success-toaster": "Dernier texte synchronisé",
     "success-toaster": "Dernier texte synchronisé",
-    "skipped-toaster": "Synchronisation ignorée car l'éditeur n'est pas activé. Ouvrir l'éditeur et réessayer.",
-    "error-toaster": "La synchronisation du dernier texte a échoué"
+    "skipped-toaster": "L'éditeur n'est pas actif. Synchronisation annulée.",
+    "error-toaster": "Synchronisation échouée"
   }
   }
 }
 }

+ 1 - 1
apps/app/public/static/locales/ja_JP/admin.json

@@ -212,7 +212,7 @@
         "name_detail": "新規ユーザー名(<code>name</code>)に関連付ける属性",
         "name_detail": "新規ユーザー名(<code>name</code>)に関連付ける属性",
         "mapping_detail": "新規ユーザーの{{target}}に関連付ける属性",
         "mapping_detail": "新規ユーザーの{{target}}に関連付ける属性",
         "register_1": "OIDC IdP Administrator へ接続します。",
         "register_1": "OIDC IdP Administrator へ接続します。",
-        "register_2": "OIDCアプリの認証コールバックURLを<code>%s</code>として登録します。",
+        "register_2": "OIDCアプリの認証コールバックURLを<code>{{url}}</code>として登録します。",
         "register_3": "上記のClientIDとClient Secretをコピー&ペーストしてください。",
         "register_3": "上記のClientIDとClient Secretをコピー&ペーストしてください。",
         "updated_oidc": "OpenID Connect を更新しました",
         "updated_oidc": "OpenID Connect を更新しました",
         "Use discovered URL if empty": "データベース側の値が空の場合、\"Issuer Host\"から検出した値を利用します。"
         "Use discovered URL if empty": "データベース側の値が空の場合、\"Issuer Host\"から検出した値を利用します。"

+ 2 - 2
apps/app/public/static/locales/zh_CN/admin.json

@@ -210,9 +210,9 @@
 				"id_detail": "Specification of the name of attribute which can identify the user in OIDC claims",
 				"id_detail": "Specification of the name of attribute which can identify the user in OIDC claims",
 				"username_detail": "Specification of mappings for <code>username</code> when creating new users",
 				"username_detail": "Specification of mappings for <code>username</code> when creating new users",
 				"name_detail": "Specification of mappings for <code>name</code> when creating new users",
 				"name_detail": "Specification of mappings for <code>name</code> when creating new users",
-				"mapping_detail": "Specification of mappings for %s when creating new users",
+				"mapping_detail": "Specification of mappings for {{target}} when creating new users",
 				"register_1": "Contact to OIDC IdP Administrator",
 				"register_1": "Contact to OIDC IdP Administrator",
-				"register_2": "Register your OIDC App with \"Authorization callback URL\" as <code>%s</code>",
+				"register_2": "Register your OIDC App with \"Authorization callback URL\" as <code>{{url}}</code>",
 				"register_3": "Copy and paste your ClientID and Client Secret above",
 				"register_3": "Copy and paste your ClientID and Client Secret above",
 				"updated_oidc": "Succeeded to update OpenID Connect",
 				"updated_oidc": "Succeeded to update OpenID Connect",
         "Use discovered URL if empty": "Use discovered URL from \"Issuer Host\" if empty"
         "Use discovered URL if empty": "Use discovered URL from \"Issuer Host\" if empty"

+ 1 - 1
apps/app/src/client/components/Admin/Security/OidcSecuritySettingContents.jsx

@@ -455,7 +455,7 @@ class OidcSecurityManagementContents extends React.Component {
           <div className=" card custom-card bg-body-tertiary">
           <div className=" card custom-card bg-body-tertiary">
             <ol id="collapseHelpForOidcOauth" className="collapse mb-0">
             <ol id="collapseHelpForOidcOauth" className="collapse mb-0">
               <li>{t('security_settings.OAuth.OIDC.register_1')}</li>
               <li>{t('security_settings.OAuth.OIDC.register_1')}</li>
-              <li>{t('security_settings.OAuth.OIDC.register_2')}</li>
+              <li dangerouslySetInnerHTML={{ __html: t('security_settings.OAuth.OIDC.register_2', { url: oidcCallbackUrl }) }} />
               <li>{t('security_settings.OAuth.OIDC.register_3')}</li>
               <li>{t('security_settings.OAuth.OIDC.register_3')}</li>
             </ol>
             </ol>
           </div>
           </div>

+ 42 - 0
apps/app/src/server/routes/apiv3/installer.ts

@@ -29,6 +29,48 @@ module.exports = (crowi: Crowi): Router => {
 
 
   const minPasswordLength = configManager.getConfig('crowi', 'app:minPasswordLength');
   const minPasswordLength = configManager.getConfig('crowi', 'app:minPasswordLength');
 
 
+  /**
+   * @swagger
+   *
+   *  /installer:
+   *    post:
+   *      tags: [Install]
+   *      security: []
+   *      operationId: Install
+   *      summary: /installer
+   *      description: Install GROWI
+   *      requestBody:
+   *        required: true
+   *        content:
+   *          application/json:
+   *            schema:
+   *              type: object
+   *              properties:
+   *                registerForm:
+   *                  type: object
+   *                  properties:
+   *                    name:
+   *                      type: string
+   *                    username:
+   *                      type: string
+   *                    email:
+   *                      type: string
+   *                    password:
+   *                      type: string
+   *                    app:globalLang:
+   *                      type: string
+   *                      default: en_US
+   *      responses:
+   *        200:
+   *          description: import settings params
+   *          content:
+   *            application/json:
+   *              schema:
+   *                properties:
+   *                  message:
+   *                    type: string
+   *                    example: Installation completed (Logged in as an admin user)
+   */
   // eslint-disable-next-line max-len
   // eslint-disable-next-line max-len
   router.post('/', registerRules(minPasswordLength), registerValidation, addActivity, async(req: FormRequest, res: ApiV3Response) => {
   router.post('/', registerRules(minPasswordLength), registerValidation, addActivity, async(req: FormRequest, res: ApiV3Response) => {
     const appService = crowi.appService;
     const appService = crowi.appService;

+ 42 - 0
apps/app/src/server/routes/apiv3/invited.ts

@@ -18,6 +18,48 @@ module.exports = (crowi: Crowi): Router => {
   const applicationInstalled = require('../../middlewares/application-installed')(crowi);
   const applicationInstalled = require('../../middlewares/application-installed')(crowi);
   const router = express.Router();
   const router = express.Router();
 
 
+  /**
+   * @swagger
+   *
+   *  /invited:
+   *    post:
+   *      tags: [Users]
+   *      security:
+   *        - cookieAuth: []
+   *      operationId: activateInvitedUser
+   *      summary: /invited
+   *      description: Activate invited user
+   *      requestBody:
+   *        required: true
+   *        content:
+   *          application/json:
+   *            schema:
+   *              type: object
+   *              properties:
+   *                invitedForm:
+   *                  type: object
+   *                  properties:
+   *                    username:
+   *                      type: string
+   *                      description: The username of the invited user.
+   *                    name:
+   *                      type: string
+   *                      description: The name of the invited user.
+   *                    password:
+   *                      type: string
+   *                      description: The password for the invited user.
+   *      responses:
+   *        200:
+   *          description: User activated successfully
+   *          content:
+   *            application/json:
+   *              schema:
+   *                type: object
+   *                properties:
+   *                  redirectTo:
+   *                    type: string
+   *                    description: URL to redirect after successful activation.
+   */
   router.post('/', applicationInstalled, invitedRules(), invitedValidation, async(req: InvitedFormRequest, res: ApiV3Response) => {
   router.post('/', applicationInstalled, invitedRules(), invitedValidation, async(req: InvitedFormRequest, res: ApiV3Response) => {
     if (!req.user) {
     if (!req.user) {
       return res.apiv3({ redirectTo: '/login' });
       return res.apiv3({ redirectTo: '/login' });

+ 2 - 2
apps/app/src/server/routes/apiv3/page/index.ts

@@ -342,14 +342,14 @@ module.exports = (crowi) => {
    *                    $ref: '#/components/schemas/Revision/properties/body'
    *                    $ref: '#/components/schemas/Revision/properties/body'
    *                  page_id:
    *                  page_id:
    *                    $ref: '#/components/schemas/Page/properties/_id'
    *                    $ref: '#/components/schemas/Page/properties/_id'
-   *                  revision_id:
+   *                  revisionId:
    *                    $ref: '#/components/schemas/Revision/properties/_id'
    *                    $ref: '#/components/schemas/Revision/properties/_id'
    *                  grant:
    *                  grant:
    *                    $ref: '#/components/schemas/Page/properties/grant'
    *                    $ref: '#/components/schemas/Page/properties/grant'
    *                required:
    *                required:
    *                  - body
    *                  - body
    *                  - page_id
    *                  - page_id
-   *                  - revision_id
+   *                  - revisionId
    *        responses:
    *        responses:
    *          200:
    *          200:
    *            description: Succeeded to update page.
    *            description: Succeeded to update page.

+ 31 - 0
apps/app/src/server/service/normalize-data/convert-null-to-empty-granted-arrays.ts

@@ -0,0 +1,31 @@
+import type { IPageHasId } from '@growi/core';
+import mongoose from 'mongoose';
+
+import { type PageModel } from '~/server/models/page';
+
+export const convertNullToEmptyGrantedArrays = async(): Promise<void> => {
+  const Page = mongoose.model<IPageHasId, PageModel>('Page');
+
+  const requests = [
+    {
+      updateMany: {
+        // Matches documents where field is null or nonexistent
+        // https://www.mongodb.com/docs/manual/tutorial/query-for-null-fields/#equality-filter
+        filter: { grantedUsers: null },
+        update: {
+          $set: { grantedUsers: [] },
+        },
+      },
+    },
+    {
+      updateMany: {
+        filter: { grantedGroups: null },
+        update: {
+          $set: { grantedGroups: [] },
+        },
+      },
+    },
+  ];
+
+  await Page.bulkWrite(requests);
+};

+ 2 - 0
apps/app/src/server/service/normalize-data/index.ts

@@ -1,6 +1,7 @@
 import { normalizeExpiredAtForThreadRelations } from '~/features/openai/server/services/normalize-data';
 import { normalizeExpiredAtForThreadRelations } from '~/features/openai/server/services/normalize-data';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
+import { convertNullToEmptyGrantedArrays } from './convert-null-to-empty-granted-arrays';
 import { convertRevisionPageIdToObjectId } from './convert-revision-page-id-to-objectid';
 import { convertRevisionPageIdToObjectId } from './convert-revision-page-id-to-objectid';
 import { renameDuplicateRootPages } from './rename-duplicate-root-pages';
 import { renameDuplicateRootPages } from './rename-duplicate-root-pages';
 
 
@@ -10,6 +11,7 @@ export const normalizeData = async(): Promise<void> => {
   await renameDuplicateRootPages();
   await renameDuplicateRootPages();
   await convertRevisionPageIdToObjectId();
   await convertRevisionPageIdToObjectId();
   await normalizeExpiredAtForThreadRelations();
   await normalizeExpiredAtForThreadRelations();
+  await convertNullToEmptyGrantedArrays();
 
 
   logger.info('normalizeData has been executed');
   logger.info('normalizeData has been executed');
   return;
   return;

+ 1 - 1
apps/slackbot-proxy/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "@growi/slackbot-proxy",
   "name": "@growi/slackbot-proxy",
-  "version": "7.1.6-slackbot-proxy.0",
+  "version": "7.1.8-slackbot-proxy.0",
   "license": "MIT",
   "license": "MIT",
   "private": "true",
   "private": "true",
   "scripts": {
   "scripts": {

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "growi",
   "name": "growi",
-  "version": "7.1.6-RC.0",
+  "version": "7.1.8-RC.0",
   "description": "Team collaboration software using markdown",
   "description": "Team collaboration software using markdown",
   "license": "MIT",
   "license": "MIT",
   "private": "true",
   "private": "true",

+ 1 - 1
packages/presentation/package.json

@@ -42,7 +42,7 @@
     "@growi/core": "workspace:^"
     "@growi/core": "workspace:^"
   },
   },
   "devDependencies": {
   "devDependencies": {
-    "@marp-team/marp-core": "^3.9.0",
+    "@marp-team/marp-core": "^3.9.1",
     "@marp-team/marpit": "^2.6.1",
     "@marp-team/marpit": "^2.6.1",
     "@types/mdast": "^4.0.4",
     "@types/mdast": "^4.0.4",
     "@types/reveal.js": "^4.4.1",
     "@types/reveal.js": "^4.4.1",

+ 66 - 61
pnpm-lock.yaml

@@ -74,7 +74,7 @@ importers:
         version: 8.41.0
         version: 8.41.0
       eslint-config-next:
       eslint-config-next:
         specifier: ^12.1.6
         specifier: ^12.1.6
-        version: 12.1.6(eslint@8.41.0)(next@14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(typescript@5.0.4)
+        version: 12.1.6(eslint@8.41.0)(next@14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(typescript@5.0.4)
       eslint-config-weseek:
       eslint-config-weseek:
         specifier: ^2.1.1
         specifier: ^2.1.1
         version: 2.1.1(@babel/core@7.24.6)(@babel/eslint-parser@7.24.7(@babel/core@7.24.6)(eslint@8.41.0))(@typescript-eslint/eslint-plugin@5.59.7(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.0.4))(eslint@8.41.0)(typescript@5.0.4))(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.0.4))(eslint-import-resolver-typescript@3.2.5(eslint-plugin-import@2.26.0)(eslint@8.41.0))(eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.0.4))(eslint-import-resolver-typescript@3.2.5)(eslint@8.41.0))(eslint-plugin-jsx-a11y@6.5.1(eslint@8.41.0))(eslint-plugin-react-hooks@4.6.0(eslint@8.41.0))(eslint-plugin-react@7.30.1(eslint@8.41.0))(eslint-plugin-vue@7.20.0(eslint@8.41.0))(eslint@8.41.0)
         version: 2.1.1(@babel/core@7.24.6)(@babel/eslint-parser@7.24.7(@babel/core@7.24.6)(eslint@8.41.0))(@typescript-eslint/eslint-plugin@5.59.7(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.0.4))(eslint@8.41.0)(typescript@5.0.4))(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.0.4))(eslint-import-resolver-typescript@3.2.5(eslint-plugin-import@2.26.0)(eslint@8.41.0))(eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.0.4))(eslint-import-resolver-typescript@3.2.5)(eslint@8.41.0))(eslint-plugin-jsx-a11y@6.5.1(eslint@8.41.0))(eslint-plugin-react-hooks@4.6.0(eslint@8.41.0))(eslint-plugin-react@7.30.1(eslint@8.41.0))(eslint-plugin-vue@7.20.0(eslint@8.41.0))(eslint@8.41.0)
@@ -481,20 +481,20 @@ importers:
         specifier: ^4.2.0
         specifier: ^4.2.0
         version: 4.2.0
         version: 4.2.0
       next:
       next:
-        specifier: ^14.2.15
-        version: 14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6)
+        specifier: ^14.2.21
+        version: 14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6)
       next-dynamic-loading-props:
       next-dynamic-loading-props:
         specifier: ^0.1.1
         specifier: ^0.1.1
         version: 0.1.1(react@18.2.0)
         version: 0.1.1(react@18.2.0)
       next-i18next:
       next-i18next:
         specifier: ^15.3.1
         specifier: ^15.3.1
-        version: 15.3.1(i18next@23.16.5)(next@14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)
+        version: 15.3.1(i18next@23.16.5)(next@14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)
       next-superjson:
       next-superjson:
         specifier: ^1.0.7
         specifier: ^1.0.7
         version: 1.0.7(@swc/helpers@0.5.11)(next@14.2.13(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(superjson@1.13.3)
         version: 1.0.7(@swc/helpers@0.5.11)(next@14.2.13(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(superjson@1.13.3)
       next-themes:
       next-themes:
         specifier: ^0.2.1
         specifier: ^0.2.1
-        version: 0.2.1(next@14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+        version: 0.2.1(next@14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
       nocache:
       nocache:
         specifier: ^4.0.0
         specifier: ^4.0.0
         version: 4.0.0
         version: 4.0.0
@@ -1258,8 +1258,8 @@ importers:
         version: 18.2.0(react@18.2.0)
         version: 18.2.0(react@18.2.0)
     devDependencies:
     devDependencies:
       '@marp-team/marp-core':
       '@marp-team/marp-core':
-        specifier: ^3.9.0
-        version: 3.9.0
+        specifier: ^3.9.1
+        version: 3.9.1
       '@marp-team/marpit':
       '@marp-team/marpit':
         specifier: ^2.6.1
         specifier: ^2.6.1
         version: 2.6.1
         version: 2.6.1
@@ -2965,8 +2965,8 @@ packages:
   '@manypkg/get-packages@1.1.3':
   '@manypkg/get-packages@1.1.3':
     resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
     resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
 
 
-  '@marp-team/marp-core@3.9.0':
-    resolution: {integrity: sha512-gi6nq0rsB1oMA8ReppW4XxmS4fisQiAsD0ZoUgLeG4h6SWatveCAA7fZyxnXfwA2UC8pNb7ktPqYdRsxvuwntA==}
+  '@marp-team/marp-core@3.9.1':
+    resolution: {integrity: sha512-/GOecdgt0HmvFnC/C2flxPfUVgLMNE8lP8UAvjlFfWyeB9hyNBP5k1N2Wnx0mXPU8UHpDzYdySDxIR+ki2p8Fw==}
     engines: {node: ^12.20 || ^14.13.1 || >=16}
     engines: {node: ^12.20 || ^14.13.1 || >=16}
 
 
   '@marp-team/marpit-svg-polyfill@2.1.0':
   '@marp-team/marpit-svg-polyfill@2.1.0':
@@ -3010,8 +3010,8 @@ packages:
   '@next/env@14.2.13':
   '@next/env@14.2.13':
     resolution: {integrity: sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw==}
     resolution: {integrity: sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw==}
 
 
-  '@next/env@14.2.15':
-    resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==}
+  '@next/env@14.2.21':
+    resolution: {integrity: sha512-lXcwcJd5oR01tggjWJ6SrNNYFGuOOMB9c251wUNkjCpkoXOPkDeF/15c3mnVlBqrW4JJXb2kVxDFhC4GduJt2A==}
 
 
   '@next/eslint-plugin-next@12.1.6':
   '@next/eslint-plugin-next@12.1.6':
     resolution: {integrity: sha512-yNUtJ90NEiYFT6TJnNyofKMPYqirKDwpahcbxBgSIuABwYOdkGwzos1ZkYD51Qf0diYwpQZBeVqElTk7Q2WNqw==}
     resolution: {integrity: sha512-yNUtJ90NEiYFT6TJnNyofKMPYqirKDwpahcbxBgSIuABwYOdkGwzos1ZkYD51Qf0diYwpQZBeVqElTk7Q2WNqw==}
@@ -3022,8 +3022,8 @@ packages:
     cpu: [arm64]
     cpu: [arm64]
     os: [darwin]
     os: [darwin]
 
 
-  '@next/swc-darwin-arm64@14.2.15':
-    resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==}
+  '@next/swc-darwin-arm64@14.2.21':
+    resolution: {integrity: sha512-HwEjcKsXtvszXz5q5Z7wCtrHeTTDSTgAbocz45PHMUjU3fBYInfvhR+ZhavDRUYLonm53aHZbB09QtJVJj8T7g==}
     engines: {node: '>= 10'}
     engines: {node: '>= 10'}
     cpu: [arm64]
     cpu: [arm64]
     os: [darwin]
     os: [darwin]
@@ -3034,8 +3034,8 @@ packages:
     cpu: [x64]
     cpu: [x64]
     os: [darwin]
     os: [darwin]
 
 
-  '@next/swc-darwin-x64@14.2.15':
-    resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==}
+  '@next/swc-darwin-x64@14.2.21':
+    resolution: {integrity: sha512-TSAA2ROgNzm4FhKbTbyJOBrsREOMVdDIltZ6aZiKvCi/v0UwFmwigBGeqXDA97TFMpR3LNNpw52CbVelkoQBxA==}
     engines: {node: '>= 10'}
     engines: {node: '>= 10'}
     cpu: [x64]
     cpu: [x64]
     os: [darwin]
     os: [darwin]
@@ -3046,8 +3046,8 @@ packages:
     cpu: [arm64]
     cpu: [arm64]
     os: [linux]
     os: [linux]
 
 
-  '@next/swc-linux-arm64-gnu@14.2.15':
-    resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==}
+  '@next/swc-linux-arm64-gnu@14.2.21':
+    resolution: {integrity: sha512-0Dqjn0pEUz3JG+AImpnMMW/m8hRtl1GQCNbO66V1yp6RswSTiKmnHf3pTX6xMdJYSemf3O4Q9ykiL0jymu0TuA==}
     engines: {node: '>= 10'}
     engines: {node: '>= 10'}
     cpu: [arm64]
     cpu: [arm64]
     os: [linux]
     os: [linux]
@@ -3058,8 +3058,8 @@ packages:
     cpu: [arm64]
     cpu: [arm64]
     os: [linux]
     os: [linux]
 
 
-  '@next/swc-linux-arm64-musl@14.2.15':
-    resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==}
+  '@next/swc-linux-arm64-musl@14.2.21':
+    resolution: {integrity: sha512-Ggfw5qnMXldscVntwnjfaQs5GbBbjioV4B4loP+bjqNEb42fzZlAaK+ldL0jm2CTJga9LynBMhekNfV8W4+HBw==}
     engines: {node: '>= 10'}
     engines: {node: '>= 10'}
     cpu: [arm64]
     cpu: [arm64]
     os: [linux]
     os: [linux]
@@ -3070,8 +3070,8 @@ packages:
     cpu: [x64]
     cpu: [x64]
     os: [linux]
     os: [linux]
 
 
-  '@next/swc-linux-x64-gnu@14.2.15':
-    resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==}
+  '@next/swc-linux-x64-gnu@14.2.21':
+    resolution: {integrity: sha512-uokj0lubN1WoSa5KKdThVPRffGyiWlm/vCc/cMkWOQHw69Qt0X1o3b2PyLLx8ANqlefILZh1EdfLRz9gVpG6tg==}
     engines: {node: '>= 10'}
     engines: {node: '>= 10'}
     cpu: [x64]
     cpu: [x64]
     os: [linux]
     os: [linux]
@@ -3082,8 +3082,8 @@ packages:
     cpu: [x64]
     cpu: [x64]
     os: [linux]
     os: [linux]
 
 
-  '@next/swc-linux-x64-musl@14.2.15':
-    resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==}
+  '@next/swc-linux-x64-musl@14.2.21':
+    resolution: {integrity: sha512-iAEBPzWNbciah4+0yI4s7Pce6BIoxTQ0AGCkxn/UBuzJFkYyJt71MadYQkjPqCQCJAFQ26sYh7MOKdU+VQFgPg==}
     engines: {node: '>= 10'}
     engines: {node: '>= 10'}
     cpu: [x64]
     cpu: [x64]
     os: [linux]
     os: [linux]
@@ -3094,8 +3094,8 @@ packages:
     cpu: [arm64]
     cpu: [arm64]
     os: [win32]
     os: [win32]
 
 
-  '@next/swc-win32-arm64-msvc@14.2.15':
-    resolution: {integrity: sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==}
+  '@next/swc-win32-arm64-msvc@14.2.21':
+    resolution: {integrity: sha512-plykgB3vL2hB4Z32W3ktsfqyuyGAPxqwiyrAi2Mr8LlEUhNn9VgkiAl5hODSBpzIfWweX3er1f5uNpGDygfQVQ==}
     engines: {node: '>= 10'}
     engines: {node: '>= 10'}
     cpu: [arm64]
     cpu: [arm64]
     os: [win32]
     os: [win32]
@@ -3106,8 +3106,8 @@ packages:
     cpu: [ia32]
     cpu: [ia32]
     os: [win32]
     os: [win32]
 
 
-  '@next/swc-win32-ia32-msvc@14.2.15':
-    resolution: {integrity: sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==}
+  '@next/swc-win32-ia32-msvc@14.2.21':
+    resolution: {integrity: sha512-w5bacz4Vxqrh06BjWgua3Yf7EMDb8iMcVhNrNx8KnJXt8t+Uu0Zg4JHLDL/T7DkTCEEfKXO/Er1fcfWxn2xfPA==}
     engines: {node: '>= 10'}
     engines: {node: '>= 10'}
     cpu: [ia32]
     cpu: [ia32]
     os: [win32]
     os: [win32]
@@ -3118,8 +3118,8 @@ packages:
     cpu: [x64]
     cpu: [x64]
     os: [win32]
     os: [win32]
 
 
-  '@next/swc-win32-x64-msvc@14.2.15':
-    resolution: {integrity: sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==}
+  '@next/swc-win32-x64-msvc@14.2.21':
+    resolution: {integrity: sha512-sT6+llIkzpsexGYZq8cjjthRyRGe5cJVhqh12FmlbxHqna6zsDDK8UNaV7g41T6atFHCJUPeLb3uyAwrBwy0NA==}
     engines: {node: '>= 10'}
     engines: {node: '>= 10'}
     cpu: [x64]
     cpu: [x64]
     os: [win32]
     os: [win32]
@@ -6456,6 +6456,7 @@ packages:
   encoding-down@6.3.0:
   encoding-down@6.3.0:
     resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==}
     resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
+    deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
 
 
   encoding@0.1.13:
   encoding@0.1.13:
     resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
     resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
@@ -8325,14 +8326,17 @@ packages:
   level-codec@9.0.2:
   level-codec@9.0.2:
     resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==}
     resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
+    deprecated: Superseded by level-transcoder (https://github.com/Level/community#faq)
 
 
   level-concat-iterator@2.0.1:
   level-concat-iterator@2.0.1:
     resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==}
     resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
+    deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
 
 
   level-errors@2.0.1:
   level-errors@2.0.1:
     resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==}
     resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
+    deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
 
 
   level-iterator-stream@4.0.2:
   level-iterator-stream@4.0.2:
     resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==}
     resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==}
@@ -8345,6 +8349,7 @@ packages:
   level-packager@5.1.1:
   level-packager@5.1.1:
     resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==}
     resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==}
     engines: {node: '>=6'}
     engines: {node: '>=6'}
+    deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
 
 
   level-supports@1.0.1:
   level-supports@1.0.1:
     resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==}
     resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==}
@@ -9247,8 +9252,8 @@ packages:
       sass:
       sass:
         optional: true
         optional: true
 
 
-  next@14.2.15:
-    resolution: {integrity: sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==}
+  next@14.2.21:
+    resolution: {integrity: sha512-rZmLwucLHr3/zfDMYbJXbw0ZeoBpirxkXuvsJbk7UPorvPYZhP7vq7aHbKnU7dQNCYIimRrbB2pp3xmf+wsYUg==}
     engines: {node: '>=18.17.0'}
     engines: {node: '>=18.17.0'}
     hasBin: true
     hasBin: true
     peerDependencies:
     peerDependencies:
@@ -14895,7 +14900,7 @@ snapshots:
       globby: 11.1.0
       globby: 11.1.0
       read-yaml-file: 1.1.0
       read-yaml-file: 1.1.0
 
 
-  '@marp-team/marp-core@3.9.0':
+  '@marp-team/marp-core@3.9.1':
     dependencies:
     dependencies:
       '@marp-team/marpit': 2.6.1
       '@marp-team/marpit': 2.6.1
       '@marp-team/marpit-svg-polyfill': 2.1.0(@marp-team/marpit@2.6.1)
       '@marp-team/marpit-svg-polyfill': 2.1.0(@marp-team/marpit@2.6.1)
@@ -14979,7 +14984,7 @@ snapshots:
 
 
   '@next/env@14.2.13': {}
   '@next/env@14.2.13': {}
 
 
-  '@next/env@14.2.15': {}
+  '@next/env@14.2.21': {}
 
 
   '@next/eslint-plugin-next@12.1.6':
   '@next/eslint-plugin-next@12.1.6':
     dependencies:
     dependencies:
@@ -14988,55 +14993,55 @@ snapshots:
   '@next/swc-darwin-arm64@14.2.13':
   '@next/swc-darwin-arm64@14.2.13':
     optional: true
     optional: true
 
 
-  '@next/swc-darwin-arm64@14.2.15':
+  '@next/swc-darwin-arm64@14.2.21':
     optional: true
     optional: true
 
 
   '@next/swc-darwin-x64@14.2.13':
   '@next/swc-darwin-x64@14.2.13':
     optional: true
     optional: true
 
 
-  '@next/swc-darwin-x64@14.2.15':
+  '@next/swc-darwin-x64@14.2.21':
     optional: true
     optional: true
 
 
   '@next/swc-linux-arm64-gnu@14.2.13':
   '@next/swc-linux-arm64-gnu@14.2.13':
     optional: true
     optional: true
 
 
-  '@next/swc-linux-arm64-gnu@14.2.15':
+  '@next/swc-linux-arm64-gnu@14.2.21':
     optional: true
     optional: true
 
 
   '@next/swc-linux-arm64-musl@14.2.13':
   '@next/swc-linux-arm64-musl@14.2.13':
     optional: true
     optional: true
 
 
-  '@next/swc-linux-arm64-musl@14.2.15':
+  '@next/swc-linux-arm64-musl@14.2.21':
     optional: true
     optional: true
 
 
   '@next/swc-linux-x64-gnu@14.2.13':
   '@next/swc-linux-x64-gnu@14.2.13':
     optional: true
     optional: true
 
 
-  '@next/swc-linux-x64-gnu@14.2.15':
+  '@next/swc-linux-x64-gnu@14.2.21':
     optional: true
     optional: true
 
 
   '@next/swc-linux-x64-musl@14.2.13':
   '@next/swc-linux-x64-musl@14.2.13':
     optional: true
     optional: true
 
 
-  '@next/swc-linux-x64-musl@14.2.15':
+  '@next/swc-linux-x64-musl@14.2.21':
     optional: true
     optional: true
 
 
   '@next/swc-win32-arm64-msvc@14.2.13':
   '@next/swc-win32-arm64-msvc@14.2.13':
     optional: true
     optional: true
 
 
-  '@next/swc-win32-arm64-msvc@14.2.15':
+  '@next/swc-win32-arm64-msvc@14.2.21':
     optional: true
     optional: true
 
 
   '@next/swc-win32-ia32-msvc@14.2.13':
   '@next/swc-win32-ia32-msvc@14.2.13':
     optional: true
     optional: true
 
 
-  '@next/swc-win32-ia32-msvc@14.2.15':
+  '@next/swc-win32-ia32-msvc@14.2.21':
     optional: true
     optional: true
 
 
   '@next/swc-win32-x64-msvc@14.2.13':
   '@next/swc-win32-x64-msvc@14.2.13':
     optional: true
     optional: true
 
 
-  '@next/swc-win32-x64-msvc@14.2.15':
+  '@next/swc-win32-x64-msvc@14.2.21':
     optional: true
     optional: true
 
 
   '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
   '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
@@ -17448,12 +17453,12 @@ snapshots:
       '@types/babel__core': 7.20.5
       '@types/babel__core': 7.20.5
       '@types/babel__traverse': 7.0.7
       '@types/babel__traverse': 7.0.7
 
 
-  babel-plugin-superjson-next@0.4.5(next@14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(superjson@1.13.3):
+  babel-plugin-superjson-next@0.4.5(next@14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(superjson@1.13.3):
     dependencies:
     dependencies:
       '@babel/helper-module-imports': 7.24.6
       '@babel/helper-module-imports': 7.24.6
       '@babel/types': 7.25.6
       '@babel/types': 7.25.6
       hoist-non-react-statics: 3.3.2
       hoist-non-react-statics: 3.3.2
-      next: 14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6)
+      next: 14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6)
       superjson: 1.13.3
       superjson: 1.13.3
 
 
   babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.6):
   babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.6):
@@ -19150,7 +19155,7 @@ snapshots:
       object.assign: 4.1.5
       object.assign: 4.1.5
       object.entries: 1.1.5
       object.entries: 1.1.5
 
 
-  eslint-config-next@12.1.6(eslint@8.41.0)(next@14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(typescript@5.0.4):
+  eslint-config-next@12.1.6(eslint@8.41.0)(next@14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(typescript@5.0.4):
     dependencies:
     dependencies:
       '@next/eslint-plugin-next': 12.1.6
       '@next/eslint-plugin-next': 12.1.6
       '@rushstack/eslint-patch': 1.1.3
       '@rushstack/eslint-patch': 1.1.3
@@ -19162,7 +19167,7 @@ snapshots:
       eslint-plugin-jsx-a11y: 6.5.1(eslint@8.41.0)
       eslint-plugin-jsx-a11y: 6.5.1(eslint@8.41.0)
       eslint-plugin-react: 7.30.1(eslint@8.41.0)
       eslint-plugin-react: 7.30.1(eslint@8.41.0)
       eslint-plugin-react-hooks: 4.6.0(eslint@8.41.0)
       eslint-plugin-react-hooks: 4.6.0(eslint@8.41.0)
-      next: 14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6)
+      next: 14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6)
     optionalDependencies:
     optionalDependencies:
       typescript: 5.0.4
       typescript: 5.0.4
     transitivePeerDependencies:
     transitivePeerDependencies:
@@ -22596,7 +22601,7 @@ snapshots:
     dependencies:
     dependencies:
       react: 18.2.0
       react: 18.2.0
 
 
-  next-i18next@15.3.1(i18next@23.16.5)(next@14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0):
+  next-i18next@15.3.1(i18next@23.16.5)(next@14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0):
     dependencies:
     dependencies:
       '@babel/runtime': 7.25.4
       '@babel/runtime': 7.25.4
       '@types/hoist-non-react-statics': 3.3.5
       '@types/hoist-non-react-statics': 3.3.5
@@ -22604,7 +22609,7 @@ snapshots:
       hoist-non-react-statics: 3.3.2
       hoist-non-react-statics: 3.3.2
       i18next: 23.16.5
       i18next: 23.16.5
       i18next-fs-backend: 2.3.2
       i18next-fs-backend: 2.3.2
-      next: 14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6)
+      next: 14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6)
       react: 18.2.0
       react: 18.2.0
       react-i18next: 15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
       react-i18next: 15.1.1(i18next@23.16.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
 
 
@@ -22624,9 +22629,9 @@ snapshots:
       - '@swc/helpers'
       - '@swc/helpers'
       - superjson
       - superjson
 
 
-  next-themes@0.2.1(next@14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+  next-themes@0.2.1(next@14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
     dependencies:
     dependencies:
-      next: 14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6)
+      next: 14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6)
       react: 18.2.0
       react: 18.2.0
       react-dom: 18.2.0(react@18.2.0)
       react-dom: 18.2.0(react@18.2.0)
 
 
@@ -22657,9 +22662,9 @@ snapshots:
       - '@babel/core'
       - '@babel/core'
       - babel-plugin-macros
       - babel-plugin-macros
 
 
-  next@14.2.15(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6):
+  next@14.2.21(@babel/core@7.24.6)(@playwright/test@1.46.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.77.6):
     dependencies:
     dependencies:
-      '@next/env': 14.2.15
+      '@next/env': 14.2.21
       '@swc/helpers': 0.5.5
       '@swc/helpers': 0.5.5
       busboy: 1.6.0
       busboy: 1.6.0
       caniuse-lite: 1.0.30001680
       caniuse-lite: 1.0.30001680
@@ -22669,15 +22674,15 @@ snapshots:
       react-dom: 18.2.0(react@18.2.0)
       react-dom: 18.2.0(react@18.2.0)
       styled-jsx: 5.1.1(@babel/core@7.24.6)(react@18.2.0)
       styled-jsx: 5.1.1(@babel/core@7.24.6)(react@18.2.0)
     optionalDependencies:
     optionalDependencies:
-      '@next/swc-darwin-arm64': 14.2.15
-      '@next/swc-darwin-x64': 14.2.15
-      '@next/swc-linux-arm64-gnu': 14.2.15
-      '@next/swc-linux-arm64-musl': 14.2.15
-      '@next/swc-linux-x64-gnu': 14.2.15
-      '@next/swc-linux-x64-musl': 14.2.15
-      '@next/swc-win32-arm64-msvc': 14.2.15
-      '@next/swc-win32-ia32-msvc': 14.2.15
-      '@next/swc-win32-x64-msvc': 14.2.15
+      '@next/swc-darwin-arm64': 14.2.21
+      '@next/swc-darwin-x64': 14.2.21
+      '@next/swc-linux-arm64-gnu': 14.2.21
+      '@next/swc-linux-arm64-musl': 14.2.21
+      '@next/swc-linux-x64-gnu': 14.2.21
+      '@next/swc-linux-x64-musl': 14.2.21
+      '@next/swc-win32-arm64-msvc': 14.2.21
+      '@next/swc-win32-ia32-msvc': 14.2.21
+      '@next/swc-win32-x64-msvc': 14.2.21
       '@playwright/test': 1.46.0
       '@playwright/test': 1.46.0
       sass: 1.77.6
       sass: 1.77.6
     transitivePeerDependencies:
     transitivePeerDependencies: