strapi-plugin-comments 2.1.0-beta.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -32,6 +32,19 @@
32
32
 
33
33
  A plugin for [Strapi Headless CMS](https://github.com/strapi/strapi) that provides end to end comments feature with their moderation panel, bad words filtering, abuse reporting and much more.
34
34
 
35
+ ### Table of Contents
36
+
37
+ 1. [✨ Features](#-features)
38
+ 2. [⏳ Installation](#-installation)
39
+ 3. [🖐 Requirements](#-requirements)
40
+ 4. [🔧 Configuration](#-configuration)
41
+ - [Settings page](#in-v203-and-newer)
42
+ - [Plugin file](#in-v202-and-older--default-configuration-state-for-v203-and-newer)
43
+ 5. [🕸️ Public API - REST](#%EF%B8%8F-public-rest-api-specification)
44
+ 6. [🕸️ Public API - GraphQL](#%EF%B8%8F-public-graphql-specification)
45
+ 7. [🤝 Contributing](#-contributing)
46
+ 8. [👨‍💻 Community support](#-community-support)
47
+
35
48
  ## ✨ Features
36
49
 
37
50
  - **Comments Public REST + GraphQL API:** Elegant, entirely customizable and a fully extensible admin panel.
@@ -48,13 +61,23 @@ A plugin for [Strapi Headless CMS](https://github.com/strapi/strapi) that provid
48
61
 
49
62
  ## ⏳ Installation
50
63
 
64
+ ### Via Strapi Markerplace
65
+
66
+ As a ✅ **verified** plugin by Strapi team we're available on the [**Strapi Marketplace**](https://market.strapi.io/plugins/strapi-plugin-comments) as well as **In-App Marketplace** where you can follow the installation instructions.
67
+
68
+ <div style="margin: 20px 0" align="center">
69
+ <img style="width: 100%; height: auto;" src="public/assets/marketplace.png" alt="Strapi In-App Marketplace" />
70
+ </div>
71
+
72
+ ### Via command line
73
+
51
74
  (Use **yarn** to install this plugin within your Strapi project (recommended). [Install yarn with these docs](https://yarnpkg.com/lang/en/docs/install/).)
52
75
 
53
76
  ```bash
54
77
  yarn add strapi-plugin-comments@latest
55
78
  ```
56
79
 
57
- After successful installation you've to build a fresh package that includes plugin UI. To archive that simply use:
80
+ After successful installation you've to re-build your Strapi instance. To archive that simply use:
58
81
 
59
82
  ```bash
60
83
  yarn build
@@ -69,7 +92,9 @@ yarn develop --watch-admin
69
92
 
70
93
  The **Comments** plugin should appear in the **Plugins** section of Strapi sidebar after you run app again.
71
94
 
72
- Enjoy 🎉
95
+ As a next step you must configure your the plugin by the way you want to. See [**Configuration**](#🔧-configuration) section.
96
+
97
+ All done. Enjoy 🎉
73
98
 
74
99
  ### Working in development mode
75
100
 
@@ -107,7 +132,7 @@ In our minimum support we're following [official Node.js releases timelines](htt
107
132
 
108
133
  **Supported Strapi versions**:
109
134
 
110
- - Strapi v4.1.2 (recently tested)
135
+ - Strapi v4.1.7 (recently tested)
111
136
  - Strapi v4.x
112
137
 
113
138
  > This plugin is designed for **Strapi v4** and is not working with v3.x. To get version for **Strapi v3** install version [v1.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-comments/tree/strapi-v3).
@@ -116,14 +141,22 @@ In our minimum support we're following [official Node.js releases timelines](htt
116
141
 
117
142
  ## 🔧 Configuration
118
143
 
119
- ### In `v2.0.3` and newest
144
+ To start your journey with **Comments plugin** you must first setup it using the dedicated Settings page (`v2.0.3` and newer) or for any version, put your configuration in `config/plugins.js`. Anyway we're recommending the click-through option where your configuration is going to be properly validated.
145
+
146
+ ### In `v2.0.3` and newer
120
147
 
121
148
  Version `2.0.3` introduce the intuitive **Settings** page which you can easly access via `Strapi Settings -> Section: Comments Plugin -> Configuration`. On dedicated page you will be able to setup all crucial properties which drives the plugin and customize each individual collection for which **Comments plugin** should be enabled.
122
149
 
150
+ On the dedicated page, you will be able to set up all crucial properties which drive the plugin and customize each individual collection for which **Comments plugin** should be enabled.
151
+
152
+ <div style="margin: 20px 0" align="center">
153
+ <img style="width: 100%; height: auto;" src="public/assets/configuration.png" alt="Plugin configuration" />
154
+ </div>
155
+
123
156
  > _Note_
124
157
  > Default configuration for your plugin is fetched from `config/plugins.js` or directly from the plugin itself. If you would like to customize the default state to which you might revert, please follow the next section.
125
158
 
126
- ### In `v2.0.2` and older + default configuration state for `v2.0.3` and newest
159
+ ### In `v2.0.2` and older + default configuration state for `v2.0.3` and newer
127
160
 
128
161
  To setup amend default plugin configuration we recommend to put following snippet as part of `config/plugins.js` or `config/<env>/plugins.js` file. If the file does not exist yet, you have to create it manually. If you've got already configurations for other plugins stores by this way, use just the `comments` part within exising `plugins` item.
129
162
 
@@ -154,6 +187,7 @@ module.exports = ({ env }) => ({
154
187
 
155
188
  ### Properties
156
189
 
190
+ - `enabledCollections` - list of Collection and Single Types for which plugin should be enabled in format like `'api::<collection name>.<content type name>'`. By default it's empty and none comments are not enabled for any of type in Strapi.
157
191
  - `badWords` - Enabled support for [bad words filtering](https://www.npmjs.com/package/bad-words). Can be turned off or overwritten using [options reference](https://www.npmjs.com/package/bad-words#constructor). Default value: `true`.
158
192
  - `moderatorRoles` - Optional list of names of roles. Users with those roles will be notified by email when a new abuse report is created. This feature requires a built-in [Strapi email plugin](https://docs.strapi.io/developer-docs/latest/plugins/email.html) configured.
159
193
  - `approvalFlow` - list of Content Types which are supporting approval flow. Values must be in format like `'api::<collection name>.<content type name>'`. For not included, posted comments are going to be immediately visible.
@@ -276,6 +310,7 @@ Return a hierarchical tree structure of comments for specified instance of Conte
276
310
 
277
311
  #### Strapi REST API properties support:
278
312
 
313
+ - [field selection](https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest/populating-fields.html#field-selection)
279
314
  - [sorting](https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest/sort-pagination.html#sorting)
280
315
 
281
316
  ### Get Comments (flat structure)
@@ -317,6 +352,7 @@ Return a flat structure of comments for specified instance of Content Type like
317
352
  #### Strapi REST API properties support:
318
353
 
319
354
  - [filtering](https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest/filtering-locale-publication.html#filtering)
355
+ - [field selection](https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest/populating-fields.html#field-selection)
320
356
  - [sorting](https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest/sort-pagination.html#sorting)
321
357
  - [pagination](https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest/sort-pagination.html#pagination)
322
358
 
@@ -0,0 +1,12 @@
1
+ declare const UserAvatar: {
2
+ ({ avatar, name }: {
3
+ avatar: any;
4
+ name: any;
5
+ }): any;
6
+ propTypes: {
7
+ avatar: any;
8
+ name: any;
9
+ };
10
+ };
11
+ export default UserAvatar;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const prop_types_1 = __importDefault(require("prop-types"));
8
+ const lodash_1 = require("lodash");
9
+ const Avatar_1 = require("@strapi/design-system/Avatar");
10
+ const utils_1 = require("../../utils");
11
+ const UserAvatar = ({ avatar, name }) => {
12
+ if (avatar) {
13
+ let image = avatar;
14
+ if ((0, lodash_1.isObject)(avatar)) {
15
+ image = avatar?.formats?.thumbnail.url || avatar.url;
16
+ }
17
+ return react_1.default.createElement(Avatar_1.Avatar, { src: image, alt: name });
18
+ }
19
+ return react_1.default.createElement(Avatar_1.Initials, null, (0, utils_1.renderInitials)(name));
20
+ };
21
+ UserAvatar.propTypes = {
22
+ avatar: prop_types_1.default.oneOfType(prop_types_1.default.string, prop_types_1.default.object).isRequired,
23
+ name: prop_types_1.default.string,
24
+ };
25
+ exports.default = UserAvatar;
26
+ //# sourceMappingURL=index.js.map
@@ -6,11 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const prop_types_1 = __importDefault(require("prop-types"));
8
8
  const react_intl_1 = require("react-intl");
9
- const Avatar_1 = require("@strapi/design-system/Avatar");
10
9
  const Box_1 = require("@strapi/design-system/Box");
11
10
  const Typography_1 = require("@strapi/design-system/Typography");
12
- const utils_1 = require("../../utils");
13
11
  const styles_1 = require("./styles");
12
+ const Avatar_1 = __importDefault(require("../Avatar"));
14
13
  const DiscussionThreadItemFooter = ({ children, author, createdAt, updatedAt, }) => {
15
14
  const { formatDate } = (0, react_intl_1.useIntl)();
16
15
  const dateTime = formatDate(updatedAt || createdAt, {
@@ -20,7 +19,7 @@ const DiscussionThreadItemFooter = ({ children, author, createdAt, updatedAt, })
20
19
  const { name, avatar } = author;
21
20
  return (react_1.default.createElement(styles_1.DiscussionThreadItemFooterStyled, { as: Box_1.Box, paddingTop: 2, direction: "row" },
22
21
  react_1.default.createElement(styles_1.DiscussionThreadItemFooterMeta, { size: 3, horizontal: true },
23
- avatar ? (react_1.default.createElement(Avatar_1.Avatar, { src: avatar, alt: name })) : (react_1.default.createElement(Avatar_1.Initials, null, (0, utils_1.renderInitials)(name))),
22
+ react_1.default.createElement(Avatar_1.default, { avatar: avatar, name: name }),
24
23
  react_1.default.createElement(Typography_1.Typography, { variant: "pi", fontWeight: "bold", textColor: "neutral800" }, name),
25
24
  react_1.default.createElement(Typography_1.Typography, { variant: "pi", textColor: "neutral600" }, dateTime)),
26
25
  children));
@@ -30,7 +29,7 @@ DiscussionThreadItemFooter.propTypes = {
30
29
  id: prop_types_1.default.oneOfType(prop_types_1.default.string, prop_types_1.default.number).isRequired,
31
30
  name: prop_types_1.default.string.isRequired,
32
31
  email: prop_types_1.default.string,
33
- avatar: prop_types_1.default.string,
32
+ avatar: prop_types_1.default.oneOfType(prop_types_1.default.string, prop_types_1.default.object),
34
33
  }).isRequired,
35
34
  createdAt: prop_types_1.default.string.isRequired,
36
35
  updatedAt: prop_types_1.default.string,
@@ -31,7 +31,6 @@ const prop_types_1 = __importDefault(require("prop-types"));
31
31
  const react_intl_1 = require("react-intl");
32
32
  const react_query_1 = require("react-query");
33
33
  const lodash_1 = require("lodash");
34
- const Avatar_1 = require("@strapi/design-system/Avatar");
35
34
  const Flex_1 = require("@strapi/design-system/Flex");
36
35
  const IconButton_1 = require("@strapi/design-system/IconButton");
37
36
  const Link_1 = require("@strapi/design-system/Link");
@@ -49,6 +48,7 @@ const DiscussionThreadItemApprovalFlowActions_1 = __importDefault(require("../..
49
48
  const StatusBadge_1 = __importDefault(require("../../../../components/StatusBadge"));
50
49
  const styles_2 = require("../../../../components/IconButton/styles");
51
50
  const DiscussionThreadItemReviewAction_1 = __importDefault(require("../../../../components/DiscussionThreadItemReviewAction"));
51
+ const Avatar_1 = __importDefault(require("../../../../components/Avatar"));
52
52
  const DiscoverTableRow = ({ config, item, allowedActions: { canModerate, canAccessReports, canReviewReports }, onClick, }) => {
53
53
  const { id, reports } = item;
54
54
  const [blockButtonsDisabled, setBlockButtonsDisabled] = (0, react_1.useState)(false);
@@ -128,7 +128,7 @@ const DiscoverTableRow = ({ config, item, allowedActions: { canModerate, canAcce
128
128
  item.id)),
129
129
  react_1.default.createElement(Table_1.Td, null,
130
130
  react_1.default.createElement(Stack_1.Stack, { size: 2, horizontal: true },
131
- item.author?.avatar ? (react_1.default.createElement(Avatar_1.Avatar, { src: item.author?.avatar, alt: item.author.name })) : (react_1.default.createElement(Avatar_1.Initials, null, (0, utils_1.renderInitials)(item.author.name))),
131
+ react_1.default.createElement(Avatar_1.default, { avatar: item.author?.avatar, name: item.author.name }),
132
132
  react_1.default.createElement(Typography_1.Typography, { textColor: "neutral800", variant: "pi" }, item.author.name))),
133
133
  react_1.default.createElement(Table_1.Td, { style: { maxWidth: "30vw" } },
134
134
  react_1.default.createElement(Typography_1.Typography, { textColor: "neutral800", ellipsis: true }, item.content)),
@@ -1 +1,132 @@
1
- {}
1
+ {
2
+ "plugin.name": "Commentaires",
3
+ "plugin.section": "Plugin de commentaires",
4
+ "plugin.section.item": "Configuration",
5
+ "common.button.back": "Retour",
6
+ "nav.header.moderation": "Modération",
7
+ "nav.header.settings": "Paramètres",
8
+ "nav.item.updates": "Mises à jour",
9
+ "nav.item.discover": "Découvrir",
10
+ "nav.item.reports": "Rapports",
11
+ "nav.item.settings": "Paramètres",
12
+ "page.common.item.status.OPEN": "Ouvert",
13
+ "page.common.item.status.PENDING": "En attente",
14
+ "page.common.item.status.BLOCKED": "Bloqué",
15
+ "page.common.item.status.APPROVED": "Approuvé",
16
+ "page.common.item.status.TO_REVIEW": "À examiner ({count, number})",
17
+ "page.common.item.status.REJECTED": "Rejeté",
18
+ "page.common.item.status.REMOVED": "Retiré par l'auteur",
19
+ "page.updates.header": "Mises à jour récentes",
20
+ "page.discover.header": "Découvrir les threads",
21
+ "page.discover.header.count": "entrées trouvées",
22
+ "page.discover.table.header.id": "ID",
23
+ "page.discover.table.header.author": "Auteur",
24
+ "page.discover.table.header.message": "Message",
25
+ "page.discover.table.header.thread": "Thread de",
26
+ "page.discover.table.header.entry": "Entrée",
27
+ "page.discover.table.header.lastUpdate": "Dernière mise à jour",
28
+ "page.discover.table.header.status": "Status",
29
+ "page.discover.table.header.actions": "Actions",
30
+ "page.discover.table.cell.thread": "Commentaire #{id}",
31
+ "page.discover.table.action.display": "Afficher",
32
+ "page.discover.table.action.reports": "Rapports",
33
+ "page.discover.table.empty": "Vous n'avez pas de encore de commentaires.",
34
+ "page.discover.table.empty.search": "Aucun commentaire ne correspond à votre recherche.",
35
+ "page.discover.table.filters": "Filtrage",
36
+ "page.discover.table.reports.review": "Consultation des rapports",
37
+ "page.details.header": "Panel de discussion",
38
+ "page.details.header.description": "Exploration et gestion de discussions relatives à l'entité",
39
+ "page.details.panel.discussion": "Discussion",
40
+ "page.details.panel.discussion.nav.drilldown": "Exploration",
41
+ "page.details.panel.discussion.nav.back": "Retour en haut",
42
+ "page.details.panel.discussion.warnings.reports.description": "rapports ouverts",
43
+ "page.details.panel.discussion.warnings.reports.review": "consultation",
44
+ "page.details.panel.discussion.warnings.reports.dialog.list": "Rapports",
45
+ "page.details.panel.discussion.warnings.reports.dialog.header": "Modération : Examiner les rapports ouverts",
46
+ "page.details.panel.discussion.warnings.reports.dialog.reason": "Raison",
47
+ "page.details.panel.discussion.warnings.reports.dialog.reason.BAD_LANGUAGE": "Langage inapproprié",
48
+ "page.details.panel.discussion.warnings.reports.dialog.reason.DISCRIMINATION": "Discrimination",
49
+ "page.details.panel.discussion.warnings.reports.dialog.reason.OTHER": "Autre",
50
+ "page.details.panel.discussion.warnings.reports.dialog.content": "Contenu",
51
+ "page.details.panel.discussion.warnings.reports.dialog.createdAt": "Date de création",
52
+ "page.details.panel.discussion.warnings.reports.dialog.status": "Status",
53
+ "page.details.panel.discussion.warnings.reports.dialog.status.OPEN": "Ouvert",
54
+ "page.details.panel.discussion.warnings.reports.dialog.status.RESOLVED": "Résolu",
55
+ "page.details.panel.discussion.warnings.reports.dialog.actions": "Actions",
56
+ "page.details.panel.discussion.warnings.reports.dialog.actions.resolve": "Résoudre",
57
+ "page.details.panel.discussion.warnings.reports.dialog.confirmation.success": "Le rapport ouvert a été résolu",
58
+ "page.details.panel.discussion.status.blocked": "Bloqué",
59
+ "page.details.panel.entity": "Détails de l'entité",
60
+ "page.details.panel.status": "La discussion est",
61
+ "page.details.panel.status.open": "Ouvert",
62
+ "page.details.panel.status.blocked": "Bloqué",
63
+ "page.details.panel.status.pending": "En attente",
64
+ "page.details.panel.loading": "Récupération de l'entité...",
65
+ "page.details.actions.comment.block": "Bloquer le commentaire",
66
+ "page.details.actions.comment.block.confirmation.header": "Modération : Bloquer le commentaire",
67
+ "page.details.actions.comment.block.confirmation.description": "Voulez-vous vraiment bloquer ce commentaire ?",
68
+ "page.details.actions.comment.block.confirmation.button.confirm": "Oui, bloqué le",
69
+ "page.details.actions.comment.block.confirmation.success": "Le commentaire a été bloqué",
70
+ "page.details.actions.comment.unblock": "Débloquer le commentaire",
71
+ "page.details.actions.comment.unblock.confirmation.success": "Le commentaire a été débloqué",
72
+ "page.details.actions.comment.reports.review": "Consulter",
73
+ "page.details.actions.thread.block": "Bloquer le thread",
74
+ "page.details.actions.thread.block.confirmation.header": "Moderation: Bloquer le thread",
75
+ "page.details.actions.thread.block.confirmation.description": "Voulez-vous vraiment bloquer tout le thread ? Aucune autre discussion ne sera autorisée.",
76
+ "page.details.actions.thread.block.confirmation.button.confirm": "Oui, bloqué le",
77
+ "page.details.actions.thread.block.confirmation.success": "Le thread a été bloqué",
78
+ "page.details.actions.thread.unblock": "Débloquer le thread",
79
+ "page.details.actions.thread.unblock.confirmation.success": "Le thread a été débloqué",
80
+ "page.details.actions.comment.approve.confirmation.success": "Le commentaire a été apprové",
81
+ "page.details.actions.comment.reject.confirmation.success": "Le commentaire a été rejeté",
82
+ "page.details.filters.label": "Voir",
83
+ "page.details.filters.removed.visibility": "Afficher les commentaires supprimés",
84
+ "page.coming.soon": "Attendez pour ce qui va bientôt arriver...",
85
+ "page.settings": "Paramètres",
86
+ "page.settings.header.title": "Commentaires",
87
+ "page.settings.header.description": "Configurez vos capacités de modération des commentaires",
88
+ "page.settings.actions.submit": "Enregistrer",
89
+ "page.settings.actions.restore": "Restaurer les paramètres par défaut",
90
+ "page.settings.actions.restart": "Redémarrer Strapi",
91
+ "page.settings.section.general": "Configuration générale",
92
+ "page.settings.section.additional": "Configuration supplémentaire",
93
+ "page.settings.section.restore": "Restaurer les paramètres par défaut",
94
+ "page.settings.section.restore.subtitle": "Suppression de tous les paramètres appliqués et retour aux paramètres par défaut du plugin. Utilisez-les raisonnablement",
95
+ "page.settings.form.enabledCollections.label": "Activer les commentaires uniquement pour",
96
+ "page.settings.form.enabledCollections.placeholder": "Sélectionnez une ou plusieurs collections",
97
+ "page.settings.form.enabledCollections.hint": "Si aucun n'est sélectionné, tous les types de contenu sont activés",
98
+ "page.settings.form.contentTypesSettings.label": "Types de contenu",
99
+ "page.settings.form.contentTypesSettings.tooltip": "Configuration personnalisée par type de contenu",
100
+ "page.settings.form.moderatorRoles.label": "Envoyer des notifications importantes à",
101
+ "page.settings.form.moderatorRoles.placeholder": "Sélectionnez un ou plusieurs rôles",
102
+ "page.settings.form.moderatorRoles.hint": "Rôles qui vont être notifiés par le plugin sur les actions significatives à effectuer",
103
+ "page.settings.form.badWords.label": "Filtrage des gros mots",
104
+ "page.settings.form.badWords.hint": "Si activé, chaque message / mise à jour de commentaire va être vérifié contre les gros mots",
105
+ "page.settings.form.gqlAuth.label": "Autorisation des requêtes GraphQL",
106
+ "page.settings.form.gqlAuth.hint": "Si elle est activée, les requêtes et mutations de l'API GraphQL ne peuvent être déclenchées que par les utilisateurs Strapi authentifiés. Sinon, l'API reste ouverte.",
107
+ "page.settings.form.approvalFlow.label": "Flux de validation",
108
+ "page.settings.form.approvalFlow.hint": "Les commentaires associés au type de contenu \"{nom}\" vont être soumis à un flux de vérification manuel",
109
+ "page.settings.form.entryLabel.label": "Champs de titre",
110
+ "page.settings.form.entryLabel.placeholder": "Sélectionnez au moins un champ ou laissez vide pour appliquer les valeurs par défaut",
111
+ "page.settings.form.entryLabel.hint": "Si vous laissez vide, le rendu du titre sera le suivant : \"Title\", \"Subject\" & \"Name\"",
112
+ "page.settings.actions.restore.confirmation.header": "Restaurer la configuration par défaut",
113
+ "page.settings.actions.restore.confirmation.description": "Vous êtes sur le point de restaurer la configuration du plugin à ses valeurs par défaut. Cela pourrait avoir un impact destructeur sur le contenu déjà collecté. Voulez-vous vraiment continuer ?",
114
+ "page.settings.actions.restore.confirmation.button.confirm": "Oui, je veux restaurer",
115
+ "page.settings.actions.restart.alert.title": "Strapi requiert un redémarrage",
116
+ "page.settings.actions.restart.alert.description": "Vous avez effectué un changement de configuration qui nécessite que votre application Strapi soit redémarrée pour prendre effet dans le schéma GraphQL. Faites-le manuellement ou en utilisant le déclencheur ci-dessous.",
117
+ "page.settings.actions.restart.alert.close": "Abandonner",
118
+ "page.settings.notification.fetch.error": "Impossible de récupérer la configuration. Nouvelle tentative en cours...",
119
+ "page.settings.notification.submit.success": "La configuration a été enregistrée avec succès",
120
+ "page.settings.notification.submit.error": "Échec de la sauvegarde de la configuration. Veuillez rééssayer plus tard.",
121
+ "page.settings.notification.restore.success": "La configuration a été restaurée avec succès",
122
+ "page.settings.notification.restore.error": "Impossible de restaurer la configuration. Veuillez rééssayer plus tard.",
123
+ "page.settings.notification.restart.success": "L'application a été redémarrée avec succès",
124
+ "page.settings.notification.restart.error": "Le redémarrage de votre application a échoué. Essayez de le faire manuellement.",
125
+ "page.settings.loading": "Récupération de la configuration...",
126
+ "compontents.confirmation.dialog.header": "Confirmation",
127
+ "compontents.confirmation.dialog.description": "Voulez-vous vraiment effectuer cette action ?",
128
+ "compontents.confirmation.dialog.button.confirm": "Oui, je le veux",
129
+ "compontents.confirmation.dialog.button.cancel": "Annuler",
130
+ "compontents.toogle.enabled": "Activé",
131
+ "compontents.toogle.disabled": "Désactivé"
132
+ }