mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-04-19 11:58:38 +00:00
Merge branch 'QuantumNous:main' into main
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<p align="right">
|
<p align="right">
|
||||||
<a href="./README.md">中文</a> | <strong>English</strong>
|
<a href="./README.md">中文</a> | <strong>English</strong> | <a href="./README.fr.md">Français</a>
|
||||||
</p>
|
</p>
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
|
|||||||
216
README.fr.md
Normal file
216
README.fr.md
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
<p align="right">
|
||||||
|
<a href="./README.md">中文</a> | <a href="./README.en.md">English</a> | <strong>Français</strong>
|
||||||
|
</p>
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
# New API
|
||||||
|
|
||||||
|
🍥 Passerelle de modèles étendus de nouvelle génération et système de gestion d'actifs d'IA
|
||||||
|
|
||||||
|
<a href="https://trendshift.io/repositories/8227" target="_blank"><img src="https://trendshift.io/api/badge/repositories/8227" alt="Calcium-Ion%2Fnew-api | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://raw.githubusercontent.com/Calcium-Ion/new-api/main/LICENSE">
|
||||||
|
<img src="https://img.shields.io/github/license/Calcium-Ion/new-api?color=brightgreen" alt="licence">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/Calcium-Ion/new-api/releases/latest">
|
||||||
|
<img src="https://img.shields.io/github/v/release/Calcium-Ion/new-api?color=brightgreen&include_prereleases" alt="version">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/users/Calcium-Ion/packages/container/package/new-api">
|
||||||
|
<img src="https://img.shields.io/badge/docker-ghcr.io-blue" alt="docker">
|
||||||
|
</a>
|
||||||
|
<a href="https://hub.docker.com/r/CalciumIon/new-api">
|
||||||
|
<img src="https://img.shields.io/badge/docker-dockerHub-blue" alt="docker">
|
||||||
|
</a>
|
||||||
|
<a href="https://goreportcard.com/report/github.com/Calcium-Ion/new-api">
|
||||||
|
<img src="https://goreportcard.com/badge/github.com/Calcium-Ion/new-api" alt="GoReportCard">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## 📝 Description du projet
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Il s'agit d'un projet open-source développé sur la base de [One API](https://github.com/songquanpeng/one-api)
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> - Ce projet est uniquement destiné à des fins d'apprentissage personnel, sans garantie de stabilité ni de support technique.
|
||||||
|
> - Les utilisateurs doivent se conformer aux [Conditions d'utilisation](https://openai.com/policies/terms-of-use) d'OpenAI et aux **lois et réglementations applicables**, et ne doivent pas l'utiliser à des fins illégales.
|
||||||
|
> - Conformément aux [《Mesures provisoires pour la gestion des services d'intelligence artificielle générative》](http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm), veuillez ne fournir aucun service d'IA générative non enregistré au public en Chine.
|
||||||
|
|
||||||
|
<h2>🤝 Partenaires de confiance</h2>
|
||||||
|
<p id="premium-sponsors"> </p>
|
||||||
|
<p align="center"><strong>Sans ordre particulier</strong></p>
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://www.cherry-ai.com/" target=_blank><img
|
||||||
|
src="./docs/images/cherry-studio.png" alt="Cherry Studio" height="120"
|
||||||
|
/></a>
|
||||||
|
<a href="https://bda.pku.edu.cn/" target=_blank><img
|
||||||
|
src="./docs/images/pku.png" alt="Université de Pékin" height="120"
|
||||||
|
/></a>
|
||||||
|
<a href="https://www.compshare.cn/?ytag=GPU_yy_gh_newapi" target=_blank><img
|
||||||
|
src="./docs/images/ucloud.png" alt="UCloud" height="120"
|
||||||
|
/></a>
|
||||||
|
<a href="https://www.aliyun.com/" target=_blank><img
|
||||||
|
src="./docs/images/aliyun.png" alt="Alibaba Cloud" height="120"
|
||||||
|
/></a>
|
||||||
|
<a href="https://io.net/" target=_blank><img
|
||||||
|
src="./docs/images/io-net.png" alt="IO.NET" height="120"
|
||||||
|
/></a>
|
||||||
|
</p>
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
## 📚 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)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<p align="right">
|
<p align="right">
|
||||||
<strong>中文</strong> | <a href="./README.en.md">English</a>
|
<strong>中文</strong> | <a href="./README.en.md">English</a> | <a href="./README.fr.md">Français</a>
|
||||||
</p>
|
</p>
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ type Task struct {
|
|||||||
ID int64 `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
|
ID int64 `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
|
||||||
CreatedAt int64 `json:"created_at" gorm:"index"`
|
CreatedAt int64 `json:"created_at" gorm:"index"`
|
||||||
UpdatedAt int64 `json:"updated_at"`
|
UpdatedAt int64 `json:"updated_at"`
|
||||||
TaskID string `json:"task_id" gorm:"type:varchar(50);index"` // 第三方id,不一定有/ song id\ Task id
|
TaskID string `json:"task_id" gorm:"type:varchar(191);index"` // 第三方id,不一定有/ song id\ Task id
|
||||||
Platform constant.TaskPlatform `json:"platform" gorm:"type:varchar(30);index"` // 平台
|
Platform constant.TaskPlatform `json:"platform" gorm:"type:varchar(30);index"` // 平台
|
||||||
UserId int `json:"user_id" gorm:"index"`
|
UserId int `json:"user_id" gorm:"index"`
|
||||||
ChannelId int `json:"channel_id" gorm:"index"`
|
ChannelId int `json:"channel_id" gorm:"index"`
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import (
|
|||||||
// Otherwise, the sensitive information will be saved on local storage in plain text!
|
// Otherwise, the sensitive information will be saved on local storage in plain text!
|
||||||
type User struct {
|
type User struct {
|
||||||
Id int `json:"id"`
|
Id int `json:"id"`
|
||||||
Username string `json:"username" gorm:"unique;index" validate:"max=12"`
|
Username string `json:"username" gorm:"unique;index" validate:"max=20"`
|
||||||
Password string `json:"password" gorm:"not null;" validate:"min=8,max=20"`
|
Password string `json:"password" gorm:"not null;" validate:"min=8,max=20"`
|
||||||
OriginalPassword string `json:"original_password" gorm:"-:all"` // this field is only for Password change verification, don't save it to database!
|
OriginalPassword string `json:"original_password" gorm:"-:all"` // this field is only for Password change verification, don't save it to database!
|
||||||
DisplayName string `json:"display_name" gorm:"index" validate:"max=20"`
|
DisplayName string `json:"display_name" gorm:"index" validate:"max=20"`
|
||||||
|
|||||||
@@ -110,6 +110,6 @@ func NewProxyHttpClient(proxyURL string) (*http.Client, error) {
|
|||||||
return client, nil
|
return client, nil
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unsupported proxy scheme: %s", parsedURL.Scheme)
|
return nil, fmt.Errorf("unsupported proxy scheme: %s, must be http, https, socks5 or socks5h", parsedURL.Scheme)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -512,7 +512,6 @@ func GetCompletionRatio(name string) float64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getHardcodedCompletionModelRatio(name string) (float64, bool) {
|
func getHardcodedCompletionModelRatio(name string) (float64, bool) {
|
||||||
lowercaseName := strings.ToLower(name)
|
|
||||||
|
|
||||||
isReservedModel := strings.HasSuffix(name, "-all") || strings.HasSuffix(name, "-gizmo-*")
|
isReservedModel := strings.HasSuffix(name, "-all") || strings.HasSuffix(name, "-gizmo-*")
|
||||||
if isReservedModel {
|
if isReservedModel {
|
||||||
@@ -605,9 +604,6 @@ func getHardcodedCompletionModelRatio(name string) (float64, bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// hint 只给官方上4倍率,由于开源模型供应商自行定价,不对其进行补全倍率进行强制对齐
|
// hint 只给官方上4倍率,由于开源模型供应商自行定价,不对其进行补全倍率进行强制对齐
|
||||||
if lowercaseName == "deepseek-chat" || lowercaseName == "deepseek-reasoner" {
|
|
||||||
return 4, true
|
|
||||||
}
|
|
||||||
if strings.HasPrefix(name, "ERNIE-Speed-") {
|
if strings.HasPrefix(name, "ERNIE-Speed-") {
|
||||||
return 2, true
|
return 2, true
|
||||||
} else if strings.HasPrefix(name, "ERNIE-Lite-") {
|
} else if strings.HasPrefix(name, "ERNIE-Lite-") {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ For commercial licensing, please contact support@quantumnous.com
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Button, Dropdown } from '@douyinfe/semi-ui';
|
import { Button, Dropdown } from '@douyinfe/semi-ui';
|
||||||
import { Languages } from 'lucide-react';
|
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 }) => {
|
const LanguageSelector = ({ currentLang, onLanguageChange, t }) => {
|
||||||
return (
|
return (
|
||||||
@@ -42,12 +42,19 @@ const LanguageSelector = ({ currentLang, onLanguageChange, t }) => {
|
|||||||
<GB title='English' className='!w-5 !h-auto' />
|
<GB title='English' className='!w-5 !h-auto' />
|
||||||
<span>English</span>
|
<span>English</span>
|
||||||
</Dropdown.Item>
|
</Dropdown.Item>
|
||||||
|
<Dropdown.Item
|
||||||
|
onClick={() => onLanguageChange('fr')}
|
||||||
|
className={`!flex !items-center !gap-2 !px-3 !py-1.5 !text-sm !text-semi-color-text-0 dark:!text-gray-200 ${currentLang === 'fr' ? '!bg-semi-color-primary-light-default dark:!bg-blue-600 !font-semibold' : 'hover:!bg-semi-color-fill-1 dark:hover:!bg-gray-600'}`}
|
||||||
|
>
|
||||||
|
<FR title='Français' className='!w-5 !h-auto' />
|
||||||
|
<span>Français</span>
|
||||||
|
</Dropdown.Item>
|
||||||
</Dropdown.Menu>
|
</Dropdown.Menu>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Button
|
<Button
|
||||||
icon={<Languages size={18} />}
|
icon={<Languages size={18} />}
|
||||||
aria-label={t('切换语言')}
|
aria-label={t('common.changeLanguage')}
|
||||||
theme='borderless'
|
theme='borderless'
|
||||||
type='tertiary'
|
type='tertiary'
|
||||||
className='!p-1.5 !text-current focus:!bg-semi-color-fill-1 dark:focus:!bg-gray-700 !rounded-full !bg-semi-color-fill-0 dark:!bg-semi-color-fill-1 hover:!bg-semi-color-fill-1 dark:hover:!bg-semi-color-fill-2'
|
className='!p-1.5 !text-current focus:!bg-semi-color-fill-1 dark:focus:!bg-gray-700 !rounded-full !bg-semi-color-fill-0 dark:!bg-semi-color-fill-1 hover:!bg-semi-color-fill-1 dark:hover:!bg-semi-color-fill-2'
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ const MODEL_FETCHABLE_TYPES = new Set([
|
|||||||
40,
|
40,
|
||||||
42,
|
42,
|
||||||
48,
|
48,
|
||||||
|
43,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
function type2secretPrompt(type) {
|
function type2secretPrompt(type) {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import { initReactI18next } from 'react-i18next';
|
|||||||
import LanguageDetector from 'i18next-browser-languagedetector';
|
import LanguageDetector from 'i18next-browser-languagedetector';
|
||||||
|
|
||||||
import enTranslation from './locales/en.json';
|
import enTranslation from './locales/en.json';
|
||||||
|
import frTranslation from './locales/fr.json';
|
||||||
import zhTranslation from './locales/zh.json';
|
import zhTranslation from './locales/zh.json';
|
||||||
|
|
||||||
i18n
|
i18n
|
||||||
@@ -36,6 +37,9 @@ i18n
|
|||||||
zh: {
|
zh: {
|
||||||
translation: zhTranslation,
|
translation: zhTranslation,
|
||||||
},
|
},
|
||||||
|
fr: {
|
||||||
|
translation: frTranslation,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
fallbackLng: 'zh',
|
fallbackLng: 'zh',
|
||||||
interpolation: {
|
interpolation: {
|
||||||
|
|||||||
@@ -2130,5 +2130,8 @@
|
|||||||
"域名IP过滤详细说明": "⚠️ This is an experimental option. A domain may resolve to multiple IPv4/IPv6 addresses. If enabled, ensure the IP filter list covers these addresses, otherwise access may fail.",
|
"域名IP过滤详细说明": "⚠️ This is an experimental option. A domain may resolve to multiple IPv4/IPv6 addresses. If enabled, ensure the IP filter list covers these addresses, otherwise access may fail.",
|
||||||
"域名黑名单": "Domain Blacklist",
|
"域名黑名单": "Domain Blacklist",
|
||||||
"白名单": "Whitelist",
|
"白名单": "Whitelist",
|
||||||
"黑名单": "Blacklist"
|
"黑名单": "Blacklist",
|
||||||
|
"common": {
|
||||||
|
"changeLanguage": "Change Language"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2140
web/src/i18n/locales/fr.json
Normal file
2140
web/src/i18n/locales/fr.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -33,5 +33,8 @@
|
|||||||
"输入端口后回车,如:80 或 8000-8999": "输入端口后回车,如:80 或 8000-8999",
|
"输入端口后回车,如:80 或 8000-8999": "输入端口后回车,如:80 或 8000-8999",
|
||||||
"更新SSRF防护设置": "更新SSRF防护设置",
|
"更新SSRF防护设置": "更新SSRF防护设置",
|
||||||
"域名IP过滤详细说明": "⚠️此功能为实验性选项,域名可能解析到多个 IPv4/IPv6 地址,若开启,请确保 IP 过滤列表覆盖这些地址,否则可能导致访问失败。",
|
"域名IP过滤详细说明": "⚠️此功能为实验性选项,域名可能解析到多个 IPv4/IPv6 地址,若开启,请确保 IP 过滤列表覆盖这些地址,否则可能导致访问失败。",
|
||||||
|
"common": {
|
||||||
|
"changeLanguage": "切换语言"
|
||||||
|
},
|
||||||
"允许在 Stripe 支付中输入促销码": "允许在 Stripe 支付中输入促销码"
|
"允许在 Stripe 支付中输入促销码": "允许在 Stripe 支付中输入促销码"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user