From 7bc72915cb527ebc19205084a9d6ea06dda11ab6 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Thu, 18 Sep 2025 13:39:09 -0600 Subject: [PATCH 1/4] feat(zai): consolidate to two coding entrypoints (International/China) and update tests/UI; default to 'international'; update endpoints to /api/coding/paas/v4 --- packages/types/src/provider-settings.ts | 2 +- packages/types/src/providers/zai.ts | 8 +++----- src/api/providers/__tests__/zai.spec.ts | 4 ++-- src/api/providers/zai.ts | 4 ++-- webview-ui/src/components/settings/providers/ZAi.tsx | 4 ++-- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index fd327657b6..558292eaf6 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -376,7 +376,7 @@ const sambaNovaSchema = apiModelIdProviderModelSchema.extend({ sambaNovaApiKey: z.string().optional(), }) -export const zaiApiLineSchema = z.enum(["international_coding", "international", "china_coding", "china"]) +export const zaiApiLineSchema = z.enum(["international", "china"]) export type ZaiApiLine = z.infer diff --git a/packages/types/src/providers/zai.ts b/packages/types/src/providers/zai.ts index b3838c1406..a32a21cad8 100644 --- a/packages/types/src/providers/zai.ts +++ b/packages/types/src/providers/zai.ts @@ -106,12 +106,10 @@ export const mainlandZAiModels = { export const ZAI_DEFAULT_TEMPERATURE = 0 export const zaiApiLineConfigs = { - international_coding: { - name: "International Coding Plan", + international: { + name: "International", baseUrl: "https://api.z.ai/api/coding/paas/v4", isChina: false, }, - international: { name: "International Standard", baseUrl: "https://api.z.ai/api/paas/v4", isChina: false }, - china_coding: { name: "China Coding Plan", baseUrl: "https://open.bigmodel.cn/api/coding/paas/v4", isChina: true }, - china: { name: "China Standard", baseUrl: "https://open.bigmodel.cn/api/paas/v4", isChina: true }, + china: { name: "China", baseUrl: "https://open.bigmodel.cn/api/coding/paas/v4", isChina: true }, } satisfies Record diff --git a/src/api/providers/__tests__/zai.spec.ts b/src/api/providers/__tests__/zai.spec.ts index 7928a4298d..20bf365f37 100644 --- a/src/api/providers/__tests__/zai.spec.ts +++ b/src/api/providers/__tests__/zai.spec.ts @@ -43,7 +43,7 @@ describe("ZAiHandler", () => { new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "international" }) expect(OpenAI).toHaveBeenCalledWith( expect.objectContaining({ - baseURL: "https://api.z.ai/api/paas/v4", + baseURL: "https://api.z.ai/api/coding/paas/v4", }), ) }) @@ -81,7 +81,7 @@ describe("ZAiHandler", () => { it("should use the correct China Z AI base URL", () => { new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "china" }) expect(OpenAI).toHaveBeenCalledWith( - expect.objectContaining({ baseURL: "https://open.bigmodel.cn/api/paas/v4" }), + expect.objectContaining({ baseURL: "https://open.bigmodel.cn/api/coding/paas/v4" }), ) }) diff --git a/src/api/providers/zai.ts b/src/api/providers/zai.ts index ce5aab9dd9..a4f110ea3f 100644 --- a/src/api/providers/zai.ts +++ b/src/api/providers/zai.ts @@ -15,14 +15,14 @@ import { BaseOpenAiCompatibleProvider } from "./base-openai-compatible-provider" export class ZAiHandler extends BaseOpenAiCompatibleProvider { constructor(options: ApiHandlerOptions) { - const isChina = zaiApiLineConfigs[options.zaiApiLine ?? "international_coding"].isChina + const isChina = zaiApiLineConfigs[options.zaiApiLine ?? "international"].isChina const models = isChina ? mainlandZAiModels : internationalZAiModels const defaultModelId = isChina ? mainlandZAiDefaultModelId : internationalZAiDefaultModelId super({ ...options, providerName: "Z AI", - baseURL: zaiApiLineConfigs[options.zaiApiLine ?? "international_coding"].baseUrl, + baseURL: zaiApiLineConfigs[options.zaiApiLine ?? "international"].baseUrl, apiKey: options.zaiApiKey ?? "not-provided", defaultProviderModelId: defaultModelId, providerModels: models, diff --git a/webview-ui/src/components/settings/providers/ZAi.tsx b/webview-ui/src/components/settings/providers/ZAi.tsx index c7f44510c1..1e76091945 100644 --- a/webview-ui/src/components/settings/providers/ZAi.tsx +++ b/webview-ui/src/components/settings/providers/ZAi.tsx @@ -33,7 +33,7 @@ export const ZAi = ({ apiConfiguration, setApiConfigurationField }: ZAiProps) =>
{zaiApiLineSchema.options.map((zaiApiLine) => { @@ -64,7 +64,7 @@ export const ZAi = ({ apiConfiguration, setApiConfigurationField }: ZAiProps) => {!apiConfiguration?.zaiApiKey && ( Date: Thu, 18 Sep 2025 13:50:11 -0600 Subject: [PATCH 2/4] i18n(zai): localize entrypoint labels and model descriptions; use i18n keys in UI; keep brand string 'Z AI' unlocalized --- webview-ui/src/components/settings/ModelInfoView.tsx | 12 ++++++++++-- webview-ui/src/components/settings/providers/ZAi.tsx | 3 ++- webview-ui/src/i18n/locales/en/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/zh-CN/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/zh-TW/settings.json | 12 ++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/webview-ui/src/components/settings/ModelInfoView.tsx b/webview-ui/src/components/settings/ModelInfoView.tsx index 138a55feba..9e0f321741 100644 --- a/webview-ui/src/components/settings/ModelInfoView.tsx +++ b/webview-ui/src/components/settings/ModelInfoView.tsx @@ -102,12 +102,20 @@ export const ModelInfoView = ({ const infoItems = shouldShowTierPricingTable ? baseInfoItems : [...baseInfoItems, ...priceInfoItems] + // Localize provider-specific model descriptions when available + const zaiDescKey = `settings:providers.zaiModels.${selectedModelId}.description` + const zaiLocalizedDesc = apiProvider === "zai" ? t(zaiDescKey) : undefined + const descriptionToUse = + apiProvider === "zai" && zaiLocalizedDesc && zaiLocalizedDesc !== zaiDescKey + ? zaiLocalizedDesc + : modelInfo?.description + return ( <> - {modelInfo?.description && ( + {descriptionToUse && ( diff --git a/webview-ui/src/components/settings/providers/ZAi.tsx b/webview-ui/src/components/settings/providers/ZAi.tsx index 1e76091945..cc6fec58f9 100644 --- a/webview-ui/src/components/settings/providers/ZAi.tsx +++ b/webview-ui/src/components/settings/providers/ZAi.tsx @@ -38,9 +38,10 @@ export const ZAi = ({ apiConfiguration, setApiConfigurationField }: ZAiProps) => className={cn("w-full")}> {zaiApiLineSchema.options.map((zaiApiLine) => { const config = zaiApiLineConfigs[zaiApiLine] + const label = t(`settings:providers.zaiEntrypointOptions.${zaiApiLine}`) return ( - {config.name} ({config.baseUrl}) + {label} ({config.baseUrl}) ) })} diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 1be824b37e..1f94844245 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -294,6 +294,18 @@ "getZaiApiKey": "Get Z AI API Key", "zaiEntrypoint": "Z AI Entrypoint", "zaiEntrypointDescription": "Please select the appropriate API entrypoint based on your location. If you are in China, choose open.bigmodel.cn. Otherwise, choose api.z.ai.", + "zaiEntrypointOptions": { + "international": "International", + "china": "China" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 is Zhipu's latest featured model. Its comprehensive capabilities in reasoning, coding, and agent reach the state-of-the-art (SOTA) level among open-source models, with a context length of up to 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air is the lightweight version of GLM-4.5. It balances performance and cost-effectiveness, and can flexibly switch to hybrid thinking models." + } + }, "geminiApiKey": "Gemini API Key", "getGroqApiKey": "Get Groq API Key", "groqApiKey": "Groq API Key", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 51db19562a..59f64f3a45 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "获取 Z AI API 密钥", "zaiEntrypoint": "Z AI 服务站点", "zaiEntrypointDescription": "请根据您的位置选择适当的 API 服务站点。如果您在中国,请选择 open.bigmodel.cn。否则,请选择 api.z.ai。", + "zaiEntrypointOptions": { + "international": "国际", + "china": "中国" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 是智谱最新的旗舰模型。在推理、编程与智能体方面具备领先能力,达到了开源模型的先进水平,支持最长 128k 上下文。" + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air 是 GLM-4.5 的轻量版,在性能与成本之间取得良好平衡,并可灵活切换到混合思维模式。" + } + }, "geminiApiKey": "Gemini API 密钥", "getGroqApiKey": "获取 Groq API 密钥", "groqApiKey": "Groq API 密钥", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 89d517f5b5..0a01fc243f 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "取得 Z AI API 金鑰", "zaiEntrypoint": "Z AI 服務端點", "zaiEntrypointDescription": "請根據您的位置選擇適當的 API 服務端點。如果您在中國,請選擇 open.bigmodel.cn。否則,請選擇 api.z.ai。", + "zaiEntrypointOptions": { + "international": "國際", + "china": "中國" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 是智譜最新的旗艦模型,在推理、程式設計與智能體方面具備頂尖能力,達到開源模型的先進水準,支援最長 128k 上下文。" + }, + "glm-4.5-air": { + "description": "GLM-4.5‑Air 是 GLM-4.5 的輕量版,在效能與成本之間取得平衡,並可彈性切換至混合思維模式。" + } + }, "geminiApiKey": "Gemini API 金鑰", "getGroqApiKey": "取得 Groq API 金鑰", "groqApiKey": "Groq API 金鑰", From ea48d537b0c730e6c4f34dc222a66eaf00b1fd5a Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Thu, 18 Sep 2025 18:23:57 -0600 Subject: [PATCH 3/4] feat(i18n): add entrypoint options and model descriptions for multiple languages --- webview-ui/src/i18n/locales/ca/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/de/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/es/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/fr/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/hi/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/id/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/it/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/ja/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/ko/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/nl/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/pl/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/pt-BR/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/ru/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/tr/settings.json | 12 ++++++++++++ webview-ui/src/i18n/locales/vi/settings.json | 12 ++++++++++++ 15 files changed, 180 insertions(+) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 4f3e4d9924..ca4710a9ac 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Obtenir clau API de Z AI", "zaiEntrypoint": "Punt d'entrada de Z AI", "zaiEntrypointDescription": "Si us plau, seleccioneu el punt d'entrada de l'API apropiat segons la vostra ubicació. Si sou a la Xina, trieu open.bigmodel.cn. Altrament, trieu api.z.ai.", + "zaiEntrypointOptions": { + "international": "Internacional", + "china": "Xina" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 és el model estrella més recent de Zhipu. Les seves capacitats integrals en raonament, codificació i agent assoleixen el nivell d'estat de l'art (SOTA) entre els models de codi obert, amb una longitud de context de fins a 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air és la versió lleugera de GLM-4.5. Equilibra rendiment i cost-efectivitat, i pot canviar flexiblement a models de pensament híbrids." + } + }, "geminiApiKey": "Clau API de Gemini", "getGroqApiKey": "Obtenir clau API de Groq", "groqApiKey": "Clau API de Groq", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 4e75f6af2a..6331914e61 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Z AI API-Schlüssel erhalten", "zaiEntrypoint": "Z AI Einstiegspunkt", "zaiEntrypointDescription": "Bitte wählen Sie den entsprechenden API-Einstiegspunkt basierend auf Ihrem Standort. Wenn Sie sich in China befinden, wählen Sie open.bigmodel.cn. Andernfalls wählen Sie api.z.ai.", + "zaiEntrypointOptions": { + "international": "International", + "china": "China" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 ist Zhipus neuestes Spitzenmodell. Seine umfassenden Fähigkeiten in Argumentation, Programmierung und Agenten erreichen das State-of-the-Art (SOTA) Niveau unter Open-Source-Modellen, mit einer Kontextlänge von bis zu 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air ist die leichtgewichtige Version von GLM-4.5. Es balanciert Leistung und Kosteneffizienz und kann flexibel zu hybriden Denkmodellen wechseln." + } + }, "geminiApiKey": "Gemini API-Schlüssel", "getGroqApiKey": "Groq API-Schlüssel erhalten", "groqApiKey": "Groq API-Schlüssel", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index deb2bc7a22..4ab8b70c93 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Obtener clave API de Z AI", "zaiEntrypoint": "Punto de entrada de Z AI", "zaiEntrypointDescription": "Por favor, seleccione el punto de entrada de API apropiado según su ubicación. Si está en China, elija open.bigmodel.cn. De lo contrario, elija api.z.ai.", + "zaiEntrypointOptions": { + "international": "Internacional", + "china": "China" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 es el modelo estrella más reciente de Zhipu. Sus capacidades integrales en razonamiento, codificación y agente alcanzan el nivel del estado del arte (SOTA) entre los modelos de código abierto, con una longitud de contexto de hasta 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air es la versión ligera de GLM-4.5. Equilibra rendimiento y rentabilidad, y puede cambiar flexiblemente a modelos de pensamiento híbridos." + } + }, "geminiApiKey": "Clave API de Gemini", "getGroqApiKey": "Obtener clave API de Groq", "groqApiKey": "Clave API de Groq", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index ccb8e61d7a..18ff862ac9 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Obtenir la clé API Z AI", "zaiEntrypoint": "Point d'entrée Z AI", "zaiEntrypointDescription": "Veuillez sélectionner le point d'entrée API approprié en fonction de votre emplacement. Si vous êtes en Chine, choisissez open.bigmodel.cn. Sinon, choisissez api.z.ai.", + "zaiEntrypointOptions": { + "international": "International", + "china": "Chine" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 est le dernier modèle phare de Zhipu. Ses capacités complètes en raisonnement, codage et agent atteignent le niveau de l'état de l'art (SOTA) parmi les modèles open source, avec une longueur de contexte allant jusqu'à 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air est la version allégée de GLM-4.5. Il équilibre performance et rentabilité, et peut basculer de manière flexible vers des modèles de pensée hybrides." + } + }, "geminiApiKey": "Clé API Gemini", "getGroqApiKey": "Obtenir la clé API Groq", "groqApiKey": "Clé API Groq", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 3d879e2ca7..b2bbf5d3b9 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Z AI API कुंजी प्राप्त करें", "zaiEntrypoint": "Z AI प्रवेश बिंदु", "zaiEntrypointDescription": "कृपया अपने स्थान के आधार पर उपयुक्त API प्रवेश बिंदु का चयन करें। यदि आप चीन में हैं, तो open.bigmodel.cn चुनें। अन्यथा, api.z.ai चुनें।", + "zaiEntrypointOptions": { + "international": "अंतर्राष्ट्रीय", + "china": "चीन" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 Zhipu का नवीनतम फ्लैगशिप मॉडल है। रीज़निंग, कोडिंग और एजेंट में इसकी व्यापक क्षमताएं ओपन-सोर्स मॉडल्स के बीच अत्याधुनिक (SOTA) स्तर तक पहुंचती हैं, जिसमें 128k तक का संदर्भ लंबाई है।" + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air, GLM-4.5 का हल्का संस्करण है। यह प्रदर्शन और लागत-प्रभावशीलता को संतुलित करता है, और हाइब्रिड थिंकिंग मॉडल्स में लचीले रूप से स्विच कर सकता है।" + } + }, "geminiApiKey": "Gemini API कुंजी", "getGroqApiKey": "Groq API कुंजी प्राप्त करें", "groqApiKey": "Groq API कुंजी", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 8138726c33..d5ff56996c 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -299,6 +299,18 @@ "getZaiApiKey": "Dapatkan Kunci API Z AI", "zaiEntrypoint": "Titik Masuk Z AI", "zaiEntrypointDescription": "Silakan pilih titik masuk API yang sesuai berdasarkan lokasi Anda. Jika Anda berada di China, pilih open.bigmodel.cn. Jika tidak, pilih api.z.ai.", + "zaiEntrypointOptions": { + "international": "Internasional", + "china": "China" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 adalah model unggulan terbaru Zhipu. Kemampuan komprehensifnya dalam penalaran, coding, dan agen mencapai tingkat state-of-the-art (SOTA) di antara model open source, dengan panjang konteks hingga 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air adalah versi ringan dari GLM-4.5. Ini menyeimbangkan kinerja dan efektivitas biaya, dan dapat beralih secara fleksibel ke model pemikiran hibrida." + } + }, "geminiApiKey": "Gemini API Key", "getGroqApiKey": "Dapatkan Groq API Key", "groqApiKey": "Groq API Key", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 80ff0f8a71..4669013145 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Ottieni chiave API Z AI", "zaiEntrypoint": "Punto di ingresso Z AI", "zaiEntrypointDescription": "Si prega di selezionare il punto di ingresso API appropriato in base alla propria posizione. Se ti trovi in Cina, scegli open.bigmodel.cn. Altrimenti, scegli api.z.ai.", + "zaiEntrypointOptions": { + "international": "Internazionale", + "china": "Cina" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 è il modello di punta più recente di Zhipu. Le sue capacità complete in ragionamento, codifica e agente raggiungono il livello all'avanguardia (SOTA) tra i modelli open source, con una lunghezza di contesto fino a 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air è la versione leggera di GLM-4.5. Bilancia prestazioni e convenienza economica, e può passare flessibilmente a modelli di pensiero ibridi." + } + }, "geminiApiKey": "Chiave API Gemini", "getGroqApiKey": "Ottieni chiave API Groq", "groqApiKey": "Chiave API Groq", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 264d774473..49131a87cb 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Z AI APIキーを取得", "zaiEntrypoint": "Z AI エントリーポイント", "zaiEntrypointDescription": "お住まいの地域に応じて適切な API エントリーポイントを選択してください。中国にお住まいの場合は open.bigmodel.cn を選択してください。それ以外の場合は api.z.ai を選択してください。", + "zaiEntrypointOptions": { + "international": "国際", + "china": "中国" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5は智譜の最新フラッグシップモデルです。推論、コーディング、エージェントにおける包括的な能力は、オープンソースモデルの中で最先端(SOTA)レベルに達し、最大128kのコンテキスト長を持ちます。" + }, + "glm-4.5-air": { + "description": "GLM-4.5-AirはGLM-4.5の軽量版です。パフォーマンスとコスト効率のバランスを取り、ハイブリッド思考モデルに柔軟に切り替えることができます。" + } + }, "geminiApiKey": "Gemini APIキー", "getGroqApiKey": "Groq APIキーを取得", "groqApiKey": "Groq APIキー", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index e490e31f78..6e51edcc4e 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Z AI API 키 받기", "zaiEntrypoint": "Z AI 엔트리포인트", "zaiEntrypointDescription": "위치에 따라 적절한 API 엔트리포인트를 선택하세요. 중국에 있다면 open.bigmodel.cn을 선택하세요. 그렇지 않으면 api.z.ai를 선택하세요.", + "zaiEntrypointOptions": { + "international": "국제", + "china": "중국" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5는 Zhipu의 최신 플래그십 모델입니다. 추론, 코딩, 에이전트에서의 포괄적인 능력은 오픈소스 모델 중에서 최첨단(SOTA) 수준에 도달하며, 최대 128k의 컨텍스트 길이를 가집니다." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air는 GLM-4.5의 경량 버전입니다. 성능과 비용 효율성의 균형을 맞추며, 하이브리드 사고 모델로 유연하게 전환할 수 있습니다." + } + }, "geminiApiKey": "Gemini API 키", "getGroqApiKey": "Groq API 키 받기", "groqApiKey": "Groq API 키", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index ee0ba193e5..5d99428a7d 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Z AI API-sleutel ophalen", "zaiEntrypoint": "Z AI-ingangspunt", "zaiEntrypointDescription": "Selecteer het juiste API-ingangspunt op basis van uw locatie. Als u zich in China bevindt, kies dan open.bigmodel.cn. Anders kiest u api.z.ai.", + "zaiEntrypointOptions": { + "international": "Internationaal", + "china": "China" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 is Zhipu's nieuwste vlaggenschipmodel. Zijn uitgebreide mogelijkheden in redenering, codering en agent bereiken het state-of-the-art (SOTA) niveau onder open-source modellen, met een contextlengte tot 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air is de lichtgewicht versie van GLM-4.5. Het balanceert prestaties en kosteneffectiviteit, en kan flexibel overschakelen naar hybride denkmodellen." + } + }, "geminiApiKey": "Gemini API-sleutel", "getGroqApiKey": "Groq API-sleutel ophalen", "groqApiKey": "Groq API-sleutel", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 2d30547d9f..800f871cb0 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Uzyskaj klucz API Z AI", "zaiEntrypoint": "Punkt wejścia Z AI", "zaiEntrypointDescription": "Wybierz odpowiedni punkt wejścia API w zależności od swojej lokalizacji. Jeśli jesteś w Chinach, wybierz open.bigmodel.cn. W przeciwnym razie wybierz api.z.ai.", + "zaiEntrypointOptions": { + "international": "Międzynarodowy", + "china": "Chiny" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 to najnowszy flagowy model Zhipu. Jego wszechstronne możliwości w rozumowaniu, kodowaniu i agentach osiągają poziom najnowocześniejszy (SOTA) wśród modeli open source, z długością kontekstu do 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air to lekka wersja GLM-4.5. Równoważy wydajność i efektywność kosztową, i może elastycznie przełączać się na hybrydowe modele myślenia." + } + }, "geminiApiKey": "Klucz API Gemini", "getGroqApiKey": "Uzyskaj klucz API Groq", "groqApiKey": "Klucz API Groq", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 338ab9f6b1..06f6d39364 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Obter chave de API Z AI", "zaiEntrypoint": "Ponto de entrada Z AI", "zaiEntrypointDescription": "Selecione o ponto de entrada da API apropriado com base na sua localização. Se você estiver na China, escolha open.bigmodel.cn. Caso contrário, escolha api.z.ai.", + "zaiEntrypointOptions": { + "international": "Internacional", + "china": "China" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 é o mais recente modelo flagship da Zhipu. Suas capacidades abrangentes em raciocínio, codificação e agente atingem o nível estado da arte (SOTA) entre modelos de código aberto, com comprimento de contexto de até 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air é a versão leve do GLM-4.5. Equilibra desempenho e custo-benefício, e pode alternar flexivelmente para modelos de pensamento híbrido." + } + }, "geminiApiKey": "Chave de API Gemini", "getGroqApiKey": "Obter chave de API Groq", "groqApiKey": "Chave de API Groq", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index be494c571b..76ed07623f 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Получить Z AI API-ключ", "zaiEntrypoint": "Точка входа Z AI", "zaiEntrypointDescription": "Пожалуйста, выберите подходящую точку входа API в зависимости от вашего местоположения. Если вы находитесь в Китае, выберите open.bigmodel.cn. В противном случае выберите api.z.ai.", + "zaiEntrypointOptions": { + "international": "Международный", + "china": "Китай" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 — это новейшая флагманская модель Zhipu. Её всесторонние возможности в рассуждении, кодировании и агентах достигают современного уровня (SOTA) среди моделей с открытым исходным кодом, с длиной контекста до 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air — это облегчённая версия GLM-4.5. Она балансирует производительность и экономическую эффективность, и может гибко переключаться на гибридные модели мышления." + } + }, "geminiApiKey": "Gemini API-ключ", "getGroqApiKey": "Получить Groq API-ключ", "groqApiKey": "Groq API-ключ", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index fe4508495b..4070083e20 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Z AI API Anahtarı Al", "zaiEntrypoint": "Z AI Giriş Noktası", "zaiEntrypointDescription": "Konumunuza göre uygun API giriş noktasını seçin. Çin'de iseniz open.bigmodel.cn'yi seçin. Aksi takdirde api.z.ai'yi seçin.", + "zaiEntrypointOptions": { + "international": "Uluslararası", + "china": "Çin" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5, Zhipu'nun en yeni amiral gemisi modelidir. Akıl yürütme, kodlama ve ajan konularındaki kapsamlı yetenekleri, açık kaynak modeller arasında en son teknoloji (SOTA) seviyesine ulaşır ve 128k'ya kadar bağlam uzunluğuna sahiptir." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air, GLM-4.5'in hafif versiyonudur. Performans ve maliyet etkinliğini dengeler ve hibrit düşünce modellerine esnek bir şekilde geçiş yapabilir." + } + }, "geminiApiKey": "Gemini API Anahtarı", "getGroqApiKey": "Groq API Anahtarı Al", "groqApiKey": "Groq API Anahtarı", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 0f03de47a5..01ccd880ee 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -295,6 +295,18 @@ "getZaiApiKey": "Lấy khóa API Z AI", "zaiEntrypoint": "Điểm vào Z AI", "zaiEntrypointDescription": "Vui lòng chọn điểm vào API phù hợp dựa trên vị trí của bạn. Nếu bạn ở Trung Quốc, hãy chọn open.bigmodel.cn. Ngược lại, hãy chọn api.z.ai.", + "zaiEntrypointOptions": { + "international": "Quốc tế", + "china": "Trung Quốc" + }, + "zaiModels": { + "glm-4.5": { + "description": "GLM-4.5 là mô hình hàng đầu mới nhất của Zhipu. Khả năng toàn diện trong lý luận, mã hóa và tác nhân đạt đến mức tiên tiến (SOTA) trong số các mô hình mã nguồn mở, với độ dài ngữ cảnh lên đến 128k." + }, + "glm-4.5-air": { + "description": "GLM-4.5-Air là phiên bản nhẹ của GLM-4.5. Nó cân bằng hiệu suất và hiệu quả chi phí, và có thể linh hoạt chuyển đổi sang các mô hình tư duy lai." + } + }, "geminiApiKey": "Khóa API Gemini", "getGroqApiKey": "Lấy khóa API Groq", "groqApiKey": "Khóa API Groq", From 023ea9adaebd22825e435c328ba181857f9ae2c7 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Thu, 18 Sep 2025 18:24:29 -0600 Subject: [PATCH 4/4] fix: improve handling of dotted keys in getValueAtPath function --- scripts/find-missing-translations.js | 40 ++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/scripts/find-missing-translations.js b/scripts/find-missing-translations.js index 9277d935ba..fd00025c6c 100755 --- a/scripts/find-missing-translations.js +++ b/scripts/find-missing-translations.js @@ -92,14 +92,44 @@ function findKeys(obj, parentKey = "") { // Get value at a dotted path in an object function getValueAtPath(obj, path) { - const parts = path.split(".") + // Handle the case where keys might contain dots (like "glm-4.5") + // We need to be smarter about splitting the path let current = obj + let remainingPath = path + + while (remainingPath && current && typeof current === "object") { + let found = false + + // Try to find the longest matching key first + for (const key of Object.keys(current)) { + if (remainingPath === key) { + // Exact match - we're done + return current[key] + } else if (remainingPath.startsWith(key + ".")) { + // Key matches the start of remaining path + current = current[key] + remainingPath = remainingPath.slice(key.length + 1) + found = true + break + } + } - for (const part of parts) { - if (current === undefined || current === null) { - return undefined + if (!found) { + // No matching key found, try the old method as fallback + const dotIndex = remainingPath.indexOf(".") + if (dotIndex === -1) { + // No more dots, this should be the final key + return current[remainingPath] + } else { + const nextKey = remainingPath.slice(0, dotIndex) + if (current[nextKey] !== undefined) { + current = current[nextKey] + remainingPath = remainingPath.slice(dotIndex + 1) + } else { + return undefined + } + } } - current = current[part] } return current