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

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
       - buildcache_app:/workspace/growi/apps/app/.next
       - ../../growi-docker-compose:/workspace/growi-docker-compose:delegated
+      - ../../share:/workspace/share:delegated
     tty: true
 
   mongo:

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

@@ -47,7 +47,7 @@ jobs:
 
     # Initializes the CodeQL tools for scanning.
     - name: Initialize CodeQL
-      uses: github/codeql-action/init@v2
+      uses: github/codeql-action/init@v3
       with:
         languages: ${{ matrix.language }}
         # 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).
     # If this step fails, then you should remove it and run the build manually (see below)
     - name: Autobuild
-      uses: github/codeql-action/autobuild@v2
+      uses: github/codeql-action/autobuild@v3
 
     # ℹ️ Command-line programs to run using the OS shell.
     # 📚 https://git.io/JvXDl
@@ -72,4 +72,4 @@ jobs:
     #   make release
 
     - 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
 
     - name: Docker meta for docker.io
-      uses: docker/metadata-action@v4
+      uses: docker/metadata-action@v5
       id: meta
       with:
         images: docker.io/weseek/growi
@@ -36,7 +36,7 @@ jobs:
           type=raw,value=${{ steps.package-json.outputs.packageVersion }}.{{sha}}
 
     - name: Docker meta for ghcr.io
-      uses: docker/metadata-action@v4
+      uses: docker/metadata-action@v5
       id: meta-ghcr
       with:
         images: ghcr.io/weseek/growi

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

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

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

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

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

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

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

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

+ 33 - 1
CHANGELOG.md

@@ -1,9 +1,41 @@
 # 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.*
 
+## [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
 
 ### 🚀 Improvement

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

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

+ 2 - 2
apps/app/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/app",
-  "version": "7.1.6-RC.0",
+  "version": "7.1.8-RC.0",
   "license": "MIT",
   "private": "true",
   "scripts": {
@@ -157,7 +157,7 @@
     "multer": "~1.4.0",
     "multer-autoreap": "^1.0.3",
     "mustache": "^4.2.0",
-    "next": "^14.2.15",
+    "next": "^14.2.21",
     "next-dynamic-loading-props": "^0.1.1",
     "next-i18next": "^15.3.1",
     "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",
         "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",
-        "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_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",
         "updated_oidc": "Succeeded to update OpenID Connect",
         "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"
   },
   "last_login": "Dernière connexion",
-  "wiki_management_homepage": "Gestion du wiki",
+  "wiki_management_homepage": "Système",
   "public": "Public",
   "anyone_with_the_link": "Tous les utilisateurs disposant du lien",
   "specified_users": "Utilisateurs spécifiés",
@@ -12,7 +12,7 @@
   "optional": "Optionnel",
   "days": "jours",
   "security_settings": {
-    "security_settings": "Paramètres de sécurité",
+    "security_settings": "Sécurité",
     "scope_of_page_disclosure": "Confidentialité de la page",
     "set_point": "Valeur",
     "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 ",
     "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",
-    "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_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_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_completely": "Suppression complète de page",
     "comment_manage_rights": "Droits de gestion des commentaires",
@@ -53,8 +53,8 @@
     "anyone": "Tout le monde",
     "user_homepage_deletion": {
       "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."
     },
     "session": "Session",
@@ -89,8 +89,8 @@
       "readonly": "Autoriser (Lecture seule)"
     },
     "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": {
       "open": "Ouvert (Tout le monde peut s'inscrire)",
@@ -98,9 +98,9 @@
       "closed": "Fermé (Invitation seulement)"
     },
     "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",
     "enable_link_sharing": "Activer les 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",
         "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",
-        "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_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",
         "updated_oidc": "Paramètres mis à jour",
         "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.",
     "slack_app_configuration": "Configuration de l'application Slack",
     "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": {
       "header": "Comment configurer un webhook entrant?",
       "workspace": "(Dans le Workspace) Ajouter un webhook",
@@ -278,7 +278,7 @@
     "not_found_global_notification_triggerid": "ID global de notification introuvable"
   },
   "full_text_search_management": {
-    "full_text_search_management": "Configuration de la recherche",
+    "full_text_search_management": "Moteur de recherche",
     "elasticsearch_management": "Configuration Elasticsearch",
     "connection_status": "Statut",
     "connection_status_label_unconfigured": "UNCONFIGURED",
@@ -300,23 +300,23 @@
     "rebuild_description_1": "Reconstruire l'index est les données de pages",
     "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": {
     "management_wiki": "Configuration du wiki",
     "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'",
     "package_name": "Nom du paquet",
     "specified_version": "Version spécifié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": {
       "default": "Copier les informations",
       "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>"
   },
   "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\"."
   },
   "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.",
     "header_content": "Le contenu entré ici sera affiché dans l'en-tête, etc. ",
     "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> ."
     },
-    "confidential_name": "Nom confidentiel",
+    "confidential_name": "Nom interne",
     "confidential_example": "ex): usage interne seulement",
     "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",
-    "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",
     "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_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",
     "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>",
-    "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é",
     "smtp_settings": "Configuration SMTP",
     "host": "Hôte",
@@ -384,13 +384,13 @@
     "initialize_mail_settings": "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?",
-    "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>.",
     "gcs_label": "GCP(GCS)",
     "aws_label": "AWS(S3)",
@@ -416,7 +416,7 @@
     "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é.",
     "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\".",
     "about_data_sent": "À propos",
     "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"
   },
   "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": {
-      "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_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"
     },
-    "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": {
-      "indentSize": "Taille par défaut",
+      "indentSize": "Valeur par défaut",
       "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_options": {
-      "enable_xss_prevention": "Activer prévention XSS",
+      "enable_xss_prevention": "Prévention XSS",
       "remove_all_tags": "Retirer tout les tags",
       "remove_all_tags_desc": "Retire tout les tags HTML et CSS",
       "recommended_setting": "Paramètres recommandés",
       "custom_whitelist": "Liste autorisée",
       "tag_names": "Nom de tags",
       "tag_attributes": "Attributs de tags",
-      "import_recommended": "Importer les recommendations {{target}}"
+      "import_recommended": "Importer {{target}}"
     }
   },
   "customize_settings": {
-    "customize_settings": "Personnalisation",
+    "customize_settings": "Interface",
     "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_open": "Afficher la page comme si elle était ouverte",
       "dock_mode_default_close": "Afficher la page comme si elle était fermée"
     },
-    "layout": "Agencement",
+    "layout": "Largeur du contenu",
     "layout_options": {
       "default": "Largeur par défaut",
       "expanded": "100%"
@@ -487,8 +487,8 @@
       "tab_switch": "Sauvegarder le changement d'onglets",
       "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.",
-      "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_desc_s": "Nombre de pages affichées sur les modales",
       "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_xl": "Nombre de pages articles",
       "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",
       "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",
       "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."
     },
-      "presentation": "Présentation",
+    "presentation": "Présentation",
     "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_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"
     },
     "custom_title": "Titre personnalisé",
@@ -524,10 +524,10 @@
     "write_css": "CSS personnalisé.",
     "ctrl_space": "Ctrl+Space pour l'autocomplétion",
     "custom_script": "Script personnalisé",
-    "custom_presentation": "Presentation personnalisé",
+    "custom_presentation": "Mode présentation",
     "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.",
-    "custom_logo" : "Logo personnalisé",
+    "custom_logo": "Logo personnalisé",
     "default_logo": "Logo par défaut",
     "upload_logo": "Téléverser un logo",
     "current_logo": "Logo actuel",
@@ -601,9 +601,9 @@
     },
     "import": "Importer",
     "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.",
     "Directory_hierarchy_tag": "Tag de hiérarchie"
   },
@@ -673,7 +673,7 @@
     "delete": "Supprimer",
     "integration_procedure": "Procédure d'intégration",
     "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_all_settings": "Réinitialiser tout les paramètres",
     "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)",
       "test_connection": "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.",
       "send_message_to_slack_work_space": "Envoyer un message vers l'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> "
   },
   "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.",
     "status": "Statut",
     "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",
       "temporary_password": "Cette utilisateur a un mot de passe temporaire",
       "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",
       "grant_admin_access": "Ajouter permission administrateur",
       "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",
       "resend_invitation_email": "Renvoyer courriel d'invitation"
     },
@@ -793,10 +793,10 @@
       "new_password": "Nouveau mot de passe"
     },
     "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_none":"Pas de compte externe",
+    "external_account_none": "Pas de compte externe",
     "invite": "Inviter",
     "invited": "Utilisateur invité",
     "back_to_user_management": "Gestion des utilisateurs",
@@ -811,17 +811,17 @@
     "current_users": "Utilisateurs:"
   },
   "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",
     "remove_child_group": "Retirer",
     "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",
     "child_user_group": "Groupe utilisateur enfant",
-    "parent_group": "Groupe parent",
+    "parent_group": "Parent",
     "select_parent_group": "Sélectionner groupe parent",
-    "release_parent_group": "Libérer groupe parent",
+    "release_parent_group": "Retirer groupe parent",
     "add_modal": {
       "description": "L'utilisateur sera ajouté au groupe parent.",
       "add_user": "Ajouter utilisateur au groupe",
@@ -831,14 +831,14 @@
       "partial_match": "Correspondance partielle",
       "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",
-    "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",
     "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",
     "delete_modal": {
       "header": "Supprimer groupe",
@@ -859,7 +859,7 @@
     }
   },
   "audit_log_management": {
-    "audit_log": "Journal d'audit",
+    "audit_log": "Audit",
     "audit_log_settings": "Configuration des journaux d'audit",
     "user": "Utilisateur",
     "username": "Nom d'utilisateur",
@@ -889,12 +889,12 @@
   },
   "plugins": {
     "plugins": "Plugins",
-    "plugin_installer": "Configuration de plugins",
+    "plugin_installer": "Installer un plugin",
     "form": {
       "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",
-      "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_is_not_installed": "Aucun plugins installés",
@@ -980,7 +980,7 @@
     "ADMIN_SITE_URL_UPDATE": "Modifier les paramètres d'URL",
     "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_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_PLUGIN_UPDATE": "Mettre à jour les paramètres de plugins",
     "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",
   "New": "Nouveau",
   "Delete": "Supprimer",
-
   "meta": {
     "display_name": "Français"
   },
@@ -28,9 +27,8 @@
     "email_is_already_in_use": "La configuration SMTP est déjà faite."
   },
   "headers": {
-    "app_settings": "Paramètres de l'application"
+    "app_settings": "Application"
   },
-
   "header_search_box": {
     "label": {
       "All pages": "Toutes les pages",
@@ -41,30 +39,26 @@
       "This tree": "Enfants de cette arbre"
     }
   },
-
   "search_method_menu_item": {
     "search_in_all": "Rechercher dans tout",
     "only_children_of_this_tree": "Enfants de cet arbre",
     "exact_mutch": "Correspondance exacte"
   },
-
   "share_links": {
     "Share Link": "Liens de partage",
     "Page Path": "Chemin de la page",
     "expire": "Expiration",
     "description": "Description"
   },
-
   "in_app_notification": {
     "notification_list": "Notifications d'application",
     "see_all": "Voir tout",
-    "no_notification": "Vous n'avez pas de notifications.",
+    "no_notification": "Aucune notification.",
     "all": "Toutes",
     "unopend": "Non-lues",
     "mark_all_as_read": "Tout marquer comme lu",
     "no_unread_messages": "aucun message non lu"
   },
-
   "personal_dropdown": {
     "home": "Accueil",
     "settings": "Paramètres",
@@ -72,24 +66,21 @@
     "sidebar_mode": "Navigation latérale",
     "sidebar_mode_editor": "Navigation latérale dans l'éditeur",
     "use_os_settings": "Utiliser les paramètres système",
-    "feedback": "Avis"
+    "feedback": "Sondage"
   },
-
-
   "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": {
-      "desc": "Créer le mémo du jour",
+      "desc": "Mémo du jour",
       "memo": "mémo"
     },
     "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": "Copier dans le presse-papier",
     "Page path": "Chemin de la page",
@@ -99,30 +90,27 @@
     "Markdown link": "Lien Markdown",
     "Append params": "Affixer les paramètres"
   },
-
   "crop_image_modal": {
     "image_crop": "Recadrage d'image",
     "crop": "Recadrer",
     "save": "Sauvegarder",
     "cancel": "Annuler"
   },
-
   "handsontable_modal": {
-    "title": "Modifier table",
-    "data_import": "Import de données",
+    "title": "Tableau",
+    "data_import": "Importer des données",
     "save": "Sauvegarder",
     "cancel": "Annuler",
-    "done": "Terminer",
+    "done": "Mettre à jour",
     "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",
       "import": "Importer"
     }
   },
-
   "questionnaire_modal": {
     "required": "Requis",
     "submit": "Soumettre",
@@ -146,11 +134,9 @@
     "successfully_submitted": "Questionnaire soumis.",
     "thanks_for_answering": "Merci pour votre avis."
   },
-
   "not_found_page": {
     "page_not_exist": "Cette page est introuvable."
   },
-
   "g2g_data_transfer": {
     "tab": "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"
   },
   "Help": "Aide",
-  "view": "Voir",
+  "View": "Voir",
   "Edit": "Modifier",
   "Delete": "Supprimer",
   "delete_all": "Tout supprimer",
@@ -60,7 +60,7 @@
   "Timeline View": "Chronologie",
   "History": "Historique",
   "attachment_data": "Pièces jointes",
-  "No_attachments_yet": "Aucunes pièces jointes.",
+  "No_attachments_yet": "Aucune pièce jointe.",
   "Presentation Mode": "Mode présentation",
   "Not available for guest": "Indisponible pour les invités",
   "Not available in this version": "Indisponible dans cette version",
@@ -90,24 +90,25 @@
   "No diff": "Aucune différences",
   "Latest": "Dernière version",
   "User ID": "Identifiant utilisateur",
-  "User Information": "Informations utilisateur",
+  "User Settings": "Paramètres utilisateur",
+  "User Information": "Mon compte",
   "User Activation": "Activation utilisateur",
-  "Basic Info": "Informations de base",
+  "Basic Info": "Informations du compte",
   "Name": "Nom",
   "Email": "Adresse courriel",
   "Language": "Langue",
   "English": "Anglais",
   "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é",
-  "Upload new image": "Téléverser nouvelle image",
+  "Upload new image": "Téléverser une photo",
   "Connected": "Connecté",
   "Loading": "Chargement...",
-  "Disclose E-mail": "Afficher adresse courriel",
+  "Disclose E-mail": "Divulguer adresse courriel",
   "page exists": "cette page est déjà existante",
   "Error occurred": "Une erreur est survenue",
   "Input page name": "Nom de la page",
@@ -122,21 +123,21 @@
   "UserGroup": "Groupe utilisateur",
   "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",
-  "Public": "Public",
+  "Public": "Tout le monde",
   "Anyone with the link": "Tous les utilisateurs disposant du lien",
   "Specified users only": "Utilisateurs spécifiés",
   "Only me": "Seulement moi",
   "Only inside the group": "Utilisateurs du groupe",
-  "page_list": "Liste de pages",
+  "page_list": "Pages enfants",
   "comments": "Commentaires",
   "Reselect the group": "Resélectionner ce groupe",
   "Shareable link": "Lien partageable",
   "The whitelist of registration permission E-mail address": "Les adresses courriel permises lors de l'inscription",
   "Add tags for this page": "Ajouter des é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",
   "Load latest": "Charger le plus récent",
   "edited this page": "à modifié cette page.",
@@ -147,9 +148,9 @@
   "No bookmarks yet": "Aucuns favoris",
   "add_bookmark": "Ajouter aux favoris",
   "remove_bookmark": "Retirer des favoris",
-  "wide_view": "Vue élargie",
+  "wide_view": "Affichage large",
   "Recent Changes": "Modifications récentes",
-  "Page Tree": "Arbre",
+  "Page Tree": "Arborescence",
   "Bookmarks": "Favoris",
   "In-App Notification": "Notifications",
   "original_path": "Chemin originel",
@@ -227,7 +228,7 @@
     "form_help": {}
   },
   "Password": "Mot de passe",
-  "Password Settings": "Paramètres de mot passe",
+  "Password Settings": "Sécurité",
   "personal_settings": {
     "disassociate_external_account": "Dissocier compte externe",
     "disassociate_external_account_desc": "Dissocier le compte externe <strong>{{providerType}}</strong> <strong>{{accountId}}</strong>?",
@@ -241,7 +242,7 @@
   "share_links": {
     "Shere this page link to public": "Partager cette page publiquement",
     "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",
     "expire": "Expiration",
     "Days": "Jour",
@@ -254,23 +255,23 @@
     "Invalid_Number_of_Date": "Valeurs invalides",
     "link_sharing_is_disabled": "Le partage est désactivé"
   },
-  "API Settings": "Configuration API",
+  "API Settings": "API GROWI",
   "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": "Paramètres de notifications",
+    "in_app_notification_settings": "Notifications",
     "subscribe_settings": "Paramètres d'abonnement automatique aux notifications de pages",
     "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": "Paramètres UI",
+    "ui_settings": "Interface",
     "side_bar_mode": {
       "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."
     }
   },
@@ -278,7 +279,7 @@
     "light": "Clair",
     "dark": "Sombre",
     "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."
   },
   "editor_settings": {
@@ -331,17 +332,17 @@
   "page_edit": {
     "input_channels": "Canal Slack...",
     "theme": "Thème",
-    "keymap": "Touches",
+    "keymap": "Raccourcis",
     "indent": "Indentation",
     "paste": {
       "title": "Comportement du collage",
-      "both": "Les deux",
+      "both": "Texte et fichier",
       "text": "Texte 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",
     "notice": {
       "conflict": "Sauvegarde impossible, la page est en cours de modification par un autre utilisateur. Recharger la page."
@@ -370,28 +371,28 @@
   },
   "page_history": {
     "revision_list": "Historique des modifications",
-    "revision": "version",
+    "revision": "Révision",
     "comparing_source": "Source",
-    "comparing_target": "Destination",
+    "comparing_target": "Cible",
     "comparing_revisions": "Comparer les modifications",
     "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": {
     "label": {
       "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 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",
       "Force rename all child pages": "Forcer le renommage des pages",
       "Other options": "Autres options",
       "Do not update metadata": "Ne pas modifier les métadonnées",
-      "Redirect": "Rediriger"
+      "Redirect": "Redirection automatique"
     },
     "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",
       "recursive": "Déplacer/renommer les pages enfants récursivement"
     }
@@ -515,7 +516,7 @@
     "initialize_successed": "Initialisation de {{target}} réussie",
     "remove_share_link_success": "Suppression de {{shareLinkId}} réussie",
     "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",
     "failed_to_reset_password": "Échec de la réinitialisation du mot de passe",
     "save_succeeded": "Sauvegarde réussie"
@@ -759,9 +760,9 @@
     "select_page_to_see": "Sélectionner une page"
   },
   "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": {
     "modal": {
@@ -792,11 +793,11 @@
   "tooltip": {
     "like": "Like!",
     "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",
     "operation": {
       "attention": {
@@ -810,7 +811,7 @@
   },
   "user_home_page": {
     "bookmarks": "Favoris",
-    "recently_created": "Crée récemment"
+    "recently_created": "Page récentes"
   },
   "bookmark_folder": {
     "bookmark_folder": "dossier de favoris",
@@ -843,18 +844,18 @@
     "disagree": "En désaccord",
     "answer": "Répondre",
     "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": {
-    "edit_tags": "Modifier étiquettes",
-    "done": "Terminer",
+    "edit_tags": "Étiquettes",
+    "done": "Mettre à jour",
     "tags_input": {
-      "tag_name": "nom de l'étiquette"
+      "tag_name": "Choisir ou créer une étiquette"
     }
   },
   "delete_attachment_modal": {
@@ -881,11 +882,11 @@
     "size_l": "Taille: G"
   },
   "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.",
     "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>)に関連付ける属性",
         "mapping_detail": "新規ユーザーの{{target}}に関連付ける属性",
         "register_1": "OIDC IdP Administrator へ接続します。",
-        "register_2": "OIDCアプリの認証コールバックURLを<code>%s</code>として登録します。",
+        "register_2": "OIDCアプリの認証コールバックURLを<code>{{url}}</code>として登録します。",
         "register_3": "上記のClientIDとClient Secretをコピー&ペーストしてください。",
         "updated_oidc": "OpenID Connect を更新しました",
         "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",
 				"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",
-				"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_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",
 				"updated_oidc": "Succeeded to update OpenID Connect",
         "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">
             <ol id="collapseHelpForOidcOauth" className="collapse mb-0">
               <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>
             </ol>
           </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');
 
+  /**
+   * @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
   router.post('/', registerRules(minPasswordLength), registerValidation, addActivity, async(req: FormRequest, res: ApiV3Response) => {
     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 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) => {
     if (!req.user) {
       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'
    *                  page_id:
    *                    $ref: '#/components/schemas/Page/properties/_id'
-   *                  revision_id:
+   *                  revisionId:
    *                    $ref: '#/components/schemas/Revision/properties/_id'
    *                  grant:
    *                    $ref: '#/components/schemas/Page/properties/grant'
    *                required:
    *                  - body
    *                  - page_id
-   *                  - revision_id
+   *                  - revisionId
    *        responses:
    *          200:
    *            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 loggerFactory from '~/utils/logger';
 
+import { convertNullToEmptyGrantedArrays } from './convert-null-to-empty-granted-arrays';
 import { convertRevisionPageIdToObjectId } from './convert-revision-page-id-to-objectid';
 import { renameDuplicateRootPages } from './rename-duplicate-root-pages';
 
@@ -10,6 +11,7 @@ export const normalizeData = async(): Promise<void> => {
   await renameDuplicateRootPages();
   await convertRevisionPageIdToObjectId();
   await normalizeExpiredAtForThreadRelations();
+  await convertNullToEmptyGrantedArrays();
 
   logger.info('normalizeData has been executed');
   return;

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

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

+ 1 - 1
package.json

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

+ 1 - 1
packages/presentation/package.json

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

+ 66 - 61
pnpm-lock.yaml

@@ -74,7 +74,7 @@ importers:
         version: 8.41.0
       eslint-config-next:
         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:
         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)
@@ -481,20 +481,20 @@ importers:
         specifier: ^4.2.0
         version: 4.2.0
       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:
         specifier: ^0.1.1
         version: 0.1.1(react@18.2.0)
       next-i18next:
         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:
         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)
       next-themes:
         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:
         specifier: ^4.0.0
         version: 4.0.0
@@ -1258,8 +1258,8 @@ importers:
         version: 18.2.0(react@18.2.0)
     devDependencies:
       '@marp-team/marp-core':
-        specifier: ^3.9.0
-        version: 3.9.0
+        specifier: ^3.9.1
+        version: 3.9.1
       '@marp-team/marpit':
         specifier: ^2.6.1
         version: 2.6.1
@@ -2965,8 +2965,8 @@ packages:
   '@manypkg/get-packages@1.1.3':
     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}
 
   '@marp-team/marpit-svg-polyfill@2.1.0':
@@ -3010,8 +3010,8 @@ packages:
   '@next/env@14.2.13':
     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':
     resolution: {integrity: sha512-yNUtJ90NEiYFT6TJnNyofKMPYqirKDwpahcbxBgSIuABwYOdkGwzos1ZkYD51Qf0diYwpQZBeVqElTk7Q2WNqw==}
@@ -3022,8 +3022,8 @@ packages:
     cpu: [arm64]
     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'}
     cpu: [arm64]
     os: [darwin]
@@ -3034,8 +3034,8 @@ packages:
     cpu: [x64]
     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'}
     cpu: [x64]
     os: [darwin]
@@ -3046,8 +3046,8 @@ packages:
     cpu: [arm64]
     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'}
     cpu: [arm64]
     os: [linux]
@@ -3058,8 +3058,8 @@ packages:
     cpu: [arm64]
     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'}
     cpu: [arm64]
     os: [linux]
@@ -3070,8 +3070,8 @@ packages:
     cpu: [x64]
     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'}
     cpu: [x64]
     os: [linux]
@@ -3082,8 +3082,8 @@ packages:
     cpu: [x64]
     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'}
     cpu: [x64]
     os: [linux]
@@ -3094,8 +3094,8 @@ packages:
     cpu: [arm64]
     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'}
     cpu: [arm64]
     os: [win32]
@@ -3106,8 +3106,8 @@ packages:
     cpu: [ia32]
     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'}
     cpu: [ia32]
     os: [win32]
@@ -3118,8 +3118,8 @@ packages:
     cpu: [x64]
     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'}
     cpu: [x64]
     os: [win32]
@@ -6456,6 +6456,7 @@ packages:
   encoding-down@6.3.0:
     resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==}
     engines: {node: '>=6'}
+    deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
 
   encoding@0.1.13:
     resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
@@ -8325,14 +8326,17 @@ packages:
   level-codec@9.0.2:
     resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==}
     engines: {node: '>=6'}
+    deprecated: Superseded by level-transcoder (https://github.com/Level/community#faq)
 
   level-concat-iterator@2.0.1:
     resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==}
     engines: {node: '>=6'}
+    deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
 
   level-errors@2.0.1:
     resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==}
     engines: {node: '>=6'}
+    deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
 
   level-iterator-stream@4.0.2:
     resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==}
@@ -8345,6 +8349,7 @@ packages:
   level-packager@5.1.1:
     resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==}
     engines: {node: '>=6'}
+    deprecated: Superseded by abstract-level (https://github.com/Level/community#faq)
 
   level-supports@1.0.1:
     resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==}
@@ -9247,8 +9252,8 @@ packages:
       sass:
         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'}
     hasBin: true
     peerDependencies:
@@ -14895,7 +14900,7 @@ snapshots:
       globby: 11.1.0
       read-yaml-file: 1.1.0
 
-  '@marp-team/marp-core@3.9.0':
+  '@marp-team/marp-core@3.9.1':
     dependencies:
       '@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.15': {}
+  '@next/env@14.2.21': {}
 
   '@next/eslint-plugin-next@12.1.6':
     dependencies:
@@ -14988,55 +14993,55 @@ snapshots:
   '@next/swc-darwin-arm64@14.2.13':
     optional: true
 
-  '@next/swc-darwin-arm64@14.2.15':
+  '@next/swc-darwin-arm64@14.2.21':
     optional: true
 
   '@next/swc-darwin-x64@14.2.13':
     optional: true
 
-  '@next/swc-darwin-x64@14.2.15':
+  '@next/swc-darwin-x64@14.2.21':
     optional: true
 
   '@next/swc-linux-arm64-gnu@14.2.13':
     optional: true
 
-  '@next/swc-linux-arm64-gnu@14.2.15':
+  '@next/swc-linux-arm64-gnu@14.2.21':
     optional: true
 
   '@next/swc-linux-arm64-musl@14.2.13':
     optional: true
 
-  '@next/swc-linux-arm64-musl@14.2.15':
+  '@next/swc-linux-arm64-musl@14.2.21':
     optional: true
 
   '@next/swc-linux-x64-gnu@14.2.13':
     optional: true
 
-  '@next/swc-linux-x64-gnu@14.2.15':
+  '@next/swc-linux-x64-gnu@14.2.21':
     optional: true
 
   '@next/swc-linux-x64-musl@14.2.13':
     optional: true
 
-  '@next/swc-linux-x64-musl@14.2.15':
+  '@next/swc-linux-x64-musl@14.2.21':
     optional: true
 
   '@next/swc-win32-arm64-msvc@14.2.13':
     optional: true
 
-  '@next/swc-win32-arm64-msvc@14.2.15':
+  '@next/swc-win32-arm64-msvc@14.2.21':
     optional: true
 
   '@next/swc-win32-ia32-msvc@14.2.13':
     optional: true
 
-  '@next/swc-win32-ia32-msvc@14.2.15':
+  '@next/swc-win32-ia32-msvc@14.2.21':
     optional: true
 
   '@next/swc-win32-x64-msvc@14.2.13':
     optional: true
 
-  '@next/swc-win32-x64-msvc@14.2.15':
+  '@next/swc-win32-x64-msvc@14.2.21':
     optional: true
 
   '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
@@ -17448,12 +17453,12 @@ snapshots:
       '@types/babel__core': 7.20.5
       '@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:
       '@babel/helper-module-imports': 7.24.6
       '@babel/types': 7.25.6
       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
 
   babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.6):
@@ -19150,7 +19155,7 @@ snapshots:
       object.assign: 4.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:
       '@next/eslint-plugin-next': 12.1.6
       '@rushstack/eslint-patch': 1.1.3
@@ -19162,7 +19167,7 @@ snapshots:
       eslint-plugin-jsx-a11y: 6.5.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)
-      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:
       typescript: 5.0.4
     transitivePeerDependencies:
@@ -22596,7 +22601,7 @@ snapshots:
     dependencies:
       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:
       '@babel/runtime': 7.25.4
       '@types/hoist-non-react-statics': 3.3.5
@@ -22604,7 +22609,7 @@ snapshots:
       hoist-non-react-statics: 3.3.2
       i18next: 23.16.5
       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-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'
       - 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:
-      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-dom: 18.2.0(react@18.2.0)
 
@@ -22657,9 +22662,9 @@ snapshots:
       - '@babel/core'
       - 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:
-      '@next/env': 14.2.15
+      '@next/env': 14.2.21
       '@swc/helpers': 0.5.5
       busboy: 1.6.0
       caniuse-lite: 1.0.30001680
@@ -22669,15 +22674,15 @@ snapshots:
       react-dom: 18.2.0(react@18.2.0)
       styled-jsx: 5.1.1(@babel/core@7.24.6)(react@18.2.0)
     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
       sass: 1.77.6
     transitivePeerDependencies: