fix(i18n): 补齐 de/es/fr 的 OrcaRouter 与实验性徽标键,统一实验性措辞

- de/es/fr(2.0 新增语言)补 common.experimental、providers.orcarouter、
  searchModels/noMatchingModels/orcarouterCatalogHint/orcarouterAsrCatalogHint
- streamingInsertTitleLinux/sherpaTitle 等按 experimentalTitles 测试统一措辞
- 移除 locale 强制同步输出语言的 effect:2.0 设计为 UI 语言独立于输出/
  识别语言(locale-lifecycle 测试守护),保留偏好写入门控本身
This commit is contained in:
sim committed 2026-09-09 13:28:48 +08:00
1 parent cd18fe7174
commit e9185e48ce
7 files changed
+21 -35

No files matched your search

+6
View File
@@ -56,6 +56,7 @@ export const de: typeof zhCN = {
hide: 'Ausblenden',
saved: 'Gespeichert',
saving: 'Wird gespeichert…',
experimental: 'Experimentell',
copied: 'Kopiert',
operationFailed: 'Vorgang fehlgeschlagen',
add: 'Hinzufügen',
@@ -1288,6 +1289,7 @@ export const de: typeof zhCN = {
mimo: 'Xiaomi MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter (kostenlose Modelle)',
orcarouter: 'OrcaRouter',
alibabaCoding: 'Alibaba Cloud Coding Plan',
codingPlanX: 'CodingPlanX',
minimax: 'MiniMax (M3)',
@@ -1426,6 +1428,10 @@ export const de: typeof zhCN = {
modelMissing: 'Kein Modell eingerichtet. Gib zuerst eine Modell-ID ein.',
modelsEmpty: 'Die Zugangsdaten sind gültig, aber es wurden keine Modelle zurückgegeben.',
modelsLoaded: 'Abgerufene Modelle: {{count}}.',
searchModels: 'Modelle suchen…',
noMatchingModels: 'Keine passenden Modelle',
orcarouterCatalogHint: 'Geladen aus OrcaRouter /models. Wähle ein Katalog-Modell; manuelle Modell-IDs sind für diesen Anbieter deaktiviert.',
orcarouterAsrCatalogHint: 'Geladen aus OrcaRouter /models, begrenzt auf Gemini-Modelle mit Audio-Eingabe. Manuelle Modell-IDs sind deaktiviert.',
selectModel: 'Wähle ein Modell, um das Feld oben auszufüllen',
modelSaved: 'Modell {{model}} gespeichert.',
validateSuccess: 'Verbindungsprüfung bestanden.',
+1 -1
View File
@@ -2037,7 +2037,7 @@ export const en: typeof zhCN = {
foundryModelBaseDesc: 'Faster with lower resource use for lightweight daily dictation.',
foundryModelTiny: 'Whisper Tiny (fastest / smoke test)',
foundryModelTinyDesc: 'Fastest check option for confirming the Foundry path works.',
sherpaTitle: 'Windows sherpa-onnx Local (experimental)',
sherpaTitle: 'Windows sherpa-onnx Local (Experimental)',
sherpaDesc:
'Windows uses sherpa-onnx for offline batch recognition on this device with no ASR API key.',
sherpaRuntimeReady: 'Model loaded',
+6
View File
@@ -56,6 +56,7 @@ export const es: typeof zhCN = {
hide: 'Ocultar',
saved: 'Guardado',
saving: 'Guardando…',
experimental: 'Experimental',
copied: 'Copiado',
operationFailed: 'La operación falló',
add: 'Añadir',
@@ -1280,6 +1281,7 @@ export const es: typeof zhCN = {
mimo: 'Xiaomi MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter (modelos gratuitos)',
orcarouter: 'OrcaRouter',
alibabaCoding: 'Alibaba Cloud Coding Plan',
codingPlanX: 'CodingPlanX',
minimax: 'MiniMax (M3)',
@@ -1417,6 +1419,10 @@ export const es: typeof zhCN = {
modelMissing: 'No hay ningún modelo configurado. Introduce primero su ID.',
modelsEmpty: 'Las credenciales son válidas, pero no se recibieron modelos.',
modelsLoaded: 'Se han obtenido {{count}} modelos.',
searchModels: 'Buscar modelos…',
noMatchingModels: 'Sin modelos coincidentes',
orcarouterCatalogHint: 'Cargado desde /models de OrcaRouter. Selecciona un modelo del catálogo; los IDs manuales están desactivados para este proveedor.',
orcarouterAsrCatalogHint: 'Cargado desde /models de OrcaRouter y limitado a modelos Gemini compatibles con entrada de audio. Los IDs manuales están desactivados.',
selectModel: 'Elige un modelo para completar el campo de arriba',
modelSaved: 'Modelo {{model}} guardado.',
validateSuccess: 'Conexión comprobada correctamente.',
+6
View File
@@ -56,6 +56,7 @@ export const fr: typeof zhCN = {
hide: 'Masquer',
saved: 'Enregistré',
saving: 'Enregistrement…',
experimental: 'Expérimental',
copied: 'Copié',
operationFailed: 'L’opération a échoué',
add: 'Ajouter',
@@ -1297,6 +1298,7 @@ export const fr: typeof zhCN = {
mimo: 'Xiaomi MiMo',
cometapi: 'CometAPI',
openrouterFree: 'OpenRouter (modèles gratuits)',
orcarouter: 'OrcaRouter',
alibabaCoding: 'Alibaba Cloud Coding Plan',
codingPlanX: 'CodingPlanX',
minimax: 'MiniMax (M3)',
@@ -1437,6 +1439,10 @@ export const fr: typeof zhCN = {
modelMissing: 'Aucun modèle configuré. Saisissez d’abord un ID de modèle.',
modelsEmpty: 'Les identifiants sont valides, mais aucun modèle n’a été renvoyé.',
modelsLoaded: '{{count}} modèles récupérés.',
searchModels: 'Rechercher des modèles…',
noMatchingModels: 'Aucun modèle correspondant',
orcarouterCatalogHint: 'Chargé depuis /models d’OrcaRouter. Sélectionnez un modèle du catalogue ; les IDs manuels sont désactivés pour ce fournisseur.',
orcarouterAsrCatalogHint: 'Chargé depuis /models d’OrcaRouter et limité aux modèles Gemini compatibles avec l’entrée audio. Les IDs manuels sont désactivés.',
selectModel: 'Sélectionnez un modèle pour remplir le champ ci-dessus',
modelSaved: 'Modèle {{model}} enregistré.',
validateSuccess: 'Connexion vérifiée avec succès.',
+1 -1
View File
@@ -1558,7 +1558,7 @@ export const zhCN = {
multimodalPipelineHint:
'开启后,「服务 → AI 提供商」页出现「传统模式 / 多模态模式」切换。传统 = ASR + LLM;多模态 = 单个支持音频的模型。两套配置分开存储、绝不共享凭据。',
streamingInsertTitle: '流式输入',
streamingInsertTitleLinux: '流式输入(实验)',
streamingInsertTitleLinux: '流式输入(实验性)',
streamingInsertDesc: '逐字实时插入,降低感知延迟。不满足条件时回落到一次性粘贴。',
streamingInsertLabel: '流式输入',
streamingInsertHintMac: '临时切到 ABC 输入源,避免 CJK IME 拦截,会话结束后自动切回。',
+1 -1
View File
@@ -1544,7 +1544,7 @@ export const zhTW: typeof zhCN = {
multimodalPipelineHint:
'開啟後,「服務 → AI 提供者」頁出現「傳統模式 / 多模態模式」切換。傳統 = ASR + LLM;多模態 = 單一支援音訊的模型。兩套設定分開儲存、絕不共用憑證。',
streamingInsertTitle: '流式輸入',
streamingInsertTitleLinux: '流式輸入(實驗)',
streamingInsertTitleLinux: '流式輸入(實驗性)',
streamingInsertDesc: '逐字即時插入,降低感知延遲。不滿足條件時回落到一次性貼上。',
streamingInsertLabel: '流式輸入',
streamingInsertHintMac: '臨時切到 ABC 輸入源,避免 CJK IME 攔截,會話結束後自動切回。',
@@ -10,7 +10,6 @@ import {
} from 'react';
import { getHotkeyCapability, getSettings, isTauri, setSettings } from '../lib/ipc';
import type { HotkeyBinding, HotkeyCapability, UserPreferences } from '../lib/types';
import i18n, { outputPrefsForLocale, type SupportedLocale } from '../i18n';
import { applyThemeFromPreference } from '../lib/themeMode';
import { applyStackedLayoutFromPrefs } from '../lib/stackedLayout';
import { applyConservativeLayout } from '../lib/conservativeLayout';
@@ -176,37 +175,6 @@ export function HotkeySettingsProvider({ children }: { children: ReactNode }) {
[queueSetSettings],
);
// App 语言与输出语言偏好保持一致:界面切到某个语言后,输出偏好
// (chineseScriptPreference / outputLanguagePreference)跟随该语言,
// 避免「界面中文、输出英文」的隐性不一致。
useEffect(() => {
const currentPrefs = latestPrefsRef.current;
if (!currentPrefs) return;
const lang = (i18n.resolvedLanguage || i18n.language || '').toLowerCase();
const resolvedLocale: SupportedLocale =
lang.startsWith('zh-tw') || lang.includes('hant')
? 'zh-TW'
: lang.startsWith('zh-cn') || lang.startsWith('zh')
? 'zh-CN'
: lang.startsWith('ja')
? 'ja'
: lang.startsWith('ko')
? 'ko'
: 'en';
const nextLocalePrefs = outputPrefsForLocale(resolvedLocale);
if (
currentPrefs.chineseScriptPreference === nextLocalePrefs.chineseScriptPreference &&
currentPrefs.outputLanguagePreference === nextLocalePrefs.outputLanguagePreference
) {
return;
}
const merged = { ...currentPrefs, ...nextLocalePrefs };
latestPrefsRef.current = merged;
setPrefs(merged);
void queueSetSettings(merged).catch((error) => {
console.warn('[settings] sync locale output preferences failed', error);
});
}, [prefs, queueSetSettings]);
const value = useMemo<HotkeySettingsContextValue>(
() => ({