Merge pull request #1991 from Sacode/i18n

feat: complete English, French and Russian translation and add i18n configuration
This commit is contained in:
Seefs
2025-10-11 15:56:55 +08:00
committed by GitHub
12 changed files with 8659 additions and 4709 deletions

View File

@@ -0,0 +1,107 @@
# Glossaire Français (French Glossary)
Ce document fournit des traductions standards françaises pour la terminologie clé du projet afin d'assurer la cohérence et la précision des traductions.
This document provides standard French translations for key project terminology to ensure consistency and accuracy in translations.
## Concepts de Base (Core Concepts)
- L'utilisation d'émojis dans les traductions est autorisée s'ils sont présents dans l'original
- L'utilisation de termes purement techniques est autorisée s'ils sont présents dans l'original
- L'utilisation de termes techniques en anglais est autorisée s'ils sont largement utilisés dans l'environnement technique francophone (par exemple, API)
| Chinois | Français | Anglais | Description |
|---------|----------|---------|-------------|
| 倍率 | Ratio | Ratio/Multiplier | Multiplicateur utilisé pour le calcul des prix. **Important :** Dans le contexte des calculs de prix, toujours utiliser "Ratio" plutôt que "Multiplicateur" pour assurer la cohérence terminologique |
| 令牌 | Jeton | Token | Identifiants d'accès API ou unités de texte traitées par les modèles |
| 渠道 | Canal | Channel | Canal d'accès aux fournisseurs d'API |
| 分组 | Groupe | Group | Classification des utilisateurs ou des jetons |
| 额度 | Quota | Quota | Quota de services disponible pour l'utilisateur |
## Modèles (Model Related)
| Chinois | Français | Anglais | Description |
|---------|----------|---------|-------------|
| 提示 | Invite | Prompt | Contenu d'entrée du modèle |
| 补全 | Complétion | Completion | Contenu de sortie du modèle. **Important :** Ne pas utiliser "Achèvement" ou "Finalisation" - uniquement "Complétion" pour correspondre à la terminologie technique |
| 输入 | Entrée | Input/Prompt | Contenu envoyé au modèle |
| 输出 | Sortie | Output/Completion | Contenu retourné par le modèle |
| 模型倍率 | Ratio du modèle | Model Ratio | Ratio de tarification pour différents modèles |
| 补全倍率 | Ratio de complétion | Completion Ratio | Ratio de tarification supplémentaire pour la sortie |
| 固定价格 | Prix fixe | Price per call | Prix par appel |
| 按量计费 | Paiement à l'utilisation | Pay-as-you-go | Tarification basée sur l'utilisation |
| 按次计费 | Paiement par appel | Pay-per-view | Prix fixe par appel |
## Gestion des Utilisateurs (User Management)
| Chinois | Français | Anglais | Description |
|---------|----------|---------|-------------|
| 超级管理员 | Super-administrateur | Root User | Administrateur avec les privilèges les plus élevés |
| 管理员 | Administrateur | Admin User | Administrateur système |
| 普通用户 | Utilisateur normal | Normal User | Utilisateur avec privilèges standards |
## Recharge et Échange (Recharge & Redemption)
| Chinois | Français | Anglais | Description |
|---------|----------|---------|-------------|
| 充值 | Recharge | Top Up | Ajout de quota au compte |
| 兑换码 | Code d'échange | Redemption Code | Code qui peut être échangé contre du quota |
## Gestion des Canaux (Channel Management)
| Chinois | Français | Anglais | Description |
|---------|----------|---------|-------------|
| 渠道 | Canal | Channel | Canal du fournisseur d'API |
| API密钥 | Clé API | API Key | Clé d'accès API. **Important :** Utiliser "Clé API" au lieu de "Jeton API" pour plus de précision et conformément à la terminologie technique francophone établie. Le terme "Clé" reflète mieux la fonctionnalité d'accès aux ressources, tandis que "Jeton" est plus souvent associé aux unités de texte dans le contexte du traitement des modèles linguistiques. |
| 优先级 | Priorité | Priority | Priorité de sélection du canal |
| 权重 | Poids | Weight | Poids d'équilibrage de charge |
| 代理 | Proxy | Proxy | Adresse du serveur proxy |
| 模型重定向 | Redirection de modèle | Model Mapping | Remplacement du nom du modèle dans le corps de la requête |
| 供应商 | Fournisseur | Provider/Vendor | Fournisseur de services ou d'API |
## Sécurité (Security Related)
| Chinois | Français | Anglais | Description |
|---------|----------|---------|-------------|
| 两步验证 | Authentification à deux facteurs | Two-Factor Authentication | Méthode de vérification de sécurité supplémentaire pour les comptes |
| 2FA | 2FA | Two-Factor Authentication | Abréviation de l'authentification à deux facteurs |
## Recommandations de Traduction (Translation Guidelines)
### Variantes Contextuelles de Traduction
**Invite/Entrée (Prompt/Input)**
- **Invite** : Lors de l'interaction avec les LLM, dans l'interface utilisateur, lors de la description de l'interaction avec le modèle
- **Entrée** : Dans la tarification, la documentation technique, la description du processus de traitement des données
- **Règle** : S'il s'agit de l'expérience utilisateur et de l'interaction avec l'IA → "Invite", s'il s'agit du processus technique ou des calculs → "Entrée"
**Jeton (Token)**
- Jeton d'accès API (API Token)
- Unité de texte traitée par le modèle (Text Token)
- Jeton d'accès système (Access Token)
**Quota (Quota)**
- Quota de services disponible pour l'utilisateur
- Parfois traduit comme "Crédit"
### Particularités de la Langue Française
- **Formes plurielles** : Nécessite une implémentation correcte des formes plurielles (_one, _other)
- **Accords grammaticaux** : Attention aux accords grammaticaux dans les termes techniques
- **Genre grammatical** : Accord du genre des termes techniques (par exemple, "modèle" - masculin, "canal" - masculin)
### Termes Standardisés
- **Complétion (Completion)** : Contenu de sortie du modèle
- **Ratio (Ratio)** : Multiplicateur pour le calcul des prix
- **Code d'échange (Redemption Code)** : Utilisé au lieu de "Code d'échange" pour plus de précision
- **Fournisseur (Provider/Vendor)** : Organisation ou service fournissant des API ou des modèles d'IA
---
**Note pour les contributeurs :** Si vous trouvez des incohérences dans les traductions de terminologie ou si vous avez de meilleures suggestions de traduction pour le français, n'hésitez pas à créer une Issue ou une Pull Request.
**Contribution Note for French:** If you find any inconsistencies in terminology translations or have better translation suggestions for French, please feel free to submit an Issue or Pull Request.

View File

@@ -54,6 +54,20 @@ This document provides standard translation references for key terminology in th
| 代理 | Proxy | 代理服务器地址 | Proxy server address |
| 模型重定向 | Model Mapping | 请求体中模型名称替换 | Model name replacement in request body |
## 安全相关 (Security Related)
| 中文 | English | 说明 | Description |
|------|---------|------|-------------|
| 两步验证 | Two-Factor Authentication | 为账户提供额外安全保护的验证方式 | Additional security verification method for accounts |
| 2FA | Two-Factor Authentication | 两步验证的缩写 | Abbreviation for Two-Factor Authentication |
## 计费相关 (Billing Related)
| 中文 | English | 说明 | Description |
|------|---------|------|-------------|
| 倍率 | Ratio | 价格计算的乘数因子 | Multiplier factor used for price calculation |
| 倍率 | Multiplier | 价格计算的乘数因子(同义词) | Multiplier factor used for price calculation (synonym) |
## 翻译注意事项 (Translation Guidelines)
- **提示 (Prompt)** = 模型输入内容 / Model input content

View File

@@ -0,0 +1,107 @@
# Русский глоссарий (Russian Glossary)
Данный раздел предоставляет стандартные переводы ключевой терминологии проекта на русский язык для обеспечения согласованности и точности переводов.
This section provides standard Russian translations for key project terminology to ensure consistency and accuracy in translations.
## Основные концепции (Core Concepts)
- Допускается использовать символы Emoji в переводе, если они были в оригинале.
- Допускается использование сугубо технических терминов, если они были в оригинале.
- Допускается использование технических терминов на английском языке, если они широко используются в русскоязычной технической среде (например, API).
| Китайский | Русский | Английский | Описание |
|-----------|--------|-----------|----------|
| 倍率 | Коэффициент | Ratio/Multiplier | Множитель для расчета цены. **Важно:** В контексте расчетов цен всегда использовать "Коэффициент", а не "Множитель" для обеспечения консистентности терминологии |
| 令牌 | Токен | Token | Учетные данные API или текстовые единицы |
| 渠道 | Канал | Channel | Канал доступа к поставщику API |
| 分组 | Группа | Group | Классификация пользователей или токенов |
| 额度 | Квота | Quota | Доступная квота услуг для пользователя |
## Модели (Model Related)
| Китайский | Русский | Английский | Описание |
|-----------|--------|-----------|----------|
| 提示 | Промпт/Ввод | Prompt | Содержимое ввода в модель |
| 补全 | Вывод | Completion | Содержимое вывода модели. **Важно:** Не использовать "Дополнение" или "Завершение" - только "Вывод" для соответствия технической терминологии |
| 输入 | Ввод | Input/Prompt | Содержимое, отправляемое в модель |
| 输出 | Вывод | Output/Completion | Содержимое, возвращаемое моделью |
| 模型倍率 | Коэффициент модели | Model Ratio | Коэффициент тарификации для разных моделей |
| 补全倍率 | Коэффициент вывода | Completion Ratio | Дополнительный коэффициент тарификации для вывода |
| 固定价格 | Цена за запрос | Price per call | Цена за один вызов |
| 按量计费 | Оплата по объему | Pay-as-you-go | Тарификация на основе использования |
| 按次计费 | Оплата за запрос | Pay-per-view | Фиксированная цена за вызов |
## Управление пользователями (User Management)
| Китайский | Русский | Английский | Описание |
|-----------|--------|-----------|----------|
| 超级管理员 | Суперадминистратор | Root User | Администратор с наивысшими привилегиями |
| 管理员 | Администратор | Admin User | Системный администратор |
| 普通用户 | Обычный пользователь | Normal User | Пользователь со стандартными привилегиями |
## Пополнение и обмен (Recharge & Redemption)
| Китайский | Русский | Английский | Описание |
|-----------|--------|-----------|----------|
| 充值 | Пополнение | Top Up | Добавление квоты на аккаунт |
| 兑换码 | Код купона | Redemption Code | Код, который можно обменять на квоту |
## Управление каналами (Channel Management)
| Китайский | Русский | Английский | Описание |
|-----------|--------|-----------|----------|
| 渠道 | Канал | Channel | Канал поставщика API |
| API密钥 | API ключ | API Key | Ключ доступа к API. **Важно:** Использовать "API ключ" вместо "API токен" для большей точности и соответствия общепринятой русскоязычной технической терминологии. Термин "ключ" более точно отражает функционал доступа к ресурсам, в то время как "токен" чаще ассоциируется с текстовыми единицами в контексте обработки языковых моделей. |
| 优先级 | Приоритет | Priority | Приоритет выбора канала |
| 权重 | Вес | Weight | Вес балансировки нагрузки |
| 代理 | Прокси | Proxy | Адрес прокси-сервера |
| 模型重定向 | Перенаправление модели | Model Mapping | Замена имени модели в теле запроса |
| 供应商 | Поставщик | Provider/Vendor | Поставщик услуг или API |
## Безопасность (Security Related)
| Китайский | Русский | Английский | Описание |
|-----------|--------|-----------|----------|
| 两步验证 | Двухфакторная аутентификация | Two-Factor Authentication | Дополнительный метод проверки безопасности для аккаунтов |
| 2FA | 2FA | Two-Factor Authentication | Аббревиатура двухфакторной аутентификации |
## Рекомендации по переводу (Translation Guidelines)
### Контекстуальные варианты перевода
**Промпт/Ввод (Prompt/Input)**
- **Промпт**: При общении с LLM, в пользовательском интерфейсе, при описании взаимодействия с моделью
- **Ввод**: При тарификации, технической документации, описании процесса обработки данных
- **Правило**: Если речь о пользовательском опыте и взаимодействии с AI → "Промпт", если о техническом процессе или расчетах → "Ввод"
**Token**
- API токен доступа (API Token)
- Текстовая единица, обрабатываемая моделью (Text Token)
- Токен доступа к системе (Access Token)
**Квота (Quota)**
- Доступная квота услуг пользователя
- Иногда переводится как "Кредит"
### Особенности русского языка
- **Множественные формы**: Требуется правильная реализация множественных форм (_one,_few, _many,_other)
- **Падежные окончания**: Внимательное отношение к падежным окончаниям в технических терминах
- **Грамматический род**: Согласование рода технических терминов (например, "модель" - женский род, "канал" - мужской род)
### Стандартизированные термины
- **Вывод (Completion)**: Содержимое вывода модели
- **Коэффициент (Ratio)**: Множитель для расчета цены
- **Код купона (Redemption Code)**: Используется вместо "Код обмена" для большей точности
- **Поставщик (Provider/Vendor)**: Организация или сервис, предоставляющий API или AI-модели
---
**Примечание для участников:** При обнаружении несогласованности в переводах терминологии или наличии лучших предложений по переводу, не стесняйтесь создавать Issue или Pull Request.
**Contribution Note for Russian:** If you find any inconsistencies in terminology translations or have better translation suggestions for Russian, please feel free to submit an Issue or Pull Request.

95
web/i18next.config.js Normal file
View File

@@ -0,0 +1,95 @@
/*
Copyright (C) 2025 QuantumNous
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
For commercial licensing, please contact support@quantumnous.com
*/
import { defineConfig } from 'i18next-cli';
/** @type {import('i18next-cli').I18nextToolkitConfig} */
export default defineConfig({
locales: [
"zh",
"en",
"fr",
"ru"
],
extract: {
input: [
"src/**/*.{js,jsx,ts,tsx}"
],
ignore: [
"src/i18n/**/*"
],
output: "src/i18n/locales/{{language}}.json",
ignoredAttributes: [
"accept",
"align",
"aria-label",
"autoComplete",
"className",
"clipRule",
"color",
"crossOrigin",
"data-index",
"data-name",
"data-testid",
"data-type",
"defaultActiveKey",
"direction",
"editorType",
"field",
"fill",
"fillRule",
"height",
"hoverStyle",
"htmlType",
"id",
"itemKey",
"key",
"keyPrefix",
"layout",
"margin",
"maxHeight",
"mode",
"name",
"overflow",
"placement",
"position",
"rel",
"role",
"rowKey",
"searchPosition",
"selectedStyle",
"shape",
"size",
"style",
"theme",
"trigger",
"uploadTrigger",
"validateStatus",
"value",
"viewBox",
"width"
],
sort: true,
disablePlurals: false,
removeUnusedKeys: false,
nsSeparator: false,
keySeparator: false,
mergeNamespaces: true
}
});

View File

@@ -49,7 +49,11 @@
"lint:fix": "prettier . --write",
"eslint": "bunx eslint \"**/*.{js,jsx}\" --cache",
"eslint:fix": "bunx eslint \"**/*.{js,jsx}\" --fix --cache",
"preview": "vite preview"
"preview": "vite preview",
"i18n:extract": "bunx i18next-cli extract",
"i18n:status": "bunx i18next-cli status",
"i18n:sync": "bunx i18next-cli sync",
"i18n:lint": "bunx i18next-cli lint"
},
"eslintConfig": {
"extends": [
@@ -81,7 +85,8 @@
"prettier": "^3.0.0",
"tailwindcss": "^3",
"typescript": "4.4.2",
"vite": "^5.2.0"
"vite": "^5.2.0",
"i18next-cli": "^1.10.3"
},
"prettier": {
"singleQuote": true,

View File

@@ -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, FR } from 'country-flag-icons/react/3x2';
import { CN, GB, FR, RU } from 'country-flag-icons/react/3x2';
const LanguageSelector = ({ currentLang, onLanguageChange, t }) => {
return (
@@ -49,6 +49,13 @@ const LanguageSelector = ({ currentLang, onLanguageChange, t }) => {
<FR title='Français' className='!w-5 !h-auto' />
<span>Français</span>
</Dropdown.Item>
<Dropdown.Item
onClick={() => onLanguageChange('ru')}
className={`!flex !items-center !gap-2 !px-3 !py-1.5 !text-sm !text-semi-color-text-0 dark:!text-gray-200 ${currentLang === 'ru' ? '!bg-semi-color-primary-light-default dark:!bg-blue-600 !font-semibold' : 'hover:!bg-semi-color-fill-1 dark:hover:!bg-gray-600'}`}
>
<RU title='Русский' className='!w-5 !h-auto' />
<span>Русский</span>
</Dropdown.Item>
</Dropdown.Menu>
}
>

View File

@@ -24,6 +24,7 @@ import LanguageDetector from 'i18next-browser-languagedetector';
import enTranslation from './locales/en.json';
import frTranslation from './locales/fr.json';
import zhTranslation from './locales/zh.json';
import ruTranslation from './locales/ru.json';
i18n
.use(LanguageDetector)
@@ -31,15 +32,10 @@ i18n
.init({
load: 'languageOnly',
resources: {
en: {
translation: enTranslation,
},
zh: {
translation: zhTranslation,
},
fr: {
translation: frTranslation,
},
en: enTranslation,
zh: zhTranslation,
fr: frTranslation,
ru: ruTranslation,
},
fallbackLng: 'zh',
interpolation: {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

2093
web/src/i18n/locales/ru.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -105,7 +105,7 @@ export default function SettingGlobalModel(props) {
})
}
extraText={
'开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启'
t('开启后,所有请求将直接透传给上游,不会进行任何处理(重定向和渠道适配也将失效),请谨慎开启')
}
/>
</Col>
@@ -116,7 +116,7 @@ export default function SettingGlobalModel(props) {
<Col span={24}>
<Banner
type='warning'
description='警告启用保活后如果已经写入保活数据后渠道出错系统无法重试如果必须开启推荐设置尽可能大的Ping间隔'
description={t('警告启用保活后如果已经写入保活数据后渠道出错系统无法重试如果必须开启推荐设置尽可能大的Ping间隔')}
/>
</Col>
</Row>
@@ -131,7 +131,7 @@ export default function SettingGlobalModel(props) {
'general_setting.ping_interval_enabled': value,
})
}
extraText={'开启后将定期发送ping数据保持连接活跃'}
extraText={t('开启后将定期发送ping数据保持连接活跃')}
/>
</Col>
<Col xs={24} sm={12} md={8} lg={8} xl={8}>