diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 37c1c286b983..ada74d58f3fd 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -279,11 +279,30 @@ const ApiOptions = ({ })) : [] - return availableModels - }, [selectedProvider, organizationAllowList, selectedModelId]) + const modelOptions = [...availableModels] + + // Include the currently selected model if it's been removed + if (selectedModelId && !modelOptions.find((opt) => opt.value === selectedModelId)) { + modelOptions.unshift({ + value: selectedModelId, + label: `${selectedModelId} (${t("settings:providers.modelUnavailable")})`, + }) + } + + return modelOptions + }, [selectedProvider, organizationAllowList, selectedModelId, t]) const onProviderChange = useCallback( (value: ProviderName) => { + // Check if the current model is removed (not in the filtered models list) + const currentProviderModels = MODELS_BY_PROVIDER[selectedProvider] + const isModelRemoved = + selectedModelId && + currentProviderModels && + !Object.keys( + filterModels(currentProviderModels, selectedProvider, organizationAllowList) || {}, + ).includes(selectedModelId) + setApiConfigurationField("apiProvider", value) // It would be much easier to have a single attribute that stores @@ -301,9 +320,7 @@ const ApiOptions = ({ // in case we haven't set a default value for a provider if (!defaultValue) return - // only set default if no model is set, but don't reset invalid models - // let users see and decide what to do with invalid model selections - const shouldSetDefault = !modelId + const shouldSetDefault = !modelId || isModelRemoved if (shouldSetDefault) { setApiConfigurationField(field, defaultValue, false) @@ -368,7 +385,7 @@ const ApiOptions = ({ ) } }, - [setApiConfigurationField, apiConfiguration], + [setApiConfigurationField, apiConfiguration, selectedProvider, selectedModelId, organizationAllowList], ) const modelValidationError = useMemo(() => { diff --git a/webview-ui/src/components/settings/__tests__/ApiOptions.spec.tsx b/webview-ui/src/components/settings/__tests__/ApiOptions.spec.tsx index 7b7f9b33e48d..733c49634c32 100644 --- a/webview-ui/src/components/settings/__tests__/ApiOptions.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/ApiOptions.spec.tsx @@ -563,4 +563,48 @@ describe("ApiOptions", () => { expect(screen.queryByTestId("litellm-provider")).not.toBeInTheDocument() }) }) + + describe("Removed model handling", () => { + it("renders without errors when a removed model is selected", () => { + // This test verifies that the component handles removed models gracefully + // by still rendering the UI without crashing + const mockSetApiConfigurationField = vi.fn() + + renderApiOptions({ + apiConfiguration: { + apiProvider: "anthropic", + apiModelId: "claude-2.1", // A model that might be removed + }, + setApiConfigurationField: mockSetApiConfigurationField, + }) + + // Verify the component rendered successfully + expect(screen.getByTestId("provider-select")).toBeInTheDocument() + + // The component should render even with a potentially removed model + // The actual model validation and fallback is handled by the API + }) + + it("allows provider switching even with a removed model", () => { + const mockSetApiConfigurationField = vi.fn() + + renderApiOptions({ + apiConfiguration: { + apiProvider: "anthropic", + apiModelId: "claude-2.1", // A model that might be removed + }, + setApiConfigurationField: mockSetApiConfigurationField, + }) + + // Find and change the provider select + const providerSelect = screen.getByTestId("provider-select").querySelector("select") + expect(providerSelect).toBeInTheDocument() + + // Switch to a different provider + fireEvent.change(providerSelect!, { target: { value: "openai" } }) + + // Verify that the provider change was registered + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("apiProvider", "openai") + }) + }) }) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 611159069b29..5772d4e9795c 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -223,6 +223,7 @@ "description": "Deseu diferents configuracions d'API per canviar ràpidament entre proveïdors i configuracions.", "apiProvider": "Proveïdor d'API", "model": "Model", + "modelUnavailable": "no disponible", "nameEmpty": "El nom no pot estar buit", "nameExists": "Ja existeix un perfil amb aquest nom", "deleteProfile": "Esborrar perfil", @@ -794,7 +795,8 @@ "label": "Model", "searchPlaceholder": "Cerca", "noMatchFound": "No s'ha trobat cap coincidència", - "useCustomModel": "Utilitzar personalitzat: {{modelId}}" + "useCustomModel": "Utilitzar personalitzat: {{modelId}}", + "unavailable": "no disponible" }, "footer": { "feedback": "Si teniu qualsevol pregunta o comentari, no dubteu a obrir un issue a github.com/RooCodeInc/Roo-Code o unir-vos a reddit.com/r/RooCode o discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 00827751b0fd..3942217ac852 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -223,6 +223,7 @@ "description": "Speichern Sie verschiedene API-Konfigurationen, um schnell zwischen Anbietern und Einstellungen zu wechseln.", "apiProvider": "API-Anbieter", "model": "Modell", + "modelUnavailable": "nicht verfügbar", "nameEmpty": "Name darf nicht leer sein", "nameExists": "Ein Profil mit diesem Namen existiert bereits", "deleteProfile": "Profil löschen", @@ -794,7 +795,8 @@ "label": "Modell", "searchPlaceholder": "Suchen", "noMatchFound": "Keine Übereinstimmung gefunden", - "useCustomModel": "Benutzerdefiniert verwenden: {{modelId}}" + "useCustomModel": "Benutzerdefiniert verwenden: {{modelId}}", + "unavailable": "nicht verfügbar" }, "footer": { "feedback": "Wenn du Fragen oder Feedback hast, kannst du gerne ein Issue auf github.com/RooCodeInc/Roo-Code eröffnen oder reddit.com/r/RooCode oder discord.gg/roocode beitreten", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index dfccc49cc4ce..75a3503d62bd 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -228,6 +228,7 @@ "description": "Save different API configurations to quickly switch between providers and settings.", "apiProvider": "API Provider", "model": "Model", + "modelUnavailable": "unavailable", "nameEmpty": "Name cannot be empty", "nameExists": "A profile with this name already exists", "deleteProfile": "Delete Profile", @@ -799,7 +800,8 @@ "label": "Model", "searchPlaceholder": "Search", "noMatchFound": "No match found", - "useCustomModel": "Use custom: {{modelId}}" + "useCustomModel": "Use custom: {{modelId}}", + "unavailable": "unavailable" }, "footer": { "feedback": "If you have any questions or feedback, feel free to open an issue at github.com/RooCodeInc/Roo-Code or join reddit.com/r/RooCode or discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index c1271df82740..efef74df86a5 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -223,6 +223,7 @@ "description": "Guarde diferentes configuraciones de API para cambiar rápidamente entre proveedores y ajustes.", "apiProvider": "Proveedor de API", "model": "Modelo", + "modelUnavailable": "no disponible", "nameEmpty": "El nombre no puede estar vacío", "nameExists": "Ya existe un perfil con este nombre", "deleteProfile": "Eliminar perfil", @@ -794,7 +795,8 @@ "label": "Modelo", "searchPlaceholder": "Buscar", "noMatchFound": "No se encontraron coincidencias", - "useCustomModel": "Usar personalizado: {{modelId}}" + "useCustomModel": "Usar personalizado: {{modelId}}", + "unavailable": "no disponible" }, "footer": { "feedback": "Si tiene alguna pregunta o comentario, no dude en abrir un issue en github.com/RooCodeInc/Roo-Code o unirse a reddit.com/r/RooCode o discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index abcf401d6402..59cc95458da0 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -223,6 +223,7 @@ "description": "Enregistrez différentes configurations d'API pour basculer rapidement entre les fournisseurs et les paramètres.", "apiProvider": "Fournisseur d'API", "model": "Modèle", + "modelUnavailable": "indisponible", "nameEmpty": "Le nom ne peut pas être vide", "nameExists": "Un profil avec ce nom existe déjà", "deleteProfile": "Supprimer le profil", @@ -794,7 +795,8 @@ "label": "Modèle", "searchPlaceholder": "Rechercher", "noMatchFound": "Aucune correspondance trouvée", - "useCustomModel": "Utiliser personnalisé : {{modelId}}" + "useCustomModel": "Utiliser personnalisé : {{modelId}}", + "unavailable": "indisponible" }, "footer": { "feedback": "Si vous avez des questions ou des commentaires, n'hésitez pas à ouvrir un problème sur github.com/RooCodeInc/Roo-Code ou à rejoindre reddit.com/r/RooCode ou discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 975e35411eea..4d8e79d186e5 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -223,6 +223,7 @@ "description": "विभिन्न API कॉन्फ़िगरेशन सहेजें ताकि प्रदाताओं और सेटिंग्स के बीच त्वरित रूप से स्विच कर सकें।", "apiProvider": "API प्रदाता", "model": "मॉडल", + "modelUnavailable": "अनुपलब्ध", "nameEmpty": "नाम खाली नहीं हो सकता", "nameExists": "इस नाम वाला प्रोफ़ाइल पहले से मौजूद है", "deleteProfile": "प्रोफ़ाइल हटाएं", @@ -795,7 +796,8 @@ "label": "मॉडल", "searchPlaceholder": "खोजें", "noMatchFound": "कोई मिलान नहीं मिला", - "useCustomModel": "कस्टम उपयोग करें: {{modelId}}" + "useCustomModel": "कस्टम उपयोग करें: {{modelId}}", + "unavailable": "अनुपलब्ध" }, "footer": { "feedback": "यदि आपके कोई प्रश्न या प्रतिक्रिया है, तो github.com/RooCodeInc/Roo-Code पर एक मुद्दा खोलने या reddit.com/r/RooCode या discord.gg/roocode में शामिल होने में संकोच न करें", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index aa2c1172119a..c07da2040fdd 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -227,6 +227,7 @@ "description": "Simpan konfigurasi API yang berbeda untuk beralih dengan cepat antara provider dan pengaturan.", "apiProvider": "Provider API", "model": "Model", + "modelUnavailable": "tidak tersedia", "nameEmpty": "Nama tidak boleh kosong", "nameExists": "Profil dengan nama ini sudah ada", "deleteProfile": "Hapus Profil", @@ -824,7 +825,8 @@ "label": "Model", "searchPlaceholder": "Cari", "noMatchFound": "Tidak ada yang cocok ditemukan", - "useCustomModel": "Gunakan kustom: {{modelId}}" + "useCustomModel": "Gunakan kustom: {{modelId}}", + "unavailable": "tidak tersedia" }, "footer": { "feedback": "Jika kamu punya pertanyaan atau feedback, jangan ragu untuk membuka issue di github.com/RooCodeInc/Roo-Code atau bergabung reddit.com/r/RooCode atau discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 6f2e06bb8fd6..1025829438af 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -223,6 +223,7 @@ "description": "Salva diverse configurazioni API per passare rapidamente tra fornitori e impostazioni.", "apiProvider": "Fornitore API", "model": "Modello", + "modelUnavailable": "non disponibile", "nameEmpty": "Il nome non può essere vuoto", "nameExists": "Esiste già un profilo con questo nome", "deleteProfile": "Elimina profilo", @@ -795,7 +796,8 @@ "label": "Modello", "searchPlaceholder": "Cerca", "noMatchFound": "Nessuna corrispondenza trovata", - "useCustomModel": "Usa personalizzato: {{modelId}}" + "useCustomModel": "Usa personalizzato: {{modelId}}", + "unavailable": "non disponibile" }, "footer": { "feedback": "Se hai domande o feedback, sentiti libero di aprire un issue su github.com/RooCodeInc/Roo-Code o unirti a reddit.com/r/RooCode o discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index cc1ea09317eb..f58e7cdaf12f 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -223,6 +223,7 @@ "description": "異なるAPI設定を保存して、プロバイダーと設定をすばやく切り替えることができます。", "apiProvider": "APIプロバイダー", "model": "モデル", + "modelUnavailable": "利用不可", "nameEmpty": "名前を空にすることはできません", "nameExists": "この名前のプロファイルは既に存在します", "deleteProfile": "プロファイルを削除", @@ -795,7 +796,8 @@ "label": "モデル", "searchPlaceholder": "検索", "noMatchFound": "一致するものが見つかりません", - "useCustomModel": "カスタムを使用: {{modelId}}" + "useCustomModel": "カスタムを使用: {{modelId}}", + "unavailable": "利用不可" }, "footer": { "feedback": "質問やフィードバックがある場合は、github.com/RooCodeInc/Roo-Codeで問題を開くか、reddit.com/r/RooCodediscord.gg/roocodeに参加してください", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 61539cfc4d9f..18e0652c8505 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -223,6 +223,7 @@ "description": "다양한 API 구성을 저장하여 제공자와 설정 간에 빠르게 전환할 수 있습니다.", "apiProvider": "API 제공자", "model": "모델", + "modelUnavailable": "사용 불가", "nameEmpty": "이름은 비워둘 수 없습니다", "nameExists": "이 이름의 프로필이 이미 존재합니다", "deleteProfile": "프로필 삭제", @@ -795,7 +796,8 @@ "label": "모델", "searchPlaceholder": "검색", "noMatchFound": "일치하는 항목 없음", - "useCustomModel": "사용자 정의 사용: {{modelId}}" + "useCustomModel": "사용자 정의 사용: {{modelId}}", + "unavailable": "사용 불가" }, "footer": { "feedback": "질문이나 피드백이 있으시면 github.com/RooCodeInc/Roo-Code에서 이슈를 열거나 reddit.com/r/RooCode 또는 discord.gg/roocode에 가입하세요", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 41ee3e5910bb..b8c53cb8d18c 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -223,6 +223,7 @@ "description": "Sla verschillende API-configuraties op om snel te wisselen tussen providers en instellingen.", "apiProvider": "API-provider", "model": "Model", + "modelUnavailable": "niet beschikbaar", "nameEmpty": "Naam mag niet leeg zijn", "nameExists": "Er bestaat al een profiel met deze naam", "deleteProfile": "Profiel verwijderen", @@ -795,7 +796,8 @@ "label": "Model", "searchPlaceholder": "Zoeken", "noMatchFound": "Geen overeenkomsten gevonden", - "useCustomModel": "Aangepast gebruiken: {{modelId}}" + "useCustomModel": "Aangepast gebruiken: {{modelId}}", + "unavailable": "niet beschikbaar" }, "footer": { "feedback": "Heb je vragen of feedback? Open gerust een issue op github.com/RooCodeInc/Roo-Code of sluit je aan bij reddit.com/r/RooCode of discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 6862d6f7edda..87bc60f8fe3c 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -223,6 +223,7 @@ "description": "Zapisz różne konfiguracje API, aby szybko przełączać się między dostawcami i ustawieniami.", "apiProvider": "Dostawca API", "model": "Model", + "modelUnavailable": "niedostępny", "nameEmpty": "Nazwa nie może być pusta", "nameExists": "Profil o tej nazwie już istnieje", "deleteProfile": "Usuń profil", @@ -795,7 +796,8 @@ "label": "Model", "searchPlaceholder": "Wyszukaj", "noMatchFound": "Nie znaleziono dopasowań", - "useCustomModel": "Użyj niestandardowy: {{modelId}}" + "useCustomModel": "Użyj niestandardowy: {{modelId}}", + "unavailable": "niedostępny" }, "footer": { "feedback": "Jeśli masz jakiekolwiek pytania lub opinie, śmiało otwórz zgłoszenie na github.com/RooCodeInc/Roo-Code lub dołącz do reddit.com/r/RooCode lub discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index b8184777acf0..c443bfe87f6d 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -223,6 +223,7 @@ "description": "Salve diferentes configurações de API para alternar rapidamente entre provedores e configurações.", "apiProvider": "Provedor de API", "model": "Modelo", + "modelUnavailable": "indisponível", "nameEmpty": "O nome não pode estar vazio", "nameExists": "Já existe um perfil com este nome", "deleteProfile": "Excluir perfil", @@ -795,7 +796,8 @@ "label": "Modelo", "searchPlaceholder": "Pesquisar", "noMatchFound": "Nenhuma correspondência encontrada", - "useCustomModel": "Usar personalizado: {{modelId}}" + "useCustomModel": "Usar personalizado: {{modelId}}", + "unavailable": "indisponível" }, "footer": { "feedback": "Se tiver alguma dúvida ou feedback, sinta-se à vontade para abrir um problema em github.com/RooCodeInc/Roo-Code ou juntar-se a reddit.com/r/RooCode ou discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index bcbd72089a45..032178af890d 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -223,6 +223,7 @@ "description": "Сохраняйте различные конфигурации API для быстрого переключения между провайдерами и настройками.", "apiProvider": "Провайдер API", "model": "Модель", + "modelUnavailable": "недоступна", "nameEmpty": "Имя не может быть пустым", "nameExists": "Профиль с таким именем уже существует", "deleteProfile": "Удалить профиль", @@ -795,7 +796,8 @@ "label": "Модель", "searchPlaceholder": "Поиск", "noMatchFound": "Совпадений не найдено", - "useCustomModel": "Использовать пользовательскую: {{modelId}}" + "useCustomModel": "Использовать пользовательскую: {{modelId}}", + "unavailable": "недоступна" }, "footer": { "feedback": "Если у вас есть вопросы или предложения, откройте issue на github.com/RooCodeInc/Roo-Code или присоединяйтесь к reddit.com/r/RooCode или discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 4ac28f47d2f2..c1d8ed23d99a 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -223,6 +223,7 @@ "description": "Sağlayıcılar ve ayarlar arasında hızlıca geçiş yapmak için farklı API yapılandırmalarını kaydedin.", "apiProvider": "API Sağlayıcı", "model": "Model", + "modelUnavailable": "kullanılamıyor", "nameEmpty": "İsim boş olamaz", "nameExists": "Bu isme sahip bir profil zaten mevcut", "deleteProfile": "Profili sil", @@ -795,7 +796,8 @@ "label": "Model", "searchPlaceholder": "Ara", "noMatchFound": "Eşleşme bulunamadı", - "useCustomModel": "Özel kullan: {{modelId}}" + "useCustomModel": "Özel kullan: {{modelId}}", + "unavailable": "kullanılamıyor" }, "footer": { "feedback": "Herhangi bir sorunuz veya geri bildiriminiz varsa, github.com/RooCodeInc/Roo-Code adresinde bir konu açmaktan veya reddit.com/r/RooCode ya da discord.gg/roocode'a katılmaktan çekinmeyin", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 4303325d068e..9b7b114549f3 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -223,6 +223,7 @@ "description": "Lưu các cấu hình API khác nhau để nhanh chóng chuyển đổi giữa các nhà cung cấp và cài đặt.", "apiProvider": "Nhà cung cấp API", "model": "Mẫu", + "modelUnavailable": "không khả dụng", "nameEmpty": "Tên không được để trống", "nameExists": "Đã tồn tại một hồ sơ với tên này", "deleteProfile": "Xóa hồ sơ", @@ -795,7 +796,8 @@ "label": "Mô hình", "searchPlaceholder": "Tìm kiếm", "noMatchFound": "Không tìm thấy kết quả", - "useCustomModel": "Sử dụng tùy chỉnh: {{modelId}}" + "useCustomModel": "Sử dụng tùy chỉnh: {{modelId}}", + "unavailable": "không khả dụng" }, "footer": { "feedback": "Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, vui lòng mở một vấn đề tại github.com/RooCodeInc/Roo-Code hoặc tham gia reddit.com/r/RooCode hoặc discord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index f574106f4568..cd46b30a4824 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -223,6 +223,7 @@ "description": "保存多组API配置便于快速切换", "apiProvider": "API提供商", "model": "模型", + "modelUnavailable": "不可用", "nameEmpty": "名称不能为空", "nameExists": "已存在同名的配置文件", "deleteProfile": "删除配置文件", @@ -795,7 +796,8 @@ "label": "模型", "searchPlaceholder": "搜索", "noMatchFound": "未找到匹配项", - "useCustomModel": "使用自定义:{{modelId}}" + "useCustomModel": "使用自定义:{{modelId}}", + "unavailable": "不可用" }, "footer": { "feedback": "如果您有任何问题或反馈,请随时在 github.com/RooCodeInc/Roo-Code 上提出问题或加入 reddit.com/r/RooCodediscord.gg/roocode", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 67e8c43b60a9..2c44b9cedb96 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -223,6 +223,7 @@ "description": "儲存不同的 API 設定以快速切換供應商和設定。", "apiProvider": "API 供應商", "model": "模型", + "modelUnavailable": "無法使用", "nameEmpty": "名稱不能為空", "nameExists": "已存在同名的設定檔", "deleteProfile": "刪除設定檔", @@ -795,7 +796,8 @@ "label": "模型", "searchPlaceholder": "搜尋", "noMatchFound": "找不到符合的項目", - "useCustomModel": "使用自訂模型:{{modelId}}" + "useCustomModel": "使用自訂模型:{{modelId}}", + "unavailable": "無法使用" }, "footer": { "feedback": "若您有任何問題或建議,歡迎至 github.com/RooCodeInc/Roo-Code 提出 issue,或加入 reddit.com/r/RooCodediscord.gg/roocode 討論。",