From 029ac5efee5c7f0408d054eeb2adc62be3ccf7e5 Mon Sep 17 00:00:00 2001 From: CityFun <31820853+zhengkunwang223@users.noreply.github.com> Date: Tue, 7 Jul 2026 18:42:55 +0800 Subject: [PATCH] feat: add some translate (#13215) --- core/constant/common.go | 2 + .../src/components/layout-content/index.vue | 15 ++++-- frontend/src/lang/modules/en.ts | 52 +++++++++++++++++++ frontend/src/lang/modules/es-es.ts | 52 +++++++++++++++++++ frontend/src/lang/modules/fa.ts | 52 +++++++++++++++++++ frontend/src/lang/modules/ja.ts | 51 ++++++++++++++++++ frontend/src/lang/modules/ko.ts | 51 ++++++++++++++++++ frontend/src/lang/modules/ms.ts | 52 +++++++++++++++++++ frontend/src/lang/modules/pt-br.ts | 52 +++++++++++++++++++ frontend/src/lang/modules/ru.ts | 51 ++++++++++++++++++ frontend/src/lang/modules/tr.ts | 52 +++++++++++++++++++ frontend/src/lang/modules/zh-Hant.ts | 48 +++++++++++++++++ frontend/src/lang/modules/zh.ts | 48 +++++++++++++++++ 13 files changed, 575 insertions(+), 3 deletions(-) diff --git a/core/constant/common.go b/core/constant/common.go index 2d99a496f..cfe3e72d2 100644 --- a/core/constant/common.go +++ b/core/constant/common.go @@ -63,8 +63,10 @@ var WebUrlMap = map[string]struct{}{ "/ai/ai-proxy/api-keys": {}, "/ai/ai-proxy/groups": {}, "/ai/ai-proxy/model-groups": {}, + "/ai/ai-proxy/smart-route": {}, "/ai/ai-proxy/usage": {}, "/ai/ai-proxy/content": {}, + "/ai/ai-proxy/setting": {}, "/ai/skills-hub": {}, "/ai/skills-hub/targets": {}, "/ai/benchmark": {}, diff --git a/frontend/src/components/layout-content/index.vue b/frontend/src/components/layout-content/index.vue index 9b9f6597f..42d7129c2 100644 --- a/frontend/src/components/layout-content/index.vue +++ b/frontend/src/components/layout-content/index.vue @@ -19,7 +19,7 @@
-
+
-
+
@@ -87,6 +87,12 @@ const showBack = computed(() => { const { backPath, backName, backTo, reload } = prop; return backPath || backName || backTo || reload; }); +const hasTitleContent = computed(() => { + return Boolean( + slots.title || slots.leftToolBar || slots.rightToolBar || slots.toolbar || prop.divider || showBack.value, + ); +}); +const hasMainTopGap = computed(() => hasTitleContent.value || Boolean(slots.prompt)); diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index beda16531..f74a05d19 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -967,10 +967,16 @@ const message = { streamIdleTimeoutSeconds: 'Stream Idle Timeout (s)', maxBodyMb: 'Max Body Size (MB)', runtimeRefreshSeconds: 'Runtime Refresh Interval (s)', + logRetentionDays: 'AI Gateway Log Retention (days)', + clearLogs: 'Clear Logs', + clearLogsConfirm: + 'This will clear AI Gateway usage statistics, content compliance audits, smart routing decisions, request body logs, and service logs. Continue?', usageRetentionDays: 'Usage Statistics Retention (days)', contentAuditRetentionDays: 'Content Compliance Audit Retention (days)', logCleanupIntervalHours: 'Log Cleanup Interval (hours)', requestBodyLog: 'Request Body Log', + requestBodyLogDesc: + 'Writes AI Gateway request and response bodies to Elasticsearch for search, audit, and troubleshooting.', requestBodyLogIndexPrefix: 'Index Prefix', requestBodyLogRetentionDays: 'Request Body Log Retention (days)', requestBodyLogMaxBodyKb: 'Max Request Body Size (KB)', @@ -1062,6 +1068,52 @@ const message = { matchedGroups: 'Matched groups', importResult: 'Imported {0}, duplicated {1}, invalid {2}', auditLogs: 'Audit Logs', + smartRoute: 'Smart Route', + smartRoutePolicy: 'Route Policy', + routeConfig: 'Route Config', + embeddingConfig: 'Embedding Settings', + embeddingConfigDesc: + 'Used for Smart Route and content compliance semantic sample matching. Configure it before rebuilding sample vectors.', + decisionConfig: 'Decision Params', + simpleModelGroup: 'Simple Model Group', + complexModelGroup: 'Complex Model Group', + embeddingEndpoint: 'Endpoint', + embeddingModel: 'Model', + embeddingApiKey: 'API Key', + routeThreshold: 'Route Threshold', + routeThresholdHelper: 'Only classify simple/complex when similarity is above this value.', + auditThreshold: 'Audit Threshold', + auditThresholdHelper: 'Only treat audit samples as matched when similarity is above this value.', + topK: 'TopK', + topKHelper: 'Number of most similar samples to compare each time.', + selectionStrategy: 'Selection Strategy', + members: 'Members', + samples: 'Samples', + rebuildVectors: 'Rebuild Vectors', + rebuildVectorsConfirm: + 'Rebuilding vectors will request the Embedding service to process samples again. Continue?', + route: 'Route', + audit: 'Audit', + auditSamples: 'Audit Samples', + sampleText: 'Text', + sampleLabel: 'Label', + vectorModel: 'Vector Model', + vectorDim: 'Dimension', + threshold: 'Threshold', + preview: 'Preview', + previewPlaceholder: 'Input request text', + confidence: 'Confidence', + source: 'Source', + sourceHeuristic: 'Rule-based', + sourceEmbedding: 'Sample Match', + latency: 'Latency', + decisionLogs: 'Decision Logs', + requestID: 'Request ID', + simple: 'Simple', + complex: 'Complex', + latencyMs: 'Latency(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: 'One sample per line', }, skillsHub: { title: 'Skills Hub', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index 50a478a04..f832af417 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -978,10 +978,16 @@ const message = { streamIdleTimeoutSeconds: 'Timeout de inactividad streaming (s)', maxBodyMb: 'Tamaño máximo del cuerpo (MB)', runtimeRefreshSeconds: 'Intervalo de actualización runtime (s)', + logRetentionDays: 'Retención de logs del gateway de IA (días)', + clearLogs: 'Limpiar logs', + clearLogsConfirm: + 'Se limpiarán las estadísticas de uso, auditorías de cumplimiento, decisiones de enrutamiento, logs del cuerpo de solicitud y logs del servicio del gateway de IA. ¿Continuar?', usageRetentionDays: 'Retención de estadísticas de uso (días)', contentAuditRetentionDays: 'Retención de auditoría de cumplimiento de contenido (días)', logCleanupIntervalHours: 'Intervalo de limpieza de logs (horas)', requestBodyLog: 'Log del cuerpo de solicitud', + requestBodyLogDesc: + 'Escribe cuerpos de solicitud y respuesta de AI Gateway en Elasticsearch para búsqueda, auditoría y diagnóstico.', requestBodyLogIndexPrefix: 'Prefijo del índice', requestBodyLogRetentionDays: 'Retención del log del cuerpo de solicitud (días)', requestBodyLogMaxBodyKb: 'Tamaño máximo del cuerpo de solicitud (KB)', @@ -1074,6 +1080,52 @@ const message = { matchedGroups: 'Matched groups', importResult: 'Imported {0}, duplicated {1}, invalid {2}', auditLogs: 'Audit Logs', + smartRoute: 'Enrutamiento inteligente', + smartRoutePolicy: 'Política de enrutamiento', + routeConfig: 'Configuración de enrutamiento', + embeddingConfig: 'Configuración de embedding', + embeddingConfigDesc: + 'Se usa para enrutamiento inteligente y coincidencia semántica de muestras de cumplimiento de contenido. Configúralo antes de reconstruir vectores.', + decisionConfig: 'Parámetros de decisión', + simpleModelGroup: 'Grupo de modelos simples', + complexModelGroup: 'Grupo de modelos complejos', + embeddingEndpoint: 'Endpoint', + embeddingModel: 'Modelo', + embeddingApiKey: 'API Key', + routeThreshold: 'Umbral de enrutamiento', + routeThresholdHelper: 'Solo clasifica simple/complejo si la similitud supera este valor.', + auditThreshold: 'Umbral de auditoría', + auditThresholdHelper: 'Solo considera coincidencia de auditoría si la similitud supera este valor.', + topK: 'TopK', + topKHelper: 'Número de muestras más similares para comparar cada vez.', + selectionStrategy: 'Estrategia de selección', + members: 'Miembros', + samples: 'Muestras', + rebuildVectors: 'Reconstruir vectores', + rebuildVectorsConfirm: + 'Reconstruir vectores volverá a solicitar al servicio Embedding que procese las muestras. ¿Continuar?', + route: 'Ruta', + audit: 'Auditoría', + auditSamples: 'Muestras de auditoría', + sampleText: 'Texto', + sampleLabel: 'Etiqueta', + vectorModel: 'Modelo vectorial', + vectorDim: 'Dimensión', + threshold: 'Umbral', + preview: 'Vista previa', + previewPlaceholder: 'Introduce el texto de la solicitud', + confidence: 'Confianza', + source: 'Fuente', + sourceHeuristic: 'Reglas', + sourceEmbedding: 'Coincidencia de muestras', + latency: 'Latencia', + decisionLogs: 'Registros de decisión', + requestID: 'ID de solicitud', + simple: 'Simple', + complex: 'Complejo', + latencyMs: 'Latencia(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: 'Una muestra por línea', apiKeyCount: 'Cantidad', }, skillsHub: { diff --git a/frontend/src/lang/modules/fa.ts b/frontend/src/lang/modules/fa.ts index 0d9e5565f..421adae22 100644 --- a/frontend/src/lang/modules/fa.ts +++ b/frontend/src/lang/modules/fa.ts @@ -950,10 +950,16 @@ const message = { streamIdleTimeoutSeconds: 'مهلت بیکاری جریان (ثانیه)', maxBodyMb: 'حداکثر اندازه بدنه (MB)', runtimeRefreshSeconds: 'فاصله بازخوانی زمان اجرا (ثانیه)', + logRetentionDays: 'مدت نگهداری لاگ دروازه AI (روز)', + clearLogs: 'پاک کردن لاگ‌ها', + clearLogsConfirm: + 'آمار استفاده، حسابرسی انطباق محتوا، تصمیم‌های مسیریابی هوشمند، لاگ بدنه درخواست و لاگ سرویس دروازه AI پاک می‌شود. ادامه می‌دهید؟', usageRetentionDays: 'مدت نگهداری آمار استفاده (روز)', contentAuditRetentionDays: 'مدت نگهداری حسابرسی انطباق محتوا (روز)', logCleanupIntervalHours: 'فاصله پاک‌سازی لاگ (ساعت)', requestBodyLog: 'لاگ بدنه درخواست', + requestBodyLogDesc: + 'بدنه درخواست و پاسخ AI Gateway را برای جستجو، بازبینی و عیب‌یابی در Elasticsearch می‌نویسد.', requestBodyLogIndexPrefix: 'پیشوند ایندکس', requestBodyLogRetentionDays: 'مدت نگهداری لاگ بدنه درخواست (روز)', requestBodyLogMaxBodyKb: 'حداکثر اندازه بدنه درخواست (KB)', @@ -1043,6 +1049,52 @@ const message = { matchedGroups: 'گروه‌های تطابق یافته', importResult: 'وارد شد {0}، تکراری {1}، نامعتبر {2}', auditLogs: 'لاگ‌های حسابرسی', + smartRoute: 'مسیریابی هوشمند', + smartRoutePolicy: 'سیاست مسیریابی', + routeConfig: 'پیکربندی مسیریابی', + embeddingConfig: 'پیکربندی Embedding', + embeddingConfigDesc: + 'برای مسیریابی هوشمند و تطبیق معنایی نمونه‌های انطباق محتوا استفاده می‌شود. پیش از بازسازی بردارهای نمونه آن را پیکربندی کنید.', + decisionConfig: 'پارامترهای تصمیم', + simpleModelGroup: 'گروه مدل ساده', + complexModelGroup: 'گروه مدل پیچیده', + embeddingEndpoint: 'نقطه پایانی', + embeddingModel: 'مدل', + embeddingApiKey: 'کلید API', + routeThreshold: 'آستانه مسیریابی', + routeThresholdHelper: 'فقط وقتی شباهت بالاتر از این مقدار باشد ساده/پیچیده تشخیص داده می‌شود.', + auditThreshold: 'آستانه بازبینی', + auditThresholdHelper: 'فقط وقتی شباهت بالاتر از این مقدار باشد نمونه بازبینی تطبیق محسوب می‌شود.', + topK: 'TopK', + topKHelper: 'تعداد شبیه‌ترین نمونه‌هایی که هر بار مقایسه می‌شوند.', + selectionStrategy: 'راهبرد انتخاب', + members: 'اعضا', + samples: 'نمونه‌ها', + rebuildVectors: 'بازسازی بردارها', + rebuildVectorsConfirm: + 'بازسازی بردارها باعث می‌شود سرویس Embedding دوباره نمونه‌ها را پردازش کند. ادامه می‌دهید؟', + route: 'مسیر', + audit: 'بازبینی', + auditSamples: 'نمونه‌های بازبینی', + sampleText: 'متن', + sampleLabel: 'برچسب', + vectorModel: 'مدل برداری', + vectorDim: 'بعد', + threshold: 'آستانه', + preview: 'پیش‌نمایش', + previewPlaceholder: 'متن درخواست را وارد کنید', + confidence: 'اطمینان', + source: 'منبع', + sourceHeuristic: 'قضاوت بر اساس قانون', + sourceEmbedding: 'تطبیق نمونه', + latency: 'تاخیر', + decisionLogs: 'گزارش تصمیم‌ها', + requestID: 'شناسه درخواست', + simple: 'ساده', + complex: 'پیچیده', + latencyMs: 'تاخیر(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: 'هر خط یک نمونه', }, skillsHub: { title: 'مرکز مهارت', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index cbb086391..504200370 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -967,10 +967,16 @@ const message = { streamIdleTimeoutSeconds: 'ストリーミングアイドルタイムアウト(秒)', maxBodyMb: '最大リクエスト本文(MB)', runtimeRefreshSeconds: 'Runtime 更新間隔(秒)', + logRetentionDays: 'AI ゲートウェイログ保持日数', + clearLogs: 'ログをクリア', + clearLogsConfirm: + 'AI ゲートウェイの使用統計、コンテンツコンプライアンス監査、スマートルーティング判断、リクエスト本文ログ、サービスログをクリアします。続行しますか?', usageRetentionDays: '使用統計保持日数', contentAuditRetentionDays: 'コンテンツコンプライアンス監査ログ保持日数', logCleanupIntervalHours: 'ログクリーンアップ間隔(時間)', requestBodyLog: 'リクエスト本文ログ', + requestBodyLogDesc: + 'AI Gateway のリクエスト本文とレスポンス本文を Elasticsearch に保存し、検索、監査、トラブルシュートに使用します。', requestBodyLogIndexPrefix: 'インデックスプレフィックス', requestBodyLogRetentionDays: 'リクエスト本文ログ保持日数', requestBodyLogMaxBodyKb: '最大リクエスト本文サイズ(KB)', @@ -1062,6 +1068,51 @@ const message = { matchedGroups: 'Matched groups', importResult: 'Imported {0}, duplicated {1}, invalid {2}', auditLogs: 'Audit Logs', + smartRoute: 'スマートルーティング', + smartRoutePolicy: 'ルーティングポリシー', + routeConfig: 'ルーティング設定', + embeddingConfig: 'Embedding 設定', + embeddingConfigDesc: + 'スマートルーティングとコンテンツコンプライアンスの意味サンプル照合に使用します。サンプルベクトルを再構築する前に設定してください。', + decisionConfig: '判定パラメータ', + simpleModelGroup: '簡単モデルグループ', + complexModelGroup: '複雑モデルグループ', + embeddingEndpoint: 'エンドポイント', + embeddingModel: 'モデル', + embeddingApiKey: 'API Key', + routeThreshold: 'ルーティングしきい値', + routeThresholdHelper: '類似度がこの値を超えた場合のみ簡単/複雑を判定します。', + auditThreshold: '監査しきい値', + auditThresholdHelper: '類似度がこの値を超えた場合のみ監査サンプルに命中とします。', + topK: 'TopK', + topKHelper: '毎回比較する最も類似したサンプル数です。', + selectionStrategy: '選択戦略', + members: 'メンバー', + samples: 'サンプル', + rebuildVectors: 'ベクトルを再構築', + rebuildVectorsConfirm: 'ベクトルを再構築すると、Embedding サービスでサンプルを再処理します。続行しますか?', + route: 'ルート', + audit: '監査', + auditSamples: '監査サンプル', + sampleText: 'テキスト', + sampleLabel: 'ラベル', + vectorModel: 'ベクトルモデル', + vectorDim: '次元', + threshold: 'しきい値', + preview: 'プレビュー', + previewPlaceholder: 'リクエストテキストを入力', + confidence: '信頼度', + source: 'ソース', + sourceHeuristic: 'ルール判定', + sourceEmbedding: 'サンプル一致', + latency: 'レイテンシ', + decisionLogs: '判断ログ', + requestID: 'リクエスト ID', + simple: '簡単', + complex: '複雑', + latencyMs: 'レイテンシ(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: '1行に1つのサンプル', apiKeyCount: '数量', }, skillsHub: { diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index 60d20607d..3a4747250 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -952,10 +952,16 @@ const message = { streamIdleTimeoutSeconds: '스트리밍 유휴 시간 초과(초)', maxBodyMb: '최대 요청 본문(MB)', runtimeRefreshSeconds: 'Runtime 새로고침 간격(초)', + logRetentionDays: 'AI 게이트웨이 로그 보관 일수', + clearLogs: '로그 비우기', + clearLogsConfirm: + 'AI 게이트웨이 사용 통계, 콘텐츠 컴플라이언스 감사, 스마트 라우팅 결정, 요청 본문 로그 및 서비스 로그를 비웁니다. 계속하시겠습니까?', usageRetentionDays: '사용 통계 보관 일수', contentAuditRetentionDays: '콘텐츠 컴플라이언스 감사 로그 보관 일수', logCleanupIntervalHours: '로그 정리 간격(시간)', requestBodyLog: '요청 본문 로그', + requestBodyLogDesc: + '검색, 감사, 문제 해결을 위해 AI Gateway 요청 및 응답 본문을 Elasticsearch에 저장합니다.', requestBodyLogIndexPrefix: '인덱스 접두사', requestBodyLogRetentionDays: '요청 본문 로그 보관 일수', requestBodyLogMaxBodyKb: '최대 요청 본문 크기(KB)', @@ -1047,6 +1053,51 @@ const message = { matchedGroups: 'Matched groups', importResult: 'Imported {0}, duplicated {1}, invalid {2}', auditLogs: 'Audit Logs', + smartRoute: '스마트 라우팅', + smartRoutePolicy: '라우팅 정책', + routeConfig: '라우팅 설정', + embeddingConfig: 'Embedding 설정', + embeddingConfigDesc: + '스마트 라우팅과 콘텐츠 컴플라이언스 의미 샘플 매칭에 사용됩니다. 샘플 벡터를 재생성하기 전에 설정하세요.', + decisionConfig: '판정 매개변수', + simpleModelGroup: '간단 모델 그룹', + complexModelGroup: '복잡 모델 그룹', + embeddingEndpoint: '엔드포인트', + embeddingModel: '모델', + embeddingApiKey: 'API Key', + routeThreshold: '라우팅 임계값', + routeThresholdHelper: '유사도가 이 값보다 높을 때만 간단/복잡을 판단합니다.', + auditThreshold: '감사 임계값', + auditThresholdHelper: '유사도가 이 값보다 높을 때만 감사 샘플과 일치한 것으로 봅니다.', + topK: 'TopK', + topKHelper: '매번 비교할 가장 유사한 샘플 수입니다.', + selectionStrategy: '선택 전략', + members: '멤버', + samples: '샘플', + rebuildVectors: '벡터 재생성', + rebuildVectorsConfirm: '벡터를 재생성하면 Embedding 서비스가 샘플을 다시 처리합니다. 계속하시겠습니까?', + route: '라우팅', + audit: '감사', + auditSamples: '감사 샘플', + sampleText: '텍스트', + sampleLabel: '라벨', + vectorModel: '벡터 모델', + vectorDim: '차원', + threshold: '임계값', + preview: '미리보기', + previewPlaceholder: '요청 텍스트 입력', + confidence: '신뢰도', + source: '소스', + sourceHeuristic: '규칙 판단', + sourceEmbedding: '샘플 매칭', + latency: '지연 시간', + decisionLogs: '결정 로그', + requestID: '요청 ID', + simple: '간단', + complex: '복잡', + latencyMs: '지연 시간(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: '한 줄에 샘플 하나', apiKeyCount: '数量', }, skillsHub: { diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index d18a5498c..dac74768c 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -976,10 +976,16 @@ const message = { streamIdleTimeoutSeconds: 'Tamat masa melahu penstriman (s)', maxBodyMb: 'Saiz badan maksimum (MB)', runtimeRefreshSeconds: 'Selang segar semula runtime (s)', + logRetentionDays: 'Pengekalan Log Gateway AI (hari)', + clearLogs: 'Kosongkan Log', + clearLogsConfirm: + 'Ini akan mengosongkan statistik penggunaan, audit pematuhan kandungan, keputusan penghalaan pintar, log badan permintaan dan log perkhidmatan Gateway AI. Teruskan?', usageRetentionDays: 'Pengekalan Statistik Penggunaan (hari)', contentAuditRetentionDays: 'Pengekalan Audit Pematuhan Kandungan (hari)', logCleanupIntervalHours: 'Selang Pembersihan Log (jam)', requestBodyLog: 'Log Badan Permintaan', + requestBodyLogDesc: + 'Menulis badan permintaan dan respons AI Gateway ke Elasticsearch untuk carian, audit dan penyelesaian masalah.', requestBodyLogIndexPrefix: 'Awalan Indeks', requestBodyLogRetentionDays: 'Pengekalan Log Badan Permintaan (hari)', requestBodyLogMaxBodyKb: 'Saiz Maksimum Badan Permintaan (KB)', @@ -1071,6 +1077,52 @@ const message = { matchedGroups: 'Matched groups', importResult: 'Imported {0}, duplicated {1}, invalid {2}', auditLogs: 'Audit Logs', + smartRoute: 'Penghalaan Pintar', + smartRoutePolicy: 'Polisi Penghalaan', + routeConfig: 'Konfigurasi Penghalaan', + embeddingConfig: 'Konfigurasi Embedding', + embeddingConfigDesc: + 'Digunakan untuk penghalaan pintar dan padanan sampel semantik pematuhan kandungan. Konfigurasikan sebelum membina semula vektor sampel.', + decisionConfig: 'Parameter Keputusan', + simpleModelGroup: 'Kumpulan Model Ringkas', + complexModelGroup: 'Kumpulan Model Kompleks', + embeddingEndpoint: 'Endpoint', + embeddingModel: 'Model', + embeddingApiKey: 'API Key', + routeThreshold: 'Ambang Penghalaan', + routeThresholdHelper: 'Hanya nilai di atas ambang ini digunakan untuk menentukan ringkas/kompleks.', + auditThreshold: 'Ambang Audit', + auditThresholdHelper: 'Hanya nilai di atas ambang ini dianggap sepadan dengan sampel audit.', + topK: 'TopK', + topKHelper: 'Bilangan sampel paling serupa yang dibandingkan setiap kali.', + selectionStrategy: 'Strategi Pemilihan', + members: 'Ahli', + samples: 'Sampel', + rebuildVectors: 'Bina Semula Vektor', + rebuildVectorsConfirm: + 'Membina semula vektor akan meminta perkhidmatan Embedding memproses sampel sekali lagi. Teruskan?', + route: 'Laluan', + audit: 'Audit', + auditSamples: 'Sampel Audit', + sampleText: 'Teks', + sampleLabel: 'Label', + vectorModel: 'Model Vektor', + vectorDim: 'Dimensi', + threshold: 'Ambang', + preview: 'Pratonton', + previewPlaceholder: 'Masukkan teks permintaan', + confidence: 'Keyakinan', + source: 'Sumber', + sourceHeuristic: 'Berdasarkan peraturan', + sourceEmbedding: 'Padanan sampel', + latency: 'Latensi', + decisionLogs: 'Log Keputusan', + requestID: 'ID Permintaan', + simple: 'Ringkas', + complex: 'Kompleks', + latencyMs: 'Latensi(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: 'Satu sampel setiap baris', apiKeyCount: 'Kuantiti', }, skillsHub: { diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 7761f22af..c50deda0d 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -972,10 +972,16 @@ const message = { streamIdleTimeoutSeconds: 'Timeout de inatividade do streaming (s)', maxBodyMb: 'Tamanho máximo do corpo (MB)', runtimeRefreshSeconds: 'Intervalo de atualização do runtime (s)', + logRetentionDays: 'Retenção de logs do gateway de IA (dias)', + clearLogs: 'Limpar logs', + clearLogsConfirm: + 'Isso limpará estatísticas de uso, auditorias de conformidade de conteúdo, decisões de roteamento inteligente, logs do corpo da requisição e logs de serviço do gateway de IA. Continuar?', usageRetentionDays: 'Retenção de estatísticas de uso (dias)', contentAuditRetentionDays: 'Retenção de auditoria de conformidade de conteúdo (dias)', logCleanupIntervalHours: 'Intervalo de limpeza de logs (horas)', requestBodyLog: 'Log do corpo da requisição', + requestBodyLogDesc: + 'Grava corpos de requisição e resposta do AI Gateway no Elasticsearch para pesquisa, auditoria e diagnóstico.', requestBodyLogIndexPrefix: 'Prefixo do índice', requestBodyLogRetentionDays: 'Retenção do log do corpo da requisição (dias)', requestBodyLogMaxBodyKb: 'Tamanho máximo do corpo da requisição (KB)', @@ -1068,6 +1074,52 @@ const message = { matchedGroups: 'Matched groups', importResult: 'Imported {0}, duplicated {1}, invalid {2}', auditLogs: 'Audit Logs', + smartRoute: 'Roteamento inteligente', + smartRoutePolicy: 'Política de roteamento', + routeConfig: 'Configuração de roteamento', + embeddingConfig: 'Configurações de embedding', + embeddingConfigDesc: + 'Usado para roteamento inteligente e correspondência semântica de amostras de conformidade de conteúdo. Configure antes de reconstruir vetores.', + decisionConfig: 'Parâmetros de decisão', + simpleModelGroup: 'Grupo de modelos simples', + complexModelGroup: 'Grupo de modelos complexos', + embeddingEndpoint: 'Endpoint', + embeddingModel: 'Modelo', + embeddingApiKey: 'API Key', + routeThreshold: 'Limite de roteamento', + routeThresholdHelper: 'Só classifica simples/complexo quando a similaridade passa deste valor.', + auditThreshold: 'Limite de auditoria', + auditThresholdHelper: 'Só considera amostra de auditoria correspondida acima deste valor.', + topK: 'TopK', + topKHelper: 'Número de amostras mais semelhantes comparadas a cada vez.', + selectionStrategy: 'Estratégia de seleção', + members: 'Membros', + samples: 'Amostras', + rebuildVectors: 'Reconstruir vetores', + rebuildVectorsConfirm: + 'Reconstruir vetores solicitará novamente ao serviço Embedding que processe as amostras. Continuar?', + route: 'Rota', + audit: 'Auditoria', + auditSamples: 'Amostras de auditoria', + sampleText: 'Texto', + sampleLabel: 'Rótulo', + vectorModel: 'Modelo vetorial', + vectorDim: 'Dimensão', + threshold: 'Limite', + preview: 'Pré-visualização', + previewPlaceholder: 'Insira o texto da solicitação', + confidence: 'Confiança', + source: 'Fonte', + sourceHeuristic: 'Regras', + sourceEmbedding: 'Correspondência de amostras', + latency: 'Latência', + decisionLogs: 'Logs de decisão', + requestID: 'ID da solicitação', + simple: 'Simples', + complex: 'Complexo', + latencyMs: 'Latência(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: 'Uma amostra por linha', apiKeyCount: 'Quantidade', }, skillsHub: { diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index a2573b454..f3a0a3e3b 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -966,10 +966,16 @@ const message = { streamIdleTimeoutSeconds: 'Тайм-аут простоя stream (с)', maxBodyMb: 'Максимальный размер тела (MB)', runtimeRefreshSeconds: 'Интервал обновления runtime (с)', + logRetentionDays: 'Хранение журналов AI-шлюза (дни)', + clearLogs: 'Очистить журналы', + clearLogsConfirm: + 'Будут очищены статистика использования AI-шлюза, аудит соответствия контента, решения маршрутизации, журналы тела запросов и сервисные журналы. Продолжить?', usageRetentionDays: 'Хранение статистики использования (дни)', contentAuditRetentionDays: 'Хранение аудита соответствия контента (дни)', logCleanupIntervalHours: 'Интервал очистки журналов (часы)', requestBodyLog: 'Журнал тела запроса', + requestBodyLogDesc: + 'Записывает тела запросов и ответов AI Gateway в Elasticsearch для поиска, аудита и диагностики.', requestBodyLogIndexPrefix: 'Префикс индекса', requestBodyLogRetentionDays: 'Хранение журнала тела запроса (дни)', requestBodyLogMaxBodyKb: 'Максимальный размер тела запроса (KB)', @@ -1062,6 +1068,51 @@ const message = { matchedGroups: 'Matched groups', importResult: 'Imported {0}, duplicated {1}, invalid {2}', auditLogs: 'Audit Logs', + smartRoute: 'Умная маршрутизация', + smartRoutePolicy: 'Политика маршрутизации', + routeConfig: 'Настройка маршрутизации', + embeddingConfig: 'Настройки Embedding', + embeddingConfigDesc: + 'Используется для умной маршрутизации и семантического сопоставления образцов контент-контроля. Настройте перед пересозданием векторов.', + decisionConfig: 'Параметры решения', + simpleModelGroup: 'Группа простых моделей', + complexModelGroup: 'Группа сложных моделей', + embeddingEndpoint: 'Endpoint', + embeddingModel: 'Модель', + embeddingApiKey: 'API Key', + routeThreshold: 'Порог маршрутизации', + routeThresholdHelper: 'Классифицировать простой/сложный запрос только выше этого сходства.', + auditThreshold: 'Порог аудита', + auditThresholdHelper: 'Считать аудит-сэмпл совпавшим только выше этого сходства.', + topK: 'TopK', + topKHelper: 'Количество самых похожих сэмплов для сравнения.', + selectionStrategy: 'Стратегия выбора', + members: 'Участники', + samples: 'Образцы', + rebuildVectors: 'Пересоздать векторы', + rebuildVectorsConfirm: 'Пересоздание векторов снова отправит образцы в сервис Embedding. Продолжить?', + route: 'Маршрут', + audit: 'Аудит', + auditSamples: 'Образцы аудита', + sampleText: 'Текст', + sampleLabel: 'Метка', + vectorModel: 'Векторная модель', + vectorDim: 'Размерность', + threshold: 'Порог', + preview: 'Предпросмотр', + previewPlaceholder: 'Введите текст запроса', + confidence: 'Уверенность', + source: 'Источник', + sourceHeuristic: 'Правила', + sourceEmbedding: 'Совпадение образцов', + latency: 'Задержка', + decisionLogs: 'Логи решений', + requestID: 'ID запроса', + simple: 'Простой', + complex: 'Сложный', + latencyMs: 'Задержка(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: 'Один образец на строку', apiKeyCount: 'Количество', }, skillsHub: { diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index 004660d6b..4dd7aedf2 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -975,10 +975,16 @@ const message = { streamIdleTimeoutSeconds: 'Akış boşta zaman aşımı (sn)', maxBodyMb: 'Maksimum gövde boyutu (MB)', runtimeRefreshSeconds: 'Runtime yenileme aralığı (sn)', + logRetentionDays: 'AI Ağ Geçidi Log Saklama (gün)', + clearLogs: 'Logları Temizle', + clearLogsConfirm: + 'AI Ağ Geçidi kullanım istatistikleri, içerik uyumluluğu denetimleri, akıllı yönlendirme kararları, istek gövdesi logları ve servis logları temizlenecek. Devam edilsin mi?', usageRetentionDays: 'Kullanım İstatistikleri Saklama (gün)', contentAuditRetentionDays: 'İçerik Uyumluluğu Denetim Saklama (gün)', logCleanupIntervalHours: 'Log Temizleme Aralığı (saat)', requestBodyLog: 'İstek Gövdesi Logu', + requestBodyLogDesc: + 'AI Gateway istek ve yanıt gövdelerini arama, denetim ve sorun giderme için Elasticsearch’e yazar.', requestBodyLogIndexPrefix: 'İndeks Öneki', requestBodyLogRetentionDays: 'İstek Gövdesi Log Saklama (gün)', requestBodyLogMaxBodyKb: 'Maksimum İstek Gövdesi Boyutu (KB)', @@ -1071,6 +1077,52 @@ const message = { matchedGroups: 'Matched groups', importResult: 'Imported {0}, duplicated {1}, invalid {2}', auditLogs: 'Audit Logs', + smartRoute: 'Akıllı Yönlendirme', + smartRoutePolicy: 'Yönlendirme Politikası', + routeConfig: 'Yönlendirme Yapılandırması', + embeddingConfig: 'Embedding Yapılandırması', + embeddingConfigDesc: + 'Akıllı yönlendirme ve içerik uyumluluğu semantik örnek eşleştirmesi için kullanılır. Örnek vektörlerini yeniden oluşturmadan önce yapılandırın.', + decisionConfig: 'Karar Parametreleri', + simpleModelGroup: 'Basit Model Grubu', + complexModelGroup: 'Karmaşık Model Grubu', + embeddingEndpoint: 'Endpoint', + embeddingModel: 'Model', + embeddingApiKey: 'API Key', + routeThreshold: 'Yönlendirme Eşiği', + routeThresholdHelper: 'Benzerlik bu değerin üstündeyse basit/karmaşık olarak sınıflandırılır.', + auditThreshold: 'Denetim Eşiği', + auditThresholdHelper: 'Benzerlik bu değerin üstündeyse denetim örneği eşleşmiş sayılır.', + topK: 'TopK', + topKHelper: 'Her seferinde karşılaştırılacak en benzer örnek sayısı.', + selectionStrategy: 'Seçim Stratejisi', + members: 'Üyeler', + samples: 'Örnekler', + rebuildVectors: 'Vektörleri Yeniden Oluştur', + rebuildVectorsConfirm: + 'Vektörleri yeniden oluşturmak, Embedding hizmetinin örnekleri tekrar işlemesini ister. Devam edilsin mi?', + route: 'Rota', + audit: 'Denetim', + auditSamples: 'Denetim Örnekleri', + sampleText: 'Metin', + sampleLabel: 'Etiket', + vectorModel: 'Vektör Modeli', + vectorDim: 'Boyut', + threshold: 'Eşik', + preview: 'Önizleme', + previewPlaceholder: 'İstek metnini girin', + confidence: 'Güven', + source: 'Kaynak', + sourceHeuristic: 'Kural tabanlı', + sourceEmbedding: 'Örnek eşleşmesi', + latency: 'Gecikme', + decisionLogs: 'Karar Logları', + requestID: 'İstek ID', + simple: 'Basit', + complex: 'Karmaşık', + latencyMs: 'Gecikme(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: 'Her satıra bir örnek', apiKeyCount: 'Miktar', }, skillsHub: { diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 87b0c88a2..b04e5e313 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -913,10 +913,14 @@ const message = { streamIdleTimeoutSeconds: '串流空閒逾時(秒)', maxBodyMb: '最大請求體(MB)', runtimeRefreshSeconds: 'Runtime 刷新間隔(秒)', + logRetentionDays: 'AI 閘道日誌保留天數', + clearLogs: '清空日誌', + clearLogsConfirm: '將清空 AI 閘道用量統計、內容合規審計、智慧路由決策、請求體日誌和服務日誌,是否繼續?', usageRetentionDays: '用量統計保留天數', contentAuditRetentionDays: '內容合規審計日誌保留天數', logCleanupIntervalHours: '日誌清理間隔(小時)', requestBodyLog: '請求體日誌', + requestBodyLogDesc: '用於將 AI 閘道請求與回應內容寫入 Elasticsearch,便於檢索、審計和問題排查。', requestBodyLogIndexPrefix: '索引前綴', requestBodyLogRetentionDays: '請求體日誌保留天數', requestBodyLogMaxBodyKb: '單請求體最大保存大小(KB)', @@ -1008,6 +1012,50 @@ const message = { matchedGroups: '命中分組', importResult: '匯入成功 {0} 條,重複 {1} 條,無效 {2} 條', auditLogs: '審計日誌', + smartRoute: '智慧路由', + smartRoutePolicy: '路由策略', + routeConfig: '路由配置', + embeddingConfig: 'Embedding 設定', + embeddingConfigDesc: '用於智慧路由和內容合規語義樣本匹配,配置後可重建樣本向量。', + decisionConfig: '判定參數', + simpleModelGroup: '簡單模型組', + complexModelGroup: '複雜模型組', + embeddingEndpoint: '位址', + embeddingModel: '模型', + embeddingApiKey: 'API Key', + routeThreshold: '路由閾值', + routeThresholdHelper: '高於該相似度才按樣本判斷簡單/複雜。', + auditThreshold: '審核閾值', + auditThresholdHelper: '高於該相似度才認為命中審核樣本。', + topK: 'TopK', + topKHelper: '每次取最相似的樣本數量。', + selectionStrategy: '選擇策略', + members: '成員', + samples: '樣本', + rebuildVectors: '重建向量', + rebuildVectorsConfirm: '重建向量會重新請求 Embedding 服務處理樣本,是否繼續?', + route: '路由', + audit: '審核', + auditSamples: '審核樣本', + sampleText: '文字', + sampleLabel: '標籤', + vectorModel: '向量模型', + vectorDim: '維度', + threshold: '閾值', + preview: '預覽', + previewPlaceholder: '輸入請求文字', + confidence: '置信度', + source: '來源', + sourceHeuristic: '規則判斷', + sourceEmbedding: '樣本匹配', + latency: '耗時', + decisionLogs: '決策日誌', + requestID: '請求 ID', + simple: '簡單', + complex: '複雜', + latencyMs: '耗時(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: '每行一個樣本', apiKeyCount: '數量', }, skillsHub: { diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index c73627625..f8251885c 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -907,10 +907,14 @@ const message = { streamIdleTimeoutSeconds: '流式空闲超时(秒)', maxBodyMb: '最大请求体(MB)', runtimeRefreshSeconds: 'Runtime 刷新间隔(秒)', + logRetentionDays: 'AI 网关日志保留天数', + clearLogs: '清空日志', + clearLogsConfirm: '将清空 AI 网关用量统计、内容合规审计、智能路由决策、请求体日志和服务日志,是否继续?', usageRetentionDays: '用量统计保留天数', contentAuditRetentionDays: '内容合规审计日志保留天数', logCleanupIntervalHours: '日志清理间隔(小时)', requestBodyLog: '请求体日志', + requestBodyLogDesc: '用于将 AI 网关请求与响应内容写入 Elasticsearch,便于检索、审计和问题排查。', requestBodyLogIndexPrefix: '索引前缀', requestBodyLogRetentionDays: '请求体日志保留天数', requestBodyLogMaxBodyKb: '单请求体最大保存大小(KB)', @@ -1002,6 +1006,50 @@ const message = { matchedGroups: '命中分组', importResult: '导入成功 {0} 条,重复 {1} 条,无效 {2} 条', auditLogs: '审计日志', + smartRoute: '智能路由', + smartRoutePolicy: '路由策略', + routeConfig: '路由配置', + embeddingConfig: 'Embedding 设置', + embeddingConfigDesc: '用于智能路由和内容合规语义样本匹配,配置后可重建样本向量。', + decisionConfig: '判定参数', + simpleModelGroup: '简单模型组', + complexModelGroup: '复杂模型组', + embeddingEndpoint: '地址', + embeddingModel: '模型', + embeddingApiKey: 'API Key', + routeThreshold: '路由阈值', + routeThresholdHelper: '高于该相似度才按样本判断简单/复杂。', + auditThreshold: '审核阈值', + auditThresholdHelper: '高于该相似度才认为命中审核样本。', + topK: 'TopK', + topKHelper: '每次取最相似的样本数量。', + selectionStrategy: '选择策略', + members: '成员', + samples: '样本', + rebuildVectors: '重建向量', + rebuildVectorsConfirm: '重建向量会重新请求 Embedding 服务处理样本,是否继续?', + route: '路由', + audit: '审核', + auditSamples: '审核样本', + sampleText: '文本', + sampleLabel: '标签', + vectorModel: '向量模型', + vectorDim: '维度', + threshold: '阈值', + preview: '预览', + previewPlaceholder: '输入请求文本', + confidence: '置信度', + source: '来源', + sourceHeuristic: '规则判断', + sourceEmbedding: '样本匹配', + latency: '耗时', + decisionLogs: '决策日志', + requestID: '请求 ID', + simple: '简单', + complex: '复杂', + latencyMs: '耗时(ms)', + sampleLabelPlaceholder: 'simple / complex / high', + sampleImportPlaceholder: '每行一个样本', }, skillsHub: { title: 'Skills Hub',