fix: resolve missing i18n keys and improve validation script

- Fixed find-missing-i18n-key.js script to handle keys without colons
- Added support for pluralization patterns (_one, _other, etc.)
- Skip test files to avoid false positives
- Added missing translation keys:
  - tokens in webview-ui common.json
  - providers.refreshModels.missingConfig in settings.json
  - temperature.useCustom in settings.json
  - errors.invalid_line_limit and errors.invalid_character_limit in src common.json
  - openai.invalidResponseFormat in embeddings.json

Fixes #6599
This commit is contained in:
Roo Code 2025-08-02 12:31:26 +00:00
parent 8513263a67
commit abe2ca2dd7
74 changed files with 15079 additions and 86 deletions

14813
missing-keys.txt Normal file

File diff suppressed because it is too large Load diff

View file

@ -89,23 +89,76 @@ function getValueByPath(obj, path) {
// Check if the key exists in all language files, return a list of missing language files
function checkKeyInLocales(key, localeDirs, localesDir) {
const [file, ...pathParts] = key.split(":")
const jsonPath = pathParts.join(".")
const missingLocales = []
localeDirs.forEach((locale) => {
const filePath = path.join(localesDir, locale, `${file}.json`)
if (!fs.existsSync(filePath)) {
missingLocales.push(`${locale}/${file}.json`)
return
}
// Check if key contains a colon (file:path format)
if (key.includes(":")) {
const colonIndex = key.indexOf(":")
const file = key.substring(0, colonIndex)
const jsonPath = key.substring(colonIndex + 1)
const json = JSON.parse(fs.readFileSync(filePath, "utf8"))
if (getValueByPath(json, jsonPath) === undefined) {
missingLocales.push(`${locale}/${file}.json`)
}
})
localeDirs.forEach((locale) => {
const filePath = path.join(localesDir, locale, `${file}.json`)
if (!fs.existsSync(filePath)) {
missingLocales.push(`${locale}/${file}.json`)
return
}
try {
const json = JSON.parse(fs.readFileSync(filePath, "utf8"))
let found = false
// Check for exact key
if (getValueByPath(json, jsonPath) !== undefined) {
found = true
}
// Check for pluralization patterns (_one, _other, _zero, _few, _many)
if (!found) {
const pluralSuffixes = ["_one", "_other", "_zero", "_few", "_many"]
for (const suffix of pluralSuffixes) {
if (getValueByPath(json, jsonPath + suffix) !== undefined) {
found = true
break
}
}
}
if (!found) {
missingLocales.push(`${locale}/${file}.json`)
}
} catch (e) {
// If we can't parse the file, consider the key missing
missingLocales.push(`${locale}/${file}.json`)
}
})
} else {
// Key doesn't contain colon, search in all JSON files
localeDirs.forEach((locale) => {
const localeDir = path.join(localesDir, locale)
let found = false
// Get all JSON files in the locale directory
const jsonFiles = fs.readdirSync(localeDir).filter((file) => file.endsWith(".json"))
for (const jsonFile of jsonFiles) {
const filePath = path.join(localeDir, jsonFile)
try {
const json = JSON.parse(fs.readFileSync(filePath, "utf8"))
if (getValueByPath(json, key) !== undefined) {
found = true
break
}
} catch (e) {
// Skip files that can't be parsed
}
}
if (!found) {
missingLocales.push(`${locale}/${key}`)
}
})
}
return missingLocales
}
@ -121,8 +174,9 @@ function findMissingI18nKeys() {
const filePath = path.join(dir, file)
const stat = fs.statSync(filePath)
// Exclude test files and __mocks__ directory
if (filePath.includes(".test.") || filePath.includes("__mocks__")) continue
// Exclude test files, __mocks__ directory, and node_modules
if (filePath.includes(".test.") || filePath.includes("__mocks__") || filePath.includes("node_modules"))
continue
if (stat.isDirectory()) {
walk(filePath, baseDir, localeDirs, localesDir) // Recursively traverse subdirectories

View file

@ -103,7 +103,9 @@
"noResponseBody": "Error de l'API de Cerebras: No hi ha cos de resposta",
"completionError": "Error de finalització de Cerebras: {{error}}"
},
"mode_import_failed": "Ha fallat la importació del mode: {{error}}"
"mode_import_failed": "Ha fallat la importació del mode: {{error}}",
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "No s'ha seleccionat contingut de terminal",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Ha fallat durant l'escaneig inicial: {{errorMessage}}",
"unknownError": "Error desconegut",
"indexingRequiresWorkspace": "Indexació requereix una carpeta de workspace oberta"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Cerebras API-Fehler ({{status}}): {{message}}",
"noResponseBody": "Cerebras API-Fehler: Kein Antworttext vorhanden",
"completionError": "Cerebras-Vervollständigungsfehler: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "Kein Terminal-Inhalt ausgewählt",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Fehler während des ersten Scans: {{errorMessage}}",
"unknownError": "Unbekannter Fehler",
"indexingRequiresWorkspace": "Indexierung erfordert einen offenen Workspace-Ordner"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -26,6 +26,8 @@
"error_saving_image": "Error saving image: {{errorMessage}}",
"could_not_open_file": "Could not open file: {{errorMessage}}",
"could_not_open_file_generic": "Could not open file!",
"invalid_line_limit": "Terminal output line limit must be a positive number",
"invalid_character_limit": "Terminal output character limit must be a positive number",
"checkpoint_timeout": "Timed out when attempting to restore checkpoint.",
"checkpoint_failed": "Failed to restore checkpoint.",
"git_not_installed": "Git is required for the checkpoints feature. Please install Git to enable checkpoints.",

View file

@ -17,6 +17,9 @@
"modelNotEmbeddingCapable": "Ollama model is not embedding capable: {{modelId}}",
"hostNotFound": "Ollama host not found: {{baseUrl}}"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
},
"scanner": {
"unknownErrorProcessingFile": "Unknown error processing file {{filePath}}",
"unknownErrorDeletingPoints": "Unknown error deleting points for {{filePath}}",

View file

@ -99,7 +99,9 @@
"genericError": "Error de la API de Cerebras ({{status}}): {{message}}",
"noResponseBody": "Error de la API de Cerebras: Sin cuerpo de respuesta",
"completionError": "Error de finalización de Cerebras: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "No hay contenido de terminal seleccionado",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Falló durante el escaneo inicial: {{errorMessage}}",
"unknownError": "Error desconocido",
"indexingRequiresWorkspace": "La indexación requiere una carpeta de workspace abierta"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Erreur de l'API Cerebras ({{status}}) : {{message}}",
"noResponseBody": "Erreur de l'API Cerebras : Aucun corps de réponse",
"completionError": "Erreur d'achèvement de Cerebras : {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "Aucun contenu de terminal sélectionné",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Échec lors du scan initial : {{errorMessage}}",
"unknownError": "Erreur inconnue",
"indexingRequiresWorkspace": "L'indexation nécessite l'ouverture d'un dossier workspace"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Cerebras API त्रुटि ({{status}}): {{message}}",
"noResponseBody": "Cerebras API त्रुटि: कोई प्रतिक्रिया मुख्य भाग नहीं",
"completionError": "Cerebras पूर्णता त्रुटि: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "कोई टर्मिनल सामग्री चयनित नहीं",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "प्रारंभिक स्कैन के दौरान असफल: {{errorMessage}}",
"unknownError": "अज्ञात त्रुटि",
"indexingRequiresWorkspace": "इंडेक्सिंग के लिए एक खुला वर्कस्पेस फ़ोल्डर आवश्यक है"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Kesalahan API Cerebras ({{status}}): {{message}}",
"noResponseBody": "Kesalahan API Cerebras: Tidak ada isi respons",
"completionError": "Kesalahan penyelesaian Cerebras: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "Tidak ada konten terminal yang dipilih",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Gagal selama pemindaian awal: {{errorMessage}}",
"unknownError": "Kesalahan tidak diketahui",
"indexingRequiresWorkspace": "Pengindeksan memerlukan folder workspace yang terbuka"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Errore API Cerebras ({{status}}): {{message}}",
"noResponseBody": "Errore API Cerebras: Nessun corpo di risposta",
"completionError": "Errore di completamento Cerebras: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "Nessun contenuto del terminale selezionato",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Fallito durante la scansione iniziale: {{errorMessage}}",
"unknownError": "Errore sconosciuto",
"indexingRequiresWorkspace": "L'indicizzazione richiede una cartella di workspace aperta"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Cerebras APIエラー ({{status}}): {{message}}",
"noResponseBody": "Cerebras APIエラー: レスポンスボディなし",
"completionError": "Cerebras完了エラー: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "選択されたターミナルコンテンツがありません",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "初期スキャン中に失敗しました:{{errorMessage}}",
"unknownError": "不明なエラー",
"indexingRequiresWorkspace": "インデックス作成には、開かれたワークスペースフォルダーが必要です"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Cerebras API 오류 ({{status}}): {{message}}",
"noResponseBody": "Cerebras API 오류: 응답 본문 없음",
"completionError": "Cerebras 완료 오류: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "선택된 터미널 내용이 없습니다",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "초기 스캔 중 실패: {{errorMessage}}",
"unknownError": "알 수 없는 오류",
"indexingRequiresWorkspace": "인덱싱에는 열린 워크스페이스 폴더가 필요합니다"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Cerebras API-fout ({{status}}): {{message}}",
"noResponseBody": "Cerebras API-fout: Geen responslichaam",
"completionError": "Cerebras-voltooiingsfout: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "Geen terminalinhoud geselecteerd",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Mislukt tijdens initiële scan: {{errorMessage}}",
"unknownError": "Onbekende fout",
"indexingRequiresWorkspace": "Indexering vereist een geopende workspace map"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Błąd API Cerebras ({{status}}): {{message}}",
"noResponseBody": "Błąd API Cerebras: Brak treści odpowiedzi",
"completionError": "Błąd uzupełniania Cerebras: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "Nie wybrano zawartości terminala",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Niepowodzenie podczas początkowego skanowania: {{errorMessage}}",
"unknownError": "Nieznany błąd",
"indexingRequiresWorkspace": "Indeksowanie wymaga otwartego folderu workspace"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -103,7 +103,9 @@
"genericError": "Erro da API Cerebras ({{status}}): {{message}}",
"noResponseBody": "Erro da API Cerebras: Sem corpo de resposta",
"completionError": "Erro de conclusão do Cerebras: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "Nenhum conteúdo do terminal selecionado",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Falhou durante a varredura inicial: {{errorMessage}}",
"unknownError": "Erro desconhecido",
"indexingRequiresWorkspace": "A indexação requer uma pasta de workspace aberta"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Ошибка Cerebras API ({{status}}): {{message}}",
"noResponseBody": "Ошибка Cerebras API: Нет тела ответа",
"completionError": "Ошибка завершения Cerebras: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "Не выбрано содержимое терминала",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Ошибка во время первоначального сканирования: {{errorMessage}}",
"unknownError": "Неизвестная ошибка",
"indexingRequiresWorkspace": "Для индексации требуется открытая папка рабочего пространства"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Cerebras API Hatası ({{status}}): {{message}}",
"noResponseBody": "Cerebras API Hatası: Yanıt gövdesi yok",
"completionError": "Cerebras tamamlama hatası: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "Seçili terminal içeriği yok",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "İlk tarama sırasında başarısız: {{errorMessage}}",
"unknownError": "Bilinmeyen hata",
"indexingRequiresWorkspace": "İndeksleme açık bir workspace klasörü gerektirir"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"genericError": "Lỗi API Cerebras ({{status}}): {{message}}",
"noResponseBody": "Lỗi API Cerebras: Không có nội dung phản hồi",
"completionError": "Lỗi hoàn thành Cerebras: {{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "Không có nội dung terminal được chọn",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "Thất bại trong quá trình quét ban đầu: {{errorMessage}}",
"unknownError": "Lỗi không xác định",
"indexingRequiresWorkspace": "Lập chỉ mục yêu cầu một thư mục workspace đang mở"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -104,7 +104,9 @@
"genericError": "Cerebras API 错误 ({{status}}){{message}}",
"noResponseBody": "Cerebras API 错误:无响应主体",
"completionError": "Cerebras 完成错误:{{error}}"
}
},
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "没有选择终端内容",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "初始扫描失败:{{errorMessage}}",
"unknownError": "未知错误",
"indexingRequiresWorkspace": "索引需要打开的工作区文件夹"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -99,7 +99,9 @@
"noResponseBody": "Cerebras API 錯誤:無回應主體",
"completionError": "Cerebras 完成錯誤:{{error}}"
},
"mode_import_failed": "匯入模式失敗:{{error}}"
"mode_import_failed": "匯入模式失敗:{{error}}",
"invalid_line_limit": "Invalid line limit",
"invalid_character_limit": "Invalid character limit"
},
"warnings": {
"no_terminal_content": "沒有選擇終端機內容",

View file

@ -61,5 +61,8 @@
"failedDuringInitialScan": "初始掃描失敗:{{errorMessage}}",
"unknownError": "未知錯誤",
"indexingRequiresWorkspace": "索引需要開啟的工作區資料夾"
},
"openai": {
"invalidResponseFormat": "Invalid response format from OpenAI API"
}
}

View file

@ -67,5 +67,6 @@
"editMessage": "Editar missatge",
"editWarning": "Editar aquest missatge eliminarà tots els missatges posteriors de la conversa. Vols continuar?",
"proceed": "Continuar"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "Si us plau, torneu a obrir la configuració per veure els models més recents.",
"loading": "Actualitzant la llista de models...",
"success": "Llista de models actualitzada correctament!",
"error": "No s'ha pogut actualitzar la llista de models. Si us plau, torneu-ho a provar."
"error": "No s'ha pogut actualitzar la llista de models. Si us plau, torneu-ho a provar.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Obtenir clau API de Requesty",
"openRouterTransformsText": "Comprimir prompts i cadenes de missatges a la mida del context (<a>Transformacions d'OpenRouter</a>)",
@ -693,7 +694,7 @@
"description": "Quan està marcat, Roo no utilitzarà la memòria cau de prompts per a aquest model."
},
"temperature": {
"useCustom": "Utilitzar temperatura personalitzada",
"useCustom": "Use custom temperature",
"description": "Controla l'aleatorietat en les respostes del model.",
"rangeDescription": "Valors més alts fan que la sortida sigui més aleatòria, valors més baixos la fan més determinista."
},

View file

@ -67,5 +67,6 @@
"editMessage": "Nachricht bearbeiten",
"editWarning": "Das Bearbeiten dieser Nachricht wird alle nachfolgenden Nachrichten in der Unterhaltung löschen. Möchtest du fortfahren?",
"proceed": "Fortfahren"
}
},
"tokens": "tokens"
}

View file

@ -252,7 +252,8 @@
"hint": "Bitte öffne die Einstellungen erneut, um die neuesten Modelle zu sehen.",
"loading": "Modellliste wird aktualisiert...",
"success": "Modellliste erfolgreich aktualisiert!",
"error": "Fehler beim Aktualisieren der Modellliste. Bitte versuche es erneut."
"error": "Fehler beim Aktualisieren der Modellliste. Bitte versuche es erneut.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Requesty API-Schlüssel erhalten",
"openRouterTransformsText": "Prompts und Nachrichtenketten auf Kontextgröße komprimieren (<a>OpenRouter Transformationen</a>)",
@ -693,7 +694,7 @@
"description": "Wenn aktiviert, wird Roo für dieses Modell kein Prompt-Caching verwenden."
},
"temperature": {
"useCustom": "Benutzerdefinierte Temperatur verwenden",
"useCustom": "Use custom temperature",
"description": "Steuert die Zufälligkeit der Modellantworten.",
"rangeDescription": "Höhere Werte machen die Ausgabe zufälliger, niedrigere Werte machen sie deterministischer."
},

View file

@ -67,5 +67,6 @@
"editMessage": "Edit Message",
"editWarning": "Editing this message will delete all subsequent messages in the conversation. Do you want to proceed?",
"proceed": "Proceed"
}
},
"tokens": "tokens"
}

View file

@ -249,7 +249,8 @@
"hint": "Please reopen the settings to see the latest models.",
"loading": "Refreshing models list...",
"success": "Models list refreshed successfully!",
"error": "Failed to refresh models list. Please try again."
"error": "Failed to refresh models list. Please try again.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Get Requesty API Key",
"openRouterTransformsText": "Compress prompts and message chains to the context size (<a>OpenRouter Transforms</a>)",

View file

@ -67,5 +67,6 @@
"editMessage": "Editar mensaje",
"editWarning": "Editar este mensaje eliminará todos los mensajes posteriores en la conversación. ¿Deseas continuar?",
"proceed": "Continuar"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "Por favor, vuelve a abrir la configuración para ver los modelos más recientes.",
"loading": "Actualizando lista de modelos...",
"success": "¡Lista de modelos actualizada correctamente!",
"error": "Error al actualizar la lista de modelos. Por favor, inténtalo de nuevo."
"error": "Error al actualizar la lista de modelos. Por favor, inténtalo de nuevo.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Obtener clave API de Requesty",
"openRouterTransformsText": "Comprimir prompts y cadenas de mensajes al tamaño del contexto (<a>Transformaciones de OpenRouter</a>)",
@ -693,7 +694,7 @@
"description": "Cuando está marcado, Roo no utilizará el caché de prompts para este modelo."
},
"temperature": {
"useCustom": "Usar temperatura personalizada",
"useCustom": "Use custom temperature",
"description": "Controla la aleatoriedad en las respuestas del modelo.",
"rangeDescription": "Valores más altos hacen que la salida sea más aleatoria, valores más bajos la hacen más determinista."
},

View file

@ -67,5 +67,6 @@
"editMessage": "Modifier le message",
"editWarning": "Modifier ce message supprimera tous les messages suivants dans la conversation. Voulez-vous continuer ?",
"proceed": "Continuer"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "Veuillez rouvrir les paramètres pour voir les modèles les plus récents.",
"loading": "Actualisation de la liste des modèles...",
"success": "Liste des modèles actualisée avec succès !",
"error": "Échec de l'actualisation de la liste des modèles. Veuillez réessayer."
"error": "Échec de l'actualisation de la liste des modèles. Veuillez réessayer.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Obtenir la clé API Requesty",
"openRouterTransformsText": "Compresser les prompts et chaînes de messages à la taille du contexte (<a>Transformations OpenRouter</a>)",
@ -693,7 +694,7 @@
"description": "Lorsque cette option est cochée, Roo n'utilisera pas la mise en cache des prompts pour ce modèle."
},
"temperature": {
"useCustom": "Utiliser une température personnalisée",
"useCustom": "Use custom temperature",
"description": "Contrôle l'aléatoire dans les réponses du modèle.",
"rangeDescription": "Des valeurs plus élevées rendent la sortie plus aléatoire, des valeurs plus basses la rendent plus déterministe."
},

View file

@ -67,5 +67,6 @@
"editMessage": "संदेश संपादित करें",
"editWarning": "इस संदेश को संपादित करने से बातचीत के सभी बाद के संदेश हट जाएंगे। क्या आप जारी रखना चाहते हैं?",
"proceed": "जारी रखें"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "नवीनतम मॉडल देखने के लिए कृपया सेटिंग्स को फिर से खोलें।",
"loading": "मॉडल सूची अपडेट हो रही है...",
"success": "मॉडल सूची सफलतापूर्वक अपडेट की गई!",
"error": "मॉडल सूची अपडेट करने में विफल। कृपया पुनः प्रयास करें।"
"error": "मॉडल सूची अपडेट करने में विफल। कृपया पुनः प्रयास करें।",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Requesty API कुंजी प्राप्त करें",
"openRouterTransformsText": "संदर्भ आकार के लिए प्रॉम्प्ट और संदेश श्रृंखलाओं को संपीड़ित करें (<a>OpenRouter ट्रांसफॉर्म</a>)",
@ -694,7 +695,7 @@
"description": "जब चेक किया जाता है, तो Roo इस मॉडल के लिए प्रॉम्प्ट कैशिंग का उपयोग नहीं करेगा।"
},
"temperature": {
"useCustom": "कस्टम तापमान का उपयोग करें",
"useCustom": "Use custom temperature",
"description": "मॉडल की प्रतिक्रियाओं में यादृच्छिकता को नियंत्रित करता है।",
"rangeDescription": "उच्च मान आउटपुट को अधिक यादृच्छिक बनाते हैं, निम्न मान इसे अधिक निर्धारित बनाते हैं।"
},

View file

@ -67,5 +67,6 @@
"editMessage": "Edit Pesan",
"editWarning": "Mengedit pesan ini akan menghapus semua pesan selanjutnya dalam percakapan. Apakah kamu ingin melanjutkan?",
"proceed": "Lanjutkan"
}
},
"tokens": "tokens"
}

View file

@ -254,7 +254,8 @@
"hint": "Silakan buka kembali pengaturan untuk melihat model terbaru.",
"loading": "Merefresh daftar model...",
"success": "Daftar model berhasil direfresh!",
"error": "Gagal merefresh daftar model. Silakan coba lagi."
"error": "Gagal merefresh daftar model. Silakan coba lagi.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Dapatkan Requesty API Key",
"openRouterTransformsText": "Kompres prompt dan rantai pesan ke ukuran konteks (<a>OpenRouter Transforms</a>)",
@ -723,7 +724,7 @@
"description": "Ketika dicentang, Roo tidak akan menggunakan prompt caching untuk model ini."
},
"temperature": {
"useCustom": "Gunakan temperature kustom",
"useCustom": "Use custom temperature",
"description": "Mengontrol keacakan dalam respons model.",
"rangeDescription": "Nilai yang lebih tinggi membuat output lebih acak, nilai yang lebih rendah membuatnya lebih deterministik."
},

View file

@ -67,5 +67,6 @@
"editMessage": "Modifica Messaggio",
"editWarning": "Modificando questo messaggio verranno eliminati tutti i messaggi successivi nella conversazione. Vuoi procedere?",
"proceed": "Procedi"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "Riapri le impostazioni per vedere i modelli più recenti.",
"loading": "Aggiornamento dell'elenco dei modelli...",
"success": "Elenco dei modelli aggiornato con successo!",
"error": "Impossibile aggiornare l'elenco dei modelli. Riprova."
"error": "Impossibile aggiornare l'elenco dei modelli. Riprova.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Ottieni chiave API Requesty",
"openRouterTransformsText": "Comprimi prompt e catene di messaggi alla dimensione del contesto (<a>Trasformazioni OpenRouter</a>)",
@ -694,7 +695,7 @@
"description": "Quando selezionato, Roo non utilizzerà la cache dei prompt per questo modello."
},
"temperature": {
"useCustom": "Usa temperatura personalizzata",
"useCustom": "Use custom temperature",
"description": "Controlla la casualità nelle risposte del modello.",
"rangeDescription": "Valori più alti rendono l'output più casuale, valori più bassi lo rendono più deterministico."
},

View file

@ -67,5 +67,6 @@
"editMessage": "メッセージを編集",
"editWarning": "このメッセージを編集すると、会話内の後続のメッセージもすべて削除されます。続行しますか?",
"proceed": "続行"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "最新のモデルを表示するには設定を再度開いてください。",
"loading": "モデルリストを更新中...",
"success": "モデルリストが正常に更新されました!",
"error": "モデルリストの更新に失敗しました。もう一度お試しください。"
"error": "モデルリストの更新に失敗しました。もう一度お試しください。",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Requesty APIキーを取得",
"openRouterTransformsText": "プロンプトとメッセージチェーンをコンテキストサイズに圧縮 (<a>OpenRouter Transforms</a>)",
@ -694,7 +695,7 @@
"description": "チェックすると、Rooはこのモデルに対してプロンプトキャッシュを使用しません。"
},
"temperature": {
"useCustom": "カスタム温度を使用",
"useCustom": "Use custom temperature",
"description": "モデルの応答のランダム性を制御します。",
"rangeDescription": "高い値は出力をよりランダムに、低い値はより決定論的にします。"
},

View file

@ -67,5 +67,6 @@
"editMessage": "메시지 편집",
"editWarning": "이 메시지를 편집하면 대화의 모든 후속 메시지가 삭제됩니다. 계속하시겠습니까?",
"proceed": "계속"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "최신 모델을 보려면 설정을 다시 열어주세요.",
"loading": "모델 목록 새로고침 중...",
"success": "모델 목록이 성공적으로 새로고침되었습니다!",
"error": "모델 목록 새로고침에 실패했습니다. 다시 시도해 주세요."
"error": "모델 목록 새로고침에 실패했습니다. 다시 시도해 주세요.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Requesty API 키 받기",
"openRouterTransformsText": "프롬프트와 메시지 체인을 컨텍스트 크기로 압축 (<a>OpenRouter Transforms</a>)",
@ -694,7 +695,7 @@
"description": "체크하면 Roo가 이 모델에 대해 프롬프트 캐싱을 사용하지 않습니다."
},
"temperature": {
"useCustom": "사용자 정의 온도 사용",
"useCustom": "Use custom temperature",
"description": "모델 응답의 무작위성을 제어합니다.",
"rangeDescription": "높은 값은 출력을 더 무작위하게, 낮은 값은 더 결정적으로 만듭니다."
},

View file

@ -67,5 +67,6 @@
"editMessage": "Bericht Bewerken",
"editWarning": "Het bewerken van dit bericht zal alle volgende berichten in het gesprek verwijderen. Wil je doorgaan?",
"proceed": "Doorgaan"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "Open de instellingen opnieuw om de nieuwste modellen te zien.",
"loading": "Modellenlijst wordt vernieuwd...",
"success": "Modellenlijst succesvol vernieuwd!",
"error": "Kan modellenlijst niet vernieuwen. Probeer het opnieuw."
"error": "Kan modellenlijst niet vernieuwen. Probeer het opnieuw.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Requesty API-sleutel ophalen",
"openRouterTransformsText": "Comprimeer prompts en berichtreeksen tot de contextgrootte (<a>OpenRouter Transforms</a>)",
@ -694,7 +695,7 @@
"description": "Indien ingeschakeld, gebruikt Roo dit model met prompt caching om kosten te verlagen."
},
"temperature": {
"useCustom": "Aangepaste temperatuur gebruiken",
"useCustom": "Use custom temperature",
"description": "Bepaalt de willekeurigheid in de antwoorden van het model.",
"rangeDescription": "Hogere waarden maken de output willekeuriger, lagere waarden maken deze deterministischer."
},

View file

@ -67,5 +67,6 @@
"editMessage": "Edytuj Wiadomość",
"editWarning": "Edycja tej wiadomości spowoduje usunięcie wszystkich kolejnych wiadomości w rozmowie. Czy chcesz kontynuować?",
"proceed": "Kontynuuj"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "Proszę ponownie otworzyć ustawienia, aby zobaczyć najnowsze modele.",
"loading": "Odświeżanie listy modeli...",
"success": "Lista modeli została pomyślnie odświeżona!",
"error": "Nie udało się odświeżyć listy modeli. Spróbuj ponownie."
"error": "Nie udało się odświeżyć listy modeli. Spróbuj ponownie.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Uzyskaj klucz API Requesty",
"openRouterTransformsText": "Kompresuj podpowiedzi i łańcuchy wiadomości do rozmiaru kontekstu (<a>Transformacje OpenRouter</a>)",
@ -694,7 +695,7 @@
"description": "Po zaznaczeniu, Roo nie będzie używać buforowania promptów dla tego modelu."
},
"temperature": {
"useCustom": "Użyj niestandardowej temperatury",
"useCustom": "Use custom temperature",
"description": "Kontroluje losowość w odpowiedziach modelu.",
"rangeDescription": "Wyższe wartości sprawiają, że wyjście jest bardziej losowe, niższe wartości czynią je bardziej deterministycznym."
},

View file

@ -67,5 +67,6 @@
"editMessage": "Editar Mensagem",
"editWarning": "Editar esta mensagem irá excluir todas as mensagens subsequentes na conversa. Deseja prosseguir?",
"proceed": "Prosseguir"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "Por favor, reabra as configurações para ver os modelos mais recentes.",
"loading": "Atualizando lista de modelos...",
"success": "Lista de modelos atualizada com sucesso!",
"error": "Falha ao atualizar a lista de modelos. Por favor, tente novamente."
"error": "Falha ao atualizar a lista de modelos. Por favor, tente novamente.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Obter chave de API Requesty",
"openRouterTransformsText": "Comprimir prompts e cadeias de mensagens para o tamanho do contexto (<a>Transformações OpenRouter</a>)",
@ -694,7 +695,7 @@
"description": "Quando marcado, o Roo não usará o cache de prompts para este modelo."
},
"temperature": {
"useCustom": "Usar temperatura personalizada",
"useCustom": "Use custom temperature",
"description": "Controla a aleatoriedade nas respostas do modelo.",
"rangeDescription": "Valores mais altos tornam a saída mais aleatória, valores mais baixos a tornam mais determinística."
},

View file

@ -67,5 +67,6 @@
"editMessage": "Редактировать Сообщение",
"editWarning": "Редактирование этого сообщения приведет к удалению всех последующих сообщений в разговоре. Хотите продолжить?",
"proceed": "Продолжить"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "Пожалуйста, откройте настройки заново, чтобы увидеть последние модели.",
"loading": "Обновление списка моделей...",
"success": "Список моделей успешно обновлен!",
"error": "Не удалось обновить список моделей. Пожалуйста, попробуйте снова."
"error": "Не удалось обновить список моделей. Пожалуйста, попробуйте снова.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Получить Requesty API-ключ",
"openRouterTransformsText": "Сжимать подсказки и цепочки сообщений до размера контекста (<a>OpenRouter Transforms</a>)",
@ -694,7 +695,7 @@
"description": "Если отмечено, Roo не будет использовать кэширование промптов для этой модели."
},
"temperature": {
"useCustom": "Использовать пользовательскую температуру",
"useCustom": "Use custom temperature",
"description": "Управляет случайностью ответов модели.",
"rangeDescription": "Более высокие значения делают ответы более случайными, низкие — более детерминированными."
},

View file

@ -67,5 +67,6 @@
"editMessage": "Mesajı Düzenle",
"editWarning": "Bu mesajı düzenlemek, konuşmadaki sonraki tüm mesajları da silecektir. Devam etmek istiyor musun?",
"proceed": "Devam Et"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "En son modelleri görmek için lütfen ayarları yeniden açın.",
"loading": "Model listesi yenileniyor...",
"success": "Model listesi başarıyla yenilendi!",
"error": "Model listesi yenilenemedi. Lütfen tekrar deneyin."
"error": "Model listesi yenilenemedi. Lütfen tekrar deneyin.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Requesty API Anahtarı Al",
"openRouterTransformsText": "İstem ve mesaj zincirlerini bağlam boyutuna sıkıştır (<a>OpenRouter Dönüşümleri</a>)",
@ -694,7 +695,7 @@
"description": "İşaretlendiğinde, Roo bu model için prompt önbelleğini kullanmayacaktır."
},
"temperature": {
"useCustom": "Özel sıcaklık kullan",
"useCustom": "Use custom temperature",
"description": "Model yanıtlarındaki rastgeleliği kontrol eder.",
"rangeDescription": "Daha yüksek değerler çıktıyı daha rastgele yapar, daha düşük değerler daha deterministik hale getirir."
},

View file

@ -67,5 +67,6 @@
"editMessage": "Chỉnh Sửa Tin Nhắn",
"editWarning": "Chỉnh sửa tin nhắn này sẽ xóa tất cả các tin nhắn tiếp theo trong cuộc trò chuyện. Bạn có muốn tiếp tục không?",
"proceed": "Tiếp Tục"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "Vui lòng mở lại cài đặt để xem các mô hình mới nhất.",
"loading": "Đang làm mới danh sách mô hình...",
"success": "Danh sách mô hình đã được làm mới thành công!",
"error": "Không thể làm mới danh sách mô hình. Vui lòng thử lại."
"error": "Không thể làm mới danh sách mô hình. Vui lòng thử lại.",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "Lấy khóa API Requesty",
"openRouterTransformsText": "Nén lời nhắc và chuỗi tin nhắn theo kích thước ngữ cảnh (<a>OpenRouter Transforms</a>)",
@ -694,7 +695,7 @@
"description": "Khi được chọn, Roo sẽ không sử dụng bộ nhớ đệm prompt cho mô hình này."
},
"temperature": {
"useCustom": "Sử dụng nhiệt độ tùy chỉnh",
"useCustom": "Use custom temperature",
"description": "Kiểm soát tính ngẫu nhiên trong phản hồi của mô hình.",
"rangeDescription": "Giá trị cao hơn làm cho đầu ra ngẫu nhiên hơn, giá trị thấp hơn làm cho nó xác định hơn."
},

View file

@ -67,5 +67,6 @@
"editMessage": "编辑消息",
"editWarning": "编辑此消息将删除对话中的所有后续消息。是否继续?",
"proceed": "继续"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "请重新打开设置以查看最新模型。",
"loading": "正在刷新模型列表...",
"success": "模型列表刷新成功!",
"error": "刷新模型列表失败。请重试。"
"error": "刷新模型列表失败。请重试。",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "获取 Requesty API 密钥",
"openRouterTransformsText": "自动压缩提示词和消息链到上下文长度限制内 (<a>OpenRouter转换</a>)",
@ -694,7 +695,7 @@
"description": "选中后Roo 将不会为此模型使用提示词缓存。"
},
"temperature": {
"useCustom": "使用自定义温度",
"useCustom": "Use custom temperature",
"description": "控制模型响应的随机性",
"rangeDescription": "值越高回答越多样,值越低越保守"
},

View file

@ -67,5 +67,6 @@
"editMessage": "編輯訊息",
"editWarning": "編輯此訊息將刪除對話中的所有後續訊息。是否繼續?",
"proceed": "繼續"
}
},
"tokens": "tokens"
}

View file

@ -250,7 +250,8 @@
"hint": "請重新開啟設定以查看最新模型。",
"loading": "正在重新整理模型列表...",
"success": "模型列表重新整理成功!",
"error": "重新整理模型列表失敗。請再試一次。"
"error": "重新整理模型列表失敗。請再試一次。",
"missingConfig": "Missing configuration. Please provide API key and base URL."
},
"getRequestyApiKey": "取得 Requesty API 金鑰",
"openRouterTransformsText": "將提示和訊息鏈壓縮到上下文大小 (<a>OpenRouter 轉換</a>)",
@ -694,7 +695,7 @@
"description": "勾選後Roo 將不會為此模型使用提示詞快取。"
},
"temperature": {
"useCustom": "使用自訂溫度",
"useCustom": "Use custom temperature",
"description": "控制模型回應的隨機性",
"rangeDescription": "較高值使輸出更隨機,較低值更確定"
},