// French (fr) — same keys as en.js; missing keys fall back to English. export default { // brand / common "brand.sub": "Gateway", "common.loading": "Chargement…", "common.save": "Enregistrer", "common.saving": "Enregistrement…", "common.cancel": "Annuler", "common.add": "Ajouter", "common.edit": "Modifier", "common.delete": "Supprimer", "common.close": "Fermer", "common.test": "Tester", "common.copy": "Copier", "common.copied": "Copié", "common.confirm": "Confirmer", "common.none": "aucun", "common.saved": "Enregistré", "common.error": "Erreur", "common.ok": "OK", "common.refresh": "Actualiser", "common.actions": "Actions", "common.optional": "optionnel", "common.search": "Rechercher", "common.all": "tous", // nav "nav.dashboard": "Tableau de bord", "nav.models": "Modèles", "nav.routing": "Routage", "nav.protocols": "Protocoles", "nav.keys": "Clés API", "nav.playground": "Playground", "nav.settings": "Paramètres", "nav.foot": "Gateway · v{v}", // topbar / status "status.router": "Routeur", "status.gateway": "Gateway", "status.online": "en ligne", "status.offline": "hors ligne", "status.checking": "vérification…", "theme.toggle": "Thème", "logout": "Déconnexion", // login "login.title": "allaigate Gateway", "login.subtitle": "Saisissez le jeton administrateur pour gérer cette passerelle.", "login.token": "Jeton admin", "login.tokenPlaceholder": "coller le jeton admin", "login.submit": "Ouvrir la console", "login.hint": "Le jeton est affiché dans le log de la passerelle au démarrage, ou défini via [admin].token_env.", "login.failed": "Jeton admin invalide.", // dashboard "dash.title": "Tableau de bord", "dash.subtitle": "Trafic en direct, coûts et analyses de routage pour votre pool de modèles.", "dash.range": "Période", "dash.range.1h": "1h", "dash.range.24h": "24h", "dash.range.7d": "7j", "dash.kpi.requests": "Requêtes", "dash.kpi.tokens": "Tokens", "dash.kpi.cost": "Coût", "dash.kpi.latency": "Latence moy.", "dash.kpi.success": "Taux de succès", "dash.kpi.failovers": "Basculements", "dash.series.title": "Requêtes dans le temps", "dash.series.cost": "Coûts dans le temps", "dash.series.empty": "Aucun trafic sur cette période.", "dash.breakdown.title": "Répartition", "dash.groupby.model": "par modèle", "dash.groupby.tier": "par niveau", "dash.groupby.label": "par tâche", "dash.groupby.account": "par compte", "dash.recent.title": "Requêtes récentes", "dash.recent.empty": "Aucune requête enregistrée. Essayez le Playground.", "dash.col.time": "Heure", "dash.col.model": "Modèle", "dash.col.tier": "Niveau", "dash.col.task": "Tâche", "dash.col.tokens": "Tokens", "dash.col.cost": "Coût", "dash.col.latency": "Latence", "dash.col.outcome": "Résultat", "dash.col.requests": "Requêtes", "dash.col.errors": "Erreurs", "dash.health.title": "Santé", "dash.health.reachable": "accessible", "dash.health.unreachable": "inaccessible", // models "models.title": "Modèles", "models.subtitle": "Votre pool de modèles — combinez modèles locaux économiques et API cloud.", "models.add": "Ajouter un modèle", "models.empty": "Aucun modèle. Ajoutez votre premier modèle pour commencer.", "models.col.id": "ID", "models.col.provider": "Fournisseur", "models.col.model": "Modèle", "models.col.tier": "Niveau de coût", "models.col.key": "Clé", "models.col.caps": "Capacités", "models.col.price": "Prix (entrée/sortie)", "models.probe": "Sonder", "models.probe.ok": "Accessible ({ms} ms)", "models.probe.fail": "Échec : {err}", "models.form.addTitle": "Ajouter un modèle", "models.form.editTitle": "Modifier le modèle", "models.form.id": "ID", "models.form.idHint": "Identifiant unique utilisé dans le routage, ex. local-qwen", "models.form.provider": "Fournisseur", "models.form.baseUrl": "URL de base", "models.form.model": "Nom du modèle", "models.form.kind": "Type", "models.form.costTier": "Niveau de coût", "models.form.priceIn": "Prix entrée ($/1M)", "models.form.priceOut": "Prix sortie ($/1M)", "models.form.apiKeyEnv": "Nom de la var. d'env. pour la clé", "models.form.apiKeyEnvHint": "Nom de la variable d'env. ou du secret contenant la clé de ce fournisseur.", "models.form.caps": "Capacités", "models.form.secret": "Valeur secrète", "models.form.secretStored": "stocké", "models.form.secretEnv": "depuis l'env.", "models.form.secretMissing": "non défini", "models.form.secretPlaceholder": "définir ou remplacer la clé (écriture seule)", "models.deleteConfirm": "Supprimer le modèle \"{id}\" ?", // routing "routing.title": "Routage", "routing.subtitle": "Associez les niveaux de complexité à une liste ordonnée de modèles (priorité = repli).", "routing.default": "Modèle par défaut", "routing.defaultHint": "Utilisé lorsque le routeur est inaccessible.", "routing.tiers": "Niveaux", "routing.tierHint": "Glissez les puces pour réordonner ; le premier est préféré, les autres sont des replis.", "routing.addModel": "+ ajouter", "routing.addTier": "Ajouter un niveau", "routing.tierName": "Nom du niveau", "routing.policy": "Politique", "routing.policy.mode": "Mode", "routing.policy.fixed": "Table fixe", "routing.policy.costAware": "Sensible au coût", "routing.policy.maxCost": "Coût max par requête ($)", "routing.policy.minClass": "Classe minimale par niveau", "routing.empty": "Aucun modèle disponible — ajoutez des modèles d'abord.", // protocols "protocols.title": "Protocoles", "protocols.subtitle": "Activez uniquement les surfaces API entrantes nécessaires. Les bascules s'appliquent en direct.", "protocols.implemented": "implémenté", "protocols.planned": "planifié", "protocols.openai_chat": "OpenAI Chat Completions", "protocols.openai_chat.d": "POST /v1/chat/completions — compatible avec OpenAI SDK, LangChain, crewAI.", "protocols.openai_completions": "OpenAI Completions (héritage)", "protocols.openai_completions.d": "POST /v1/completions — intégrations héritées.", "protocols.openai_embeddings": "OpenAI Embeddings", "protocols.openai_embeddings.d": "POST /v1/embeddings — pipelines RAG.", "protocols.openai_models": "OpenAI Models", "protocols.openai_models.d": "GET /v1/models — découverte automatique des clients.", "protocols.anthropic_messages": "Anthropic Messages", "protocols.anthropic_messages.d": "POST /v1/messages — agents natifs Claude.", "protocols.mcp": "MCP (Model Context Protocol)", "protocols.mcp.d": "JSON-RPC / SSE — orchestrateurs natifs MCP.", "protocols.native_passthrough": "Passage natif", "protocols.native_passthrough.d": "POST /route — accès direct à la décision de routage.", // keys "keys.title": "Clés API", "keys.subtitle": "Clés de passerelle virtuelles pour vos agents. Les clés fournisseurs ne quittent jamais la passerelle.", "keys.add": "Nouvelle clé", "keys.empty": "Aucune clé configurée — la passerelle est en mode ouvert (sans auth).", "keys.openMode": "Mode ouvert : toute requête est acceptée (aucune clé requise).", "keys.col.key": "Clé", "keys.col.account": "Compte", "keys.col.rate": "Débit / min", "keys.col.models": "Modèles autorisés", "keys.form.title": "Nouvelle clé API", "keys.form.account": "Compte", "keys.form.rate": "Limite de débit / min", "keys.form.allow": "Modèles autorisés", "keys.form.allowHint": "Laisser vide pour autoriser tous les modèles.", "keys.form.custom": "Clé personnalisée (optionnel)", "keys.form.customHint": "Laisser vide pour générer automatiquement sk-gw-…", "keys.created": "Clé créée — copiez-la maintenant, elle ne sera plus affichée :", "keys.revoke": "Révoquer", "keys.revokeConfirm": "Révoquer cette clé ?", "keys.allowAll": "tous", // playground "pg.title": "Playground", "pg.subtitle": "Envoyez une invite via le pipeline en direct et inspectez la décision de routage.", "pg.system": "Invite système", "pg.systemPlaceholder": "message système optionnel", "pg.prompt": "Invite", "pg.promptPlaceholder": "Posez une question…", "pg.mode": "Mode", "pg.mode.auto": "Auto (routage)", "pg.mode.pinned": "Modèle épinglé", "pg.profile": "Profil", "pg.model": "Modèle", "pg.temp": "Température", "pg.maxTokens": "Tokens max", "pg.send": "Envoyer", "pg.stream": "Streaming", "pg.sending": "Envoi…", "pg.answer": "Réponse", "pg.empty": "La réponse et la décision de routage s'afficheront ici.", "pg.decision": "Décision de routage", "pg.task": "Tâche", "pg.tier": "Niveau", "pg.score": "Complexité", "pg.selected": "Modèle sélectionné", "pg.source": "Source du routage", "pg.cost": "Coût", "pg.latency": "Latence", "pg.tokens": "Tokens (entrée/sortie)", "pg.failover": "Basculement", "pg.error": "Requête échouée", // settings "settings.title": "Paramètres", "settings.subtitle": "Connexion passerelle, entrée de routage, fiabilité et observabilité.", "settings.router": "Connexion routeur", "settings.router.url": "URL du routeur", "settings.router.keyEnv": "Nom de l'env. pour la clé du routeur", "settings.router.timeout": "Délai d'expiration (ms)", "settings.router.verifyTls": "Vérifier le certificat TLS", "settings.router.taxonomy": "ID de taxonomie", "settings.route": "Entrée de routage", "settings.route.strategy": "Stratégie de texte", "settings.route.maxChars": "Caractères max", "settings.route.cacheTtl": "TTL du cache", "settings.route.profile": "Profil par défaut", "settings.breaker": "Disjoncteur", "settings.breaker.threshold": "Seuil d'erreur", "settings.breaker.cooldown": "Temporisation", "settings.log": "Journalisation", "settings.log.level": "Niveau de log", "settings.log.bodies": "Journaliser les corps de messages (confidentialité désactivée)", "settings.telemetry": "Télémétrie", "settings.telemetry.metrics": "Exposer Prometheus /metrics", "settings.cortiq": "Métadonnées de réponse", "settings.cortiq.echo": "Inclure le bloc de routage cortiq dans les réponses", "settings.stats": "Statistiques", "settings.stats.enabled": "Enregistrer les statistiques de requêtes", "settings.stats.file": "Fichier de stats (JSONL)", "settings.stats.retention": "Rétention", "settings.listen": "Adresse d'écoute", "settings.export": "Exporter la config", "settings.import": "Importer la config", "settings.needsRestart": "Enregistré. Certains changements (adresse d'écoute) nécessitent un redémarrage.", // toasts / misc "toast.saved": "Modifications enregistrées", "toast.deleted": "Supprimé", "toast.probing": "Sondage…", "toast.imported": "Config importée", "dash.cache": "Cache sémantique", "dash.cache.hitRate": "Taux de succès", "dash.cache.hits": "Succès", "dash.cache.saved": "Économisé", "dash.cache.disabled": "Le cache sémantique est désactivé — activez-le dans les Paramètres.", "settings.cache": "Cache sémantique", "settings.cache.enabled": "Activer le cache sémantique", "settings.cache.threshold": "Seuil de similarité", "settings.cache.ttl": "TTL d'entrée", "settings.cache.embed": "Modèle d'embeddings", "settings.cache.note": "Les paramètres du cache prennent effet après un redémarrage.", };