@cavulsqa/create 2.9.3 → 2.10.1

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 (199) hide show
  1. package/README.md +12 -1
  2. package/bin/create.mjs +18 -25
  3. package/lib/templates.mjs +56 -0
  4. package/package.json +13 -5
  5. package/templates/f7-app/auto-imports.d.ts +9 -0
  6. package/templates/f7-app/package.json +6 -3
  7. package/templates/f7-app/src/env.d.ts +1 -0
  8. package/templates/f7-app/src/main.ts +3 -0
  9. package/templates/f7-app/src/plugins/bootstrapError.ts +2 -0
  10. package/templates/f7-app/src/plugins/recorder.plugin.ts +155 -0
  11. package/templates/f7-app/src/shared/recorder/capacitorSink.ts +124 -0
  12. package/templates/f7-app/vite.config.ts +1 -0
  13. package/templates/m3e-app/.claude/rules/data-fetching.md +68 -0
  14. package/templates/m3e-app/.claude/rules/database.md +106 -0
  15. package/templates/m3e-app/.claude/rules/m3e-ui.md +48 -0
  16. package/templates/m3e-app/.claude/rules/modules.md +43 -0
  17. package/templates/m3e-app/.claude/rules/native.md +60 -0
  18. package/templates/m3e-app/.claude/skills/m3-expressive/SKILL.md +68 -0
  19. package/templates/m3e-app/.claude/skills/m3-expressive/color.md +44 -0
  20. package/templates/m3e-app/.claude/skills/m3-expressive/components.md +325 -0
  21. package/templates/m3e-app/.claude/skills/m3-expressive/layout.md +42 -0
  22. package/templates/m3e-app/.claude/skills/m3-expressive/motion.md +51 -0
  23. package/templates/m3e-app/.claude/skills/m3-expressive/shapes-type.md +48 -0
  24. package/templates/m3e-app/.claude/skills/m3-expressive/sources.md +53 -0
  25. package/templates/m3e-app/.claude/skills/module-architecture/SKILL.md +65 -0
  26. package/templates/m3e-app/.claude/skills/module-architecture/file-templates.md +178 -0
  27. package/templates/m3e-app/.claude/skills/reactive-data/SKILL.md +90 -0
  28. package/templates/m3e-app/.claude/skills/reactive-data/testing.md +55 -0
  29. package/templates/m3e-app/.env.example +32 -0
  30. package/templates/m3e-app/CLAUDE.md +93 -0
  31. package/templates/m3e-app/auto-imports.d.ts +851 -0
  32. package/templates/m3e-app/capacitor.config.ts +44 -0
  33. package/templates/m3e-app/components.d.ts +252 -0
  34. package/templates/m3e-app/index.html +16 -0
  35. package/templates/m3e-app/package.json +108 -0
  36. package/templates/m3e-app/src/App.vue +129 -0
  37. package/templates/m3e-app/src/app/pragmas.config.ts +35 -0
  38. package/templates/m3e-app/src/app/scroll.config.ts +20 -0
  39. package/templates/m3e-app/src/app/storage.config.ts +65 -0
  40. package/templates/m3e-app/src/app/tabs.ts +33 -0
  41. package/templates/m3e-app/src/app/theme.config.ts +51 -0
  42. package/templates/m3e-app/src/assets/css/app.css +18 -0
  43. package/templates/m3e-app/src/assets/css/base.css +53 -0
  44. package/templates/m3e-app/src/assets/css/layout/container-transform.css +113 -0
  45. package/templates/m3e-app/src/assets/css/layout/shell.css +69 -0
  46. package/templates/m3e-app/src/assets/css/layout/transitions.css +121 -0
  47. package/templates/m3e-app/src/assets/css/m3e.css +6 -0
  48. package/templates/m3e-app/src/assets/css/theme/framework7.css +18 -0
  49. package/templates/m3e-app/src/assets/css/theme/tailwind.css +365 -0
  50. package/templates/m3e-app/src/domains/benchmark/benchmark.dataset.ts +209 -0
  51. package/templates/m3e-app/src/domains/benchmark/benchmark.suite.ts +662 -0
  52. package/templates/m3e-app/src/domains/sales/sales.repository.ts +458 -0
  53. package/templates/m3e-app/src/env.d.ts +40 -0
  54. package/templates/m3e-app/src/locales/ar.json +1260 -0
  55. package/templates/m3e-app/src/locales/en.json +1260 -0
  56. package/templates/m3e-app/src/locales/fr.json +1260 -0
  57. package/templates/m3e-app/src/main.ts +41 -0
  58. package/templates/m3e-app/src/modules/demo/components/DemoBenchmark.vue +119 -0
  59. package/templates/m3e-app/src/modules/demo/components/DemoBusLog.vue +63 -0
  60. package/templates/m3e-app/src/modules/demo/components/DemoCreateOrderSheet.vue +203 -0
  61. package/templates/m3e-app/src/modules/demo/components/DemoMetricsSheet.vue +75 -0
  62. package/templates/m3e-app/src/modules/demo/components/DemoOrderList.vue +75 -0
  63. package/templates/m3e-app/src/modules/demo/components/DemoPipelineBenchmark.vue +65 -0
  64. package/templates/m3e-app/src/modules/demo/components/DemoStatCards.vue +71 -0
  65. package/templates/m3e-app/src/modules/demo/composables/useBenchmark.ts +139 -0
  66. package/templates/m3e-app/src/modules/demo/composables/useOrderStatus.ts +64 -0
  67. package/templates/m3e-app/src/modules/demo/composables/useReactiveDemo.ts +171 -0
  68. package/templates/m3e-app/src/modules/demo/router/routes/demo.routes.ts +22 -0
  69. package/templates/m3e-app/src/modules/demo/views/DemoView.vue +210 -0
  70. package/templates/m3e-app/src/modules/demo/views/OrderDetailView.vue +136 -0
  71. package/templates/m3e-app/src/modules/demo/views/OrderSearchView.vue +74 -0
  72. package/templates/m3e-app/src/modules/gallery/components/GalleryBlock.vue +16 -0
  73. package/templates/m3e-app/src/modules/gallery/components/GalleryCarouselTile.vue +71 -0
  74. package/templates/m3e-app/src/modules/gallery/components/GalleryCustomerForm.vue +76 -0
  75. package/templates/m3e-app/src/modules/gallery/components/GalleryProofOfDelivery.vue +69 -0
  76. package/templates/m3e-app/src/modules/gallery/components/agenda/AgendaDay.vue +106 -0
  77. package/templates/m3e-app/src/modules/gallery/components/agenda/AgendaMonth.vue +40 -0
  78. package/templates/m3e-app/src/modules/gallery/components/agenda/AgendaVisitList.vue +45 -0
  79. package/templates/m3e-app/src/modules/gallery/components/chat/ChatAttachSheet.vue +106 -0
  80. package/templates/m3e-app/src/modules/gallery/components/chat/ChatContactPicker.vue +85 -0
  81. package/templates/m3e-app/src/modules/gallery/components/chat/ChatInviteComposer.vue +131 -0
  82. package/templates/m3e-app/src/modules/gallery/components/chat/ChatPollComposer.vue +148 -0
  83. package/templates/m3e-app/src/modules/gallery/components/chat/ChatRecentPhotos.vue +62 -0
  84. package/templates/m3e-app/src/modules/gallery/components/inputs/InputsAccount.vue +79 -0
  85. package/templates/m3e-app/src/modules/gallery/components/inputs/InputsTags.vue +53 -0
  86. package/templates/m3e-app/src/modules/gallery/components/inputs/InputsVerification.vue +73 -0
  87. package/templates/m3e-app/src/modules/gallery/components/inputs/PasswordStrength.vue +37 -0
  88. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryButtons.vue +128 -0
  89. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryCarousels.vue +236 -0
  90. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryCharts.vue +84 -0
  91. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryFabs.vue +70 -0
  92. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryInputs.vue +219 -0
  93. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryNavigation.vue +141 -0
  94. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryOverlays.vue +368 -0
  95. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryPickers.vue +175 -0
  96. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryProgress.vue +118 -0
  97. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryScale.vue +103 -0
  98. package/templates/m3e-app/src/modules/gallery/components/sections/GallerySelection.vue +219 -0
  99. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryShapes.vue +48 -0
  100. package/templates/m3e-app/src/modules/gallery/components/sections/GallerySurfaces.vue +213 -0
  101. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryTables.vue +185 -0
  102. package/templates/m3e-app/src/modules/gallery/components/surfaces/SurfacesContainerTransform.vue +46 -0
  103. package/templates/m3e-app/src/modules/gallery/composables/chatTeam.ts +18 -0
  104. package/templates/m3e-app/src/modules/gallery/composables/composeKind.ts +2 -0
  105. package/templates/m3e-app/src/modules/gallery/composables/currentPosition.ts +35 -0
  106. package/templates/m3e-app/src/modules/gallery/composables/demoOrders.ts +29 -0
  107. package/templates/m3e-app/src/modules/gallery/composables/featuredStories.ts +73 -0
  108. package/templates/m3e-app/src/modules/gallery/composables/fieldFormats.ts +36 -0
  109. package/templates/m3e-app/src/modules/gallery/composables/openExternal.ts +11 -0
  110. package/templates/m3e-app/src/modules/gallery/composables/routePlan.ts +90 -0
  111. package/templates/m3e-app/src/modules/gallery/composables/useAgenda.ts +61 -0
  112. package/templates/m3e-app/src/modules/gallery/composables/useChatCustomers.ts +31 -0
  113. package/templates/m3e-app/src/modules/gallery/composables/useChatDemo.ts +299 -0
  114. package/templates/m3e-app/src/modules/gallery/composables/useGallerySections.ts +230 -0
  115. package/templates/m3e-app/src/modules/gallery/composables/useLocalAttachments.ts +71 -0
  116. package/templates/m3e-app/src/modules/gallery/composables/useLocationShare.ts +38 -0
  117. package/templates/m3e-app/src/modules/gallery/composables/usePhotoScenes.ts +82 -0
  118. package/templates/m3e-app/src/modules/gallery/composables/useTreeDemo.ts +67 -0
  119. package/templates/m3e-app/src/modules/gallery/composables/wilayas.ts +67 -0
  120. package/templates/m3e-app/src/modules/gallery/router/routes/gallery.routes.ts +52 -0
  121. package/templates/m3e-app/src/modules/gallery/views/GalleryAgendaView.vue +117 -0
  122. package/templates/m3e-app/src/modules/gallery/views/GalleryChatView.vue +292 -0
  123. package/templates/m3e-app/src/modules/gallery/views/GalleryContactsView.vue +77 -0
  124. package/templates/m3e-app/src/modules/gallery/views/GalleryFeaturedView.vue +60 -0
  125. package/templates/m3e-app/src/modules/gallery/views/GalleryLoginView.vue +135 -0
  126. package/templates/m3e-app/src/modules/gallery/views/GalleryOnboardingView.vue +116 -0
  127. package/templates/m3e-app/src/modules/gallery/views/GallerySectionView.vue +27 -0
  128. package/templates/m3e-app/src/modules/gallery/views/GalleryTabsView.vue +135 -0
  129. package/templates/m3e-app/src/modules/gallery/views/GalleryView.vue +50 -0
  130. package/templates/m3e-app/src/modules/home/components/HomeHero.vue +57 -0
  131. package/templates/m3e-app/src/modules/home/composables/useHomeFeatures.ts +128 -0
  132. package/templates/m3e-app/src/modules/home/composables/useOpenFeature.ts +22 -0
  133. package/templates/m3e-app/src/modules/home/router/routes/home.routes.ts +21 -0
  134. package/templates/m3e-app/src/modules/home/views/FeatureDetailView.vue +66 -0
  135. package/templates/m3e-app/src/modules/home/views/HomeView.vue +47 -0
  136. package/templates/m3e-app/src/modules/settings/components/RolePalette.vue +38 -0
  137. package/templates/m3e-app/src/modules/settings/components/SeedSwatches.vue +41 -0
  138. package/templates/m3e-app/src/modules/settings/components/SettingsChoice.vue +43 -0
  139. package/templates/m3e-app/src/modules/settings/components/StudioPreview.vue +52 -0
  140. package/templates/m3e-app/src/modules/settings/router/routes/settings.routes.ts +17 -0
  141. package/templates/m3e-app/src/modules/settings/types.ts +7 -0
  142. package/templates/m3e-app/src/modules/settings/views/ColorStudioView.vue +166 -0
  143. package/templates/m3e-app/src/modules/settings/views/SettingsView.vue +157 -0
  144. package/templates/m3e-app/src/plugins/bootstrapError.ts +62 -0
  145. package/templates/m3e-app/src/plugins/capacitor/index.ts +14 -0
  146. package/templates/m3e-app/src/plugins/capacitor/useAndroidBackButton.ts +36 -0
  147. package/templates/m3e-app/src/plugins/capacitor/useKeyboard.ts +48 -0
  148. package/templates/m3e-app/src/plugins/capacitor/useSplashScreen.ts +43 -0
  149. package/templates/m3e-app/src/plugins/capacitor/useStatusBar.ts +16 -0
  150. package/templates/m3e-app/src/plugins/framework7.plugin.ts +36 -0
  151. package/templates/m3e-app/src/plugins/i18n.plugin.ts +87 -0
  152. package/templates/m3e-app/src/plugins/m3e.plugin.ts +22 -0
  153. package/templates/m3e-app/src/plugins/seed.plugin.ts +7 -0
  154. package/templates/m3e-app/src/plugins/sqlite.plugin.ts +32 -0
  155. package/templates/m3e-app/src/router/global/global.routes.ts +12 -0
  156. package/templates/m3e-app/src/router/index.ts +20 -0
  157. package/templates/m3e-app/src/shared/components/error/404.vue +13 -0
  158. package/templates/m3e-app/src/shared/components/layout/EmptyState.vue +30 -0
  159. package/templates/m3e-app/src/shared/components/layout/SectionHeader.vue +10 -0
  160. package/templates/m3e-app/src/shared/components/page/AppPage.vue +104 -0
  161. package/templates/m3e-app/src/shared/composables/navigation/useActiveTab.ts +39 -0
  162. package/templates/m3e-app/src/shared/composables/navigation/useContainerTransform.ts +117 -0
  163. package/templates/m3e-app/src/shared/composables/navigation/useNavigationGuard.ts +48 -0
  164. package/templates/m3e-app/src/shared/composables/navigation/useNavigationVisibility.ts +64 -0
  165. package/templates/m3e-app/src/shared/composables/navigation/useViewRouter.ts +25 -0
  166. package/templates/m3e-app/src/shared/composables/navigation/useWindowClass.ts +22 -0
  167. package/templates/m3e-app/src/shared/composables/theme/useThemeSettings.ts +155 -0
  168. package/templates/m3e-app/src/shared/database/candidates/capacitorSqlite.ts +36 -0
  169. package/templates/m3e-app/src/shared/database/candidates/index.ts +4 -0
  170. package/templates/m3e-app/src/shared/database/candidates/opfsSahPool.ts +25 -0
  171. package/templates/m3e-app/src/shared/database/candidates/types.ts +56 -0
  172. package/templates/m3e-app/src/shared/database/candidates/waSqlite.ts +56 -0
  173. package/templates/m3e-app/src/shared/database/database.ts +219 -0
  174. package/templates/m3e-app/src/shared/database/index.ts +3 -0
  175. package/templates/m3e-app/src/shared/database/migrations.ts +223 -0
  176. package/templates/m3e-app/src/shared/database/opfs.worker.ts +5 -0
  177. package/templates/m3e-app/src/shared/database/queries.ts +26 -0
  178. package/templates/m3e-app/src/shared/database/schema.ts +153 -0
  179. package/templates/m3e-app/src/shared/database/storage.ts +64 -0
  180. package/templates/m3e-app/src/shared/database/wa.worker.ts +5 -0
  181. package/templates/m3e-app/src/shared/utils/lazyRoute.ts +41 -0
  182. package/templates/m3e-app/src/shared/utils/resolvers/resolvers.ts +42 -0
  183. package/templates/m3e-app/src/shared/utils/textDirection.ts +22 -0
  184. package/templates/m3e-app/src/shared/utils/theme/themeSettings.ts +59 -0
  185. package/templates/m3e-app/src/shared/utils/tone.ts +8 -0
  186. package/templates/m3e-app/tests/benchmark.suite.test.ts +104 -0
  187. package/templates/m3e-app/tests/containerTransform.test.ts +58 -0
  188. package/templates/m3e-app/tests/fieldFormats.test.ts +25 -0
  189. package/templates/m3e-app/tests/lazyRoute.test.ts +30 -0
  190. package/templates/m3e-app/tests/locales.test.ts +73 -0
  191. package/templates/m3e-app/tests/migrations.test.ts +74 -0
  192. package/templates/m3e-app/tests/navigationGuard.test.ts +82 -0
  193. package/templates/m3e-app/tests/openDatabase.test.ts +54 -0
  194. package/templates/m3e-app/tests/sales.repository.test.ts +329 -0
  195. package/templates/m3e-app/tests/storage.test.ts +117 -0
  196. package/templates/m3e-app/tests/textDirection.test.ts +11 -0
  197. package/templates/m3e-app/tooling/linkedPackages.ts +112 -0
  198. package/templates/m3e-app/tsconfig.json +21 -0
  199. package/templates/m3e-app/vite.config.ts +144 -0
@@ -0,0 +1,1260 @@
1
+ {
2
+ "tabs": {
3
+ "home": "Aperçu",
4
+ "demo": "Commandes",
5
+ "gallery": "Galerie",
6
+ "settings": "Réglages"
7
+ },
8
+ "shell": {
9
+ "navigation": "Navigation principale",
10
+ "back": "Retour",
11
+ "expand": "Déplier la navigation",
12
+ "collapse": "Replier la navigation",
13
+ "dismiss": "Fermer",
14
+ "routeFailed": "Cette page n'a pas pu s'ouvrir",
15
+ "reload": "Recharger",
16
+ "notification": "Notification",
17
+ "notificationsMore": "{count} de plus | {count} de plus",
18
+ "notificationsLess": "Réduire",
19
+ "notificationsClear": "Tout effacer"
20
+ },
21
+ "home": {
22
+ "title": "Aperçu",
23
+ "overline": "Material 3 Expressive",
24
+ "headline": "Votre app, en mouvement",
25
+ "intro": "{app} est un point de départ hors ligne : Vue, Capacitor et une base SQLite locale, habillés de formes, de ressorts et de couleur.",
26
+ "morph": "Transformer la forme",
27
+ "actions": "Pour continuer",
28
+ "explore": "Voir les composants",
29
+ "personalise": "Personnaliser",
30
+ "studio": "Studio de couleurs",
31
+ "included": "Ce qui est inclus"
32
+ },
33
+ "detail": {
34
+ "thisScreen": "Cet écran",
35
+ "transition": "Transition de page",
36
+ "transitionNote": "Framework7 a ouvert cette page avec {name} ; le retour la joue à l'envers. Chaque fonctionnalité de l'accueil a la sienne.",
37
+ "appBar": "Barre d'application moyenne flexible",
38
+ "appBarNote": "Faites défiler : le grand titre part et la barre le reprend, en surface-container quand le contenu passe dessous.",
39
+ "nesting": "Imbriqué dans son onglet",
40
+ "nestingNote": "Cette page vit dans l'historique de l'onglet Aperçu : les autres onglets gardent leur écran et le retour ne remonte que celui-ci.",
41
+ "next": "Fonction suivante"
42
+ },
43
+ "features": {
44
+ "expressive": {
45
+ "title": "Material 3 Expressive",
46
+ "subtitle": "Formes, ressorts, progression ondulée",
47
+ "text": "Quarante composants du paquet m3e-vue, construits à partir des valeurs de Compose : les 35 formes, le schéma de mouvement à ressorts, l'indicateur de chargement et les indicateurs ondulés."
48
+ },
49
+ "color": {
50
+ "title": "Couleur dynamique",
51
+ "subtitle": "Une graine, la spec couleur 2025",
52
+ "text": "Chaque rôle, clair et sombre, est généré depuis une seule graine. Le studio la change en direct : variante, contraste, couleurs personnalisées."
53
+ },
54
+ "shell": {
55
+ "title": "Coque adaptative",
56
+ "subtitle": "Barre sur téléphone, rail dès 600dp",
57
+ "text": "Les destinations sont des données. Les fenêtres compactes ont la barre de navigation de 64dp ; les plus larges le rail, chaque onglet gardant son historique."
58
+ },
59
+ "sqlite": {
60
+ "title": "SQLite",
61
+ "subtitle": "Kysely, hors ligne d'abord",
62
+ "text": "SQLite compilé en WebAssembly, dans un worker, sur un vrai fichier OPFS - sans plugin natif."
63
+ },
64
+ "reactive": {
65
+ "title": "Requêtes réactives",
66
+ "subtitle": "Aucune invalidation manuelle",
67
+ "text": "Une écriture annonce ses tables et chaque requête qui en écoute une se recharge, avec anti-rebond."
68
+ },
69
+ "back": {
70
+ "title": "Retour Android",
71
+ "subtitle": "Ferme d'abord la couche du dessus",
72
+ "text": "Retour ferme la feuille, la boîte de dialogue ou le menu du dessus, puis remonte l'historique de l'onglet, puis revient à la destination de départ."
73
+ },
74
+ "keyboard": {
75
+ "title": "Clavier",
76
+ "subtitle": "Les champs restent visibles",
77
+ "text": "Le champ actif revient à l'écran à chaque phase de l'animation du clavier, et la barre de navigation s'efface."
78
+ },
79
+ "metrics": {
80
+ "title": "Métriques des requêtes",
81
+ "subtitle": "Durées, rechargements, cache",
82
+ "text": "Chaque requête est mesurée. Ouvrez la feuille des métriques depuis Commandes pour voir ce qui s'est rechargé et pourquoi."
83
+ }
84
+ },
85
+ "demo": {
86
+ "title": "Commandes",
87
+ "clear": "Réinitialiser les données",
88
+ "refetching": "Actualisation",
89
+ "empty": "Générez des données d'exemple, ou créez une commande avec le bouton.",
90
+ "pipelining": "Lectures en parallèle",
91
+ "measure": "Mesurer",
92
+ "measuring": "Mesure…",
93
+ "parallel": "Ensemble",
94
+ "sequential": "Une par une",
95
+ "ratio": "Plus rapide de",
96
+ "pipeliningNative": "{count} lectures lancées ensemble, puis les mêmes {count} attendues une par une. Le moteur tourne dans un worker qui exécute les requêtes une à la fois : les lancer ensemble ne recouvre que les allers-retours de messages.",
97
+ "pipeliningWeb": "{count} lectures lancées ensemble, puis les mêmes {count} attendues une par une. Dans un navigateur de bureau l'aller-retour est quasi gratuit - voir la note sous le résultat.",
98
+ "ratioNative": "Au-dessus de 1x, les allers-retours de messages se recouvrent. Le worker est séquentiel : ce test ne montrera jamais des requêtes exécutées en parallèle.",
99
+ "ratioWeb": "Attendu sur {platform} : le worker est séquentiel et l'aller-retour de bureau est quasi gratuit, il n'y a donc presque rien à recouvrir. Mesurez sur un appareil.",
100
+ "data": "Données",
101
+ "diagnostics": "Diagnostics",
102
+ "searchPlaceholder": "Chercher une commande ou un client",
103
+ "orders": "Commandes",
104
+ "lines": "{count} ligne | {count} lignes",
105
+ "seed": "Générer des données",
106
+ "tiles": {
107
+ "draft": "Brouillon",
108
+ "confirmed": "Confirmées",
109
+ "delivered": "Livrées",
110
+ "committed": "Engagé",
111
+ "ofOrders": "sur {count} commande | sur {count} commandes",
112
+ "ofTotal": "sur {total} au total"
113
+ },
114
+ "bus": "Bus de changements",
115
+ "busHint": "Chaque événement publié par une écriture. Les requêtes écoutent le même flux.",
116
+ "busEmpty": "Aucun événement.",
117
+ "newOrder": "Nouvelle commande",
118
+ "reference": "Référence",
119
+ "customer": "Client",
120
+ "products": "Produits",
121
+ "total": "Total",
122
+ "save": "Enregistrer",
123
+ "cancel": "Annuler",
124
+ "confirm": "Confirmer",
125
+ "deliver": "Marquer livrée",
126
+ "delete": "Supprimer",
127
+ "noMatches": "Aucun résultat.",
128
+ "order": "Commande",
129
+ "orderGone": "Cette commande n'existe plus.",
130
+ "lineItems": "Lignes",
131
+ "searchTitle": "Rechercher",
132
+ "statusDraft": "Brouillon",
133
+ "statusConfirmed": "Confirmée",
134
+ "statusDelivered": "Livrée",
135
+ "deleteConfirm": "Supprimer cette commande et ses lignes ?",
136
+ "allOrders": "Commandes récentes",
137
+ "matches": "{count} résultat | {count} résultats",
138
+ "engineSwitch": "Un seul moteur partout - aucun pont à paralléliser",
139
+ "measuredOn": "Mesuré sur {engine}",
140
+ "emptyTitle": "Aucune commande",
141
+ "actions": "Actions sur les commandes",
142
+ "actionsFor": "Actions pour {reference}",
143
+ "chooseCustomer": "Choisir un client",
144
+ "less": "Un {product} de moins",
145
+ "more": "Un {product} de plus",
146
+ "loadFailed": "Le formulaire n'a pas pu se charger.",
147
+ "saveFailed": "La commande n'a pas été enregistrée. Réessayez.",
148
+ "actionFailed": "Cela n'a pas fonctionné. Rien n'a changé.",
149
+ "saved": "{reference} enregistrée",
150
+ "deleted": "{reference} supprimée",
151
+ "clearTitle": "Réinitialiser les données ?",
152
+ "clearText": "Toutes les commandes sont supprimées. Clients et produits sont recréés.",
153
+ "noMatchesTitle": "Aucun résultat",
154
+ "status": "Statut de la commande"
155
+ },
156
+ "metrics": {
157
+ "totalQueries": "Requêtes exécutées",
158
+ "avgQueryTime": "Durée moyenne",
159
+ "cacheHitRate": "Taux de cache",
160
+ "activeListeners": "Écouteurs actifs",
161
+ "title": "Métriques des requêtes",
162
+ "refetchesTitle": "Rechargements par table",
163
+ "noRefetches": "Aucun rechargement.",
164
+ "slowest": "Requêtes les plus lentes",
165
+ "noQueries": "Aucune requête enregistrée.",
166
+ "calls": "{count} appel | {count} appels",
167
+ "reset": "Réinitialiser"
168
+ },
169
+ "bench": {
170
+ "title": "Benchmark",
171
+ "intro": "Chaque opération qu'un écran de cette application effectue, exécutée sur les deux tables propres au benchmark : vos données ne sont jamais touchées. Changez de moteur dans Réglages et relancez - la seconde exécution est comparée à la première.",
172
+ "run": "Lancer le benchmark",
173
+ "running": "En cours",
174
+ "against": "vs {engine}",
175
+ "cases": "Cas",
176
+ "rows": "Lignes créées",
177
+ "wall": "Durée totale",
178
+ "worst": "pire",
179
+ "faster": "{times}x plus rapide ici",
180
+ "slower": "{times}x plus lent ici",
181
+ "copy": "Copier le JSON",
182
+ "clear": "Effacer les résultats",
183
+ "copied": "Copié",
184
+ "copyFailed": "Presse-papiers inaccessible.",
185
+ "group": {
186
+ "read": "Lectures",
187
+ "join": "Jointures",
188
+ "write": "Écritures",
189
+ "transaction": "Transactions",
190
+ "schema": "Schéma",
191
+ "concurrency": "Concurrence",
192
+ "sync": "Stratégies de synchro"
193
+ },
194
+ "pragmas": "PRAGMA {profile}",
195
+ "seeded": "Jeu de données construit en {ms} ms - réutilisé ensuite"
196
+ },
197
+ "gallery": {
198
+ "title": "Galerie",
199
+ "intro": "Chaque composant Material 3 Expressive de ce kit, en direct, avec le point de spec qu'il illustre.",
200
+ "loading": "Chargement",
201
+ "sections": {
202
+ "buttons": {
203
+ "title": "Boutons",
204
+ "subtitle": "Cinq tailles, morphose, bascules, groupes"
205
+ },
206
+ "fabs": {
207
+ "title": "Boutons d'action flottants",
208
+ "subtitle": "FAB, FAB étendu, menu FAB"
209
+ },
210
+ "progress": {
211
+ "title": "Progression et chargement",
212
+ "subtitle": "Indicateurs ondulés, chargeur à formes"
213
+ },
214
+ "shapes": {
215
+ "title": "Formes",
216
+ "subtitle": "La bibliothèque de 35 formes et la morphose"
217
+ },
218
+ "navigation": {
219
+ "title": "Navigation",
220
+ "subtitle": "Onglets, barre de navigation, barres d'outils"
221
+ },
222
+ "overlays": {
223
+ "title": "Feuilles et dialogues",
224
+ "subtitle": "Feuille, feuille d'actions, menu, snackbar"
225
+ },
226
+ "selection": {
227
+ "title": "Sélection",
228
+ "subtitle": "Interrupteurs, cases, curseurs, puces"
229
+ },
230
+ "inputs": {
231
+ "title": "Saisie",
232
+ "subtitle": "Champs et barre de recherche"
233
+ },
234
+ "carousels": {
235
+ "title": "Carrousels",
236
+ "subtitle": "Multi-navigation, héros, libre, visionneuse"
237
+ },
238
+ "surfaces": {
239
+ "title": "Cartes et listes",
240
+ "subtitle": "Surfaces et listes expressives"
241
+ },
242
+ "pickers": {
243
+ "title": "Date et heure",
244
+ "subtitle": "Dates, heures, roues - dialogue ou feuille"
245
+ },
246
+ "scale": {
247
+ "title": "Listes à grande échelle",
248
+ "subtitle": "5 000 lignes, tirer pour actualiser"
249
+ },
250
+ "tabs": {
251
+ "title": "Onglets glissants",
252
+ "subtitle": "Des pages sous la barre, à faire glisser"
253
+ },
254
+ "contacts": {
255
+ "title": "Liste groupée et index",
256
+ "subtitle": "Titres de groupe collants, un rail A–Z"
257
+ },
258
+ "tables": {
259
+ "title": "Tableau de données",
260
+ "subtitle": "Tri, sélection, en-tête et colonne fixes"
261
+ },
262
+ "charts": {
263
+ "title": "Graphiques",
264
+ "subtitle": "Courbe, aire, barres et anneau"
265
+ },
266
+ "chat": {
267
+ "title": "Messages",
268
+ "subtitle": "Bulles, historique et zone de saisie"
269
+ },
270
+ "onboarding": {
271
+ "title": "Accueil",
272
+ "subtitle": "Un pager avec ses points"
273
+ },
274
+ "login": {
275
+ "title": "Écran de connexion",
276
+ "subtitle": "Validation et e-mail mémorisé"
277
+ },
278
+ "agenda": {
279
+ "title": "Agenda",
280
+ "subtitle": "La tournée en vue jour, semaine et mois"
281
+ }
282
+ },
283
+ "buttons": {
284
+ "variants": "Variantes",
285
+ "variantsNote": "Plein pour l'action principale, tonal et contour en dessous, texte pour la moindre.",
286
+ "sizes": "Tailles",
287
+ "sizesNote": "De XS à XL, rond ou carré. Appuyez : les coins se resserrent sur le ressort d'effets, sans rebond.",
288
+ "toggle": "Boutons bascule",
289
+ "toggleNote": "Un bouton rond sélectionné devient carré ; un carré devient rond.",
290
+ "save": "Enregistrer",
291
+ "star": "Favori",
292
+ "icon": "Boutons icône",
293
+ "iconNote": "Standard, plein, tonal, contour ; étroit, normal et large.",
294
+ "favorite": "Favori",
295
+ "share": "Partager",
296
+ "edit": "Modifier",
297
+ "more": "Plus",
298
+ "group": "Groupe de boutons standard",
299
+ "groupNote": "Maintenez-en un : il s'élargit de 15 % et ses voisins lui cèdent la place.",
300
+ "bold": "Gras",
301
+ "italic": "Italique",
302
+ "underline": "Souligné",
303
+ "connected": "Groupe de boutons connectés",
304
+ "connectedNote": "Remplace les boutons segmentés : 2dp d'écart, le sélectionné s'arrondit entièrement.",
305
+ "periods": {
306
+ "day": "Jour",
307
+ "week": "Semaine",
308
+ "month": "Mois"
309
+ },
310
+ "split": "Bouton scindé",
311
+ "splitNote": "Une action principale et ses voisines ; la moitié droite s'arrondit quand son menu est ouvert.",
312
+ "send": "Envoyer",
313
+ "moreOptions": "Autres options d'envoi",
314
+ "schedule": "Programmer l'envoi",
315
+ "saveDraft": "Enregistrer en brouillon",
316
+ "sent": "Fait"
317
+ },
318
+ "fabs": {
319
+ "sizes": "Tailles",
320
+ "sizesNote": "Petit, standard, moyen (nouveau dans Expressive) et grand.",
321
+ "colors": "Couleurs",
322
+ "colorsNote": "Couleurs de conteneur par défaut ; les rôles pleins pour plus d'emphase.",
323
+ "extended": "FAB étendu",
324
+ "extendedNote": "Touchez-le : le libellé se replie puis revient sur le ressort spatial.",
325
+ "compose": "Rédiger",
326
+ "menu": "Menu FAB",
327
+ "menuNote": "Jusqu'à six actions jaillissent du coin du FAB, en décalé ; il devient un bouton de fermeture.",
328
+ "create": "Créer",
329
+ "order": "Commande",
330
+ "customer": "Client",
331
+ "note": "Note",
332
+ "picked": "Choisi"
333
+ },
334
+ "progress": {
335
+ "drive": "Progression",
336
+ "driveNote": "Faites glisser pour piloter les indicateurs ci-dessous. L'onde s'aplatit sous 10 % et au-dessus de 95 %.",
337
+ "loading": "Indicateur de chargement",
338
+ "loadingNote": "Sept formes qui se transforment en boucle, pour les attentes de quelques secondes. Il remplace le spinner.",
339
+ "determinate": "Déterminé",
340
+ "indeterminate": "Indéterminé",
341
+ "flat": "Plat",
342
+ "thick": "Épais",
343
+ "gauge": "Jauge",
344
+ "linear": "Linéaire",
345
+ "linearNote": "Ondulé, indéterminé, plat et épais. Un espace et un point marquent la fin de la piste.",
346
+ "circular": "Circulaire",
347
+ "circularNote": "Ondulé 48dp ou plat 40dp, et la jauge en demi-anneau.",
348
+ "skeleton": "Chargement squelette",
349
+ "skeletonNote": "Les espaces réservés de Framework7 aux couleurs Material : la mise en page de ce qui arrive, balayée d'un seul reflet.",
350
+ "reload": "Recharger",
351
+ "wave": "Vague",
352
+ "pulse": "Pulsation",
353
+ "loadingCustomers": "Chargement des clients",
354
+ "customer": "Client {n}",
355
+ "customerNote": "{count} commandes en cours"
356
+ },
357
+ "shapes": {
358
+ "morph": "Morphose",
359
+ "morphNote": "Choisissez une forme ci-dessous : celle-ci s'y transforme sur le ressort spatial par défaut.",
360
+ "library": "La bibliothèque",
361
+ "libraryNote": "Les 35, construites avec les mêmes sommets et arrondis que MaterialShapes d'Android."
362
+ },
363
+ "navigation": {
364
+ "primaryTabs": "Onglets principaux",
365
+ "primaryTabsNote": "Un indicateur de 3dp de la largeur du contenu, qui bondit d'un onglet à l'autre.",
366
+ "flights": "Vols",
367
+ "trips": "Voyages",
368
+ "explore": "Explorer",
369
+ "secondaryTabs": "Onglets secondaires",
370
+ "secondaryTabsNote": "Défilants, avec un indicateur de 2dp sur toute la largeur.",
371
+ "months": {
372
+ "jan": "Janvier",
373
+ "feb": "Février",
374
+ "mar": "Mars",
375
+ "apr": "Avril",
376
+ "may": "Mai",
377
+ "jun": "Juin",
378
+ "jul": "Juillet",
379
+ "aug": "Août"
380
+ },
381
+ "bar": "Barre de navigation",
382
+ "barNote": "La barre flexible de 64dp : l'indicateur s'ouvre en ressort, l'icône se remplit, les badges comptent ou pointent.",
383
+ "inbox": "Boîte",
384
+ "starred": "Favoris",
385
+ "saved": "Enregistrés",
386
+ "toolbar": "Barre d'outils flottante",
387
+ "toolbarNote": "Remplace la barre d'application du bas ; standard ou vive, avec un FAB associé.",
388
+ "vibrant": "Couleurs vives",
389
+ "breadcrumbs": "Fil d'Ariane",
390
+ "breadcrumbsNote": "Où vous êtes dans une hiérarchie ; chaque niveau permet de remonter. Au-delà de quatre niveaux, le milieu se replie dans un menu.",
391
+ "moreLevels": "Afficher les niveaux masqués",
392
+ "deeper": "Descendre",
393
+ "top": "Revenir en haut",
394
+ "levels": {
395
+ "catalogue": "Catalogue",
396
+ "beverages": "Boissons",
397
+ "juices": "Jus",
398
+ "brand": "Ramy",
399
+ "orange": "Orange 1 L",
400
+ "pack": "Pack de 6"
401
+ }
402
+ },
403
+ "overlays": {
404
+ "sheet": "Feuilles du bas",
405
+ "sheetNote": "Tirez la poignée, ou le contenu remonté en haut : un geste vif ou la moitié de la hauteur ferme.",
406
+ "openSheet": "Ouvrir une feuille",
407
+ "standard": "Feuille standard",
408
+ "standardNote": "À côté du contenu, pas par-dessus : aperçu, moitié et plein écran. Tirez-la n'importe où tant qu'elle n'est pas ouverte, puis la liste défile ; tirez vers le bas depuis le haut de la liste pour la redescendre.",
409
+ "showStandard": "Afficher la feuille",
410
+ "hideStandard": "Masquer la feuille",
411
+ "nearby": "Livraisons à proximité",
412
+ "stop": "Arrêt {n}",
413
+ "stopNote": "À {minutes} min",
414
+ "expandSheet": "Agrandir la feuille",
415
+ "collapseSheet": "Réduire la feuille",
416
+ "openActions": "Feuille d'actions",
417
+ "sheetTitle": "Douze lignes",
418
+ "sheetText": "Faites défiler jusqu'en bas, puis tirez depuis le haut pour fermer.",
419
+ "row": "Ligne {n}",
420
+ "done": "Terminé",
421
+ "actionsTitle": "Photo",
422
+ "actionsText": "Prise ce matin",
423
+ "copy": "Copier",
424
+ "delete": "Supprimer",
425
+ "deleteNote": "Retirée de tous les appareils",
426
+ "chose": "Choix : {choice}",
427
+ "dialog": "Dialogues",
428
+ "dialogNote": "Pour les décisions à ne pas manquer. Une icône centrale centre le titre.",
429
+ "openDialog": "Supprimer quelque chose",
430
+ "dialogTitle": "Supprimer cette photo ?",
431
+ "dialogText": "Elle est retirée de tous les appareils connectés à ce compte.",
432
+ "cancel": "Annuler",
433
+ "deleted": "Supprimée",
434
+ "kept": "Conservée",
435
+ "menu": "Menus",
436
+ "menuNote": "Menus expressifs en segments ; l'élément choisi prend le conteneur tertiaire, et Grouper par ouvre un sous-menu.",
437
+ "groupBy": "Grouper par",
438
+ "groups": {
439
+ "none": "Aucun",
440
+ "customer": "Client",
441
+ "status": "Statut"
442
+ },
443
+ "sort": "Trier par",
444
+ "sortBy": "Tri : {order}",
445
+ "orders": {
446
+ "recent": "Plus récents",
447
+ "name": "Nom",
448
+ "amount": "Montant"
449
+ },
450
+ "reset": "Réinitialiser le tri",
451
+ "snackbar": "Snackbar",
452
+ "snackbarNote": "Un retour bref avec une action ; il patiente tant qu'on le touche.",
453
+ "archive": "Archiver",
454
+ "archived": "Conversation archivée",
455
+ "undo": "Annuler",
456
+ "restored": "Restaurée",
457
+ "side": "Feuilles latérales et rail modal",
458
+ "sideNote": "Les filtres glissent depuis le bord de fin ; la navigation depuis le bord de début, et se ferme dès le choix.",
459
+ "openSide": "Filtres",
460
+ "openRail": "Navigation",
461
+ "filters": "Filtres",
462
+ "tooltips": "Info-bulles",
463
+ "tooltipsNote": "Appui long sur l'icône pour son libellé ; touchez le bouton texte pour une info-bulle riche.",
464
+ "richTitle": "Couleur de base",
465
+ "richText": "Toutes les couleurs de l'app sont générées à partir de celle-ci, en clair et en sombre.",
466
+ "whatsThis": "Qu'est-ce que c'est ?",
467
+ "gotIt": "Compris",
468
+ "notification": "Notification dans l'app",
469
+ "notificationNote": "La notification de Framework7 : elle arrive du haut, s'ouvre d'un appui, s'envole d'un glissement latéral ou vers le haut, et se met en pause sous le doigt. Plusieurs s'empilent, la plus récente devant - touchez la pastille pour les déplier.",
470
+ "notifyOrder": "Nouvelle commande",
471
+ "notifySync": "Synchro terminée",
472
+ "ordersSource": "Commandes",
473
+ "syncSource": "Synchro",
474
+ "now": "maintenant",
475
+ "orderTitle": "Nouvelle commande d'Oran Market",
476
+ "orderText": "SO-1024 · 12 lignes · 48 300 DA, à livrer demain matin.",
477
+ "orderOpened": "SO-1024 ouverte",
478
+ "syncTitle": "Tout est à jour",
479
+ "fullscreen": "Dialogue plein écran",
480
+ "fullscreenNote": "La popup de Framework7 pour une tâche qui demande tout l'écran. Enregistrer attend un nom ; fermer avec des changements demande avant de les abandonner. À partir de 600dp, il devient un dialogue simple.",
481
+ "newCustomer": "Nouveau client",
482
+ "save": "Enregistrer",
483
+ "customerName": "Nom du client",
484
+ "phone": "Téléphone",
485
+ "note": "Note de livraison",
486
+ "discardTitle": "Abandonner ce client ?",
487
+ "discardText": "Ce que vous avez saisi sera perdu.",
488
+ "discard": "Abandonner",
489
+ "keepEditing": "Continuer",
490
+ "customerSaved": "{name} enregistré",
491
+ "popover": "Popover",
492
+ "popoverNote": "Ancré à ce qui l'ouvre, il en jaillit et se ferme d'un appui ailleurs, avec Échap ou retour.",
493
+ "cases": "{n} cartons",
494
+ "quantity": "Quantité",
495
+ "quantityNote": "Prix palette dès 24 cartons.",
496
+ "draftRestored": "Votre brouillon non enregistré a été restauré.",
497
+ "notifyBurst": "Trois d'un coup",
498
+ "burstTitle": "Nouvelle commande de {shop}",
499
+ "burstText": "Synchronisée depuis le terrain à l'instant."
500
+ },
501
+ "selection": {
502
+ "stepper": "Compteur",
503
+ "stepperNote": "Le compteur de Framework7 : maintenez un bouton pour répéter - sur une large plage, il accélère. Touchez la valeur pour la saisir ; les flèches avancent d'un pas.",
504
+ "guests": "Invités",
505
+ "weight": "Poids",
506
+ "units": "Unités",
507
+ "kilos": "{value} kg",
508
+ "decrease": "Diminuer",
509
+ "increase": "Augmenter",
510
+ "switches": "Interrupteurs",
511
+ "switchesNote": "La poignée grandit une fois activée et se déplace sur le ressort spatial rapide.",
512
+ "wifi": "Wi-Fi",
513
+ "bluetooth": "Bluetooth",
514
+ "airplane": "Mode avion",
515
+ "locked": "Verrouillé par la stratégie",
516
+ "checks": "Cases et boutons radio",
517
+ "checksNote": "La coche se dessine ; le point radio bondit.",
518
+ "terms": "Accepter les conditions",
519
+ "partial": "Sélection partielle",
520
+ "required": "Obligatoire",
521
+ "cups": {
522
+ "small": "Petit",
523
+ "medium": "Moyen",
524
+ "large": "Grand"
525
+ },
526
+ "sliders": "Curseurs",
527
+ "slidersNote": "Une poignée fine coupe la piste ; tailles XS à XL, avec graduations et icône intégrée.",
528
+ "volume": "Volume",
529
+ "steps": "Étapes",
530
+ "brightness": "Luminosité",
531
+ "chips": "Puces",
532
+ "chipsNote": "Les puces de filtre basculent avec une coche ; les puces de saisie se retirent.",
533
+ "filters": {
534
+ "open": "Ouvert",
535
+ "nearby": "À proximité",
536
+ "rated": "Mieux notés"
537
+ },
538
+ "addEvent": "Ajouter à l'agenda",
539
+ "remove": "Retirer",
540
+ "range": "Curseur de plage",
541
+ "rangeNote": "Deux poignées ; un appui déplace la plus proche. Les prix restent à 1 000 d’écart ; les heures s’aimantent aux graduations.",
542
+ "priceFrom": "Prix minimum",
543
+ "priceTo": "Prix maximum",
544
+ "opensAt": "Ouvre à",
545
+ "closesAt": "Ferme à",
546
+ "smart": "Sélection intelligente",
547
+ "smartNote": "La sélection intelligente de Framework7 : une ligne qui nomme le choix ouvre une feuille d'options - plusieurs avec des coches et Terminé, une seule avec des boutons radio qui se ferme d'elle-même. Les longues listes ont un champ de recherche.",
548
+ "deliveryDays": "Jours de livraison",
549
+ "none": "Aucun",
550
+ "done": "Terminé",
551
+ "searchWilaya": "Rechercher une wilaya",
552
+ "days": {
553
+ "sat": "Samedi",
554
+ "sun": "Dimanche",
555
+ "mon": "Lundi",
556
+ "tue": "Mardi",
557
+ "wed": "Mercredi",
558
+ "thu": "Jeudi",
559
+ "fri": "Vendredi"
560
+ }
561
+ },
562
+ "inputs": {
563
+ "search": "Barre de recherche",
564
+ "searchNote": "Une pilule de 56dp sur surface-container-high.",
565
+ "searchPlaceholder": "Rechercher des messages",
566
+ "clear": "Effacer",
567
+ "voice": "Recherche vocale",
568
+ "filled": "Champs remplis",
569
+ "filledNote": "Le libellé remonte ; les erreurs remplacent le texte d'aide.",
570
+ "name": "Nom complet",
571
+ "nameHint": "Tel qu'il apparaît sur la facture",
572
+ "amount": "Montant",
573
+ "amountInvalid": "Saisissez un nombre avec au plus deux décimales",
574
+ "outlined": "Champs à contour",
575
+ "outlinedNote": "Pour les formulaires denses ; le libellé entaille le contour.",
576
+ "email": "E-mail",
577
+ "note": "Note de livraison",
578
+ "searchView": "Vue de recherche",
579
+ "searchViewNote": "La barre s’ouvre en vue plein écran sur un seul ressort : recherches récentes d’abord, puis résultats à la frappe. Retour la ferme.",
580
+ "searchCustomers": "Rechercher des clients",
581
+ "noMatches": "Aucun client ne correspond",
582
+ "dropdown": "Menu déroulant",
583
+ "dropdownNote": "Une liste de choix, et l'autocomplétion de Framework7 : tapez pour filtrer les 58 wilayas - accents et casse n'y font rien - sans quitter le champ.",
584
+ "status": "Statut",
585
+ "statuses": {
586
+ "draft": "Brouillon",
587
+ "confirmed": "Confirmée",
588
+ "delivered": "Livrée",
589
+ "cancelled": "Annulée"
590
+ },
591
+ "wilaya": "Wilaya",
592
+ "wilayaHint": "Essayez « bej » ou « setif »",
593
+ "results": "Aucun résultat | {count} résultat | {count} résultats",
594
+ "richText": "Texte enrichi",
595
+ "richTextNote": "Gras, listes et liens pour un compte rendu de visite. Ce qui est enregistré est du HTML nettoyé : scripts et styles collés n'entrent jamais.",
596
+ "report": "Compte rendu de visite",
597
+ "reportPlaceholder": "Ce qui s'est passé lors de cette visite",
598
+ "linkAddress": "Adresse du lien",
599
+ "apply": "Appliquer",
600
+ "removeLink": "Retirer le lien",
601
+ "invalidLink": "Utilisez une adresse web, e-mail ou téléphone",
602
+ "stored": "{n} caractères de HTML enregistrés",
603
+ "commands": {
604
+ "bold": "Gras",
605
+ "italic": "Italique",
606
+ "underline": "Souligné",
607
+ "strikeThrough": "Barré",
608
+ "bulleted": "Liste à puces",
609
+ "numbered": "Liste numérotée",
610
+ "link": "Lien",
611
+ "clear": "Effacer la mise en forme"
612
+ },
613
+ "signature": "Signature",
614
+ "signatureNote": "Preuve de livraison : un trait qui s'épaissit lentement, gardé en brouillon, exporté en PNG. Un nom saisi l'accompagne pour qui ne peut pas signer à l'écran.",
615
+ "signatureLabel": "Signature du client",
616
+ "signHere": "Signez ici",
617
+ "undo": "Annuler",
618
+ "clearSignature": "Effacer",
619
+ "receivedBy": "Reçu par",
620
+ "receivedByNote": "Le nom de la personne qui a signé",
621
+ "confirmDelivery": "Confirmer la livraison",
622
+ "exported": "La signature exportée",
623
+ "delivered": "Livraison confirmée par {name}",
624
+ "account": "Informations du compte",
625
+ "accountNote": "Afficher le mot de passe, voir sa robustesse, et un numéro groupé pendant la saisie - quel que soit le préfixe tapé.",
626
+ "password": "Mot de passe",
627
+ "showPassword": "Afficher le mot de passe",
628
+ "hidePassword": "Masquer le mot de passe",
629
+ "strength": {
630
+ "weak": "Faible",
631
+ "fair": "Moyen",
632
+ "good": "Bon",
633
+ "strong": "Robuste"
634
+ },
635
+ "phone": "Numéro de mobile",
636
+ "phoneHint": "Commence par 5, 6 ou 7",
637
+ "phoneInvalid": "Ce n'est pas un numéro de mobile",
638
+ "phoneShort": "Neuf chiffres après +213",
639
+ "verification": "Code de vérification",
640
+ "verificationNote": "Un seul vrai champ sous les cases : le code SMS proposé par le clavier, un message collé ou des chiffres arabes le remplissent. Le code de démo est {code}.",
641
+ "codeLabel": "Code de vérification",
642
+ "codeSent": "Envoyé au +213 5 55 •• •• 56",
643
+ "codeWrong": "Ce code ne correspond pas",
644
+ "codeVerified": "Numéro vérifié",
645
+ "codeAgain": "Recommencer",
646
+ "resend": "Renvoyer le code",
647
+ "resendIn": "Renvoyer dans {s} s",
648
+ "codeResent": "Un nouveau code arrive",
649
+ "tags": "Étiquettes client",
650
+ "tagsNote": "Tapez puis Entrée ou une virgule, ou collez une liste. Retour arrière marque une étiquette avant de la retirer ; un doublon fait clignoter celle qui existe.",
651
+ "tagsLabel": "Étiquettes",
652
+ "tagsPlaceholder": "Ajouter une étiquette",
653
+ "tagsHint": "2 à 24 caractères",
654
+ "removeTag": "Retirer {tag}",
655
+ "suggested": "Étiquettes suggérées",
656
+ "suggestedTags": {
657
+ "nightDelivery": "Livraison de nuit",
658
+ "pharmacy": "Pharmacie",
659
+ "cashOnly": "Espèces uniquement",
660
+ "keyAccount": "Grand compte"
661
+ }
662
+ },
663
+ "carousels": {
664
+ "multiBrowse": "Multi-navigation",
665
+ "multiBrowseNote": "De grands éléments et de plus petits qui dépassent : chacun se compresse vers le bord et son image glisse sous le masque. Un geste vif porte aussi loin qu'il va et s'aligne sur un élément.",
666
+ "hero": "Héros",
667
+ "heroNote": "Un élément mis en avant entre deux petits, centré dès qu'on quitte le premier. Un geste vif avance d'un élément.",
668
+ "featured": "En avant : {place}",
669
+ "uncontained": "Libre",
670
+ "uncontainedNote": "Des éléments de largeur fixe qui glissent librement ; seul celui qui sort par le bord se compresse.",
671
+ "slide": "{n} sur {count}",
672
+ "places": {
673
+ "mountains": "Montagnes",
674
+ "forest": "Forêt",
675
+ "coast": "Côte",
676
+ "city": "Ville",
677
+ "harbour": "Port",
678
+ "trail": "Sentier",
679
+ "park": "Parc",
680
+ "cafe": "Café"
681
+ },
682
+ "photos": "Visionneuse de photos",
683
+ "photosNote": "La visionneuse de Framework7 : glissez d'une photo à l'autre, pincez ou touchez deux fois pour zoomer, déplacez une photo agrandie, glissez vers le haut ou le bas pour fermer. Un toucher masque la barre.",
684
+ "counter": "{position} sur {count}",
685
+ "scenes": {
686
+ "mountains": "Montagnes à l'aube",
687
+ "coast": "La côte, en portrait",
688
+ "dunes": "Dunes, panorama",
689
+ "city": "Silhouette de la ville",
690
+ "forest": "Forêt de pins",
691
+ "harbour": "Port au crépuscule"
692
+ },
693
+ "lazy": "Images différées",
694
+ "lazyNote": "Place réservée avant le chargement, une couleur d'attente, un fondu une fois décodée, et un échec qui garde sa description.",
695
+ "missing": "Une photo qui n'a pas pu se charger"
696
+ },
697
+ "surfaces": {
698
+ "cards": "Cartes",
699
+ "cardsNote": "Surélevée, remplie et à contour ; une carte entière peut être une cible.",
700
+ "containerTransform": "Transformation de conteneur",
701
+ "containerTransformNote": "Une carte qui mène à sa page : touchez-la et elle s'y déploie, couleur et coins compris ; le retour referme la page dans la même carte.",
702
+ "cardText": "Touchez pour ouvrir",
703
+ "tapped": "Carte {variant} ouverte",
704
+ "segmented": "Liste segmentée",
705
+ "items": {
706
+ "inbox": {
707
+ "title": "Boîte de réception",
708
+ "text": "12 non lus"
709
+ },
710
+ "drafts": {
711
+ "title": "Brouillons",
712
+ "text": "3 enregistrés"
713
+ },
714
+ "archive": {
715
+ "title": "Archives",
716
+ "text": "Tout ce que vous avez rangé"
717
+ }
718
+ },
719
+ "standard": "Liste standard",
720
+ "wifi": "Wi-Fi",
721
+ "wifiText": "Connecté à Bureau",
722
+ "storage": "Stockage utilisé",
723
+ "accordion": "Éléments dépliables",
724
+ "accordionNote": "La liste accordéon de Framework7 : un seul élément ouvert à la fois, qui sort de la série en carte à part.",
725
+ "faq": {
726
+ "offline": {
727
+ "q": "Ça marche hors ligne ?",
728
+ "a": "Oui. Chaque écran lit la base de l'appareil : une connexion perdue ne change rien à ce que vous voyez."
729
+ },
730
+ "sync": {
731
+ "q": "Quand mes données se synchronisent-elles ?",
732
+ "a": "Ce modèle n'a pas de serveur. Ajoutez-en un et il synchronise vers la base locale ; les écrans ne lisent que la copie locale."
733
+ },
734
+ "storage": {
735
+ "q": "Où la base est-elle stockée ?",
736
+ "a": "Dans le stockage privé de l'app, via SQLite compilé en WebAssembly - le même moteur dans le navigateur et sur le téléphone."
737
+ },
738
+ "export": {
739
+ "q": "Puis-je exporter mes commandes ?",
740
+ "a": "Pas encore dans le modèle - une fonction de dépôt sur la table des commandes suffit."
741
+ }
742
+ },
743
+ "sortable": "Liste triable",
744
+ "sortableNote": "La liste triable de Framework7 : tirez une poignée, ou appuyez longuement sur un arrêt puis faites-le glisser. Les autres s'écartent et la page défile près de ses bords.",
745
+ "reorder": "Réordonner",
746
+ "moved": "{label}, position {position} sur {count}",
747
+ "stopOrder": "Arrêt {n}",
748
+ "stops": {
749
+ "warehouse": "Entrepôt central",
750
+ "market": "Oran Market",
751
+ "pharmacy": "Pharmacie El Hayat",
752
+ "school": "École Ibn Khaldoun",
753
+ "bakery": "Boulangerie Sidi El Houari"
754
+ },
755
+ "timeline": "Chronologie",
756
+ "tracking": "Suivi de SO-1024",
757
+ "states": {
758
+ "done": "fait",
759
+ "current": "en cours",
760
+ "upcoming": "à venir"
761
+ },
762
+ "steps": {
763
+ "placed": {
764
+ "title": "Commande passée",
765
+ "text": "Oran Market, 12 lignes"
766
+ },
767
+ "confirmed": {
768
+ "title": "Confirmée",
769
+ "text": "Stock réservé à l'entrepôt central"
770
+ },
771
+ "picked": {
772
+ "title": "Préparée et emballée",
773
+ "text": "3 caisses, 1 palette"
774
+ },
775
+ "transit": {
776
+ "title": "En livraison",
777
+ "text": "Chauffeur Karim, à environ 40 minutes"
778
+ },
779
+ "delivered": {
780
+ "title": "Livrée",
781
+ "text": "Signature à la livraison"
782
+ }
783
+ },
784
+ "infinite": "Défilement infini",
785
+ "infiniteNote": "Le défilement infini de Framework7 : la page suivante se charge à l'approche de la fin. La troisième échoue une fois exprès - réessayez-la.",
786
+ "page": "Page {n}",
787
+ "loadingMore": "Chargement d'autres commandes",
788
+ "loadFailed": "Impossible de charger plus de commandes",
789
+ "retry": "Réessayer",
790
+ "allLoaded": "Ce sont toutes les commandes"
791
+ },
792
+ "pickers": {
793
+ "modal": "Sélecteur de date modal",
794
+ "modalNote": "Calendrier ou saisie dans l'ordre de votre langue ; rien n'est gardé avant OK.",
795
+ "pick": "Choisir une date",
796
+ "selectDate": "Choisir une date",
797
+ "ok": "OK",
798
+ "typeDate": "Saisir une date",
799
+ "useCalendar": "Utiliser le calendrier",
800
+ "invalid": "Date invalide",
801
+ "docked": "Calendrier intégré",
802
+ "dockedNote": "À partir d'aujourd'hui, dimanches fermés. Flèches, Page préc. et Page suiv. pour s'y déplacer.",
803
+ "range": "Plage de dates",
804
+ "rangeNote": "Touchez un début puis une fin ; les jours entre les deux prennent la bande.",
805
+ "sheet": "Sélecteur de date en feuille",
806
+ "sheetNote": "À la Framework7 : depuis le bas, à portée de pouce. Basculez entre le calendrier et la roue.",
807
+ "useWheel": "Utiliser la roue",
808
+ "time": "Sélecteur d'heure",
809
+ "timeNote": "Cadran ou clavier ; l'horloge suit les 12 ou 24 h de votre langue.",
810
+ "timeSheet": "Sélecteur d'heure en feuille",
811
+ "timeSheetNote": "Cadran ou roue, par quarts d'heure.",
812
+ "pickTime": "Choisir une heure",
813
+ "selectTime": "Choisir l'heure",
814
+ "useDial": "Utiliser le cadran",
815
+ "useKeyboard": "Utiliser le clavier",
816
+ "hour": "Heure",
817
+ "minute": "Minute",
818
+ "period": "Matin ou après-midi",
819
+ "day": "Jour",
820
+ "month": "Mois",
821
+ "year": "Année",
822
+ "dateWheel": "Roue de date",
823
+ "dateWheelNote": "En ligne, dans l'ordre de votre langue. Passez à un mois plus court et le jour suit.",
824
+ "wheel": "Sélecteur à roue",
825
+ "wheelNote": "N'importe quelles valeurs sur des tambours - ici une quantité et son unité.",
826
+ "quantity": "Quantité",
827
+ "unit": "Unité",
828
+ "units": {
829
+ "box": "cartons",
830
+ "pack": "paquets",
831
+ "pallet": "palettes"
832
+ },
833
+ "selectedDate": "Date sélectionnée"
834
+ },
835
+ "scale": {
836
+ "refreshing": "Actualisation",
837
+ "virtual": "Liste virtuelle",
838
+ "virtualNote": "{count} lignes, seules les visibles dans le DOM. Tirez depuis le haut pour actualiser.",
839
+ "rendered": "{count} ligne affichée | {count} lignes affichées",
840
+ "refreshed": "Actualisée {count}×",
841
+ "customer": "Client",
842
+ "orders": "{count} commande | {count} commandes",
843
+ "updated": "Clients mis à jour"
844
+ },
845
+ "tabs": {
846
+ "title": "Onglets glissants",
847
+ "orders": "Commandes",
848
+ "invoices": "Factures",
849
+ "payments": "Paiements",
850
+ "returns": "Retours",
851
+ "ordersNote": "Glissez d'un onglet à l'autre n'importe où sur la page ; glissez une ligne vers la gauche pour l'archiver - la ligne l'emporte sur les onglets.",
852
+ "order": "SO-{n}",
853
+ "orderLines": "Aucune ligne | {count} ligne | {count} lignes",
854
+ "archive": "Archiver",
855
+ "invoice": "FAC-{n}",
856
+ "amount": "{value} DA",
857
+ "paymentsNote": "Un carrousel dans un onglet garde son propre glissement latéral.",
858
+ "methods": {
859
+ "cash": "Espèces",
860
+ "cheque": "Chèque",
861
+ "transfer": "Virement",
862
+ "credit": "Crédit"
863
+ },
864
+ "noReturns": "Aucun retour",
865
+ "noReturnsText": "Les marchandises retournées apparaissent ici.",
866
+ "quickActions": "Actions rapides",
867
+ "actions": {
868
+ "order": "Nouvelle commande",
869
+ "scan": "Scanner un code-barres",
870
+ "call": "Appeler le client",
871
+ "map": "Ouvrir la carte de tournée",
872
+ "close": "Fermer"
873
+ }
874
+ },
875
+ "contacts": {
876
+ "title": "Clients de A à Z",
877
+ "jump": "Aller à la lettre"
878
+ },
879
+ "tree": {
880
+ "title": "Arborescence",
881
+ "note": "L'arborescence de Framework7 : le chevron ouvre une branche, une ligne se sélectionne. Produits laitiers charge ses produits à la première ouverture. Les flèches parcourent l'arbre.",
882
+ "categories": "Catégories de produits",
883
+ "permissions": "Autorisations",
884
+ "products": "{count} produits",
885
+ "loadsLater": "Se charge à l'ouverture",
886
+ "nodes": {
887
+ "drinks": "Boissons",
888
+ "water": "Eau",
889
+ "juice": "Jus",
890
+ "orange": "Jus d'orange",
891
+ "apple": "Jus de pomme",
892
+ "soda": "Soda",
893
+ "dairy": "Produits laitiers",
894
+ "milk": "Lait",
895
+ "yoghurt": "Yaourt",
896
+ "cheese": "Fromage",
897
+ "grocery": "Épicerie",
898
+ "pasta": "Pâtes",
899
+ "oil": "Huile",
900
+ "sales": "Ventes",
901
+ "stock": "Stock",
902
+ "read": "Consulter",
903
+ "create": "Créer",
904
+ "cancel": "Annuler",
905
+ "adjust": "Ajuster"
906
+ }
907
+ },
908
+ "tables": {
909
+ "orders": "Commandes",
910
+ "ordersNote": "Touchez un en-tête pour son menu : trier, grouper avec un total par groupe, épingler, masquer. La disposition est gardée pour la prochaine fois.",
911
+ "dense": "Compact",
912
+ "selected": "Aucune sélection | {count} sélectionnée | {count} sélectionnées",
913
+ "selectAll": "Sélectionner toutes les commandes",
914
+ "selectRow": "Sélectionner {ref}",
915
+ "opened": "{ref} ouverte",
916
+ "total": "Total",
917
+ "ref": "Commande",
918
+ "customer": "Client",
919
+ "date": "Date",
920
+ "status": "Statut",
921
+ "totalColumn": "Total",
922
+ "menu": {
923
+ "sortAscending": "Tri croissant",
924
+ "sortDescending": "Tri décroissant",
925
+ "clearSort": "Retirer le tri",
926
+ "groupBy": "Grouper par cette colonne",
927
+ "ungroup": "Dégrouper",
928
+ "pin": "Épingler au début",
929
+ "unpin": "Désépingler",
930
+ "hide": "Masquer la colonne",
931
+ "columns": "Colonnes"
932
+ },
933
+ "groupCount": "{count} commande | {count} commandes",
934
+ "selectGroup": "Sélectionner les commandes {label}",
935
+ "rowCount": "{count} lignes"
936
+ },
937
+ "charts": {
938
+ "line": "Ventes mensuelles",
939
+ "lineNote": "Une courbe remplie en aire : cette année contre l'an dernier. Touchez et glissez le long pour lire les deux valeurs ; le vide, ce sont les mois à venir.",
940
+ "bar": "Ventes par commercial",
941
+ "barNote": "Barres groupées, ou empilées. Touchez un commercial pour lire les chiffres.",
942
+ "stacked": "Empilées",
943
+ "donut": "Ventes par canal",
944
+ "donutNote": "Touchez un segment ou sa légende pour l'amener au centre.",
945
+ "total": "Total",
946
+ "thisYear": "2026",
947
+ "lastYear": "2025",
948
+ "august": "Août",
949
+ "september": "Septembre",
950
+ "channels": {
951
+ "shops": "Magasins",
952
+ "wholesale": "Gros",
953
+ "online": "En ligne",
954
+ "export": "Export"
955
+ }
956
+ },
957
+ "featured": {
958
+ "glance": "En bref",
959
+ "note": "Cette page est sortie de la carte touchée. Revenez en arrière, par la barre ou le geste système, et elle se referme dans la carte.",
960
+ "range": {
961
+ "title": "Gamme d'été",
962
+ "text": "Quatre nouveaux parfums sur la ligne 1 L",
963
+ "body": "La gamme d'été arrive en rayon en juin. Chaque tournée transporte les quatre nouveaux parfums dès la première semaine, et les magasins qui prennent toute la ligne reçoivent un présentoir.",
964
+ "facts": {
965
+ "products": "Produits",
966
+ "flavours": "Nouveaux parfums",
967
+ "wilayas": "Wilayas"
968
+ }
969
+ },
970
+ "stores": {
971
+ "title": "Nouveaux magasins",
972
+ "text": "Sept ouvertures sur les tournées de la semaine",
973
+ "body": "Sept magasins ont ouvert le long des tournées existantes. Chacun reçoit une première visite dans la semaine, avec le catalogue et une commande d'ouverture.",
974
+ "facts": {
975
+ "opened": "Ouverts",
976
+ "visits": "Visites prévues",
977
+ "orders": "Premières commandes"
978
+ }
979
+ },
980
+ "route": {
981
+ "title": "Tournée côtière",
982
+ "text": "Quatorze arrêts d'Oran à Mostaganem",
983
+ "body": "La tournée côtière quitte le dépôt d'Oran à sept heures et longe la côte vers l'est. Les arrêts sont ordonnés pour livrer d'abord les commandes les plus lourdes.",
984
+ "facts": {
985
+ "stops": "Arrêts",
986
+ "distance": "Kilomètres",
987
+ "hours": "Heures de route"
988
+ }
989
+ }
990
+ },
991
+ "chat": {
992
+ "title": "Équipe tournée",
993
+ "subtitle": "Amina, Karim et vous",
994
+ "you": "Vous",
995
+ "compose": "Message",
996
+ "send": "Envoyer",
997
+ "attach": "Joindre",
998
+ "thumbsUp": "Ajouter un pouce levé",
999
+ "photos": "Photos partagées",
1000
+ "retry": "Appuyez pour réessayer",
1001
+ "latest": "Aller au dernier message",
1002
+ "loadingOlder": "Chargement des messages précédents",
1003
+ "loadFailed": "Impossible de charger les messages précédents",
1004
+ "start": "C'est le début de la conversation",
1005
+ "typing": "{name} écrit…",
1006
+ "unread": "{count} nouveau message | {count} nouveaux messages",
1007
+ "copy": "Copier le texte",
1008
+ "delete": "Supprimer pour moi",
1009
+ "copied": "Copié",
1010
+ "copyFailed": "Impossible de copier",
1011
+ "status": {
1012
+ "sending": "Envoi",
1013
+ "sent": "Envoyé",
1014
+ "delivered": "Distribué",
1015
+ "read": "Lu",
1016
+ "failed": "Non envoyé"
1017
+ },
1018
+ "lines": {
1019
+ "s1": "Rappel : les nouveaux prix s'appliquent dès dimanche.",
1020
+ "s2": "Noté, je préviens les magasins de ma tournée.",
1021
+ "s3": "Comment s'est passé Bab Ezzouar ?",
1022
+ "s4": "18 visites, 14 commandes.",
1023
+ "s5": "Deux magasins étaient fermés, j'y retourne jeudi.",
1024
+ "s6": "Lever de soleil sur la route côtière, première visite à 7 h.",
1025
+ "s7": "Superbe. Tu peux pousser la gamme 1 L sur cette tournée la semaine prochaine ?",
1026
+ "s8": "Oui, je l'ajoute aux commandes de mardi.",
1027
+ "s9": "J'envoie la liste de prix à jour",
1028
+ "o1": "L'inventaire est prévu vendredi.",
1029
+ "o2": "Je m'en occupe.",
1030
+ "o3": "Je peux couvrir la tournée nord demain.",
1031
+ "o4": "Merci à vous deux, bonne semaine jusqu'ici.",
1032
+ "o5": "Rendez-vous au dépôt à 8 h.",
1033
+ "r1": "👍",
1034
+ "r2": "Bien reçu, merci.",
1035
+ "r3": "Bon travail aujourd'hui 💪",
1036
+ "r4": "Je passe au dépôt plus tard."
1037
+ },
1038
+ "attachTitle": "Envoyer",
1039
+ "recent": "Photos récentes",
1040
+ "sendPhoto": "Envoyer {name}",
1041
+ "attachOptions": {
1042
+ "gallery": "Galerie",
1043
+ "camera": "Appareil photo",
1044
+ "file": "Fichier",
1045
+ "location": "Position",
1046
+ "contact": "Contact",
1047
+ "poll": "Sondage",
1048
+ "event": "Événement"
1049
+ },
1050
+ "attachFailed": "Impossible de lire {name}",
1051
+ "react": "Réagir",
1052
+ "messageActions": "Actions sur le message",
1053
+ "reactionCount": "{emoji} de {count} personne | {emoji} de {count} personnes",
1054
+ "reactionsTitle": "Réactions",
1055
+ "allReactions": "Toutes",
1056
+ "removeReaction": "Appuyez pour retirer",
1057
+ "othersReacted": "{count} autre | {count} autres",
1058
+ "location": {
1059
+ "here": "Position actuelle",
1060
+ "depot": "Dépôt d'Oran",
1061
+ "sendDepot": "Envoyer le dépôt",
1062
+ "denied": "L'accès à la position est désactivé",
1063
+ "unavailable": "Position introuvable",
1064
+ "timeout": "La recherche de position a pris trop de temps",
1065
+ "unsupported": "Cet appareil ne peut pas partager sa position"
1066
+ },
1067
+ "contact": {
1068
+ "title": "Partager un contact",
1069
+ "search": "Rechercher un client",
1070
+ "empty": "Aucun client pour l'instant",
1071
+ "failed": "Impossible de charger les clients"
1072
+ },
1073
+ "poll": {
1074
+ "title": "Nouveau sondage",
1075
+ "question": "Question",
1076
+ "option": "Option {number}",
1077
+ "remove": "Retirer l'option {number}",
1078
+ "add": "Ajouter une option",
1079
+ "repeated": "Option déjà proposée",
1080
+ "multiple": "Plusieurs réponses",
1081
+ "multipleHint": "Chacun peut en choisir plusieurs"
1082
+ },
1083
+ "invite": {
1084
+ "title": "Nouvel événement",
1085
+ "name": "Nom de l'événement",
1086
+ "date": "Date",
1087
+ "time": "Heure",
1088
+ "place": "Lieu (facultatif)"
1089
+ },
1090
+ "cards": {
1091
+ "openLocation": "Ouvrir dans Maps",
1092
+ "openContact": "Voir ses commandes",
1093
+ "pollSingle": "Un seul choix",
1094
+ "pollMultiple": "Plusieurs choix",
1095
+ "votes": "{count} vote | {count} votes",
1096
+ "going": "J'y vais",
1097
+ "maybe": "Peut-être",
1098
+ "no": "Je ne peux pas"
1099
+ }
1100
+ },
1101
+ "onboarding": {
1102
+ "title": "Visite guidée",
1103
+ "skip": "Passer",
1104
+ "next": "Suivant",
1105
+ "start": "Commencer",
1106
+ "page": "Page {n}",
1107
+ "pages": {
1108
+ "route": {
1109
+ "title": "Votre tournée, dans l'ordre",
1110
+ "text": "Chaque visite du jour dans l'ordre où vous roulez, avec la dernière commande de chaque magasin."
1111
+ },
1112
+ "orders": {
1113
+ "title": "Des commandes en quelques secondes",
1114
+ "text": "Scannez, ajustez les quantités : totaux et promotions suivent pendant la saisie."
1115
+ },
1116
+ "offline": {
1117
+ "title": "Pas de réseau, pas de souci",
1118
+ "text": "Tout reste sur le téléphone et part dès que la connexion revient."
1119
+ }
1120
+ }
1121
+ },
1122
+ "login": {
1123
+ "title": "Connexion",
1124
+ "heading": "Bon retour",
1125
+ "subtitle": "Connectez-vous pour voir la tournée du jour.",
1126
+ "email": "E-mail",
1127
+ "password": "Mot de passe",
1128
+ "show": "Afficher le mot de passe",
1129
+ "hide": "Masquer le mot de passe",
1130
+ "forgot": "Mot de passe oublié ?",
1131
+ "forgotSent": "Un lien de réinitialisation serait envoyé par e-mail",
1132
+ "signIn": "Se connecter",
1133
+ "signingIn": "Connexion…",
1134
+ "emailInvalid": "Saisissez une adresse e-mail valide",
1135
+ "passwordMissing": "Saisissez votre mot de passe",
1136
+ "rejected": "E-mail ou mot de passe incorrect",
1137
+ "welcome": "Connecté en tant que {email}",
1138
+ "restored": "Restauré depuis votre dernière visite",
1139
+ "hint": "Démo : n'importe quel e-mail, avec le mot de passe demo."
1140
+ },
1141
+ "agenda": {
1142
+ "title": "Agenda de tournée",
1143
+ "today": "Aller à aujourd'hui",
1144
+ "days": "Jours de la semaine",
1145
+ "visits": "{count} visite | {count} visites",
1146
+ "weekend": "Aucune visite",
1147
+ "weekendText": "C'est le week-end : la tournée reprend dimanche.",
1148
+ "states": {
1149
+ "done": "Fait",
1150
+ "next": "Suivant",
1151
+ "planned": "Prévu"
1152
+ },
1153
+ "view": "Vue de l'agenda",
1154
+ "views": {
1155
+ "day": "Jour",
1156
+ "week": "Semaine",
1157
+ "month": "Mois"
1158
+ },
1159
+ "previousMonth": "Mois précédent",
1160
+ "nextMonth": "Mois suivant",
1161
+ "chooseYear": "Choisir l'année"
1162
+ }
1163
+ },
1164
+ "settings": {
1165
+ "about": "À propos",
1166
+ "appName": "Nom",
1167
+ "version": "Version",
1168
+ "platform": "Plateforme",
1169
+ "storage": "Stockage",
1170
+ "engine": "Moteur de base de données",
1171
+ "webview": "WebView",
1172
+ "notDurable": "Le stockage n'est pas persistant",
1173
+ "title": "Réglages",
1174
+ "appearance": "Apparence",
1175
+ "colors": "Studio de couleurs",
1176
+ "darkMode": "Thème",
1177
+ "modeSystem": "Système",
1178
+ "modeLight": "Clair",
1179
+ "modeDark": "Sombre",
1180
+ "motion": "Animations",
1181
+ "motionNote": "Réduites garde les fondus et les morphoses, et retire déplacements et rebonds.",
1182
+ "motionSystem": "Système",
1183
+ "motionReduced": "Réduites",
1184
+ "motionFull": "Complètes",
1185
+ "general": "Général",
1186
+ "language": "Langue",
1187
+ "languages": {
1188
+ "en": "English",
1189
+ "fr": "Français",
1190
+ "ar-DZ": "العربية"
1191
+ },
1192
+ "unknown": "Inconnu"
1193
+ },
1194
+ "studio": {
1195
+ "title": "Studio de couleurs",
1196
+ "reset": "Réinitialiser les couleurs",
1197
+ "resetDone": "Couleurs réinitialisées",
1198
+ "undo": "Annuler",
1199
+ "seed": "Couleur de base",
1200
+ "custom": "Graine personnalisée",
1201
+ "customHint": "N'importe quelle couleur hex, comme #6750a4",
1202
+ "customInvalid": "Utilisez #rgb ou #rrggbb",
1203
+ "pick": "Choisir une couleur",
1204
+ "variant": "Variante de schéma",
1205
+ "spec2025": "Générée avec les règles de couleur Expressive 2025.",
1206
+ "spec2021": "Cette variante suit les règles 2021 - Material n'applique les règles 2025 qu'à Tonal spot, Expressive, Vibrant et Neutral.",
1207
+ "contrast": "Contraste",
1208
+ "contrastNote": "Un contraste plus élevé détache le texte de sa surface, pour la basse vision et la forte lumière.",
1209
+ "contrastStandard": "Standard",
1210
+ "contrastMedium": "Moyen",
1211
+ "contrastHigh": "Élevé",
1212
+ "roles": "Rôles générés",
1213
+ "preview": "Aperçu",
1214
+ "previewTitle": "Livraison de l'après-midi",
1215
+ "previewText": "12 arrêts, 8 faits",
1216
+ "previewSwitch": "Notifications",
1217
+ "previewProgress": "Progression de la tournée",
1218
+ "previewChip": "Prioritaire",
1219
+ "previewAssist": "Optimiser",
1220
+ "previewPrimary": "Démarrer",
1221
+ "previewTonal": "Détails",
1222
+ "previewLoading": "Chargement",
1223
+ "previewFab": "Ajouter un arrêt",
1224
+ "variants": {
1225
+ "tonalSpot": "Tonal spot",
1226
+ "expressive": "Expressive",
1227
+ "vibrant": "Vibrant",
1228
+ "brand": "Fidèle à la marque",
1229
+ "neutral": "Neutre",
1230
+ "monochrome": "Monochrome",
1231
+ "fidelity": "Fidélité",
1232
+ "content": "Contenu",
1233
+ "rainbow": "Arc-en-ciel",
1234
+ "fruitSalad": "Salade de fruits"
1235
+ },
1236
+ "presets": {
1237
+ "brand": "Marque",
1238
+ "red": "Rouge",
1239
+ "amber": "Ambre",
1240
+ "green": "Vert",
1241
+ "teal": "Sarcelle",
1242
+ "blue": "Bleu",
1243
+ "indigo": "Indigo",
1244
+ "violet": "Violet",
1245
+ "pink": "Rose",
1246
+ "slate": "Ardoise"
1247
+ },
1248
+ "hue": "Teinte",
1249
+ "chroma": "Chroma",
1250
+ "tone": "Ton",
1251
+ "hex": "Hex",
1252
+ "pickNote": "Choisie en HCT, l'espace où Material construit ses schémas : la teinte reste fixe quand le ton et le chroma bougent.",
1253
+ "cancel": "Annuler",
1254
+ "apply": "Utiliser cette couleur"
1255
+ },
1256
+ "errors": {
1257
+ "notFoundTitle": "Introuvable",
1258
+ "notFound": "Cet écran n'existe pas."
1259
+ }
1260
+ }