diff --git a/TRANSLATIONS.md b/TRANSLATIONS.md index 126a51f79..e4c5878ce 100644 --- a/TRANSLATIONS.md +++ b/TRANSLATIONS.md @@ -104,7 +104,7 @@ pnpm i18n:check ## 📋 Supported Languages -Open Design currently supports **18 languages** across different surfaces: +Open Design currently supports **19 languages** across different surfaces: | Language | Code | README | UI Dict | Core Docs | Status | | -------------------- | ------- | ------ | ------- | --------- | ------ | @@ -116,6 +116,7 @@ Open Design currently supports **18 languages** across different surfaces: | Français | `fr` | ✅ | ✅ | ✅ | active | | Magyar (Hungarian) | `hu` | — | ✅ | — | active | | Bahasa Indonesia | `id` | — | ✅ | — | active | +| Italiano | `it` | — | ✅ | — | active | | æ—„æœŹèȘž (Japanese) | `ja` | ✅ | ✅ | ✅ | active | | 한ꔭ얎 (Korean) | `ko` | ✅ | ✅ | — | active | | Polski (Polish) | `pl` | — | ✅ | — | active | @@ -331,6 +332,88 @@ Translations follow the conventions of the target region's tech writing communit - "quickstart" → your language's equivalent - "settings" → your language's equivalent +### French (`fr`) Glossary + +French UI copy should read naturally for a technical product audience without +turning product/runtime terms into vague French approximations. Keep these +rules stable across `apps/web/src/i18n/locales/fr.ts`, French core docs, and +French display metadata. + +#### Keep in English + +Keep the exact English/token form for names, protocols, commands, environment +variables, code identifiers, package names, file extensions, and technical +runtime nouns that are clearer in English: + +| English source | French usage | +| -------------- | ------------ | +| Open Design | Open Design | +| Claude Code, Codex, Cursor, Gemini, OpenCode | Claude Code, Codex, Cursor, Gemini, OpenCode | +| CLI, API, SDK, MCP, HTTP, REST, SSE, JSONL | CLI, API, SDK, MCP, HTTP, REST, SSE, JSONL | +| BYOK | BYOK | +| runtime | runtime | +| daemon | daemon | +| sidecar | sidecar | +| headless | headless | +| plugin | plugin | +| prompt | prompt | +| token | token | +| iframe | iframe | +| monorepo, workspace | monorepo, workspace | +| `od`, `pnpm`, `pnpm tools-dev` | `od`, `pnpm`, `pnpm tools-dev` | +| `OD_DATA_DIR`, `OD_WEB_PORT`, `{provider}` | `OD_DATA_DIR`, `OD_WEB_PORT`, `{provider}` | +| `.zip`, `.html`, `.md`, `.json` | `.zip`, `.html`, `.md`, `.json` | + +Use French grammar around preserved terms: + +- `le daemon local`, `un runtime`, `des plugins`, `les prompts` +- `l’API`, `un endpoint REST`, `un flux SSE` +- `la CLI locale`, `un serveur MCP` + +#### Translate When Standard + +Translate ordinary UI terms, workflow labels, and non-identifier product copy +when a natural French equivalent exists: + +| English source | French | +| -------------- | ------ | +| Settings | ParamĂštres | +| Save | Enregistrer | +| Cancel | Annuler | +| Delete | Supprimer | +| Folder | Dossier | +| File | Fichier | +| Download | TĂ©lĂ©charger | +| Upload | TĂ©lĂ©verser | +| Search | Rechercher | +| Preview | Aperçu | +| Project | Projet | +| Conversation | Conversation | +| Dashboard | Tableau de bord | +| Schedule | Planification | +| Automation | Automatisation | +| Artifact | Artefact | +| Live artifact | Artefact dynamique | +| Design files | Fichiers de design | +| Slide deck | PrĂ©sentation | +| Engineering handoff | Transmission aux ingĂ©nieurs | +| Shipped (product/software status) | LivrĂ© | + +#### Context-Sensitive Choices + +- `Skill` stays `Skill` when it names the Open Design/Claude skill format. + Translate only generic prose such as "ability" or "capability" as + `capacitĂ©`. +- `Design System` may stay `Design System` when referring to the product + registry/object name. In explanatory prose, `systĂšme de design` is also + acceptable when it improves readability. +- `runtime` stays `runtime` as a noun. Labels like "execution mode" can still + use `mode d’exĂ©cution`. +- `source` can stay `source` for provenance labels, but translate ordinary + "data source" as `source de donnĂ©es`. +- Do not translate command output or examples that users should see exactly in + their terminal. + ### zh-CN ↔ zh-TW Glossary When converting between Simplified and Traditional Chinese, prefer Taiwan-specific phrasing in zh-TW rather than character-only conversion. This list grew out of [PR #194](https://github.com/nexu-io/open-design/pull/194) and is meant as a starting point, not a rulebook. diff --git a/apps/web/src/i18n/locales/fr.ts b/apps/web/src/i18n/locales/fr.ts index 6f7a117f9..9bb0820f3 100644 --- a/apps/web/src/i18n/locales/fr.ts +++ b/apps/web/src/i18n/locales/fr.ts @@ -20,36 +20,6 @@ export const fr: Dict = { 'plugins.actions.openSource': 'Ouvrir la source', 'plugins.actions.openHomepage': 'Ouvrir la page d’accueil', 'plugins.actions.openMarketplace': 'Ouvrir dans la marketplace', - 'workingDirPicker.title': "Folder", - 'workingDirPicker.homeTitle': "Choose where this project should live", - 'workingDirPicker.processing': "Processing
", - 'workingDirPicker.select': "Choose working directory", - 'workingDirPicker.clearAria': "Clear working directory", - 'workingDirPicker.replaceFailed': "Could not replace working directory", - 'workingDirPicker.unavailable': "Folder picker is unavailable in this build. Run the desktop app to pick a folder.", - 'workingDirPicker.openUnavailable': "Open this project in the desktop app to show the folder.", - 'workingDirPicker.openFailed': "Could not show this folder", - 'workingDirPicker.showInFileManager': "Show in file manager", - 'workingDirPicker.replace': "Clear and replace directory
", - 'workingDirPicker.recent': "Recent directories", - 'handoff.toTarget': 'Hand off to {target}', - 'handoff.action': 'Hand off', - 'handoff.fallbackTitle': 'No editors found on $PATH - opens in {target}', - 'handoff.chooseTargetAria': 'Choose hand-off target', - 'handoff.notInstalled': 'Not installed', - 'handoff.notDetectedTitle': '{target} - not detected on $PATH', - 'homeHero.promptExamples': "Exemples", - 'homeHero.footer.designSystem': "Style", - 'homeHero.footer.autoDesignSystem': "Auto", - 'homeHero.footer.autoDesignSystemSummary': "Associe automatiquement le systĂšme de design et le style visuel les plus adaptĂ©s au prompt actuel.", - 'homeHero.footer.ratio': "Ratio", - 'homeHero.footer.duration': "DurĂ©e", - 'homeHero.footer.resolution': "RĂ©solution", - 'homeHero.footer.speakerNotes': "Notes", - 'homeHero.footer.noSpeakerNotes': "Sans notes", - 'homeHero.footer.availableCount': "{n} available", - 'homeHero.footer.noMatches': "No matches", - 'homeHero.moreShortcuts': "Plus", 'common.cancel': 'Annuler', 'common.save': 'Enregistrer', 'common.close': 'Fermer', @@ -87,107 +57,120 @@ export const fr: Dict = { 'common.hoursShort': '{n} h', 'common.daysShort': '{n} j', 'common.untitled': 'Sans titre', - + 'plugins.availableDetails.provenance': 'Provenance', + 'plugins.availableDetails.provenanceLine': 'depuis {source} · {trust} · {resolved}', + 'plugins.availableDetails.provenanceLineWithIntegrity': 'depuis {source} · {trust} · {resolved} · {integrity}', + 'plugins.availableDetails.install': 'Installer', + 'plugins.availableDetails.version': 'Version', + 'plugins.availableDetails.pluginVersion': 'Version du plugin', + 'plugins.availableDetails.copyInstallCommand': 'Copier la commande d’installation', + 'plugins.availableDetails.copied': 'CopiĂ©', + 'plugins.availableDetails.deprecatedPrefix': 'DĂ©prĂ©ciĂ© : {message}', + 'plugins.availableDetails.deprecatedFallback': 'Cette version a Ă©tĂ© marquĂ©e comme dĂ©prĂ©ciĂ©e.', + 'plugins.availableDetails.yanked': 'RetirĂ©.', + 'plugins.availableDetails.yankedWithReason': 'RetirĂ© : {reason}', + 'plugins.availableDetails.versionDeprecatedSuffix': ' (dĂ©prĂ©ciĂ©e)', + 'plugins.availableDetails.versionYankedSuffix': ' (retirĂ©e)', + 'plugins.availableDetails.ref': 'RĂ©f.', + 'plugins.availableDetails.integrity': 'IntĂ©gritĂ©', + 'plugins.availableDetails.permissions': 'Autorisations', + 'plugins.availableDetails.capabilitySummary': 'RĂ©sumĂ© des capacitĂ©s', 'app.brand': 'Open Design', 'app.brandPill': 'Aperçu de recherche', 'app.brandSubtitle': 'par Nexu Labs', 'app.welcomeLoading': 'Chargement de l\'espace de travail
', - - 'settings.welcomeKicker': "", - 'settings.welcomeTitle': "Welcome", - 'settings.welcomeSubtitle': "", - 'settings.onboardingCreateTitle': 'Start from a brief', - 'settings.onboardingCreateBody': - 'Describe the site, app, deck, image, or video you want. Open Design will create a project and keep the work editable.', - 'settings.onboardingMemoryTitle': 'Save working context', - 'settings.onboardingMemoryBody': - 'Add preferences, project facts, and recurring rules so future chats pick up the right context.', - 'settings.onboardingSystemsTitle': 'Bring your design system', - 'settings.onboardingSystemsBody': - 'Pick or create a brand system so generated work follows real colors, typography, and product language.', - 'settings.onboardingExecutionTitle': 'Choose how generation runs', - 'settings.onboardingExecutionBody': - 'Official CLI with one-click setup and ready-to-use defaults. Use one key to choose from many models with better pricing.', + 'settings.welcomeKicker': '', + 'settings.welcomeTitle': 'Bienvenue', + 'settings.welcomeSubtitle': '', + 'settings.onboardingCreateTitle': 'Commencer par un brief', + 'settings.onboardingCreateBody': 'DĂ©crivez le site, l’app, le deck, l’image ou la vidĂ©o que vous voulez. Open Design crĂ©era un projet et gardera le travail modifiable.', + 'settings.onboardingMemoryTitle': 'Enregistrer le contexte de travail', + 'settings.onboardingMemoryBody': 'Ajoutez vos prĂ©fĂ©rences, les faits du projet et les rĂšgles rĂ©currentes afin que les prochaines discussions reprennent le bon contexte.', + 'settings.onboardingSystemsTitle': 'Importer votre systĂšme de design', + 'settings.onboardingSystemsBody': 'Choisissez ou crĂ©ez un systĂšme de marque pour que les gĂ©nĂ©rations respectent les couleurs, la typographie et le langage produit rĂ©els.', + 'settings.onboardingExecutionTitle': 'Choisir le mode de gĂ©nĂ©ration', + 'settings.onboardingExecutionBody': 'CLI officielle avec configuration en un clic et rĂ©glages prĂȘts Ă  l’emploi. Utilisez une seule clĂ© pour choisir parmi de nombreux modĂšles Ă  meilleur prix.', 'settings.onboardingAmrCloudBenefitOfficial': 'Maintenance officielle', 'settings.onboardingAmrCloudBenefitReady': 'PrĂȘt Ă  l’emploi', 'settings.onboardingAmrCloudBenefitModels': 'Nombreux modĂšles', 'settings.onboardingAmrCloudBenefitPricing': 'Prix avantageux', 'settings.onboardingAmrCloudAuthorizeAction': 'Autoriser AMR', 'settings.onboardingAmrCloudAuthorizedAction': 'AutorisĂ©', - 'settings.onboardingStepConnect': "Connect", - 'settings.onboardingStepDesignSystem': "Design system", - 'settings.onboardingStepProfile': "About you", - 'settings.onboardingConnectTitle': "Choose a runtime", - 'settings.onboardingConnectBody': "", - 'settings.onboardingRecommended': "Recommended", - 'settings.onboardingLocalTitle': "Local coding agent", - 'settings.onboardingLocalBody': "Use an installed CLI such as Claude Code, Codex, Cursor, Gemini, or OpenCode.", - 'settings.onboardingLocalAction': "Open CLI settings", - 'settings.onboardingCliScanHint': "This usually takes 5-10 seconds.", - 'settings.onboardingByokTitle': "Bring your own key", - 'settings.onboardingByokBody': "Use your own model provider credentials.", - 'settings.onboardingByokAction': "Open BYOK settings", - 'settings.onboardingDesignTitle': "Design system", - 'settings.onboardingDesignBody': "Generate once, reuse everywhere.", - 'settings.onboardingDesignIntroGenerateTitle': "Generate from existing work", - 'settings.onboardingDesignIntroGenerateBody': "Upload your design system from GitHub or local code repositories, Figma files, images, and other content assets.", - 'settings.onboardingDesignIntroReuseTitle': "Reuse in future work", - 'settings.onboardingDesignIntroReuseBody': "Future prototypes, slides, and other content can reference your existing fonts, spacing, logo style, and color tone.", - 'settings.onboardingDesignIntroSkipTitle': "Optional for now", - 'settings.onboardingDesignIntroSkipBody': "Skip this step if you want to start without generating a design system.", - 'settings.onboardingGithubTitle': "Import from GitHub", - 'settings.onboardingGithubBody': "Use a frontend repository.", - 'settings.onboardingUploadTitle': "Upload local files", - 'settings.onboardingUploadBody': "Add project files, screenshots, CSS, docs, or assets.", - 'settings.onboardingPromptTitle': "Generate from prompt", - 'settings.onboardingPromptBody': "Describe the product or brand.", - 'settings.onboardingProfileTitle': "About you", - 'settings.onboardingProfileBody': "Optional details for better defaults.", - 'settings.onboardingRoleLabel': "Your role", - 'settings.onboardingOrgSizeLabel': "Organization size", - 'settings.onboardingUseCaseLabel': "Use case", - 'settings.onboardingSourceLabel': "Where did you hear about us?", - 'settings.onboardingSelectPlaceholder': "Select one", - 'settings.onboardingSelectMultiplePlaceholder': "Select one or more", - 'settings.onboardingOrgSolo': "Solo / personal (1)", - 'settings.onboardingOrgTeam': "Small team (2-10)", - 'settings.onboardingOrgStartup': "Startup / SMB (11-50)", - 'settings.onboardingOrgGrowth': "Growth company (51-200)", - 'settings.onboardingOrgMidMarket': "Mid-market (201-1000)", - 'settings.onboardingOrgEnterprise': "Enterprise (1000+)", - 'settings.onboardingRolePm': "📋 Product manager", - 'settings.onboardingRoleDesigner': "🎹 Designer", - 'settings.onboardingRoleEngineer': "đŸ’» Engineer", - 'settings.onboardingRoleMarketing': "📣 Marketing", - 'settings.onboardingRoleGrowth': "📈 Growth", - 'settings.onboardingRoleOps': "⚙ Operations", - 'settings.onboardingRoleFounder': "🚀 Founder / executive", - 'settings.onboardingRoleStudent': "🎓 Student / educator", - 'settings.onboardingRoleOther': "✹ Other", - 'settings.onboardingUseProduct': "🎹 Product design", - 'settings.onboardingUseDesignSystem': "đŸ§© Design system", - 'settings.onboardingUsePrototype': "đŸ“± Prototype / app UI", - 'settings.onboardingUseLanding': "🌐 Landing pages", - 'settings.onboardingUseAds': "📣 Ads / social content", - 'settings.onboardingUseDashboard': "📊 Dashboards / internal tools", - 'settings.onboardingUseDeck': "đŸ–„ïž Presentation / deck", - 'settings.onboardingUseMarketing': "📈 Marketing / growth", - 'settings.onboardingUseEngineering': "đŸ€ Engineering handoff", - 'settings.onboardingUseAgency': "đŸ’Œ Agency / client work", - 'settings.onboardingSourceGithub': "🐙 GitHub", - 'settings.onboardingSourceFriend': "đŸ‘„ Friend or coworker", - 'settings.onboardingSourceSocial': "đŸ“± Social media", - 'settings.onboardingSourceProductHunt': "đŸ…żïž Product Hunt", - 'settings.onboardingSourceCommunity': "💬 Design / AI community", - 'settings.onboardingSourceYoutube': "▶ YouTube", - 'settings.onboardingSourceBlog': "📰 Blog or newsletter", - 'settings.onboardingSourceAiTool': "✹ AI tool recommendation", - 'settings.onboardingSourceSearch': "🔍 Search", - 'settings.onboardingSourceEvent': "đŸŽ€ Event or community", - 'settings.onboardingBack': "Back", - 'settings.onboardingContinue': "Continue", - 'settings.onboardingFinish': "Finish setup", - 'settings.onboardingSkip': "Skip for now", + 'settings.onboardingStepConnect': 'Connexion', + 'settings.onboardingStepDesignSystem': 'SystĂšme de design', + 'settings.onboardingStepProfile': 'À propos de vous', + 'settings.onboardingConnectTitle': 'Choisir un runtime', + 'settings.onboardingConnectBody': '', + 'settings.onboardingRecommended': 'RecommandĂ©', + 'settings.onboardingAmrCloudOfficialBadge': 'Officiel', + 'settings.onboardingLocalTitle': 'Agent de code local', + 'settings.onboardingLocalBody': 'Utilisez une CLI installĂ©e comme Claude Code, Codex, Cursor, Gemini ou OpenCode.', + 'settings.onboardingLocalAction': 'Ouvrir les paramĂštres CLI', + 'settings.onboardingCliScanHint': 'Cela prend gĂ©nĂ©ralement 5 Ă  10 secondes.', + 'settings.onboardingByokTitle': 'Utiliser votre propre clĂ©', + 'settings.onboardingByokBody': 'Utilisez vos propres identifiants de fournisseur de modĂšles.', + 'settings.onboardingByokAction': 'Ouvrir les paramĂštres BYOK', + 'settings.onboardingDesignTitle': 'SystĂšme de design', + 'settings.onboardingDesignBody': 'GĂ©nĂ©rez une fois, rĂ©utilisez partout.', + 'settings.onboardingDesignIntroGenerateTitle': 'GĂ©nĂ©rer depuis l’existant', + 'settings.onboardingDesignIntroGenerateBody': 'Importez votre systĂšme de design depuis GitHub, des dĂ©pĂŽts de code locaux, des fichiers Figma, des images ou d’autres contenus.', + 'settings.onboardingDesignIntroReuseTitle': 'RĂ©utiliser dans les prochains travaux', + 'settings.onboardingDesignIntroReuseBody': 'Les futurs prototypes, prĂ©sentations et autres contenus pourront rĂ©utiliser vos polices, espacements, style de logo et tonalitĂ© de couleur.', + 'settings.onboardingDesignIntroSkipTitle': 'Optionnel pour l’instant', + 'settings.onboardingDesignIntroSkipBody': 'Ignorez cette Ă©tape si vous voulez commencer sans gĂ©nĂ©rer de systĂšme de design.', + 'settings.onboardingGithubTitle': 'Importer depuis GitHub', + 'settings.onboardingGithubBody': 'Utiliser un dĂ©pĂŽt frontend.', + 'settings.onboardingUploadTitle': 'Importer des fichiers locaux', + 'settings.onboardingUploadBody': 'Ajoutez des fichiers projet, captures d’écran, CSS, docs ou assets.', + 'settings.onboardingPromptTitle': 'GĂ©nĂ©rer depuis un prompt', + 'settings.onboardingPromptBody': 'DĂ©crivez le produit ou la marque.', + 'settings.onboardingProfileTitle': 'À propos de vous', + 'settings.onboardingProfileBody': 'DĂ©tails optionnels pour de meilleurs rĂ©glages par dĂ©faut.', + 'settings.onboardingRoleLabel': 'Votre rĂŽle', + 'settings.onboardingOrgSizeLabel': 'Taille de l’organisation', + 'settings.onboardingUseCaseLabel': 'Cas d’usage', + 'settings.onboardingSourceLabel': 'OĂč avez-vous entendu parler de nous ?', + 'settings.onboardingSelectPlaceholder': 'SĂ©lectionnez une option', + 'settings.onboardingSelectMultiplePlaceholder': 'SĂ©lectionnez une ou plusieurs options', + 'settings.onboardingOrgSolo': 'Solo / personnel (1)', + 'settings.onboardingOrgTeam': 'Petite Ă©quipe (2-10)', + 'settings.onboardingOrgStartup': 'Startup / PME (11-50)', + 'settings.onboardingOrgGrowth': 'Entreprise en croissance (51-200)', + 'settings.onboardingOrgMidMarket': 'Entreprise intermĂ©diaire (201-1000)', + 'settings.onboardingOrgEnterprise': 'Grande entreprise (1000+)', + 'settings.onboardingRolePm': '📋 Responsable produit', + 'settings.onboardingRoleDesigner': '🎹 Designer', + 'settings.onboardingRoleEngineer': 'đŸ’» IngĂ©nieur', + 'settings.onboardingRoleMarketing': '📣 Marketing', + 'settings.onboardingRoleGrowth': '📈 Croissance', + 'settings.onboardingRoleOps': '⚙ OpĂ©rations', + 'settings.onboardingRoleFounder': '🚀 Fondateur / dirigeant', + 'settings.onboardingRoleStudent': '🎓 Étudiant / enseignant', + 'settings.onboardingRoleOther': '✹ Autre', + 'settings.onboardingUseProduct': '🎹 Design produit', + 'settings.onboardingUseDesignSystem': 'đŸ§© SystĂšme de design', + 'settings.onboardingUsePrototype': 'đŸ“± Prototype / UI d’app', + 'settings.onboardingUseLanding': '🌐 Landing pages', + 'settings.onboardingUseAds': '📣 PublicitĂ©s / contenu social', + 'settings.onboardingUseDashboard': '📊 Dashboards / outils internes', + 'settings.onboardingUseDeck': 'đŸ–„ïž PrĂ©sentation / deck', + 'settings.onboardingUseMarketing': '📈 Marketing / croissance', + 'settings.onboardingUseEngineering': 'đŸ€ Transmission aux ingĂ©nieurs', + 'settings.onboardingUseAgency': 'đŸ’Œ Agence / travail client', + 'settings.onboardingSourceGithub': '🐙 GitHub', + 'settings.onboardingSourceFriend': 'đŸ‘„ Ami ou collĂšgue', + 'settings.onboardingSourceSocial': 'đŸ“± RĂ©seaux sociaux', + 'settings.onboardingSourceProductHunt': 'đŸ…żïž Product Hunt', + 'settings.onboardingSourceCommunity': '💬 CommunautĂ© design / IA', + 'settings.onboardingSourceYoutube': '▶ YouTube', + 'settings.onboardingSourceBlog': '📰 Blog ou newsletter', + 'settings.onboardingSourceAiTool': '✹ Recommandation d’outil IA', + 'settings.onboardingSourceSearch': '🔍 Recherche', + 'settings.onboardingSourceEvent': 'đŸŽ€ ÉvĂ©nement ou communautĂ©', + 'settings.onboardingBack': 'Retour', + 'settings.onboardingContinue': 'Continuer', + 'settings.onboardingFinish': 'Terminer la configuration', + 'settings.onboardingSkip': 'Ignorer pour l’instant', 'settings.kicker': 'ParamĂštres', 'settings.title': 'Mode d\'exĂ©cution', 'settings.subtitle': 'Choisissez entre CLI local et BYOK.', @@ -200,9 +183,9 @@ export const fr: Dict = { 'settings.modeDaemonInstalledMeta': '{count} installĂ©(s)', 'settings.modeApi': 'Fournisseur API', 'settings.modeApiMeta': 'BYOK', + 'settings.byokNoFileToolsNotice': 'Le mode BYOK parle directement au modĂšle et ne peut pas lire, Ă©crire ni modifier les fichiers de votre projet : l’agent rĂ©pondra avec du texte ou du HTML au lieu d’appliquer les changements. Passez en mode CLI local (Claude Code, Codex, 
) si vous voulez que l’agent modifie les fichiers du projet.', 'settings.codeAgent': 'Agent de code', - 'settings.codeAgentHint': - 'Choisissez la CLI par laquelle les gĂ©nĂ©rations seront routĂ©es.', + 'settings.codeAgentHint': 'Choisissez la CLI par laquelle les gĂ©nĂ©rations seront routĂ©es.', 'settings.rescan': '↻ RĂ©analyser', 'settings.rescanTitle': 'RĂ©analyser le PATH', 'settings.rescanRunning': 'Analyse...', @@ -213,6 +196,9 @@ export const fr: Dict = { 'settings.testTitle': 'Envoie un tout petit message de test pour vĂ©rifier la connexion', 'settings.testRunning': 'Test de la connexion
', 'settings.testCancel': 'Annuler', + 'settings.testRetry': 'Relancer le test', + 'settings.required': 'requis', + 'settings.testMissingFields': 'Renseignez {fields} pour tester la connexion.', 'settings.testSuccessApi': 'ConnectĂ©. RĂ©pondu en {ms} ms — \'{sample}\'', 'settings.testSuccessCli': '{agentName} a rĂ©pondu en {ms} ms — \'{sample}\'', 'settings.testAuthFailed': 'Échec de l’authentification. VĂ©rifiez votre clĂ© API.', @@ -228,67 +214,77 @@ export const fr: Dict = { 'settings.testUnknown': 'Échec du test : {detail}', 'settings.agentInstall.install': 'Installer', 'settings.agentInstall.docs': 'Documentation', - 'settings.agentInstall.pathHint': - 'Si vous avez installĂ© une CLI avec npm ou Homebrew et qu\'elle apparaĂźt toujours comme non installĂ©e, vĂ©rifiez que le dossier bin de l\'outil est dans le PATH hĂ©ritĂ© par le daemon Open Design (le Terminal et les applications graphiques peuvent diffĂ©rer sur macOS). Voir QUICKSTART.md (section "Local agent CLI and PATH").', + 'settings.agentInstall.pathHint': 'Si vous avez installĂ© une CLI avec npm ou Homebrew et qu\'elle apparaĂźt toujours comme non installĂ©e, vĂ©rifiez que le dossier bin de l\'outil est dans le PATH hĂ©ritĂ© par le daemon Open Design (le Terminal et les applications graphiques peuvent diffĂ©rer sur macOS). Voir QUICKSTART.md (section "Local agent CLI and PATH").', 'settings.agentInstall.stepOpenLinks': 'Ouvrez Installer ou Documentation pour l\'agent souhaitĂ©.', - 'settings.agentInstall.stepAuth': - 'Authentifiez-vous avec la CLI du fournisseur (connexion ou ajout des identifiants API) avant de revenir dans Open Design.', + 'settings.agentInstall.stepAuth': 'Authentifiez-vous avec la CLI du fournisseur (connexion ou ajout des identifiants API) avant de revenir dans Open Design.', 'settings.agentInstall.stepRescan': 'Cliquez sur RĂ©analyser dans cette section.', 'settings.agentInstall.stepSelect': 'SĂ©lectionnez la carte de l\'agent une fois qu\'elle apparaĂźt comme installĂ©e.', - 'settings.noAgentsDetected': - 'Aucun agent dĂ©tectĂ© pour l\'instant. Installez Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen ou GitHub Copilot CLI, puis cliquez sur RĂ©analyser.', + 'settings.noAgentsDetected': 'Aucun agent dĂ©tectĂ© pour l\'instant. Installez Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen ou GitHub Copilot CLI, puis cliquez sur RĂ©analyser.', 'settings.agentInstalledGroup': 'Vos CLI ({count})', 'settings.agentInstallGroup': 'Disponibles Ă  installer ({count})', 'settings.agentAuthRequired': 'Authentification requise', 'settings.agentAuthUnknown': 'Statut d’authentification inconnu', - 'settings.amrLogin': 'Sign in', - 'settings.amrLogout': 'Sign out', - 'settings.amrLoggingIn': 'Signing in
', - 'settings.amrLoggingOut': 'Signing out
', - 'settings.amrLoggedInAs': 'Signed in as {email}', - 'settings.amrLoggedInWithPlan': 'Signed in as {email} · {plan}', - 'settings.amrLoggedInPill': 'Signed in', - 'settings.amrNotLoggedIn': 'Not signed in', 'settings.amrCloud': 'Open Design AMR', - 'settings.amrAuthorize': 'Authorize', - 'settings.amrBenefitOfficial': 'Officially maintained', - 'settings.amrBenefitLowerPrice': 'Lower price', - 'settings.amrBenefitManyModels': 'Many models', - 'settings.amrPromoBonus': 'Limited bonus: +100%', - 'settings.amrSignInToContinue': 'Sign in to continue', - 'settings.amrSignIn': 'Sign in', - 'settings.amrSignedIn': 'Signed in', - 'settings.amrNotSignedIn': 'Not signed in', - 'settings.amrSigningIn': 'Signing in
', - 'settings.amrCancelSignIn': 'Cancel sign-in', - 'settings.amrAccountStatus': 'AMR account status', - 'settings.amrLoginErrorCompact': 'AMR sign-in failed.', + 'settings.amrAuthorize': 'Autoriser', + 'settings.amrBenefitOfficial': 'Officiel', + 'settings.amrBenefitLowerPrice': 'CoĂ»t rĂ©duit', + 'settings.amrBenefitManyModels': 'Nombreux modĂšles', + 'settings.amrPromoBonus': 'Bonus limitĂ© : +100 %', + 'settings.amrSignInToContinue': 'Connectez-vous pour continuer', + 'settings.amrSignIn': 'Se connecter', + 'settings.amrSignedIn': 'ConnectĂ©', + 'settings.amrNotSignedIn': 'Non connectĂ©', + 'settings.amrSigningIn': 'Connexion
', + 'settings.amrCancelSignIn': 'Annuler la connexion', + 'settings.amrAccountStatus': 'Statut du compte AMR', + 'settings.amrLoginErrorCompact': 'Échec de la connexion AMR.', + 'settings.advanced': 'AvancĂ©', + 'settings.amrLogin': 'Se connecter', + 'settings.amrLogout': 'Se dĂ©connecter', + 'settings.amrLoggingIn': 'Connexion
', + 'settings.amrLoggingOut': 'DĂ©connexion
', + 'settings.amrLoggedInAs': 'ConnectĂ© avec {email}', + 'settings.amrLoggedInWithPlan': 'ConnectĂ© avec {email} · {plan}', + 'settings.amrLoggedInPill': 'ConnectĂ©', + 'settings.amrNotLoggedIn': 'Non connectĂ©', 'settings.apiSection': 'API Anthropic', 'settings.quickFillProvider': 'Remplissage rapide du fournisseur', 'settings.customProvider': 'Fournisseur personnalisĂ©', 'settings.apiKey': 'ClĂ© API', + 'settings.apiKeyGetLink': 'Obtenez votre clĂ© sur {host} ↗', 'settings.showKey': 'Afficher la clĂ©', 'settings.hideKey': 'Masquer la clĂ©', 'settings.show': 'Afficher', 'settings.hide': 'Masquer', 'settings.model': 'ModĂšle', - 'settings.suggestedModelsHint': - 'Ce sont des modĂšles suggĂ©rĂ©s pour ce protocole. Votre fournisseur peut prendre en charge d\'autres modĂšles.', + 'settings.apiKeyInvalid': 'ClĂ© API invalide.', + 'settings.modelsLoadedFromAccount': '✓ {count} modĂšles chargĂ©s depuis votre compte.', + 'settings.fetchModels': 'RĂ©cupĂ©rer les modĂšles', + 'settings.fetchModelsTitle': 'RĂ©cupĂ©rer les modĂšles disponibles auprĂšs de ce fournisseur', + 'settings.fetchModelsRunning': 'RĂ©cupĂ©ration des modĂšles
', + 'settings.fetchModelsMissingFields': 'Renseignez {fields} pour rĂ©cupĂ©rer les modĂšles.', + 'settings.fetchModelsInvalidBaseUrl': 'Saisissez une URL de base valide pour rĂ©cupĂ©rer les modĂšles.', + 'settings.fetchModelsUnsupportedAzure': 'Azure OpenAI utilise des noms de dĂ©ploiement ; la dĂ©couverte de modĂšles n’est donc pas disponible ici.', + 'settings.fetchModelsUnsupportedOllama': 'La dĂ©couverte des modĂšles Ollama Cloud n’est pas encore disponible. Choisissez ou saisissez un modĂšle.', + 'settings.fetchModelsSuccess': 'ModĂšles rĂ©cupĂ©rĂ©s : {count}.', + 'settings.fetchModelsEmpty': 'Aucun modĂšle de texte compatible n’a Ă©tĂ© renvoyĂ©.', + 'settings.fetchModelsUnsupported': 'La dĂ©couverte de modĂšles n’est pas disponible pour ce protocole.', + 'settings.fetchModelsFailed': 'Impossible de rĂ©cupĂ©rer les modĂšles : {detail}', + 'settings.suggestedModelsHint': 'Ce sont des modĂšles suggĂ©rĂ©s pour ce protocole. Votre fournisseur peut prendre en charge d\'autres modĂšles.', 'settings.baseUrl': 'URL de base', 'settings.baseUrlInvalid': 'Saisissez une URL publique http:// ou https:// valide. Localhost est autorisĂ© ; les IP de rĂ©seau privĂ© sont bloquĂ©es.', 'settings.baseUrlCustomize': 'Personnaliser', 'settings.baseUrlDefaultHint': 'Point de terminaison par dĂ©faut. Inutile de le modifier dans la plupart des cas.', 'settings.azureBaseUrlPlaceholder': 'https://my-resource.openai.azure.com', - 'settings.azureBaseUrlHint': 'Find this in Azure portal → your resource → Endpoint.', + 'settings.azureBaseUrlHint': 'Trouvez-la dans le portail Azure → votre ressource → Endpoint.', 'settings.azureDeploymentModel': 'Nom du dĂ©ploiement', - 'settings.azureDeploymentModelHint': - 'Pour Azure OpenAI, ce champ est utilisĂ© comme nom du dĂ©ploiement dans /openai/deployments/. Saisissez le nom du dĂ©ploiement créé dans Azure.', + 'settings.azureDeploymentModelHint': 'Pour Azure OpenAI, ce champ est utilisĂ© comme nom du dĂ©ploiement dans /openai/deployments/. Saisissez le nom du dĂ©ploiement créé dans Azure.', + 'settings.azureModelFetchHint': 'Pour Azure OpenAI, saisissez le nom du dĂ©ploiement créé dans Azure. La dĂ©couverte automatique des dĂ©ploiements n’est pas disponible depuis ce point d’accĂšs BYOK.', 'settings.apiVersion': 'Version API', - 'settings.byokImageModel': "ModĂšle de gĂ©nĂ©ration d'images", + 'settings.byokImageModel': 'ModĂšle de gĂ©nĂ©ration d\'images', 'settings.maxTokens': 'Tokens max (optionnel)', - 'settings.maxTokensHint': - 'Limite de la longueur de rĂ©ponse. Chaque modĂšle a une valeur par dĂ©faut (affichĂ©e Ă  titre indicatif) ; laissez vide pour l\'utiliser, ou entrez un nombre pour la remplacer.', - 'settings.apiHint': 'Les appels passent par le proxy du daemon local vers l’URL de base dĂ©finie. La clĂ© est stockĂ©e uniquement dans ce navigateur et envoyĂ©e avec les requĂȘtes au fournisseur.', + 'settings.maxTokensHint': 'Limite de la longueur de rĂ©ponse. Chaque modĂšle a une valeur par dĂ©faut (affichĂ©e Ă  titre indicatif) ; laissez vide pour l\'utiliser, ou entrez un nombre pour la remplacer.', + 'settings.apiHint': 'StockĂ©e uniquement dans ce navigateur.', 'settings.skipForNow': 'Passer pour l\'instant', 'settings.getStarted': 'Commencer', 'settings.envConfigure': 'Mode d\'exĂ©cution', @@ -307,15 +303,11 @@ export const fr: Dict = { 'settings.modelSourceLive': 'En direct depuis la CLI', 'settings.modelSourceFallback': 'Liste intĂ©grĂ©e', 'settings.reasoningPicker': 'Effort de raisonnement', - 'settings.modelPickerHint': - 'Par dĂ©faut utilise la configuration propre de la CLI. Personnalisé  vous permet de saisir n’importe quel identifiant de modĂšle.', - 'settings.modelPickerLiveHint': - 'Les modĂšles ont Ă©tĂ© actualisĂ©s depuis la CLI installĂ©e. Par dĂ©faut utilise toujours la configuration propre de la CLI.', - 'settings.modelPickerFallbackHint': - 'Valeurs par dĂ©faut intĂ©grĂ©es affichĂ©es. Cliquez sur RĂ©analyser pour rĂ©cupĂ©rer les modĂšles en direct depuis la CLI.', + 'settings.modelPickerHint': 'Par dĂ©faut utilise la configuration propre de la CLI. Personnalisé  vous permet de saisir n’importe quel identifiant de modĂšle.', + 'settings.modelPickerLiveHint': 'Les modĂšles ont Ă©tĂ© actualisĂ©s depuis la CLI installĂ©e. Par dĂ©faut utilise toujours la configuration propre de la CLI.', + 'settings.modelPickerFallbackHint': 'Valeurs par dĂ©faut intĂ©grĂ©es affichĂ©es. Cliquez sur RĂ©analyser pour rĂ©cupĂ©rer les modĂšles en direct depuis la CLI.', 'settings.cliEnvTitle': 'AvancĂ© : proxy et chemins personnalisĂ©s', - 'settings.cliEnvHint': - 'Utilisez ces rĂ©glages uniquement si vous routez le trafic CLI via votre propre proxy ou si le binaire est installĂ© Ă  un emplacement non standard. Les secrets restent dans la configuration locale de l’app et seule la CLI sĂ©lectionnĂ©e les voit.', + 'settings.cliEnvHint': 'Utilisez ces rĂ©glages uniquement si vous routez le trafic CLI via votre propre proxy ou si le binaire est installĂ© Ă  un emplacement non standard. Les secrets restent dans la configuration locale de l’app et seule la CLI sĂ©lectionnĂ©e les voit.', 'settings.cliEnvClaudeConfigDir': 'Dossier de configuration Claude Code', 'settings.cliEnvClaudeBaseUrl': 'URL de base du proxy Claude', 'settings.cliEnvClaudeApiKey': 'ClĂ© API du proxy Claude', @@ -327,8 +319,7 @@ export const fr: Dict = { 'settings.modelCustomLabel': 'Identifiant du modĂšle personnalisĂ©', 'settings.modelCustomPlaceholder': 'ex. anthropic/claude-sonnet-4-6', 'settings.mediaProviders': 'Fournisseurs de mĂ©dias', - 'settings.mediaProvidersHint': - 'ClĂ©s API pour la gĂ©nĂ©ration d’images, de vidĂ©os et d’audio.', + 'settings.mediaProvidersHint': 'ClĂ©s API pour la gĂ©nĂ©ration d’images, de vidĂ©os et d’audio.', 'settings.mcpServerTitle': 'Serveur MCP', 'settings.mcpServerHint': 'Exposez Open Design comme serveur MCP pour votre agent de code.', 'settings.externalMcpTitle': 'MCP externe', @@ -353,14 +344,13 @@ export const fr: Dict = { 'settings.privacyConsentFooter': 'Vous pouvez modifier ces choix Ă  tout moment dans ParamĂštres → ConfidentialitĂ©. Nous ne tĂ©lĂ©versons jamais le contenu de vos fichiers d’artefacts gĂ©nĂ©rĂ©s.', 'settings.privacyConsentShare': 'Partager les donnĂ©es d’utilisation', 'settings.privacyConsentDecline': 'Ne pas partager', - 'settings.privacyConsentAccept': 'I get it', - 'settings.privacyConsentBannerFooter': - 'Data sharing is on by default. You can turn it off any time in Settings → Privacy. We never upload the contents of your generated artifact files.', + 'settings.privacyConsentAccept': 'J’ai compris', + 'settings.privacyConsentBannerFooter': 'Le partage de donnĂ©es est activĂ© par dĂ©faut. Vous pouvez le dĂ©sactiver Ă  tout moment dans ParamĂštres → ConfidentialitĂ©. Nous ne tĂ©lĂ©versons jamais le contenu de vos fichiers d’artefacts gĂ©nĂ©rĂ©s.', 'settings.privacyConsentPolicyLink': 'Lire la politique de confidentialitĂ©', 'settings.privacyMetrics': 'Mesures anonymes', 'settings.privacyMetricsHint': 'Nombre d’exĂ©cutions, usage des tokens, taux d’erreur, durĂ©e. Aucun prompt ni donnĂ©e de projet.', 'settings.privacyContent': 'Contenu de conversation et d’outils', - 'settings.privacyContentHint': "Vos prompts, les rĂ©ponses de l’assistant, les entrĂ©es d’outils et les sorties d’outils (tronquĂ©s avant l’envoi). Les clĂ©s API, tokens, JWT, e-mails, IP et numĂ©ros de carte bancaire sont supprimĂ©s automatiquement avant l’envoi.", + 'settings.privacyContentHint': 'Vos prompts, les rĂ©ponses de l’assistant, les entrĂ©es d’outils et les sorties d’outils (tronquĂ©s avant l’envoi). Les clĂ©s API, tokens, JWT, e-mails, IP et numĂ©ros de carte bancaire sont supprimĂ©s automatiquement avant l’envoi.', 'settings.privacyArtifacts': 'Manifeste des artefacts du projet', 'settings.privacyArtifactsHint': 'Noms, types et tailles des fichiers gĂ©nĂ©rĂ©s. Le contenu des fichiers n’est jamais envoyĂ©.', 'settings.privacyInstallationId': 'ID anonyme', @@ -379,7 +369,37 @@ export const fr: Dict = { 'settings.versionUnavailable': 'Les informations de version sont indisponibles lorsque le daemon est hors ligne.', 'settings.installLatest': 'Installer la derniĂšre version', 'settings.alreadyLatest': 'Vous utilisez la derniĂšre version', - + 'settings.mcpTitle': 'Serveur MCP', + 'settings.mcpHint': 'Permet Ă  un agent de code dans un autre dĂ©pĂŽt (Claude Code, Cursor, VS Code, Antigravity, Zed, Windsurf) de lire vos projets Open Design. Utilisez-le pour intĂ©grer un design dans votre app sans exporter d’abord un zip.', + 'settings.mcpDaemonError': 'Impossible de joindre le daemon local pour rĂ©soudre les chemins d’installation ({error}). VĂ©rifiez qu’Open Design fonctionne, puis rouvrez ce panneau.', + 'settings.mcpBuildDaemon': 'Construisez d’abord le daemon.', + 'settings.mcpNodeMissing': 'Le binaire Node est introuvable.', + 'settings.mcpBuildHint': 'apps/daemon/dist/cli.js est introuvable. ExĂ©cutez `pnpm --filter @open-design/daemon build`, puis actualisez.', + 'settings.mcpMethodCli': 'Commande CLI', + 'settings.mcpInstructionCli': 'ExĂ©cutez ceci dans votre terminal.', + 'settings.mcpMethodToml': 'Configuration TOML', + 'settings.mcpInstructionCodex': 'Ajoutez cette table Ă  {path}. La mĂȘme configuration est partagĂ©e entre la CLI Codex et l’extension Codex IDE.', + 'settings.mcpMethodOneClick': 'Installation en un clic', + 'settings.mcpInstructionCursor': 'Cliquez sur « Installer dans Cursor » pour installer avec une boĂźte de validation, ou fusionnez ce JSON dans {path}.', + 'settings.mcpDeeplinkInstallCursor': 'Installer dans Cursor', + 'settings.mcpMethodJson': 'Configuration JSON', + 'settings.mcpInstructionCopilot': 'Ouvrez la palette de commandes ({shortcut}), lancez "MCP: Open User Configuration", puis fusionnez ce JSON. Copilot Chat doit ĂȘtre en mode Agent pour afficher les outils.', + 'settings.mcpInstructionAntigravity': 'Dans Antigravity : panneau Agent, menu "..." → MCP Servers → Manage MCP Servers → View raw config. Fusionnez ce JSON.', + 'settings.mcpInstructionZed': 'Ouvrez les rĂ©glages Zed ({shortcut}) et fusionnez ceci dans l’objet racine. Zed utilise "context_servers", pas "mcpServers".', + 'settings.mcpInstructionWindsurf': 'Ouvrez {path} (ou utilisez l’icĂŽne MCPs dans Cascade → Configure), puis fusionnez :', + 'settings.mcpCopyAria': 'Copier l’extrait de configuration MCP', + 'settings.mcpResolvingFailed': '# Ă©chec de rĂ©solution des chemins, voir l’erreur ci-dessus', + 'settings.mcpLoadingPaths': '# chargement des chemins d’installation depuis le daemon local
', + 'settings.mcpCopied': 'CopiĂ©', + 'settings.mcpCopy': 'Copier', + 'settings.mcpCursorApproval': 'Cursor affiche une boĂźte de validation avant d’écrire la configuration.', + 'settings.mcpRestartNote': 'RedĂ©marrez votre client pour charger le nouveau serveur.', + 'settings.mcpRestartDetail': 'La plupart des Ă©diteurs ne chargent les serveurs MCP qu’au dĂ©marrage. Dans Cursor / VS Code / Antigravity / Windsurf, vous pouvez lancer `Developer: Reload Window` depuis la palette de commandes au lieu de tout redĂ©marrer. Zed et Claude Code nĂ©cessitent de quitter puis rouvrir.', + 'settings.mcpCapabilitiesTitle': 'Ce que votre agent peut faire', + 'settings.mcpCapabilityRead': 'Lire ou rechercher n’importe quel fichier dans un projet (HTML, JSX, CSS, JSON, SVG, Markdown).', + 'settings.mcpCapabilityPull': 'RĂ©cupĂ©rer un bundle de design en un seul appel : le fichier d’entrĂ©e plus chaque variable CSS, composant et police rĂ©fĂ©rencĂ©.', + 'settings.mcpCapabilityDefault': 'Utiliser par dĂ©faut le projet et le fichier ouverts dans Open Design, afin que vous puissiez dire « intĂšgre ce design dans mon application » sans reprĂ©ciser quel design.', + 'settings.mcpRunningNote': 'Open Design doit ĂȘtre lancĂ© pour que les appels d’outils MCP rĂ©ussissent. Si vous avez dĂ©marrĂ© votre agent de code avant d’ouvrir Open Design, redĂ©marrez l’agent pour qu’il puisse joindre le daemon actif.', 'entry.tabDesigns': 'Designs', 'entry.tabTemplates': 'ModĂšles', 'entry.tabDesignSystems': 'SystĂšmes de design', @@ -389,27 +409,508 @@ export const fr: Dict = { 'entry.resizeAria': 'Redimensionner la barre latĂ©rale', 'entry.loadingWorkspace': 'Chargement de l\'espace de travail
', 'entry.useEverywhereTitle': 'Utiliser partout', - 'entry.useEverywhereAria': 'Ouvrir le guide « Utiliser partout » (CLI, MCP, HTTP, Skills)', + 'entry.useEverywhereAria': 'Ouvrir le guide « Utiliser partout » (CLI, MCP, HTTP, compĂ©tences)', 'entry.navNewProject': 'Nouveau projet', 'entry.navHome': 'Accueil', 'entry.navProjects': 'Projets', + 'entry.navTasks': 'Automatisations', + 'entry.navPlugins': 'Plugins', 'entry.navDesignSystems': 'SystĂšmes de design', - 'designSystemPicker.select': 'Choisir un design system', - 'designSystemPicker.loading': 'Chargement des design systems
', - 'designSystemPicker.searchPlaceholder': 'Rechercher des design systems (titre / catĂ©gorie / rĂ©sumĂ©)', - 'designSystemPicker.searchCompactPlaceholder': 'Rechercher des design systems', - 'designSystemPicker.noneTitle': 'Aucun design system', + 'entry.navIntegrations': 'IntĂ©grations', + 'workspaceTabs.project': 'Projet', + 'workspaceTabs.pluginDetails': 'DĂ©tails du plugin', + 'workspaceTabs.marketplace': 'Marketplace', + 'homeHero.title': 'Que voulez-vous designer ?', + 'homeHero.subtitlePrefix': 'L’alternative open source Ă  Claude Design.', + 'homeHero.placeholder': 'DĂ©crivez ce que vous voulez gĂ©nĂ©rer
', + 'homeHero.placeholderActive': 'Modifiez la requĂȘte d’exemple ou Ă©crivez la vĂŽtre
', + 'homeHero.skills': 'CompĂ©tences', + 'homeHero.applying': 'Application
', + 'homeHero.pluginTitle': 'Plugin : {title}', + 'homeHero.pluginPrefix': 'Plugin : {title}', + 'homeHero.skillPrefix': 'CompĂ©tence : {title}', + 'homeHero.removePlugin': 'Retirer le plugin', + 'homeHero.removePluginAria': 'Retirer le plugin {title}', + 'homeHero.clearActivePlugin': 'Effacer le plugin actif', + 'homeHero.clearActiveSkill': 'Effacer la compĂ©tence active', + 'homeHero.contextItemsResolved': '{n} Ă©lĂ©ments de contexte rĂ©solus', + 'homeHero.removeFile': 'Retirer le fichier', + 'homeHero.contextSearchResults': 'RĂ©sultats de recherche de contexte', + 'homeHero.contextSurfaces': 'Surfaces de contexte', + 'homeHero.loadingContext': 'Chargement du contexte
', + 'homeHero.noResults': 'Aucun rĂ©sultat pour « {query} ».', + 'homeHero.searchPrompt': 'Rechercher des plugins, compĂ©tences, serveurs MCP et connecteurs.', + 'homeHero.parameters': '{n} paramĂštres', + 'homeHero.details': 'DĂ©tails', + 'homeHero.toRun': 'pour lancer', + 'homeHero.forNewLine': 'pour passer Ă  la ligne', + 'homeHero.run': 'Lancer', + 'homeHero.typeSomethingToRun': 'Saisissez quelque chose Ă  lancer', + 'homeHero.promptExamples': 'Exemples de prompts', + 'homeHero.footer.designSystem': 'Style', + 'homeHero.footer.autoDesignSystem': 'Auto', + 'homeHero.footer.autoDesignSystemSummary': 'Associe automatiquement le systĂšme de design et le style visuel les plus adaptĂ©s au prompt actuel.', + 'homeHero.footer.ratio': 'Ratio', + 'homeHero.footer.duration': 'DurĂ©e', + 'homeHero.footer.resolution': 'RĂ©solution', + 'homeHero.footer.speakerNotes': 'Notes', + 'homeHero.footer.noSpeakerNotes': 'Sans notes', + 'homeHero.footer.availableCount': '{n} disponibles', + 'homeHero.footer.noMatches': 'Aucun rĂ©sultat', + 'homeHero.moreShortcuts': 'Plus', + 'homeHero.railAria': 'Choisir une catĂ©gorie de projet ou un raccourci de dĂ©marrage', + 'homeHero.confirmReplaceTitle': 'Remplacer le prompt actuel ?', + 'homeHero.confirmReplaceBody': 'Utiliser {title} remplacera le texte actuellement dans le champ.', + 'homeHero.confirmReplace': 'Remplacer', + 'homeHero.chip.prototype': 'Prototype', + 'homeHero.chip.liveArtifact': 'Artefact dynamique', + 'homeHero.chip.deck': 'PrĂ©sentation', + 'homeHero.chip.image': 'Image', + 'homeHero.chip.video': 'VidĂ©o', + 'homeHero.chip.hyperframes': 'HyperFrames', + 'homeHero.chip.audio': 'Audio', + 'homeHero.chip.createPlugin': 'CrĂ©er un plugin', + 'homeHero.chip.figma': 'Depuis Figma', + 'homeHero.chip.folder': 'Depuis un dossier', + 'homeHero.chip.template': 'Depuis un modĂšle', + 'homeHero.chip.liveArtifactHint': 'CrĂ©er un artefact HTML/CSS/JS interactif que vous pouvez prĂ©visualiser en direct.', + 'homeHero.chip.hyperframesHint': 'CrĂ©er du motion design basĂ© sur HTML : sous-titres, visuels rĂ©actifs Ă  l’audio, transitions de scĂšnes.', + 'homeHero.chip.createPluginHint': 'CrĂ©er un plugin Open Design rĂ©utilisable et l’ajouter Ă  Mes plugins.', + 'homeHero.chip.figmaHint': 'Migrer une frame Figma vers le systĂšme de design actif.', + 'homeHero.chip.folderHint': 'Importer un dossier local existant et continuer Ă  l’éditer.', + 'homeHero.chip.templateHint': 'Commencer depuis un modĂšle intĂ©grĂ©.', + 'workingDirPicker.title': 'Dossier', + 'workingDirPicker.homeTitle': 'Choisissez oĂč ce projet doit vivre', + 'workingDirPicker.processing': 'Traitement
', + 'workingDirPicker.select': 'Choisir le dossier', + 'workingDirPicker.clearAria': 'Effacer le dossier de travail', + 'workingDirPicker.replaceFailed': 'Impossible de remplacer le dossier de travail', + 'workingDirPicker.unavailable': 'Le sĂ©lecteur de dossier n’est pas disponible dans cette build. Lancez l’app desktop pour choisir un dossier.', + 'workingDirPicker.openUnavailable': 'Ouvrez ce projet dans l’app desktop pour afficher le dossier.', + 'workingDirPicker.openFailed': 'Impossible d’afficher ce dossier', + 'workingDirPicker.showInFileManager': 'Afficher dans le gestionnaire de fichiers', + 'workingDirPicker.replace': 'Effacer et remplacer le dossier
', + 'workingDirPicker.recent': 'Dossiers rĂ©cents', + 'handoff.toTarget': 'TransfĂ©rer vers {target}', + 'handoff.action': 'TransfĂ©rer', + 'handoff.fallbackTitle': 'Aucun Ă©diteur trouvĂ© dans $PATH - ouverture dans {target}', + 'handoff.chooseTargetAria': 'Choisir la cible du transfert', + 'handoff.notInstalled': 'Non installĂ©', + 'handoff.notDetectedTitle': '{target} - non dĂ©tectĂ© dans $PATH', + 'handoff.openInTarget': 'Ouvrir dans {target}', + 'handoff.openAction': 'Ouvrir', + 'handoff.menuTitle': 'Ouvrir dans quel Ă©diteur ?', + 'designSystemPicker.select': 'Choisir un systĂšme de design', + 'designSystemPicker.loading': 'Chargement des systĂšmes de design
', + 'designSystemPicker.searchPlaceholder': 'Rechercher des systĂšmes de design (titre / catĂ©gorie / rĂ©sumĂ©)', + 'designSystemPicker.searchCompactPlaceholder': 'Rechercher des systĂšmes de design', + 'designSystemPicker.noneTitle': 'Aucun systĂšme de design', 'designSystemPicker.noneSummary': 'Laisser le modĂšle choisir librement', - 'designSystemPicker.empty': 'Aucun design system correspondant', + 'designSystemPicker.empty': 'Aucun systĂšme de design correspondant', 'designSystemPicker.openPreview': 'Ouvrir l’aperçu', 'designSystemPicker.loadingPreview': 'Chargement de l’aperçu
', - 'designSystemPicker.noPreview': 'Aucune page d’aperçu. Ouvrez Design Systems pour voir l’aperçu complet.', - 'designSystemPicker.previewHint': 'Survolez un design system pour le prĂ©visualiser', + 'designSystemPicker.noPreview': 'Aucune page d’aperçu. Ouvrez SystĂšmes de design pour voir l’aperçu complet.', + 'designSystemPicker.previewHint': 'Survolez un systĂšme de design pour le prĂ©visualiser', 'designSystemPicker.fullscreenAria': 'Aperçu plein Ă©cran de {title}', 'designSystemPicker.closeFullscreen': 'Fermer l’aperçu plein Ă©cran', 'designSystemPicker.closeEsc': 'Fermer (Esc)', 'designSystemPicker.previewFrameTitle': 'Aperçu de {title}', 'designSystemPicker.fullscreenFrameTitle': 'Aperçu plein Ă©cran de {title}', + 'recentProjects.title': 'Projets rĂ©cents', + 'recentProjects.viewAll': 'Tout voir', + 'recentProjects.empty': 'Aucun projet pour l’instant — saisissez un prompt pour en crĂ©er un.', + 'pluginsHome.title': 'CommunautĂ©', + 'pluginsHome.subtitle': 'Workflows Open Design prĂȘts Ă  l’emploi, intĂ©grĂ©s Ă  ce runtime. Choisissez-en un pour charger un prompt de dĂ©part, ou parcourez le registre pour en trouver d’autres.', + 'pluginsHome.browseRegistry': 'Parcourir le registre', + 'pluginsHome.count': '{filtered} sur {total}', + 'pluginsHome.loadingCatalog': 'Chargement du catalogue
', + 'pluginsHome.emptyCatalog': 'Le catalogue est vide. Les plugins intĂ©grĂ©s sont fournis avec Open Design et devraient apparaĂźtre ici automatiquement — essayez de redĂ©marrer le daemon si cela persiste.', + 'pluginsHome.emptyFiltered': 'Aucun plugin ne correspond aux filtres actuels.', + 'pluginsHome.clearFilters': 'Effacer les filtres', + 'pluginsHome.modeAria': 'Mode du plugin', + 'pluginsHome.featured': 'EnregistrĂ©s', + 'pluginsHome.totalInCatalog': '{n} dans le catalogue', + 'pluginsHome.categoryFilterAria': 'Filtre de catĂ©gorie', + 'pluginsHome.subcategoryFilterAria': 'Filtre de sous-catĂ©gorie {label}', + 'pluginsHome.allCategory': 'Tous les {label}', + 'pluginsHome.searchPlaceholder': 'Rechercher des plugins
', + 'pluginsHome.searchAria': 'Rechercher des plugins', + 'pluginsHome.clearSearch': 'Effacer la recherche', + 'pluginsHome.facet.import': 'Importer', + 'pluginsHome.facet.create': 'CrĂ©er', + 'pluginsHome.facet.export': 'Exporter', + 'pluginsHome.facet.share': 'Partager', + 'pluginsHome.facet.deploy': 'DĂ©ployer', + 'pluginsHome.facet.refine': 'Affiner', + 'pluginsHome.facet.extend': 'Étendre', + 'pluginsHome.facet.figma': 'Figma', + 'pluginsHome.facet.github': 'GitHub', + 'pluginsHome.facet.codeFolder': 'Code / dossier', + 'pluginsHome.facet.url': 'URL', + 'pluginsHome.facet.screenshot': 'Capture d’écran', + 'pluginsHome.facet.pdf': 'PDF', + 'pluginsHome.facet.pptx': 'PPTX', + 'pluginsHome.facet.framer': 'Framer', + 'pluginsHome.facet.webflow': 'Webflow', + 'pluginsHome.facet.slides': 'Slides', + 'pluginsHome.facet.publicLink': 'Lien public', + 'pluginsHome.facet.githubPr': 'PR GitHub', + 'pluginsHome.facet.githubGist': 'Gist GitHub', + 'pluginsView.lede': 'Parcourez les workflows installĂ©s, dĂ©couvrez les entrĂ©es du registre, gĂ©rez les sources et prĂ©parez les plugins pour une distribution d’équipe.', + 'pluginsView.importPlugin': 'Importer un plugin', + 'pluginsView.agentContext': 'Contexte agent', + 'pluginsView.summaryAria': 'RĂ©sumĂ© des plugins', + 'pluginsView.areasAria': 'Zones des plugins', + 'pluginsView.loading': 'Chargement des plugins
', + 'pluginsView.tab.installed': 'InstallĂ©s', + 'pluginsView.tab.available': 'Disponibles', + 'pluginsView.tab.sources': 'Sources', + 'pluginsView.tab.team': 'Équipe', + 'pluginsView.tabHint.installed': 'Vos plugins', + 'pluginsView.tabHint.available': 'Depuis les sources', + 'pluginsView.tabHint.sources': 'Catalogues', + 'pluginsView.tabHint.team': 'Entreprise', + 'pluginsView.installedTitle': 'Plugins installĂ©s', + 'pluginsView.installedSubtitle': 'Plugins que vous avez importĂ©s ou installĂ©s depuis des sources de marketplace.', + 'pluginsView.installedEmpty': 'Aucun plugin utilisateur installĂ© pour l’instant. Utilisez CrĂ©er / Importer ou installez une entrĂ©e disponible.', + 'pluginsView.availableTitle': 'Disponibles depuis les sources', + 'pluginsView.availableSubtitle': 'EntrĂ©es de catalogue dĂ©couvertes depuis les marketplaces configurĂ©es.', + 'pluginsView.availableFiltersAria': 'Filtres des plugins disponibles', + 'pluginsView.searchAvailableAria': 'Rechercher des plugins disponibles', + 'pluginsView.searchAvailablePlaceholder': 'Rechercher des plugins disponibles', + 'pluginsView.clearAvailableSearch': 'Effacer la recherche de plugins disponibles', + 'pluginsView.source': 'Source', + 'pluginsView.availableEmptyInstalled': 'Aucune entrĂ©e disponible pour l’instant. Les entrĂ©es installĂ©es sont retirĂ©es de Disponibles ; dĂ©sinstallez-en une pour la rendre de nouveau disponible.', + 'pluginsView.availableEmptyFiltered': 'Aucune entrĂ©e disponible ne correspond Ă  vos filtres.', + 'pluginsView.availableEmptyNoSources': 'Aucune entrĂ©e disponible pour l’instant. Ajoutez une source dans l’onglet Sources.', + 'pluginsView.installing': 'Installation
', + 'pluginsView.install': 'Installer', + 'pluginsView.sourcesTitle': 'Sources du registre', + 'pluginsView.sourcesSubtitle': 'Catalogues de marketplaces qui alimentent les plugins disponibles.', + 'pluginsView.sourceUrl': 'URL de la source', + 'pluginsView.defaultTrust': 'Confiance par dĂ©faut', + 'pluginsView.trust.restricted': 'Restreinte', + 'pluginsView.trust.trusted': 'Fiable', + 'pluginsView.trust.official': 'Officielle', + 'pluginsView.adding': 'Ajout
', + 'pluginsView.addSource': 'Ajouter une source', + 'pluginsView.sourcesEmpty': 'Aucune source de registre configurĂ©e pour l’instant.', + 'pluginsView.pluginsCount': '{n} plugins', + 'pluginsView.catalogVersion': 'catalogue v{version}', + 'pluginsView.trustFor': 'Confiance pour {name}', + 'pluginsView.refreshing': 'Actualisation
', + 'pluginsView.removing': 'Suppression
', + 'pluginsView.teamTitle': 'Marketplaces privĂ©es d’équipe', + 'pluginsView.teamBody': 'Cette zone est rĂ©servĂ©e aux catalogues entreprise et Ă©quipe, aux politiques de confiance privĂ©es et aux contrĂŽles partagĂ©s du cycle de vie des plugins.', + 'pluginCard.details': 'DĂ©tails', + 'pluginCard.use': 'Utiliser', + 'pluginCard.useWithQuery': 'Utiliser avec une requĂȘte', + 'pluginCard.applying': 'Application
', + 'pluginCard.publish': 'Publier', + 'pluginCard.contribute': 'Contribuer', + 'pluginCard.starting': 'DĂ©marrage
', + 'pluginCard.detailsAria': 'Voir les dĂ©tails de {title}', + 'pluginCard.chooseUseAria': 'Choisir comment utiliser {title}', + 'pluginCard.useOptionsAria': 'Options d’utilisation pour {title}', + 'pluginCard.shareAria': 'Partager {title}', + 'pluginCard.publishAria': 'Publier {title} comme dĂ©pĂŽt GitHub', + 'pluginCard.publishTitle': 'Publier le plugin comme dĂ©pĂŽt GitHub', + 'pluginCard.contributeAria': 'Soumettre {title} Ă  Open Design', + 'pluginCard.contributeTitle': 'Soumettre le plugin Ă  Open Design via une pull request', + 'skillPluginCandidate.createForMe': 'CrĂ©er pour moi', + 'skillPluginCandidate.contributeToMain': 'Contribuer Ă  main', + 'skillPluginCandidate.publishRepo': 'Publier le dĂ©pĂŽt', + 'skillPluginCandidate.dismiss': 'Ignorer', + 'skillPluginCandidate.repoDescription': 'Ce dĂ©pĂŽt semble pouvoir fonctionner comme plugin.', + 'integrations.kicker': 'IntĂ©gration', + 'integrations.lede': 'Connectez des systĂšmes externes, ajoutez des outils MCP Ă  votre boucle agent et utilisez Open Design depuis d’autres IDE, scripts et automatisations.', + 'integrations.agentReady': 'PrĂȘt pour les agents', + 'integrations.areasAria': 'Zones d’intĂ©gration', + 'integrations.tabLabel.mcp': 'MCP', + 'integrations.tabLabel.skills': 'CompĂ©tences', + 'integrations.tabHint.mcp': 'Outils externes', + 'integrations.tabHint.connectors': 'Comptes et API', + 'integrations.tabHint.useEverywhere': 'CLI, HTTP, MCP', + 'integrations.skillsTitle': 'IntĂ©grations de compĂ©tences', + 'integrations.skillsBody': 'La gestion des intĂ©grations au niveau des compĂ©tences est en cours de reprise depuis une autre branche. Cet onglet est rĂ©servĂ© afin que MCP, les connecteurs et la future configuration des compĂ©tences vivent dans la mĂȘme route IntĂ©grations.', + 'mcpClient.title': 'Serveurs MCP externes', + 'mcpClient.subtitle': 'Outils tiers pour votre agent de code.', + 'mcpClient.addServer': 'Ajouter un serveur', + 'mcpClient.emptyTitle': 'Aucun serveur MCP configurĂ©.', + 'mcpClient.emptyBody': 'Cliquez sur « Ajouter un serveur » pour commencer — choisissez un modĂšle (Higgsfield OpenClaw, Pollinations, Allyson, Imagician, EdgeOne Pages, GitHub, Filesystem
) ou configurez un serveur stdio / HTTP personnalisĂ©.', + 'mcpClient.saveChanges': 'Enregistrer les modifications', + 'mcpClient.storedAt': 'StockĂ© dans', + 'mcpClient.daemonError': 'Impossible de joindre le daemon local. VĂ©rifiez qu’Open Design est lancĂ©, puis rouvrez ce panneau.', + 'mcpClient.saveFailed': 'Échec de l’enregistrement. VĂ©rifiez que le daemon est lancĂ©, puis rĂ©essayez.', + 'useEverywhere.modalAria': 'Utiliser Open Design partout', + 'useEverywhere.modalTitle': 'Utiliser Open Design partout', + 'useEverywhere.modalSubtitle': 'Ajoutez Open Design Ă  n’importe quel IDE, agent ou script — CLI, HTTP, MCP et compĂ©tences. Utilisez « Copier le guide pour un agent » puis collez-le dans Claude Code, Codex, Cursor, openclaw ou hermes pour tout configurer.', + 'useEverywhere.closeAria': 'Fermer Utiliser partout', + 'useEverywhere.closeTitle': 'Fermer (Échap)', + 'useEverywhere.tabsAria': 'Surfaces d’intĂ©gration', + 'useEverywhere.footStrong': 'Transfert en un clic.', + 'useEverywhere.footBody': 'Copie un guide Markdown structurĂ© que votre agent peut exĂ©cuter immĂ©diatement — installer, vĂ©rifier et utiliser.', + 'useEverywhere.configureMcp': 'Configurer le serveur MCP', + 'useEverywhere.copyGuide': 'Copier le guide pour un agent', + 'useEverywhere.copy': 'Copier', + 'useEverywhere.copied': 'CopiĂ©', + 'useEverywhere.copyFailed': 'Échec de la copie', + 'useEverywhere.copySnippetAria': 'Copier l’extrait : {label}', + 'useEverywhere.section.overview.tab': 'Vue d’ensemble', + 'useEverywhere.section.overview.heading': 'Open Design fonctionne partout oĂč votre agent fonctionne', + 'useEverywhere.section.overview.intro': 'Open Design est plus qu’une fenĂȘtre : c’est un daemon local privilĂ©giĂ© (`od`) plus un registre de compĂ©tences, systĂšmes de design et Atoms. Une fois lancĂ© sur votre machine, tout agent de code (Claude Code, Codex, Cursor, OpenCode/openclaw, Hermes ou votre propre script) peut piloter des gĂ©nĂ©rations, inspecter les projets et produire des artefacts de design via quatre surfaces interchangeables.', + 'useEverywhere.section.overview.bullet1': 'CLI — `od ` pour scripts sans interface, CI et automatisation shell.', + 'useEverywhere.section.overview.bullet2': 'Serveur MCP — expose Open Design comme serveur Model Context Protocol afin que tout agent compatible MCP puisse lister les compĂ©tences, lancer des scĂ©narios et lire les artefacts.', + 'useEverywhere.section.overview.bullet3': 'API HTTP — endpoints REST + SSE `http://127.0.0.1:7456/api/*` ; la mĂȘme surface que celle utilisĂ©e par l’UI web.', + 'useEverywhere.section.overview.bullet4': 'CompĂ©tences — packs `SKILL.md` prĂȘts Ă  dĂ©poser (compatibles Claude) que tout agent dĂ©jĂ  dans votre PATH peut invoquer mĂȘme sans Open Design.', + 'useEverywhere.section.overview.bullet5': 'Artefacts standards — amorcez de vrais projets HTML depuis les compĂ©tences, les plugins par dĂ©faut intĂ©grĂ©s et les exemples de plugins communautaires avant le dĂ©marrage du daemon.', + 'useEverywhere.section.overview.snippet1': 'DĂ©marrer le daemon (et l’UI web) localement', + 'useEverywhere.section.overview.snippet2': 'Confirmer qu’il est joignable', + 'useEverywhere.section.overview.snippet3': 'IngĂ©rer les artefacts standards avant le dĂ©marrage', + 'useEverywhere.section.overview.footer': 'Par dĂ©faut, le daemon Ă©crit dans `./.od/` (local au projet). DĂ©finissez `OD_DATA_DIR=~/.open-design` pour partager les donnĂ©es entre projets.', + 'useEverywhere.section.cli.tab': 'CLI · od', + 'useEverywhere.section.cli.heading': 'Piloter Open Design depuis n’importe quel shell', + 'useEverywhere.section.cli.intro': 'Le binaire `od` est fourni avec le daemon et c’est le mĂȘme binaire qu’utilisent Claude Code / Codex lorsqu’ils lancent une gĂ©nĂ©ration. La plupart des sous-commandes sont de fins clients qui POSTent vers le daemon local ; elles fonctionnent donc de la mĂȘme façon, que vous l’ayez lancĂ© via `pnpm tools-dev` ou comme app packagĂ©e.', + 'useEverywhere.section.cli.bullet1': '`od` (sans argument) — dĂ©marre le daemon et ouvre l’UI web.', + 'useEverywhere.section.cli.bullet2': '`od media generate ...` — produit des octets image / vidĂ©o / audio via le protocole mĂ©dia unifiĂ©.', + 'useEverywhere.section.cli.bullet3': '`od run ...` — dĂ©marre une exĂ©cution de projet depuis un prompt + une compĂ©tence.', + 'useEverywhere.section.cli.bullet4': '`od plugin install ` / `od plugin apply ` — installe et applique des plugins communautaires.', + 'useEverywhere.section.cli.bullet5': '`od skills list` / `od design-systems list` — inspecte ce qui est disponible localement.', + 'useEverywhere.section.cli.bullet6': '`od status` / `od doctor` — vĂ©rifie la santĂ© du daemon et dĂ©tecte les CLI d’agents dans votre PATH.', + 'useEverywhere.section.cli.snippet1': 'GĂ©nĂ©rer une image (dĂ©lĂšgue au fournisseur mĂ©dia configurĂ©)', + 'useEverywhere.section.cli.snippet2': 'Lancer un plugin de scĂ©nario en mode sans interface et streamer les Ă©vĂ©nements en lignes JSON', + 'useEverywhere.section.cli.snippet3': 'Inventorier les compĂ©tences et systĂšmes de design disponibles localement', + 'useEverywhere.section.cli.snippet4': 'VĂ©rifier les artefacts amorcĂ©s via la CLI', + 'useEverywhere.section.cli.snippet5': 'VĂ©rifier l’environnement + les agents dĂ©tectĂ©s (Claude, Codex, Cursor, 
)', + 'useEverywhere.section.cli.footer': 'Toutes les sous-commandes acceptent `--daemon-url http://127.0.0.1:` pour cibler un daemon en cours d’exĂ©cution prĂ©cis — utile avec une deuxiĂšme instance sandboxĂ©e pour les tests.', + 'useEverywhere.section.mcp.tab': 'Serveur MCP', + 'useEverywhere.section.mcp.heading': 'Exposer Open Design comme serveur MCP Ă  tout agent de code', + 'useEverywhere.section.mcp.intro': 'Open Design fournit un serveur Model Context Protocol (`od mcp`) qui permet Ă  tout client compatible MCP — Cursor, Claude Code, Antigravity, VS Code Copilot Chat, openclaw, hermes — de dĂ©couvrir les outils Open Design (lister les compĂ©tences, rendre les aperçus, gĂ©nĂ©rer des mĂ©dias, lancer des plugins) sans exĂ©cuter manuellement de commandes shell. Le daemon publie un extrait d’installation prĂȘt Ă  coller via `GET /api/mcp/install-info` pour chaque grand client.', + 'useEverywhere.section.mcp.bullet1': 'Transport stdio — aucun port supplĂ©mentaire, le client lance directement `od mcp`.', + 'useEverywhere.section.mcp.bullet2': 'DĂ©couvre automatiquement l’URL du daemon actif via le socket IPC local quand il est lancĂ© comme sidecar.', + 'useEverywhere.section.mcp.bullet3': 'Retombe sur `--daemon-url http://127.0.0.1:` pour les installations simples afin que le processus MCP trouve toujours un daemon en cours d’exĂ©cution.', + 'useEverywhere.section.mcp.bullet4': 'Fixe `OD_DATA_DIR` pour que le processus MCP lancĂ© Ă©crive au mĂȘme endroit que le daemon dĂ©jĂ  actif (Ă©vite EPERM dans les bundles macOS packagĂ©s).', + 'useEverywhere.section.mcp.snippet1': 'Configuration gĂ©nĂ©rique de client MCP (fonctionne dans Cursor, Claude Code, Codex, 
)', + 'useEverywhere.section.mcp.snippet2': 'Ou : demander au daemon l’extrait adaptĂ© Ă  votre installation', + 'useEverywhere.section.mcp.snippet3': 'Variante MCP pour artefacts dynamiques (lire et actualiser des dashboards)', + 'useEverywhere.section.mcp.footer': 'Dans l’app Open Design, ouvrez ParamĂštres → IntĂ©grations pour copier une commande d’installation propre au client (Cursor, Claude Code, Antigravity, VS Code) au lieu d’éditer du JSON Ă  la main.', + 'useEverywhere.section.http.tab': 'API HTTP', + 'useEverywhere.section.http.heading': 'La mĂȘme surface REST + SSE que l’UI web', + 'useEverywhere.section.http.intro': 'Le daemon local expose une API HTTP sur `http://127.0.0.1:7456` (port configurable). Tous les endpoints appelĂ©s par l’UI web peuvent aussi ĂȘtre utilisĂ©s par vos scripts. Les endpoints de streaming (tours de chat, exĂ©cutions de projet) Ă©mettent des Server-Sent Events avec les types de contrat de `@open-design/contracts`.', + 'useEverywhere.section.http.bullet1': '`GET /api/health` — disponibilitĂ© du daemon.', + 'useEverywhere.section.http.bullet2': '`GET /api/skills` et `GET /api/design-systems` — registres disponibles.', + 'useEverywhere.section.http.bullet3': '`GET /api/projects` et `POST /api/projects` — lister et crĂ©er des projets (POST renvoie le projet + la premiĂšre conversation).', + 'useEverywhere.section.http.bullet4': '`GET /api/projects/:id/chat` — flux SSE des Ă©vĂ©nements agent pour une conversation.', + 'useEverywhere.section.http.bullet5': '`POST /api/plugins/:id/apply` — associe un plugin installĂ© et renvoie sa requĂȘte d’exemple rendue + ses inputs.', + 'useEverywhere.section.http.bullet6': '`GET /api/agents` — CLI d’agents de code dĂ©tectĂ©es dans votre PATH.', + 'useEverywhere.section.http.snippet1': 'Lister les compĂ©tences installĂ©es (l’agent les utilisera comme modĂšles)', + 'useEverywhere.section.http.snippet2': 'CrĂ©er un projet depuis un prompt (flux complet cĂŽtĂ© serveur)', + 'useEverywhere.section.http.snippet3': 'Streamer un tour de chat (SSE — chaque ligne est compatible JSON Lines)', + 'useEverywhere.section.http.footer': 'Les types TypeScript purs pour chaque requĂȘte/rĂ©ponse vivent dans `@open-design/contracts` — importez-les dans votre script pour profiter de l’autocomplĂ©tion sans gĂ©nĂ©rateur.', + 'useEverywhere.section.skills.tab': 'CompĂ©tences et mode sans interface', + 'useEverywhere.section.skills.heading': 'CompĂ©tences prĂȘtes Ă  dĂ©poser pour tout agent — mĂȘme sans Open Design lancĂ©', + 'useEverywhere.section.skills.intro': 'Une compĂ©tence est un dossier avec un `SKILL.md` compatible Claude (front matter YAML + corps). Open Design Ă©tend ce format avec l’espace de noms `od:` (`mode`, `preview`, `design_system`, `inputs`, 
) afin que le mĂȘme artefact puisse ĂȘtre utilisĂ© dans Open Design et par un agent vanilla comme Claude Code, Codex, openclaw ou hermes. La dĂ©couverte suit une chaĂźne de prioritĂ© pour que les projets puissent remplacer leurs propres compĂ©tences.', + 'useEverywhere.section.skills.bullet1': 'DĂ©couverte : `./.claude/skills/` → `./skills/` → `~/.claude/skills/` (le projet gagne).', + 'useEverywhere.section.skills.bullet2': 'CrĂ©ez un lien symbolique vers une compĂ©tence dans plusieurs projets pour la partager sans copie.', + 'useEverywhere.section.skills.bullet3': 'Chaque compĂ©tence peut dĂ©clarer des connecteurs, atoms, exigences de systĂšme de design et un exemple `preview` pour la galerie.', + 'useEverywhere.section.skills.bullet4': 'Mode sans interface : un agent avec `od` dans son PATH peut appeler `od skills list` puis lancer n’importe quelle compĂ©tence ; le daemon est optionnel pour les flux en lecture seule.', + 'useEverywhere.section.skills.bullet5': '`pnpm seed:test-projects` exerce la mĂȘme forme d’artefact avec les exemples de plugins par dĂ©faut et communautaires, puis stocke les projets `index.html` obtenus comme donnĂ©es de test rĂ©utilisables.', + 'useEverywhere.section.skills.snippet1': 'SKILL.md minimal (front matter compatible Claude + extras Open Design)', + 'useEverywhere.section.skills.snippet2': 'CrĂ©er un lien symbolique vers une compĂ©tence partagĂ©e dans un projet (style cc-switch)', + 'useEverywhere.section.skills.snippet3': 'Mode sans interface : lister les compĂ©tences que le daemon voit maintenant', + 'useEverywhere.section.skills.snippet4': 'Lot de fixtures d’artefacts sans interface', + 'useEverywhere.section.skills.footer': 'Spec : `docs/skills-protocol.md` et `docs/agent-adapters.md` couvrent toute la surface des adaptateurs (Claude Code, Codex, Cursor, agents compatibles MCP, fallback API BYOK) et les stratĂ©gies d’injection de compĂ©tences par adaptateur.', + 'tasks.kicker': 'Espace d’automatisation', + 'tasks.comingSoon': 'BientĂŽt disponible', + 'tasks.lede': 'Les automatisations transforment les prompts en travail durable : Orbit les exĂ©cute, les routines les conservent, les planifications dĂ©cident quand elles se dĂ©clenchent, et les artefacts dynamiques montrent ce qui a changĂ©.', + 'tasks.newAutomation': 'Nouvelle automatisation', + 'tasks.previewNote': 'Surface d’aperçu uniquement. Les paramĂštres Orbit sont disponibles aujourd’hui ; les routines, planifications et connexions aux artefacts dynamiques arriveront avec la fusion des branches backend.', + 'tasks.primitivesAria': 'Primitives d’automatisation', + 'tasks.primitive.orbit.title': 'Orbit', + 'tasks.primitive.orbit.body': 'Un runtime persistant pour les travaux agent longs ou rĂ©currents.', + 'tasks.primitive.orbit.enabled': 'RĂ©sumĂ© quotidien activĂ©', + 'tasks.primitive.orbit.manualOnly': 'Manuel uniquement', + 'tasks.primitive.routines.title': 'Routines', + 'tasks.primitive.routines.body': 'DĂ©finitions de tĂąches durables qui survivent aprĂšs la fin d’un chat.', + 'tasks.primitive.routines.meta': 'Shell produit prĂȘt', + 'tasks.primitive.schedules.title': 'Planifications', + 'tasks.primitive.schedules.body': 'DĂ©clencheurs temporels ou Ă©vĂ©nementiels qui dĂ©cident quand une routine doit s’exĂ©cuter.', + 'tasks.primitive.schedules.meta': 'Branche en attente', + 'tasks.primitive.liveArtifacts.title': 'Artefacts dynamiques', + 'tasks.primitive.liveArtifacts.body': 'Rapports et notes qui continuent de se mettre Ă  jour pendant qu’un agent travaille.', + 'tasks.primitive.liveArtifacts.meta': 'ModĂšle d’aperçu', + 'tasks.listAria': 'Liste des automatisations', + 'tasks.routinesAndRuns': '{n} routines et exĂ©cutions', + 'tasks.filtersAria': 'Filtres des automatisations', + 'tasks.filter.scheduled': 'PlanifiĂ©es', + 'tasks.filter.running': 'En cours', + 'tasks.filter.done': 'TerminĂ©es', + 'tasks.configurationAria': 'Configuration de l’automatisation', + 'tasks.slot.trigger': 'DĂ©clencheur', + 'tasks.slot.pattern': 'Motif', + 'tasks.slot.runtime': 'Runtime', + 'tasks.slot.output': 'Sortie', + 'tasks.liveArtifact': 'Artefact dynamique', + 'tasks.viewProgress': 'Voir la progression', + 'tasks.pause': 'Suspendre', + 'tasks.runNow': 'Lancer maintenant', + 'tasks.openArtifact': 'Ouvrir l’artefact', + 'tasks.status.dailyAt': 'Quotidien · {time}', + 'tasks.status.pausedManual': 'Suspendu · manuel uniquement', + 'tasks.sample.orbit.title': 'RĂ©sumĂ© quotidien Orbit des connecteurs', + 'tasks.sample.orbit.metaEnabled': 'Le digest des connecteurs est planifiĂ©', + 'tasks.sample.orbit.metaDisabled': 'Ouvrez les paramĂštres Orbit pour l’activer', + 'tasks.sample.orbit.previewEnabled': 'orbit_daily.html · artefact dynamique', + 'tasks.sample.orbit.previewDisabled': 'Aucune exĂ©cution planifiĂ©e', + 'tasks.sample.orbit.triggerEnabled': 'Planification · chaque jour Ă  {time}', + 'tasks.sample.orbit.triggerDisabled': 'Manuel · lancer Ă  la demande', + 'tasks.sample.orbit.pattern': 'Routine · digest des connecteurs', + 'tasks.sample.orbit.runtime': 'Orbit · planifiĂ© par le daemon', + 'tasks.sample.orbit.output': 'Artefact dynamique · rapport actualisable', + 'tasks.sample.orbit.artifactMetaEnabled': 'S’actualise aprĂšs chaque exĂ©cution', + 'tasks.sample.orbit.artifactMetaDisabled': 'En attente de planification', + 'tasks.sample.orbit.body1': '# RĂ©sumĂ© quotidien de l’activitĂ© Orbit', + 'tasks.sample.orbit.body2': 'Connecteurs vĂ©rifiĂ©s · rĂ©ussites, ignorĂ©s et Ă©checs', + 'tasks.sample.orbit.body3': 'Les temps forts deviennent un artefact dynamique actualisable.', + 'tasks.sample.mcp.title': 'Recherche sur les alternatives MCP', + 'tasks.sample.mcp.status': 'En cours dans Orbit · 2 h 14 min', + 'tasks.sample.mcp.meta': '14 / 30 sources traitĂ©es', + 'tasks.sample.mcp.preview': 'research_notes.md · live', + 'tasks.sample.mcp.trigger': 'Manuel · ponctuel', + 'tasks.sample.mcp.pattern': 'Prompt de recherche approfondie', + 'tasks.sample.mcp.runtime': 'Distant · persistant', + 'tasks.sample.mcp.output': 'Rapport dynamique · mise Ă  jour auto', + 'tasks.sample.mcp.artifactMeta': 'Mis Ă  jour il y a 12 s', + 'tasks.sample.mcp.body1': '# Alternatives MCP - constats intermĂ©diaires', + 'tasks.sample.mcp.body2': '14 sources examinĂ©es · 3 candidats prĂ©sĂ©lectionnĂ©s', + 'tasks.sample.mcp.body3': '## PrĂ©sĂ©lection', + 'tasks.sample.mcp.body4': '- SchĂ©mas d’appels d’outils via JSON-RPC...', + 'tasks.sample.mcp.body5': '- Protocoles d’agents basĂ©s sur gRPC...', + 'tasks.sample.weekly.title': 'Digest hebdomadaire d’équipe', + 'tasks.sample.weekly.status': 'Prochain : lun. 9:00', + 'tasks.sample.weekly.meta': 'Met Ă  jour le doc hebdo de l’équipe', + 'tasks.sample.weekly.preview': 'team_weekly.md · prochain artefact', + 'tasks.sample.weekly.trigger': 'Planification · hebdomadaire', + 'tasks.sample.weekly.pattern': 'Routine · digest d’équipe', + 'tasks.sample.weekly.runtime': 'Distant · rĂ©current', + 'tasks.sample.weekly.output': 'Artefact dynamique · Markdown', + 'tasks.sample.weekly.artifactMeta': 'DerniĂšre mise Ă  jour il y a 4 j', + 'tasks.sample.weekly.body1': '# Hebdo Ă©quipe', + 'tasks.sample.weekly.body2': '## En cours', + 'tasks.sample.weekly.body3': '- Passe d’intĂ©gration du systĂšme de design', + 'tasks.sample.weekly.body4': '- Revue qualitĂ© des connecteurs', + 'tasks.sample.weekly.body5': '## Risques', + 'tasks.sample.pr.title': 'Rappel de revue PR', + 'tasks.sample.pr.status': 'Sur nouvelle PR · dĂ©clenchĂ© il y a 23 min', + 'tasks.sample.pr.meta': 'Envoie un DM Slack', + 'tasks.sample.pr.preview': 'DerniĂšre livraison rĂ©ussie', + 'tasks.sample.pr.trigger': 'ÉvĂ©nement · nouvelle PR', + 'tasks.sample.pr.pattern': 'Routine · notification', + 'tasks.sample.pr.runtime': 'Local · exĂ©cution rapide', + 'tasks.sample.pr.output': 'Message · DM Slack', + 'tasks.sample.pr.artifactMeta': 'Dernier dĂ©clenchement il y a 23 min', + 'tasks.sample.pr.body1': 'PR #184 ouverte pour revue', + 'tasks.sample.pr.body2': 'Relecteurs associĂ©s : design-platform, web-runtime', + 'tasks.sample.pr.body3': 'Livraison : DM Slack envoyĂ©', + 'tasks.sample.meeting.title': 'PrĂ©paration de rĂ©union', + 'tasks.sample.meeting.status': 'Demain · 10:00', + 'tasks.sample.meeting.meta': 'Ponctuel · envoie un rĂ©sumĂ©', + 'tasks.sample.meeting.preview': 'meeting_brief.md · en file', + 'tasks.sample.meeting.trigger': 'Planification · ponctuelle', + 'tasks.sample.meeting.pattern': 'Prompt de briefing', + 'tasks.sample.meeting.runtime': 'Distant · bornĂ©', + 'tasks.sample.meeting.output': 'Artefact + message', + 'tasks.sample.meeting.artifactMeta': 'En file pour gĂ©nĂ©ration', + 'tasks.sample.meeting.body1': '# Brief de rĂ©union', + 'tasks.sample.meeting.body2': 'Source de l’agenda : Ă©vĂ©nement calendrier + docs liĂ©s', + 'tasks.sample.meeting.body3': 'La sortie inclura dĂ©cisions, blocages et questions.', + 'tasks.sample.candidate.title': 'Suivi des candidats', + 'tasks.sample.candidate.status': 'Échec · attention requise', + 'tasks.sample.candidate.meta': 'Authentification expirĂ©e', + 'tasks.sample.candidate.preview': 'Reconnectez Greenhouse pour reprendre', + 'tasks.sample.candidate.trigger': 'Planification · quotidienne', + 'tasks.sample.candidate.pattern': 'Routine · synchronisation candidats', + 'tasks.sample.candidate.runtime': 'Distant · rĂ©current', + 'tasks.sample.candidate.output': 'Artefact dynamique · tableau', + 'tasks.sample.candidate.artifactMeta': 'Suspendu jusqu’à restauration de l’authentification', + 'tasks.sample.candidate.body1': '# Pipeline candidats', + 'tasks.sample.candidate.body2': 'DerniĂšre synchronisation rĂ©ussie : il y a 2 j', + 'tasks.sample.candidate.body3': 'Action requise : reconnecter le compte source.', + 'routines.title': 'Automatisations', + 'routines.subtitle': 'Automatisations planifiĂ©es qui s’exĂ©cutent sans surveillance.', + 'routines.newAutomation': 'Nouvelle automatisation', + 'routines.loading': 'Chargement
', + 'routines.empty': 'Aucune automatisation pour l’instant.', + 'routines.emptyHint': 'Cliquez sur Nouvelle automatisation pour planifier une exĂ©cution agent sans surveillance.', + 'routines.runHistoryLoading': 'Chargement des exĂ©cutions
', + 'routines.runHistoryEmpty': 'Aucune exĂ©cution pour l’instant.', + 'routines.fieldName': 'Nom', + 'routines.fieldNamePlaceholder': 'Briefing du matin', + 'routines.fieldPrompt': 'Prompt', + 'routines.fieldPromptPlaceholder': 'RĂ©cupĂšre l’activitĂ© GitHub + Linear d’hier et rĂ©sume ce qui a changĂ©.', + 'routines.fieldSchedule': 'Planification', + 'routines.fieldMinute': 'Minute de chaque heure', + 'routines.fieldTime': 'Heure', + 'routines.fieldTimezone': 'Fuseau horaire', + 'routines.fieldsetProject': 'Projet', + 'routines.kind.hourly': 'Horaire', + 'routines.kind.daily': 'Quotidienne', + 'routines.kind.weekdays': 'Jours ouvrĂ©s', + 'routines.kind.weekly': 'Hebdomadaire', + 'routines.weekday.short.0': 'Dim', + 'routines.weekday.short.1': 'Lun', + 'routines.weekday.short.2': 'Mar', + 'routines.weekday.short.3': 'Mer', + 'routines.weekday.short.4': 'Jeu', + 'routines.weekday.short.5': 'Ven', + 'routines.weekday.short.6': 'Sam', + 'routines.weekday.long.0': 'dimanche', + 'routines.weekday.long.1': 'lundi', + 'routines.weekday.long.2': 'mardi', + 'routines.weekday.long.3': 'mercredi', + 'routines.weekday.long.4': 'jeudi', + 'routines.weekday.long.5': 'vendredi', + 'routines.weekday.long.6': 'samedi', + 'routines.timeAm': 'AM', + 'routines.timePm': 'PM', + 'routines.describe.hourly': 'S’exĂ©cute toutes les heures Ă  :{minute}', + 'routines.describe.daily': 'S’exĂ©cute chaque jour Ă  {time} {tz}', + 'routines.describe.weekdays': 'S’exĂ©cute du lun. au ven. Ă  {time} {tz}', + 'routines.describe.weekly': 'S’exĂ©cute chaque {day} Ă  {time} {tz}', + 'routines.modeCreate': 'CrĂ©er un nouveau projet Ă  chaque exĂ©cution', + 'routines.modeCreateHint': 'Un espace de travail frais et isolĂ© Ă  chaque dĂ©clenchement.', + 'routines.modeReuse': 'RĂ©utiliser un projet existant', + 'routines.modeReuseHint': 'Chaque exĂ©cution vit comme une nouvelle conversation dans le projet.', + 'routines.pickProject': '— Choisir un projet —', + 'routines.targetReuse': '→ {project}', + 'routines.targetCreate': '→ nouveau projet Ă  chaque exĂ©cution', + 'routines.tagPaused': 'suspendue', + 'routines.metaNext': 'prochaine : {when}', + 'routines.metaLast': 'derniĂšre :', + 'routines.triggerManual': 'manuelle', + 'routines.triggerScheduled': 'planifiĂ©e', + 'routines.openProject': 'Ouvrir le projet', + 'routines.openProjectTitle': 'Ouvrir le projet dans lequel cette exĂ©cution a Ă©crit', + 'routines.runNow': 'Lancer maintenant', + 'routines.edit': 'Modifier', + 'routines.pause': 'Suspendre', + 'routines.resume': 'Reprendre', + 'routines.history': 'Historique', + 'routines.hideHistory': 'Masquer l’historique', + 'routines.delete': 'Supprimer', + 'routines.deleteTitle': 'Supprimer cette automatisation', + 'routines.cancel': 'Annuler', + 'routines.save': 'Enregistrer', + 'routines.saving': 'Enregistrement
', + 'routines.create': 'CrĂ©er', + 'routines.creating': 'CrĂ©ation
', + 'routines.status.queued': 'en file', + 'routines.status.running': 'en cours', + 'routines.status.succeeded': 'rĂ©ussie', + 'routines.status.failed': 'Ă©chouĂ©e', + 'routines.status.canceled': 'annulĂ©e', + 'routines.confirmDelete': 'Supprimer cette automatisation ? Les exĂ©cutions passĂ©es et leurs projets seront conservĂ©s.', + 'routines.errorPickProject': 'Choisissez un projet Ă  rĂ©utiliser, ou passez Ă  « CrĂ©er un nouveau Ă  chaque exĂ©cution »', 'entry.helpAria': 'Aide', 'entry.helpMenuAria': 'Menu d\'aide', 'entry.helpGetHelp': 'Obtenir de l\'aide sur GitHub', @@ -426,8 +927,6 @@ export const fr: Dict = { 'promptTemplates.emptyImage': 'Aucun modĂšle de prompt d\'image installĂ© pour l\'instant.', 'promptTemplates.emptyVideo': 'Aucun modĂšle de prompt vidĂ©o installĂ© pour l\'instant.', 'promptTemplates.emptyNoMatch': 'Aucun modĂšle ne correspond Ă  votre recherche.', - 'promptTemplates.allSources': 'Toutes les sources', - 'promptTemplates.sourceFilterAria': 'Filtrer par source', 'promptTemplates.attributionFooter': 'AdaptĂ© de bibliothĂšques de prompts publiques. Chaque carte renvoie vers l\'auteur original.', 'promptTemplates.openPreviewTitle': 'Ouvrir le prompt et l\'aperçu', 'promptTemplates.sourcePrefix': 'Source :', @@ -439,8 +938,9 @@ export const fr: Dict = { 'promptTemplates.openSource': 'Voir l\'original', 'promptTemplates.openFullscreen': 'Ouvrir l\'aperçu en plein Ă©cran', 'promptTemplates.closeFullscreen': 'Fermer l\'aperçu plein Ă©cran', + 'promptTemplates.allSources': 'Toutes les sources', + 'promptTemplates.sourceFilterAria': 'Filtrer par source', 'promptTemplates.retry': 'RĂ©essayer', - 'connectors.title': 'Connecteurs', 'connectors.subtitle': 'Sources de donnĂ©es locales et futures pouvant alimenter les artefacts dynamiques.', 'connectors.account': 'Compte', @@ -479,7 +979,7 @@ export const fr: Dict = { 'connectors.category.dataPlatform': 'Plateforme de donnĂ©es', 'connectors.category.database': 'Base de donnĂ©es', 'connectors.category.design': 'Design', - 'connectors.category.developer': 'Outils dĂ©veloppeur', + 'connectors.category.developer': 'DĂ©veloppement', 'connectors.category.documentation': 'Documentation', 'connectors.category.erp': 'ERP', 'connectors.category.education': 'Éducation', @@ -487,7 +987,7 @@ export const fr: Dict = { 'connectors.category.events': 'ÉvĂ©nements', 'connectors.category.fieldService': 'Service terrain', 'connectors.category.finance': 'Finance', - 'connectors.category.fitness': 'Fitness', + 'connectors.category.fitness': 'SantĂ© / fitness', 'connectors.category.forms': 'Formulaires', 'connectors.category.gaming': 'Jeux', 'connectors.category.hr': 'RH', @@ -500,7 +1000,7 @@ export const fr: Dict = { 'connectors.category.marketing': 'Marketing', 'connectors.category.media': 'MĂ©dias', 'connectors.category.meetings': 'RĂ©unions', - 'connectors.category.nonprofit': 'Association', + 'connectors.category.nonprofit': 'Associatif', 'connectors.category.observability': 'ObservabilitĂ©', 'connectors.category.payments': 'Paiements', 'connectors.category.personal': 'Personnel', @@ -542,13 +1042,14 @@ export const fr: Dict = { 'connectors.emptyNoMatchTitle': 'Aucun connecteur ne correspond Ă  « {query} »', 'connectors.emptyNoMatchBody': 'Essayez un autre mot-clĂ© ou effacez la recherche pour voir le catalogue complet.', 'connectors.emptyNoMatchAction': 'Effacer la recherche', - 'newproj.tabPrototype': 'Prototype', + 'newproj.tabLiveArtifact': 'Artefact dynamique', 'newproj.tabDeck': 'Diaporama', 'newproj.tabTemplate': 'Depuis un modĂšle', 'newproj.tabMedia': 'MĂ©dia', 'newproj.tabOther': 'Autre', 'newproj.titlePrototype': 'Nouveau prototype', + 'newproj.titleLiveArtifact': 'Nouvel artefact dynamique', 'newproj.titleDeck': 'Nouveau diaporama', 'newproj.titleTemplate': 'Partir d\'un modĂšle', 'newproj.titleImage': 'Nouvelle image', @@ -563,19 +1064,37 @@ export const fr: Dict = { 'newproj.toggleSpeakerNotes': 'Utiliser des notes d\'orateur', 'newproj.toggleSpeakerNotesHint': 'Moins de texte sur les diapositives — gardez les points de discussion dans les notes.', 'newproj.toggleAnimations': 'Inclure des animations', - 'newproj.toggleAnimationsHint': - 'Ajouter du mouvement (entrĂ©e, survol, transitions) en plus du modĂšle.', + 'newproj.toggleAnimationsHint': 'Ajouter du mouvement (entrĂ©e, survol, transitions) en plus du modĂšle.', + 'newproj.targetPlatformsLabel': 'Plateformes cibles', + 'newproj.targetPlatformsHint': 'Choisissez-en une ou plusieurs. Le web responsive couvre seulement les points de rupture du navigateur ; ajoutez iOS, Android, tablette ou app desktop pour des variantes natives multiplateformes.', + 'newproj.platform.responsive.label': 'Web responsive', + 'newproj.platform.responsive.hint': 'Une expĂ©rience web adaptĂ©e aux navigateurs ordinateur, tablette et mobile', + 'newproj.platform.webDesktop.label': 'Web desktop', + 'newproj.platform.webDesktop.hint': 'Produit ou landing page pensĂ©e d’abord pour le navigateur', + 'newproj.platform.mobileIos.label': 'App iOS', + 'newproj.platform.mobileIos.hint': 'Cadres iPhone et rĂšgles d’interaction iOS', + 'newproj.platform.mobileAndroid.label': 'App Android', + 'newproj.platform.mobileAndroid.hint': 'Cadres Pixel et rĂšgles d’interaction Material', + 'newproj.platform.tablet.label': 'App tablette', + 'newproj.platform.tablet.hint': 'ExpĂ©rience tablette native avec vues fractionnĂ©es', + 'newproj.platform.desktopApp.label': 'App desktop', + 'newproj.platform.desktopApp.hint': 'Habillage d’application macOS/Windows', + 'newproj.surfaceOptionsLabel': 'Surfaces complĂ©mentaires', + 'newproj.includeLandingPage': 'Inclure une landing page', + 'newproj.includeLandingPageHint': 'Ajoutez une page marketing responsive pour publicitĂ©s, listes d’attente, lancements, tĂ©lĂ©chargements d’app ou explication produit.', + 'newproj.includeOsWidgets': 'Inclure des widgets OS', + 'newproj.includeOsWidgetsHint': 'Ajoutez des widgets natifs de plateforme pour Ă©cran d’accueil, Ă©cran verrouillĂ© ou accĂšs rapide sur mobile/tablette.', + 'newproj.includeOsWidgetsDisabledHint': 'Disponible quand iOS, Android ou app tablette est sĂ©lectionnĂ© comme plateforme cible.', 'newproj.templateLabel': 'ModĂšle', 'newproj.noTemplatesTitle': 'Aucun modĂšle pour l\'instant', - 'newproj.noTemplatesBody': - 'Ouvrez un projet, puis utilisez le menu Partager dans la visionneuse de fichiers pour le convertir en modĂšle. Les modĂšles apparaissent ici.', + 'newproj.noTemplatesBody': 'Ouvrez un projet, puis utilisez le menu Partager dans la visionneuse de fichiers pour le convertir en modĂšle. Les modĂšles apparaissent ici.', 'newproj.savedTemplate': 'ModĂšle enregistrĂ©', 'newproj.fileSingular': 'fichier', 'newproj.filePlural': 'fichiers', 'newproj.create': 'CrĂ©er', + 'newproj.createLiveArtifact': 'CrĂ©er un artefact dynamique', 'newproj.createFromTemplate': 'CrĂ©er depuis le modĂšle', - 'newproj.createDisabledTitle': - 'Enregistrez d\'abord un projet comme modĂšle (menu Partager dans un projet).', + 'newproj.createDisabledTitle': 'Enregistrez d\'abord un projet comme modĂšle (menu Partager dans un projet).', 'newproj.importClaudeZip': 'Importer un ZIP Claude Design', 'newproj.importClaudeZipTitle': 'Importer une exportation .zip Claude Design', 'newproj.importingClaudeZip': 'Importation
', @@ -608,13 +1127,13 @@ export const fr: Dict = { 'newproj.modelMissingSub': 'Choisissez le modĂšle pour cette surface.', 'newproj.aspectLabel': 'Format', 'newproj.videoLengthLabel': 'DurĂ©e', - 'newproj.videoLengthSeconds': '{n}s', + 'newproj.videoLengthSeconds': '{n} s', 'newproj.audioKindLabel': 'Type d\'audio', 'newproj.audioKindMusic': 'Musique', 'newproj.audioKindSpeech': 'Voix / TTS', 'newproj.audioKindSfx': 'Effets sonores', 'newproj.audioDurationLabel': 'DurĂ©e', - 'newproj.audioDurationSeconds': '{n}s', + 'newproj.audioDurationSeconds': '{n} s', 'newproj.voiceLabel': 'Voix', 'newproj.voicePlaceholder': 'Identifiant de voix du fournisseur, optionnel', 'newproj.connectorsLabel': 'Connecteurs', @@ -633,16 +1152,12 @@ export const fr: Dict = { 'newproj.promptTemplateSearch': 'Rechercher des modĂšles
', 'newproj.promptTemplateEmpty': 'Aucun modĂšle installĂ© pour cette surface pour l\'instant.', 'newproj.promptTemplateBodyLabel': 'Prompt (vous pouvez l\'ajuster)', - 'newproj.promptTemplateOptimizeHint': - 'Modifiez ce que vous voulez — vos modifications sont transmises au brief de l\'agent.', - 'newproj.promptTemplateBodyEmpty': - 'Corps vide — l\'agent ne recevra aucune rĂ©fĂ©rence de modĂšle.', + 'newproj.promptTemplateOptimizeHint': 'Modifiez ce que vous voulez — vos modifications sont transmises au brief de l\'agent.', + 'newproj.promptTemplateBodyEmpty': 'Corps vide — l\'agent ne recevra aucune rĂ©fĂ©rence de modĂšle.', 'newproj.deleteTemplateTitle': 'Supprimer le modĂšle', 'newproj.deleteTemplateConfirm': 'Supprimer « {name} » ? Cette action est irrĂ©versible.', 'newproj.deleteTemplateConfirmCta': 'Supprimer le modĂšle', - 'newproj.deleteTemplateError': - 'Impossible de supprimer ce modĂšle. Veuillez rĂ©essayer.', - + 'newproj.deleteTemplateError': 'Impossible de supprimer ce modĂšle. Veuillez rĂ©essayer.', 'designs.subRecent': 'RĂ©cents', 'designs.subYours': 'Vos designs', 'designs.filterAria': 'Filtrer les projets', @@ -652,6 +1167,15 @@ export const fr: Dict = { 'designs.deleteTitle': 'Supprimer le projet', 'designs.deleteConfirm': 'Supprimer « {name} » ?', 'designs.cardFreeform': 'libre', + 'designs.badgeLive': 'Dynamique', + 'designs.liveArtifactBadgesAria': 'Badges d’artefact dynamique', + 'designs.liveCount': '{n} dynamiques', + 'designs.statusLive': 'Artefact dynamique', + 'designs.statusArchived': 'ArchivĂ©', + 'designs.statusError': 'Erreur', + 'designs.statusRefreshing': 'Actualisation
', + 'designs.statusRefreshFailed': 'Échec de l’actualisation', + 'designs.statusRefreshed': 'ActualisĂ©', 'designs.status.notStarted': 'Non commencĂ©', 'designs.status.queued': 'En file d\'attente', 'designs.status.running': 'En cours', @@ -674,8 +1198,8 @@ export const fr: Dict = { 'designs.deleteSelected': 'Supprimer la sĂ©lection', 'designs.selectedCount': '{n} sĂ©lectionnĂ©(s)', 'designs.deleteSelectedConfirm': 'Supprimer {n} projet(s) ?', - 'designs.deleteSelectedSuccess': '{n} project(s) deleted successfully.', - 'designs.deleteSelectedPartial': 'Deleted {deleted} project(s); {failed} failed.', + 'designs.deleteSelectedSuccess': '{n} projet(s) supprimĂ©(s) avec succĂšs.', + 'designs.deleteSelectedPartial': '{deleted} projet(s) supprimĂ©(s) ; {failed} Ă©chec(s).', 'designs.tagPrototype': 'Prototype', 'designs.tagLiveArtifact': 'Artefact dynamique', 'designs.tagSlide': 'Diapositive', @@ -683,7 +1207,6 @@ export const fr: Dict = { 'designs.renameTitle': 'Renommer le projet', 'designs.renameSave': 'OK', 'designs.renameCancel': 'Annuler', - 'examples.typeLabel': 'Type', 'examples.surfaceLabel': 'Surface', 'examples.surfaceWeb': 'Web', @@ -736,7 +1259,6 @@ export const fr: Dict = { 'examples.tagVideo': 'VidĂ©o', 'examples.tagAudio': 'Audio', 'examples.previewLabel': 'Aperçu', - 'ds.surfaceLabel': 'Surface', 'ds.surfaceWeb': 'Web', 'ds.surfaceImage': 'Image', @@ -753,7 +1275,6 @@ export const fr: Dict = { 'ds.tokens': 'Jetons', 'ds.specToggle': 'DESIGN.md', 'ds.specLoading': 'Chargement du DESIGN.md
', - 'avatar.title': 'Compte et paramĂštres', 'avatar.localCli': 'CLI local', 'avatar.anthropicApi': 'API Anthropic', @@ -771,7 +1292,6 @@ export const fr: Dict = { 'avatar.modelLabel': 'ModĂšle', 'avatar.reasoningLabel': 'Raisonnement', 'avatar.customSuffix': '(personnalisĂ©)', - 'inlineSwitcher.chipTitle': 'Changer de CLI / modĂšle', 'inlineSwitcher.chipCli': 'CLI locale', 'inlineSwitcher.chipByok': 'BYOK', @@ -787,11 +1307,12 @@ export const fr: Dict = { 'inlineSwitcher.noAgentsDetected': 'Aucune CLI dĂ©tectĂ©e dans le PATH', 'inlineSwitcher.openSettingsForModel': 'Configurez le fournisseur dans les ParamĂštres', 'inlineSwitcher.missingApiKey': 'ClĂ© API manquante — ajoutez-la dans les ParamĂštres.', - 'inlineSwitcher.openFullSettings': "Ouvrir les paramĂštres d'exĂ©cution", + 'inlineSwitcher.openFullSettings': 'Ouvrir les paramĂštres d\'exĂ©cution', 'inlineSwitcher.customSuffix': '(personnalisĂ©)', - 'project.backToProjects': 'Retour aux projets', 'project.metaFreeform': 'libre', + 'project.customInstructions': 'Instructions du projet', + 'project.customInstructionsPlaceholder': 'Instructions pour ce projet (injectĂ©es dans chaque message)
', 'project.resizeChatPanel': 'Redimensionner le panneau de chat', 'project.instructionsActive': 'Actif — inclus dans chaque message', 'chat.tabChat': 'Chat', @@ -823,10 +1344,10 @@ export const fr: Dict = { 'chat.comments.pinAtCoords': 'Ă  {x}, {y}', 'chat.comments.capturedItems': '{n} Ă©lĂ©ment(s) capturĂ©(s)', 'chat.comments.clear': 'Effacer', - 'chat.inspect.noEditableTargets': 'This page has no editable elements yet.', - 'chat.inspect.noCommentTargets': 'This page has no commentable elements yet.', - 'chat.inspect.editHint': 'Click an element in the canvas to edit its styles.', - 'chat.inspect.commentHint': 'Click an element in the canvas to add a comment.', + 'chat.inspect.noEditableTargets': 'Aucune cible de texte ou de style modifiable trouvĂ©e.', + 'chat.inspect.noCommentTargets': 'Aucune cible de texte ou visuelle pouvant recevoir un commentaire n’a Ă©tĂ© trouvĂ©e.', + 'chat.inspect.editHint': 'SĂ©lectionnez une cible de texte ou de style dans l’aperçu pour la modifier.', + 'chat.inspect.commentHint': 'SĂ©lectionnez du texte ou une zone dans l’aperçu pour ajouter un commentaire.', 'chat.conversationsTitle': 'Conversations', 'chat.conversationsAria': 'Historique des conversations', 'chat.newConversation': 'Nouvelle conversation', @@ -836,11 +1357,10 @@ export const fr: Dict = { 'chat.emptyConversations': 'Aucune conversation pour l\'instant.', 'chat.deleteConversation': 'Supprimer la conversation', 'chat.renameConversationLabel': 'Renommer « {title} »', - 'chat.deleteConversationConfirm': - 'Supprimer « {title} » ? Cela supprime ses messages.', + 'chat.deleteConversationConfirm': 'Supprimer « {title} » ? Cela supprime ses messages.', 'chat.untitledConversation': 'Conversation sans titre', 'chat.startTitle': 'DĂ©marrer une conversation', - 'chat.startHint': "DĂ©crivez ce que vous voulez gĂ©nĂ©rer, ou partez de l’un de ces exemples :", + 'chat.startHint': 'DĂ©crivez ce que vous voulez gĂ©nĂ©rer, ou partez de l’un de ces exemples :', 'chat.fillInputTitle': 'Cliquez pour remplir le champ', 'chat.jumpToLatest': 'Aller au plus rĂ©cent', 'chat.scrollToLatest': 'DĂ©filer jusqu\'au plus rĂ©cent', @@ -848,8 +1368,8 @@ export const fr: Dict = { 'chat.openFile': 'Ouvrir {name}', 'chat.copyPrompt': 'Copier le prompt', 'chat.copyDone': 'CopiĂ© !', - 'chat.composerPlaceholder': "DĂ©crivez ce que vous voulez gĂ©nĂ©rer
", - 'chat.composerHint': "⌘/Ctrl + EntrĂ©e pour envoyer · indiquez objectif, contenu, style et format", + 'chat.composerPlaceholder': 'DĂ©crivez ce que vous voulez gĂ©nĂ©rer
', + 'chat.composerHint': '⌘/Ctrl + EntrĂ©e pour envoyer · indiquez objectif, contenu, style et format', 'chat.cliSettingsTitle': 'ParamĂštres CLI et modĂšle', 'chat.cliSettingsAria': 'Ouvrir les paramĂštres CLI et modĂšle', 'chat.attachTitle': 'Attacher des fichiers (ou coller / dĂ©poser)', @@ -868,47 +1388,43 @@ export const fr: Dict = { 'chat.linkedFolderNotFound': 'Le dossier n\'existe pas', 'chat.linkedFolderAlready': 'Ce dossier est dĂ©jĂ  liĂ©', 'chat.linkedFolderPickError': 'Impossible d\'ouvrir le sĂ©lecteur de dossier', - 'chat.queuedHeader': 'Queued', - 'chat.queuedToSend': 'to Send', - 'chat.queuedEditQueuedTaskAria': 'Edit queued task', - 'chat.queuedSave': 'Save', - 'chat.queuedCancel': 'Cancel', - 'chat.queuedEdit': 'Edit', - 'chat.queuedMore': 'more queued', - 'chat.queuedFollowUpFallback': 'Queued follow-up', + 'chat.queuedHeader': 'En file', + 'chat.queuedToSend': 'Ă  envoyer', + 'chat.queuedEditQueuedTaskAria': 'Modifier la tĂąche en file', + 'chat.queuedSave': 'Enregistrer', + 'chat.queuedCancel': 'Annuler', + 'chat.queuedEdit': 'Modifier', + 'chat.queuedMore': 'autres en file', + 'chat.queuedFollowUpFallback': 'Suivi en file', 'chat.send': 'Envoyer', 'chat.stop': 'ArrĂȘter', 'chat.removeAria': 'Retirer {name}', 'chat.example1Title': 'Pitch deck Ă©ditorial', 'chat.example1Tag': 'Magazine', - 'chat.example1Prompt': - 'Un pitch deck Ă©ditorial de 10 diapositives pour un studio de design levant des fonds — mise en page grille suisse, titres avec empattement surdimensionnĂ©s et lettrines, numĂ©ros de section en monospace, gĂ©nĂ©reux espaces nĂ©gatifs, et diapositives photo pleine page entrecoupĂ©es de diapos riches en texte. Couverture, vision, marchĂ©, produit, traction, Ă©quipe, levĂ©e de fonds, contact.', + 'chat.example1Prompt': 'Un pitch deck Ă©ditorial de 10 diapositives pour un studio de design levant des fonds — mise en page grille suisse, titres avec empattement surdimensionnĂ©s et lettrines, numĂ©ros de section en monospace, gĂ©nĂ©reux espaces nĂ©gatifs, et diapositives photo pleine page entrecoupĂ©es de diapos riches en texte. Couverture, vision, marchĂ©, produit, traction, Ă©quipe, levĂ©e de fonds, contact.', 'chat.example2Title': 'Tableau de bord SaaS analytics', 'chat.example2Tag': 'DonnĂ©es', - 'chat.example2Prompt': - 'Un tableau de bord analytics dense pour un SaaS d\'outils dĂ©veloppeurs — bandeau KPI avec deltas semaine sur semaine, deux graphiques en lignes empilĂ©es (MRR et espaces de travail actifs), une carte de chaleur mondiale d\'utilisation, une grille de rĂ©tention de cohortes, un classement des meilleurs clients et un fil d\'actualitĂ© en temps rĂ©el. ThĂšme sombre, chiffres tabulaires en monospace, accents sparkline.', + 'chat.example2Prompt': 'Un tableau de bord analytics dense pour un SaaS d\'outils dĂ©veloppeurs — bandeau KPI avec deltas semaine sur semaine, deux graphiques en lignes empilĂ©es (MRR et espaces de travail actifs), une carte de chaleur mondiale d\'utilisation, une grille de rĂ©tention de cohortes, un classement des meilleurs clients et un fil d\'actualitĂ© en temps rĂ©el. ThĂšme sombre, chiffres tabulaires en monospace, accents sparkline.', 'chat.example3Title': 'Rapport annuel long dĂ©filement', 'chat.example3Tag': 'Éditorial', - 'chat.example3Prompt': - 'Un rapport annuel interactif pour une ONG climatique — mise en page Ă©ditoriale Ă  long dĂ©filement mĂȘlant de grands blocs de citation, des visualisations de donnĂ©es (barres empilĂ©es, compteurs animĂ©s, une carte choroplĂšthe des sites de projet), des sĂ©parateurs photo, un mur de donateurs et un appel Ă  l\'action final. Texte en serif moderne, Ă©tiquettes de graphiques en sans-serif, palette papier aux tons terreux.', - + 'chat.example3Prompt': 'Un rapport annuel interactif pour une ONG climatique — mise en page Ă©ditoriale Ă  long dĂ©filement mĂȘlant de grands blocs de citation, des visualisations de donnĂ©es (barres empilĂ©es, compteurs animĂ©s, une carte choroplĂšthe des sites de projet), des sĂ©parateurs photo, un mur de donateurs et un appel Ă  l\'action final. Texte en serif moderne, Ă©tiquettes de graphiques en sans-serif, palette papier aux tons terreux.', 'preview.shareMenu': 'Partager', - 'preview.exportMenu': 'Export', - 'preview.shareTemplateBadge': 'Template', + 'preview.exportMenu': 'Exporter', + 'preview.shareTemplateBadge': 'ModĂšle', 'preview.shareToX': 'X / Twitter', 'preview.shareToReddit': 'Reddit', 'preview.shareToFacebook': 'Facebook', 'preview.shareToLinkedIn': 'LinkedIn', 'preview.shareToInstagram': 'Instagram', 'preview.shareToXiaohongshu': '氏çșąäčŠ', - 'preview.copyTemplateLink': 'Copy template link', - 'preview.copyShareText': 'Copy share text', - 'preview.shareSocialGroup': 'Share to social', - 'preview.shareCopyGroup': 'Copy', - 'preview.shareExportGroup': 'Export files', - 'preview.shareCopied': 'Copied', - 'preview.shareCopyFailed': 'Copy failed', - 'preview.shareTextDefault': 'Open Design template: {title}', + 'preview.copyTemplateLink': 'Copier le lien du modĂšle', + 'preview.copyShareText': 'Copier le texte de partage', + 'preview.shareSocialGroup': 'Partager sur les rĂ©seaux', + 'preview.shareCopyGroup': 'Copier', + 'preview.shareExportGroup': 'Exporter les fichiers', + 'preview.shareCopied': 'CopiĂ©', + 'preview.shareCopyFailed': 'Échec de la copie', + 'preview.shareTextDefault': 'ModĂšle Open Design : {title}', 'preview.openInNewTab': 'Ouvrir dans un nouvel onglet', 'preview.exit': '– Quitter', 'preview.fullscreen': '‹ Plein Ă©cran', @@ -921,11 +1437,9 @@ export const fr: Dict = { 'preview.unavailableBody': 'Cette compĂ©tence produit un rĂ©sultat {kind} — exĂ©cutez le prompt dans le chat pour en gĂ©nĂ©rer un.', 'preview.showSidebar': 'Afficher {label}', 'preview.hideSidebar': 'Masquer {label}', - 'misc.savedTemplate': 'ModĂšle enregistrĂ©', 'misc.primary': 'Primaire', 'misc.designSystem': 'SystĂšme de design', - 'workspace.designFiles': 'Fichiers de design', 'workspace.focusMode': 'Espace de travail focalisĂ©', 'workspace.showChat': 'Afficher le chat', @@ -951,13 +1465,12 @@ export const fr: Dict = { 'designFiles.openInTab': 'Ouvrir dans un onglet', 'designFiles.download': 'TĂ©lĂ©charger', 'designFiles.downloadSelected': 'TĂ©lĂ©charger {n} sĂ©lectionnĂ©s en ZIP', + 'designFiles.deleteSelected': 'Supprimer {n}', 'designFiles.clearSelection': 'Effacer la sĂ©lection', 'designFiles.selectPage': 'Tout sĂ©lectionner sur la page', 'designFiles.selectAll': 'Tout sĂ©lectionner', - 'designFiles.deleteSelected': 'Supprimer {n}', 'designFiles.dropTitle': '– DĂ©posez les fichiers ici', - 'designFiles.dropDesc': - 'Images, documents, rĂ©fĂ©rences ou dossiers — l\'agent les utilisera comme contexte.', + 'designFiles.dropDesc': 'Images, documents, rĂ©fĂ©rences ou dossiers — l\'agent les utilisera comme contexte.', 'designFiles.upload.title': 'TĂ©lĂ©verser des fichiers', 'designFiles.paste.title': 'Coller du texte comme fichier', 'designFiles.upload.label': 'TĂ©lĂ©verser', @@ -969,12 +1482,16 @@ export const fr: Dict = { 'designFiles.groupBy': 'Grouper par', 'designFiles.groupByKind': 'Type', 'designFiles.groupByModified': 'Modification', + 'designFiles.filterBy': 'Filtrer par type', + 'designFiles.filterClear': 'Effacer', + 'designFiles.filterCount': '{n} types', 'designFiles.expandGroup': 'DĂ©velopper', 'designFiles.collapseGroup': 'RĂ©duire', 'designFiles.sectionPages': 'Pages', 'designFiles.sectionScripts': 'Scripts', 'designFiles.sectionImages': 'Images', 'designFiles.sectionSketches': 'Croquis', + 'designFiles.sectionLiveArtifacts': 'Artefacts dynamiques', 'designFiles.sectionOther': 'Autre', 'designFiles.modifiedToday': 'Aujourd’hui', 'designFiles.modifiedYesterday': 'Hier', @@ -991,6 +1508,7 @@ export const fr: Dict = { 'designFiles.kindDocument': 'Document', 'designFiles.kindPresentation': 'PrĂ©sentation', 'designFiles.kindSpreadsheet': 'Tableur', + 'designFiles.kindLiveArtifact': 'Artefact dynamique', 'designFiles.kindBinary': 'Binaire', 'designFiles.kindFolder': 'Dossier', 'designFiles.folderCount': '{n} fichiers', @@ -1031,8 +1549,7 @@ export const fr: Dict = { 'fileViewer.copied': 'Copié !', 'fileViewer.share': 'Partager', 'fileViewer.binaryMeta': 'Binaire · {size}', - 'fileViewer.binaryNote': - 'Fichier binaire ({size} octets). TĂ©lĂ©chargez ou ouvrez depuis le disque pour inspecter.', + 'fileViewer.binaryNote': 'Fichier binaire ({size} octets). TĂ©lĂ©chargez ou ouvrez depuis le disque pour inspecter.', 'fileViewer.pdfMeta': 'PDF · {size}', 'fileViewer.documentMeta': 'Document', 'fileViewer.presentationMeta': 'PrĂ©sentation', @@ -1058,56 +1575,63 @@ export const fr: Dict = { 'fileViewer.preview': 'Aperçu', 'fileViewer.source': 'Source', 'fileViewer.tweaks': 'Ajustements', - 'fileViewer.tweaksUnavailable': "Aucun panneau d'ajustements dans cet artefact", + 'fileViewer.tweaksUnavailable': 'Aucun panneau d\'ajustements dans cet artefact', 'fileViewer.jsxModuleTitle': 'Aucun aperçu autonome', 'fileViewer.jsxModuleBody': 'Ce fichier est un module de composant chargĂ© par une autre page.', 'fileViewer.jsxModuleCta': 'Ouvrez la page qui le rend :', 'fileViewer.comment': 'Commenter', 'fileViewer.edit': 'Modifier', 'fileViewer.draw': 'Dessiner', - 'manualEdit.layers': "Calques", - 'manualEdit.editableCount': "{count} modifiable(s)", - 'manualEdit.hiddenBadge': "MasquĂ©", - 'manualEdit.title': "Éditeur manuel", - 'manualEdit.selectLayer': "SĂ©lectionnez un calque", - 'manualEdit.empty': "Cliquez sur un Ă©lĂ©ment dans l’aperçu ou choisissez un calque.", - 'manualEdit.noEditableLayers': "Aucun calque modifiable trouvĂ©.", - 'manualEdit.noClass': "aucune classe", - 'manualEdit.tabsAria': "Onglets d’édition manuelle", - 'manualEdit.tabContent': "Contenu", - 'manualEdit.tabStyle': "Style", - 'manualEdit.tabAttributes': "Attributs", - 'manualEdit.tabHtml': "HTML", - 'manualEdit.tabSource': "Source", - 'manualEdit.attributesJson': "Attributs JSON", - 'manualEdit.selectedHtml': "HTML de l’élĂ©ment sĂ©lectionnĂ©", - 'manualEdit.fullSource': "Source complĂšte de l’artefact", - 'manualEdit.applyContent': "Appliquer le contenu", - 'manualEdit.applyStyle': "Appliquer le style", - 'manualEdit.applyAttributes': "Appliquer les attributs", - 'manualEdit.applyHtml': "Appliquer le HTML", - 'manualEdit.applySource': "Appliquer la source", - 'manualEdit.invalidAttributes': "JSON d’attributs invalide.", - 'manualEdit.changes': "Modifications", - 'manualEdit.undo': "Annuler", - 'manualEdit.redo': "RĂ©tablir", - 'manualEdit.noChanges': "Aucune modification manuelle pour l’instant.", - 'manualEdit.imageUrl': "URL de l’image", - 'manualEdit.altText': "Texte alternatif", - 'manualEdit.label': "LibellĂ©", - 'manualEdit.text': "Texte", - 'manualEdit.href': "Lien (href)", - 'manualEdit.textColor': "Couleur du texte", - 'manualEdit.background': "ArriĂšre-plan", - 'manualEdit.fontSize': "Taille de police", - 'manualEdit.weight': "Graisse", - 'manualEdit.align': "Alignement", - 'manualEdit.padding': "Marge interne", - 'manualEdit.margin': "Marge", - 'manualEdit.radius': "Rayon", - 'manualEdit.border': "Bordure", - 'manualEdit.width': "Largeur", - 'manualEdit.minHeight': "Hauteur minimale", + 'manualEdit.layers': 'Calques', + 'manualEdit.editableCount': '{count} modifiable(s)', + 'manualEdit.hiddenBadge': 'MasquĂ©', + 'manualEdit.title': 'Éditeur manuel', + 'manualEdit.selectLayer': 'SĂ©lectionnez un calque', + 'manualEdit.empty': 'Cliquez sur un Ă©lĂ©ment dans l’aperçu ou choisissez un calque.', + 'manualEdit.noEditableLayers': 'Aucun calque modifiable trouvĂ©.', + 'manualEdit.noClass': 'aucune classe', + 'manualEdit.tabsAria': 'Onglets d’édition manuelle', + 'manualEdit.tabContent': 'Contenu', + 'manualEdit.tabStyle': 'Style', + 'manualEdit.tabAttributes': 'Attributs', + 'manualEdit.tabHtml': 'HTML', + 'manualEdit.tabSource': 'Source', + 'manualEdit.attributesJson': 'Attributs JSON', + 'manualEdit.selectedHtml': 'HTML de l’élĂ©ment sĂ©lectionnĂ©', + 'manualEdit.fullSource': 'Source complĂšte de l’artefact', + 'manualEdit.applyContent': 'Appliquer le contenu', + 'manualEdit.applyStyle': 'Appliquer le style', + 'manualEdit.applyAttributes': 'Appliquer les attributs', + 'manualEdit.applyHtml': 'Appliquer le HTML', + 'manualEdit.applySource': 'Appliquer la source', + 'manualEdit.invalidAttributes': 'JSON d’attributs invalide.', + 'manualEdit.changes': 'Modifications', + 'manualEdit.undo': 'Annuler', + 'manualEdit.redo': 'RĂ©tablir', + 'manualEdit.noChanges': 'Aucune modification manuelle pour l’instant.', + 'manualEdit.imageUrl': 'URL de l’image', + 'manualEdit.altText': 'Texte alternatif', + 'manualEdit.label': 'LibellĂ©', + 'manualEdit.text': 'Texte', + 'manualEdit.href': 'Lien (href)', + 'manualEdit.textColor': 'Couleur du texte', + 'manualEdit.background': 'ArriĂšre-plan', + 'manualEdit.fontSize': 'Taille de police', + 'manualEdit.weight': 'Graisse', + 'manualEdit.align': 'Alignement', + 'manualEdit.padding': 'Marge interne', + 'manualEdit.margin': 'Marge', + 'manualEdit.radius': 'Rayon', + 'manualEdit.border': 'Bordure', + 'manualEdit.width': 'Largeur', + 'manualEdit.minHeight': 'Hauteur minimale', + 'manualEdit.deleteElement': 'Supprimer l’élĂ©ment', + 'manualEdit.deleteElementConfirm': 'Supprimer l’élĂ©ment sĂ©lectionnĂ© ? Cette action peut ĂȘtre annulĂ©e avec Annuler.', + 'manualEdit.uploadImage': 'Importer une image', + 'manualEdit.uploadingImage': 'Import de l’image
', + 'manualEdit.uploadImageFailed': 'Impossible d’importer l’image.', + 'manualEdit.focusSlides': 'Focaliser les slides', + 'manualEdit.showPanels': 'Afficher les panneaux', 'fileViewer.zoomOut': 'Zoom arriĂšre', 'fileViewer.zoomIn': 'Zoom avant', 'fileViewer.resetZoom': 'RĂ©initialiser le zoom', @@ -1127,12 +1651,11 @@ export const fr: Dict = { 'fileViewer.presentFullscreen': 'Plein Ă©cran', 'fileViewer.presentNewTab': 'Nouvel onglet', 'fileViewer.exitPresentation': 'Quitter la prĂ©sentation', - 'fileViewer.shareLabel': "Partager", + 'fileViewer.shareLabel': 'Partager', 'fileViewer.exportPdf': 'Exporter en PDF', 'fileViewer.exportPdfAllSlides': 'Exporter en PDF (toutes les diapos)', 'fileViewer.exportPptxBusy': 'Attendez la fin du tour en cours.', - 'fileViewer.exportPptxHint': - 'Envoyez une requĂȘte Ă  l\'agent pour convertir ce design en PPTX.', + 'fileViewer.exportPptxHint': 'Envoyez une requĂȘte Ă  l\'agent pour convertir ce design en PPTX.', 'fileViewer.exportPptxNa': 'L\'export PPTX n\'est pas disponible ici.', 'fileViewer.exportZip': 'TĂ©lĂ©charger en .zip', 'fileViewer.exportHtml': 'Exporter en HTML autonome', @@ -1147,8 +1670,76 @@ export const fr: Dict = { 'fileViewer.savedTemplateFail': 'Impossible d\'enregistrer le modĂšle — rĂ©essayez.', 'fileViewer.templateNamePrompt': 'Nom du modĂšle', 'fileViewer.templateNameDefault': 'ModĂšle sans titre', - 'fileViewer.templateDescPrompt': - 'Courte description (optionnelle — qu\'est-ce qui rend ce modĂšle utile ?)', + 'fileViewer.templateDescPrompt': 'Courte description (optionnelle — qu\'est-ce qui rend ce modĂšle utile ?)', + 'liveArtifact.refresh.button': 'Actualiser', + 'liveArtifact.refresh.buttonTitle': 'Actualiser cet artefact dynamique', + 'liveArtifact.refresh.loadingTitle': 'Chargement de l’artefact dynamique
', + 'liveArtifact.refresh.noSourceTitle': 'Aucune source d’actualisation n’est encore disponible.', + 'liveArtifact.refresh.running': 'Actualisation
', + 'liveArtifact.refresh.runningMessage': 'Actualisation des donnĂ©es et de l’aperçu. Cela peut prendre un moment.', + 'liveArtifact.refresh.runningAction': 'L’aperçu prĂ©cĂ©dent reste visible jusqu’à la rĂ©ussite de l’actualisation.', + 'liveArtifact.refresh.successOne': 'Actualisation terminĂ©e. DonnĂ©es mises Ă  jour.', + 'liveArtifact.refresh.successMany': 'Actualisation terminĂ©e. DonnĂ©es mises Ă  jour.', + 'liveArtifact.refresh.successAction': 'L’aperçu a Ă©tĂ© rechargĂ© avec les derniĂšres donnĂ©es validĂ©es.', + 'liveArtifact.refresh.previousFailure': 'Échec de l’actualisation prĂ©cĂ©dente : {message}', + 'liveArtifact.refresh.failureAction': 'Consultez l’historique d’actualisation, corrigez la source ou le problĂšme d’autorisation, puis rĂ©essayez.', + 'liveArtifact.refresh.networkFailure': 'La requĂȘte d’actualisation a Ă©chouĂ©. VĂ©rifiez votre connexion puis rĂ©essayez.', + 'liveArtifact.refresh.genericFailure': 'Échec de l’actualisation.', + 'liveArtifact.refresh.statusNever': 'Non actualisable', + 'liveArtifact.refresh.statusReady': 'PrĂȘt Ă  actualiser', + 'liveArtifact.refresh.statusSucceeded': 'À jour', + 'liveArtifact.refresh.statusFailed': 'Échec de l’actualisation', + 'liveArtifact.refresh.statusRunning': 'Actualisation en cours', + 'liveArtifact.refresh.statusRunningDescription': 'Une actualisation est actuellement en cours.', + 'liveArtifact.refresh.statusSucceededDescription': 'La derniĂšre actualisation s’est terminĂ©e avec succĂšs.', + 'liveArtifact.refresh.statusFailedDescription': 'La derniĂšre tentative d’actualisation ne s’est pas terminĂ©e correctement.', + 'liveArtifact.refresh.statusReadyDescription': 'Des sources actualisables sont configurĂ©es, mais aucune exĂ©cution n’est en cours.', + 'liveArtifact.refresh.statusNeverDescription': 'Cet artefact dynamique n’a pas encore de source d’actualisation.', + 'liveArtifact.refresh.eventStarted': 'DĂ©marrĂ©e', + 'liveArtifact.refresh.eventSucceeded': 'RĂ©ussie', + 'liveArtifact.refresh.eventFailed': 'ÉchouĂ©e', + 'liveArtifact.refresh.eventStartedDetail': 'Actualisation dĂ©marrĂ©e
', + 'liveArtifact.refresh.sourcesUpdatedOne': '{n} source mise Ă  jour', + 'liveArtifact.refresh.sourcesUpdatedMany': '{n} sources mises Ă  jour', + 'liveArtifact.refresh.timelineEmpty': 'Aucune activitĂ© d’actualisation dans cette session. Lancez Actualiser pour enregistrer une chronologie, ou attendez les exĂ©cutions automatiques.', + 'liveArtifact.refresh.heroLastRefreshedLabel': 'DerniĂšre actualisation', + 'liveArtifact.refresh.heroLastRefreshedNever': 'Jamais', + 'liveArtifact.refresh.justNow': 'Ă  l’instant', + 'liveArtifact.refresh.factCreated': 'Créé', + 'liveArtifact.refresh.factLastUpdated': 'DerniĂšre mise Ă  jour', + 'liveArtifact.refresh.factUnknown': 'Inconnu', + 'liveArtifact.refresh.persistedTitle': 'Historique d’actualisation conservĂ©', + 'liveArtifact.refresh.persistedHint': 'EntrĂ©es chargĂ©es depuis refreshes.jsonl', + 'liveArtifact.refresh.persistedEmpty': 'Aucun historique d’actualisation conservĂ© pour l’instant.', + 'liveArtifact.refresh.persistedStatusSucceeded': 'rĂ©ussi', + 'liveArtifact.refresh.persistedStatusRunning': 'en cours', + 'liveArtifact.refresh.persistedStatusFailed': 'Ă©chouĂ©', + 'liveArtifact.refresh.persistedStatusCancelled': 'annulĂ©', + 'liveArtifact.refresh.persistedStatusSkipped': 'ignorĂ©', + 'liveArtifact.refresh.sessionTitle': 'ActivitĂ© de la session', + 'liveArtifact.refresh.sessionHint': 'ÉvĂ©nements observĂ©s pendant que cet onglet est ouvert', + 'liveArtifact.refresh.docSourceTitle': 'Source du document', + 'liveArtifact.refresh.docSourceHint': 'Source configurĂ©e', + 'liveArtifact.refresh.docSourceType': 'Type', + 'liveArtifact.refresh.docSourceTool': 'Outil', + 'liveArtifact.refresh.docSourceConnector': 'Connecteur', + 'liveArtifact.refresh.debugSummary': 'MĂ©tadonnĂ©es de dĂ©bogage avancĂ©es', + 'liveArtifact.refresh.debugNote': 'Peut inclure des IDs de connecteur, des noms de fichiers, des mĂ©tadonnĂ©es de source et des chemins internes d’artefact.', + 'liveArtifact.viewer.tabPreview': 'Aperçu', + 'liveArtifact.viewer.tabCode': 'Code', + 'liveArtifact.viewer.tabData': 'DonnĂ©es', + 'liveArtifact.viewer.tabRefreshHistory': 'Historique d’actualisation', + 'liveArtifact.viewer.dataEmpty': 'Aucun cache data.json disponible.', + 'liveArtifact.viewer.code.templateHeading': 'HTML du modĂšle', + 'liveArtifact.viewer.code.renderedHeading': 'HTML rendu', + 'liveArtifact.viewer.code.templateHelp': 'Le modĂšle modifiable utilisĂ© avec data.json pour gĂ©nĂ©rer l’aperçu.', + 'liveArtifact.viewer.code.renderedHelp': 'Le fichier index.html gĂ©nĂ©rĂ© actuellement chargĂ© dans l’aperçu.', + 'liveArtifact.viewer.code.variantAria': 'Variante du code', + 'liveArtifact.viewer.code.variantTemplate': 'ModĂšle', + 'liveArtifact.viewer.code.variantRendered': 'Rendu', + 'liveArtifact.viewer.code.loading': 'Chargement du code
', + 'liveArtifact.viewer.code.unavailable': 'Le code n’est pas encore disponible.', + 'liveArtifact.viewer.code.empty': 'Ce fichier de code est vide.', 'fileViewer.deployToVercel': 'DĂ©ployer sur Vercel', 'fileViewer.redeployToVercel': 'RedĂ©ployer', 'fileViewer.deployingToVercel': 'DĂ©ploiement sur Vercel
', @@ -1160,7 +1751,7 @@ export const fr: Dict = { 'fileViewer.deployingToProvider': 'DĂ©ploiement sur {provider}
', 'fileViewer.preparingPublicLink': 'PrĂ©paration du lien public
', 'fileViewer.copyDeployLink': 'Copier le lien', - 'fileViewer.deployModalTitle': 'DĂ©ployer', + 'fileViewer.deployModalTitle': 'DĂ©ployer', 'fileViewer.deployModalSubtitle': 'Utilisez le compte du fournisseur sĂ©lectionnĂ© pour dĂ©ployer cet aperçu HTML.', 'fileViewer.vercelToken': 'Jeton Vercel', 'fileViewer.vercelTokenGetLink': 'Obtenir un jeton Vercel', @@ -1208,11 +1799,9 @@ export const fr: Dict = { 'fileViewer.deployLinkProtectedLabel': 'Protection du dĂ©ploiement activĂ©e', 'fileViewer.deployLinkProtected': 'Le site est dĂ©ployĂ©, mais ce lien de prĂ©visualisation exige une authentification. DĂ©sactivez la protection du dĂ©ploiement (Deployment Protection) ou utilisez un domaine personnalisĂ©.', 'fileViewer.retryLink': 'RĂ©essayer maintenant', - 'questionForm.submit': 'Envoyer', 'questionForm.skip': 'Passer', 'questionForm.locked': 'RĂ©pondu', - 'conv.switch': 'Changer de conversation', 'conv.label': 'Conversation', 'conv.heading': 'Conversations', @@ -1222,7 +1811,6 @@ export const fr: Dict = { 'conv.renameTooltip': 'Double-cliquez pour renommer', 'conv.delete': 'Supprimer la conversation', 'conv.deleteConfirm': 'Supprimer « {title} » ? Cela supprime ses messages.', - 'agentPicker.label': 'Agent', 'agentPicker.modeChoose': 'Choisir le mode d\'exĂ©cution', 'agentPicker.localCli': 'CLI local', @@ -1232,7 +1820,6 @@ export const fr: Dict = { 'agentPicker.noAgents': 'aucun agent dans le PATH', 'agentPicker.notInstalled': 'non installĂ©', 'agentPicker.rescan': 'RĂ©analyser le PATH local pour les agents', - 'tool.openInTab': 'Ouvrir {name} dans un onglet', 'tool.open': 'ouvrir', 'tool.todos': 'TĂąches', @@ -1261,7 +1848,6 @@ export const fr: Dict = { 'tool.running': 'en cours
', 'tool.error': 'erreur', 'tool.done': 'terminĂ©', - 'assistant.role': 'Assistant', 'assistant.workingLabel': 'En cours', 'assistant.doneLabel': 'TerminĂ©', @@ -1273,12 +1859,12 @@ export const fr: Dict = { 'assistant.feedbackReasonPositiveVisual': 'Rendu visuel rĂ©ussi', 'assistant.feedbackReasonPositiveUseful': 'Structure utile', 'assistant.feedbackReasonPositiveEasy': 'Facile Ă  continuer Ă  modifier', - 'assistant.feedbackReasonPositiveDesignSystem': 'A respectĂ© le design system', + 'assistant.feedbackReasonPositiveDesignSystem': 'A respectĂ© le systĂšme de design', 'assistant.feedbackReasonNegativeMissed': 'N’a pas compris ma demande', 'assistant.feedbackReasonNegativeVisual': 'La qualitĂ© visuelle doit ĂȘtre amĂ©liorĂ©e', 'assistant.feedbackReasonNegativeIncomplete': 'Sortie incomplĂšte', 'assistant.feedbackReasonNegativeHard': 'Difficile Ă  utiliser', - 'assistant.feedbackReasonNegativeDesignSystem': 'N’a pas respectĂ© le design system', + 'assistant.feedbackReasonNegativeDesignSystem': 'N’a pas respectĂ© le systĂšme de design', 'assistant.feedbackReasonOther': 'Autre', 'assistant.feedbackReasonPlaceholder': 'Ajoutez une courte note...', 'assistant.feedbackReasonSubmit': 'Envoyer', @@ -1300,8 +1886,7 @@ export const fr: Dict = { 'assistant.statusRequesting': 'Envoi de la requĂȘte', 'assistant.statusThinking': 'RĂ©flexion', 'assistant.statusStreaming': 'RĂ©ponse en cours', - 'assistant.slowHint': - 'Plus long que d\'habitude. Le formulaire s\'affiche gĂ©nĂ©ralement en 5–10s — vous pouvez ArrĂȘter et reformuler.', + 'assistant.slowHint': 'Plus long que d\'habitude. Le formulaire s\'affiche gĂ©nĂ©ralement en 5–10s — vous pouvez ArrĂȘter et reformuler.', 'assistant.verbEditing': 'Modification', 'assistant.verbWriting': 'Écriture', 'assistant.verbReading': 'Lecture', @@ -1310,22 +1895,18 @@ export const fr: Dict = { 'assistant.verbTodos': 'TĂąches', 'assistant.verbFetching': 'RĂ©cupĂ©ration', 'assistant.verbCalling': 'Appel', - 'qf.answered': 'rĂ©pondu', 'qf.choose': 'Choisir
', 'qf.required': 'requis', - 'qf.lockedSubmitted': - 'RĂ©ponses envoyĂ©es — l\'agent les utilise pour le reste de la session.', + 'qf.lockedSubmitted': 'RĂ©ponses envoyĂ©es — l\'agent les utilise pour le reste de la session.', 'qf.lockedPrev': 'Ce formulaire provient d\'un tour prĂ©cĂ©dent.', - 'qf.hint': - 'Choisissez ce qui convient. Ignorez les champs optionnels qui ne vous intĂ©ressent pas — l\'agent utilisera des valeurs par dĂ©faut raisonnables.', + 'qf.hint': 'Choisissez ce qui convient. Ignorez les champs optionnels qui ne vous intĂ©ressent pas — l\'agent utilisera des valeurs par dĂ©faut raisonnables.', 'qf.submitDefault': 'Envoyer les rĂ©ponses', 'qf.submitDisabledTitle': 'Remplissez d\'abord les champs requis', 'qf.submitTitle': 'Envoyer les rĂ©ponses', 'qf.cardSelected': 'sĂ©lectionnĂ©', 'qf.cardRefs': 'RĂ©fs :', 'qf.cardSampleText': 'Portez ce vieux whisky au juge blond qui fume · 0123', - 'sketch.toolSelect': 'SĂ©lection (sans effet)', 'sketch.toolPen': 'Stylo', 'sketch.toolText': 'Texte', @@ -1340,7 +1921,52 @@ export const fr: Dict = { 'sketch.closeConfirm': 'Fermer le croquis et abandonner vos modifications non enregistrĂ©es ?', 'sketch.textPrompt': 'Texte :', 'sketch.textModalTitle': 'Ajouter du texte', - + 'critiqueTheater.userFacingName': 'Jury de design', + 'critiqueTheater.roleDesigner': 'Designer', + 'critiqueTheater.roleCritic': 'Critique', + 'critiqueTheater.roleBrand': 'Marque', + 'critiqueTheater.roleA11y': 'AccessibilitĂ©', + 'critiqueTheater.roleCopy': 'RĂ©daction', + 'critiqueTheater.roundLabel': 'Tour {n} sur {m}', + 'critiqueTheater.mustFix': '{n} Ă  corriger', + 'critiqueTheater.composite': 'Score composite', + 'critiqueTheater.threshold': 'Seuil', + 'critiqueTheater.consensus': 'Consensus', + 'critiqueTheater.interrupt': 'Interrompre', + 'critiqueTheater.interrupting': 'Interruption
', + 'critiqueTheater.interrupted': 'Interrompu', + 'critiqueTheater.degradedHeading': 'Panel hors ligne pour cette exĂ©cution', + 'critiqueTheater.degradedReasonMalformed': 'Sortie de panel mal formĂ©e (bloc rejetĂ© par le parseur).', + 'critiqueTheater.degradedReasonOversize': 'La sortie du panel a dĂ©passĂ© le budget d’octets sĂ©curisĂ©.', + 'critiqueTheater.degradedReasonAdapter': 'L’adaptateur {adapter} ne prend pas en charge le protocole Critique.', + 'critiqueTheater.degradedReasonProtocol': 'L’adaptateur {adapter} a envoyĂ© une version de protocole non prise en charge.', + 'critiqueTheater.degradedReasonMissingArtifact': 'L’exĂ©cution s’est terminĂ©e sans artefact final.', + 'critiqueTheater.replay': 'Rejouer', + 'critiqueTheater.replaySpeed': 'Vitesse de relecture', + 'critiqueTheater.readOnly': 'Lecture seule', + 'critiqueTheater.shippedSummary': 'LivrĂ© au tour {round} · score composite {composite}', + 'critiqueTheater.interruptedSummary': 'Interrompu au tour {round} · meilleur score composite {composite}', + 'critiqueTheater.shippedBadge': 'LivrĂ©', + 'critiqueTheater.belowThresholdBadge': 'Sous le seuil', + 'critiqueTheater.timedOutBadge': 'DĂ©lai dĂ©passĂ©', + 'critiqueTheater.failedHeading': 'Échec de l’exĂ©cution', + 'critiqueTheater.failedReasonCliExit': 'La CLI de l’agent s’est arrĂȘtĂ©e avec un code non nul avant la fin du panel.', + 'critiqueTheater.failedReasonPerRoundTimeout': 'Un tour a dĂ©passĂ© son budget de temps.', + 'critiqueTheater.failedReasonTotalTimeout': 'L’exĂ©cution complĂšte a dĂ©passĂ© son budget de temps.', + 'critiqueTheater.failedReasonOrchestrator': 'Erreur interne de l’orchestrateur.', + 'critiqueTheater.transcriptEmpty': 'Aucune transcription Ă  rejouer pour l’instant. Lancez une critique pour en enregistrer une.', + 'critiqueTheater.transcriptLoading': 'Chargement de la transcription
', + 'critiqueTheater.transcriptError': 'Impossible de charger la transcription : {error}', + 'critiqueTheater.replaySpeedPaused': 'En pause', + 'critiqueTheater.replaySpeedInstant': 'InstantanĂ©', + 'critiqueTheater.replaySpeedLive': 'Temps rĂ©el', + 'critiqueTheater.replaySpeedFast': 'Rapide', + 'critiqueTheater.settingsNav': 'Jury de design', + 'critiqueTheater.settingsNavHint': 'Revue de design Ă  cinq panels pour vos exĂ©cutions', + 'critiqueTheater.settingsEnabledLabel': 'Afficher le Jury de design pendant les exĂ©cutions de l’agent', + 'critiqueTheater.settingsEnabledDescription': 'Lorsque cette option est activĂ©e, une revue Ă  cinq panels apparaĂźt Ă  cĂŽtĂ© des gĂ©nĂ©rations de l’agent et note le rĂ©sultat avant l’expĂ©dition. Vous pouvez l’interrompre Ă  tout moment.', + 'critiqueTheater.settingsEnabledProjectHint': 'EnregistrĂ© pour ce projet. Les nouvelles exĂ©cutions de ce projet passeront cĂŽtĂ© serveur par le Jury de design.', + 'critiqueTheater.settingsEnabledNoProjectHint': 'Ouvrez un projet pour enregistrer ce rĂ©glage cĂŽtĂ© serveur. D’ici lĂ , seule la prĂ©fĂ©rence dans ce navigateur change.', 'pet.title': 'Compagnons', 'pet.subtitle': 'Adoptez un petit compagnon qui flotte au-dessus de votre espace de travail.', 'pet.navTitle': 'Compagnons', @@ -1376,6 +2002,27 @@ export const fr: Dict = { 'pet.overlayAria': 'Compagnon', 'pet.spriteAria': '{name} — glisser pour dĂ©placer, cliquer pour chatter', 'pet.spriteTitle': 'Salut de {name} ! Cliquez pour chatter.', + 'pet.taskSummarySingle': '{count} tĂąche agent est en cours.', + 'pet.taskSummaryMultiple': '{count} tĂąches agent sont en cours sur {projects} projets.', + 'pet.taskSummaryRecentSingle': '{count} tĂąche agent s’est terminĂ©e rĂ©cemment.', + 'pet.taskSummaryRecentMultiple': '{count} tĂąches agent se sont terminĂ©es rĂ©cemment.', + 'pet.taskListAria': 'TĂąches agent actives', + 'pet.taskOpenProject': 'Ouvrir {project}', + 'pet.taskGroup.running': 'En cours', + 'pet.taskGroup.queued': 'En attente', + 'pet.taskGroup.recent': 'TerminĂ©es rĂ©cemment', + 'pet.idleQuote.leonardo.text': 'Apprendre ne fatigue jamais l’esprit.', + 'pet.idleQuote.leonardo.author': 'LĂ©onard de Vinci', + 'pet.idleQuote.michelangelo.text': 'J’ai vu l’ange dans le marbre et j’ai taillĂ© jusqu’à le libĂ©rer.', + 'pet.idleQuote.michelangelo.author': 'Michel-Ange', + 'pet.idleQuote.bernini.text': 'Deux choses peuvent aider le sculpteur : la lumiĂšre et l’ombre.', + 'pet.idleQuote.bernini.author': 'Gian Lorenzo Bernini', + 'pet.idleQuote.raphael.text': 'Quand on peint, on ne pense pas.', + 'pet.idleQuote.raphael.author': 'RaphaĂ«l', + 'pet.idleQuote.caravaggio.text': 'Toutes les Ɠuvres, peu importe quoi ou par qui elles sont peintes, ne sont que bagatelles et enfantillages si elles ne sont pas faites et peintes d’aprĂšs nature.', + 'pet.idleQuote.caravaggio.author': 'Le Caravage', + 'pet.idleQuote.rodin.text': 'L’essentiel est d’ĂȘtre Ă©mu, d’aimer, d’espĂ©rer, de trembler, de vivre.', + 'pet.idleQuote.rodin.author': 'Auguste Rodin', 'pet.composerTitle': 'Compagnons — rĂ©veiller, cacher ou choisir', 'pet.composerMenuTitle': 'Compagnons', 'pet.composerMenuHint': 'astuce : tapez /pet pour basculer', @@ -1443,7 +2090,6 @@ export const fr: Dict = { 'pet.communitySyncFailed': 'Échec de la synchronisation : {error}', 'pet.codexBundled': 'Fourni', 'pet.codexBundledTitle': 'LivrĂ© avec Open Design — aucun tĂ©lĂ©chargement nĂ©cessaire.', - 'settings.notifications': 'Notifications', 'settings.notificationsHint': 'Son et notification bureau Ă  la fin d\'une tĂąche', 'settings.notifyCompletionSound': 'Son de fin', @@ -1483,14 +2129,14 @@ export const fr: Dict = { 'settings.skillsNameRequired': 'Le nom de la compĂ©tence est requis.', 'settings.skillsBodyRequired': 'Le contenu de la compĂ©tence est requis.', 'settings.designSystems': 'SystĂšmes de design', - 'settings.designSystemsHint': 'Parcourez et activez les systĂšmes de design disponibles', + 'settings.designSystemsHint': 'GĂ©rez les systĂšmes de design affichĂ©s dans la galerie d’accueil', 'settings.designSystemsInstalled': 'InstallĂ©s', 'settings.designSystemsAdd': 'Ajouter un systĂšme de design', 'settings.designSystemsHiddenCount': '{count} masquĂ©s dans la galerie d’accueil', 'settings.designSystemsShowAll': 'Tout afficher', 'settings.designSystemsShowHidden': 'Afficher les masquĂ©s', 'settings.designSystemsSource': 'Source', - 'settings.designSystemsSourceLocal': 'Local', + 'settings.designSystemsSourceLocal': 'Locale', 'settings.designSystemsSourceGithub': 'GitHub', 'settings.designSystemsStructure': 'Structure', 'settings.designSystemsModeHybrid': 'Hybride', @@ -1534,29 +2180,31 @@ export const fr: Dict = { 'settings.connectorsClearFinalTitle': 'Cette action dĂ©connectera tous les connecteurs', 'settings.connectorsClearFinalBody': 'Action irrĂ©versible. Vous devrez reconnecter chaque intĂ©gration depuis le dĂ©but aprĂšs avoir collĂ© une nouvelle clĂ©.', 'settings.connectorsClearFinalConfirm': 'Supprimer la clĂ© et dĂ©connecter', - 'settings.connectorsClearArming': 'Un instant\u2026', + 'settings.connectorsClearArming': 'Un instant
', 'settings.connectorsClearCancel': 'Annuler', - 'settings.connectorsSaveKey': "Enregistrer la clĂ©", - 'settings.connectorsSaveKeyTitle': "Envoyer cette clĂ© au daemon local", - 'settings.connectorsKeySaving': "Enregistrement
", - 'settings.connectorsKeySaved': "EnregistrĂ© ✓", - 'settings.connectorsKeyError': "Impossible d’enregistrer la clĂ©. VĂ©rifiez que le daemon local est lancĂ©, puis rĂ©essayez.", + 'settings.connectorsSaveKey': 'Enregistrer la clĂ©', + 'settings.connectorsSaveKeyTitle': 'Envoyer cette clĂ© au daemon local', + 'settings.connectorsKeySaving': 'Enregistrement
', + 'settings.connectorsKeySaved': 'EnregistrĂ© ✓', + 'settings.connectorsKeyError': 'Impossible d’enregistrer la clĂ©. VĂ©rifiez que le daemon local est lancĂ©, puis rĂ©essayez.', 'settings.connectorsHelpSaved': 'Votre clĂ© dĂ©verrouille le catalogue ci-dessous et reste dans le daemon local. Collez une nouvelle clĂ© pour la remplacer ou effacez-la.', - 'settings.connectorsHelpUnsaved': "Modifications non enregistrĂ©es — cliquez sur Enregistrer la clĂ© pour stocker cette information dans le daemon local et dĂ©bloquer le catalogue ci-dessous.", - 'settings.connectorsHelpEmpty': 'Ajoutez une clĂ© pour dĂ©verrouiller le catalogue ci-dessous. Les clĂ©s sont stockĂ©es localement dans le daemon et ne sont jamais envoyĂ©es via des variables d’environnement.', + 'settings.connectorsHelpUnsaved': 'Modifications non enregistrĂ©es — cliquez sur Enregistrer la clĂ© pour stocker cette information dans le daemon local et dĂ©bloquer le catalogue ci-dessous.', + 'settings.connectorsHelpEmpty': 'Les clĂ©s sont stockĂ©es localement et ne sont jamais partagĂ©es.', 'settings.connectorsLoadingSavedKey': 'Recherche d’une clĂ© enregistrĂ©e dans le daemon local
', - 'settings.autosaveSaving': "Enregistrement
", - 'settings.autosaveSaved': "Toutes les modifications enregistrĂ©es", - 'settings.autosaveError': "Impossible d’enregistrer les modifications. Le daemon local est peut-ĂȘtre hors ligne.", + 'settings.autosaveSaving': 'Enregistrement
', + 'settings.autosaveSaved': 'Toutes les modifications enregistrĂ©es', + 'settings.autosaveError': 'Impossible d’enregistrer les modifications. Le daemon local est peut-ĂȘtre hors ligne.', 'settings.libraryToggleLabel': 'Activer ou dĂ©sactiver', - // Memory (auto-extracted personalization saved as on-disk markdown) 'settings.memory': 'MĂ©moire', 'settings.memoryHint': 'Faits personnels extraits automatiquement des conversations', + 'settings.customInstructionsTitle': 'Instructions personnalisĂ©es', + 'settings.customInstructionsHint': 'Instructions persistantes appliquĂ©es Ă  chaque projet. Utilisez-les pour dĂ©finir les prĂ©fĂ©rences que le modĂšle doit toujours suivre.', + 'settings.customInstructionsPlaceholder': 'ex. "Utilise toujours TypeScript. PrĂ©fĂšre les composants fonctionnels. RĂ©ponds de façon concise."', 'settings.memoryDescription': 'Faits sur vos prĂ©fĂ©rences extraits automatiquement, sauvegardĂ©s en Markdown et rĂ©injectĂ©s dans chaque chat.', 'settings.memoryEnabled': 'ActivĂ©e', 'settings.memoryDisabled': 'DĂ©sactivĂ©e', 'settings.memoryEnableLabel': 'Activer l\'injection de mĂ©moire', - 'settings.memoryDisabledBanner': 'La mĂ©moire est actuellement dĂ©sactivĂ©e. Les faits existants restent sur le disque mais ne seront pas injectĂ©s dans les nouveaux chats.', + 'settings.memoryDisabledBanner': 'La mĂ©moire est actuellement dĂ©sactivĂ©e. Les faits existants restent sur le disque, mais ne seront pas injectĂ©s dans les nouveaux chats, et les nouveaux tours n’extrairont rien de nouveau.', 'settings.memoryNew': 'Nouvelle mĂ©moire', 'settings.memoryEdit': 'Modifier', 'settings.memoryDelete': 'Supprimer', @@ -1617,15 +2265,16 @@ export const fr: Dict = { 'settings.memoryExtractionKindLlm': 'LLM', 'settings.memoryExtractionProviderEnv': 'env', 'settings.memoryExtractionProviderMediaConfig': 'rĂ©glages mĂ©dias', + 'settings.memoryExtractionProviderOverride': 'rĂ©glages mĂ©moire', 'settings.memoryExtractionProposed': 'proposĂ©e', 'settings.memoryExtractionWritten': 'Ă©crite', 'settings.memoryExtractionDuration': 'en', - 'settings.memoryNoProviderBannerTitle': 'L’extraction de mĂ©moire LLM ne fonctionne pas', - 'settings.memoryNoProviderBannerBody': 'Aucune clĂ© API trouvĂ©e pour l’extracteur de mĂ©moire. Ajoutez une clĂ© OpenAI dans les fournisseurs de mĂ©dias, ou dĂ©finissez ANTHROPIC_API_KEY / OPENAI_API_KEY dans l’environnement pour activer l’extraction par LLM. L’extraction heuristique par regex reste active.', - 'settings.memoryExtractionProviderOverride': 'rĂ©glages mĂ©moire', 'settings.memoryExtractionDelete': 'Supprimer', 'settings.memoryExtractionsClear': 'Effacer', 'settings.memoryExtractionsClearTitle': 'Effacer tout l’historique d’extraction', + 'settings.memoryExtractionsClearConfirm': 'Effacer tout l’historique des extractions ? Cette action est irrĂ©versible.', + 'settings.memoryNoProviderBannerTitle': 'L’extraction de mĂ©moire LLM ne fonctionne pas', + 'settings.memoryNoProviderBannerBody': 'Aucune clĂ© API trouvĂ©e pour l’extracteur de mĂ©moire. Ajoutez une clĂ© OpenAI dans les fournisseurs de mĂ©dias, ou dĂ©finissez ANTHROPIC_API_KEY / OPENAI_API_KEY dans l’environnement pour activer l’extraction par LLM. L’extraction heuristique par regex reste active.', 'settings.libraryInstall': 'Installer', 'settings.libraryInstallGithub': 'GitHub', 'settings.libraryInstallLocal': 'Chemin local', @@ -1635,6 +2284,68 @@ export const fr: Dict = { 'settings.libraryUninstall': 'DĂ©sinstaller', 'settings.libraryBuiltIn': 'IntĂ©grĂ©', 'settings.libraryInstalled': 'InstallĂ©', + 'settings.orbit.eyebrow': 'Automatisation', + 'settings.orbit.title': 'Orbit', + 'settings.orbit.navHint': 'RĂ©sumĂ© quotidien des connecteurs', + 'settings.orbit.lede': 'Collecte l’activitĂ© des connecteurs selon un calendrier et publie le rĂ©sultat sous forme d’artefact dynamique actualisable.', + 'settings.orbit.statusOnTitle': 'Les exĂ©cutions quotidiennes planifiĂ©es sont activĂ©es', + 'settings.orbit.statusOffTitle': 'Les exĂ©cutions quotidiennes planifiĂ©es sont dĂ©sactivĂ©es', + 'settings.orbit.statusActive': 'Actif', + 'settings.orbit.statusOff': 'DĂ©sactivĂ©', + 'settings.orbit.runTitle': 'DĂ©marrer une exĂ©cution Orbit et ouvrir la conversation en direct', + 'settings.orbit.running': 'ExĂ©cution
', + 'settings.orbit.runOpen': 'ExĂ©cuter maintenant', + 'settings.orbit.dailySummaryTitle': 'RĂ©sumĂ© quotidien', + 'settings.orbit.dailySummarySub': 'S’exĂ©cute une fois par jour Ă  l’heure locale planifiĂ©e.', + 'settings.orbit.on': 'ActivĂ©', + 'settings.orbit.off': 'DĂ©sactivĂ©', + 'settings.orbit.runTimeTitle': 'Heure d’exĂ©cution', + 'settings.orbit.runTimeSub': 'Par dĂ©faut 08:00. Enregistrez pour appliquer au planning du daemon.', + 'settings.orbit.runTimeAria': 'Heure d’exĂ©cution quotidienne de Orbit', + 'settings.orbit.nextRun': 'Prochaine exĂ©cution', + 'settings.orbit.nextRunScheduledAfterSave': 'PlanifiĂ©e aprĂšs enregistrement', + 'settings.orbit.schedule': 'Planning', + 'settings.orbit.pausedManualOnly': 'En pause — exĂ©cutions manuelles uniquement', + 'settings.orbit.templateTitle': 'ModĂšle de prompt', + 'settings.orbit.templateMissing': 'Le modĂšle {id} n’est pas installĂ©.', + 'settings.orbit.templateMissingOption': '{id} (manquant)', + 'settings.orbit.templateMissingInstall': 'Installez une compĂ©tence Orbit pour guider le prompt.', + 'settings.orbit.templateMissingPickAnother': 'Choisissez un autre modĂšle dans la liste.', + 'settings.orbit.templateResetTitle': 'RĂ©initialiser sur {id}', + 'settings.orbit.templateReset': 'RĂ©initialiser', + 'settings.orbit.templateHelp': 'Guidez Orbit avec une compĂ©tence — le prompt d’exemple du modĂšle sĂ©lectionnĂ© est injectĂ© dans chaque exĂ©cution Orbit afin que les rĂ©sumĂ©s suivent cette forme.', + 'settings.orbit.templateAria': 'ModĂšle de prompt Orbit', + 'settings.orbit.templatesLoading': 'Chargement des modĂšles
', + 'settings.orbit.templatesOptgroup': 'ModĂšles de compĂ©tences Orbit', + 'settings.orbit.lastRun': 'DerniĂšre exĂ©cution', + 'settings.orbit.triggerManual': 'Manuelle', + 'settings.orbit.triggerScheduled': 'PlanifiĂ©e', + 'settings.orbit.meterAria': '{succeeded} rĂ©ussis, {skipped} ignorĂ©s, {failed} Ă©chouĂ©s sur {checked} vĂ©rifiĂ©s', + 'settings.orbit.countChecked': 'VĂ©rifiĂ©s', + 'settings.orbit.countSucceeded': 'RĂ©ussis', + 'settings.orbit.countSkipped': 'IgnorĂ©s', + 'settings.orbit.countFailed': 'ÉchouĂ©s', + 'settings.orbit.runError': 'Impossible d’exĂ©cuter Orbit. VĂ©rifiez que le daemon local fonctionne et que les connecteurs sont configurĂ©s.', + 'settings.orbit.gateAriaLabel': 'Des connecteurs sont requis pour utiliser Orbit', + 'settings.orbit.gateEyebrow': 'Configuration requise', + 'settings.orbit.gateTitle': 'Connectez un outil pour alimenter Orbit', + 'settings.orbit.gateBody': 'Orbit rĂ©sume l’activitĂ© de vos connecteurs. Vous n’avez encore rien connectĂ© — ajoutez au moins une intĂ©gration pour qu’Orbit ait de quoi rapporter.', + 'settings.orbit.gateBodyNoKey': 'Orbit rĂ©sume l’activitĂ© de vos connecteurs, et les connecteurs passent par Composio. Ajoutez une clĂ© d’API Composio dans Connecteurs pour dĂ©bloquer le catalogue et choisir votre premiĂšre intĂ©gration.', + 'settings.orbit.gateAction': 'Ouvrir Connecteurs', + 'settings.orbit.gateActionNoKey': 'Configurer Composio', + 'settings.orbit.gateLoading': 'VĂ©rification de vos connecteurs
', + 'settings.orbit.controlsLockedBadge': 'VerrouillĂ©', + 'settings.orbit.controlsLockedHint': 'Connectez un outil pour dĂ©verrouiller la planification et le modĂšle d\'Orbit.', + 'settings.orbit.artifactKickerLive': 'artefact dynamique', + 'settings.orbit.artifactKickerLegacy': 'RĂ©sumĂ© hĂ©ritĂ©', + 'settings.orbit.artifactTitle': 'RĂ©sumĂ© quotidien de l’activitĂ© Orbit', + 'settings.orbit.artifactMetaLive': 'Artefact HTML actualisable gĂ©nĂ©rĂ© Ă  partir de l’activitĂ© des connecteurs.', + 'settings.orbit.artifactMetaLegacy': 'GĂ©nĂ©rĂ© avant l’activation de la prise en charge des artefacts dynamiques — relancez Orbit pour en publier un.', + 'settings.orbit.copyMarkdownTitle': 'Copier le rĂ©sumĂ© Markdown dans le presse-papiers', + 'settings.orbit.copied': 'CopiĂ©', + 'settings.orbit.copy': 'Copier', + 'settings.orbit.openArtifact': 'Ouvrir l’artefact', + 'settings.orbit.sourceMarkdown': 'Source Markdown', 'notify.successTitle': 'TĂąche terminĂ©e', 'notify.failureTitle': 'TĂąche Ă©chouĂ©e', 'notify.successBody': 'Un tour est terminĂ©.', @@ -1665,299 +2376,12 @@ export const fr: Dict = { 'settings.memoryModelInlineSameAsChat': 'Identique au chat', 'settings.memoryModelInlineSameAsChatWithModel': 'Identique au chat ({model})', 'settings.memoryModelInlineSameAsChatWithProvider': 'Identique au chat ({provider})', - 'settings.memoryModelInlineHintCli': 'Facultatif. L’extracteur de mĂ©moire utilise une variable d’environnement ou une clĂ© API de fournisseurs de mĂ©dias pour ce fournisseur ; fixer un modĂšle ici remplace seulement le choix automatique.', - 'settings.memoryModelInlineHintCliConstrained': 'Facultatif. La mĂ©moire appellera {provider} ; il faut une variable d’environnement ou une clĂ© API de fournisseurs de mĂ©dias pour ce fournisseur, ou choisir un modĂšle ci-dessous pour remplacer.', + 'settings.memoryModelInlineHintCli': 'Facultatif. Utilise la CLI locale sĂ©lectionnĂ©e quand elle est prise en charge ; choisissez un modĂšle seulement pour remplacer la valeur par dĂ©faut.', + 'settings.memoryModelInlineHintCliConstrained': 'Facultatif. Utilise la CLI locale sĂ©lectionnĂ©e quand elle est prise en charge ; {provider} n’est que la famille de fournisseur de secours.', 'settings.memoryModelInlineHintByok': 'Facultatif. RĂ©utilise votre clĂ© API de chat sur le mĂȘme fournisseur — choisir un autre modĂšle (souvent moins cher) ne change que le corps de la requĂȘte.', + 'settings.memoryModelInlineHintByokNeutral': 'La mĂ©moire utilise un modĂšle sĂ©parĂ© du chat. Par dĂ©faut, elle reprend votre modĂšle de chat.', 'settings.memoryModelInlineFlashSaved': 'EnregistrĂ©', 'settings.memoryModelInlineFlashCleared': 'EffacĂ©', - 'settings.orbit.eyebrow': 'Automatisation', - 'settings.orbit.title': 'Orbit', - 'settings.orbit.navHint': 'RĂ©sumĂ© quotidien des connecteurs', - 'settings.orbit.lede': 'Collecte l’activitĂ© des connecteurs selon un calendrier et publie le rĂ©sultat sous forme d’artefact dynamique actualisable.', - 'settings.orbit.statusOnTitle': 'Les exĂ©cutions quotidiennes planifiĂ©es sont activĂ©es', - 'settings.orbit.statusOffTitle': 'Les exĂ©cutions quotidiennes planifiĂ©es sont dĂ©sactivĂ©es', - 'settings.orbit.statusActive': 'Actif', - 'settings.orbit.statusOff': 'DĂ©sactivĂ©', - 'settings.orbit.runTitle': 'DĂ©marrer une exĂ©cution Orbit et ouvrir la conversation en direct', - 'settings.orbit.running': 'ExĂ©cution
', - 'settings.orbit.runOpen': 'ExĂ©cuter maintenant', - 'settings.orbit.dailySummaryTitle': 'RĂ©sumĂ© quotidien', - 'settings.orbit.dailySummarySub': 'S’exĂ©cute une fois par jour Ă  l’heure locale planifiĂ©e.', - 'settings.orbit.on': 'ActivĂ©', - 'settings.orbit.off': 'DĂ©sactivĂ©', - 'settings.orbit.runTimeTitle': 'Heure d’exĂ©cution', - 'settings.orbit.runTimeSub': 'Par dĂ©faut 08:00. Enregistrez pour appliquer au planning du daemon.', - 'settings.orbit.runTimeAria': 'Heure d’exĂ©cution quotidienne de Orbit', - 'settings.orbit.nextRun': 'Prochaine exĂ©cution', - 'settings.orbit.nextRunScheduledAfterSave': 'PlanifiĂ©e aprĂšs enregistrement', - 'settings.orbit.schedule': 'Planning', - 'settings.orbit.pausedManualOnly': 'En pause — exĂ©cutions manuelles uniquement', - 'settings.orbit.templateTitle': 'ModĂšle de prompt', - 'settings.orbit.templateMissing': 'Le modĂšle {id} n’est pas installĂ©.', - 'settings.orbit.templateMissingOption': '{id} (manquant)', - 'settings.orbit.templateMissingInstall': 'Installez une skill Orbit pour guider le prompt.', - 'settings.orbit.templateMissingPickAnother': 'Choisissez un autre modĂšle dans la liste.', - 'settings.orbit.templateResetTitle': 'RĂ©initialiser sur {id}', - 'settings.orbit.templateReset': 'RĂ©initialiser', - 'settings.orbit.templateHelp': 'Guidez Orbit avec une skill — le prompt d’exemple du modĂšle sĂ©lectionnĂ© est injectĂ© dans chaque exĂ©cution Orbit afin que les rĂ©sumĂ©s suivent cette forme.', - 'settings.orbit.templateAria': 'ModĂšle de prompt Orbit', - 'settings.orbit.templatesLoading': 'Chargement des modĂšles
', - 'settings.orbit.templatesOptgroup': 'ModĂšles de skills Orbit', - 'settings.orbit.lastRun': 'DerniĂšre exĂ©cution', - 'settings.orbit.triggerManual': 'Manuelle', - 'settings.orbit.triggerScheduled': 'PlanifiĂ©e', - 'settings.orbit.meterAria': '{succeeded} rĂ©ussis, {skipped} ignorĂ©s, {failed} Ă©chouĂ©s sur {checked} vĂ©rifiĂ©s', - 'settings.orbit.countChecked': 'VĂ©rifiĂ©s', - 'settings.orbit.countSucceeded': 'RĂ©ussis', - 'settings.orbit.countSkipped': 'IgnorĂ©s', - 'settings.orbit.countFailed': 'ÉchouĂ©s', - 'settings.orbit.runError': 'Impossible d’exĂ©cuter Orbit. VĂ©rifiez que le daemon local fonctionne et que les connecteurs sont configurĂ©s.', - 'settings.orbit.gateAriaLabel': "Des connecteurs sont requis pour utiliser Orbit", - 'settings.orbit.gateEyebrow': "Configuration requise", - 'settings.orbit.gateTitle': "Connectez un outil pour alimenter Orbit", - 'settings.orbit.gateBody': "Orbit rĂ©sume l’activitĂ© de vos connecteurs. Vous n’avez encore rien connectĂ© — ajoutez au moins une intĂ©gration pour qu’Orbit ait de quoi rapporter.", - 'settings.orbit.gateBodyNoKey': "Orbit rĂ©sume l’activitĂ© de vos connecteurs, et les connecteurs passent par Composio. Ajoutez une clĂ© d’API Composio dans Connecteurs pour dĂ©bloquer le catalogue et choisir votre premiĂšre intĂ©gration.", - 'settings.orbit.gateAction': "Ouvrir Connecteurs", - 'settings.orbit.gateActionNoKey': "Configurer Composio", - 'settings.orbit.gateLoading': "VĂ©rification de vos connecteurs
", - 'settings.orbit.controlsLockedBadge': "VerrouillĂ©", - 'settings.orbit.controlsLockedHint': "Connectez un outil pour dĂ©verrouiller la planification et le modĂšle d'Orbit.", - 'settings.orbit.artifactKickerLive': 'artefact dynamique', - 'settings.orbit.artifactKickerLegacy': 'RĂ©sumĂ© hĂ©ritĂ©', - 'settings.orbit.artifactTitle': 'RĂ©sumĂ© quotidien de l’activitĂ© Orbit', - 'settings.orbit.artifactMetaLive': 'Artefact HTML actualisable gĂ©nĂ©rĂ© Ă  partir de l’activitĂ© des connecteurs.', - 'settings.orbit.artifactMetaLegacy': 'GĂ©nĂ©rĂ© avant l’activation de la prise en charge des artefacts dynamiques — relancez Orbit pour en publier un.', - 'settings.orbit.copyMarkdownTitle': 'Copier le rĂ©sumĂ© Markdown dans le presse-papiers', - 'settings.orbit.copied': 'CopiĂ©', - 'settings.orbit.copy': 'Copier', - 'settings.orbit.openArtifact': 'Ouvrir l’artefact', - 'settings.orbit.sourceMarkdown': 'Source Markdown', - 'liveArtifact.viewer.tabPreview': 'Aperçu', - 'liveArtifact.viewer.tabCode': 'Code', - 'liveArtifact.viewer.tabData': 'DonnĂ©es', - 'liveArtifact.viewer.tabRefreshHistory': 'Historique d’actualisation', - 'liveArtifact.viewer.dataEmpty': 'Aucun cache data.json disponible.', - 'liveArtifact.viewer.code.templateHeading': 'HTML du modĂšle', - 'liveArtifact.viewer.code.renderedHeading': 'HTML rendu', - 'liveArtifact.viewer.code.templateHelp': 'Le modĂšle modifiable utilisĂ© avec data.json pour gĂ©nĂ©rer l’aperçu.', - 'liveArtifact.viewer.code.renderedHelp': 'Le fichier index.html gĂ©nĂ©rĂ© actuellement chargĂ© dans l’aperçu.', - 'liveArtifact.viewer.code.variantAria': 'Variante du code', - 'liveArtifact.viewer.code.variantTemplate': 'ModĂšle', - 'liveArtifact.viewer.code.variantRendered': 'Rendu', - 'liveArtifact.viewer.code.loading': 'Chargement du code
', - 'liveArtifact.viewer.code.unavailable': 'Le code n’est pas encore disponible.', - 'liveArtifact.viewer.code.empty': 'Ce fichier de code est vide.', - - // Explicit overrides for keys that would otherwise fall back through `...en`. - 'settings.fetchModels': 'RĂ©cupĂ©rer les modĂšles', - 'settings.fetchModelsTitle': 'RĂ©cupĂ©rer les modĂšles disponibles auprĂšs de ce fournisseur', - 'settings.fetchModelsRunning': 'RĂ©cupĂ©ration des modĂšles
', - 'settings.fetchModelsSuccess': 'ModĂšles rĂ©cupĂ©rĂ©s : {count}.', - 'settings.fetchModelsEmpty': 'Aucun modĂšle de texte compatible n’a Ă©tĂ© renvoyĂ©.', - 'settings.fetchModelsUnsupported': 'La dĂ©couverte de modĂšles n’est pas disponible pour ce protocole.', - 'settings.fetchModelsFailed': 'Impossible de rĂ©cupĂ©rer les modĂšles : {detail}', - 'settings.azureModelFetchHint': - 'Pour Azure OpenAI, saisissez le nom du dĂ©ploiement créé dans Azure. La dĂ©couverte automatique des dĂ©ploiements n’est pas disponible depuis ce point d’accĂšs BYOK.', - 'settings.mcpTitle': 'Serveur MCP', - 'settings.mcpHint': - 'Permet Ă  un agent de code dans un autre dĂ©pĂŽt (Claude Code, Cursor, VS Code, Antigravity, Zed, Windsurf) de lire vos projets Open Design. Utilisez-le pour intĂ©grer un design dans votre app sans exporter d’abord un zip.', - 'settings.mcpDaemonError': - 'Impossible de joindre le daemon local pour rĂ©soudre les chemins d’installation ({error}). VĂ©rifiez qu’Open Design fonctionne, puis rouvrez ce panneau.', - 'settings.mcpBuildDaemon': 'Construisez d’abord le daemon.', - 'settings.mcpNodeMissing': 'Le binaire Node est introuvable.', - 'settings.mcpBuildHint': - 'apps/daemon/dist/cli.js est introuvable. ExĂ©cutez `pnpm --filter @open-design/daemon build`, puis actualisez.', - 'settings.mcpMethodCli': 'Commande CLI', - 'settings.mcpInstructionCli': 'ExĂ©cutez ceci dans votre terminal.', - 'settings.mcpMethodToml': 'Configuration TOML', - 'settings.mcpInstructionCodex': - 'Ajoutez cette table Ă  {path}. La mĂȘme configuration est partagĂ©e entre la CLI Codex et l’extension Codex IDE.', - 'settings.mcpMethodOneClick': 'Installation en un clic', - 'settings.mcpInstructionCursor': - 'Cliquez sur « Installer dans Cursor » pour installer avec une boĂźte de validation, ou fusionnez ce JSON dans {path}.', - 'settings.mcpDeeplinkInstallCursor': 'Installer dans Cursor', - 'settings.mcpMethodJson': 'Configuration JSON', - 'settings.mcpInstructionCopilot': - 'Ouvrez la palette de commandes ({shortcut}), lancez "MCP: Open User Configuration", puis fusionnez ce JSON. Copilot Chat doit ĂȘtre en mode Agent pour afficher les outils.', - 'settings.mcpInstructionAntigravity': - 'Dans Antigravity : panneau Agent, menu "..." → MCP Servers → Manage MCP Servers → View raw config. Fusionnez ce JSON.', - 'settings.mcpInstructionZed': - 'Ouvrez les rĂ©glages Zed ({shortcut}) et fusionnez ceci dans l’objet racine. Zed utilise "context_servers", pas "mcpServers".', - 'settings.mcpInstructionWindsurf': - 'Ouvrez {path} (ou utilisez l’icĂŽne MCPs dans Cascade → Configure), puis fusionnez :', - 'settings.mcpCopyAria': 'Copier l’extrait de configuration MCP', - 'settings.mcpResolvingFailed': '# Ă©chec de rĂ©solution des chemins, voir l’erreur ci-dessus', - 'settings.mcpLoadingPaths': '# chargement des chemins d’installation depuis le daemon local
', - 'settings.mcpCopied': 'CopiĂ©', - 'settings.mcpCopy': 'Copier', - 'settings.mcpCursorApproval': 'Cursor affiche une boĂźte de validation avant d’écrire la configuration.', - 'settings.mcpRestartNote': 'RedĂ©marrez votre client pour charger le nouveau serveur.', - 'settings.mcpRestartDetail': - 'La plupart des Ă©diteurs ne chargent les serveurs MCP qu’au dĂ©marrage. Dans Cursor / VS Code / Antigravity / Windsurf, vous pouvez lancer `Developer: Reload Window` depuis la palette de commandes au lieu de tout redĂ©marrer. Zed et Claude Code nĂ©cessitent de quitter puis rouvrir.', - 'settings.mcpCapabilitiesTitle': 'Ce que votre agent peut faire', - 'settings.mcpCapabilityRead': - 'Lire ou rechercher n’importe quel fichier dans un projet (HTML, JSX, CSS, JSON, SVG, Markdown).', - 'settings.mcpCapabilityPull': - 'RĂ©cupĂ©rer un bundle de design en un seul appel : le fichier d’entrĂ©e plus chaque variable CSS, composant et police rĂ©fĂ©rencĂ©.', - 'settings.mcpCapabilityDefault': - 'Utiliser par dĂ©faut le projet et le fichier ouverts dans Open Design, afin que vous puissiez dire « intĂšgre ce design dans mon application » sans reprĂ©ciser quel design.', - 'settings.mcpRunningNote': - 'Open Design doit ĂȘtre lancĂ© pour que les appels d’outils MCP rĂ©ussissent. Si vous avez dĂ©marrĂ© votre agent de code avant d’ouvrir Open Design, redĂ©marrez l’agent pour qu’il puisse joindre le daemon actif.', - 'newproj.tabLiveArtifact': 'Artefact dynamique', - 'newproj.titleLiveArtifact': 'Nouvel artefact dynamique', - 'newproj.targetPlatformsLabel': 'Plateformes cibles', - 'newproj.targetPlatformsHint': - 'Choisissez-en une ou plusieurs. Le web responsive couvre seulement les points de rupture du navigateur ; ajoutez iOS, Android, tablette ou app desktop pour des variantes natives multiplateformes.', - 'newproj.platform.responsive.label': 'Web responsive', - 'newproj.platform.responsive.hint': - 'Une expĂ©rience web adaptĂ©e aux navigateurs ordinateur, tablette et mobile', - 'newproj.platform.webDesktop.label': 'Web desktop', - 'newproj.platform.webDesktop.hint': 'Produit ou landing page pensĂ©e d’abord pour le navigateur', - 'newproj.platform.mobileIos.label': 'App iOS', - 'newproj.platform.mobileIos.hint': 'Cadres iPhone et rĂšgles d’interaction iOS', - 'newproj.platform.mobileAndroid.label': 'App Android', - 'newproj.platform.mobileAndroid.hint': 'Cadres Pixel et rĂšgles d’interaction Material', - 'newproj.platform.tablet.label': 'App tablette', - 'newproj.platform.tablet.hint': 'ExpĂ©rience tablette native avec vues fractionnĂ©es', - 'newproj.platform.desktopApp.label': 'App desktop', - 'newproj.platform.desktopApp.hint': 'Habillage d’application macOS/Windows', - 'newproj.surfaceOptionsLabel': 'Surfaces complĂ©mentaires', - 'newproj.includeLandingPage': 'Inclure une landing page', - 'newproj.includeLandingPageHint': - 'Ajoutez une page marketing responsive pour publicitĂ©s, listes d’attente, lancements, tĂ©lĂ©chargements d’app ou explication produit.', - 'newproj.includeOsWidgets': 'Inclure des widgets OS', - 'newproj.includeOsWidgetsHint': - 'Ajoutez des widgets natifs de plateforme pour Ă©cran d’accueil, Ă©cran verrouillĂ© ou accĂšs rapide sur mobile/tablette.', - 'newproj.includeOsWidgetsDisabledHint': - 'Disponible quand iOS, Android ou app tablette est sĂ©lectionnĂ© comme plateforme cible.', - 'newproj.createLiveArtifact': 'CrĂ©er un artefact dynamique', - 'designs.badgeLive': 'Dynamique', - 'designs.liveArtifactBadgesAria': 'Badges d’artefact dynamique', - 'designs.liveCount': '{n} dynamiques', - 'designs.statusLive': 'Artefact dynamique', - 'designs.statusArchived': 'ArchivĂ©', - 'designs.statusError': 'Erreur', - 'designs.statusRefreshing': 'Actualisation
', - 'designs.statusRefreshFailed': 'Échec de l’actualisation', - 'designs.statusRefreshed': 'ActualisĂ©', - 'project.customInstructions': 'Instructions du projet', - 'project.customInstructionsPlaceholder': 'Instructions pour ce projet (injectĂ©es dans chaque message)
', - 'designFiles.sectionLiveArtifacts': 'Artefacts dynamiques', - 'designFiles.kindLiveArtifact': 'Artefact dynamique', - 'liveArtifact.refresh.button': 'Actualiser', - 'liveArtifact.refresh.buttonTitle': 'Actualiser cet artefact dynamique', - 'liveArtifact.refresh.loadingTitle': 'Chargement de l’artefact dynamique
', - 'liveArtifact.refresh.noSourceTitle': 'Aucune source d’actualisation n’est encore disponible.', - 'liveArtifact.refresh.running': 'Actualisation
', - 'liveArtifact.refresh.runningMessage': 'Actualisation des donnĂ©es et de l’aperçu. Cela peut prendre un moment.', - 'liveArtifact.refresh.runningAction': 'L’aperçu prĂ©cĂ©dent reste visible jusqu’à la rĂ©ussite de l’actualisation.', - 'liveArtifact.refresh.successOne': 'Actualisation terminĂ©e. DonnĂ©es mises Ă  jour.', - 'liveArtifact.refresh.successMany': 'Actualisation terminĂ©e. DonnĂ©es mises Ă  jour.', - 'liveArtifact.refresh.successAction': 'L’aperçu a Ă©tĂ© rechargĂ© avec les derniĂšres donnĂ©es validĂ©es.', - 'liveArtifact.refresh.previousFailure': 'Échec de l’actualisation prĂ©cĂ©dente : {message}', - 'liveArtifact.refresh.failureAction': - 'Consultez l’historique d’actualisation, corrigez la source ou le problĂšme d’autorisation, puis rĂ©essayez.', - 'liveArtifact.refresh.networkFailure': 'La requĂȘte d’actualisation a Ă©chouĂ©. VĂ©rifiez votre connexion puis rĂ©essayez.', - 'liveArtifact.refresh.genericFailure': 'Échec de l’actualisation.', - 'liveArtifact.refresh.statusNever': 'Non actualisable', - 'liveArtifact.refresh.statusReady': 'PrĂȘt Ă  actualiser', - 'liveArtifact.refresh.statusSucceeded': 'À jour', - 'liveArtifact.refresh.statusFailed': 'Échec de l’actualisation', - 'liveArtifact.refresh.statusRunning': 'Actualisation en cours', - 'liveArtifact.refresh.statusRunningDescription': 'Une actualisation est actuellement en cours.', - 'liveArtifact.refresh.statusSucceededDescription': 'La derniĂšre actualisation s’est terminĂ©e avec succĂšs.', - 'liveArtifact.refresh.statusFailedDescription': 'La derniĂšre tentative d’actualisation ne s’est pas terminĂ©e correctement.', - 'liveArtifact.refresh.statusReadyDescription': - 'Des sources actualisables sont configurĂ©es, mais aucune exĂ©cution n’est en cours.', - 'liveArtifact.refresh.statusNeverDescription': 'Cet artefact dynamique n’a pas encore de source d’actualisation.', - 'liveArtifact.refresh.eventStarted': 'DĂ©marrĂ©e', - 'liveArtifact.refresh.eventSucceeded': 'RĂ©ussie', - 'liveArtifact.refresh.eventFailed': 'ÉchouĂ©e', - 'liveArtifact.refresh.eventStartedDetail': 'Actualisation dĂ©marrĂ©e
', - 'liveArtifact.refresh.sourcesUpdatedOne': '{n} source mise Ă  jour', - 'liveArtifact.refresh.sourcesUpdatedMany': '{n} sources mises Ă  jour', - 'liveArtifact.refresh.timelineEmpty': - 'Aucune activitĂ© d’actualisation dans cette session. Lancez Actualiser pour enregistrer une chronologie, ou attendez les exĂ©cutions automatiques.', - 'liveArtifact.refresh.heroLastRefreshedLabel': 'DerniĂšre actualisation', - 'liveArtifact.refresh.heroLastRefreshedNever': 'Jamais', - 'liveArtifact.refresh.justNow': 'Ă  l’instant', - 'liveArtifact.refresh.factCreated': 'Créé', - 'liveArtifact.refresh.factLastUpdated': 'DerniĂšre mise Ă  jour', - 'liveArtifact.refresh.factUnknown': 'Inconnu', - 'liveArtifact.refresh.persistedTitle': 'Historique d’actualisation conservĂ©', - 'liveArtifact.refresh.persistedHint': 'EntrĂ©es chargĂ©es depuis refreshes.jsonl', - 'liveArtifact.refresh.persistedEmpty': 'Aucun historique d’actualisation conservĂ© pour l’instant.', - 'liveArtifact.refresh.persistedStatusSucceeded': 'rĂ©ussi', - 'liveArtifact.refresh.persistedStatusRunning': 'en cours', - 'liveArtifact.refresh.persistedStatusFailed': 'Ă©chouĂ©', - 'liveArtifact.refresh.persistedStatusCancelled': 'annulĂ©', - 'liveArtifact.refresh.persistedStatusSkipped': 'ignorĂ©', - 'liveArtifact.refresh.sessionTitle': 'ActivitĂ© de la session', - 'liveArtifact.refresh.sessionHint': 'ÉvĂ©nements observĂ©s pendant que cet onglet est ouvert', - 'liveArtifact.refresh.docSourceTitle': 'Source du document', - 'liveArtifact.refresh.docSourceHint': 'Source configurĂ©e', - 'liveArtifact.refresh.docSourceType': 'Type', - 'liveArtifact.refresh.docSourceTool': 'Outil', - 'liveArtifact.refresh.docSourceConnector': 'Connecteur', - 'liveArtifact.refresh.debugSummary': 'MĂ©tadonnĂ©es de dĂ©bogage avancĂ©es', - 'liveArtifact.refresh.debugNote': - 'Peut inclure des IDs de connecteur, des noms de fichiers, des mĂ©tadonnĂ©es de source et des chemins internes d’artefact.', - 'critiqueTheater.userFacingName': 'Jury de design', - 'critiqueTheater.roleDesigner': 'Designer', - 'critiqueTheater.roleCritic': 'Critique', - 'critiqueTheater.roleBrand': 'Marque', - 'critiqueTheater.roleA11y': 'AccessibilitĂ©', - 'critiqueTheater.roleCopy': 'RĂ©daction', - 'critiqueTheater.roundLabel': 'Tour {n} sur {m}', - 'critiqueTheater.mustFix': '{n} Ă  corriger', - 'critiqueTheater.composite': 'Score composite', - 'critiqueTheater.threshold': 'Seuil', - 'critiqueTheater.consensus': 'Consensus', - 'critiqueTheater.interrupt': 'Interrompre', - 'critiqueTheater.interrupting': 'Interruption
', - 'critiqueTheater.interrupted': 'Interrompu', - 'critiqueTheater.degradedHeading': 'Panel hors ligne pour cette exĂ©cution', - 'critiqueTheater.degradedReasonMalformed': 'Sortie de panel mal formĂ©e (bloc rejetĂ© par le parseur).', - 'critiqueTheater.degradedReasonOversize': 'La sortie du panel a dĂ©passĂ© le budget d’octets sĂ©curisĂ©.', - 'critiqueTheater.degradedReasonAdapter': 'L’adaptateur {adapter} ne prend pas en charge le protocole Critique.', - 'critiqueTheater.degradedReasonProtocol': 'L’adaptateur {adapter} a envoyĂ© une version de protocole non prise en charge.', - 'critiqueTheater.degradedReasonMissingArtifact': 'L’exĂ©cution s’est terminĂ©e sans artefact final.', - 'critiqueTheater.replay': 'Rejouer', - 'critiqueTheater.replaySpeed': 'Vitesse de relecture', - 'critiqueTheater.readOnly': 'Lecture seule', - 'critiqueTheater.shippedSummary': 'ExpĂ©diĂ© au tour {round} · score composite {composite}', - 'critiqueTheater.interruptedSummary': 'Interrompu au tour {round} · meilleur score composite {composite}', - 'critiqueTheater.shippedBadge': 'ExpĂ©diĂ©', - 'critiqueTheater.belowThresholdBadge': 'Sous le seuil', - 'critiqueTheater.timedOutBadge': 'DĂ©lai dĂ©passĂ©', - 'critiqueTheater.failedHeading': 'Échec de l’exĂ©cution', - 'critiqueTheater.failedReasonCliExit': 'La CLI de l’agent s’est arrĂȘtĂ©e avec un code non nul avant la fin du panel.', - 'critiqueTheater.failedReasonPerRoundTimeout': 'Un tour a dĂ©passĂ© son budget de temps.', - 'critiqueTheater.failedReasonTotalTimeout': 'L’exĂ©cution complĂšte a dĂ©passĂ© son budget de temps.', - 'critiqueTheater.failedReasonOrchestrator': 'Erreur interne de l’orchestrateur.', - 'critiqueTheater.transcriptEmpty': 'Aucune transcription Ă  rejouer pour l’instant. Lancez une critique pour en enregistrer une.', - 'critiqueTheater.transcriptLoading': 'Chargement de la transcription
', - 'critiqueTheater.transcriptError': 'Impossible de charger la transcription : {error}', - 'critiqueTheater.replaySpeedPaused': 'En pause', - 'critiqueTheater.replaySpeedInstant': 'InstantanĂ©', - 'critiqueTheater.replaySpeedLive': 'Temps rĂ©el', - 'critiqueTheater.replaySpeedFast': 'Rapide', - 'critiqueTheater.settingsNav': 'Jury de design', - 'critiqueTheater.settingsNavHint': 'Revue de design Ă  cinq panels pour vos exĂ©cutions', - 'critiqueTheater.settingsEnabledLabel': 'Afficher le Jury de design pendant les exĂ©cutions de l’agent', - 'critiqueTheater.settingsEnabledDescription': - 'Lorsque cette option est activĂ©e, une revue Ă  cinq panels apparaĂźt Ă  cĂŽtĂ© des gĂ©nĂ©rations de l’agent et note le rĂ©sultat avant l’expĂ©dition. Vous pouvez l’interrompre Ă  tout moment.', - 'critiqueTheater.settingsEnabledProjectHint': - 'EnregistrĂ© pour ce projet. Les nouvelles exĂ©cutions de ce projet passeront cĂŽtĂ© serveur par le Jury de design.', - 'critiqueTheater.settingsEnabledNoProjectHint': - 'Ouvrez un projet pour enregistrer ce rĂ©glage cĂŽtĂ© serveur. D’ici lĂ , seule la prĂ©fĂ©rence dans ce navigateur change.', - 'settings.customInstructionsTitle': 'Instructions personnalisĂ©es', - 'settings.customInstructionsHint': - 'Instructions persistantes appliquĂ©es Ă  chaque projet. Utilisez-les pour dĂ©finir les prĂ©fĂ©rences que le modĂšle doit toujours suivre.', - 'settings.customInstructionsPlaceholder': - 'ex. "Utilise toujours TypeScript. PrĂ©fĂšre les composants fonctionnels. RĂ©ponds de façon concise."', - - // Diagnostics export 'diagnostics.exportTitle': 'Exporter le diagnostic', 'diagnostics.exportButton': 'Exporter le diagnostic', 'diagnostics.exportHint': 'Compresse les journaux rĂ©cents et les informations machine dans un zip Ă  partager avec l\'Ă©quipe.', diff --git a/apps/web/tests/components/ProjectDesignSystemPicker.test.tsx b/apps/web/tests/components/ProjectDesignSystemPicker.test.tsx index 9bc123fdd..1ab7d94b9 100644 --- a/apps/web/tests/components/ProjectDesignSystemPicker.test.tsx +++ b/apps/web/tests/components/ProjectDesignSystemPicker.test.tsx @@ -98,8 +98,8 @@ describe('ProjectDesignSystemPicker', () => { fireEvent.click(screen.getByTestId('project-ds-picker-trigger')); - expect(screen.getByPlaceholderText('Rechercher des design systems')).toBeTruthy(); + expect(screen.getByPlaceholderText('Rechercher des systĂšmes de design')).toBeTruthy(); expect(await screen.findByText('Produit')).toBeTruthy(); - expect(screen.getByText('Aucun design system')).toBeTruthy(); + expect(screen.getByText('Aucun systĂšme de design')).toBeTruthy(); }); });