feat(i18n): Integrate next-intl, localize core UI, add regional locales and zh-TW Discover sources
**Overview** - Integrates next-intl (App Router, no i18n routing) with cookie-based locale and Accept-Language fallback. - Adds message bundles and regional variants; sets en-US as the default. **Key changes** - i18n foundation - Adds request-scoped config to load messages per locale and injects NextIntlClientProvider in [layout.tsx] - Adds/updates messages for: en-US, en-GB, zh-TW, zh-HK, zh-CN, ja, ko, fr-FR, fr-CA, de. Centralizes LOCALES, LOCALE_LABELS, and DEFAULT_LOCALE in [locales.ts] - Adds LocaleSwitcher (cookie-based) and [LocaleBootstrap] - Pages and components - Localizes Sidebar, Home (including metadata/manifest), Settings, Discover, Library. - Localizes common components: MessageInput, Attach, Focus, Optimization, MessageBox, MessageSources, SearchImages, SearchVideos, EmptyChat, NewsArticleWidget, WeatherWidget. - APIs - Weather API returns localized condition strings server-side. - UX and quality - Converts all remaining <img> to Next Image. - Updates browserslist/caniuse DB to silence warnings. - Security: Settings API Key inputs are now password fields and placeholders were removed.
This commit is contained in:
parent
0dc17286b9
commit
9a772d6abe
56 changed files with 3673 additions and 365 deletions
251
messages/fr-FR.json
Normal file
251
messages/fr-FR.json
Normal file
|
|
@ -0,0 +1,251 @@
|
|||
{
|
||||
"metadata": {
|
||||
"title": "Perplexica - Discuter avec Internet",
|
||||
"description": "Perplexica est un chatbot IA connecté à Internet."
|
||||
},
|
||||
"manifest": {
|
||||
"name": "Perplexica - Discuter avec Internet",
|
||||
"shortName": "Perplexica",
|
||||
"description": "Perplexica est un chatbot IA connecté à Internet."
|
||||
},
|
||||
"navigation": {
|
||||
"home": "Accueil",
|
||||
"discover": "Découvrir",
|
||||
"library": "Bibliothèque",
|
||||
"settings": "Paramètres"
|
||||
},
|
||||
"common": {
|
||||
"appName": "Perplexica",
|
||||
"exportedOn": "Exporté le :",
|
||||
"citations": "Citations :",
|
||||
"user": "Utilisateur",
|
||||
"assistant": "Assistant",
|
||||
"errors": {
|
||||
"noChatModelsAvailable": "Aucun modèle de chat disponible",
|
||||
"chatProviderNotConfigured": "Aucun fournisseur de modèle de chat n'est configuré. Merci de le configurer depuis la page des paramètres ou le fichier de configuration.",
|
||||
"noEmbeddingModelsAvailable": "Aucun modèle d'embedding disponible",
|
||||
"cannotSendBeforeConfigReady": "Impossible d'envoyer un message avant la fin de la configuration",
|
||||
"failedToDeleteChat": "Échec de la suppression du chat"
|
||||
}
|
||||
},
|
||||
"navbar": {
|
||||
"exportAsMarkdown": "Exporter en Markdown",
|
||||
"exportAsPDF": "Exporter en PDF"
|
||||
},
|
||||
"export": {
|
||||
"chatExportTitle": "Export de conversation : {title}"
|
||||
},
|
||||
"weather": {
|
||||
"conditions": {
|
||||
"clear": "Dégagé",
|
||||
"mainlyClear": "Plutôt dégagé",
|
||||
"partlyCloudy": "Partiellement nuageux",
|
||||
"cloudy": "Nuageux",
|
||||
"fog": "Brouillard",
|
||||
"lightDrizzle": "Bruine faible",
|
||||
"moderateDrizzle": "Bruine modérée",
|
||||
"denseDrizzle": "Bruine forte",
|
||||
"lightFreezingDrizzle": "Bruine verglaçante faible",
|
||||
"denseFreezingDrizzle": "Bruine verglaçante forte",
|
||||
"slightRain": "Pluie faible",
|
||||
"moderateRain": "Pluie modérée",
|
||||
"heavyRain": "Pluie forte",
|
||||
"lightFreezingRain": "Pluie verglaçante faible",
|
||||
"heavyFreezingRain": "Pluie verglaçante forte",
|
||||
"slightSnowFall": "Neige faible",
|
||||
"moderateSnowFall": "Neige modérée",
|
||||
"heavySnowFall": "Fortes chutes de neige",
|
||||
"snow": "Chute de neige",
|
||||
"slightRainShowers": "Averses faibles",
|
||||
"moderateRainShowers": "Averses",
|
||||
"heavyRainShowers": "Fortes averses",
|
||||
"slightSnowShowers": "Averses de neige faibles",
|
||||
"moderateSnowShowers": "Averses de neige",
|
||||
"heavySnowShowers": "Fortes averses de neige",
|
||||
"thunderstorm": "Orage",
|
||||
"thunderstormSlightHail": "Orage avec petites grêles",
|
||||
"thunderstormHeavyHail": "Orage avec fortes grêles"
|
||||
}
|
||||
},
|
||||
"pages": {
|
||||
"home": {
|
||||
"title": "Chat - Perplexica",
|
||||
"description": "Discutez avec Internet, discutez avec Perplexica."
|
||||
},
|
||||
"discover": {
|
||||
"title": "Découvrir",
|
||||
"topics": {
|
||||
"tech": "Tech et science",
|
||||
"finance": "Finance",
|
||||
"art": "Art et culture",
|
||||
"sports": "Sports",
|
||||
"entertainment": "Divertissement"
|
||||
},
|
||||
"errorFetchingData": "Erreur lors de la récupération des données"
|
||||
},
|
||||
"library": {
|
||||
"title": "Bibliothèque",
|
||||
"empty": "Aucune conversation trouvée.",
|
||||
"ago": "Il y a {time}"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Paramètres",
|
||||
"sections": {
|
||||
"preferences": "Préférences",
|
||||
"automaticSearch": "Recherche automatique",
|
||||
"systemInstructions": "Instructions système",
|
||||
"modelSettings": "Paramètres du modèle",
|
||||
"apiKeys": "Clés API"
|
||||
},
|
||||
"preferences": {
|
||||
"theme": "Thème",
|
||||
"measurementUnits": "Unités de mesure",
|
||||
"language": "Langue",
|
||||
"metric": "Métrique",
|
||||
"imperial": "Impérial"
|
||||
},
|
||||
"automaticSearch": {
|
||||
"image": {
|
||||
"title": "Recherche d'images automatique",
|
||||
"desc": "Rechercher automatiquement des images pertinentes dans les réponses du chat"
|
||||
},
|
||||
"video": {
|
||||
"title": "Recherche de vidéos automatique",
|
||||
"desc": "Rechercher automatiquement des vidéos pertinentes dans les réponses du chat"
|
||||
}
|
||||
},
|
||||
"model": {
|
||||
"chatProvider": "Fournisseur du modèle de chat",
|
||||
"chat": "Modèle de chat",
|
||||
"noModels": "Aucun modèle disponible",
|
||||
"invalidProvider": "Fournisseur invalide, veuillez vérifier les logs backend",
|
||||
"custom": {
|
||||
"modelName": "Nom du modèle",
|
||||
"apiKey": "Clé API OpenAI personnalisée",
|
||||
"baseUrl": "URL de base OpenAI personnalisée"
|
||||
}
|
||||
},
|
||||
"embedding": {
|
||||
"provider": "Fournisseur du modèle d'embedding",
|
||||
"model": "Modèle d'embedding"
|
||||
},
|
||||
"api": {
|
||||
"openaiApiKey": "Clé API OpenAI",
|
||||
"ollamaApiUrl": "URL de l'API Ollama",
|
||||
"groqApiKey": "Clé API GROQ",
|
||||
"anthropicApiKey": "Clé API Anthropic",
|
||||
"geminiApiKey": "Clé API Gemini",
|
||||
"deepseekApiKey": "Clé API Deepseek",
|
||||
"aimlApiKey": "Clé API AI/ML",
|
||||
"lmStudioApiUrl": "URL de l'API LM Studio"
|
||||
},
|
||||
"systemInstructions": {
|
||||
"placeholder": "Toute instruction spécifique pour le LLM"
|
||||
}
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"common": {
|
||||
"viewMore": "Voir {count} de plus"
|
||||
},
|
||||
"messageInput": {
|
||||
"placeholder": "Poser une question de suivi"
|
||||
},
|
||||
"messageBox": {
|
||||
"sources": "Sources",
|
||||
"answer": "Réponse",
|
||||
"related": "Connexe"
|
||||
},
|
||||
"copilot": {
|
||||
"label": "Copilot"
|
||||
},
|
||||
"attach": {
|
||||
"attachedFiles": "Fichiers joints",
|
||||
"add": "Ajouter",
|
||||
"clear": "Effacer",
|
||||
"attach": "Joindre",
|
||||
"uploading": "Téléversement...",
|
||||
"files": "{count} fichiers"
|
||||
},
|
||||
"focus": {
|
||||
"button": "Focus",
|
||||
"modes": {
|
||||
"webSearch": {
|
||||
"title": "Tous",
|
||||
"description": "Recherche sur tout Internet"
|
||||
},
|
||||
"academicSearch": {
|
||||
"title": "Académique",
|
||||
"description": "Recherche dans des articles académiques publiés"
|
||||
},
|
||||
"writingAssistant": {
|
||||
"title": "Rédaction",
|
||||
"description": "Discuter sans rechercher sur le web"
|
||||
},
|
||||
"wolframAlphaSearch": {
|
||||
"title": "Wolfram Alpha",
|
||||
"description": "Moteur de connaissance computationnelle"
|
||||
},
|
||||
"youtubeSearch": {
|
||||
"title": "YouTube",
|
||||
"description": "Rechercher et regarder des vidéos"
|
||||
},
|
||||
"redditSearch": {
|
||||
"title": "Reddit",
|
||||
"description": "Rechercher des discussions et des opinions"
|
||||
}
|
||||
}
|
||||
},
|
||||
"optimization": {
|
||||
"modes": {
|
||||
"speed": {
|
||||
"title": "Vitesse",
|
||||
"description": "Prioriser la vitesse pour obtenir la réponse la plus rapide"
|
||||
},
|
||||
"balanced": {
|
||||
"title": "Équilibré",
|
||||
"description": "Trouver un équilibre entre vitesse et précision"
|
||||
},
|
||||
"quality": {
|
||||
"title": "Qualité (bientôt)",
|
||||
"description": "Obtenir la réponse la plus complète et la plus précise"
|
||||
}
|
||||
}
|
||||
},
|
||||
"messageActions": {
|
||||
"rewrite": "Réécrire"
|
||||
},
|
||||
"searchImages": {
|
||||
"searchButton": "Rechercher des images"
|
||||
},
|
||||
"searchVideos": {
|
||||
"searchButton": "Rechercher des vidéos",
|
||||
"badge": "Vidéo"
|
||||
},
|
||||
"weather": {
|
||||
"humidity": "Humidité",
|
||||
"now": "Maintenant"
|
||||
},
|
||||
"newsArticleWidget": {
|
||||
"error": "Impossible de charger les actualités."
|
||||
},
|
||||
"emptyChat": {
|
||||
"title": "La recherche commence ici."
|
||||
},
|
||||
"emptyChatMessageInput": {
|
||||
"placeholder": "Demandez-moi n'importe quoi..."
|
||||
},
|
||||
"deleteChat": {
|
||||
"title": "Confirmation de suppression",
|
||||
"description": "Êtes-vous sûr de vouloir supprimer cette conversation ?",
|
||||
"cancel": "Annuler",
|
||||
"delete": "Supprimer"
|
||||
},
|
||||
"themeSwitcher": {
|
||||
"options": {
|
||||
"light": "Clair",
|
||||
"dark": "Sombre"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue