From 266f5784d79f45295cd5a24f808df70a48451a3d Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Thu, 25 Sep 2025 10:26:03 +0000
Subject: [PATCH 01/10] =?UTF-8?q?Ajout=20de=20la=20traduction=20fran=C3=A7?=
=?UTF-8?q?aise=20=C3=A0=20l'interface=20utilisateur.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Création du fichier de traduction `fr.json` en se basant sur `en.json`.
- Mise à jour de la configuration i18n pour inclure la langue française.
- Modification du sélecteur de langue pour afficher l'option "Français" avec le drapeau correspondant.
---
bun_output.log | 1 +
.../verification/verify_translation.py | 43 +
package-lock.json | 6 +
.../layout/headerbar/LanguageSelector.jsx | 9 +-
web/src/i18n/i18n.js | 4 +
web/src/i18n/locales/fr.json | 2130 +++++++++++++++++
6 files changed, 2192 insertions(+), 1 deletion(-)
create mode 100644 bun_output.log
create mode 100644 jules-scratch/verification/verify_translation.py
create mode 100644 package-lock.json
create mode 100644 web/src/i18n/locales/fr.json
diff --git a/bun_output.log b/bun_output.log
new file mode 100644
index 000000000..0170abedb
--- /dev/null
+++ b/bun_output.log
@@ -0,0 +1 @@
+$ vite
diff --git a/jules-scratch/verification/verify_translation.py b/jules-scratch/verification/verify_translation.py
new file mode 100644
index 000000000..4b4627311
--- /dev/null
+++ b/jules-scratch/verification/verify_translation.py
@@ -0,0 +1,43 @@
+from playwright.sync_api import sync_playwright, expect
+import time
+
+def run(playwright):
+ browser = playwright.chromium.launch(headless=True)
+ context = browser.new_context()
+ page = context.new_page()
+
+ # Go to the page and wait for it to be ready
+ page.goto("http://localhost:5173", wait_until="networkidle")
+ print("Page loaded")
+
+ # The aria-label is in Chinese in the source, so we use that.
+ language_button = page.get_by_role("button", name="切换语言")
+
+ # Wait for the button to be visible
+ expect(language_button).to_be_visible()
+ print("Language button found")
+ language_button.click()
+ print("Language button clicked")
+
+ # Click the "Français" option
+ french_option = page.get_by_role("menuitem", name="Français")
+ expect(french_option).to_be_visible()
+ print("French option found")
+ french_option.click()
+ print("French option clicked")
+
+ # Wait for the language switch to apply
+ time.sleep(2) # Wait for 2 seconds
+
+ # Now the aria-label should be in French
+ expect(page.get_by_role("button", name="Changer de langue")).to_be_visible(timeout=10000)
+ print("Language changed to French")
+
+ # Take a screenshot to see the page state
+ page.screenshot(path="jules-scratch/verification/verification.png")
+ print("Screenshot taken")
+
+ browser.close()
+
+with sync_playwright() as playwright:
+ run(playwright)
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 000000000..4ca926f5d
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6 @@
+{
+ "name": "app",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {}
+}
diff --git a/web/src/components/layout/headerbar/LanguageSelector.jsx b/web/src/components/layout/headerbar/LanguageSelector.jsx
index cbfd69b35..cc74176b0 100644
--- a/web/src/components/layout/headerbar/LanguageSelector.jsx
+++ b/web/src/components/layout/headerbar/LanguageSelector.jsx
@@ -20,7 +20,7 @@ For commercial licensing, please contact support@quantumnous.com
import React from 'react';
import { Button, Dropdown } from '@douyinfe/semi-ui';
import { Languages } from 'lucide-react';
-import { CN, GB } from 'country-flag-icons/react/3x2';
+import { CN, GB, FR } from 'country-flag-icons/react/3x2';
const LanguageSelector = ({ currentLang, onLanguageChange, t }) => {
return (
@@ -42,6 +42,13 @@ const LanguageSelector = ({ currentLang, onLanguageChange, t }) => {
您好,你正在进行%s邮箱验证。
": "Bonjour, vous êtes en train de vérifier votre adresse e-mail %s.
", + "您的验证码为: %s
": "Votre code de vérification est : %s
", + "验证码 %d 分钟内有效,如果不是本人操作,请忽略。
": "Le code de vérification est valide pendant %d minutes. Si vous n'êtes pas à l'origine de cette demande, veuillez l'ignorer.
", + "无效的参数": "Paramètre non valide", + "该邮箱地址未注册": "Cette adresse e-mail n'est pas enregistrée", + "%s密码重置": "Réinitialisation du mot de passe de %s", + "您好,你正在进行%s密码重置。
": "Bonjour, vous êtes en train de réinitialiser votre mot de passe %s.
", + "点击此处进行密码重置。
": "Cliquez ici pour réinitialiser votre mot de passe.
", + "重置链接 %d 分钟内有效,如果不是本人操作,请忽略。
": "Le lien de réinitialisation est valide pendant %d minutes. Si vous n'êtes pas à l'origine de cette demande, veuillez l'ignorer.
", + "重置链接非法或已过期": "Le lien de réinitialisation est non valide ou a expiré", + "无法启用 GitHub OAuth,请先填入 GitHub Client ID 以及 GitHub Client Secret!": "Impossible d'activer GitHub OAuth. Veuillez d'abord saisir l'ID client et le secret client GitHub !", + "无法启用微信登录,请先填入微信登录相关配置信息!": "Impossible d'activer la connexion WeChat. Veuillez d'abord saisir les informations de configuration de la connexion WeChat !", + "无法启用 Turnstile 校验,请先填入 Turnstile 校验相关配置信息!": "Impossible d'activer la vérification Turnstile. Veuillez d'abord saisir les informations de configuration de la vérification Turnstile !", + "兑换码名称长度必须在1-20之间": "Le nom du code d'échange doit comporter entre 1 et 20 caractères", + "兑换码个数必须大于0": "Le nombre de codes d'échange doit être supérieur à 0", + "一次兑换码批量生成的个数不能大于 100": "Impossible de générer plus de 100 codes d'échange à la fois", + "当前分组上游负载已饱和,请稍后再试": "La charge en amont du groupe actuel est saturée. Veuillez réessayer plus tard", + "令牌名称过长": "Le nom du jeton est trop long", + "令牌已过期,无法启用,请先修改令牌过期时间,或者设置为永不过期": "Le jeton a expiré et ne peut pas être activé. Veuillez modifier la date d'expiration du jeton ou le définir pour qu'il n'expire jamais", + "令牌可用额度已用尽,无法启用,请先修改令牌剩余额度,或者设置为无限额度": "Le quota du jeton est épuisé et ne peut pas être activé. Veuillez modifier le quota restant ou le définir sur illimité", + "管理员关闭了密码登录": "L'administrateur a désactivé la connexion par mot de passe", + "无法保存会话信息,请重试": "Impossible d'enregistrer les informations de session. Veuillez réessayer", + "管理员关闭了通过密码进行注册,请使用第三方账户验证的形式进行注册": "L'administrateur a désactivé l'inscription par mot de passe. Veuillez vous inscrire en utilisant la vérification de compte tiers", + "输入不合法 ": "Entrée non valide ", + "管理员开启了邮箱验证,请输入邮箱地址和验证码": "L'administrateur a activé la vérification par e-mail. Veuillez saisir votre adresse e-mail et votre code de vérification", + "验证码错误或已过期": "Le code de vérification est incorrect ou a expiré", + "无权获取同级或更高等级用户的信息": "Aucune autorisation d'accéder aux informations des utilisateurs de même niveau ou de niveau supérieur", + "请重试,系统生成的 UUID 竟然重复了!": "Veuillez réessayer, l'UUID généré par le système est dupliqué !", + "输入不合法": "Entrée non valide", + "无权更新同权限等级或更高权限等级的用户信息": "Aucune autorisation de mettre à jour les informations des utilisateurs de même niveau de permission ou supérieur", + "管理员将用户额度从 %s修改为 %s": "L'administrateur a modifié le quota de l'utilisateur de %s à %s", + "无权删除同权限等级或更高权限等级的用户": "Aucune autorisation de supprimer les utilisateurs de même niveau de permission ou supérieur", + "无法创建权限大于等于自己的用户": "Impossible de créer des utilisateurs avec des autorisations supérieures ou égales aux vôtres", + "用户不存在": "L'utilisateur n'existe pas", + "无法禁用超级管理员用户": "Impossible de désactiver l'utilisateur super administrateur", + "无法删除超级管理员用户": "Impossible de supprimer l'utilisateur super administrateur", + "普通管理员用户无法提升其他用户为管理员": "Un administrateur ordinaire ne peut pas promouvoir d'autres utilisateurs au rang d'administrateur", + "该用户已经是管理员": "Cet utilisateur est déjà administrateur", + "无法降级超级管理员用户": "Impossible de rétrograder l'utilisateur super administrateur", + "该用户已经是普通用户": "Cet utilisateur est déjà un utilisateur ordinaire", + "管理员未开启通过微信登录以及注册": "L'administrateur n'a pas activé la connexion et l'inscription via WeChat", + "该微信账号已被绑定": "Ce compte WeChat est déjà lié", + "无权进行此操作,未登录且未提供 access token": "Aucune autorisation pour cette opération : non connecté et aucun jeton d'accès fourni", + "无权进行此操作,access token 无效": "Aucune autorisation pour cette opération : jeton d'accès non valide", + "无权进行此操作,权限不足": "Aucune autorisation pour cette opération : autorisations insuffisantes", + "普通用户不支持指定渠道": "Les utilisateurs ordinaires ne peuvent pas spécifier de canaux", + "无效的渠道 ID": "ID de canal non valide", + "该渠道已被禁用": "Ce canal a été désactivé", + "无效的请求": "Requête non valide", + "无可用渠道": "Aucun canal disponible", + "Turnstile token 为空": "Le jeton Turnstile est vide", + "Turnstile 校验失败,请刷新重试!": "La vérification Turnstile a échoué. Veuillez actualiser et réessayer !", + "id 为空!": "L'ID est vide !", + "未提供兑换码": "Aucun code d'échange fourni", + "无效的 user id": "ID utilisateur non valide", + "无效的兑换码": "Code d'échange non valide", + "该兑换码已被使用": "Ce code d'échange a déjà été utilisé", + "通过兑换码充值 %s": "Recharger %s via le code d'échange", + "未提供令牌": "Aucun jeton fourni", + "该令牌状态不可用": "Le statut de ce jeton n'est pas disponible", + "该令牌已过期": "Ce jeton a expiré", + "该令牌额度已用尽": "Le quota de ce jeton est épuisé", + "无效的令牌": "Jeton non valide", + "id 或 userId 为空!": "L'ID ou l'userID est vide !", + "quota 不能为负数!": "Le quota ne peut pas être négatif !", + "令牌额度不足": "Quota de jeton insuffisant", + "用户额度不足": "Quota utilisateur insuffisant", + "您的额度即将用尽": "Votre quota est presque épuisé", + "您的额度已用尽": "Votre quota est épuisé", + "%s,当前剩余额度为 %d,为了不影响您的使用,请及时充值。Sans ordre particulier
+ ++ +## 📚 Documentation + +Pour une documentation détaillée, veuillez consulter notre Wiki officiel : [https://docs.newapi.pro/](https://docs.newapi.pro/) + +Vous pouvez également accéder au DeepWiki généré par l'IA : +[](https://deepwiki.com/QuantumNous/new-api) + +## ✨ Fonctionnalités clés + +New API offre un large éventail de fonctionnalités, veuillez vous référer à [Présentation des fonctionnalités](https://docs.newapi.pro/wiki/features-introduction) pour plus de détails : + +1. 🎨 Nouvelle interface utilisateur +2. 🌍 Prise en charge multilingue +3. 💰 Fonctionnalité de recharge en ligne (YiPay) +4. 🔍 Prise en charge de la recherche de quotas d'utilisation avec des clés (fonctionne avec [neko-api-key-tool](https://github.com/Calcium-Ion/neko-api-key-tool)) +5. 🔄 Compatible avec la base de données originale de One API +6. 💵 Prise en charge de la tarification des modèles de paiement à l'utilisation +7. ⚖️ Prise en charge de la sélection aléatoire pondérée des canaux +8. 📈 Tableau de bord des données (console) +9. 🔒 Regroupement de jetons et restrictions de modèles +10. 🤖 Prise en charge de plus de méthodes de connexion par autorisation (LinuxDO, Telegram, OIDC) +11. 🔄 Prise en charge des modèles Rerank (Cohere et Jina), [Documentation de l'API](https://docs.newapi.pro/api/jinaai-rerank) +12. ⚡ Prise en charge de l'API OpenAI Realtime (y compris les canaux Azure), [Documentation de l'API](https://docs.newapi.pro/api/openai-realtime) +13. ⚡ Prise en charge du format Claude Messages, [Documentation de l'API](https://docs.newapi.pro/api/anthropic-chat) +14. Prise en charge de l'accès à l'interface de discussion via la route /chat2link +15. 🧠 Prise en charge de la définition de l'effort de raisonnement via les suffixes de nom de modèle : + 1. Modèles de la série o d'OpenAI + - Ajouter le suffixe `-high` pour un effort de raisonnement élevé (par exemple : `o3-mini-high`) + - Ajouter le suffixe `-medium` pour un effort de raisonnement moyen (par exemple : `o3-mini-medium`) + - Ajouter le suffixe `-low` pour un effort de raisonnement faible (par exemple : `o3-mini-low`) + 2. Modèles de pensée de Claude + - Ajouter le suffixe `-thinking` pour activer le mode de pensée (par exemple : `claude-3-7-sonnet-20250219-thinking`) +16. 🔄 Fonctionnalité de la pensée au contenu +17. 🔄 Limitation du débit du modèle pour les utilisateurs +18. 💰 Prise en charge de la facturation du cache, qui permet de facturer à un ratio défini lorsque le cache est atteint : + 1. Définir l'option `Ratio de cache d'invite` dans `Paramètres système->Paramètres de fonctionnement` + 2. Définir le `Ratio de cache d'invite` dans le canal, plage de 0 à 1, par exemple, le définir sur 0,5 signifie facturer à 50 % lorsque le cache est atteint + 3. Canaux pris en charge : + - [x] OpenAI + - [x] Azure + - [x] DeepSeek + - [x] Claude + +## Prise en charge des modèles + +Cette version prend en charge plusieurs modèles, veuillez vous référer à [Documentation de l'API-Interface de relais](https://docs.newapi.pro/api) pour plus de détails : + +1. Modèles tiers **gpts** (gpt-4-gizmo-*) +2. Canal tiers [Midjourney-Proxy(Plus)](https://github.com/novicezk/midjourney-proxy), [Documentation de l'API](https://docs.newapi.pro/api/midjourney-proxy-image) +3. Canal tiers [Suno API](https://github.com/Suno-API/Suno-API), [Documentation de l'API](https://docs.newapi.pro/api/suno-music) +4. Canaux personnalisés, prenant en charge la saisie complète de l'adresse d'appel +5. Modèles Rerank ([Cohere](https://cohere.ai/) et [Jina](https://jina.ai/)), [Documentation de l'API](https://docs.newapi.pro/api/jinaai-rerank) +6. Format de messages Claude, [Documentation de l'API](https://docs.newapi.pro/api/anthropic-chat) +7. Dify, ne prend actuellement en charge que chatflow + +## Configuration des variables d'environnement + +Pour des instructions de configuration détaillées, veuillez vous référer à [Guide d'installation-Configuration des variables d'environnement](https://docs.newapi.pro/installation/environment-variables) : + +- `GENERATE_DEFAULT_TOKEN` : S'il faut générer des jetons initiaux pour les utilisateurs nouvellement enregistrés, la valeur par défaut est `false` +- `STREAMING_TIMEOUT` : Délai d'expiration de la réponse en streaming, la valeur par défaut est de 300 secondes +- `DIFY_DEBUG` : S'il faut afficher les informations sur le flux de travail et les nœuds pour les canaux Dify, la valeur par défaut est `true` +- `FORCE_STREAM_OPTION` : S'il faut remplacer le paramètre client stream_options, la valeur par défaut est `true` +- `GET_MEDIA_TOKEN` : S'il faut compter les jetons d'image, la valeur par défaut est `true` +- `GET_MEDIA_TOKEN_NOT_STREAM` : S'il faut compter les jetons d'image dans les cas sans streaming, la valeur par défaut est `true` +- `UPDATE_TASK` : S'il faut mettre à jour les tâches asynchrones (Midjourney, Suno), la valeur par défaut est `true` +- `COHERE_SAFETY_SETTING` : Paramètres de sécurité du modèle Cohere, les options sont `NONE`, `CONTEXTUAL`, `STRICT`, la valeur par défaut est `NONE` +- `GEMINI_VISION_MAX_IMAGE_NUM` : Nombre maximum d'images pour les modèles Gemini, la valeur par défaut est `16` +- `MAX_FILE_DOWNLOAD_MB` : Taille maximale de téléchargement de fichier en Mo, la valeur par défaut est `20` +- `CRYPTO_SECRET` : Clé de chiffrement utilisée pour chiffrer le contenu de la base de données +- `AZURE_DEFAULT_API_VERSION` : Version de l'API par défaut du canal Azure, la valeur par défaut est `2025-04-01-preview` +- `NOTIFICATION_LIMIT_DURATION_MINUTE` : Durée de la limite de notification, la valeur par défaut est de `10` minutes +- `NOTIFY_LIMIT_COUNT` : Nombre maximal de notifications utilisateur dans la durée spécifiée, la valeur par défaut est `2` +- `ERROR_LOG_ENABLED=true` : S'il faut enregistrer et afficher les journaux d'erreurs, la valeur par défaut est `false` + +## Déploiement + +Pour des guides de déploiement détaillés, veuillez vous référer à [Guide d'installation-Méthodes de déploiement](https://docs.newapi.pro/installation) : + +> [!TIP] +> Dernière image Docker : `calciumion/new-api:latest` + +### Considérations sur le déploiement multi-machines +- La variable d'environnement `SESSION_SECRET` doit être définie, sinon l'état de connexion sera incohérent sur plusieurs machines +- Si vous partagez Redis, `CRYPTO_SECRET` doit être défini, sinon le contenu de Redis ne pourra pas être consulté sur plusieurs machines + +### Exigences de déploiement +- Base de données locale (par défaut) : SQLite (le déploiement Docker doit monter le répertoire `/data`) +- Base de données distante : MySQL version >= 5.7.8, PgSQL version >= 9.6 + +### Méthodes de déploiement + +#### Utilisation de la fonctionnalité Docker du panneau BaoTa +Installez le panneau BaoTa (version **9.2.0** ou supérieure), recherchez **New-API** dans le magasin d'applications et installez-le. +[Tutoriel avec des images](./docs/BT.md) + +#### Utilisation de Docker Compose (recommandé) +```shell +# Télécharger le projet +git clone https://github.com/Calcium-Ion/new-api.git +cd new-api +# Modifier docker-compose.yml si nécessaire +# Démarrer +docker-compose up -d +``` + +#### Utilisation directe de l'image Docker +```shell +# Utilisation de SQLite +docker run --name new-api -d --restart always -p 3000:3000 -e TZ=Asia/Shanghai -v /home/ubuntu/data/new-api:/data calciumion/new-api:latest + +# Utilisation de MySQL +docker run --name new-api -d --restart always -p 3000:3000 -e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi" -e TZ=Asia/Shanghai -v /home/ubuntu/data/new-api:/data calciumion/new-api:latest +``` + +## Nouvelle tentative de canal et cache +La fonctionnalité de nouvelle tentative de canal a été implémentée, vous pouvez définir le nombre de tentatives dans `Paramètres->Paramètres de fonctionnement->Paramètres généraux`. Il est **recommandé d'activer la mise en cache**. + +### Méthode de configuration du cache +1. `REDIS_CONN_STRING` : Définir Redis comme cache +2. `MEMORY_CACHE_ENABLED` : Activer le cache mémoire (pas besoin de le définir manuellement si Redis est défini) + +## Documentation de l'API + +Pour une documentation détaillée de l'API, veuillez vous référer à [Documentation de l'API](https://docs.newapi.pro/api) : + +- [API de discussion](https://docs.newapi.pro/api/openai-chat) +- [API d'image](https://docs.newapi.pro/api/openai-image) +- [API de rerank](https://docs.newapi.pro/api/jinaai-rerank) +- [API en temps réel](https://docs.newapi.pro/api/openai-realtime) +- [API de discussion Claude (messages)](https://docs.newapi.pro/api/anthropic-chat) + +## Projets connexes +- [One API](https://github.com/songquanpeng/one-api) : Projet original +- [Midjourney-Proxy](https://github.com/novicezk/midjourney-proxy) : Prise en charge de l'interface Midjourney +- [chatnio](https://github.com/Deeptrain-Community/chatnio) : Solution B/C unique d'IA de nouvelle génération +- [neko-api-key-tool](https://github.com/Calcium-Ion/neko-api-key-tool) : Interroger le quota d'utilisation avec une clé + +Autres projets basés sur New API : +- [new-api-horizon](https://github.com/Calcium-Ion/new-api-horizon) : Version optimisée hautes performances de New API +- [VoAPI](https://github.com/VoAPI/VoAPI) : Version embellie du frontend basée sur New API + +## Aide et support + +Si vous avez des questions, veuillez vous référer à [Aide et support](https://docs.newapi.pro/support) : +- [Interaction avec la communauté](https://docs.newapi.pro/support/community-interaction) +- [Commentaires sur les problèmes](https://docs.newapi.pro/support/feedback-issues) +- [FAQ](https://docs.newapi.pro/support/faq) + +## 🌟 Historique des étoiles + +[](https://star-history.com/#Calcium-Ion/new-api&Date) \ No newline at end of file From 2a0ecf3a1f0e10ea4142c4f858515e56aa1931f7 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 10:53:58 +0000 Subject: [PATCH 03/10] =?UTF-8?q?Ajout=20du=20lien=20vers=20la=20traductio?= =?UTF-8?q?n=20fran=C3=A7aise=20dans=20le=20fichier=20README.md=20principa?= =?UTF-8?q?l.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d68b3e135..2103fe8fc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
- 中文 | English + 中文 | English | Français
- 中文 | English + 中文 | English | Français