@mdguggenbichler/slugbase-core 0.0.4 → 0.0.6

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.
Files changed (120) hide show
  1. package/frontend/index.tsx +3 -3
  2. package/frontend/public/favicon.svg +1 -0
  3. package/frontend/public/slugbase_icon_blue.svg +1 -0
  4. package/frontend/public/slugbase_icon_white.png +0 -0
  5. package/frontend/public/slugbase_icon_white.svg +1 -0
  6. package/frontend/src/App.tsx +179 -0
  7. package/frontend/src/api/client.ts +134 -0
  8. package/frontend/src/components/AppSidebar.tsx +214 -0
  9. package/frontend/src/components/EmptyState.tsx +33 -0
  10. package/frontend/src/components/Favicon.tsx +76 -0
  11. package/frontend/src/components/FilterChips.tsx +60 -0
  12. package/frontend/src/components/FolderIcon.tsx +207 -0
  13. package/frontend/src/components/GlobalSearch.tsx +275 -0
  14. package/frontend/src/components/Layout.tsx +60 -0
  15. package/frontend/src/components/PageHeader.tsx +31 -0
  16. package/frontend/src/components/ScopeSegmentedControl.tsx +42 -0
  17. package/frontend/src/components/SentryDebug.tsx +32 -0
  18. package/frontend/src/components/StatCard.tsx +66 -0
  19. package/frontend/src/components/TopBar.tsx +63 -0
  20. package/frontend/src/components/UserDropdown.tsx +86 -0
  21. package/frontend/src/components/admin/AdminAI.tsx +207 -0
  22. package/frontend/src/components/admin/AdminOIDCProviders.tsx +183 -0
  23. package/frontend/src/components/admin/AdminSettings.tsx +413 -0
  24. package/frontend/src/components/admin/AdminTeams.tsx +177 -0
  25. package/frontend/src/components/admin/AdminUsers.tsx +225 -0
  26. package/frontend/src/components/bookmarks/BookmarkCard.tsx +312 -0
  27. package/frontend/src/components/bookmarks/BookmarkListItem.tsx +159 -0
  28. package/frontend/src/components/bookmarks/BookmarkTableView.tsx +419 -0
  29. package/frontend/src/components/bookmarks/BulkActionModals.tsx +162 -0
  30. package/frontend/src/components/bookmarks/FilterChips.tsx +5 -0
  31. package/frontend/src/components/modals/BookmarkModal.tsx +493 -0
  32. package/frontend/src/components/modals/FolderModal.tsx +306 -0
  33. package/frontend/src/components/modals/ImportModal.tsx +232 -0
  34. package/frontend/src/components/modals/OIDCProviderModal.tsx +284 -0
  35. package/frontend/src/components/modals/SharingModal.tsx +96 -0
  36. package/frontend/src/components/modals/TagModal.tsx +101 -0
  37. package/frontend/src/components/modals/TeamAssignmentModal.tsx +354 -0
  38. package/frontend/src/components/modals/TeamModal.tsx +117 -0
  39. package/frontend/src/components/modals/UserModal.tsx +225 -0
  40. package/frontend/src/components/profile/CreateTokenModal.tsx +172 -0
  41. package/frontend/src/components/sharing/ShareResourceDialog.tsx +422 -0
  42. package/frontend/src/components/ui/Autocomplete.tsx +155 -0
  43. package/frontend/src/components/ui/Button.tsx +68 -0
  44. package/frontend/src/components/ui/ConfirmDialog.tsx +79 -0
  45. package/frontend/src/components/ui/FormFieldWrapper.tsx +36 -0
  46. package/frontend/src/components/ui/ModalFooterActions.tsx +49 -0
  47. package/frontend/src/components/ui/ModalSection.tsx +34 -0
  48. package/frontend/src/components/ui/PageLoadingSkeleton.tsx +24 -0
  49. package/frontend/src/components/ui/Select.tsx +61 -0
  50. package/frontend/src/components/ui/SharingField.tsx +298 -0
  51. package/frontend/src/components/ui/Toast.tsx +47 -0
  52. package/frontend/src/components/ui/Tooltip.tsx +21 -0
  53. package/frontend/src/components/ui/alert-dialog.tsx +139 -0
  54. package/frontend/src/components/ui/badge.tsx +36 -0
  55. package/frontend/src/components/ui/button-base.tsx +57 -0
  56. package/frontend/src/components/ui/card.tsx +76 -0
  57. package/frontend/src/components/ui/command.tsx +161 -0
  58. package/frontend/src/components/ui/dialog.tsx +120 -0
  59. package/frontend/src/components/ui/dropdown-menu.tsx +199 -0
  60. package/frontend/src/components/ui/input.tsx +22 -0
  61. package/frontend/src/components/ui/label.tsx +24 -0
  62. package/frontend/src/components/ui/popover.tsx +33 -0
  63. package/frontend/src/components/ui/progress.tsx +26 -0
  64. package/frontend/src/components/ui/scroll-area.tsx +48 -0
  65. package/frontend/src/components/ui/select-base.tsx +159 -0
  66. package/frontend/src/components/ui/separator.tsx +29 -0
  67. package/frontend/src/components/ui/sheet.tsx +140 -0
  68. package/frontend/src/components/ui/sidebar.tsx +783 -0
  69. package/frontend/src/components/ui/skeleton.tsx +15 -0
  70. package/frontend/src/components/ui/sonner.tsx +46 -0
  71. package/frontend/src/components/ui/switch.tsx +28 -0
  72. package/frontend/src/components/ui/table.tsx +120 -0
  73. package/frontend/src/components/ui/tooltip-base.tsx +30 -0
  74. package/frontend/src/config/api.ts +16 -0
  75. package/frontend/src/config/mode.ts +6 -0
  76. package/frontend/src/contexts/AppConfigContext.tsx +39 -0
  77. package/frontend/src/contexts/AuthContext.tsx +137 -0
  78. package/frontend/src/contexts/SearchCommandContext.tsx +28 -0
  79. package/frontend/src/hooks/use-mobile.tsx +19 -0
  80. package/frontend/src/hooks/useConfirmDialog.ts +63 -0
  81. package/frontend/src/hooks/useMarketingTheme.ts +47 -0
  82. package/frontend/src/i18n.ts +39 -0
  83. package/frontend/src/index.css +117 -0
  84. package/frontend/src/instrument.ts +20 -0
  85. package/frontend/src/lib/utils.ts +6 -0
  86. package/frontend/src/locales/de.json +899 -0
  87. package/frontend/src/locales/en.json +937 -0
  88. package/frontend/src/locales/es.json +884 -0
  89. package/frontend/src/locales/fr.json +550 -0
  90. package/frontend/src/locales/it.json +535 -0
  91. package/frontend/src/locales/ja.json +535 -0
  92. package/frontend/src/locales/nl.json +550 -0
  93. package/frontend/src/locales/pl.json +535 -0
  94. package/frontend/src/locales/pt.json +535 -0
  95. package/frontend/src/locales/ru.json +535 -0
  96. package/frontend/src/locales/zh.json +535 -0
  97. package/frontend/src/main.tsx +44 -0
  98. package/frontend/src/pages/Bookmarks.tsx +1004 -0
  99. package/frontend/src/pages/Dashboard.tsx +427 -0
  100. package/frontend/src/pages/Folders.tsx +578 -0
  101. package/frontend/src/pages/GoPreferences.tsx +134 -0
  102. package/frontend/src/pages/Login.tsx +196 -0
  103. package/frontend/src/pages/PasswordReset.tsx +242 -0
  104. package/frontend/src/pages/Profile.tsx +593 -0
  105. package/frontend/src/pages/SearchEngineGuide.tsx +135 -0
  106. package/frontend/src/pages/Setup.tsx +210 -0
  107. package/frontend/src/pages/Signup.tsx +199 -0
  108. package/frontend/src/pages/Tags.tsx +421 -0
  109. package/frontend/src/pages/VerifyEmail.tsx +254 -0
  110. package/frontend/src/pages/admin/AdminAIPage.tsx +5 -0
  111. package/frontend/src/pages/admin/AdminLayout.tsx +40 -0
  112. package/frontend/src/pages/admin/AdminMembersPage.tsx +5 -0
  113. package/frontend/src/pages/admin/AdminOIDCPage.tsx +5 -0
  114. package/frontend/src/pages/admin/AdminSettingsPage.tsx +5 -0
  115. package/frontend/src/pages/admin/AdminTeamsPage.tsx +5 -0
  116. package/frontend/src/utils/favicon.ts +36 -0
  117. package/frontend/src/utils/formatRelativeTime.ts +37 -0
  118. package/frontend/src/utils/safeHref.ts +31 -0
  119. package/frontend/src/vite-env.d.ts +10 -0
  120. package/package.json +9 -1
@@ -0,0 +1,550 @@
1
+ {
2
+ "app": {
3
+ "name": "SlugBase",
4
+ "tagline": "Vos liens. Votre structure. Votre langue. Vos règles."
5
+ },
6
+ "contact": {
7
+ "title": "Contact",
8
+ "description": "Une question ou des retours ? Nous aimerions avoir de vos nouvelles.",
9
+ "name": "Nom",
10
+ "namePlaceholder": "Votre nom",
11
+ "email": "E-mail",
12
+ "emailPlaceholder": "votre@email.com",
13
+ "message": "Message",
14
+ "messagePlaceholder": "Comment pouvons-nous vous aider ?",
15
+ "submit": "Envoyer",
16
+ "successMessage": "Merci ! Votre message a été envoyé. Nous vous répondrons bientôt.",
17
+ "confirmationNote": "Un e-mail de confirmation a été envoyé à votre adresse.",
18
+ "backToLogin": "Retour à la connexion",
19
+ "submitError": "Échec de l'envoi. Veuillez réessayer plus tard."
20
+ },
21
+ "auth": {
22
+ "login": "Connexion",
23
+ "logout": "Déconnexion",
24
+ "loginWith": "Se connecter avec {{provider}}",
25
+ "notAuthenticated": "Non authentifié",
26
+ "authFailed": "Échec de l'authentification",
27
+ "loginFailed": "Échec de la connexion",
28
+ "oidcAuthFailed": "Échec de l'authentification OIDC. Veuillez réessayer.",
29
+ "oidcAutoCreateDisabled": "La création automatique d'utilisateur est désactivée pour ce fournisseur OIDC. Veuillez contacter un administrateur.",
30
+ "noProviders": "Aucun fournisseur OIDC configuré",
31
+ "noProvidersDescription": "Veuillez configurer un fournisseur OIDC dans les paramètres d'administration pour activer la connexion OIDC.",
32
+ "email": "E-mail",
33
+ "emailPlaceholder": "votre@email.com",
34
+ "password": "Mot de passe",
35
+ "passwordPlaceholder": "Entrez votre mot de passe",
36
+ "forgotPassword": "Mot de passe oublié ?",
37
+ "or": "Ou continuer avec"
38
+ },
39
+ "setup": {
40
+ "title": "Configuration initiale",
41
+ "description": "Bienvenue dans SlugBase ! Créez votre premier utilisateur administrateur pour commencer.",
42
+ "email": "E-mail",
43
+ "emailPlaceholder": "admin@example.com",
44
+ "name": "Nom",
45
+ "namePlaceholder": "Utilisateur administrateur",
46
+ "password": "Mot de passe",
47
+ "passwordPlaceholder": "Minimum 8 caractères",
48
+ "confirmPassword": "Confirmer le mot de passe",
49
+ "confirmPasswordPlaceholder": "Réentrez votre mot de passe",
50
+ "passwordMismatch": "Les mots de passe ne correspondent pas",
51
+ "passwordTooShort": "Le mot de passe doit contenir au moins 8 caractères",
52
+ "adminNote": "Cet utilisateur sera créé en tant qu'administrateur. Vous pourrez configurer les fournisseurs OIDC plus tard dans les paramètres d'administration.",
53
+ "submit": "Créer l'utilisateur administrateur",
54
+ "alreadyInitialized": "Système déjà initialisé",
55
+ "success": "Configuration terminée avec succès !",
56
+ "redirecting": "Redirection vers la connexion...",
57
+ "redirectingToDashboard": "Redirection vers le tableau de bord..."
58
+ },
59
+ "bookmarks": {
60
+ "title": "Favoris",
61
+ "create": "Créer un favori",
62
+ "edit": "Modifier le favori",
63
+ "delete": "Supprimer le favori",
64
+ "deleteBookmark": "Supprimer le favori",
65
+ "sharingSummary": "{{teamCount}} {{teams}}, {{userCount}} {{users}}",
66
+ "name": "Titre",
67
+ "url": "URL",
68
+ "slug": "Slug",
69
+ "slugOptionalHint": "Laissez vide si vous n'avez pas besoin d'un slug personnalisé",
70
+ "forwardingEnabled": "Activer la redirection",
71
+ "forwardingUrl": "URL de redirection",
72
+ "copyUrl": "Copier l'URL",
73
+ "copied": "Copié !",
74
+ "folder": "Dossier",
75
+ "folders": "Dossiers",
76
+ "tags": "Tags",
77
+ "noFolder": "Aucun dossier",
78
+ "noFoldersAvailable": "Aucun dossier disponible. Créez des dossiers pour organiser vos favoris.",
79
+ "foldersDescription": "Sélectionnez un ou plusieurs dossiers pour organiser ce favori",
80
+ "noTags": "Aucun tag",
81
+ "save": "Enregistrer",
82
+ "cancel": "Annuler",
83
+ "deleteConfirm": "Êtes-vous sûr de vouloir supprimer ce favori ?",
84
+ "deleteConfirmWithName": "Êtes-vous sûr de vouloir supprimer \"{{name}}\" ?",
85
+ "empty": "Aucun favori pour le moment. Créez votre premier !",
86
+ "emptyDescription": "Commencez par créer votre premier favori ou importez des favoris existants.",
87
+ "emptyCreateFirst": "Créer votre premier favori",
88
+ "emptyImport": "Importer des favoris",
89
+ "emptyLearnForwarding": "Apprendre comment fonctionne la redirection",
90
+ "filterByFolder": "Filtrer par dossier",
91
+ "filterByTag": "Filtrer par tag",
92
+ "allFolders": "Tous les dossiers",
93
+ "allTags": "Tous les tags",
94
+ "open": "Ouvrir",
95
+ "shareWithTeams": "Partager avec des équipes",
96
+ "shareWithTeamsDescription": "Sélectionnez les équipes avec lesquelles partager ce favori. Tous les membres des équipes sélectionnées pourront voir ce favori.",
97
+ "shareAllTeams": "Partager avec toutes mes équipes",
98
+ "shareAllTeamsDescription": "Partager avec toutes les équipes dont vous êtes membre",
99
+ "shareWithUsers": "Partager avec des utilisateurs",
100
+ "shareWithUsersDescription": "Sélectionnez des utilisateurs spécifiques avec lesquels partager",
101
+ "sharedWith": "Partagé avec :",
102
+ "users": "utilisateurs",
103
+ "shared": "Partagé",
104
+ "sharedWithTeam": "Partagé avec l'équipe",
105
+ "sharedWithTeams": "Partagé · {{count}} {{teams}}",
106
+ "teams": "équipes",
107
+ "optional": "Optionnel",
108
+ "slugRequired": "Le slug est requis lorsque la redirection est activée",
109
+ "slugAlreadyExists": "Le slug existe déjà. Les slugs doivent être uniques pour tous les favoris.",
110
+ "searchEngineNote": "Vous voulez accéder rapidement à vos favoris depuis la barre d'adresse de votre navigateur ?",
111
+ "searchEngineGuideLink": "Apprenez à configurer un moteur de recherche personnalisé",
112
+ "viewMode": "Mode d'affichage",
113
+ "viewCard": "Vue en cartes",
114
+ "viewList": "Vue en liste",
115
+ "compactMode": "Mode compact",
116
+ "sortBy": "Trier par",
117
+ "sortRecentlyAdded": "Récemment ajouté",
118
+ "sortAlphabetical": "Alphabétique",
119
+ "sortMostUsed": "Le plus utilisé",
120
+ "sortRecentlyAccessed": "Récemment consulté",
121
+ "resetFilters": "Réinitialiser les filtres",
122
+ "forwardingPreview": "URL de redirection",
123
+ "forwardingPreviewDescription": "C'est l'URL qui redirigera vers votre favori",
124
+ "bulkSelect": "Sélectionner plusieurs",
125
+ "bulkActions": "Actions groupées",
126
+ "bulkMoveToFolder": "Déplacer vers un dossier",
127
+ "bulkAddTags": "Ajouter des tags",
128
+ "bulkShare": "Partager avec des équipes",
129
+ "bulkDelete": "Supprimer la sélection",
130
+ "selectedCount": "{{count}} sélectionné(s)",
131
+ "selectAll": "Tout sélectionner",
132
+ "deselectAll": "Tout désélectionner",
133
+ "paginationShowing": "Affichage de {{from}}-{{to}} sur {{total}}",
134
+ "paginationPrevious": "Précédent",
135
+ "paginationNext": "Suivant",
136
+ "pinned": "Épinglé",
137
+ "favorites": "Favoris",
138
+ "import": "Importer",
139
+ "export": "Exporter",
140
+ "importBrowser": "Importer les favoris du navigateur",
141
+ "importJson": "Importer JSON",
142
+ "importHtml": "Importer HTML",
143
+ "exportJson": "Exporter en JSON",
144
+ "exportHtml": "Exporter en HTML",
145
+ "importDescription": "Importez des favoris depuis un fichier JSON ou HTML. Les fichiers JSON doivent contenir un tableau d'objets favoris avec des champs titre et url.",
146
+ "selectFile": "Sélectionner un fichier",
147
+ "supportedFormats": "Formats pris en charge : JSON, HTML (format de favoris Netscape)",
148
+ "importSuccess": "{{success}} favori(s) importé(s), {{failed}} échec(s)"
149
+ },
150
+ "folders": {
151
+ "title": "Dossiers",
152
+ "create": "Créer un dossier",
153
+ "edit": "Modifier le dossier",
154
+ "delete": "Supprimer le dossier",
155
+ "deleteFolder": "Supprimer le dossier",
156
+ "name": "Nom du dossier",
157
+ "icon": "Icône",
158
+ "searchIcons": "Rechercher des icônes par nom...",
159
+ "noIcon": "Aucune icône",
160
+ "selectedIcon": "Icône sélectionnée",
161
+ "clearIcon": "Effacer l'icône",
162
+ "showingPopular": "Affichage de {{count}} icônes populaires",
163
+ "showingAllIcons": "Affichage de toutes les {{count}} icônes",
164
+ "showAllIcons": "Afficher toutes les icônes",
165
+ "showPopularOnly": "Afficher uniquement les populaires",
166
+ "noIconsFound": "Aucune icône trouvée correspondant à votre recherche",
167
+ "useIcon": "Utiliser l'icône",
168
+ "typeIconName": "Tapez un nom d'icône pour utiliser n'importe quelle icône Lucide",
169
+ "empty": "Aucun dossier pour le moment",
170
+ "deleteConfirm": "Êtes-vous sûr de vouloir supprimer ce dossier ?",
171
+ "deleteConfirmWithName": "Êtes-vous sûr de vouloir supprimer \"{{name}}\" ?",
172
+ "sharedWith": "Partagé avec :",
173
+ "shareWithTeams": "Partager avec des équipes",
174
+ "shareWithTeamsDescription": "Sélectionnez les équipes avec lesquelles partager ce dossier. Tous les favoris de ce dossier seront partagés avec les équipes sélectionnées.",
175
+ "shared": "Partagé"
176
+ },
177
+ "tags": {
178
+ "title": "Tags",
179
+ "create": "Créer un tag",
180
+ "edit": "Modifier le tag",
181
+ "delete": "Supprimer le tag",
182
+ "deleteTag": "Supprimer le tag",
183
+ "name": "Nom du tag",
184
+ "empty": "Aucun tag pour le moment",
185
+ "deleteConfirm": "Êtes-vous sûr de vouloir supprimer ce tag ?",
186
+ "deleteConfirmWithName": "Êtes-vous sûr de vouloir supprimer \"{{name}}\" ?"
187
+ },
188
+ "profile": {
189
+ "title": "Profil",
190
+ "description": "Gérez les paramètres et préférences de votre compte",
191
+ "accountInformation": "Informations du compte",
192
+ "preferences": "Préférences",
193
+ "userKey": "Clé utilisateur",
194
+ "userKeyDescription": "Votre identifiant unique pour la redirection de signets. Partagez-le avec d'autres pour leur permettre d'accéder à vos signets partagés.",
195
+ "email": "E-mail",
196
+ "emailPlaceholder": "votre@email.com",
197
+ "name": "Nom",
198
+ "namePlaceholder": "Votre nom",
199
+ "language": "Langue",
200
+ "theme": "Thème",
201
+ "themeAuto": "Automatique",
202
+ "themeLight": "Clair",
203
+ "themeDark": "Sombre",
204
+ "save": "Enregistrer les paramètres",
205
+ "languageEnglish": "Anglais",
206
+ "languageGerman": "Allemand",
207
+ "languageFrench": "Français",
208
+ "languageSpanish": "Espagnol",
209
+ "languageItalian": "Italien",
210
+ "languagePortuguese": "Portugais",
211
+ "languageDutch": "Néerlandais",
212
+ "languageRussian": "Russe",
213
+ "languageJapanese": "Japonais",
214
+ "languageChinese": "Chinois",
215
+ "languagePolish": "Polonais",
216
+ "emailManagedByOIDC": "L'e-mail est géré par votre fournisseur d'identité et ne peut pas être modifié ici.",
217
+ "apiAccess": "Accès API",
218
+ "apiAccessDescription": "Créez et gérez des jetons API personnels pour l'authentification REST API.",
219
+ "apiTokenWarning": "Les jetons API donnent un accès complet à votre compte. Conservez-les en toute sécurité et ne les partagez jamais.",
220
+ "createToken": "Créer un jeton",
221
+ "tokenName": "Nom du jeton",
222
+ "tokenNamePlaceholder": "ex. CLI, CI/CD",
223
+ "tokenCreated": "Jeton créé",
224
+ "tokenRevealWarning": "Ce jeton ne sera plus affiché. Copiez-le maintenant.",
225
+ "copyToken": "Copier le jeton",
226
+ "revokeToken": "Révoquer",
227
+ "revokeTokenConfirm": "Êtes-vous sûr de vouloir révoquer ce jeton ? Il cessera de fonctionner immédiatement.",
228
+ "lastUsed": "Dernière utilisation",
229
+ "neverUsed": "Jamais utilisé",
230
+ "createdAt": "Créé",
231
+ "viewApiDocs": "Voir la documentation API",
232
+ "noTokens": "Aucun jeton API",
233
+ "noTokensDescription": "Créez un jeton pour vous authentifier avec l'API REST depuis des scripts, CLI ou CI/CD.",
234
+ "yourTokens": "Vos jetons"
235
+ },
236
+ "common": {
237
+ "loading": "Chargement...",
238
+ "error": "Une erreur s'est produite",
239
+ "success": "Succès",
240
+ "close": "Fermer",
241
+ "delete": "Supprimer",
242
+ "edit": "Modifier",
243
+ "create": "Créer",
244
+ "save": "Enregistrer",
245
+ "cancel": "Annuler",
246
+ "clearFilter": "Effacer le filtre",
247
+ "yes": "Oui",
248
+ "no": "Non",
249
+ "view": "Voir",
250
+ "confirm": "Confirmer",
251
+ "back": "Retour",
252
+ "bookmark": "favori",
253
+ "bookmarks": "favoris",
254
+ "tag": "tag",
255
+ "tags": "tags",
256
+ "folder": "dossier",
257
+ "folders": "dossiers",
258
+ "user": "utilisateur",
259
+ "users": "utilisateurs",
260
+ "team": "équipe",
261
+ "teams": "équipes",
262
+ "setting": "paramètre",
263
+ "settings": "paramètres",
264
+ "provider": "fournisseur",
265
+ "providers": "fournisseurs",
266
+ "search": "Rechercher",
267
+ "searchPlaceholder": "Rechercher des favoris, dossiers, tags...",
268
+ "searchShortcut": "Ctrl+K",
269
+ "searchShortcutHint": "Rechercher (Ctrl+K)",
270
+ "noResults": "Aucun résultat trouvé",
271
+ "copy": "Copier",
272
+ "copied": "Copié !",
273
+ "goTo": "Aller à",
274
+ "actions": "Actions",
275
+ "navigation": "Navigation",
276
+ "quickActions": "Actions rapides",
277
+ "collapseSidebar": "Réduire la barre latérale",
278
+ "expandSidebar": "Développer la barre latérale"
279
+ },
280
+ "dashboard": {
281
+ "searchPlaceholder": "Rechercher un favori ou naviguer dans SlugBase",
282
+ "bookmarksDescription": "Gérez vos favoris",
283
+ "foldersDescription": "Organisez avec des dossiers",
284
+ "tagsDescription": "Taguez vos favoris",
285
+ "overview": "Vue d'ensemble",
286
+ "totalBookmarks": "Total des favoris",
287
+ "totalFolders": "Total des dossiers",
288
+ "totalTags": "Total des tags",
289
+ "sharedBookmarks": "Favoris partagés",
290
+ "sharedFolders": "Dossiers partagés",
291
+ "recentBookmarks": "Favoris récents",
292
+ "topTags": "Tags les plus utilisés",
293
+ "noRecentBookmarks": "Aucun favori pour le moment",
294
+ "noTags": "Aucun tag pour le moment",
295
+ "quickAccess": "Accès rapide",
296
+ "viewAll": "Tout voir",
297
+ "noQuickAccessBookmarks": "Aucun favori avec raccourci",
298
+ "noQuickAccessBookmarksHint": "Ajoutez un slug à un favori pour le voir ici et utiliser go/slug dans le navigateur.",
299
+ "statsBookmarks": "favoris",
300
+ "statsFolders": "dossiers",
301
+ "statsTags": "tags",
302
+ "proTipBody": "Astuce : Configurez SlugBase comme moteur de recherche dans votre navigateur, puis tapez go github dans la barre d'adresse pour ouvrir des favoris instantanément.",
303
+ "proTipLink": "Configurer le moteur de recherche",
304
+ "dismiss": "Fermer",
305
+ "onboardingTitle": "Pour commencer",
306
+ "onboardingImport": "Importer les favoris du navigateur",
307
+ "onboardingSearchEngine": "Configurer le raccourci de recherche",
308
+ "onboardingFolder": "Créer votre premier dossier",
309
+ "onboardingTag": "Tagger un favori",
310
+ "onboardingDismiss": "Masquer la liste"
311
+ },
312
+ "apiDocs": {
313
+ "title": "Documentation API",
314
+ "description": "Référence API complète pour SlugBase. Tous les points de terminaison nécessitent une authentification via des jetons JWT sauf indication contraire."
315
+ },
316
+ "admin": {
317
+ "title": "Administration",
318
+ "description": "Gérez les utilisateurs, les groupes, les fournisseurs OIDC et les paramètres système",
319
+ "users": "Utilisateurs",
320
+ "teams": "Équipes",
321
+ "userGroups": "Équipes",
322
+ "oidcProviders": "Fournisseurs OIDC",
323
+ "settings": "Paramètres",
324
+ "addUser": "Ajouter un utilisateur",
325
+ "editUser": "Modifier l'utilisateur",
326
+ "addTeam": "Ajouter une équipe",
327
+ "editTeam": "Modifier l'équipe",
328
+ "addGroup": "Ajouter une équipe",
329
+ "editGroup": "Modifier l'équipe",
330
+ "addProvider": "Ajouter un fournisseur",
331
+ "editProvider": "Modifier le fournisseur",
332
+ "addSetting": "Ajouter un paramètre",
333
+ "admin": "Administrateur",
334
+ "user": "Utilisateur",
335
+ "oidcUser": "Utilisateur OIDC",
336
+ "teamName": "Nom de l'équipe",
337
+ "groupName": "Nom de l'équipe",
338
+ "description": "Description",
339
+ "providerKey": "Clé du fournisseur",
340
+ "issuerUrl": "URL de l'émetteur",
341
+ "clientId": "ID client",
342
+ "clientSecret": "Secret client",
343
+ "scopes": "Portées",
344
+ "callbackUrl": "URL de rappel",
345
+ "customEndpoints": "Points de terminaison OIDC personnalisés",
346
+ "customEndpointsDescription": "Remplacez les chemins de point de terminaison OIDC par défaut. Laissez vide pour utiliser les chemins standard basés sur l'URL de l'émetteur.",
347
+ "authorizationUrl": "URL d'autorisation",
348
+ "tokenUrl": "URL du jeton",
349
+ "userinfoUrl": "URL UserInfo",
350
+ "autoCreate": "Créer automatiquement les utilisateurs",
351
+ "defaultRole": "Rôle par défaut",
352
+ "settingKey": "Clé",
353
+ "settingValue": "Valeur",
354
+ "leaveBlank": "Laissez vide pour conserver la valeur actuelle",
355
+ "clientIdRequired": "L'ID client est requis lors de la création d'un nouveau fournisseur",
356
+ "leaveBlankToKeep": "Laissez vide pour conserver la valeur actuelle",
357
+ "confirmDeleteUser": "Êtes-vous sûr de vouloir supprimer cet utilisateur ?",
358
+ "confirmDeleteTeam": "Êtes-vous sûr de vouloir supprimer cette équipe ?",
359
+ "confirmDeleteGroup": "Êtes-vous sûr de vouloir supprimer cette équipe ?",
360
+ "confirmDeleteProvider": "Êtes-vous sûr de vouloir supprimer ce fournisseur ?",
361
+ "confirmDeleteSetting": "Êtes-vous sûr de vouloir supprimer ce paramètre ?",
362
+ "manageMembers": "Gérer les membres",
363
+ "currentMembers": "Membres actuels",
364
+ "currentTeams": "Équipes actuelles",
365
+ "addMembers": "Ajouter des membres",
366
+ "addTeams": "Ajouter des équipes",
367
+ "noMembers": "Aucun membre dans cette équipe",
368
+ "noTeams": "Aucune équipe assignée à cet utilisateur",
369
+ "noTeamsYet": "Aucune équipe pour le moment",
370
+ "add": "Ajouter",
371
+ "members": "Membres",
372
+ "manageTeams": "Gérer les équipes",
373
+ "searchTeams": "Rechercher des équipes par nom ou description...",
374
+ "createUserWith": "Créer l'utilisateur avec",
375
+ "sendInviteEmail": "Envoyer une invitation par e-mail",
376
+ "setPassword": "Définir le mot de passe",
377
+ "inviteSent": "Invitation envoyée",
378
+ "userCreatedInviteSent": "Utilisateur créé ; invitation envoyée.",
379
+ "userCreatedInviteNotSent": "Utilisateur créé ; l'invitation n'a pas pu être envoyée (vérifier SMTP).",
380
+ "searchUsers": "Rechercher des utilisateurs par nom ou e-mail...",
381
+ "noTeamsAvailable": "Toutes les équipes sont déjà assignées",
382
+ "noUsersAvailable": "Tous les utilisateurs sont déjà membres",
383
+ "noSearchResults": "Aucun résultat ne correspond à votre recherche",
384
+ "apiDocsNote": "La documentation API est disponible en tant que page autonome",
385
+ "viewApiDocs": "Voir la documentation API",
386
+ "noUserEmailAvailable": "Aucun e-mail utilisateur disponible",
387
+ "manageTeamsTitle": "Gérer les équipes - {{userName}}",
388
+ "manageMembersTitle": "Gérer les membres - {{teamName}}"
389
+ },
390
+ "passwordReset": {
391
+ "title": "Réinitialiser le mot de passe",
392
+ "description": "Entrez votre adresse e-mail pour recevoir un lien de réinitialisation du mot de passe",
393
+ "email": "E-mail",
394
+ "emailPlaceholder": "votre@email.com",
395
+ "requestReset": "Envoyer le lien de réinitialisation",
396
+ "resetToken": "Jeton de réinitialisation",
397
+ "newPassword": "Nouveau mot de passe",
398
+ "confirmPassword": "Confirmer le mot de passe",
399
+ "resetPassword": "Réinitialiser le mot de passe",
400
+ "requestSent": "Si un compte avec cet e-mail existe, un lien de réinitialisation du mot de passe a été envoyé.",
401
+ "resetSuccess": "Mot de passe réinitialisé avec succès ! Vous pouvez maintenant vous connecter avec votre nouveau mot de passe.",
402
+ "invalidToken": "Jeton de réinitialisation invalide ou expiré",
403
+ "passwordMismatch": "Les mots de passe ne correspondent pas",
404
+ "backToLogin": "Retour à la connexion"
405
+ },
406
+ "emailVerification": {
407
+ "verifying": "Vérification de l'e-mail",
408
+ "verifyingDescription": "Veuillez patienter pendant que nous vérifions votre adresse e-mail...",
409
+ "success": "E-mail vérifié",
410
+ "successDescription": "Votre adresse e-mail a été modifiée avec succès en {{email}}.",
411
+ "error": "Échec de la vérification",
412
+ "errorDescription": "Le lien de vérification est invalide ou a expiré.",
413
+ "tokenRequired": "Le jeton de vérification est requis",
414
+ "invalidToken": "Jeton de vérification invalide ou expiré",
415
+ "verifyFailed": "Échec de la vérification du jeton",
416
+ "confirmFailed": "Échec de la confirmation de l'e-mail",
417
+ "redirecting": "Redirection vers le profil...",
418
+ "backToProfile": "Retour au profil",
419
+ "emailSent": "E-mail de vérification envoyé ! Veuillez vérifier votre nouvelle adresse e-mail.",
420
+ "pendingTitle": "Vérification d'e-mail en attente",
421
+ "pendingDescription": "Un e-mail de vérification a été envoyé à {{email}}. Veuillez vérifier votre boîte de réception et cliquer sur le lien de vérification pour terminer le changement."
422
+ },
423
+ "smtp": {
424
+ "title": "Configuration e-mail SMTP",
425
+ "description": "Configurez les paramètres SMTP pour envoyer des e-mails (par exemple, e-mails de réinitialisation de mot de passe)",
426
+ "enabled": "Activer SMTP",
427
+ "host": "Hôte SMTP",
428
+ "hostPlaceholder": "smtp.gmail.com",
429
+ "port": "Port",
430
+ "portPlaceholder": "587",
431
+ "secure": "Utiliser TLS/SSL",
432
+ "user": "Nom d'utilisateur/E-mail",
433
+ "userPlaceholder": "votre-email@gmail.com",
434
+ "password": "Mot de passe",
435
+ "passwordPlaceholder": "Entrez le mot de passe pour le définir ou le modifier",
436
+ "passwordChangeHint": "Entrez un nouveau mot de passe pour le changer, ou laissez vide pour conserver le mot de passe actuel",
437
+ "from": "E-mail expéditeur",
438
+ "fromPlaceholder": "noreply@example.com",
439
+ "fromName": "Nom expéditeur",
440
+ "fromNamePlaceholder": "SlugBase",
441
+ "testEmail": "E-mail de test",
442
+ "testEmailPlaceholder": "test@example.com",
443
+ "sendTest": "Envoyer un e-mail de test",
444
+ "testSent": "E-mail de test envoyé avec succès !",
445
+ "testFailed": "Échec de l'envoi de l'e-mail de test",
446
+ "save": "Enregistrer les paramètres SMTP"
447
+ },
448
+ "shared": {
449
+ "title": "Partagé",
450
+ "description": "Favoris et dossiers partagés avec vous",
451
+ "bookmarks": "Favoris",
452
+ "folders": "Dossiers",
453
+ "noBookmarks": "Aucun favori partagé pour le moment",
454
+ "noFolders": "Aucun dossier partagé pour le moment",
455
+ "unknownUser": "Utilisateur inconnu"
456
+ },
457
+ "searchEngineGuide": {
458
+ "title": "Guide de configuration du moteur de recherche personnalisé",
459
+ "description": "Apprenez à configurer un moteur de recherche personnalisé dans votre navigateur pour accéder rapidement à vos favoris",
460
+ "howItWorks": "Comment ça fonctionne",
461
+ "howItWorksDescription": "En configurant un moteur de recherche personnalisé, vous pouvez taper un mot-clé (comme 'go') suivi d'un slug de favori dans la barre d'adresse de votre navigateur pour naviguer instantanément vers ce favori.",
462
+ "yourSearchUrl": "Votre URL de recherche",
463
+ "urlNote": "Utilisez ce modèle d'URL lors de la configuration de votre moteur de recherche personnalisé. Le %s sera remplacé par le slug de votre favori.",
464
+ "chromiumTitle": "Navigateurs basés sur Chromium (Chrome, Edge, Brave, etc.)",
465
+ "chromiumDescription": "Suivez ces étapes pour ajouter SlugBase comme moteur de recherche personnalisé :",
466
+ "chromiumStep1": "Ouvrez les paramètres de votre navigateur",
467
+ "chromiumStep2": "Accédez aux paramètres 'Moteur de recherche' ou 'Recherche'",
468
+ "chromiumStep3": "Cliquez sur 'Gérer les moteurs de recherche' ou 'Ajouter'",
469
+ "chromiumStep4": "Remplissez le formulaire avec :",
470
+ "chromiumStep4a": "Nom : SlugBase (ou tout nom de votre choix)",
471
+ "chromiumStep4b": "Mot-clé : go (ou tout mot-clé de votre choix)",
472
+ "chromiumStep4c": "URL : Utilisez l'URL de recherche affichée ci-dessus",
473
+ "chromiumStep5": "Cliquez sur 'Ajouter' ou 'Enregistrer' pour terminer la configuration",
474
+ "firefoxTitle": "Firefox",
475
+ "firefoxDescription": "Suivez ces étapes pour ajouter SlugBase comme moteur de recherche personnalisé :",
476
+ "firefoxStep1": "Ouvrez les paramètres Firefox",
477
+ "firefoxStep2": "Accédez à 'Recherche' dans le menu des paramètres",
478
+ "firefoxStep3": "Faites défiler et cliquez sur 'Ajouter' sous 'Moteurs de recherche en un clic'",
479
+ "firefoxStep4": "Remplissez le formulaire avec :",
480
+ "firefoxStep4a": "Nom : SlugBase (ou tout nom de votre choix)",
481
+ "firefoxStep4b": "Mot-clé : go (ou tout mot-clé de votre choix)",
482
+ "firefoxStep4c": "URL : Utilisez l'URL de recherche affichée ci-dessus",
483
+ "firefoxStep5": "Cliquez sur 'Ajouter' pour terminer la configuration",
484
+ "usageExample": "Exemple d'utilisation",
485
+ "usageStep1": "Après la configuration, tapez simplement dans la barre d'adresse de votre navigateur :",
486
+ "usageStep2": "Appuyez sur Entrée, et vous serez redirigé vers le favori avec le slug 'test'",
487
+ "usageNote": "Remplacez 'test' par n'importe quel slug de favori que vous avez créé dans SlugBase !"
488
+ },
489
+ "legal": {
490
+ "imprintTitle": "Mentions légales",
491
+ "imprintProviderTitle": "Prestataire de services (ECG §5)",
492
+ "imprintChamber": "Membre de {{chamber}}",
493
+ "imprintCourtTitle": "Tribunal compétent",
494
+ "imprintCourtBody": "Juridiction compétente pour les litiges : Landesgericht Linz, Autriche. Le droit autrichien s'applique.",
495
+ "imprintOdrTitle": "Règlement des litiges en ligne (UE)",
496
+ "imprintOdrBody": "La Commission européenne fournit une plateforme de règlement des litiges en ligne. Les consommateurs peuvent y accéder à",
497
+ "uid": "UID",
498
+ "backToHome": "Retour à l'accueil",
499
+ "termsTitle": "Conditions générales",
500
+ "termsScopeTitle": "Champ d'application",
501
+ "termsScopeBody": "Ces conditions s'appliquent à votre utilisation de SlugBase Cloud (le \"Service\") sur slugbase.app. En vous inscrivant ou en utilisant le Service, vous acceptez ces conditions. Si vous êtes consommateur, vos droits légaux impératifs restent inchangés.",
502
+ "termsServiceTitle": "Description du service",
503
+ "termsServiceBody": "SlugBase Cloud est un service de gestion de favoris et de redirection de liens. Il permet d'enregistrer, organiser et partager des favoris ; créer des dossiers et tags ; et exposer des favoris comme URLs courtes. Le service est fourni en SaaS sur https://slugbase.app.",
504
+ "termsPlansTitle": "Formules",
505
+ "termsPlansBody": "SlugBase Cloud propose plusieurs formules : Free, Personal, Team et Early Supporter Lifetime. Les détails actuels figurent sur la page Tarifs.",
506
+ "termsAccountTitle": "Compte et éligibilité",
507
+ "termsAccountBody": "Vous devez fournir des informations exactes lors de la création d'un compte. Vous êtes responsable de la confidentialité de vos identifiants. Le Service est destiné à un usage licite par des particuliers et des équipes.",
508
+ "termsUseTitle": "Utilisation du Service",
509
+ "termsUseBody": "Vous pouvez utiliser SlugBase pour enregistrer, organiser et partager des favoris et pour utiliser des liens courts (redirection). Vous ne devez pas utiliser le Service à des fins illégales, pour distribuer des logiciels malveillants ou pour harceler autrui.",
510
+ "termsShortLinksTitle": "Liens courts et redirection",
511
+ "termsShortLinksBody": "Les liens courts (ex. /go/votre-slug) redirigent vers l'URL que vous définissez. Vous ne devez pas les utiliser pour le phishing, le spam ou d'autres abus. Nous pouvons suspendre ou supprimer les liens qui violent ces conditions.",
512
+ "termsBillingTitle": "Facturation et paiement",
513
+ "termsBillingBody": "Les formules payantes sont facturées à l'avance. Le paiement est dû à l'émission de la facture. Le plan Early Supporter Lifetime est payé en une fois. Nous utilisons des prestataires de paiement tiers.",
514
+ "termsCancellationTitle": "Résiliation et renouvellement",
515
+ "termsCancellationBody": "Vous pouvez résilier votre abonnement à tout moment. La résiliation prend effet à la fin de la période de facturation en cours. Aucun engagement minimum. Pour les abonnements à renouvellement automatique, vous pouvez résilier avant chaque date de renouvellement.",
516
+ "termsWithdrawalTitle": "Droit de rétractation (consommateurs)",
517
+ "termsWithdrawalBody": "Si vous êtes consommateur au sens du droit autrichien, vous disposez d'un droit de rétractation de 14 jours sans indication de motifs. Le délai commence à la date de conclusion du contrat. Pour l'exercer, contactez-nous à hello@slugbase.app. Si vous avez demandé le début du service pendant le délai, vous acceptez que l'exécution commence avant la fin de celui-ci.",
518
+ "termsLiabilityTitle": "Limitation de responsabilité",
519
+ "termsLiabilityBody": "Le Service est fourni « tel quel ». Nous ne sommes pas responsables des dommages indirects ou consécutifs, sauf en cas de dol ou de négligence grave. Notre responsabilité est limitée.",
520
+ "termsTerminationTitle": "Suspension et résiliation par nous",
521
+ "termsTerminationBody": "Nous pouvons suspendre ou résilier votre compte en cas de violation grave de ces conditions ou de défaut de paiement. À la résiliation, votre droit d'utilisation prend fin.",
522
+ "termsLawTitle": "Droit applicable",
523
+ "termsLawBody": "Ces conditions sont régies par le droit autrichien. Tout litige relève des tribunaux compétents en Autriche.",
524
+ "termsContactTitle": "Contact",
525
+ "termsContactBody": "Pour toute question concernant ces conditions, contactez-nous à hello@slugbase.app ou à l'adresse indiquée dans les mentions légales.",
526
+ "privacyTitle": "Politique de confidentialité",
527
+ "privacyScopeTitle": "Champ d'application",
528
+ "privacyScopeBody": "Cette politique s'applique à SlugBase Cloud sur https://slugbase.app. Elle décrit comment nous traitons vos données personnelles. Elle ne s'applique pas si vous auto-hébergez SlugBase. Basée sur le RGPD et la loi autrichienne (DSG).",
529
+ "privacyControllerTitle": "Responsable",
530
+ "privacyControllerBody": "Le responsable du traitement des données est Guggernbichler Michael David, Linzer Str. 17, 4100 Ottensheim, Autriche (voir mentions légales).",
531
+ "privacyDataTitle": "Données traitées",
532
+ "privacyDataBody": "Nous traitons : données de compte ; contenu (favoris, dossiers, tags) ; usage (session, IP, logs) ; données de contact si formulaire utilisé. Nous ne vendons pas vos données ni ne les utilisons pour la publicité.",
533
+ "privacyRecipientsTitle": "Destinataires",
534
+ "privacyRecipientsBody": "Les données sont traitées sur notre infrastructure et par des sous-traitants conformes au RGPD (hébergement, e-mail). Nous ne partageons pas vos données avec des tiers pour leurs propres fins.",
535
+ "privacyBasisTitle": "Base légale",
536
+ "privacyBasisBody": "Nous traitons selon : exécution du contrat (Art. 6.1.b RGPD), intérêts légitimes (Art. 6.1.f), consentement (Art. 6.1.a) le cas échéant, et obligation légale (Art. 6.1.c) si requis.",
537
+ "privacyRetentionTitle": "Conservation",
538
+ "privacyRetentionBody": "Nous conservons les données de compte et de favoris tant que votre compte existe. Après suppression, nous supprimons ou anonymisons les données dans un délai raisonnable. Les logs peuvent être conservés plus longtemps si la loi l'exige.",
539
+ "privacyRightsTitle": "Vos droits",
540
+ "privacyRightsBody": "Vous avez les droits d'accès, rectification, effacement, limitation, portabilité et opposition. Vous pouvez retirer votre consentement à tout moment. Contact : hello@slugbase.app. Vous pouvez saisir l'autorité autrichienne (voir ci-dessous).",
541
+ "privacyCookiesTitle": "Cookies et authentification",
542
+ "privacyCookiesBody": "Nous utilisons des cookies de session et des moyens similaires pour l'authentification et la sécurité. Nous n'utilisons pas de cookies publicitaires tiers.",
543
+ "privacyHostingTitle": "Hébergement (CLOUD vs auto-hébergé)",
544
+ "privacyHostingBody": "Sur slugbase.app (CLOUD), nous hébergeons vos données sur notre infrastructure dans l'UE/EEE. Si vous auto-hébergez SlugBase, vous êtes responsable et contrôlez le stockage.",
545
+ "privacySupervisoryTitle": "Autorité de contrôle",
546
+ "privacySupervisoryBody": "Vous pouvez saisir l'Österreichische Datenschutzbehörde, Barichgasse 40-42, 1030 Vienne, Autriche (dsb@dsb.gv.at). Selon le DSG autrichien, les réclamations doivent généralement être déposées dans l'année suivant la prise de connaissance.",
547
+ "privacyChangesTitle": "Modifications",
548
+ "privacyChangesBody": "Nous pouvons mettre à jour cette politique. Les changements importants seront communiqués. La version actuelle est disponible sur cette page. L'utilisation continue après modification vaut acceptation."
549
+ }
550
+ }