Bläddra i källkod

Merge pull request #1435 from Gan-Xing/update

add french translation -增加法语翻译
Yifei Zhang 1 år sedan
förälder
incheckning
987412db51

+ 1 - 1
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
 - 拥有自己的域名?好上加好,绑定后即可在任何地方**无障碍**快速访问
 
 ## 开发计划

+ 1 - 0
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",

+ 1 - 0
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",

+ 1 - 0
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",

+ 1 - 0
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",

+ 1 - 0
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",

+ 251 - 0
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;

+ 3 - 0
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,

+ 1 - 0
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",

+ 1 - 0
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",

+ 1 - 0
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",

+ 1 - 0
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",

+ 1 - 0
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",

+ 1 - 0
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",