diff --git a/README.md b/README.md index 4e265872..21091713 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ One-Click to deploy well-designed ChatGPT web UI on Vercel. - 预制角色功能(面具),方便地创建、分享和调试你的个性化对话 - 海量的内置 prompt 列表,来自[中文](https://github.com/PlexPt/awesome-chatgpt-prompts-zh)和[英文](https://github.com/f/awesome-chatgpt-prompts) - 自动压缩上下文聊天记录,在节省 Token 的同时支持超长对话 -- 多国语言支持:English, 简体中文, 繁体中文, 日本語, Español, Italiano, Türkçe, Deutsch, Tiếng Việt, Русский, Čeština +- 多国语言支持:English, 简体中文, 繁体中文, 日本語, Français, Español, Italiano, Türkçe, Deutsch, Tiếng Việt, Русский, Čeština - 拥有自己的域名?好上加好,绑定后即可在任何地方**无障碍**快速访问 ## 开发计划 diff --git a/app/locales/cn.ts b/app/locales/cn.ts index fe32a907..032df3ab 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -73,6 +73,7 @@ const cn = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe", diff --git a/app/locales/cs.ts b/app/locales/cs.ts index 1bf7a169..c0d3d284 100644 --- a/app/locales/cs.ts +++ b/app/locales/cs.ts @@ -75,6 +75,7 @@ const cs: LocaleType = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe", diff --git a/app/locales/de.ts b/app/locales/de.ts index a67f8bed..fe19f0bc 100644 --- a/app/locales/de.ts +++ b/app/locales/de.ts @@ -76,6 +76,7 @@ const de: LocaleType = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe", diff --git a/app/locales/en.ts b/app/locales/en.ts index be8bddea..71d1d11b 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -75,6 +75,7 @@ const en: LocaleType = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe", diff --git a/app/locales/es.ts b/app/locales/es.ts index aef6e675..cdc37130 100644 --- a/app/locales/es.ts +++ b/app/locales/es.ts @@ -75,6 +75,7 @@ const es: LocaleType = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe", diff --git a/app/locales/fr.ts b/app/locales/fr.ts new file mode 100644 index 00000000..79795851 --- /dev/null +++ b/app/locales/fr.ts @@ -0,0 +1,251 @@ +import { SubmitKey } from "../store/config"; +import type { LocaleType } from "./index"; + +const fr: LocaleType = { + WIP: "Prochainement...", + Error: { + Unauthorized: + "Accès non autorisé, veuillez saisir le code d'accès dans la page des paramètres.", + }, + ChatItem: { + ChatItemCount: (count: number) => `${count} messages en total`, + }, + Chat: { + SubTitle: (count: number) => `${count} messages échangés avec ChatGPT`, + Actions: { + ChatList: "Aller à la liste de discussion", + CompressedHistory: "Mémoire d'historique compressée Prompt", + Export: "Exporter tous les messages en tant que Markdown", + Copy: "Copier", + Stop: "Arrêter", + Retry: "Réessayer", + Delete: "Supprimer", + }, + Rename: "Renommer la conversation", + Typing: "En train d'écrire…", + Input: (submitKey: string) => { + var inputHints = `Appuyez sur ${submitKey} pour envoyer`; + if (submitKey === String(SubmitKey.Enter)) { + inputHints += ", Shift + Enter pour insérer un saut de ligne"; + } + return inputHints + ", / pour rechercher des prompts"; + }, + Send: "Envoyer", + Config: { + Reset: "Restaurer les paramètres par défaut", + SaveAs: "Enregistrer en tant que masque", + }, + }, + Export: { + Title: "Tous les messages", + Copy: "Tout sélectionner", + Download: "Télécharger", + MessageFromYou: "Message de votre part", + MessageFromChatGPT: "Message de ChatGPT", + }, + Memory: { + Title: "Prompt mémoire", + EmptyContent: "Rien encore.", + Send: "Envoyer la mémoire", + Copy: "Copier la mémoire", + Reset: "Réinitialiser la session", + ResetConfirm: + "La réinitialisation supprimera l'historique de la conversation actuelle ainsi que la mémoire de l'historique. Êtes-vous sûr de vouloir procéder à la réinitialisation?", + }, + Home: { + NewChat: "Nouvelle discussion", + DeleteChat: "Confirmer la suppression de la conversation sélectionnée ?", + DeleteToast: "Conversation supprimée", + Revert: "Revenir en arrière", + }, + Settings: { + Title: "Paramètres", + SubTitle: "Toutes les configurations", + Actions: { + ClearAll: "Effacer toutes les données", + ResetAll: "Réinitialiser les configurations", + Close: "Fermer", + ConfirmResetAll: + "Êtes-vous sûr de vouloir réinitialiser toutes les configurations?", + ConfirmClearAll: "Êtes-vous sûr de vouloir supprimer toutes les données?", + }, + Lang: { + Name: "Language", // ATTENTION : si vous souhaitez ajouter une nouvelle traduction, ne traduisez pas cette valeur, laissez-la sous forme de `Language` + All: "Toutes les langues", + Options: { + cn: "简体中文", + en: "English", + tw: "繁體中文", + fr: "Français", + es: "Español", + it: "Italiano", + tr: "Türkçe", + jp: "日本語", + de: "Deutsch", + vi: "Vietnamese", + ru: "Русский", + cs: "Čeština", + }, + }, + + Avatar: "Avatar", + FontSize: { + Title: "Taille des polices", + SubTitle: "Ajuste la taille de police du contenu de la conversation", + }, + Update: { + Version: (x: string) => `Version : ${x}`, + IsLatest: "Dernière version", + CheckUpdate: "Vérifier la mise à jour", + IsChecking: "Vérification de la mise à jour...", + FoundUpdate: (x: string) => `Nouvelle version disponible : ${x}`, + GoToUpdate: "Mise à jour", + }, + SendKey: "Clé d'envoi", + Theme: "Thème", + TightBorder: "Bordure serrée", + SendPreviewBubble: { + Title: "Aperçu de l'envoi dans une bulle", + SubTitle: "Aperçu du Markdown dans une bulle", + }, + Mask: { + Title: "Écran de masque", + SubTitle: + "Afficher un écran de masque avant de démarrer une nouvelle discussion", + }, + Prompt: { + Disable: { + Title: "Désactiver la saisie semi-automatique", + SubTitle: "Appuyez sur / pour activer la saisie semi-automatique", + }, + List: "Liste de prompts", + ListCount: (builtin: number, custom: number) => + `${builtin} intégré, ${custom} personnalisé`, + Edit: "Modifier", + Modal: { + Title: "Liste de prompts", + Add: "Ajouter un élément", + Search: "Rechercher des prompts", + }, + EditModal: { + Title: "Modifier le prompt", + }, + }, + HistoryCount: { + Title: "Nombre de messages joints", + SubTitle: "Nombre de messages envoyés attachés par demande", + }, + CompressThreshold: { + Title: "Seuil de compression de l'historique", + SubTitle: + "Comprimera si la longueur des messages non compressés dépasse cette valeur", + }, + Token: { + Title: "Clé API", + SubTitle: "Utilisez votre clé pour ignorer la limite du code d'accès", + Placeholder: "Clé OpenAI API", + }, + Usage: { + Title: "Solde du compte", + SubTitle(used: any, total: any) { + return `Épuisé ce mois-ci $${used}, abonnement $${total}`; + }, + IsChecking: "Vérification...", + Check: "Vérifier", + NoAccess: "Entrez la clé API pour vérifier le solde", + }, + AccessCode: { + Title: "Code d'accès", + SubTitle: "Contrôle d'accès activé", + Placeholder: "Code d'accès requis", + }, + Model: "Modèle", + Temperature: { + Title: "Température", + SubTitle: "Une valeur plus élevée rendra les réponses plus aléatoires", + }, + MaxTokens: { + Title: "Max Tokens", + SubTitle: "Longueur maximale des tokens d'entrée et des tokens générés", + }, + PresencePenlty: { + Title: "Pénalité de présence", + SubTitle: + "Une valeur plus élevée augmentera la probabilité d'introduire de nouveaux sujets", + }, + }, + Store: { + DefaultTopic: "Nouvelle conversation", + BotHello: "Bonjour ! Comment puis-je vous aider aujourd'hui ?", + Error: "Quelque chose s'est mal passé, veuillez réessayer plus tard.", + Prompt: { + History: (content: string) => + "Ceci est un résumé de l'historique des discussions entre l'IA et l'utilisateur : " + + content, + Topic: + "Veuillez générer un titre de quatre à cinq mots résumant notre conversation sans introduction, ponctuation, guillemets, points, symboles ou texte supplémentaire. Supprimez les guillemets inclus.", + Summarize: + "Résumez brièvement nos discussions en 200 mots ou moins pour les utiliser comme prompt de contexte futur.", + }, + }, + Copy: { + Success: "Copié dans le presse-papiers", + Failed: + "La copie a échoué, veuillez accorder l'autorisation d'accès au presse-papiers", + }, + Context: { + Toast: (x: any) => `Avec ${x} contextes de prompts`, + Edit: "Contextes et mémoires de prompts", + Add: "Ajouter un prompt", + }, + Plugin: { + Name: "Extension", + }, + Mask: { + Name: "Masque", + Page: { + Title: "Modèle de prompt", + SubTitle: (count: number) => `${count} modèles de prompts`, + Search: "Rechercher des modèles", + Create: "Créer", + }, + Item: { + Info: (count: number) => `${count} prompts`, + Chat: "Discussion", + View: "Vue", + Edit: "Modifier", + Delete: "Supprimer", + DeleteConfirm: "Confirmer la suppression?", + }, + EditModal: { + Title: (readonly: boolean) => + `Modifier le modèle de prompt ${readonly ? "(en lecture seule)" : ""}`, + Download: "Télécharger", + Clone: "Dupliquer", + }, + Config: { + Avatar: "Avatar du bot", + Name: "Nom du bot", + }, + }, + NewChat: { + Return: "Retour", + Skip: "Passer", + Title: "Choisir un masque", + SubTitle: "Discutez avec l'âme derrière le masque", + More: "En savoir plus", + NotShow: "Ne pas afficher à nouveau", + ConfirmNoShow: + "Confirmez-vous vouloir désactiver cela? Vous pouvez le réactiver plus tard dans les paramètres.", + }, + + UI: { + Confirm: "Confirmer", + Cancel: "Annuler", + Close: "Fermer", + Create: "Créer", + Edit: "Éditer", + }, +}; + +export default fr; diff --git a/app/locales/index.ts b/app/locales/index.ts index e41dfcdf..ac90f770 100644 --- a/app/locales/index.ts +++ b/app/locales/index.ts @@ -1,6 +1,7 @@ import CN from "./cn"; import EN from "./en"; import TW from "./tw"; +import FR from "./fr"; import ES from "./es"; import IT from "./it"; import TR from "./tr"; @@ -16,6 +17,7 @@ export const AllLangs = [ "en", "cn", "tw", + "fr", "es", "it", "tr", @@ -80,6 +82,7 @@ export default { en: EN, cn: CN, tw: TW, + fr: FR, es: ES, it: IT, tr: TR, diff --git a/app/locales/it.ts b/app/locales/it.ts index 541030ec..f3791d91 100644 --- a/app/locales/it.ts +++ b/app/locales/it.ts @@ -75,6 +75,7 @@ const it: LocaleType = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe", diff --git a/app/locales/jp.ts b/app/locales/jp.ts index 39fc466e..300a4140 100644 --- a/app/locales/jp.ts +++ b/app/locales/jp.ts @@ -75,6 +75,7 @@ const jp: LocaleType = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe", diff --git a/app/locales/ru.ts b/app/locales/ru.ts index 1ee0ec5c..4bce2fbf 100644 --- a/app/locales/ru.ts +++ b/app/locales/ru.ts @@ -75,6 +75,7 @@ const ru: LocaleType = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe", diff --git a/app/locales/tr.ts b/app/locales/tr.ts index 9ba31ada..0c156265 100644 --- a/app/locales/tr.ts +++ b/app/locales/tr.ts @@ -75,6 +75,7 @@ const tr: LocaleType = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe", diff --git a/app/locales/tw.ts b/app/locales/tw.ts index 2c2ca55b..f42431f2 100644 --- a/app/locales/tw.ts +++ b/app/locales/tw.ts @@ -73,6 +73,7 @@ const tw: LocaleType = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe", diff --git a/app/locales/vi.ts b/app/locales/vi.ts index c0da3d94..2f528a72 100644 --- a/app/locales/vi.ts +++ b/app/locales/vi.ts @@ -75,6 +75,7 @@ const vi: LocaleType = { cn: "简体中文", en: "English", tw: "繁體中文", + fr: "Français", es: "Español", it: "Italiano", tr: "Türkçe",