From 0833ef4221e7df3bd0657f5c2c04571a95a228af Mon Sep 17 00:00:00 2001 From: kirillk Date: Mon, 11 May 2026 15:47:17 -0400 Subject: [PATCH 1/6] feat: support JetBrains history session actions --- .../kilo-jetbrains/backend/build.gradle.kts | 1 + .../backend/app/KiloBackendSessionManager.kt | 49 +- .../kilocode/backend/cli/KiloCliDataParser.kt | 14 +- .../backend/rpc/KiloSessionRpcApiImpl.kt | 5 + .../app/KiloBackendSessionManagerTest.kt | 157 ++++++ .../cli/GeneratedApiModelSerializationTest.kt | 84 ++- .../backend/cli/KiloCliDataParserTest.kt | 30 ++ .../cli/ProjectModelSerializationTest.kt | 30 +- .../cli/SessionModelSerializationTest.kt | 85 ++- .../kilocode/backend/testing/MockCliServer.kt | 17 +- .../src/main/kotlin/FixGeneratedApiTask.kt | 11 +- .../client/actions/DeleteSessionAction.kt | 47 ++ .../client/actions/OpenSessionAction.kt | 26 + .../client/actions/RenameSessionAction.kt | 47 ++ .../kilocode/client/app/KiloSessionService.kt | 6 + .../client/session/SessionSidePanelManager.kt | 2 +- .../session/history/HistoryController.kt | 15 +- .../client/session/history/HistoryDataKeys.kt | 16 + .../session/history/HistoryListRenderer.kt | 30 +- .../client/session/history/HistoryListUi.kt | 3 +- .../client/session/history/HistoryModel.kt | 6 + .../client/session/history/HistoryPanel.kt | 116 +++-- .../client/session/ui/EmptySessionPanel.kt | 4 +- .../session/ui/header/SessionHeaderPanel.kt | 2 +- .../resources/kilo.jetbrains.frontend.xml | 20 + .../resources/messages/KiloBundle.properties | 11 + .../actions/HistorySessionActionsTest.kt | 488 ++++++++++++++++++ .../client/app/KiloSessionServiceTest.kt | 100 ++++ .../session/history/HistoryControllerTest.kt | 241 ++++++++- .../client/testing/FakeSessionRpcApi.kt | 16 + .../ai/kilocode/rpc/KiloSessionRpcApi.kt | 3 + 31 files changed, 1571 insertions(+), 111 deletions(-) create mode 100644 packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/DeleteSessionAction.kt create mode 100644 packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/OpenSessionAction.kt create mode 100644 packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/RenameSessionAction.kt create mode 100644 packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryDataKeys.kt create mode 100644 packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/actions/HistorySessionActionsTest.kt create mode 100644 packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/app/KiloSessionServiceTest.kt diff --git a/packages/kilo-jetbrains/backend/build.gradle.kts b/packages/kilo-jetbrains/backend/build.gradle.kts index b4cae1beac5..5924d04a5f9 100644 --- a/packages/kilo-jetbrains/backend/build.gradle.kts +++ b/packages/kilo-jetbrains/backend/build.gradle.kts @@ -43,6 +43,7 @@ openApiGenerate { "anyOf<>" to "kotlin.Any", "number" to "kotlin.Double", "decimal" to "kotlin.Double", + "integer" to "kotlin.Long", )) openapiNormalizer.set(mapOf( "SIMPLIFY_ANYOF_STRING_AND_ENUM_STRING" to "true", diff --git a/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendSessionManager.kt b/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendSessionManager.kt index b5e014623e8..dd649bfd1ec 100644 --- a/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendSessionManager.kt +++ b/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/app/KiloBackendSessionManager.kt @@ -21,6 +21,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.serialization.json.JsonPrimitive +import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request @@ -156,6 +157,36 @@ class KiloBackendSessionManager( directories.remove(id) } + /** + * Rename a session by sending `PATCH /session/{id}?directory={dir}` with `{"title":"..."}`. + * + * Uses raw HTTP because the generated Kotlin client is build-time only and + * this repo already uses raw HTTP for session create and cloud operations. + */ + fun rename(id: String, dir: String, title: String): SessionDto { + val h = http ?: throw IllegalStateException("Session manager not started") + val url = base ?: throw IllegalStateException("Session manager not started") + val json = """{"title":"${escape(title)}"}""" + val patch = url.toHttpUrl().newBuilder() + .addPathSegment("session") + .addPathSegment(id) + .addQueryParameter("directory", dir) + .build() + val request = Request.Builder() + .url(patch) + .method("PATCH", json.toRequestBody("application/json".toMediaType())) + .build() + + h.newCall(request).execute().use { response -> + val raw = response.body?.string() + if (!response.isSuccessful) { + log.warn("Session rename failed: HTTP ${response.code}, body=$raw") + throw RuntimeException("Session rename failed: HTTP ${response.code} — $raw") + } + return KiloCliDataParser.parseSession(raw!!) + } + } + fun cloudSessions(dir: String, cursor: String?, limit: Int, gitUrl: String?): CloudSessionListDto { val h = http ?: throw IllegalStateException("Session manager not started") val url = base ?: throw IllegalStateException("Session manager not started") @@ -238,9 +269,9 @@ class KiloBackendSessionManager( ), summary = s.summary?.let { SessionSummaryDto( - additions = it.additions.toInt(), - deletions = it.deletions.toInt(), - files = it.files.toInt(), + additions = it.additions.safeInt(), + deletions = it.deletions.safeInt(), + files = it.files.safeInt(), ) }, ) @@ -259,9 +290,9 @@ class KiloBackendSessionManager( ), summary = s.summary?.let { SessionSummaryDto( - additions = it.additions.toInt(), - deletions = it.deletions.toInt(), - files = it.files.toInt(), + additions = it.additions.safeInt(), + deletions = it.deletions.safeInt(), + files = it.files.safeInt(), ) }, ) @@ -269,8 +300,8 @@ class KiloBackendSessionManager( private fun statusDto(s: SessionStatus) = SessionStatusDto( type = s.type.value, message = s.message.ifBlank { null }, - attempt = s.attempt.toInt(), - next = s.next.toLong(), + attempt = s.attempt.safeInt(), + next = s.next, requestID = s.requestID.ifBlank { null }, ) @@ -288,4 +319,6 @@ class KiloBackendSessionManager( } } } + + private fun Long.safeInt() = coerceIn(Int.MIN_VALUE.toLong(), Int.MAX_VALUE.toLong()).toInt() } diff --git a/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/cli/KiloCliDataParser.kt b/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/cli/KiloCliDataParser.kt index 3371a389004..9e097feae5c 100644 --- a/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/cli/KiloCliDataParser.kt +++ b/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/cli/KiloCliDataParser.kt @@ -200,8 +200,8 @@ object KiloCliDataParser { val file = d.str("file") ?: return@mapNotNull null DiffFileDto( file = file, - additions = d.long("additions")?.toInt() ?: 0, - deletions = d.long("deletions")?.toInt() ?: 0, + additions = d.long("additions")?.safeInt() ?: 0, + deletions = d.long("deletions")?.safeInt() ?: 0, patch = d.str("patch"), ) } ?: emptyList() @@ -537,9 +537,9 @@ object KiloCliDataParser { ), summary = summary?.let { SessionSummaryDto( - additions = it.long("additions")?.toInt() ?: 0, - deletions = it.long("deletions")?.toInt() ?: 0, - files = it.long("files")?.toInt() ?: 0, + additions = it.long("additions")?.safeInt() ?: 0, + deletions = it.long("deletions")?.safeInt() ?: 0, + files = it.long("files")?.safeInt() ?: 0, ) }, ) @@ -564,7 +564,7 @@ object KiloCliDataParser { return SessionStatusDto( type = type, message = st.str("message"), - attempt = st.long("attempt")?.toInt(), + attempt = st.long("attempt")?.safeInt(), next = st.long("next"), requestID = st.str("requestID"), ) @@ -679,6 +679,8 @@ private fun JsonObject.num(key: String): Double? = private fun JsonObject.long(key: String): Long? = this[key]?.jsonPrimitive?.longOrNull +private fun Long.safeInt() = coerceIn(Int.MIN_VALUE.toLong(), Int.MAX_VALUE.toLong()).toInt() + private fun JsonObject?.map(key: String): Map { val obj = this?.get(key)?.jsonObject ?: return emptyMap() return obj.entries.mapNotNull { (name, value) -> diff --git a/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloSessionRpcApiImpl.kt b/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloSessionRpcApiImpl.kt index 302e3bb9f3b..0192304ef4a 100644 --- a/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloSessionRpcApiImpl.kt +++ b/packages/kilo-jetbrains/backend/src/main/kotlin/ai/kilocode/backend/rpc/KiloSessionRpcApiImpl.kt @@ -71,6 +71,11 @@ class KiloSessionRpcApiImpl : KiloSessionRpcApi { workspaces.get(dir).deleteSession(id) } + override suspend fun rename(id: String, directory: String, title: String): ai.kilocode.rpc.dto.SessionDto { + val dir = sessions.getDirectory(id, directory) + return sessions.rename(id, dir, title) + } + override suspend fun cloudSessions(directory: String, cursor: String?, limit: Int, gitUrl: String?): CloudSessionListDto = sessions.cloudSessions(directory, cursor, limit, gitUrl) diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendSessionManagerTest.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendSessionManagerTest.kt index 0f653f89f11..8419d47340d 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendSessionManagerTest.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/app/KiloBackendSessionManagerTest.kt @@ -20,6 +20,7 @@ import kotlin.test.AfterTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith +import kotlin.test.assertFalse import kotlin.test.assertNotNull import kotlin.test.assertTrue @@ -472,6 +473,134 @@ class KiloBackendSessionManagerTest { assertNotNull(result) } + // ------ Session rename ------ + + @Test + fun `rename patches session title and returns updated session`() = runBlocking { + mock.sessionRenameResponse = """{ + "id": "ses_1", + "slug": "s1", + "projectID": "prj_test", + "directory": "/test", + "title": "New Name", + "version": "1.0.0", + "time": {"created": 1000, "updated": 2000} + }""" + val app = setup() + ready(app) + + val session = app.sessions.rename("ses_1", "/test", "New Name") + + assertEquals("ses_1", session.id) + assertEquals("New Name", session.title) + val path = mock.lastSessionRenamePath ?: error("missing rename request") + assertTrue(path.startsWith("/session/ses_1?"), "Expected /session/ses_1?... got $path") + assertTrue(path.contains("directory=%2Ftest"), "Expected directory=/test in $path") + assertEquals("PATCH", mock.lastSessionRenameMethod) + assertEquals("""{"title":"New Name"}""", mock.lastSessionRenameBody) + } + + @Test + fun `rename response preserves directory parentId summary and timestamps`() = runBlocking { + mock.sessionRenameResponse = """{ + "id": "ses_1", + "slug": "s1", + "projectID": "prj_test", + "directory": "/worktree/path", + "title": "Renamed", + "version": "2.0.0", + "time": {"created": 1000, "updated": 9999}, + "parentID": "ses_parent", + "summary": {"additions": 5, "deletions": 3, "files": 2} + }""" + val app = setup() + ready(app) + + val session = app.sessions.rename("ses_1", "/test", "Renamed") + + assertEquals("/worktree/path", session.directory) + assertEquals("ses_parent", session.parentID) + assertEquals(1000.0, session.time.created) + assertEquals(9999.0, session.time.updated) + assertNotNull(session.summary) + assertEquals(5, session.summary!!.additions) + assertEquals(3, session.summary!!.deletions) + assertEquals(2, session.summary!!.files) + } + + @Test + fun `rename url-encodes session id and directory for special characters`() = runBlocking { + // Session IDs/directories may contain spaces, slashes, plus signs, and ampersands + val app = setup() + ready(app) + + app.sessions.rename("ses_a/b c", "/my dir/project", "New Name") + + val path = mock.lastSessionRenamePath ?: error("missing rename request") + assertTrue(path.startsWith("/session/ses_a%2Fb%20c?"), "Expected encoded session path in $path") + assertTrue(path.contains("directory=%2Fmy%20dir%2Fproject"), "Expected encoded directory in $path") + } + + @Test + fun `rename url-encodes ampersand plus and query separators`() = runBlocking { + val app = setup() + ready(app) + + app.sessions.rename("ses_a+b&c?d", "/path?a=1&b=2", "Title") + + val path: String = mock.lastSessionRenamePath ?: error("missing rename request") + val bare = path.substringBefore("?") + val query = path.substringAfter("?", "") + assertTrue(path.contains("/session/ses_a+b&c%3Fd?"), "Unexpected encoded session id: $path") + assertFalse(query.contains("/path?a=1&b=2"), "Directory must be encoded as one query value: $query") + assertTrue(query.contains("directory=%2Fpath%3Fa%3D1%26b%3D2"), "Unexpected encoded directory: $query") + } + + @Test + fun `rename encodes title in json body`() = runBlocking { + val app = setup() + ready(app) + + app.sessions.rename("ses_1", "/test", "Has \"quotes\" and \\ backslash") + + assertEquals("""{"title":"Has \"quotes\" and \\ backslash"}""", mock.lastSessionRenameBody) + } + + @Test + fun `rename encodes title control characters in json body`() = runBlocking { + val app = setup() + ready(app) + + app.sessions.rename("ses_1", "/test", "Line\nTab\tReturn\rBell\u0007") + + assertEquals("""{"title":"Line\nTab\tReturn\rBell\u0007"}""", mock.lastSessionRenameBody) + } + + @Test + fun `rename surfaces server failure`() = runBlocking { + mock.sessionRenameStatus = 500 + mock.sessionRenameResponse = """{"error":"boom"}""" + val app = setup() + ready(app) + + val err = assertFailsWith { + app.sessions.rename("ses_1", "/test", "New Name") + } + + assertTrue(err.message.orEmpty().contains("HTTP 500")) + assertTrue(err.message.orEmpty().contains("boom")) + } + + @Test + fun `rename throws before start`() = runBlocking { + val app = setup() + // Don't connect — manager is not started + + assertFailsWith { + app.sessions.rename("ses_1", "/test", "Title") + } + } + // ------ Session with summary ------ @Test @@ -496,4 +625,32 @@ class KiloBackendSessionManagerTest { assertEquals(7, session.summary!!.deletions) assertEquals(3, session.summary!!.files) } + + @Test + fun `status and summary long values clamp to shared dto int range`() = runBlocking { + mock.sessions = """[{ + "id": "ses_big", + "slug": "big", + "projectID": "prj", + "directory": "/d", + "title": "Big", + "version": "1", + "time": {"created": 1, "updated": 1}, + "summary": {"additions": 2147483648, "deletions": 9223372036854775807, "files": 3} + }]""" + mock.sessionStatuses = """{ + "ses_big": {"type":"retry","attempt":2147483648,"message":"retrying","next":9223372036854775807,"requestID":"req"} + }""" + val app = setup() + ready(app) + + val result = app.sessions.list("/d") + val session = result.sessions[0] + val status = result.statuses["ses_big"] ?: error("missing status") + + assertEquals(Int.MAX_VALUE, session.summary?.additions) + assertEquals(Int.MAX_VALUE, session.summary?.deletions) + assertEquals(Int.MAX_VALUE, status.attempt) + assertEquals(Long.MAX_VALUE, status.next) + } } diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/GeneratedApiModelSerializationTest.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/GeneratedApiModelSerializationTest.kt index 7ddd445175f..b19ed6072dd 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/GeneratedApiModelSerializationTest.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/GeneratedApiModelSerializationTest.kt @@ -39,7 +39,7 @@ class GeneratedApiModelSerializationTest { @Test fun `empty provider list`() { - val src = """{"all":[],"default":{},"connected":[]}""" + val src = """{"all":[],"default":{},"connected":[],"failed":[]}""" val obj = json.decodeFromString(src) assertTrue(obj.all.isEmpty()) assertTrue(obj.default.isEmpty()) @@ -81,7 +81,8 @@ class GeneratedApiModelSerializationTest { } }], "default": {"code": "anthropic/claude-4"}, - "connected": ["anthropic"] + "connected": ["anthropic"], + "failed": [] }""" val obj = json.decodeFromString(src) assertEquals(1, obj.all.size) @@ -132,7 +133,8 @@ class GeneratedApiModelSerializationTest { } }], "default": {}, - "connected": [] + "connected": [], + "failed": [] }""" val obj = json.decodeFromString(src) val model = obj.all[0].models["free-model"]!! @@ -149,12 +151,22 @@ class GeneratedApiModelSerializationTest { "all": [], "default": {}, "connected": [], + "failed": [], "future_field": "value" }""" val obj = json.decodeFromString(src) assertTrue(obj.all.isEmpty()) } + @Test + fun `provider list defaults omitted collection fields`() { + val obj = json.decodeFromString("{}") + assertTrue(obj.all.isEmpty()) + assertTrue(obj.default.isEmpty()) + assertTrue(obj.connected.isEmpty()) + assertTrue(obj.failed.isEmpty()) + } + // ------ Agent ------ @Test @@ -287,4 +299,70 @@ class GeneratedApiModelSerializationTest { val list = json.decodeFromString>("[]") assertTrue(list.isEmpty()) } + + // ------ ProviderList200Response.failed non-empty ------ + + @Test + fun `provider list failed field handles non-empty list`() { + val src = """{ + "all": [], + "default": {}, + "connected": [], + "failed": ["openai", "anthropic"] + }""" + val obj = json.decodeFromString(src) + assertEquals(listOf("openai", "anthropic"), obj.failed) + } + + @Test + fun `provider list failed field handles single failed provider`() { + val src = """{"all":[],"default":{},"connected":[],"failed":["openai"]}""" + val obj = json.decodeFromString(src) + assertEquals(listOf("openai"), obj.failed) + } + + // ------ Model limits with realistic large values ------ + + @Test + fun `model limit context and output deserialize with large values`() { + val src = """{ + "all": [{ + "id": "p", + "name": "Provider", + "source": "api", + "env": [], + "options": {}, + "models": { + "big-model": { + "id": "big-model", + "providerID": "p", + "name": "Big Model", + "api": {"id": "p", "url": "", "npm": ""}, + "capabilities": { + "temperature": true, + "reasoning": false, + "attachment": false, + "toolcall": true, + "input": {"text": true, "audio": false, "image": false, "video": false, "pdf": false}, + "output": {"text": true, "audio": false, "image": false, "video": false, "pdf": false}, + "interleaved": {"field":"reasoning_content"} + }, + "cost": {"input": 0, "output": 0, "cache": {"read": 0, "write": 0}}, + "limit": {"context": 1000000, "output": 32000}, + "status": "active", + "options": {}, + "headers": {}, + "release_date": "2025-01-01" + } + } + }], + "default": {}, + "connected": [], + "failed": [] + }""" + val obj = json.decodeFromString(src) + val model = obj.all[0].models["big-model"]!! + assertEquals(1000000.0, model.limit.context) + assertEquals(32000.0, model.limit.output) + } } diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/KiloCliDataParserTest.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/KiloCliDataParserTest.kt index 6e6550256d6..6b1f3c980fe 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/KiloCliDataParserTest.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/KiloCliDataParserTest.kt @@ -836,6 +836,21 @@ class KiloCliDataParserTest { assertEquals(5000L, result.status.next) } + @Test + fun `parseChatEvent - session status clamps large attempt`() { + val data = globalEvent(""" + "type": "session.status", + "properties": { + "sessionID": "ses_1", + "status": {"type": "retry", "message": "Retrying...", "attempt": 2147483648, "next": 9223372036854775807} + } + """) + + val result = KiloCliDataParser.parseChatEvent("session.status", data) as ChatEventDto.SessionStatusChanged + assertEquals(Int.MAX_VALUE, result.status.attempt) + assertEquals(Long.MAX_VALUE, result.status.next) + } + @Test fun `parseChatEvent - session status offline with requestID`() { val data = globalEvent(""" @@ -970,6 +985,21 @@ class KiloCliDataParserTest { assertEquals(3, result.diff[0].additions) } + @Test + fun `parseChatEvent - session diff clamps large counts`() { + val data = globalEvent(""" + "type": "session.diff", + "properties": { + "sessionID": "ses_1", + "diff": [{"file": "src/A.kt", "additions": 2147483648, "deletions": 9223372036854775807, "patch": "@@ ..."}] + } + """) + + val result = KiloCliDataParser.parseChatEvent("session.diff", data) as ChatEventDto.SessionDiffChanged + assertEquals(Int.MAX_VALUE, result.diff[0].additions) + assertEquals(Int.MAX_VALUE, result.diff[0].deletions) + } + // ================================================================ // parseChatEvent — part with callID // ================================================================ diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/ProjectModelSerializationTest.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/ProjectModelSerializationTest.kt index 093b62e9c6a..35ba6f52e34 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/ProjectModelSerializationTest.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/ProjectModelSerializationTest.kt @@ -23,7 +23,7 @@ class ProjectModelSerializationTest { @Test fun `empty provider list`() { - val src = """{"all":[],"default":{},"connected":[]}""" + val src = """{"all":[],"default":{},"connected":[],"failed":[]}""" val obj = json.decodeFromString(src) assertTrue(obj.all.isEmpty()) assertTrue(obj.default.isEmpty()) @@ -64,7 +64,8 @@ class ProjectModelSerializationTest { } }], "default": {"code": "anthropic/claude-4"}, - "connected": ["anthropic"] + "connected": ["anthropic"], + "failed": [] }""" val obj = json.decodeFromString(src) assertEquals(1, obj.all.size) @@ -115,7 +116,8 @@ class ProjectModelSerializationTest { } }], "default": {}, - "connected": [] + "connected": [], + "failed": [] }""" val obj = json.decodeFromString(src) val model = obj.all[0].models["free-model"]!! @@ -132,12 +134,20 @@ class ProjectModelSerializationTest { "all": [], "default": {}, "connected": [], + "failed": [], "future_field": "value" }""" val obj = json.decodeFromString(src) assertTrue(obj.all.isEmpty()) } + @Test + fun `provider list defaults omitted failed field`() { + val src = """{"all":[],"default":{},"connected":[]}""" + val obj = json.decodeFromString(src) + assertTrue(obj.failed.isEmpty()) + } + // ------ Agent ------ @Test @@ -270,4 +280,18 @@ class ProjectModelSerializationTest { val list = json.decodeFromString>("[]") assertTrue(list.isEmpty()) } + + // ------ ProviderList200Response.failed non-empty ------ + + @Test + fun `provider list failed field handles non-empty list`() { + val src = """{ + "all": [], + "default": {}, + "connected": [], + "failed": ["openai", "gemini"] + }""" + val obj = json.decodeFromString(src) + assertEquals(listOf("openai", "gemini"), obj.failed) + } } diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/SessionModelSerializationTest.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/SessionModelSerializationTest.kt index 398a1e4c4aa..e837d2693b9 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/SessionModelSerializationTest.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/cli/SessionModelSerializationTest.kt @@ -26,7 +26,7 @@ class SessionModelSerializationTest { "directory": "/test/project", "title": "My Session", "version": "1.0.0", - "time": {"created": 1000.0, "updated": 2000.0} + "time": {"created": 1000, "updated": 2000} }""" val obj = json.decodeFromString(src) assertEquals("ses_abc", obj.id) @@ -34,8 +34,8 @@ class SessionModelSerializationTest { assertEquals("prj_123", obj.projectID) assertEquals("/test/project", obj.directory) assertEquals("My Session", obj.title) - assertEquals(1000.0, obj.time.created) - assertEquals(2000.0, obj.time.updated) + assertEquals(1000L, obj.time.created) + assertEquals(2000L, obj.time.updated) assertNull(obj.parentID) assertNull(obj.summary) } @@ -49,14 +49,14 @@ class SessionModelSerializationTest { "directory": "/d", "title": "T", "version": "1.0.0", - "time": {"created": 1.0, "updated": 2.0}, + "time": {"created": 1, "updated": 2}, "summary": {"additions": 10, "deletions": 5, "files": 3} }""" val obj = json.decodeFromString(src) assertNotNull(obj.summary) - assertEquals(10.0, obj.summary!!.additions) - assertEquals(5.0, obj.summary!!.deletions) - assertEquals(3.0, obj.summary!!.files) + assertEquals(10, obj.summary!!.additions) + assertEquals(5, obj.summary!!.deletions) + assertEquals(3, obj.summary!!.files) } @Test @@ -68,7 +68,7 @@ class SessionModelSerializationTest { "directory": "/d", "title": "Fork", "version": "1.0.0", - "time": {"created": 1.0, "updated": 2.0, "archived": 3000.0}, + "time": {"created": 1, "updated": 2, "archived": 3000.0}, "parentID": "ses_parent" }""" val obj = json.decodeFromString(src) @@ -132,9 +132,9 @@ class SessionModelSerializationTest { val src = """{"type":"retry","attempt":2,"message":"Rate limited","next":1500,"requestID":"req_1"}""" val obj = json.decodeFromString(src) assertEquals(SessionStatus.Type.RETRY, obj.type) - assertEquals(2.0, obj.attempt) + assertEquals(2L, obj.attempt) assertEquals("Rate limited", obj.message) - assertEquals(1500.0, obj.next) + assertEquals(1500L, obj.next) } @Test @@ -162,4 +162,69 @@ class SessionModelSerializationTest { val map = json.decodeFromString>("{}") assertTrue(map.isEmpty()) } + + // ------ Large integer (Long) handling ------ + + @Test + fun `Session time created and updated deserialize as Long for values larger than Int MAX_VALUE`() { + val big = Int.MAX_VALUE.toLong() + 12345L + val src = """{ + "id": "ses_big", + "slug": "big", + "projectID": "prj", + "directory": "/d", + "title": "Big Times", + "version": "1", + "time": {"created": $big, "updated": ${big + 1L}} + }""" + val obj = json.decodeFromString(src) + assertEquals(big, obj.time.created) + assertEquals(big + 1L, obj.time.updated) + } + + @Test + fun `Session time millisecond epoch timestamps deserialize correctly`() { + // Realistic millisecond timestamp: 2026-01-01T00:00:00Z = 1767139200000 + val ms = 1767139200000L + val src = """{ + "id": "ses_ms", + "slug": "ms", + "projectID": "prj", + "directory": "/d", + "title": "MS Times", + "version": "1", + "time": {"created": $ms, "updated": $ms} + }""" + val obj = json.decodeFromString(src) + assertEquals(ms, obj.time.created) + assertEquals(ms, obj.time.updated) + assertTrue(obj.time.created > Int.MAX_VALUE) + } + + @Test + fun `Session time defaults to 0L when fields are omitted`() { + // The generated model has default = 0L for created and updated + val obj = ai.kilocode.jetbrains.api.model.SessionTime() + assertEquals(0L, obj.created) + assertEquals(0L, obj.updated) + } + + @Test + fun `SessionStatus attempt and next deserialize as Long for large values`() { + val bigAttempt = Int.MAX_VALUE.toLong() + 5L + val bigNext = Int.MAX_VALUE.toLong() + 99999L + val src = """{"type":"retry","attempt":$bigAttempt,"message":"Retrying","next":$bigNext,"requestID":"req_1"}""" + val obj = json.decodeFromString(src) + assertEquals(SessionStatus.Type.RETRY, obj.type) + assertEquals(bigAttempt, obj.attempt) + assertEquals(bigNext, obj.next) + } + + @Test + fun `SessionStatus defaults attempt and next to 0L when omitted`() { + val src = """{"type":"idle","message":"","requestID":""}""" + val obj = json.decodeFromString(src) + assertEquals(0L, obj.attempt) + assertEquals(0L, obj.next) + } } diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt index 5b234053a70..e98c52c0429 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt @@ -41,7 +41,7 @@ class MockCliServer : AutoCloseable { @Volatile var notificationsStatus = 200 // Project-scoped REST responses - @Volatile var providers = """{"all":[],"default":{},"connected":[]}""" + @Volatile var providers = """{"all":[],"default":{},"connected":[],"failed":[]}""" @Volatile var agents = "[]" @Volatile var commands = "[]" @Volatile var skills = "[]" @@ -72,6 +72,11 @@ class MockCliServer : AutoCloseable { @Volatile var summarizeStatus = 200 @Volatile var lastSummarizePath: String? = null @Volatile var lastSummarizeBody: String? = null + @Volatile var sessionRenameStatus = 200 + @Volatile var sessionRenameResponse = """{"id":"ses_test","slug":"test","projectID":"prj_test","directory":"/test","title":"Renamed","version":"1.0.0","time":{"created":1000,"updated":2000}}""" + @Volatile var lastSessionRenamePath: String? = null + @Volatile var lastSessionRenameBody: String? = null + @Volatile var lastSessionRenameMethod: String? = null /** Configurable delay for all endpoint responses (ms). 0 = no delay. */ @Volatile var responseDelay: Long = 0 @@ -239,10 +244,16 @@ class MockCliServer : AutoCloseable { bare == "/session/status" -> respond(output, sessionStatusesStatus, sessionStatuses) bare == "/session" && method == "GET" -> respond(output, sessionsStatus, sessions) bare == "/session" && method == "POST" -> respond(output, sessionCreateStatus, sessionCreate) - bare.matches(Regex("/session/ses_[^/]+")) && method == "GET" -> + bare.matches(Regex("/session/ses_.+")) && !bare.contains("/summarize") && method == "GET" -> respond(output, sessionGetStatus, sessionCreate) - bare.matches(Regex("/session/ses_[^/]+")) && method == "DELETE" -> + bare.matches(Regex("/session/ses_.+")) && !bare.contains("/summarize") && method == "DELETE" -> respond(output, sessionDeleteStatus, "true") + bare.matches(Regex("/session/ses_.+")) && !bare.contains("/summarize") && method == "PATCH" -> { + lastSessionRenamePath = path + lastSessionRenameBody = body + lastSessionRenameMethod = method + respond(output, sessionRenameStatus, sessionRenameResponse) + } bare.matches(Regex("/session/ses_[^/]+/summarize")) && method == "POST" -> { lastSummarizePath = path lastSummarizeBody = body diff --git a/packages/kilo-jetbrains/build-tasks/src/main/kotlin/FixGeneratedApiTask.kt b/packages/kilo-jetbrains/build-tasks/src/main/kotlin/FixGeneratedApiTask.kt index 7a39f7c2161..099d0212123 100644 --- a/packages/kilo-jetbrains/build-tasks/src/main/kotlin/FixGeneratedApiTask.kt +++ b/packages/kilo-jetbrains/build-tasks/src/main/kotlin/FixGeneratedApiTask.kt @@ -218,7 +218,7 @@ abstract class FixGeneratedApiTask : DefaultTask() { } } - // Fix 7: Default values for non-nullable primitives in model data classes. + // Fix 7: Default values for non-nullable primitives and collections in model data classes. // The CLI API may omit fields that the OpenAPI spec marks as required // (e.g. `attachment`, `reasoning` on dynamically added models). // Add Kotlin defaults so kotlinx.serialization doesn't throw @@ -230,6 +230,9 @@ abstract class FixGeneratedApiTask : DefaultTask() { Regex("""(val \w+:\s*kotlin\.Boolean)(,|\n)""") to { m: MatchResult -> "${m.groupValues[1]} = false${m.groupValues[2]}" }, + Regex("""(val \w+:\s*kotlin\.Long)(,|\n)""") to { m: MatchResult -> + "${m.groupValues[1]} = 0L${m.groupValues[2]}" + }, Regex("""(val \w+:\s*kotlin\.Int)(,|\n)""") to { m: MatchResult -> "${m.groupValues[1]} = 0${m.groupValues[2]}" }, @@ -239,6 +242,12 @@ abstract class FixGeneratedApiTask : DefaultTask() { Regex("""(val \w+:\s*kotlin\.String)(,|\n)""") to { m: MatchResult -> "${m.groupValues[1]} = \"\"${m.groupValues[2]}" }, + Regex("""(val \w+:\s*kotlin\.collections\.List<[^>]+>)(,|\n)""") to { m: MatchResult -> + "${m.groupValues[1]} = emptyList()${m.groupValues[2]}" + }, + Regex("""(val \w+:\s*kotlin\.collections\.Map<[^>]+>)(,|\n)""") to { m: MatchResult -> + "${m.groupValues[1]} = emptyMap()${m.groupValues[2]}" + }, ) for ((pattern, transform) in primitiveDefaults) { if (pattern.containsMatchIn(text)) { diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/DeleteSessionAction.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/DeleteSessionAction.kt new file mode 100644 index 00000000000..3db258f8cce --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/DeleteSessionAction.kt @@ -0,0 +1,47 @@ +package ai.kilocode.client.actions + +import ai.kilocode.client.plugin.KiloBundle +import ai.kilocode.client.session.history.HistoryDataKeys +import ai.kilocode.client.session.SessionManager +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.Messages + +class DeleteSessionAction : AnAction() { + /** Overridable in tests to avoid showing a real modal dialog. */ + internal var confirm: (project: Project?, msg: String) -> Boolean = { project, msg -> + Messages.showYesNoDialog( + project, + msg, + KiloBundle.message("history.delete.confirm.title"), + Messages.getWarningIcon(), + ) == Messages.YES + } + + override fun getActionUpdateThread() = ActionUpdateThread.EDT + + override fun update(e: AnActionEvent) { + val selection = e.getData(HistoryDataKeys.SELECTION) + val manager = e.getData(SessionManager.KEY) + e.presentation.isEnabledAndVisible = manager != null && + selection != null && + selection.selectedLocal.isNotEmpty() + } + + override fun actionPerformed(e: AnActionEvent) { + val selection = e.getData(HistoryDataKeys.SELECTION) ?: return + val controller = e.getData(HistoryDataKeys.CONTROLLER) ?: return + val items = selection.selectedLocal.filter { !controller.deleting(it) } + if (items.isEmpty()) return + + val msg = if (items.size == 1) + KiloBundle.message("history.delete.confirm.message", ai.kilocode.client.session.history.title(items[0])) + else + KiloBundle.message("history.delete.confirm.message.multiple", items.size) + + if (!confirm(e.project, msg)) return + items.forEach { controller.delete(it) } + } +} diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/OpenSessionAction.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/OpenSessionAction.kt new file mode 100644 index 00000000000..c6ef6f3dc10 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/OpenSessionAction.kt @@ -0,0 +1,26 @@ +package ai.kilocode.client.actions + +import ai.kilocode.client.session.history.HistoryDataKeys +import ai.kilocode.client.session.SessionManager +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent + +class OpenSessionAction : AnAction() { + override fun getActionUpdateThread() = ActionUpdateThread.EDT + + override fun update(e: AnActionEvent) { + val selection = e.getData(HistoryDataKeys.SELECTION) + val manager = e.getData(SessionManager.KEY) + e.presentation.isEnabledAndVisible = manager != null && + selection != null && + (selection.selectedLocal.size == 1 || selection.cloudItems.size == 1) + } + + override fun actionPerformed(e: AnActionEvent) { + val selection = e.getData(HistoryDataKeys.SELECTION) ?: return + val controller = e.getData(HistoryDataKeys.CONTROLLER) ?: return + selection.selectedLocal.singleOrNull()?.let { controller.open(it); return } + selection.cloudItems.singleOrNull()?.let { controller.open(it) } + } +} diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/RenameSessionAction.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/RenameSessionAction.kt new file mode 100644 index 00000000000..aa40c15fb41 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/actions/RenameSessionAction.kt @@ -0,0 +1,47 @@ +package ai.kilocode.client.actions + +import ai.kilocode.client.plugin.KiloBundle +import ai.kilocode.client.session.history.HistoryDataKeys +import ai.kilocode.client.session.history.title +import ai.kilocode.client.session.SessionManager +import com.intellij.openapi.actionSystem.ActionUpdateThread +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.Messages + +class RenameSessionAction : AnAction() { + /** Overridable in tests to avoid showing a real modal dialog. */ + internal var input: (project: Project?, current: String) -> String? = { project, current -> + Messages.showInputDialog( + project, + KiloBundle.message("history.rename.prompt"), + KiloBundle.message("history.rename.title"), + null, + current, + null, + ) + } + + override fun getActionUpdateThread() = ActionUpdateThread.EDT + + override fun update(e: AnActionEvent) { + val selection = e.getData(HistoryDataKeys.SELECTION) + val manager = e.getData(SessionManager.KEY) + e.presentation.isEnabledAndVisible = manager != null && + selection != null && + selection.selectedLocal.size == 1 + } + + override fun actionPerformed(e: AnActionEvent) { + val selection = e.getData(HistoryDataKeys.SELECTION) ?: return + val controller = e.getData(HistoryDataKeys.CONTROLLER) ?: return + val item = selection.selectedLocal.singleOrNull() ?: return + + val current = title(item) + val newTitle = input(e.project, current)?.trim() ?: return + + if (newTitle.isBlank() || newTitle == current) return + controller.rename(item, newTitle) + } +} diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloSessionService.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloSessionService.kt index a011ad885e6..4f2fdcf05f9 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloSessionService.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/app/KiloSessionService.kt @@ -124,6 +124,12 @@ class KiloSessionService internal constructor( list(dir) } + suspend fun renameSession(id: String, dir: String, newTitle: String): ai.kilocode.rpc.dto.SessionDto { + val session = call { rename(id, dir, newTitle) } + _sessions.value = _sessions.value.map { if (it.id == id) session else it } + return session + } + suspend fun cloudSessions(dir: String, cursor: String?, limit: Int, gitUrl: String?): CloudSessionListDto = call { cloudSessions(dir, cursor, limit, gitUrl) } diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionSidePanelManager.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionSidePanelManager.kt index 2fa5d531c56..118c2e87d24 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionSidePanelManager.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/SessionSidePanelManager.kt @@ -113,7 +113,7 @@ class SessionSidePanelManager( deleted = this::removeSession, ) Disposer.register(this) { cs.cancel() } - return HistoryPanel(this, controller, nav = this::back).component + return HistoryPanel(this, controller, nav = this::back, manager = this).component } private fun back() { diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt index 81993348e78..a416a684642 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt @@ -61,9 +61,10 @@ class HistoryController( if (item.id in deleting) return@edt deleting.add(item.id) local.refresh() + val dir = item.directory ?: workspace.directory cs.launch { try { - sessions.deleteSession(item.id, item.directory ?: workspace.directory) + sessions.deleteSession(item.id, dir) edt { deleting.remove(item.id) local.remove(item.id) @@ -79,6 +80,18 @@ class HistoryController( } } + fun rename(item: LocalHistoryItem, title: String) { + val dir = item.directory ?: workspace.directory + cs.launch { + try { + val updated = sessions.renameSession(item.id, dir, title) + edt { local.update(LocalHistoryItem(updated)) } + } catch (e: Exception) { + edt { local.fail(e.message ?: KiloBundle.message("history.error.local.rename")) } + } + } + } + fun deleting(item: LocalHistoryItem): Boolean = item.id in deleting fun open(item: LocalHistoryItem) { diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryDataKeys.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryDataKeys.kt new file mode 100644 index 00000000000..3c560038abc --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryDataKeys.kt @@ -0,0 +1,16 @@ +package ai.kilocode.client.session.history + +import com.intellij.openapi.actionSystem.DataKey + +data class HistorySelection( + val source: HistorySource, + val localItems: List, + val cloudItems: List, +) { + val selectedLocal: List get() = if (source == HistorySource.LOCAL) localItems else emptyList() +} + +object HistoryDataKeys { + val SELECTION: DataKey = DataKey.create("ai.kilocode.client.session.history.HistorySelection") + val CONTROLLER: DataKey = DataKey.create("ai.kilocode.client.session.history.HistoryController") +} diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryListRenderer.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryListRenderer.kt index a7fb4e2c961..4aae232943a 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryListRenderer.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryListRenderer.kt @@ -3,7 +3,6 @@ package ai.kilocode.client.session.history import ai.kilocode.client.session.ui.PickerRow import ai.kilocode.client.ui.UiStyle import com.intellij.icons.AllIcons -import com.intellij.ui.ExperimentalUI import com.intellij.ui.GroupHeaderSeparator import com.intellij.ui.SimpleColoredComponent import com.intellij.ui.SimpleTextAttributes @@ -20,7 +19,7 @@ import javax.swing.JPanel import javax.swing.ListCellRenderer import javax.swing.SwingConstants -private const val DELETE_CLICK_AREA_WIDTH = 32 +private const val DELETE_AREA_WIDTH = 32 internal open class HistoryRenderer( private val model: HistoryModel, @@ -31,14 +30,14 @@ internal open class HistoryRenderer( private val empty: Icon = EmptyIcon.create(icon) fun isDeleteClick(list: JList<*>, bounds: Rectangle, point: Point): Boolean { - val width = JBUI.scale(DELETE_CLICK_AREA_WIDTH) - val inset = deleteInset(list) - if (list.componentOrientation.isLeftToRight) { - val right = bounds.x + bounds.width - inset - return point.x in (right - width)..right + val width = JBUI.scale(DELETE_AREA_WIDTH) + return if (list.componentOrientation.isLeftToRight) { + val right = bounds.x + bounds.width + point.x in (right - width)..right + } else { + val left = bounds.x + point.x in left..(left + width) } - val left = bounds.x + inset - return point.x in left..(left + width) } fun section(items: List, index: Int): String? { @@ -48,13 +47,6 @@ internal open class HistoryRenderer( if (current == previous) return null return HistoryTime.title(current) } - - private fun deleteInset(list: JList<*>): Int { - if (!ExperimentalUI.isNewUI()) return 0 - val inner = JBUI.CurrentTheme.Popup.Selection.innerInsets() - val edge = JBUI.CurrentTheme.Popup.Selection.LEFT_RIGHT_INSET.get() - return edge + if (list.componentOrientation.isLeftToRight) inner.right else inner.left - } } private val sep = GroupHeaderSeparator(JBUI.CurrentTheme.Popup.separatorLabelInsets()) @@ -75,7 +67,7 @@ internal open class HistoryRenderer( } private val row = JPanel(BorderLayout()).apply { add(main, BorderLayout.CENTER) - add(del, BorderLayout.EAST) + if (deletable) add(del, BorderLayout.EAST) } private val wrap = PickerRow() @@ -114,13 +106,11 @@ internal open class HistoryRenderer( ) time.text = value?.let(HistoryTime::relative).orEmpty() time.foreground = weak - del.icon = if (deletable && selected) icon else empty + if (deletable) del.icon = if (selected) icon else empty top.invalidate() return this } - - fun deleteVisible(): Boolean = del.icon === icon } internal class LocalHistoryRenderer(model: HistoryModel) : HistoryRenderer(model, deletable = true) diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryListUi.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryListUi.kt index c5c9b2a6be4..df01ec2b823 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryListUi.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryListUi.kt @@ -6,10 +6,9 @@ import java.awt.event.MouseEvent internal fun title(item: HistoryItem): String = item.title.takeIf { it.isNotBlank() } ?: KiloBundle.message("history.untitled") -internal fun clicked(list: JBList, e: MouseEvent): T? { +internal fun itemAt(list: JBList, e: MouseEvent): T? { val row = list.locationToIndex(e.point) val box = row.takeIf { it >= 0 }?.let { list.getCellBounds(it, it) } ?: return null if (!box.contains(e.point)) return null - list.selectedIndex = row return list.model.getElementAt(row) } diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryModel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryModel.kt index a9d0af9e774..ec457e8a5a1 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryModel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryModel.kt @@ -48,6 +48,12 @@ open class HistoryModel : AbstractListModel() { filter() } + fun update(item: T) { + if (all.none { it.id == item.id }) return + all = HistoryTime.sorted(all.map { if (it.id == item.id) item else it }) + filter() + } + fun fail(message: String) { loading = false loaded = true diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt index 4c4460acd28..c27bc0a7524 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt @@ -1,6 +1,7 @@ package ai.kilocode.client.session.history import ai.kilocode.client.plugin.KiloBundle +import ai.kilocode.client.session.SessionManager import ai.kilocode.client.session.ui.LoadingPanel import ai.kilocode.client.session.ui.style.SessionEditorStyle import ai.kilocode.client.ui.UiStyle @@ -9,10 +10,13 @@ import com.intellij.ide.ui.LafManagerListener import com.intellij.ide.ui.laf.darcula.ui.DarculaButtonUI import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.Disposable -import com.intellij.openapi.ui.Messages +import com.intellij.openapi.actionSystem.ActionGroup +import com.intellij.openapi.actionSystem.ActionManager +import com.intellij.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.DataProvider import com.intellij.openapi.util.Disposer import com.intellij.ui.DocumentAdapter -import com.intellij.ui.ListUtil +import com.intellij.ui.PopupHandler import com.intellij.ui.SearchTextField import com.intellij.ui.ScrollingUtil import com.intellij.ui.components.JBList @@ -51,7 +55,8 @@ class HistoryPanel( private val controller: HistoryController, private val gitUrl: () -> String? = { null }, private val nav: () -> Unit = {}, -) : BorderLayoutPanel(), Disposable { + private val manager: SessionManager? = null, +) : BorderLayoutPanel(), Disposable, DataProvider { private val localSearch = search(controller.local) private val cloudSearch = search(controller.cloud) private val localList = localList() @@ -188,21 +193,22 @@ class HistoryPanel( } private fun localList() = JBList(controller.local).apply { - selectionMode = ListSelectionModel.SINGLE_SELECTION - isFocusable = false + selectionMode = ListSelectionModel.MULTIPLE_INTERVAL_SELECTION + isFocusable = true cellRenderer = LocalHistoryRenderer(controller.local) cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) emptyText.text = KiloBundle.message("history.empty") addMouseListener(object : MouseAdapter() { - override fun mouseReleased(e: MouseEvent) { - if (!UIUtil.isActionClick(e, MouseEvent.MOUSE_RELEASED, true)) return - val item = clicked(this@apply, e) ?: return - if (deleteClick(this@apply, e)) { + override fun mouseClicked(e: MouseEvent) { + val row = locationToIndex(e.point) + val box = row.takeIf { it >= 0 }?.let { getCellBounds(it, it) } ?: return + if (!box.contains(e.point)) return + if (e.clickCount == 1 && HistoryRenderer.isDeleteClick(this@apply, box, e.point)) { + val item = model.getElementAt(row) confirm(item) - e.consume() - return + } else if (e.clickCount == 2) { + selectedValue?.let(::activate) } - activate(item) } }) registerKeyboardAction( @@ -210,20 +216,19 @@ class HistoryPanel( KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), JComponent.WHEN_FOCUSED, ) - ListUtil.installAutoSelectOnMouseMove(this) + installContextMenu(this) ScrollingUtil.installActions(this) } private fun cloudList() = JBList(controller.cloud).apply { selectionMode = ListSelectionModel.SINGLE_SELECTION - isFocusable = false + isFocusable = true cellRenderer = CloudHistoryRenderer(controller.cloud) cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) emptyText.text = KiloBundle.message("history.empty") addMouseListener(object : MouseAdapter() { - override fun mouseReleased(e: MouseEvent) { - if (!UIUtil.isActionClick(e, MouseEvent.MOUSE_RELEASED, true)) return - clicked(this@apply, e)?.let(::activate) + override fun mouseClicked(e: MouseEvent) { + if (e.clickCount == 2) selectedValue?.let(::activate) } }) registerKeyboardAction( @@ -231,7 +236,7 @@ class HistoryPanel( KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), JComponent.WHEN_FOCUSED, ) - ListUtil.installAutoSelectOnMouseMove(this) + installContextMenu(this) ScrollingUtil.installActions(this) } @@ -272,13 +277,6 @@ class HistoryPanel( } } - private fun deleteClick(list: JBList, e: MouseEvent): Boolean { - val row = list.locationToIndex(e.point) - val box = row.takeIf { it >= 0 }?.let { list.getCellBounds(it, it) } ?: return false - if (!box.contains(e.point)) return false - return HistoryRenderer.isDeleteClick(list, box, e.point) - } - private fun activate(item: HistoryItem) { when (item) { is LocalHistoryItem -> controller.open(item) @@ -286,18 +284,54 @@ class HistoryPanel( } } + override fun getData(dataId: String): Any? { + if (SessionManager.KEY.`is`(dataId)) return manager + if (HistoryDataKeys.CONTROLLER.`is`(dataId)) return controller + if (HistoryDataKeys.SELECTION.`is`(dataId)) { + val source = selectedSource() + val local = if (source == HistorySource.LOCAL) localList.selectedValuesList.filterIsInstance() else emptyList() + val cloud = if (source == HistorySource.CLOUD) cloudList.selectedValuesList.filterIsInstance() else emptyList() + return HistorySelection(source, local, cloud) + } + return null + } + + private fun installContextMenu(list: JBList) { + val group = ActionManager.getInstance().getAction("Kilo.History.ContextMenu") + if (group is ActionGroup) { + PopupHandler.installPopupMenu(list, group, ActionPlaces.POPUP) + } + } + private fun confirm(item: LocalHistoryItem) { if (controller.deleting(item)) return - val result = Messages.showYesNoDialog( + val result = com.intellij.openapi.ui.Messages.showYesNoDialog( this, KiloBundle.message("history.delete.confirm.message", title(item)), KiloBundle.message("history.delete.confirm.title"), - Messages.getWarningIcon(), + com.intellij.openapi.ui.Messages.getWarningIcon(), ) - if (result != Messages.YES) return + if (result != com.intellij.openapi.ui.Messages.YES) return controller.delete(item) } + internal fun confirmDelete(items: List) { + val active = items.filter { !controller.deleting(it) } + if (active.isEmpty()) return + val msg = if (active.size == 1) + KiloBundle.message("history.delete.confirm.message", title(active[0])) + else + KiloBundle.message("history.delete.confirm.message.multiple", active.size) + val result = com.intellij.openapi.ui.Messages.showYesNoDialog( + this, + msg, + KiloBundle.message("history.delete.confirm.title"), + com.intellij.openapi.ui.Messages.getWarningIcon(), + ) + if (result != com.intellij.openapi.ui.Messages.YES) return + active.forEach { controller.delete(it) } + } + internal fun itemCount() = activeModel().size internal fun selectedSource() = if (tabs.selectedInfo === cloudInfo) HistorySource.CLOUD else HistorySource.LOCAL @@ -306,10 +340,18 @@ class HistoryPanel( activeList().selectedIndex = index } + internal fun selectIndices(vararg indices: Int) { + activeList().selectedIndices = indices + } + internal fun selectedIndex() = activeList().selectedIndex internal fun listFocusable() = activeList().isFocusable + internal fun listSelectionMode() = activeList().selectionMode + + internal fun loadMoreFocusable() = more.isFocusable + internal fun listCursor() = activeList().cursor.type internal fun backText(): String? { @@ -328,7 +370,8 @@ class HistoryPanel( } internal fun clickDelete() { - localList.selectedValue?.let(controller::delete) + val items = localList.selectedValuesList.filterIsInstance() + items.forEach { controller.delete(it) } } internal fun clickCloud() { @@ -354,18 +397,6 @@ class HistoryPanel( return items.indices.mapNotNull { HistoryRenderer.section(items, it) } } - internal fun deleteVisible(index: Int, selected: Boolean = true): Boolean { - val item = controller.local.getElementAt(index) - val view = localList.cellRenderer.getListCellRendererComponent(localList, item, index, selected, false) - return view is HistoryRenderer<*> && view.deleteVisible() - } - - internal fun cloudDeleteVisible(index: Int, selected: Boolean = true): Boolean { - val item = controller.cloud.getElementAt(index) - val view = cloudList.cellRenderer.getListCellRendererComponent(cloudList, item, index, selected, false) - return view is HistoryRenderer<*> && view.deleteVisible() - } - private fun activeList(): JBList = if (tabs.selectedInfo === cloudInfo) cloudList else localList private fun activeModel(): HistoryModel = if (tabs.selectedInfo === cloudInfo) controller.cloud else controller.local @@ -392,8 +423,7 @@ class HistoryPanel( private var over = false init { - isFocusable = false - setRequestFocusEnabled(false) + isFocusable = true isContentAreaFilled = false isBorderPainted = false isOpaque = false diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/EmptySessionPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/EmptySessionPanel.kt index d2811072a28..3d079596616 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/EmptySessionPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/EmptySessionPanel.kt @@ -4,7 +4,7 @@ import ai.kilocode.client.plugin.KiloBundle import ai.kilocode.client.session.SessionRef import ai.kilocode.client.session.history.HistoryTime import ai.kilocode.client.session.history.LocalHistoryItem -import ai.kilocode.client.session.history.clicked +import ai.kilocode.client.session.history.itemAt import ai.kilocode.client.session.history.title import ai.kilocode.client.session.ui.style.SessionEditorStyle import ai.kilocode.client.session.ui.style.SessionEditorStyleTarget @@ -71,7 +71,7 @@ class EmptySessionPanel( emptyText.clear() addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { - val item = clicked(this@apply, e) ?: return + val item = itemAt(this@apply, e) ?: return controller.openSession(SessionRef.Local(item.session)) } diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/SessionHeaderPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/SessionHeaderPanel.kt index e559d1b5d23..615f52df59e 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/SessionHeaderPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/header/SessionHeaderPanel.kt @@ -108,7 +108,7 @@ class SessionHeaderPanel( add(output) add(Box.createHorizontalStrut(UiStyle.Gap.sm())) add(cacheRead) - add(Box.createHorizontalStrut(UiStyle.Gap.small())) + add(Box.createHorizontalStrut(UiStyle.Gap.sm())) add(cacheWrite) } private val todoRow = JPanel(FlowLayout(FlowLayout.LEFT, UiStyle.Gap.md(), 0)).apply { diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml b/packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml index 5eabe4727d6..dedf3ee3045 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml +++ b/packages/kilo-jetbrains/frontend/src/main/resources/kilo.jetbrains.frontend.xml @@ -58,5 +58,25 @@ + + + + + + + + + + + + + + + diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties index 5b3f9b7aaaf..298028014b7 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties @@ -92,6 +92,9 @@ history.untitled=Untitled history.delete.text=Delete history.delete.confirm.title=Delete session? history.delete.confirm.message=Delete "{0}" from local history? +history.delete.confirm.message.multiple=Delete {0} sessions from local history? +history.rename.title=Rename Session +history.rename.prompt=New session name: history.cloud.load.more=Load more history.cloud.repo.only=Only this repository history.group.today=Today @@ -108,6 +111,7 @@ history.time.years={0}y ago history.error.local=Failed to load local history history.error.cloud=Failed to load cloud history history.error.local.delete=Failed to delete session +history.error.local.rename=Failed to rename session history.error.cloud.delete=Cloud sessions cannot be deleted yet action.Kilo.Settings.text=Settings @@ -126,3 +130,10 @@ action.Kilo.Restart.text=Restart Kilo action.Kilo.Restart.description=Kill and restart the CLI process action.Kilo.Reinstall.text=Reinstall Kilo action.Kilo.Reinstall.description=Re-extract the CLI binary and restart +action.Kilo.Session.Open.text=Open +action.Kilo.Session.Open.description=Open the selected session +action.Kilo.Session.Rename.text=Rename +action.Kilo.Session.Rename.description=Rename the selected session +action.Kilo.Session.Delete.text=Delete +action.Kilo.Session.Delete.description=Delete the selected session(s) +action.Kilo.History.ContextMenu.text=History Actions diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/actions/HistorySessionActionsTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/actions/HistorySessionActionsTest.kt new file mode 100644 index 00000000000..9165e8d50ef --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/actions/HistorySessionActionsTest.kt @@ -0,0 +1,488 @@ +package ai.kilocode.client.actions + +import ai.kilocode.client.app.KiloSessionService +import ai.kilocode.client.app.KiloWorkspaceService +import ai.kilocode.client.app.Workspace +import ai.kilocode.client.plugin.KiloBundle +import ai.kilocode.client.session.SessionManager +import ai.kilocode.client.session.SessionRef +import ai.kilocode.client.session.history.CloudHistoryItem +import ai.kilocode.client.session.history.HistoryController +import ai.kilocode.client.session.history.HistoryDataKeys +import ai.kilocode.client.session.history.HistorySelection +import ai.kilocode.client.session.history.HistorySource +import ai.kilocode.client.session.history.LocalHistoryItem +import ai.kilocode.client.testing.FakeSessionRpcApi +import ai.kilocode.client.testing.FakeWorkspaceRpcApi +import ai.kilocode.rpc.dto.CloudSessionDto +import ai.kilocode.rpc.dto.KiloWorkspaceStateDto +import ai.kilocode.rpc.dto.KiloWorkspaceStatusDto +import ai.kilocode.rpc.dto.SessionDto +import ai.kilocode.rpc.dto.SessionTimeDto +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.CommonDataKeys +import com.intellij.openapi.actionSystem.DataContext +import com.intellij.openapi.actionSystem.Presentation +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.util.Disposer +import com.intellij.testFramework.fixtures.BasePlatformTestCase +import com.intellij.util.ui.UIUtil +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout + +@Suppress("UnstableApiUsage") +class HistorySessionActionsTest : BasePlatformTestCase() { + private lateinit var scope: CoroutineScope + private lateinit var rpc: FakeSessionRpcApi + private lateinit var sessions: KiloSessionService + private lateinit var workspace: Workspace + private lateinit var controller: HistoryController + private lateinit var manager: FakeManager + + override fun setUp() { + super.setUp() + scope = CoroutineScope(SupervisorJob()) + rpc = FakeSessionRpcApi() + sessions = KiloSessionService(project, scope, rpc) + val workspaces = KiloWorkspaceService(scope, FakeWorkspaceRpcApi().also { + it.state.value = KiloWorkspaceStateDto(status = KiloWorkspaceStatusDto.READY) + }) + workspace = workspaces.workspace("/test") + controller = HistoryController(sessions, workspace, scope) + manager = FakeManager() + } + + override fun tearDown() { + try { + scope.cancel() + } finally { + super.tearDown() + } + } + + // ------ OpenSessionAction.update ------ + + fun `test open action enabled for single local selection`() { + val action = OpenSessionAction() + val local = localItem("ses_1") + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(local)), controller) + + action.update(event) + + assertTrue(event.presentation.isEnabledAndVisible) + } + + fun `test open action enabled for single cloud selection`() { + val action = OpenSessionAction() + val item = cloudItem("cloud_1") + val event = event(action, manager, selection(HistorySource.CLOUD, emptyList(), listOf(item)), controller) + + action.update(event) + + assertTrue(event.presentation.isEnabledAndVisible) + } + + fun `test open action disabled without manager`() { + val action = OpenSessionAction() + val local = localItem("ses_1") + val event = event(action, null, selection(HistorySource.LOCAL, listOf(local)), controller) + + action.update(event) + + assertFalse(event.presentation.isEnabledAndVisible) + } + + fun `test open action disabled with no selection`() { + val action = OpenSessionAction() + val event = event(action, manager, selection(HistorySource.LOCAL, emptyList()), controller) + + action.update(event) + + assertFalse(event.presentation.isEnabledAndVisible) + } + + fun `test open action disabled with multiple local items`() { + val action = OpenSessionAction() + val items = listOf(localItem("ses_1"), localItem("ses_2")) + val event = event(action, manager, selection(HistorySource.LOCAL, items), controller) + + action.update(event) + + assertFalse(event.presentation.isEnabledAndVisible) + } + + // ------ OpenSessionAction.actionPerformed ------ + + fun `test open action performs opens local item`() { + val opened = mutableListOf() + val ctrl = HistoryController(sessions, workspace, scope, open = { ref -> + when (ref) { + is SessionRef.Local -> opened.add(ref.id) + is SessionRef.Cloud -> opened.add("cloud:${ref.id}") + } + }) + val local = localItem("ses_1") + val action = OpenSessionAction() + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(local)), ctrl) + + action.actionPerformed(event) + flush() + + assertEquals(listOf("ses_1"), opened) + } + + fun `test open action performs opens cloud item`() { + val opened = mutableListOf() + val ctrl = HistoryController(sessions, workspace, scope, open = { ref -> + when (ref) { + is SessionRef.Local -> opened.add(ref.id) + is SessionRef.Cloud -> opened.add("cloud:${ref.id}") + } + }) + val item = cloudItem("cloud_1") + val action = OpenSessionAction() + val event = event(action, manager, selection(HistorySource.CLOUD, emptyList(), listOf(item)), ctrl) + + action.actionPerformed(event) + flush() + + assertEquals(listOf("cloud:cloud_1"), opened) + } + + // ------ DeleteSessionAction.update ------ + + fun `test delete action enabled for non-empty local selection`() { + val action = DeleteSessionAction() + val local = localItem("ses_1") + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(local)), controller) + + action.update(event) + + assertTrue(event.presentation.isEnabledAndVisible) + } + + fun `test delete action disabled for cloud-only selection`() { + val action = DeleteSessionAction() + val item = cloudItem("cloud_1") + val event = event(action, manager, selection(HistorySource.CLOUD, emptyList(), listOf(item)), controller) + + action.update(event) + + assertFalse(event.presentation.isEnabledAndVisible) + } + + fun `test delete action disabled without manager`() { + val action = DeleteSessionAction() + val local = localItem("ses_1") + val event = event(action, null, selection(HistorySource.LOCAL, listOf(local)), controller) + + action.update(event) + + assertFalse(event.presentation.isEnabledAndVisible) + } + + fun `test delete action disabled with empty selection`() { + val action = DeleteSessionAction() + val event = event(action, manager, selection(HistorySource.LOCAL, emptyList()), controller) + + action.update(event) + + assertFalse(event.presentation.isEnabledAndVisible) + } + + // ------ DeleteSessionAction.actionPerformed ------ + + fun `test delete action deletes selected local items after confirmation`() { + rpc.listed += sessionDto("ses_1", "One") + rpc.listed += sessionDto("ses_2", "Two") + controller.reloadLocal() + flush() + + assertEquals(2, controller.local.items.size) + + val items = controller.local.items.toList() + val action = DeleteSessionAction().apply { confirm = { _, _ -> true } } + val event = event(action, manager, selection(HistorySource.LOCAL, items), controller) + + action.actionPerformed(event) + flush() + + assertEquals(listOf("ses_1", "ses_2"), rpc.deletes.map { it.first }) + assertTrue(controller.local.items.isEmpty()) + } + + fun `test delete action skips items already being deleted`() { + rpc.listed += sessionDto("ses_1", "One") + controller.reloadLocal() + flush() + + rpc.deleteGate = kotlinx.coroutines.CompletableDeferred() + val item = controller.local.items[0] + controller.delete(item) + waitFor { controller.deleting(item) } + + val action = DeleteSessionAction().apply { confirm = { _, _ -> true } } + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(item)), controller) + + action.actionPerformed(event) + flush() + + assertTrue(rpc.deletes.isEmpty()) + + rpc.deleteGate?.complete(Unit) + waitFor { rpc.deletes.size == 1 } + assertEquals(listOf("ses_1"), rpc.deletes.map { it.first }) + } + + fun `test delete action cancelled when user says no`() { + rpc.listed += sessionDto("ses_1", "One") + controller.reloadLocal() + flush() + + val item = controller.local.items[0] + val action = DeleteSessionAction().apply { confirm = { _, _ -> false } } + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(item)), controller) + + action.actionPerformed(event) + flush() + + assertTrue(rpc.deletes.isEmpty()) + } + + // ------ RenameSessionAction.update ------ + + fun `test rename action enabled for exactly one local item`() { + val action = RenameSessionAction() + val local = localItem("ses_1") + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(local)), controller) + + action.update(event) + + assertTrue(event.presentation.isEnabledAndVisible) + } + + fun `test rename action disabled with no selection`() { + val action = RenameSessionAction() + val event = event(action, manager, selection(HistorySource.LOCAL, emptyList()), controller) + + action.update(event) + + assertFalse(event.presentation.isEnabledAndVisible) + } + + fun `test rename action disabled with multiple local items`() { + val action = RenameSessionAction() + val items = listOf(localItem("ses_1"), localItem("ses_2")) + val event = event(action, manager, selection(HistorySource.LOCAL, items), controller) + + action.update(event) + + assertFalse(event.presentation.isEnabledAndVisible) + } + + fun `test rename action disabled for cloud selection`() { + val action = RenameSessionAction() + val item = cloudItem("cloud_1") + val event = event(action, manager, selection(HistorySource.CLOUD, emptyList(), listOf(item)), controller) + + action.update(event) + + assertFalse(event.presentation.isEnabledAndVisible) + } + + // ------ RenameSessionAction.actionPerformed ------ + + fun `test rename action calls controller with trimmed changed title`() { + rpc.listed += sessionDto("ses_1", "Original") + controller.reloadLocal() + flush() + + val item = controller.local.items[0] + val action = RenameSessionAction().apply { input = { _, _ -> " Renamed " } } + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(item)), controller) + + action.actionPerformed(event) + flush() + + assertEquals(listOf(Triple("ses_1", "/test", "Renamed")), rpc.renames) + } + + fun `test rename action passes displayed current title to input`() { + rpc.listed += sessionDto("ses_1", "Original") + controller.reloadLocal() + flush() + + val prompts = mutableListOf() + val item = controller.local.items[0] + val action = RenameSessionAction().apply { + input = { _, current -> + prompts.add(current) + null + } + } + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(item)), controller) + + action.actionPerformed(event) + flush() + + assertEquals(listOf("Original"), prompts) + assertTrue(rpc.renames.isEmpty()) + } + + fun `test rename action passes untitled fallback to input`() { + rpc.listed += sessionDto("ses_1", "") + controller.reloadLocal() + flush() + + val prompts = mutableListOf() + val item = controller.local.items[0] + val action = RenameSessionAction().apply { + input = { _, current -> + prompts.add(current) + null + } + } + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(item)), controller) + + action.actionPerformed(event) + flush() + + assertEquals(listOf(KiloBundle.message("history.untitled")), prompts) + assertTrue(rpc.renames.isEmpty()) + } + + fun `test rename action ignores blank input`() { + rpc.listed += sessionDto("ses_1", "Original") + controller.reloadLocal() + flush() + + val item = controller.local.items[0] + val action = RenameSessionAction().apply { input = { _, _ -> " " } } + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(item)), controller) + + action.actionPerformed(event) + flush() + + assertTrue(rpc.renames.isEmpty()) + } + + fun `test rename action ignores unchanged input`() { + rpc.listed += sessionDto("ses_1", "Original") + controller.reloadLocal() + flush() + + val item = controller.local.items[0] + val action = RenameSessionAction().apply { input = { _, _ -> "Original" } } + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(item)), controller) + + action.actionPerformed(event) + flush() + + assertTrue(rpc.renames.isEmpty()) + } + + fun `test rename action ignores null input`() { + rpc.listed += sessionDto("ses_1", "Original") + controller.reloadLocal() + flush() + + val item = controller.local.items[0] + val action = RenameSessionAction().apply { input = { _, _ -> null } } + val event = event(action, manager, selection(HistorySource.LOCAL, listOf(item)), controller) + + action.actionPerformed(event) + flush() + + assertTrue(rpc.renames.isEmpty()) + } + + fun `test frontend descriptor registers history actions`() { + val xml = javaClass.classLoader.getResourceAsStream("kilo.jetbrains.frontend.xml") + ?.bufferedReader() + ?.use { it.readText() } + ?: error("missing frontend descriptor") + + assertTrue(xml.contains("id=\"Kilo.Session.Open\"")) + assertTrue(xml.contains("id=\"Kilo.Session.Rename\"")) + assertTrue(xml.contains("id=\"Kilo.Session.Delete\"")) + assertTrue(xml.contains("id=\"Kilo.History.ContextMenu\"")) + assertTrue(xml.contains("ref=\"Kilo.Session.Open\"")) + assertTrue(xml.contains("ref=\"Kilo.Session.Rename\"")) + assertTrue(xml.contains("ref=\"Kilo.Session.Delete\"")) + } + + // ------ Helpers ------ + + private fun event( + action: com.intellij.openapi.actionSystem.AnAction, + manager: SessionManager?, + selection: HistorySelection, + ctrl: HistoryController, + ): AnActionEvent { + val presentation = Presentation().apply { copyFrom(action.templatePresentation) } + val context = DataContext { id -> + when { + CommonDataKeys.PROJECT.`is`(id) -> project + SessionManager.KEY.`is`(id) -> manager + HistoryDataKeys.SELECTION.`is`(id) -> selection + HistoryDataKeys.CONTROLLER.`is`(id) -> ctrl + else -> null + } + } + return AnActionEvent.createFromDataContext("", presentation, context) + } + + private fun selection( + source: HistorySource, + local: List, + cloud: List = emptyList(), + ) = HistorySelection(source, local, cloud) + + private fun localItem(id: String, title: String = id) = LocalHistoryItem(sessionDto(id, title)) + + private fun sessionDto(id: String, title: String) = SessionDto( + id = id, + projectID = "prj", + directory = "/test", + title = title, + version = "1", + time = SessionTimeDto(created = 1.0, updated = 2.0), + ) + + private fun cloudItem(id: String, title: String = id) = CloudHistoryItem( + CloudSessionDto( + id = id, + title = title, + createdAt = "2026-01-01T00:00:00Z", + updatedAt = "2026-01-02T00:00:00Z", + version = 1.0, + ) + ) + + private fun flush() = runBlocking { + repeat(10) { + delay(100) + ApplicationManager.getApplication().invokeAndWait { UIUtil.dispatchAllInvocationEvents() } + } + } + + private fun waitFor(done: () -> Boolean) = runBlocking { + withTimeout(5_000) { + while (!done()) { + delay(25) + ApplicationManager.getApplication().invokeAndWait { UIUtil.dispatchAllInvocationEvents() } + } + } + ApplicationManager.getApplication().invokeAndWait { UIUtil.dispatchAllInvocationEvents() } + } + + private class FakeManager : SessionManager { + override fun newSession() {} + override fun showHistory() {} + override fun openSession(ref: SessionRef) {} + } +} diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/app/KiloSessionServiceTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/app/KiloSessionServiceTest.kt new file mode 100644 index 00000000000..3a6ae7a3d99 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/app/KiloSessionServiceTest.kt @@ -0,0 +1,100 @@ +package ai.kilocode.client.app + +import ai.kilocode.client.testing.FakeSessionRpcApi +import ai.kilocode.rpc.dto.SessionDto +import ai.kilocode.rpc.dto.SessionTimeDto +import com.intellij.testFramework.fixtures.BasePlatformTestCase +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext + +@Suppress("UnstableApiUsage") +class KiloSessionServiceTest : BasePlatformTestCase() { + private lateinit var scope: CoroutineScope + private lateinit var rpc: FakeSessionRpcApi + private lateinit var service: KiloSessionService + + override fun setUp() { + super.setUp() + scope = CoroutineScope(SupervisorJob()) + rpc = FakeSessionRpcApi() + service = KiloSessionService(project, scope, rpc) + } + + override fun tearDown() { + try { + scope.cancel() + } finally { + super.tearDown() + } + } + + fun `test rename replaces cached session in sessions value`() = runBlocking(Dispatchers.Default) { + rpc.listed += session("ses_1", "Original") + rpc.listed += session("ses_2", "Other") + service.list("/test") + + assertEquals(2, service.sessions.value.size) + assertEquals("Original", service.sessions.value.find { it.id == "ses_1" }!!.title) + + service.renameSession("ses_1", "/test", "Renamed") + + assertEquals(2, service.sessions.value.size) + assertEquals("Renamed", service.sessions.value.find { it.id == "ses_1" }!!.title) + assertEquals("Other", service.sessions.value.find { it.id == "ses_2" }!!.title) + } + + fun `test rename of unknown id does not insert new item`() = runBlocking(Dispatchers.Default) { + rpc.listed += session("ses_1", "Original") + service.list("/test") + + assertEquals(1, service.sessions.value.size) + + service.renameSession("ses_unknown", "/test", "Should Not Insert") + + // Size remains 1 — no unexpected insert + assertEquals(1, service.sessions.value.size) + assertEquals("ses_1", service.sessions.value[0].id) + } + + fun `test rename failure propagates exception without mutating cache`() = runBlocking(Dispatchers.Default) { + rpc.listed += session("ses_1", "Original") + service.list("/test") + + val before = service.sessions.value.toList() + rpc.renameThrows = RuntimeException("server error") + + var threw = false + try { + service.renameSession("ses_1", "/test", "Renamed") + } catch (_: RuntimeException) { + threw = true + } + + assertTrue(threw) + assertEquals(before.map { it.id to it.title }, service.sessions.value.map { it.id to it.title }) + } + + fun `test list populates sessions value`() = runBlocking(Dispatchers.Default) { + rpc.listed += session("ses_1", "One") + rpc.listed += session("ses_2", "Two") + + service.list("/test") + + assertEquals(2, service.sessions.value.size) + assertTrue(service.sessions.value.any { it.id == "ses_1" }) + assertTrue(service.sessions.value.any { it.id == "ses_2" }) + } + + private fun session(id: String, title: String) = SessionDto( + id = id, + projectID = "prj", + directory = "/test", + title = title, + version = "1", + time = SessionTimeDto(created = 1.0, updated = 2.0), + ) +} diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt index 250877766f5..213f6cd7440 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt @@ -4,6 +4,7 @@ import ai.kilocode.client.app.KiloSessionService import ai.kilocode.client.app.KiloWorkspaceService import ai.kilocode.client.app.Workspace import ai.kilocode.client.plugin.KiloBundle +import ai.kilocode.client.session.SessionManager import ai.kilocode.client.session.SessionRef import ai.kilocode.client.testing.FakeSessionRpcApi import ai.kilocode.client.testing.FakeWorkspaceRpcApi @@ -197,7 +198,7 @@ class HistoryControllerTest : BasePlatformTestCase() { flush() val local = panel.defaultFocusedComponent - assertFalse(panel.listFocusable()) + assertTrue(panel.listFocusable()) assertEquals(-1, panel.selectedIndex()) key(local, KeyEvent.VK_DOWN) assertEquals(0, panel.selectedIndex()) @@ -211,7 +212,7 @@ class HistoryControllerTest : BasePlatformTestCase() { val cloud = panel.defaultFocusedComponent assertNotSame(local, cloud) - assertFalse(panel.listFocusable()) + assertTrue(panel.listFocusable()) assertEquals(-1, panel.selectedIndex()) key(cloud, KeyEvent.VK_DOWN) assertEquals(0, panel.selectedIndex()) @@ -297,17 +298,237 @@ class HistoryControllerTest : BasePlatformTestCase() { assertEquals(KiloBundle.message("history.time.hours", 10), HistoryTime.relative(offset, now.toEpochMilli())) } - fun `test local renderer exposes delete and cloud renderer hides it`() { - rpc.listed += session("ses_1", "Local") - rpc.cloud += cloud("cloud_1", "Cloud") + fun `test list is focusable and uses multiple interval selection`() { val panel = HistoryPanel(parent, controller()) flush() - assertTrue(panel.deleteVisible(0)) + assertTrue(panel.listFocusable()) + assertEquals(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION, panel.listSelectionMode()) + } + + fun `test load more button is focusable`() { + rpc.cloud += cloud("cloud_1", "Cloud") + rpc.cloudCursor = "next" + val controller = controller() + val panel = HistoryPanel(parent, controller) + flush() + + assertTrue(panel.loadMoreFocusable()) + } + + fun `test rename updates local item title`() { + rpc.listed += session("ses_1", "Original") + val controller = controller() + flush() + + controller.reloadLocal() + flush() + + val item = controller.local.items[0] + controller.rename(item, "Renamed") + flush() + + assertEquals("Renamed", controller.local.items[0].title) + assertEquals(listOf(Triple("ses_1", "/test", "Renamed")), rpc.renames) + } + + fun `test data context exposes selection and controller`() { + rpc.listed += session("ses_1", "Alpha") + val controller = controller() + val panel = HistoryPanel(parent, controller) + flush() + + panel.select(0) + + val sel = panel.getData(HistoryDataKeys.SELECTION.name) as? HistorySelection + assertNotNull(sel) + assertEquals(1, sel!!.selectedLocal.size) + assertEquals("ses_1", sel.selectedLocal[0].id) + + val ctrl = panel.getData(HistoryDataKeys.CONTROLLER.name) + assertSame(controller, ctrl) + } + + // ------ Multi-selection and cloud selection data context ------ + + fun `test data context exposes local multi-selection`() { + rpc.listed += session("ses_1", "Alpha") + rpc.listed += session("ses_2", "Beta") + val controller = controller() + val panel = HistoryPanel(parent, controller) + flush() + + panel.selectIndices(0, 1) + + val sel = panel.getData(HistoryDataKeys.SELECTION.name) as? HistorySelection + assertNotNull(sel) + assertEquals(HistorySource.LOCAL, sel!!.source) + assertEquals(2, sel.selectedLocal.size) + assertTrue(sel.selectedLocal.map { it.id }.containsAll(listOf("ses_1", "ses_2"))) + } + + fun `test data context exposes cloud selection`() { + rpc.cloud += cloud("cloud_1", "Cloud One") + val controller = controller() + val panel = HistoryPanel(parent, controller) + flush() panel.clickCloud() flush() - assertFalse(panel.cloudDeleteVisible(0)) + panel.select(0) + + val sel = panel.getData(HistoryDataKeys.SELECTION.name) as? HistorySelection + assertNotNull(sel) + assertEquals(HistorySource.CLOUD, sel!!.source) + assertTrue(sel.selectedLocal.isEmpty()) + assertEquals(1, sel.cloudItems.size) + assertEquals("cloud_1", sel.cloudItems[0].id) + } + + fun `test data context exposes session manager`() { + val manager = FakeManager() + val controller = controller() + val panel = HistoryPanel(parent, controller, manager = manager) + flush() + + assertSame(manager, panel.getData(SessionManager.KEY.name)) + } + + fun `test data context returns null for absent session manager`() { + val controller = controller() + val panel = HistoryPanel(parent, controller) + flush() + + assertNull(panel.getData(SessionManager.KEY.name)) + } + + fun `test local list uses multiple interval selection mode`() { + val panel = HistoryPanel(parent, controller()) + flush() + + assertEquals(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION, panel.listSelectionMode()) + } + + fun `test cloud list uses single selection mode`() { + val panel = HistoryPanel(parent, controller()) + flush() + + panel.clickCloud() + flush() + + assertEquals(javax.swing.ListSelectionModel.SINGLE_SELECTION, panel.listSelectionMode()) + } + + // ------ Rename failure and directory selection ------ + + fun `test rename failure keeps original title and sets error`() { + rpc.listed += session("ses_1", "Original") + val controller = controller() + controller.reloadLocal() + flush() + + rpc.renameThrows = IllegalStateException("rename failed") + val item = controller.local.items[0] + controller.rename(item, "Renamed") + flush() + + assertEquals("Original", controller.local.items[0].title) + assertNotNull(controller.local.error) + } + + fun `test rename uses item directory when present`() { + val dto = session("ses_1", "Original").copy(directory = "/worktree/path") + rpc.listed += dto + val controller = controller() + controller.reloadLocal() + flush() + + val item = controller.local.items[0] + assertEquals("/worktree/path", item.directory) + + controller.rename(item, "Renamed") + flush() + + assertEquals(listOf(Triple("ses_1", "/worktree/path", "Renamed")), rpc.renames) + } + + fun `test rename falls back to workspace directory when item directory is workspace`() { + // When session.directory matches workspace directory (not a worktree override) + rpc.listed += session("ses_1", "Original") + val controller = controller() + controller.reloadLocal() + flush() + + val item = controller.local.items[0] + controller.rename(item, "Renamed") + flush() + + assertEquals(listOf(Triple("ses_1", "/test", "Renamed")), rpc.renames) + } + + // ------ HistoryModel update/sorting ------ + + fun `test model update re-sorts items by updated time`() { + val now = java.time.Instant.now() + rpc.listed += session("ses_1", "Alpha", now.toEpochMilli().toDouble()) + rpc.listed += session("ses_2", "Beta", now.minusSeconds(100).toEpochMilli().toDouble()) + val controller = controller() + controller.reloadLocal() + flush() + + // ses_1 is newer so comes first + assertEquals("ses_1", controller.local.items[0].id) + + // Update ses_2 to be newer + val updated = session("ses_2", "Beta Updated", now.plusSeconds(100).toEpochMilli().toDouble()) + controller.local.update(LocalHistoryItem(updated)) + + // Now ses_2 should come first + assertEquals("ses_2", controller.local.items[0].id) + assertEquals("Beta Updated", controller.local.items[0].title) + } + + fun `test model update with unknown id leaves model unchanged`() { + rpc.listed += session("ses_1", "Alpha") + val controller = controller() + controller.reloadLocal() + flush() + + val before = controller.local.items.toList() + val unknown = session("unknown_id", "Unknown") + controller.local.update(LocalHistoryItem(unknown)) + + assertEquals(before.map { it.id }, controller.local.items.map { it.id }) + } + + fun `test model update removes renamed item from active filter`() { + rpc.listed += session("ses_1", "Alpha") + rpc.listed += session("ses_2", "Beta") + val controller = controller() + controller.reloadLocal() + flush() + + controller.local.setFilter("alpha") + assertEquals(listOf("ses_1"), controller.local.visibleItems.map { it.id }) + + controller.local.update(LocalHistoryItem(session("ses_1", "Gamma"))) + + assertTrue(controller.local.visibleItems.isEmpty()) + } + + fun `test model update adds renamed item to active filter`() { + rpc.listed += session("ses_1", "Alpha") + rpc.listed += session("ses_2", "Beta") + val controller = controller() + controller.reloadLocal() + flush() + + controller.local.setFilter("gamma") + assertTrue(controller.local.visibleItems.isEmpty()) + + controller.local.update(LocalHistoryItem(session("ses_2", "Gamma"))) + + assertEquals(listOf("ses_2"), controller.local.visibleItems.map { it.id }) } private fun controller() = HistoryController(sessions, workspace, scope) @@ -320,6 +541,12 @@ class HistoryControllerTest : BasePlatformTestCase() { opened.add(id) }) + private class FakeManager : SessionManager { + override fun newSession() {} + override fun showHistory() {} + override fun openSession(ref: SessionRef) {} + } + private fun collect(controller: HistoryController): MutableList { val events = mutableListOf() val listener = object : ListDataListener { diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/testing/FakeSessionRpcApi.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/testing/FakeSessionRpcApi.kt index dd7c8537930..ca5d29db1cc 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/testing/FakeSessionRpcApi.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/testing/FakeSessionRpcApi.kt @@ -86,6 +86,9 @@ class FakeSessionRpcApi : KiloSessionRpcApi { val questionReplies = mutableListOf>() val questionRejects = mutableListOf>() val deletes = mutableListOf>() + var deleteGate: CompletableDeferred? = null + val renames = mutableListOf>() + var renameThrows: Exception? = null val lists = mutableListOf() val recentCalls = mutableListOf>() val cloudCalls = mutableListOf() @@ -127,10 +130,23 @@ class FakeSessionRpcApi : KiloSessionRpcApi { override suspend fun delete(id: String, directory: String) { assertNotEdt("delete") + deleteGate?.await() deletes.add(id to directory) listed.removeAll { it.id == id } } + override suspend fun rename(id: String, directory: String, title: String): SessionDto { + assertNotEdt("rename") + renameThrows?.let { throw it } + renames.add(Triple(id, directory, title)) + val updated = listed.indexOfFirst { it.id == id } + if (updated >= 0) { + listed[updated] = listed[updated].copy(title = title) + return listed[updated] + } + return session.copy(id = id, title = title) + } + override suspend fun cloudSessions(directory: String, cursor: String?, limit: Int, gitUrl: String?): CloudSessionListDto { assertNotEdt("cloudSessions") cloudCalls.add(CloudCall(directory, cursor, limit, gitUrl)) diff --git a/packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/KiloSessionRpcApi.kt b/packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/KiloSessionRpcApi.kt index c467af110d1..25c8a63c3ab 100644 --- a/packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/KiloSessionRpcApi.kt +++ b/packages/kilo-jetbrains/shared/src/main/kotlin/ai/kilocode/rpc/KiloSessionRpcApi.kt @@ -51,6 +51,9 @@ interface KiloSessionRpcApi : RemoteApi { /** Delete a session. */ suspend fun delete(id: String, directory: String) + /** Rename a session. */ + suspend fun rename(id: String, directory: String, title: String): SessionDto + /** List cloud-backed sessions. */ suspend fun cloudSessions(directory: String, cursor: String?, limit: Int, gitUrl: String?): CloudSessionListDto From 9a08ccf576f5b000602faf377ed9cf37ed5f8d69 Mon Sep 17 00:00:00 2001 From: kirillk Date: Mon, 11 May 2026 16:59:10 -0400 Subject: [PATCH 2/6] fix(jetbrains): address history review gaps --- .../session/history/HistoryController.kt | 13 +++----- .../client/session/history/HistoryModel.kt | 2 -- .../client/session/history/HistoryPanel.kt | 33 +++++++++++-------- .../client/session/history/HistoryTime.kt | 4 +-- .../resources/messages/KiloBundle.properties | 1 - .../session/history/HistoryControllerTest.kt | 21 ++++++++++-- 6 files changed, 45 insertions(+), 29 deletions(-) diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt index a416a684642..d66e4665ecb 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt @@ -18,7 +18,7 @@ class HistoryController( private val deleted: (String) -> Unit = {}, ) { companion object { - const val CLOUD_LIMIT = 150 + const val CLOUD_LIMIT = 50 } val local = HistoryModel() @@ -26,11 +26,10 @@ class HistoryController( private val deleting = mutableSetOf() private val opener = open - private var git: String? = null - fun reload(gitUrl: String? = null) { + fun reload() { reloadLocal() - reloadCloud(gitUrl) + reloadCloud() } fun reloadLocal() { @@ -46,8 +45,7 @@ class HistoryController( } } - fun reloadCloud(gitUrl: String? = null) { - git = gitUrl + fun reloadCloud() { loadCloud(reset = true) } @@ -104,11 +102,10 @@ class HistoryController( private fun loadCloud(reset: Boolean) { val cursor = cloud.cursor.takeUnless { reset } - val gitUrl = git edt { cloud.start(reset) } cs.launch { try { - val result = sessions.cloudSessions(workspace.directory, cursor, CLOUD_LIMIT, gitUrl) + val result = sessions.cloudSessions(workspace.directory, cursor, CLOUD_LIMIT, null) val items = result.sessions.map(::cloudItem) edt { if (reset) cloud.replace(items, result.nextCursor) diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryModel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryModel.kt index ec457e8a5a1..67b6c105e93 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryModel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryModel.kt @@ -66,8 +66,6 @@ open class HistoryModel : AbstractListModel() { filter() } - fun hasFilter(): Boolean = query.isNotEmpty() - fun refresh() { val end = size.coerceAtLeast(1) - 1 fireContentsChanged(this, 0, end) diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt index c27bc0a7524..1cdefe26bb0 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt @@ -7,13 +7,16 @@ import ai.kilocode.client.session.ui.style.SessionEditorStyle import ai.kilocode.client.ui.UiStyle import com.intellij.icons.AllIcons import com.intellij.ide.ui.LafManagerListener -import com.intellij.ide.ui.laf.darcula.ui.DarculaButtonUI import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.Disposable import com.intellij.openapi.actionSystem.ActionGroup import com.intellij.openapi.actionSystem.ActionManager import com.intellij.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.DataProvider +import com.intellij.openapi.actionSystem.Presentation +import com.intellij.openapi.actionSystem.impl.ActionButton import com.intellij.openapi.util.Disposer import com.intellij.ui.DocumentAdapter import com.intellij.ui.PopupHandler @@ -53,7 +56,6 @@ import javax.swing.event.ListDataListener class HistoryPanel( parent: Disposable, private val controller: HistoryController, - private val gitUrl: () -> String? = { null }, private val nav: () -> Unit = {}, private val manager: SessionManager? = null, ) : BorderLayoutPanel(), Disposable, DataProvider { @@ -116,7 +118,7 @@ class HistoryPanel( fun refresh() { stale = false updateTheme() - controller.reload(gitUrl()) + controller.reload() } private fun bindTheme() { @@ -167,14 +169,19 @@ class HistoryPanel( ) } - private fun back() = BorderLayoutPanel().apply { - add(JButton(KiloBundle.message("history.back"), AllIcons.Actions.Back).apply { - putClientProperty(DarculaButtonUI.DEFAULT_STYLE_KEY, true) - isFocusable = false + private fun back(): BorderLayoutPanel { + val label = KiloBundle.message("history.back") + val action = object : AnAction(label, null, AllIcons.Actions.Back) { + override fun actionPerformed(e: AnActionEvent) = nav() + } + val presentation = Presentation(label).apply { icon = AllIcons.Actions.Back } + val btn = ActionButton(action, presentation, ActionPlaces.TOOLBAR, JBUI.size(16)).apply { cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) - addActionListener { nav() } - }, BorderLayout.WEST) - border = JBUI.Borders.emptyRight(UiStyle.Gap.lg()) + } + return BorderLayoutPanel().apply { + add(btn, BorderLayout.WEST) + border = JBUI.Borders.emptyRight(UiStyle.Gap.lg()) + } } private fun panel(search: SearchTextField, list: JList, footer: JComponent? = null): JComponent { @@ -356,17 +363,17 @@ class HistoryPanel( internal fun backText(): String? { val view = activeInfo().foreSideComponent ?: return null - return UIUtil.uiTraverser(view).filter(JButton::class.java).firstOrNull()?.text + return UIUtil.uiTraverser(view).filter(ActionButton::class.java).firstOrNull()?.presentation?.text } internal fun backCursor(): Int? { val view = activeInfo().foreSideComponent ?: return null - return UIUtil.uiTraverser(view).filter(JButton::class.java).firstOrNull()?.cursor?.type + return UIUtil.uiTraverser(view).filter(ActionButton::class.java).firstOrNull()?.cursor?.type } internal fun clickBack() { val view = activeInfo().foreSideComponent ?: return - UIUtil.uiTraverser(view).filter(JButton::class.java).firstOrNull()?.doClick() + UIUtil.uiTraverser(view).filter(ActionButton::class.java).firstOrNull()?.click() } internal fun clickDelete() { diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryTime.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryTime.kt index 1b3f9516ecf..a498e09365d 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryTime.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryTime.kt @@ -35,8 +35,8 @@ internal object HistoryTime { val today = Instant.ofEpochMilli(now).atZone(zone).toLocalDate() if (date == today) return HistorySection.TODAY if (date == today.minusDays(1)) return HistorySection.YESTERDAY - if (date.isAfter(today.minusDays(7)) && date.isBefore(today)) return HistorySection.WEEK - if (date.isAfter(today.minusDays(30)) && date.isBefore(today)) return HistorySection.MONTH + if (!date.isBefore(today.minusDays(7)) && date.isBefore(today)) return HistorySection.WEEK + if (!date.isBefore(today.minusDays(30)) && date.isBefore(today)) return HistorySection.MONTH return HistorySection.OLDER } diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties index 298028014b7..aeee59d987c 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties @@ -96,7 +96,6 @@ history.delete.confirm.message.multiple=Delete {0} sessions from local history? history.rename.title=Rename Session history.rename.prompt=New session name: history.cloud.load.more=Load more -history.cloud.repo.only=Only this repository history.group.today=Today history.group.yesterday=Yesterday history.group.week=This Week diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt index 213f6cd7440..8cddf763f0a 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt @@ -81,13 +81,13 @@ class HistoryControllerTest : BasePlatformTestCase() { rpc.cloudCursor = "next_1" val controller = controller() - controller.reloadCloud(gitUrl = "git@example.com:repo.git") + controller.reloadCloud() flush() assertEquals(1, controller.cloud.items.size) assertEquals("cloud_1", controller.cloud.items[0].id) assertEquals("next_1", controller.cloud.cursor) - assertEquals(FakeSessionRpcApi.CloudCall("/test", null, 150, "git@example.com:repo.git"), rpc.cloudCalls[0]) + assertEquals(FakeSessionRpcApi.CloudCall("/test", null, 50, null), rpc.cloudCalls[0]) rpc.cloud.clear() rpc.cloud += cloud("cloud_2", "Cloud Two") @@ -96,7 +96,7 @@ class HistoryControllerTest : BasePlatformTestCase() { flush() assertEquals(listOf("cloud_1", "cloud_2"), controller.cloud.items.map { it.id }) - assertEquals(FakeSessionRpcApi.CloudCall("/test", "next_1", 150, "git@example.com:repo.git"), rpc.cloudCalls[1]) + assertEquals(FakeSessionRpcApi.CloudCall("/test", "next_1", 50, null), rpc.cloudCalls[1]) } fun `test local delete calls rpc and removes item`() { @@ -298,6 +298,21 @@ class HistoryControllerTest : BasePlatformTestCase() { assertEquals(KiloBundle.message("history.time.hours", 10), HistoryTime.relative(offset, now.toEpochMilli())) } + fun `test history section boundaries are inclusive at 7 and 30 days`() { + val now = Instant.now() + val exactly7 = LocalHistoryItem(session("s7", "7d", now.minus(7, ChronoUnit.DAYS).toEpochMilli().toDouble())) + val exactly30 = LocalHistoryItem(session("s30", "30d", now.minus(30, ChronoUnit.DAYS).toEpochMilli().toDouble())) + val within7 = LocalHistoryItem(session("s6", "6d", now.minus(6, ChronoUnit.DAYS).toEpochMilli().toDouble())) + val within30 = LocalHistoryItem(session("s29", "29d", now.minus(29, ChronoUnit.DAYS).toEpochMilli().toDouble())) + val beyond30 = LocalHistoryItem(session("s31", "31d", now.minus(31, ChronoUnit.DAYS).toEpochMilli().toDouble())) + + assertEquals(HistorySection.WEEK, HistoryTime.section(exactly7, now.toEpochMilli())) + assertEquals(HistorySection.WEEK, HistoryTime.section(within7, now.toEpochMilli())) + assertEquals(HistorySection.MONTH, HistoryTime.section(exactly30, now.toEpochMilli())) + assertEquals(HistorySection.MONTH, HistoryTime.section(within30, now.toEpochMilli())) + assertEquals(HistorySection.OLDER, HistoryTime.section(beyond30, now.toEpochMilli())) + } + fun `test list is focusable and uses multiple interval selection`() { val panel = HistoryPanel(parent, controller()) flush() From d25f537a114dec2bbfeb703f476f0c268e83dda1 Mon Sep 17 00:00:00 2001 From: kirillk Date: Wed, 13 May 2026 15:22:22 -0400 Subject: [PATCH 3/6] feat(jetbrains): add cloud history repo-only filter Resolve remaining parity gap from PR #10097 review: VS Code's cloud history has an 'Only this repository' checkbox that filters sessions by git remote URL; JetBrains had the RPC plumbing but no UI or URL lookup. - Add GitRemoteUrl.kt helper that resolves 'origin' via git subprocess - HistoryController gains gitUrl (resolved once on first cloud load) and repoOnly (defaults true when a URL exists); applyRepoOnly() toggles the filter and reloads cloud history - HistoryPanel adds a JBCheckBox on the cloud tab, visible only when a git remote URL is found, with left indent aligned to list item text - Add bundle key history.cloud.repo.only - Extend HistoryControllerTest with 8 new cases covering URL filtering, null fallback, load-more retention, and checkbox panel behaviour --- .../client/session/history/GitRemoteUrl.kt | 19 +++ .../session/history/HistoryController.kt | 46 +++++++- .../client/session/history/HistoryPanel.kt | 28 ++++- .../resources/messages/KiloBundle.properties | 1 + .../session/history/HistoryControllerTest.kt | 109 ++++++++++++++++++ 5 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/GitRemoteUrl.kt diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/GitRemoteUrl.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/GitRemoteUrl.kt new file mode 100644 index 00000000000..ad614060638 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/GitRemoteUrl.kt @@ -0,0 +1,19 @@ +package ai.kilocode.client.session.history + +/** + * Resolves the origin remote URL for a given directory by running + * `git remote get-url origin` as a subprocess. + * + * Returns null when the directory is not a git repo, has no origin remote, + * or the command fails for any reason. + * + * Overridable in tests via [resolve] parameter. + */ +internal fun resolveGitRemoteUrl(dir: String): String? = runCatching { + val proc = ProcessBuilder("git", "remote", "get-url", "origin") + .directory(java.io.File(dir)) + .start() + val out = proc.inputStream.bufferedReader().readText().trim() + val code = proc.waitFor() + if (code == 0 && out.isNotEmpty()) out else null +}.getOrNull() diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt index d66e4665ecb..3fed465de6f 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt @@ -16,6 +16,7 @@ class HistoryController( private val cs: CoroutineScope, open: (SessionRef) -> Unit = {}, private val deleted: (String) -> Unit = {}, + private val gitUrlProvider: () -> String? = { resolveGitRemoteUrl(workspace.directory) }, ) { companion object { const val CLOUD_LIMIT = 50 @@ -24,6 +25,24 @@ class HistoryController( val local = HistoryModel() val cloud = CloudHistoryModel() + /** Resolved once on first cloud load; null means no remote found. Written from IO, read on EDT. */ + @Volatile + var gitUrl: String? = null + private set + + /** Whether to filter cloud history by the current repository. */ + var repoOnly: Boolean = false + private set + + /** Notified on EDT when [repoOnly] changes (e.g. to update checkbox state). */ + var onRepoOnlyChanged: ((Boolean) -> Unit)? = null + + private fun updateRepoOnly(value: Boolean) { + if (repoOnly == value) return + repoOnly = value + edt { onRepoOnlyChanged?.invoke(value) } + } + private val deleting = mutableSetOf() private val opener = open @@ -54,6 +73,11 @@ class HistoryController( loadCloud(reset = false) } + fun applyRepoOnly(value: Boolean) { + updateRepoOnly(value) + edt { reloadCloud() } + } + fun delete(item: LocalHistoryItem) { edt { if (item.id in deleting) return@edt @@ -104,8 +128,10 @@ class HistoryController( val cursor = cloud.cursor.takeUnless { reset } edt { cloud.start(reset) } cs.launch { + val url = resolveUrlIfNeeded() + val filter = if (repoOnly) url else null try { - val result = sessions.cloudSessions(workspace.directory, cursor, CLOUD_LIMIT, null) + val result = sessions.cloudSessions(workspace.directory, cursor, CLOUD_LIMIT, filter) val items = result.sessions.map(::cloudItem) edt { if (reset) cloud.replace(items, result.nextCursor) @@ -116,6 +142,24 @@ class HistoryController( } } } + + /** + * Resolves [gitUrl] on first cloud load. Subsequent calls return the cached value. + * Also enables [repoOnly] by default when a URL is found the first time. + * + * Must be called from a coroutine. Writes [gitUrl] directly (volatile) and then + * propagates state updates to EDT via [edt]. + */ + private suspend fun resolveUrlIfNeeded(): String? { + if (gitUrl != null) return gitUrl + val url = kotlinx.coroutines.withContext(kotlinx.coroutines.Dispatchers.IO) { + gitUrlProvider() + } + // Write gitUrl directly (volatile) so it is visible before EDT callbacks fire. + gitUrl = url + if (url != null) updateRepoOnly(true) + return url + } } private fun edt(block: () -> Unit) { diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt index 1cdefe26bb0..b3ad33485d8 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryPanel.kt @@ -22,6 +22,7 @@ import com.intellij.ui.DocumentAdapter import com.intellij.ui.PopupHandler import com.intellij.ui.SearchTextField import com.intellij.ui.ScrollingUtil +import com.intellij.ui.components.JBCheckBox import com.intellij.ui.components.JBList import com.intellij.ui.components.JBScrollPane import com.intellij.ui.tabs.JBTabs @@ -64,6 +65,11 @@ class HistoryPanel( private val localList = localList() private val cloudList = cloudList() private val more = LoadMoreButton() + private val repoOnly = JBCheckBox(KiloBundle.message("history.cloud.repo.only"), true).apply { + isVisible = false + border = JBUI.Borders.emptyLeft(UiStyle.Gap.lg()) + addActionListener { controller.applyRepoOnly(isSelected) } + } private val localPanel = panel(localSearch, localList) private val cloudPanel = panel(cloudSearch, cloudList, more) private val cards = CardLayout() @@ -96,6 +102,9 @@ class HistoryPanel( bind(localList, controller.local) bind(cloudList, controller.cloud) bindTheme() + controller.onRepoOnlyChanged = { value -> + repoOnly.isSelected = value + } addHierarchyListener { e -> if (e.changeFlags and HierarchyEvent.SHOWING_CHANGED.toLong() == 0L) return@addHierarchyListener if (isShowing && stale) { @@ -186,7 +195,13 @@ class HistoryPanel( private fun panel(search: SearchTextField, list: JList, footer: JComponent? = null): JComponent { return BorderLayoutPanel().apply { - add(search, BorderLayout.NORTH) + val north = BorderLayoutPanel().apply { + add(search, BorderLayout.CENTER) + if (list === cloudList) { + add(repoOnly, BorderLayout.SOUTH) + } + } + add(north, BorderLayout.NORTH) add(JBScrollPane(list).apply { border = JBUI.Borders.empty() viewportBorder = JBUI.Borders.empty() @@ -265,6 +280,7 @@ class HistoryPanel( syncList(cloudList, controller.cloud) more.isEnabled = controller.cloud.cursor != null && !controller.cloud.loading more.isVisible = controller.cloud.cursor != null || controller.cloud.loading + repoOnly.isVisible = controller.gitUrl != null cards.show(body, if (loading()) CARD_LOAD else CARD_TABS) revalidate() repaint() @@ -404,6 +420,14 @@ class HistoryPanel( return items.indices.mapNotNull { HistoryRenderer.section(items, it) } } + internal fun repoOnlyVisible() = repoOnly.isVisible + + internal fun repoOnlySelected() = repoOnly.isSelected + + internal fun clickRepoOnly() { + repoOnly.doClick() + } + private fun activeList(): JBList = if (tabs.selectedInfo === cloudInfo) cloudList else localList private fun activeModel(): HistoryModel = if (tabs.selectedInfo === cloudInfo) controller.cloud else controller.local @@ -423,7 +447,7 @@ class HistoryPanel( } override fun dispose() { - // no-op + controller.onRepoOnlyChanged = null } private class LoadMoreButton : JButton(KiloBundle.message("history.cloud.load.more")) { diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties index aeee59d987c..298028014b7 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties @@ -96,6 +96,7 @@ history.delete.confirm.message.multiple=Delete {0} sessions from local history? history.rename.title=Rename Session history.rename.prompt=New session name: history.cloud.load.more=Load more +history.cloud.repo.only=Only this repository history.group.today=Today history.group.yesterday=Yesterday history.group.week=This Week diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt index 8cddf763f0a..2f9d3cb960d 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt @@ -546,8 +546,117 @@ class HistoryControllerTest : BasePlatformTestCase() { assertEquals(listOf("ses_2"), controller.local.visibleItems.map { it.id }) } + fun `test cloud load passes git url when repo only enabled`() { + rpc.cloud += cloud("cloud_1", "Cloud One") + val url = "git@github.com:test/repo.git" + val controller = controllerWithGit(url) + + controller.reloadCloud() + flush() + + assertEquals(1, rpc.cloudCalls.size) + assertEquals(url, rpc.cloudCalls[0].gitUrl) + assertEquals(true, controller.repoOnly) + assertEquals(url, controller.gitUrl) + } + + fun `test cloud load passes null when no git url`() { + rpc.cloud += cloud("cloud_1", "Cloud One") + val controller = controllerWithGit(null) + + controller.reloadCloud() + flush() + + assertEquals(1, rpc.cloudCalls.size) + assertNull(rpc.cloudCalls[0].gitUrl) + assertEquals(false, controller.repoOnly) + assertNull(controller.gitUrl) + } + + fun `test cloud load passes null when repo only disabled`() { + rpc.cloud += cloud("cloud_1", "Cloud One") + val url = "git@github.com:test/repo.git" + val controller = controllerWithGit(url) + + controller.reloadCloud() + flush() + assertEquals(url, rpc.cloudCalls[0].gitUrl) + + controller.applyRepoOnly(false) + flush() + + assertEquals(2, rpc.cloudCalls.size) + assertNull(rpc.cloudCalls[1].gitUrl) + } + + fun `test load more passes git url when repo only enabled`() { + rpc.cloud += cloud("cloud_1", "Cloud One") + rpc.cloudCursor = "next_1" + val url = "git@github.com:test/repo.git" + val controller = controllerWithGit(url) + + controller.reloadCloud() + flush() + + rpc.cloud.clear() + rpc.cloud += cloud("cloud_2", "Cloud Two") + rpc.cloudCursor = null + controller.loadMoreCloud() + flush() + + assertEquals(2, rpc.cloudCalls.size) + assertEquals(url, rpc.cloudCalls[1].gitUrl) + } + + fun `test repo only checkbox visible only when git url exists`() { + val url = "git@github.com:test/repo.git" + val panel = HistoryPanel(parent, controllerWithGit(url)) + flush() + + panel.clickCloud() + flush() + + assertTrue(panel.repoOnlyVisible()) + assertTrue(panel.repoOnlySelected()) + } + + fun `test repo only checkbox hidden when no git url`() { + val panel = HistoryPanel(parent, controllerWithGit(null)) + flush() + + panel.clickCloud() + flush() + + assertFalse(panel.repoOnlyVisible()) + } + + fun `test repo only checkbox toggle reloads cloud history`() { + rpc.cloud += cloud("cloud_1", "Cloud One") + val url = "git@github.com:test/repo.git" + val panel = HistoryPanel(parent, controllerWithGit(url)) + flush() + + panel.clickCloud() + flush() + + val before = rpc.cloudCalls.size + + panel.clickRepoOnly() + flush() + + assertTrue(rpc.cloudCalls.size > before) + assertFalse(panel.repoOnlySelected()) + } + private fun controller() = HistoryController(sessions, workspace, scope) + private fun controllerWithGit(url: String?) = HistoryController( + sessions, + workspace, + scope, + gitUrlProvider = { url }, + ) + private fun controller(opened: MutableList) = HistoryController(sessions, workspace, scope, open = { open -> val id = when (open) { is SessionRef.Local -> open.id From 4fc89dce672bfdd1bd90aa27211fb66ad6eff5b3 Mon Sep 17 00:00:00 2001 From: kirillk Date: Wed, 13 May 2026 15:57:12 -0400 Subject: [PATCH 4/6] feat(jetbrains): add i18n locale bundles for 18 languages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add KiloBundle locale files for ar, bs, da, de, es, fr, ja, ko, nl, no, pl, pt_BR, ru, th, tr, uk, zh_CN, zh_TW — matching the language support already present in the VS Code extension. --- .../messages/KiloBundle_ar.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_bs.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_da.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_de.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_es.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_fr.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_ja.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_ko.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_nl.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_no.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_pl.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_pt_BR.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_ru.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_th.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_tr.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_uk.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_zh_CN.properties | 139 ++++++++++++++++++ .../messages/KiloBundle_zh_TW.properties | 139 ++++++++++++++++++ 18 files changed, 2502 insertions(+) create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ar.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_bs.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_da.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_de.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_es.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_fr.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ja.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ko.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_nl.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_no.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pl.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pt_BR.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ru.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_th.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_tr.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_uk.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_CN.properties create mode 100644 packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_TW.properties diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ar.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ar.properties new file mode 100644 index 00000000000..acf55ee1378 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ar.properties @@ -0,0 +1,139 @@ +session.connection.connecting=\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644\u2026 +session.connection.error.app=\u0641\u0634\u0644 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 +session.connection.error.workspace=\u0641\u0634\u0644 \u062a\u062d\u0645\u064a\u0644 \u0645\u0633\u0627\u062d\u0629 \u0627\u0644\u0639\u0645\u0644 +session.connection.error.unknown=\u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641 +session.connection.retry=\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 +session.connection.warning.config=\u062a\u062d\u0630\u064a\u0631\u0627\u062a \u0627\u0644\u062a\u0643\u0648\u064a\u0646 + +session.empty.welcome=Kilo Code \u0647\u0648 \u0645\u0633\u0627\u0639\u062f \u0628\u0631\u0645\u062c\u0629 \u0628\u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a. \u0627\u0637\u0644\u0628 \u0645\u0646\u0647 \u0628\u0646\u0627\u0621 \u0645\u064a\u0632\u0627\u062a \u0623\u0648 \u0625\u0635\u0644\u0627\u062d \u0623\u062e\u0637\u0627\u0621 \u0623\u0648 \u0634\u0631\u062d \u0642\u0627\u0639\u062f\u0629 \u0627\u0644\u0643\u0648\u062f. +session.empty.loading=\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644\u2026 +session.empty.recent=\u0627\u0644\u062d\u062f\u064a\u062b\u0629 +session.showHistory=\u0639\u0631\u0636 \u0627\u0644\u0633\u062c\u0644 +session.scroll.bottom=\u0627\u0644\u062a\u0645\u0631\u064a\u0631 \u0625\u0644\u0649 \u0627\u0644\u0623\u0633\u0641\u0644 +session.tab.new=\u062c\u0644\u0633\u0629 \u062c\u062f\u064a\u062f\u0629 +session.tab.untitled=\u062c\u0644\u0633\u0629 \u0628\u062f\u0648\u0646 \u0639\u0646\u0648\u0627\u0646 + +session.permission.title=\u0637\u0644\u0628 \u0625\u0630\u0646 +session.permission.meta=\u0627\u0644\u0623\u062f\u0627\u0629: {0} \u2022 \u0627\u0644\u0623\u0646\u0645\u0627\u0637: {1} +session.permission.allow=\u0633\u0645\u0627\u062d +session.permission.deny=\u0631\u0641\u0636 +session.question.dismiss=\u0631\u0641\u0636 + +session.status.considering=\u062c\u0627\u0631 \u0627\u0644\u062a\u0641\u0643\u064a\u0631 \u0641\u064a \u0627\u0644\u062e\u0637\u0648\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629\u2026 +session.status.thinking=\u062c\u0627\u0631 \u0627\u0644\u062a\u0641\u0643\u064a\u0631\u2026 +session.status.writing=\u062c\u0627\u0631\u064a \u0643\u062a\u0627\u0628\u0629 \u0627\u0644\u0631\u062f\u2026 +session.status.delegating=\u062c\u0627\u0631 \u062a\u0641\u0648\u064a\u0636 \u0627\u0644\u0639\u0645\u0644\u2026 +session.status.planning=\u062c\u0627\u0631 \u0627\u0644\u062a\u062e\u0637\u064a\u0637\u2026 +session.status.gathering=\u062c\u0627\u0631 \u062c\u0645\u0639 \u0627\u0644\u0633\u064a\u0627\u0642\u2026 +session.status.searching.codebase=\u062c\u0627\u0631 \u0627\u0644\u0628\u062d\u062b \u0641\u064a \u0642\u0627\u0639\u062f\u0629 \u0627\u0644\u0643\u0648\u062f\u2026 +session.status.searching.web=\u062c\u0627\u0631 \u0627\u0644\u0628\u062d\u062b \u0639\u0644\u0649 \u0627\u0644\u0648\u064a\u0628\u2026 +session.status.editing=\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0631\u064a\u0631\u2026 +session.status.commands=\u062c\u0627\u0631\u064a \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u0623\u0648\u0627\u0645\u0631\u2026 + +session.part.reasoning=\u0627\u0644\u0627\u0633\u062a\u062f\u0644\u0627\u0644 +session.part.compaction=\u0627\u0644\u0633\u064a\u0627\u0642 \u0645\u0636\u063a\u0648\u0637 +session.part.tool.copy=\u0646\u0633\u062e +session.part.tool.error=\u062e\u0637\u0623 +session.part.tool.pending=\u0645\u0639\u0644\u0642 +session.part.tool.read=\u0642\u0631\u0627\u0621\u0629 +session.part.tool.running=\u0642\u064a\u062f \u0627\u0644\u062a\u0634\u063a\u064a\u0644 +session.part.tool.shell=Shell +session.part.tool.truncated=\u0627\u0644\u0645\u062e\u0631\u062c\u0627\u062a \u0645\u062e\u062a\u0635\u0631\u0629 \u0641\u064a \u0627\u0644\u0645\u0639\u0627\u064a\u0646\u0629 \u0627\u0644\u0645\u0633\u0628\u0642\u0629. \u0627\u0644\u0645\u062e\u0631\u062c\u0627\u062a \u0627\u0644\u0643\u0627\u0645\u0644\u0629 \u0644\u0627 \u062a\u0632\u0627\u0644 \u0641\u064a \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062c\u0644\u0633\u0629. + +session.error.prompt=\u0641\u0634\u0644 \u0627\u0644\u0637\u0644\u0628 +session.error.compact=\u0641\u0634\u0644 \u0636\u063a\u0637 \u0627\u0644\u062c\u0644\u0633\u0629 +session.error.unknown=\u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641 + +session.header.tokens=\u0627\u0644\u0631\u0645\u0648\u0632 +session.header.tokens.description=\u0627\u0644\u0631\u0645\u0648\u0632 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u0629 \u0641\u064a \u0622\u062e\u0631 \u0631\u062f \u0644\u0644\u0645\u0633\u0627\u0639\u062f: \u0627\u0644\u0625\u062f\u062e\u0627\u0644\u060c \u0627\u0644\u0625\u062e\u0631\u0627\u062c\u060c \u0643\u062a\u0627\u0628\u0627\u062a \u0627\u0644\u0645\u062e\u0632\u0646 \u0627\u0644\u0645\u0624\u0642\u062a \u0648\u0642\u0631\u0627\u0621\u0627\u062a\u0647. +session.header.input=\u0625\u062f\u062e\u0627\u0644 {0} +session.header.output=\u0625\u062e\u0631\u0627\u062c {0} +session.header.cache.write=\u0643\u062a\u0627\u0628\u0629 \u0645\u062e\u0632\u0646 \u0645\u0624\u0642\u062a {0} +session.header.cache.read=\u0642\u0631\u0627\u0621\u0629 \u0645\u062e\u0632\u0646 \u0645\u0624\u0642\u062a {0} +session.header.compact=\u0636\u063a\u0637 \u0627\u0644\u062c\u0644\u0633\u0629 +session.header.compact.description=\u062a\u0644\u062e\u064a\u0635 \u0627\u0644\u062c\u0644\u0633\u0629 \u0644\u062a\u0642\u0644\u064a\u0644 \u062d\u062c\u0645 \u0627\u0644\u0633\u064a\u0627\u0642 +session.header.expand=\u0639\u0631\u0636 \u0645\u0642\u0627\u064a\u064a\u0633 \u0627\u0644\u062c\u0644\u0633\u0629 +session.header.collapse=\u0625\u062e\u0641\u0627\u0621 \u0645\u0642\u0627\u064a\u064a\u0633 \u0627\u0644\u062c\u0644\u0633\u0629 +session.header.todos.progress={0}/{1} \u0645\u0647\u0627\u0645 \u0645\u0643\u062a\u0645\u0644\u0629 +session.header.todos.done=\u062c\u0645\u064a\u0639 {0} \u0645\u0647\u0627\u0645 \u0645\u0643\u062a\u0645\u0644\u0629 +session.header.context.tooltip.percent={0} \u0631\u0645\u0632 ({1}\u066a \u0645\u0646 \u0627\u0644\u0633\u064a\u0627\u0642) +session.header.context.tooltip.tokens={0} \u0631\u0645\u0632 +session.header.context.used={0} / {1} \u0631\u0645\u0632 \u0645\u0633\u062a\u062e\u062f\u0645 +session.header.context.reserved={0} \u0645\u062d\u062c\u0648\u0632 \u0644\u0644\u0625\u062e\u0631\u0627\u062c +session.header.context.available={0} \u0645\u062a\u0627\u062d + +prompt.placeholder=\u0627\u0643\u062a\u0628 \u0631\u0633\u0627\u0644\u0629\u2026 +prompt.placeholder.with.shortcuts=\u0627\u0643\u062a\u0628 \u0631\u0633\u0627\u0644\u0629\u2026 ({0} \u0644\u0644\u0625\u0631\u0633\u0627\u0644\u060c {1} \u0644\u0633\u0637\u0631 \u062c\u062f\u064a\u062f) +prompt.placeholder.with.send=\u0627\u0643\u062a\u0628 \u0631\u0633\u0627\u0644\u0629\u2026 ({0} \u0644\u0644\u0625\u0631\u0633\u0627\u0644) +prompt.placeholder.with.newline=\u0627\u0643\u062a\u0628 \u0631\u0633\u0627\u0644\u0629\u2026 ({0} \u0644\u0633\u0637\u0631 \u062c\u062f\u064a\u062f) +prompt.button.send=\u0625\u0631\u0633\u0627\u0644 +prompt.button.stop=\u0625\u064a\u0642\u0627\u0641 +prompt.button.send.tooltip.stop=\u0644\u0644\u0625\u064a\u0642\u0627\u0641\u060c \u0627\u0636\u063a\u0637 {0} +mode.picker.tooltip=\u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0648\u0636\u0639 +mode.picker.deprecated=\u0645\u0647\u062c\u0648\u0631 +model.picker.tooltip=\u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0646\u0645\u0648\u0630\u062c +model.picker.recommended=\u0645\u0648\u0635\u0649 \u0628\u0647 +model.picker.favorites=\u0627\u0644\u0645\u0641\u0636\u0644\u0629 +model.picker.search=\u0628\u062d\u062b \u0639\u0646 \u0646\u0645\u0627\u0630\u062c +model.picker.no.matches=\u0644\u0627 \u062a\u0648\u062c\u062f \u0646\u0645\u0627\u0630\u062c \u0645\u0637\u0627\u0628\u0642\u0629 +model.picker.favorite.add=\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u0641\u0636\u0644\u0629 +model.picker.favorite.remove=\u0625\u0632\u0627\u0644\u0629 \u0645\u0646 \u0627\u0644\u0645\u0641\u0636\u0644\u0629 +model.picker.free=\u0645\u062c\u0627\u0646\u064a +model.picker.reset=\u0625\u0639\u0627\u062f\u0629 \u0636\u0628\u0637 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0644\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a +reasoning.picker.tooltip=\u0627\u062e\u062a\u064a\u0627\u0631 \u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u0627\u0633\u062a\u062f\u0644\u0627\u0644 + +history.tab.local=\u0645\u062d\u0644\u064a +history.tab.cloud=\u0633\u062d\u0627\u0628\u064a +history.back=\u0631\u062c\u0648\u0639 +history.search.placeholder=\u0628\u062d\u062b \u0641\u064a \u0627\u0644\u062c\u0644\u0633\u0627\u062a +history.empty=\u0644\u0627 \u062a\u0648\u062c\u062f \u062c\u0644\u0633\u0627\u062a +history.loading=\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644\u2026 +history.untitled=\u0628\u062f\u0648\u0646 \u0639\u0646\u0648\u0627\u0646 +history.delete.text=\u062d\u0630\u0641 +history.delete.confirm.title=\u062d\u0630\u0641 \u0627\u0644\u062c\u0644\u0633\u0629\u061f +history.delete.confirm.message=\u062d\u0630\u0641 "{0}" \u0645\u0646 \u0627\u0644\u0633\u062c\u0644 \u0627\u0644\u0645\u062d\u0644\u064a\u061f +history.delete.confirm.message.multiple=\u062d\u0630\u0641 {0} \u062c\u0644\u0633\u0627\u062a \u0645\u0646 \u0627\u0644\u0633\u062c\u0644 \u0627\u0644\u0645\u062d\u0644\u064a\u061f +history.rename.title=\u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u062c\u0644\u0633\u0629 +history.rename.prompt=\u0627\u0633\u0645 \u0627\u0644\u062c\u0644\u0633\u0629 \u0627\u0644\u062c\u062f\u064a\u062f: +history.cloud.load.more=\u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0645\u0632\u064a\u062f +history.cloud.repo.only=\u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u0648\u062f\u0639 \u0641\u0642\u0637 +history.group.today=\u0627\u0644\u064a\u0648\u0645 +history.group.yesterday=\u0623\u0645\u0633 +history.group.week=\u0647\u0630\u0627 \u0627\u0644\u0623\u0633\u0628\u0648\u0639 +history.group.month=\u0647\u0630\u0627 \u0627\u0644\u0634\u0647\u0631 +history.group.older=\u0623\u0642\u062f\u0645 +history.time.moments=\u0644\u0644\u062a\u0648 +history.time.minutes=\u0645\u0646\u0630 {0} \u062f\u0642\u064a\u0642\u0629 +history.time.hours=\u0645\u0646\u0630 {0} \u0633\u0627\u0639\u0629 +history.time.days=\u0645\u0646\u0630 {0} \u064a\u0648\u0645 +history.time.months=\u0645\u0646\u0630 {0} \u0634\u0647\u0631 +history.time.years=\u0645\u0646\u0630 {0} \u0633\u0646\u0629 +history.error.local=\u0641\u0634\u0644 \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0633\u062c\u0644 \u0627\u0644\u0645\u062d\u0644\u064a +history.error.cloud=\u0641\u0634\u0644 \u062a\u062d\u0645\u064a\u0644 \u0633\u062c\u0644 \u0627\u0644\u0633\u062d\u0627\u0628\u0629 +history.error.local.delete=\u0641\u0634\u0644 \u062d\u0630\u0641 \u0627\u0644\u062c\u0644\u0633\u0629 +history.error.local.rename=\u0641\u0634\u0644 \u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u062c\u0644\u0633\u0629 +history.error.cloud.delete=\u0644\u0627 \u064a\u0645\u0643\u0646 \u062d\u0630\u0641 \u062c\u0644\u0633\u0627\u062a \u0627\u0644\u0633\u062d\u0627\u0628\u0629 \u0628\u0639\u062f + +action.Kilo.Settings.text=\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a +action.Kilo.Settings.description=\u0625\u0639\u062f\u0627\u062f\u0627\u062a Kilo Code +action.Kilo.NewSession.text=\u062c\u0644\u0633\u0629 \u062c\u062f\u064a\u062f\u0629 +action.Kilo.NewSession.description=\u0628\u062f\u0621 \u062c\u0644\u0633\u0629 Kilo \u062c\u062f\u064a\u062f\u0629 +action.Kilo.History.text=\u0627\u0644\u0633\u062c\u0644 +action.Kilo.History.description=\u0639\u0631\u0636 \u0633\u062c\u0644 \u0627\u0644\u062c\u0644\u0633\u0627\u062a +action.Kilo.SendPrompt.text=\u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0637\u0644\u0628 +action.Kilo.SendPrompt.description=\u0625\u0631\u0633\u0627\u0644 \u0637\u0644\u0628 Kilo \u0627\u0644\u062d\u0627\u0644\u064a +action.Kilo.StopSession.text=\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u062c\u0644\u0633\u0629 +action.Kilo.StopSession.description=\u0625\u064a\u0642\u0627\u0641 \u062c\u0644\u0633\u0629 Kilo \u0627\u0644\u062d\u0627\u0644\u064a\u0629 +action.Kilo.SettingsGroup.text=\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a +action.Kilo.SettingsGroup.description=\u0625\u0639\u062f\u0627\u062f\u0627\u062a Kilo Code +action.Kilo.Restart.text=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 Kilo +action.Kilo.Restart.description=\u0625\u0646\u0647\u0627\u0621 \u0639\u0645\u0644\u064a\u0629 CLI \u0648\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644\u0647\u0627 +action.Kilo.Reinstall.text=\u0625\u0639\u0627\u062f\u0629 \u062a\u062b\u0628\u064a\u062a Kilo +action.Kilo.Reinstall.description=\u0627\u0633\u062a\u062e\u0631\u0627\u062c CLI \u0645\u062c\u062f\u062f\u0627\u064b \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644 +action.Kilo.Session.Open.text=\u0641\u062a\u062d +action.Kilo.Session.Open.description=\u0641\u062a\u062d \u0627\u0644\u062c\u0644\u0633\u0629 \u0627\u0644\u0645\u062d\u062f\u062f\u0629 +action.Kilo.Session.Rename.text=\u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 +action.Kilo.Session.Rename.description=\u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u062c\u0644\u0633\u0629 \u0627\u0644\u0645\u062d\u062f\u062f\u0629 +action.Kilo.Session.Delete.text=\u062d\u0630\u0641 +action.Kilo.Session.Delete.description=\u062d\u0630\u0641 \u0627\u0644\u062c\u0644\u0633\u0629 (\u0627\u0644\u062c\u0644\u0633\u0627\u062a) \u0627\u0644\u0645\u062d\u062f\u062f\u0629 +action.Kilo.History.ContextMenu.text=\u0625\u062c\u0631\u0627\u0621\u0627\u062a \u0627\u0644\u0633\u062c\u0644 diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_bs.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_bs.properties new file mode 100644 index 00000000000..5dec37fce29 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_bs.properties @@ -0,0 +1,139 @@ +session.connection.connecting=U\u010ditavanje\u2026 +session.connection.error.app=Gre\u0161ka pri spajanju +session.connection.error.workspace=Gre\u0161ka pri u\u010ditavanju radnog prostora +session.connection.error.unknown=Nepoznata gre\u0161ka +session.connection.retry=Poku\u0161aj ponovo +session.connection.warning.config=Upozorenja konfiguracije + +session.empty.welcome=Kilo Code je AI asistent za kodiranje. Zatra\u017eite od njega da gradi funkcije, ispravlja gre\u0161ke ili obja\u0161njava va\u0161u bazu koda. +session.empty.loading=U\u010ditavanje\u2026 +session.empty.recent=NEDAVNO +session.showHistory=Prika\u017ei historiju +session.scroll.bottom=Skrolaj na dno +session.tab.new=Nova sesija +session.tab.untitled=Sesija bez naslova + +session.permission.title=Zahtjev za dozvolu +session.permission.meta=Alat: {0} \u2022 Uzorci: {1} +session.permission.allow=Dozvoli +session.permission.deny=Odbij +session.question.dismiss=Zatvori + +session.status.considering=Razmatranje sljede\u0107ih koraka\u2026 +session.status.thinking=Razmi\u0161ljanje\u2026 +session.status.writing=Pisanje odgovora\u2026 +session.status.delegating=Delegiranje posla\u2026 +session.status.planning=Planiranje\u2026 +session.status.gathering=Prikupljanje konteksta\u2026 +session.status.searching.codebase=Pretra\u017eivanje baze koda\u2026 +session.status.searching.web=Pretra\u017eivanje weba\u2026 +session.status.editing=Ure\u0111ivanje\u2026 +session.status.commands=Pokretanje komandi\u2026 + +session.part.reasoning=Rezonovanje +session.part.compaction=kontekst komprimovan +session.part.tool.copy=Kopiraj +session.part.tool.error=Gre\u0161ka +session.part.tool.pending=Na \u010dekanju +session.part.tool.read=\u010cita +session.part.tool.running=Pokrenuto +session.part.tool.shell=Shell +session.part.tool.truncated=Izlaz skra\u0107en u pregledu. Potpuni izlaz ostaje u podacima sesije. + +session.error.prompt=Gre\u0161ka upita +session.error.compact=Komprimiranje sesije neuspje\u0161no +session.error.unknown=Nepoznata gre\u0161ka + +session.header.tokens=Tokeni +session.header.tokens.description=Tokeni kori\u0161teni u posljednjem odgovoru asistenta: ulaz, izlaz, pisanja u ke\u0161 i \u010ditanja iz ke\u0161a. +session.header.input=ulaz {0} +session.header.output=izlaz {0} +session.header.cache.write=pisanje u ke\u0161 {0} +session.header.cache.read=\u010ditanje iz ke\u0161a {0} +session.header.compact=Komprimiraj sesiju +session.header.compact.description=Sa\u017emite sesiju kako biste smanjili veli\u010dinu konteksta +session.header.expand=Prika\u017ei metrike sesije +session.header.collapse=Sakrij metrike sesije +session.header.todos.progress={0}/{1} zadataka zavr\u0161eno +session.header.todos.done=Svih {0} zadataka zavr\u0161eno +session.header.context.tooltip.percent={0} tokena ({1}% konteksta) +session.header.context.tooltip.tokens={0} tokena +session.header.context.used={0} / {1} tokena kori\u0161teno +session.header.context.reserved={0} rezervisano za izlaz +session.header.context.available={0} dostupno + +prompt.placeholder=Upi\u0161ite poruku\u2026 +prompt.placeholder.with.shortcuts=Upi\u0161ite poruku\u2026 ({0} za slanje, {1} za novi red) +prompt.placeholder.with.send=Upi\u0161ite poruku\u2026 ({0} za slanje) +prompt.placeholder.with.newline=Upi\u0161ite poruku\u2026 ({0} za novi red) +prompt.button.send=Po\u0161alji +prompt.button.stop=Zaustavi +prompt.button.send.tooltip.stop=Da zaustavite, pritisnite {0} +mode.picker.tooltip=Odaberi na\u010din rada +mode.picker.deprecated=zastarjelo +model.picker.tooltip=Odaberi model +model.picker.recommended=Preporu\u010deno +model.picker.favorites=Omiljeni +model.picker.search=Pretra\u017ei modele +model.picker.no.matches=Nema odgovaraju\u0107ih modela +model.picker.favorite.add=Dodaj u omiljene +model.picker.favorite.remove=Ukloni iz omiljenih +model.picker.free=Besplatno +model.picker.reset=Vrati model na zadano +reasoning.picker.tooltip=Odaberi razinu rezoniranja + +history.tab.local=Lokalno +history.tab.cloud=Oblak +history.back=Nazad +history.search.placeholder=Pretra\u017ei sesije +history.empty=Nema sesija +history.loading=U\u010ditavanje\u2026 +history.untitled=Bez naslova +history.delete.text=Obri\u0161i +history.delete.confirm.title=Obrisati sesiju? +history.delete.confirm.message=Obrisati "{0}" iz lokalne historije? +history.delete.confirm.message.multiple=Obrisati {0} sesija iz lokalne historije? +history.rename.title=Preimenuj sesiju +history.rename.prompt=Novi naziv sesije: +history.cloud.load.more=U\u010ditaj vi\u0161e +history.cloud.repo.only=Samo ovaj repozitorij +history.group.today=Danas +history.group.yesterday=Ju\u010der +history.group.week=Ove sedmice +history.group.month=Ovog mjeseca +history.group.older=Starije +history.time.moments=Upravo sada +history.time.minutes=Prije {0} min +history.time.hours=Prije {0} h +history.time.days=Prije {0} d +history.time.months=Prije {0} mj +history.time.years=Prije {0} g +history.error.local=U\u010ditavanje lokalne historije neuspje\u0161no +history.error.cloud=U\u010ditavanje historije iz oblaka neuspje\u0161no +history.error.local.delete=Brisanje sesije neuspje\u0161no +history.error.local.rename=Preimenovanje sesije neuspje\u0161no +history.error.cloud.delete=Sesije iz oblaka jo\u0161 uvijek nije mogu\u0107e brisati + +action.Kilo.Settings.text=Postavke +action.Kilo.Settings.description=Postavke Kilo Code +action.Kilo.NewSession.text=Nova sesija +action.Kilo.NewSession.description=Pokrenite novu Kilo sesiju +action.Kilo.History.text=Historija +action.Kilo.History.description=Prika\u017ei historiju sesija +action.Kilo.SendPrompt.text=Po\u0161alji upit +action.Kilo.SendPrompt.description=Po\u0161alji trenutni Kilo upit +action.Kilo.StopSession.text=Zaustavi sesiju +action.Kilo.StopSession.description=Zaustavi trenutnu Kilo sesiju +action.Kilo.SettingsGroup.text=Postavke +action.Kilo.SettingsGroup.description=Postavke Kilo Code +action.Kilo.Restart.text=Ponovo pokrenite Kilo +action.Kilo.Restart.description=Ugasite i ponovo pokrenite CLI proces +action.Kilo.Reinstall.text=Ponovo instalirajte Kilo +action.Kilo.Reinstall.description=Ponovo raspakirajte CLI binarnu datoteku i ponovo pokrenite +action.Kilo.Session.Open.text=Otvori +action.Kilo.Session.Open.description=Otvorite odabranu sesiju +action.Kilo.Session.Rename.text=Preimenuj +action.Kilo.Session.Rename.description=Preimenujte odabranu sesiju +action.Kilo.Session.Delete.text=Obri\u0161i +action.Kilo.Session.Delete.description=Obri\u0161ite odabrane sesije +action.Kilo.History.ContextMenu.text=Akcije historije diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_da.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_da.properties new file mode 100644 index 00000000000..7ef0ebf9b81 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_da.properties @@ -0,0 +1,139 @@ +session.connection.connecting=Indl\u00e6ser\u2026 +session.connection.error.app=Forbindelsesfejl +session.connection.error.workspace=Fejl ved indl\u00e6sning af arbejdsomr\u00e5de +session.connection.error.unknown=Ukendt fejl +session.connection.retry=Pr\u00f8v igen +session.connection.warning.config=Konfigurationsadvarsler + +session.empty.welcome=Kilo Code er en AI-kodningsassistent. Bed den om at bygge funktioner, rette fejl eller forklare din kodebase. +session.empty.loading=Indl\u00e6ser\u2026 +session.empty.recent=SENESTE +session.showHistory=Vis historik +session.scroll.bottom=Rul til bunden +session.tab.new=Ny session +session.tab.untitled=Unavngivet session + +session.permission.title=Tilladelsesanmodning +session.permission.meta=V\u00e6rkt\u00f8j: {0} \u2022 M\u00f8nstre: {1} +session.permission.allow=Tillad +session.permission.deny=Afvis +session.question.dismiss=Luk + +session.status.considering=Overvejer n\u00e6ste skridt\u2026 +session.status.thinking=T\u00e6nker\u2026 +session.status.writing=Skriver svar\u2026 +session.status.delegating=Delegerer arbejde\u2026 +session.status.planning=Planlagger\u2026 +session.status.gathering=Indsamler kontekst\u2026 +session.status.searching.codebase=S\u00f8ger i kodebasen\u2026 +session.status.searching.web=S\u00f8ger p\u00e5 nettet\u2026 +session.status.editing=Foretager redigeringer\u2026 +session.status.commands=K\u00f8rer kommandoer\u2026 + +session.part.reasoning=R\u00e6sonnering +session.part.compaction=kontekst komprimeret +session.part.tool.copy=Kopi\u00e9r +session.part.tool.error=Fejl +session.part.tool.pending=Afventer +session.part.tool.read=L\u00e6s +session.part.tool.running=K\u00f8rer +session.part.tool.shell=Shell +session.part.tool.truncated=Output afkortet i forh\u00e5ndsvisning. Fuldt output forbliver i sessionsdata. + +session.error.prompt=Prompt mislykkedes +session.error.compact=Sessionskomprimering mislykkedes +session.error.unknown=Ukendt fejl + +session.header.tokens=Tokens +session.header.tokens.description=Tokens brugt af det seneste assistentsvar: input, output, cache-skrivninger og cache-l\u00e6sninger. +session.header.input=ind {0} +session.header.output=ud {0} +session.header.cache.write=cache-skrivning {0} +session.header.cache.read=cache-l\u00e6sning {0} +session.header.compact=Komprimer session +session.header.compact.description=Opsummer sessionen for at reducere kontekstsst\u00f8rrelsen +session.header.expand=Vis sessionsmålinger +session.header.collapse=Skjul sessionsmålinger +session.header.todos.progress={0}/{1} opgaver f\u00e6rdige +session.header.todos.done=Alle {0} opgaver f\u00e6rdige +session.header.context.tooltip.percent={0} tokens ({1}% af konteksten) +session.header.context.tooltip.tokens={0} tokens +session.header.context.used={0} / {1} tokens brugt +session.header.context.reserved={0} reserveret til output +session.header.context.available={0} tilg\u00e6ngelige + +prompt.placeholder=Skriv en besked\u2026 +prompt.placeholder.with.shortcuts=Skriv en besked\u2026 ({0} for at sende, {1} for ny linje) +prompt.placeholder.with.send=Skriv en besked\u2026 ({0} for at sende) +prompt.placeholder.with.newline=Skriv en besked\u2026 ({0} for ny linje) +prompt.button.send=Send +prompt.button.stop=Stop +prompt.button.send.tooltip.stop=Tryk p\u00e5 {0} for at stoppe +mode.picker.tooltip=V\u00e6lg tilstand +mode.picker.deprecated=forældet +model.picker.tooltip=V\u00e6lg model +model.picker.recommended=Anbefalet +model.picker.favorites=Favoritter +model.picker.search=S\u00f8g efter modeller +model.picker.no.matches=Ingen matchende modeller +model.picker.favorite.add=F\u00f8j til favoritter +model.picker.favorite.remove=Fjern fra favoritter +model.picker.free=Gratis +model.picker.reset=Nulstil model til standard +reasoning.picker.tooltip=V\u00e6lg r\u00e6sonneringsindsats + +history.tab.local=Lokal +history.tab.cloud=Sky +history.back=Tilbage +history.search.placeholder=S\u00f8g i sessioner +history.empty=Ingen sessioner +history.loading=Indl\u00e6ser\u2026 +history.untitled=Unavngivet +history.delete.text=Slet +history.delete.confirm.title=Slet session? +history.delete.confirm.message=Slet "{0}" fra lokal historik? +history.delete.confirm.message.multiple=Slet {0} sessioner fra lokal historik? +history.rename.title=Omd\u00f8b session +history.rename.prompt=Nyt sessionsnavn: +history.cloud.load.more=Indl\u00e6s mere +history.cloud.repo.only=Kun dette arkiv +history.group.today=I dag +history.group.yesterday=I g\u00e5r +history.group.week=Denne uge +history.group.month=Denne m\u00e5ned +history.group.older=Ældre +history.time.moments=Lige nu +history.time.minutes={0} min siden +history.time.hours={0} t siden +history.time.days={0} d siden +history.time.months={0} mdr siden +history.time.years={0} \u00e5r siden +history.error.local=Kunne ikke indl\u00e6se lokal historik +history.error.cloud=Kunne ikke indl\u00e6se skyhistorik +history.error.local.delete=Kunne ikke slette session +history.error.local.rename=Kunne ikke omd\u00f8be session +history.error.cloud.delete=Skysessioner kan endnu ikke slettes + +action.Kilo.Settings.text=Indstillinger +action.Kilo.Settings.description=Kilo Code-indstillinger +action.Kilo.NewSession.text=Ny session +action.Kilo.NewSession.description=Start en ny Kilo-session +action.Kilo.History.text=Historik +action.Kilo.History.description=Vis sessionshistorik +action.Kilo.SendPrompt.text=Send prompt +action.Kilo.SendPrompt.description=Send den aktuelle Kilo-prompt +action.Kilo.StopSession.text=Stop session +action.Kilo.StopSession.description=Stop den aktuelle Kilo-session +action.Kilo.SettingsGroup.text=Indstillinger +action.Kilo.SettingsGroup.description=Kilo Code-indstillinger +action.Kilo.Restart.text=Genstart Kilo +action.Kilo.Restart.description=Afslut og genstart CLI-processen +action.Kilo.Reinstall.text=Geninstaller Kilo +action.Kilo.Reinstall.description=Udpak CLI-bin\u00e6rfilen igen og genstart +action.Kilo.Session.Open.text=\u00c5bn +action.Kilo.Session.Open.description=\u00c5bn den valgte session +action.Kilo.Session.Rename.text=Omd\u00f8b +action.Kilo.Session.Rename.description=Omd\u00f8b den valgte session +action.Kilo.Session.Delete.text=Slet +action.Kilo.Session.Delete.description=Slet den/de valgte session(er) +action.Kilo.History.ContextMenu.text=Historikhandlinger diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_de.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_de.properties new file mode 100644 index 00000000000..c69b1faa47d --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_de.properties @@ -0,0 +1,139 @@ +session.connection.connecting=Wird geladen\u2026 +session.connection.error.app=Verbindung fehlgeschlagen +session.connection.error.workspace=Workspace-Laden fehlgeschlagen +session.connection.error.unknown=Unbekannter Fehler +session.connection.retry=Erneut versuchen +session.connection.warning.config=Konfigurationswarnungen + +session.empty.welcome=Kilo Code ist ein KI-Coding-Assistent. Bitten Sie ihn, Funktionen zu erstellen, Fehler zu beheben oder Ihre Codebasis zu erkl\u00e4ren. +session.empty.loading=Wird geladen\u2026 +session.empty.recent=ZULETZT +session.showHistory=Verlauf anzeigen +session.scroll.bottom=Zum Ende scrollen +session.tab.new=Neue Sitzung +session.tab.untitled=Unbenannte Sitzung + +session.permission.title=Berechtigungsanfrage +session.permission.meta=Werkzeug: {0} \u2022 Muster: {1} +session.permission.allow=Erlauben +session.permission.deny=Ablehnen +session.question.dismiss=Schlie\u00dfen + +session.status.considering=N\u00e4chste Schritte abw\u00e4gen\u2026 +session.status.thinking=Nachdenken\u2026 +session.status.writing=Antwort schreiben\u2026 +session.status.delegating=Arbeit delegieren\u2026 +session.status.planning=Planen\u2026 +session.status.gathering=Kontext sammeln\u2026 +session.status.searching.codebase=Codebasis durchsuchen\u2026 +session.status.searching.web=Web durchsuchen\u2026 +session.status.editing=\u00c4nderungen vornehmen\u2026 +session.status.commands=Befehle ausf\u00fchren\u2026 + +session.part.reasoning=Denken +session.part.compaction=Kontext komprimiert +session.part.tool.copy=Kopieren +session.part.tool.error=Fehler +session.part.tool.pending=Ausstehend +session.part.tool.read=Lesen +session.part.tool.running=L\u00e4uft +session.part.tool.shell=Shell +session.part.tool.truncated=Ausgabe in der Vorschau gek\u00fcrzt. Vollst\u00e4ndige Ausgabe verbleibt in den Sitzungsdaten. + +session.error.prompt=Anfrage fehlgeschlagen +session.error.compact=Sitzungskomprimierung fehlgeschlagen +session.error.unknown=Unbekannter Fehler + +session.header.tokens=Token +session.header.tokens.description=Von der letzten Assistentenantwort verwendete Token: Eingabe, Ausgabe, Cache-Schreibvorg\u00e4nge und Cache-Lesevorg\u00e4nge. +session.header.input=ein {0} +session.header.output=aus {0} +session.header.cache.write=Cache-Schreiben {0} +session.header.cache.read=Cache-Lesen {0} +session.header.compact=Sitzung komprimieren +session.header.compact.description=Sitzung zusammenfassen, um die Kontextgr\u00f6\u00dfe zu reduzieren +session.header.expand=Sitzungsmetriken anzeigen +session.header.collapse=Sitzungsmetriken ausblenden +session.header.todos.progress={0}/{1} Aufgaben abgeschlossen +session.header.todos.done=Alle {0} Aufgaben abgeschlossen +session.header.context.tooltip.percent={0} Token ({1}% des Kontexts) +session.header.context.tooltip.tokens={0} Token +session.header.context.used={0} / {1} Token verwendet +session.header.context.reserved={0} f\u00fcr Ausgabe reserviert +session.header.context.available={0} verf\u00fcgbar + +prompt.placeholder=Nachricht eingeben\u2026 +prompt.placeholder.with.shortcuts=Nachricht eingeben\u2026 ({0} zum Senden, {1} f\u00fcr neue Zeile) +prompt.placeholder.with.send=Nachricht eingeben\u2026 ({0} zum Senden) +prompt.placeholder.with.newline=Nachricht eingeben\u2026 ({0} f\u00fcr neue Zeile) +prompt.button.send=Senden +prompt.button.stop=Stopp +prompt.button.send.tooltip.stop=Zum Stoppen dr\u00fccken Sie {0} +mode.picker.tooltip=Modus ausw\u00e4hlen +mode.picker.deprecated=veraltet +model.picker.tooltip=Modell ausw\u00e4hlen +model.picker.recommended=Empfohlen +model.picker.favorites=Favoriten +model.picker.search=Modelle suchen +model.picker.no.matches=Keine passenden Modelle +model.picker.favorite.add=Zu Favoriten hinzuf\u00fcgen +model.picker.favorite.remove=Aus Favoriten entfernen +model.picker.free=Kostenlos +model.picker.reset=Modell auf Standard zur\u00fccksetzen +reasoning.picker.tooltip=Denkanstrengung ausw\u00e4hlen + +history.tab.local=Lokal +history.tab.cloud=Cloud +history.back=Zur\u00fcck +history.search.placeholder=Sitzungen suchen +history.empty=Keine Sitzungen +history.loading=Wird geladen\u2026 +history.untitled=Unbenannt +history.delete.text=L\u00f6schen +history.delete.confirm.title=Sitzung l\u00f6schen? +history.delete.confirm.message="{0}" aus dem lokalen Verlauf l\u00f6schen? +history.delete.confirm.message.multiple={0} Sitzungen aus dem lokalen Verlauf l\u00f6schen? +history.rename.title=Sitzung umbenennen +history.rename.prompt=Neuer Sitzungsname: +history.cloud.load.more=Mehr laden +history.cloud.repo.only=Nur dieses Repository +history.group.today=Heute +history.group.yesterday=Gestern +history.group.week=Diese Woche +history.group.month=Dieser Monat +history.group.older=\u00c4lter +history.time.moments=Gerade eben +history.time.minutes={0} Min. zuvor +history.time.hours={0} Std. zuvor +history.time.days={0} Tage zuvor +history.time.months={0} Mon. zuvor +history.time.years={0} J. zuvor +history.error.local=Lokaler Verlauf konnte nicht geladen werden +history.error.cloud=Cloud-Verlauf konnte nicht geladen werden +history.error.local.delete=Sitzung konnte nicht gel\u00f6scht werden +history.error.local.rename=Sitzung konnte nicht umbenannt werden +history.error.cloud.delete=Cloud-Sitzungen k\u00f6nnen noch nicht gel\u00f6scht werden + +action.Kilo.Settings.text=Einstellungen +action.Kilo.Settings.description=Kilo Code Einstellungen +action.Kilo.NewSession.text=Neue Sitzung +action.Kilo.NewSession.description=Neue Kilo-Sitzung starten +action.Kilo.History.text=Verlauf +action.Kilo.History.description=Sitzungsverlauf anzeigen +action.Kilo.SendPrompt.text=Anfrage senden +action.Kilo.SendPrompt.description=Aktuelle Kilo-Anfrage senden +action.Kilo.StopSession.text=Sitzung stoppen +action.Kilo.StopSession.description=Aktuelle Kilo-Sitzung stoppen +action.Kilo.SettingsGroup.text=Einstellungen +action.Kilo.SettingsGroup.description=Kilo Code Einstellungen +action.Kilo.Restart.text=Kilo neu starten +action.Kilo.Restart.description=CLI-Prozess beenden und neu starten +action.Kilo.Reinstall.text=Kilo neu installieren +action.Kilo.Reinstall.description=CLI-Bin\u00e4rdatei neu extrahieren und neu starten +action.Kilo.Session.Open.text=\u00d6ffnen +action.Kilo.Session.Open.description=Ausgew\u00e4hlte Sitzung \u00f6ffnen +action.Kilo.Session.Rename.text=Umbenennen +action.Kilo.Session.Rename.description=Ausgew\u00e4hlte Sitzung umbenennen +action.Kilo.Session.Delete.text=L\u00f6schen +action.Kilo.Session.Delete.description=Ausgew\u00e4hlte Sitzung(en) l\u00f6schen +action.Kilo.History.ContextMenu.text=Verlaufsaktionen diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_es.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_es.properties new file mode 100644 index 00000000000..1109389fcff --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_es.properties @@ -0,0 +1,139 @@ +session.connection.connecting=Cargando\u2026 +session.connection.error.app=Error de conexi\u00f3n +session.connection.error.workspace=Error al cargar el espacio de trabajo +session.connection.error.unknown=Error desconocido +session.connection.retry=Reintentar +session.connection.warning.config=Advertencias de configuraci\u00f3n + +session.empty.welcome=Kilo Code es un asistente de codificaci\u00f3n con IA. Pida que construya funciones, corrija errores o explique su base de c\u00f3digo. +session.empty.loading=Cargando\u2026 +session.empty.recent=RECIENTE +session.showHistory=Mostrar historial +session.scroll.bottom=Desplazarse al final +session.tab.new=Nueva sesi\u00f3n +session.tab.untitled=Sesi\u00f3n sin t\u00edtulo + +session.permission.title=Solicitud de permiso +session.permission.meta=Herramienta: {0} \u2022 Patrones: {1} +session.permission.allow=Permitir +session.permission.deny=Denegar +session.question.dismiss=Descartar + +session.status.considering=Considerando los pr\u00f3ximos pasos\u2026 +session.status.thinking=Pensando\u2026 +session.status.writing=Escribiendo respuesta\u2026 +session.status.delegating=Delegando trabajo\u2026 +session.status.planning=Planificando\u2026 +session.status.gathering=Recopilando contexto\u2026 +session.status.searching.codebase=Buscando en la base de c\u00f3digo\u2026 +session.status.searching.web=Buscando en la web\u2026 +session.status.editing=Realizando ediciones\u2026 +session.status.commands=Ejecutando comandos\u2026 + +session.part.reasoning=Razonamiento +session.part.compaction=contexto compactado +session.part.tool.copy=Copiar +session.part.tool.error=Error +session.part.tool.pending=Pendiente +session.part.tool.read=Leer +session.part.tool.running=Ejecutando +session.part.tool.shell=Shell +session.part.tool.truncated=Salida truncada en la vista previa. La salida completa permanece en los datos de la sesi\u00f3n. + +session.error.prompt=Error en el mensaje +session.error.compact=Error al compactar la sesi\u00f3n +session.error.unknown=Error desconocido + +session.header.tokens=Tokens +session.header.tokens.description=Tokens utilizados por la \u00faltima respuesta del asistente: entrada, salida, escrituras en cach\u00e9 y lecturas en cach\u00e9. +session.header.input=entrada {0} +session.header.output=salida {0} +session.header.cache.write=escritura cach\u00e9 {0} +session.header.cache.read=lectura cach\u00e9 {0} +session.header.compact=Compactar sesi\u00f3n +session.header.compact.description=Resumir la sesi\u00f3n para reducir el tama\u00f1o del contexto +session.header.expand=Mostrar m\u00e9tricas de sesi\u00f3n +session.header.collapse=Ocultar m\u00e9tricas de sesi\u00f3n +session.header.todos.progress={0}/{1} tareas completadas +session.header.todos.done=Todas las {0} tareas completadas +session.header.context.tooltip.percent={0} tokens ({1}% del contexto) +session.header.context.tooltip.tokens={0} tokens +session.header.context.used={0} / {1} tokens utilizados +session.header.context.reserved={0} reservados para la salida +session.header.context.available={0} disponibles + +prompt.placeholder=Escribe un mensaje\u2026 +prompt.placeholder.with.shortcuts=Escribe un mensaje\u2026 ({0} para enviar, {1} para nueva l\u00ednea) +prompt.placeholder.with.send=Escribe un mensaje\u2026 ({0} para enviar) +prompt.placeholder.with.newline=Escribe un mensaje\u2026 ({0} para nueva l\u00ednea) +prompt.button.send=Enviar +prompt.button.stop=Detener +prompt.button.send.tooltip.stop=Para detener, presiona {0} +mode.picker.tooltip=Seleccionar modo +mode.picker.deprecated=obsoleto +model.picker.tooltip=Seleccionar modelo +model.picker.recommended=Recomendado +model.picker.favorites=Favoritos +model.picker.search=Buscar modelos +model.picker.no.matches=No hay modelos coincidentes +model.picker.favorite.add=A\u00f1adir a favoritos +model.picker.favorite.remove=Eliminar de favoritos +model.picker.free=Gratis +model.picker.reset=Restablecer modelo a predeterminado +reasoning.picker.tooltip=Seleccionar esfuerzo de razonamiento + +history.tab.local=Local +history.tab.cloud=Nube +history.back=Atr\u00e1s +history.search.placeholder=Buscar sesiones +history.empty=Sin sesiones +history.loading=Cargando\u2026 +history.untitled=Sin t\u00edtulo +history.delete.text=Eliminar +history.delete.confirm.title=\u00bfEliminar sesi\u00f3n? +history.delete.confirm.message=\u00bfEliminar "{0}" del historial local? +history.delete.confirm.message.multiple=\u00bfEliminar {0} sesiones del historial local? +history.rename.title=Renombrar sesi\u00f3n +history.rename.prompt=Nuevo nombre de sesi\u00f3n: +history.cloud.load.more=Cargar m\u00e1s +history.cloud.repo.only=Solo este repositorio +history.group.today=Hoy +history.group.yesterday=Ayer +history.group.week=Esta semana +history.group.month=Este mes +history.group.older=M\u00e1s antiguo +history.time.moments=Hace un momento +history.time.minutes=Hace {0} min +history.time.hours=Hace {0} h +history.time.days=Hace {0} d +history.time.months=Hace {0} mes(es) +history.time.years=Hace {0} a\u00f1o(s) +history.error.local=Error al cargar el historial local +history.error.cloud=Error al cargar el historial en la nube +history.error.local.delete=Error al eliminar la sesi\u00f3n +history.error.local.rename=Error al renombrar la sesi\u00f3n +history.error.cloud.delete=Las sesiones en la nube no se pueden eliminar a\u00fan + +action.Kilo.Settings.text=Configuraci\u00f3n +action.Kilo.Settings.description=Configuraci\u00f3n de Kilo Code +action.Kilo.NewSession.text=Nueva sesi\u00f3n +action.Kilo.NewSession.description=Iniciar una nueva sesi\u00f3n de Kilo +action.Kilo.History.text=Historial +action.Kilo.History.description=Mostrar el historial de sesiones +action.Kilo.SendPrompt.text=Enviar mensaje +action.Kilo.SendPrompt.description=Enviar el mensaje actual de Kilo +action.Kilo.StopSession.text=Detener sesi\u00f3n +action.Kilo.StopSession.description=Detener la sesi\u00f3n actual de Kilo +action.Kilo.SettingsGroup.text=Configuraci\u00f3n +action.Kilo.SettingsGroup.description=Configuraci\u00f3n de Kilo Code +action.Kilo.Restart.text=Reiniciar Kilo +action.Kilo.Restart.description=Terminar y reiniciar el proceso CLI +action.Kilo.Reinstall.text=Reinstalar Kilo +action.Kilo.Reinstall.description=Reextraer el binario CLI y reiniciar +action.Kilo.Session.Open.text=Abrir +action.Kilo.Session.Open.description=Abrir la sesi\u00f3n seleccionada +action.Kilo.Session.Rename.text=Renombrar +action.Kilo.Session.Rename.description=Renombrar la sesi\u00f3n seleccionada +action.Kilo.Session.Delete.text=Eliminar +action.Kilo.Session.Delete.description=Eliminar la(s) sesi\u00f3n(es) seleccionada(s) +action.Kilo.History.ContextMenu.text=Acciones del historial diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_fr.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_fr.properties new file mode 100644 index 00000000000..ded2c4b670b --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_fr.properties @@ -0,0 +1,139 @@ +session.connection.connecting=Chargement\u2026 +session.connection.error.app=\u00c9chec de la connexion +session.connection.error.workspace=\u00c9chec du chargement de l'espace de travail +session.connection.error.unknown=Erreur inconnue +session.connection.retry=R\u00e9essayer +session.connection.warning.config=Avertissements de configuration + +session.empty.welcome=Kilo Code est un assistant de codage IA. Demandez-lui de cr\u00e9er des fonctionnalit\u00e9s, corriger des bugs ou expliquer votre base de code. +session.empty.loading=Chargement\u2026 +session.empty.recent=R\u00c9CENT +session.showHistory=Afficher l'historique +session.scroll.bottom=Faire d\u00e9filer vers le bas +session.tab.new=Nouvelle session +session.tab.untitled=Session sans titre + +session.permission.title=Demande de permission +session.permission.meta=Outil\u00a0: {0} \u2022 Mod\u00e8les\u00a0: {1} +session.permission.allow=Autoriser +session.permission.deny=Refuser +session.question.dismiss=Ignorer + +session.status.considering=Consid\u00e9ration des prochaines \u00e9tapes\u2026 +session.status.thinking=R\u00e9flexion\u2026 +session.status.writing=R\u00e9daction de la r\u00e9ponse\u2026 +session.status.delegating=D\u00e9l\u00e9gation du travail\u2026 +session.status.planning=Planification\u2026 +session.status.gathering=Collecte du contexte\u2026 +session.status.searching.codebase=Recherche dans la base de code\u2026 +session.status.searching.web=Recherche sur le web\u2026 +session.status.editing=Modifications en cours\u2026 +session.status.commands=Ex\u00e9cution des commandes\u2026 + +session.part.reasoning=Raisonnement +session.part.compaction=contexte compact\u00e9 +session.part.tool.copy=Copier +session.part.tool.error=Erreur +session.part.tool.pending=En attente +session.part.tool.read=Lire +session.part.tool.running=En cours +session.part.tool.shell=Shell +session.part.tool.truncated=Sortie tronqu\u00e9e dans l'aper\u00e7u. La sortie compl\u00e8te reste dans les donn\u00e9es de session. + +session.error.prompt=\u00c9chec de l'invite +session.error.compact=\u00c9chec de la compaction de session +session.error.unknown=Erreur inconnue + +session.header.tokens=Tokens +session.header.tokens.description=Tokens utilis\u00e9s par la derni\u00e8re r\u00e9ponse de l'assistant\u00a0: entr\u00e9e, sortie, \u00e9critures en cache et lectures en cache. +session.header.input=entr\u00e9e {0} +session.header.output=sortie {0} +session.header.cache.write=\u00e9criture cache {0} +session.header.cache.read=lecture cache {0} +session.header.compact=Compacter la session +session.header.compact.description=R\u00e9sumer la session pour r\u00e9duire la taille du contexte +session.header.expand=Afficher les m\u00e9triques de session +session.header.collapse=Masquer les m\u00e9triques de session +session.header.todos.progress={0}/{1} t\u00e2ches termin\u00e9es +session.header.todos.done=Toutes les {0} t\u00e2ches termin\u00e9es +session.header.context.tooltip.percent={0} tokens ({1}\u00a0% du contexte) +session.header.context.tooltip.tokens={0} tokens +session.header.context.used={0} / {1} tokens utilis\u00e9s +session.header.context.reserved={0} r\u00e9serv\u00e9s pour la sortie +session.header.context.available={0} disponibles + +prompt.placeholder=Saisir un message\u2026 +prompt.placeholder.with.shortcuts=Saisir un message\u2026 ({0} pour envoyer, {1} pour nouvelle ligne) +prompt.placeholder.with.send=Saisir un message\u2026 ({0} pour envoyer) +prompt.placeholder.with.newline=Saisir un message\u2026 ({0} pour nouvelle ligne) +prompt.button.send=Envoyer +prompt.button.stop=Arr\u00eater +prompt.button.send.tooltip.stop=Pour arr\u00eater, appuyez sur {0} +mode.picker.tooltip=S\u00e9lectionner le mode +mode.picker.deprecated=obsol\u00e8te +model.picker.tooltip=S\u00e9lectionner le mod\u00e8le +model.picker.recommended=Recommand\u00e9 +model.picker.favorites=Favoris +model.picker.search=Rechercher des mod\u00e8les +model.picker.no.matches=Aucun mod\u00e8le correspondant +model.picker.favorite.add=Ajouter aux favoris +model.picker.favorite.remove=Retirer des favoris +model.picker.free=Gratuit +model.picker.reset=R\u00e9initialiser le mod\u00e8le par d\u00e9faut +reasoning.picker.tooltip=S\u00e9lectionner l'effort de raisonnement + +history.tab.local=Local +history.tab.cloud=Cloud +history.back=Retour +history.search.placeholder=Rechercher des sessions +history.empty=Aucune session +history.loading=Chargement\u2026 +history.untitled=Sans titre +history.delete.text=Supprimer +history.delete.confirm.title=Supprimer la session\u00a0? +history.delete.confirm.message=Supprimer \u00ab\u00a0{0}\u00a0\u00bb de l'historique local\u00a0? +history.delete.confirm.message.multiple=Supprimer {0} sessions de l'historique local\u00a0? +history.rename.title=Renommer la session +history.rename.prompt=Nouveau nom de session\u00a0: +history.cloud.load.more=Charger plus +history.cloud.repo.only=Ce d\u00e9p\u00f4t uniquement +history.group.today=Aujourd'hui +history.group.yesterday=Hier +history.group.week=Cette semaine +history.group.month=Ce mois +history.group.older=Plus ancien +history.time.moments=\u00c0 l'instant +history.time.minutes=Il y a {0} min +history.time.hours=Il y a {0}\u00a0h +history.time.days=Il y a {0}\u00a0j +history.time.months=Il y a {0} mois +history.time.years=Il y a {0} an(s) +history.error.local=\u00c9chec du chargement de l'historique local +history.error.cloud=\u00c9chec du chargement de l'historique cloud +history.error.local.delete=\u00c9chec de la suppression de la session +history.error.local.rename=\u00c9chec du renommage de la session +history.error.cloud.delete=Les sessions cloud ne peuvent pas encore \u00eatre supprim\u00e9es + +action.Kilo.Settings.text=Param\u00e8tres +action.Kilo.Settings.description=Param\u00e8tres de Kilo Code +action.Kilo.NewSession.text=Nouvelle session +action.Kilo.NewSession.description=D\u00e9marrer une nouvelle session Kilo +action.Kilo.History.text=Historique +action.Kilo.History.description=Afficher l'historique des sessions +action.Kilo.SendPrompt.text=Envoyer l'invite +action.Kilo.SendPrompt.description=Envoyer l'invite Kilo actuelle +action.Kilo.StopSession.text=Arr\u00eater la session +action.Kilo.StopSession.description=Arr\u00eater la session Kilo actuelle +action.Kilo.SettingsGroup.text=Param\u00e8tres +action.Kilo.SettingsGroup.description=Param\u00e8tres de Kilo Code +action.Kilo.Restart.text=Red\u00e9marrer Kilo +action.Kilo.Restart.description=Tuer et red\u00e9marrer le processus CLI +action.Kilo.Reinstall.text=R\u00e9installer Kilo +action.Kilo.Reinstall.description=R\u00e9extraire le binaire CLI et red\u00e9marrer +action.Kilo.Session.Open.text=Ouvrir +action.Kilo.Session.Open.description=Ouvrir la session s\u00e9lectionn\u00e9e +action.Kilo.Session.Rename.text=Renommer +action.Kilo.Session.Rename.description=Renommer la session s\u00e9lectionn\u00e9e +action.Kilo.Session.Delete.text=Supprimer +action.Kilo.Session.Delete.description=Supprimer la ou les sessions s\u00e9lectionn\u00e9es +action.Kilo.History.ContextMenu.text=Actions d'historique diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ja.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ja.properties new file mode 100644 index 00000000000..00dd8a376b9 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ja.properties @@ -0,0 +1,139 @@ +session.connection.connecting=\u8aad\u307f\u8fbc\u307f\u4e2d\u2026 +session.connection.error.app=\u63a5\u7d9a\u306b\u5931\u6557\u3057\u307e\u3057\u305f +session.connection.error.workspace=\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f +session.connection.error.unknown=\u4e0d\u660e\u306a\u30a8\u30e9\u30fc +session.connection.retry=\u518d\u8a66\u884c +session.connection.warning.config=\u8a2d\u5b9a\u306e\u8b66\u544a + +session.empty.welcome=Kilo Code\u306fAI\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a2\u30b7\u30b9\u30bf\u30f3\u30c8\u3067\u3059\u3002\u6a5f\u80fd\u306e\u4f5c\u6210\u3001\u30d0\u30b0\u306e\u4fee\u6b63\u3001\u307e\u305f\u306f\u30b3\u30fc\u30c9\u30d9\u30fc\u30b9\u306e\u8aac\u660e\u3092\u4f9d\u983c\u3067\u304d\u307e\u3059\u3002 +session.empty.loading=\u8aad\u307f\u8fbc\u307f\u4e2d\u2026 +session.empty.recent=\u6700\u8fd1 +session.showHistory=\u5c65\u6b74\u3092\u8868\u793a +session.scroll.bottom=\u4e00\u756a\u4e0b\u306b\u30b9\u30af\u30ed\u30fc\u30eb +session.tab.new=\u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3 +session.tab.untitled=\u540d\u524d\u306a\u3057\u306e\u30bb\u30c3\u30b7\u30e7\u30f3 + +session.permission.title=\u6a29\u9650\u30ea\u30af\u30a8\u30b9\u30c8 +session.permission.meta=\u30c4\u30fc\u30eb\uff1a{0} \u2022 \u30d1\u30bf\u30fc\u30f3\uff1a{1} +session.permission.allow=\u8a31\u53ef +session.permission.deny=\u62d2\u5426 +session.question.dismiss=\u9589\u3058\u308b + +session.status.considering=\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3092\u691c\u8a0e\u4e2d\u2026 +session.status.thinking=\u8003\u3048\u4e2d\u2026 +session.status.writing=\u56de\u7b54\u3092\u4f5c\u6210\u4e2d\u2026 +session.status.delegating=\u4f5c\u696d\u3092\u59d4\u4efb\u4e2d\u2026 +session.status.planning=\u8a08\u753b\u4e2d\u2026 +session.status.gathering=\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u3092\u53ce\u96c6\u4e2d\u2026 +session.status.searching.codebase=\u30b3\u30fc\u30c9\u30d9\u30fc\u30b9\u3092\u691c\u7d22\u4e2d\u2026 +session.status.searching.web=\u30a6\u30a7\u30d6\u3092\u691c\u7d22\u4e2d\u2026 +session.status.editing=\u7de8\u96c6\u4e2d\u2026 +session.status.commands=\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u4e2d\u2026 + +session.part.reasoning=\u63a8\u8ad6 +session.part.compaction=\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u5727\u7e2e\u6e08\u307f +session.part.tool.copy=\u30b3\u30d4\u30fc +session.part.tool.error=\u30a8\u30e9\u30fc +session.part.tool.pending=\u4fdd\u7559\u4e2d +session.part.tool.read=\u8aad\u307f\u53d6\u308a +session.part.tool.running=\u5b9f\u884c\u4e2d +session.part.tool.shell=\u30b7\u30a7\u30eb +session.part.tool.truncated=\u30d7\u30ec\u30d3\u30e5\u30fc\u3067\u306f\u51fa\u529b\u304c\u5207\u308a\u8a70\u3081\u3089\u308c\u3066\u3044\u307e\u3059\u3002\u5b8c\u5168\u306a\u51fa\u529b\u306f\u30bb\u30c3\u30b7\u30e7\u30f3\u30c7\u30fc\u30bf\u306b\u6b8b\u3063\u3066\u3044\u307e\u3059\u3002 + +session.error.prompt=\u30d7\u30ed\u30f3\u30d7\u30c8\u304c\u5931\u6557\u3057\u307e\u3057\u305f +session.error.compact=\u30bb\u30c3\u30b7\u30e7\u30f3\u5727\u7e2e\u304c\u5931\u6557\u3057\u307e\u3057\u305f +session.error.unknown=\u4e0d\u660e\u306a\u30a8\u30e9\u30fc + +session.header.tokens=\u30c8\u30fc\u30af\u30f3 +session.header.tokens.description=\u6700\u65b0\u306e\u30a2\u30b7\u30b9\u30bf\u30f3\u30c8\u306e\u56de\u7b54\u3067\u4f7f\u7528\u3055\u308c\u305f\u30c8\u30fc\u30af\u30f3\uff1a\u5165\u529b\u3001\u51fa\u529b\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u66f8\u304d\u8fbc\u307f\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u8aad\u307f\u53d6\u308a\u3002 +session.header.input=\u5165\u529b {0} +session.header.output=\u51fa\u529b {0} +session.header.cache.write=\u30ad\u30e3\u30c3\u30b7\u30e5\u66f8\u304d\u8fbc\u307f {0} +session.header.cache.read=\u30ad\u30e3\u30c3\u30b7\u30e5\u8aad\u307f\u53d6\u308a {0} +session.header.compact=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u5727\u7e2e +session.header.compact.description=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u8981\u7d04\u3057\u3066\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u30b5\u30a4\u30ba\u3092\u524a\u6e1b +session.header.expand=\u30bb\u30c3\u30b7\u30e7\u30f3\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u8868\u793a +session.header.collapse=\u30bb\u30c3\u30b7\u30e7\u30f3\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u975e\u8868\u793a +session.header.todos.progress={0}/{1}\u500b\u306e\u30bf\u30b9\u30af\u5b8c\u4e86 +session.header.todos.done=\u5168{0}\u500b\u306e\u30bf\u30b9\u30af\u5b8c\u4e86 +session.header.context.tooltip.percent={0}\u30c8\u30fc\u30af\u30f3\uff08\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e{1}%\uff09 +session.header.context.tooltip.tokens={0}\u30c8\u30fc\u30af\u30f3 +session.header.context.used={0} / {1}\u30c8\u30fc\u30af\u30f3\u4f7f\u7528\u4e2d +session.header.context.reserved={0}\u306f\u51fa\u529b\u7528\u306b\u4e88\u7d04\u6e08\u307f +session.header.context.available={0}\u5229\u7528\u53ef\u80fd + +prompt.placeholder=\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u2026 +prompt.placeholder.with.shortcuts=\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u2026\uff08{0}\u3067\u9001\u4fe1\u3001{1}\u3067\u6539\u884c\uff09 +prompt.placeholder.with.send=\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u2026\uff08{0}\u3067\u9001\u4fe1\uff09 +prompt.placeholder.with.newline=\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u2026\uff08{0}\u3067\u6539\u884c\uff09 +prompt.button.send=\u9001\u4fe1 +prompt.button.stop=\u505c\u6b62 +prompt.button.send.tooltip.stop=\u505c\u6b62\u3059\u308b\u306b\u306f{0}\u3092\u62bc\u3057\u3066\u304f\u3060\u3055\u3044 +mode.picker.tooltip=\u30e2\u30fc\u30c9\u3092\u9078\u629e +mode.picker.deprecated=\u975e\u63a8\u5968 +model.picker.tooltip=\u30e2\u30c7\u30eb\u3092\u9078\u629e +model.picker.recommended=\u304a\u3059\u3059\u3081 +model.picker.favorites=\u304a\u6c17\u306b\u5165\u308a +model.picker.search=\u30e2\u30c7\u30eb\u3092\u691c\u7d22 +model.picker.no.matches=\u4e00\u81f4\u3059\u308b\u30e2\u30c7\u30eb\u306a\u3057 +model.picker.favorite.add=\u304a\u6c17\u306b\u5165\u308a\u306b\u8ffd\u52a0 +model.picker.favorite.remove=\u304a\u6c17\u306b\u5165\u308a\u304b\u3089\u524a\u9664 +model.picker.free=\u7121\u6599 +model.picker.reset=\u30e2\u30c7\u30eb\u3092\u30c7\u30d5\u30a9\u30eb\u30c8\u306b\u30ea\u30bb\u30c3\u30c8 +reasoning.picker.tooltip=\u63a8\u8ad6\u52aa\u529b\u3092\u9078\u629e + +history.tab.local=\u30ed\u30fc\u30ab\u30eb +history.tab.cloud=\u30af\u30e9\u30a6\u30c9 +history.back=\u623b\u308b +history.search.placeholder=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u691c\u7d22 +history.empty=\u30bb\u30c3\u30b7\u30e7\u30f3\u306a\u3057 +history.loading=\u8aad\u307f\u8fbc\u307f\u4e2d\u2026 +history.untitled=\u540d\u524d\u306a\u3057 +history.delete.text=\u524a\u9664 +history.delete.confirm.title=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f +history.delete.confirm.message=\u300c{0}\u300d\u3092\u30ed\u30fc\u30ab\u30eb\u5c65\u6b74\u304b\u3089\u524a\u9664\u3057\u307e\u3059\u304b\uff1f +history.delete.confirm.message.multiple={0}\u500b\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30ab\u30eb\u5c65\u6b74\u304b\u3089\u524a\u9664\u3057\u307e\u3059\u304b\uff1f +history.rename.title=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u5909\u540d +history.rename.prompt=\u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3\u540d\uff1a +history.cloud.load.more=\u3055\u3089\u306b\u8aad\u307f\u8fbc\u3080 +history.cloud.repo.only=\u3053\u306e\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u307f +history.group.today=\u4eca\u65e5 +history.group.yesterday=\u6628\u65e5 +history.group.week=\u4eca\u9031 +history.group.month=\u4eca\u6708 +history.group.older=\u3055\u3089\u306b\u53e4\u3044 +history.time.moments=\u305f\u3063\u305f\u4eca +history.time.minutes={0}\u5206\u524d +history.time.hours={0}\u6642\u9593\u524d +history.time.days={0}\u65e5\u524d +history.time.months={0}\u304b\u6708\u524d +history.time.years={0}\u5e74\u524d +history.error.local=\u30ed\u30fc\u30ab\u30eb\u5c65\u6b74\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f +history.error.cloud=\u30af\u30e9\u30a6\u30c9\u5c65\u6b74\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f +history.error.local.delete=\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u524a\u9664\u306b\u5931\u6557\u3057\u307e\u3057\u305f +history.error.local.rename=\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u5909\u540d\u306b\u5931\u6557\u3057\u307e\u3057\u305f +history.error.cloud.delete=\u30af\u30e9\u30a6\u30c9\u30bb\u30c3\u30b7\u30e7\u30f3\u306f\u307e\u3060\u524a\u9664\u3067\u304d\u307e\u305b\u3093 + +action.Kilo.Settings.text=\u8a2d\u5b9a +action.Kilo.Settings.description=Kilo Code\u306e\u8a2d\u5b9a +action.Kilo.NewSession.text=\u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3 +action.Kilo.NewSession.description=\u65b0\u3057\u3044Kilo\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u958b\u59cb +action.Kilo.History.text=\u5c65\u6b74 +action.Kilo.History.description=\u30bb\u30c3\u30b7\u30e7\u30f3\u5c65\u6b74\u3092\u8868\u793a +action.Kilo.SendPrompt.text=\u30d7\u30ed\u30f3\u30d7\u30c8\u3092\u9001\u4fe1 +action.Kilo.SendPrompt.description=\u73fe\u5728\u306eKilo\u30d7\u30ed\u30f3\u30d7\u30c8\u3092\u9001\u4fe1 +action.Kilo.StopSession.text=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u505c\u6b62 +action.Kilo.StopSession.description=\u73fe\u5728\u306eKilo\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u505c\u6b62 +action.Kilo.SettingsGroup.text=\u8a2d\u5b9a +action.Kilo.SettingsGroup.description=Kilo Code\u306e\u8a2d\u5b9a +action.Kilo.Restart.text=Kilo\u3092\u518d\u8d77\u52d5 +action.Kilo.Restart.description=CLI\u30d7\u30ed\u30bb\u30b9\u3092\u7d42\u4e86\u3057\u3066\u518d\u8d77\u52d5 +action.Kilo.Reinstall.text=Kilo\u3092\u518d\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb +action.Kilo.Reinstall.description=CLI\u30d0\u30a4\u30ca\u30ea\u3092\u518d\u5c55\u958b\u3057\u3066\u518d\u8d77\u52d5 +action.Kilo.Session.Open.text=\u958b\u304f +action.Kilo.Session.Open.description=\u9078\u629e\u3057\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u958b\u304f +action.Kilo.Session.Rename.text=\u5909\u540d +action.Kilo.Session.Rename.description=\u9078\u629e\u3057\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u5909\u540d +action.Kilo.Session.Delete.text=\u524a\u9664 +action.Kilo.Session.Delete.description=\u9078\u629e\u3057\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u524a\u9664 +action.Kilo.History.ContextMenu.text=\u5c65\u6b74\u30a2\u30af\u30b7\u30e7\u30f3 diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ko.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ko.properties new file mode 100644 index 00000000000..5a56718ff1c --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ko.properties @@ -0,0 +1,139 @@ +session.connection.connecting=\ub85c\ub529 \uc911\u2026 +session.connection.error.app=\uc5f0\uacb0 \uc2e4\ud328 +session.connection.error.workspace=\uc6cc\ud06c\uc2a4\ud398\uc774\uc2a4 \ub85c\ub529 \uc2e4\ud328 +session.connection.error.unknown=\uc54c \uc218 \uc5c6\ub294 \uc624\ub958 +session.connection.retry=\ub2e4\uc2dc \uc2dc\ub3c4 +session.connection.warning.config=\uad6c\uc131 \uacbd\uace0 + +session.empty.welcome=Kilo Code\ub294 AI \ucf54\ub529 \uc5b4\uc2dc\uc2a4\ud134\ud2b8\uc785\ub2c8\ub2e4. \uae30\ub2a5 \uad6c\ucd95, \ubc84\uadf8 \uc218\uc815, \ucf54\ub4dc\ubca0\uc774\uc2a4 \uc124\uba85\uc744 \uc694\uccad\ud558\uc138\uc694. +session.empty.loading=\ub85c\ub529 \uc911\u2026 +session.empty.recent=\ucd5c\uadfc +session.showHistory=\uae30\ub85d \ubcf4\uae30 +session.scroll.bottom=\ub9e8 \uc544\ub798\ub85c \uc2a4\ud06c\ub864 +session.tab.new=\uc0c8 \uc138\uc158 +session.tab.untitled=\uc81c\ubaa9 \uc5c6\ub294 \uc138\uc158 + +session.permission.title=\uad8c\ud55c \uc694\uccad +session.permission.meta=\ub3c4\uad6c: {0} \u2022 \ud328\ud134: {1} +session.permission.allow=\ud5c8\uc6a9 +session.permission.deny=\uac70\ubd80 +session.question.dismiss=\ub2eb\uae30 + +session.status.considering=\ub2e4\uc74c \ub2e8\uacc4 \uace0\ub824 \uc911\u2026 +session.status.thinking=\uc0dd\uac01 \uc911\u2026 +session.status.writing=\uc751\ub2f5 \uc791\uc131 \uc911\u2026 +session.status.delegating=\uc791\uc5c5 \uc704\uc784 \uc911\u2026 +session.status.planning=\uacc4\ud68d \uc911\u2026 +session.status.gathering=\ucee8\ud14d\uc2a4\ud2b8 \uc218\uc9d1 \uc911\u2026 +session.status.searching.codebase=\ucf54\ub4dc\ubca0\uc774\uc2a4 \uac80\uc0c9 \uc911\u2026 +session.status.searching.web=\uc6f9 \uac80\uc0c9 \uc911\u2026 +session.status.editing=\ud3b8\uc9d1 \uc911\u2026 +session.status.commands=\uba85\ub839 \uc2e4\ud589 \uc911\u2026 + +session.part.reasoning=\ucd94\ub860 +session.part.compaction=\ucee8\ud14d\uc2a4\ud2b8 \uc555\ucd95\ub428 +session.part.tool.copy=\ubcf5\uc0ac +session.part.tool.error=\uc624\ub958 +session.part.tool.pending=\ub300\uae30 \uc911 +session.part.tool.read=\uc77d\uae30 +session.part.tool.running=\uc2e4\ud589 \uc911 +session.part.tool.shell=\uc178 +session.part.tool.truncated=\ubbf8\ub9ac\ubcf4\uae30\uc5d0\uc11c \ucd9c\ub825\uc774 \uc798\ub838\uc2b5\ub2c8\ub2e4. \uc804\uccb4 \ucd9c\ub825\uc740 \uc138\uc158 \ub370\uc774\ud130\uc5d0 \ub0a8\uc544 \uc788\uc2b5\ub2c8\ub2e4. + +session.error.prompt=\ud504\ub86c\ud504\ud2b8 \uc2e4\ud328 +session.error.compact=\uc138\uc158 \uc555\ucd95 \uc2e4\ud328 +session.error.unknown=\uc54c \uc218 \uc5c6\ub294 \uc624\ub958 + +session.header.tokens=\ud1a0\ud070 +session.header.tokens.description=\ub9c8\uc9c0\ub9c9 \uc5b4\uc2dc\uc2a4\ud134\ud2b8 \uc751\ub2f5\uc5d0\uc11c \uc0ac\uc6a9\ub41c \ud1a0\ud070: \uc785\ub825, \ucd9c\ub825, \uce90\uc2dc \uc4f0\uae30, \uce90\uc2dc \uc77d\uae30. +session.header.input=\uc785\ub825 {0} +session.header.output=\ucd9c\ub825 {0} +session.header.cache.write=\uce90\uc2dc \uc4f0\uae30 {0} +session.header.cache.read=\uce90\uc2dc \uc77d\uae30 {0} +session.header.compact=\uc138\uc158 \uc555\ucd95 +session.header.compact.description=\ucee8\ud14d\uc2a4\ud2b8 \ud06c\uae30\ub97c \uc904\uc774\uae30 \uc704\ud574 \uc138\uc158 \uc694\uc57d +session.header.expand=\uc138\uc158 \uba54\ud2b8\ub9ad \ud45c\uc2dc +session.header.collapse=\uc138\uc158 \uba54\ud2b8\ub9ad \uc228\uae30\uae30 +session.header.todos.progress={0}/{1} \ud560 \uc77c \uc644\ub8cc +session.header.todos.done=\ubaa8\ub4e0 {0}\uac1c \ud560 \uc77c \uc644\ub8cc +session.header.context.tooltip.percent={0} \ud1a0\ud070 (\ucee8\ud14d\uc2a4\ud2b8\uc758 {1}%) +session.header.context.tooltip.tokens={0} \ud1a0\ud070 +session.header.context.used={0} / {1} \ud1a0\ud070 \uc0ac\uc6a9 \uc911 +session.header.context.reserved={0} \ucd9c\ub825\uc6a9 \uc608\uc57d\ub428 +session.header.context.available={0} \uc0ac\uc6a9 \uac00\ub2a5 + +prompt.placeholder=\uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694\u2026 +prompt.placeholder.with.shortcuts=\uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694\u2026 ({0} \uc804\uc1a1, {1} \uc0c8 \uc904) +prompt.placeholder.with.send=\uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694\u2026 ({0} \uc804\uc1a1) +prompt.placeholder.with.newline=\uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694\u2026 ({0} \uc0c8 \uc904) +prompt.button.send=\uc804\uc1a1 +prompt.button.stop=\uc815\uc9c0 +prompt.button.send.tooltip.stop=\uc815\uc9c0\ud558\ub824\uba74 {0}\uc744 \ub204\ub974\uc138\uc694 +mode.picker.tooltip=\ubaa8\ub4dc \uc120\ud0dd +mode.picker.deprecated=\uc0ac\uc6a9 \uc911\ub2e8 +model.picker.tooltip=\ubaa8\ub378 \uc120\ud0dd +model.picker.recommended=\ucd94\ucc9c +model.picker.favorites=\uc990\uaca8\ucc3e\uae30 +model.picker.search=\ubaa8\ub378 \uac80\uc0c9 +model.picker.no.matches=\uc77c\uce58\ud558\ub294 \ubaa8\ub378 \uc5c6\uc74c +model.picker.favorite.add=\uc990\uaca8\ucc3e\uae30\uc5d0 \ucd94\uac00 +model.picker.favorite.remove=\uc990\uaca8\ucc3e\uae30\uc5d0\uc11c \uc81c\uac70 +model.picker.free=\ubb34\ub8cc +model.picker.reset=\ubaa8\ub378\uc744 \uae30\ubcf8\uac12\uc73c\ub85c \uc7ac\uc124\uc815 +reasoning.picker.tooltip=\ucd94\ub860 \ub178\ub825 \uc120\ud0dd + +history.tab.local=\ub85c\ucec8 +history.tab.cloud=\ud074\ub77c\uc6b0\ub4dc +history.back=\ub4a4\ub85c +history.search.placeholder=\uc138\uc158 \uac80\uc0c9 +history.empty=\uc138\uc158 \uc5c6\uc74c +history.loading=\ub85c\ub529 \uc911\u2026 +history.untitled=\uc81c\ubaa9 \uc5c6\uc74c +history.delete.text=\uc0ad\uc81c +history.delete.confirm.title=\uc138\uc158\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +history.delete.confirm.message=\ub85c\ucec8 \uae30\ub85d\uc5d0\uc11c "{0}"\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +history.delete.confirm.message.multiple=\ub85c\ucec8 \uae30\ub85d\uc5d0\uc11c {0}\uac1c\uc758 \uc138\uc158\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +history.rename.title=\uc138\uc158 \uc774\ub984 \ubc14\uafb8\uae30 +history.rename.prompt=\uc0c8 \uc138\uc158 \uc774\ub984: +history.cloud.load.more=\ub354 \ubd88\ub7ec\uc624\uae30 +history.cloud.repo.only=\uc774 \ub9ac\ud3ec\uc9c0\ud130\ub9ac\ub9cc +history.group.today=\uc624\ub298 +history.group.yesterday=\uc5b4\uc81c +history.group.week=\uc774\ubc88 \uc8fc +history.group.month=\uc774\ubc88 \ub2ec +history.group.older=\ub354 \uc624\ub798\ub41c +history.time.moments=\ubc29\uae08 +history.time.minutes={0}\ubd84 \uc804 +history.time.hours={0}\uc2dc\uac04 \uc804 +history.time.days={0}\uc77c \uc804 +history.time.months={0}\uac1c\uc6d4 \uc804 +history.time.years={0}\ub144 \uc804 +history.error.local=\ub85c\ucec8 \uae30\ub85d\uc744 \ub85c\ub4dc\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4 +history.error.cloud=\ud074\ub77c\uc6b0\ub4dc \uae30\ub85d\uc744 \ub85c\ub4dc\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4 +history.error.local.delete=\uc138\uc158\uc744 \uc0ad\uc81c\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4 +history.error.local.rename=\uc138\uc158\uc758 \uc774\ub984\uc744 \ubc14\uafb8\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4 +history.error.cloud.delete=\ud074\ub77c\uc6b0\ub4dc \uc138\uc158\uc740 \uc544\uc9c1 \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4 + +action.Kilo.Settings.text=\uc124\uc815 +action.Kilo.Settings.description=Kilo Code \uc124\uc815 +action.Kilo.NewSession.text=\uc0c8 \uc138\uc158 +action.Kilo.NewSession.description=\uc0c8 Kilo \uc138\uc158 \uc2dc\uc791 +action.Kilo.History.text=\uae30\ub85d +action.Kilo.History.description=\uc138\uc158 \uae30\ub85d \ud45c\uc2dc +action.Kilo.SendPrompt.text=\ud504\ub86c\ud504\ud2b8 \uc804\uc1a1 +action.Kilo.SendPrompt.description=\ud604\uc7ac Kilo \ud504\ub86c\ud504\ud2b8 \uc804\uc1a1 +action.Kilo.StopSession.text=\uc138\uc158 \uc815\uc9c0 +action.Kilo.StopSession.description=\ud604\uc7ac Kilo \uc138\uc158 \uc815\uc9c0 +action.Kilo.SettingsGroup.text=\uc124\uc815 +action.Kilo.SettingsGroup.description=Kilo Code \uc124\uc815 +action.Kilo.Restart.text=Kilo \uc7ac\uc2dc\uc791 +action.Kilo.Restart.description=CLI \ud504\ub85c\uc138\uc2a4 \uc885\ub8cc \ud6c4 \uc7ac\uc2dc\uc791 +action.Kilo.Reinstall.text=Kilo \uc7ac\uc124\uce58 +action.Kilo.Reinstall.description=CLI \ubc14\uc774\ub108\ub9ac \uc7ac\ucd94\ucd9c \ud6c4 \uc7ac\uc2dc\uc791 +action.Kilo.Session.Open.text=\uc5f4\uae30 +action.Kilo.Session.Open.description=\uc120\ud0dd\ud55c \uc138\uc158 \uc5f4\uae30 +action.Kilo.Session.Rename.text=\uc774\ub984 \ubc14\uafb8\uae30 +action.Kilo.Session.Rename.description=\uc120\ud0dd\ud55c \uc138\uc158 \uc774\ub984 \ubc14\uafb8\uae30 +action.Kilo.Session.Delete.text=\uc0ad\uc81c +action.Kilo.Session.Delete.description=\uc120\ud0dd\ud55c \uc138\uc158 \uc0ad\uc81c +action.Kilo.History.ContextMenu.text=\uae30\ub85d \uc791\uc5c5 diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_nl.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_nl.properties new file mode 100644 index 00000000000..5d1b1ee6fdf --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_nl.properties @@ -0,0 +1,139 @@ +session.connection.connecting=Laden\u2026 +session.connection.error.app=Verbinding mislukt +session.connection.error.workspace=Werkruimte laden mislukt +session.connection.error.unknown=Onbekende fout +session.connection.retry=Opnieuw proberen +session.connection.warning.config=Configuratiewaarschuwingen + +session.empty.welcome=Kilo Code is een AI-codeerassistent. Vraag het om functies te bouwen, bugs te repareren of uw codebase uit te leggen. +session.empty.loading=Laden\u2026 +session.empty.recent=RECENT +session.showHistory=Geschiedenis weergeven +session.scroll.bottom=Naar beneden scrollen +session.tab.new=Nieuwe sessie +session.tab.untitled=Naamloze sessie + +session.permission.title=Toestemmingsverzoek +session.permission.meta=Hulpmiddel: {0} \u2022 Patronen: {1} +session.permission.allow=Toestaan +session.permission.deny=Weigeren +session.question.dismiss=Sluiten + +session.status.considering=Volgende stappen overwegen\u2026 +session.status.thinking=Nadenken\u2026 +session.status.writing=Antwoord schrijven\u2026 +session.status.delegating=Werk delegeren\u2026 +session.status.planning=Plannen\u2026 +session.status.gathering=Context verzamelen\u2026 +session.status.searching.codebase=Codebase doorzoeken\u2026 +session.status.searching.web=Web doorzoeken\u2026 +session.status.editing=Bewerkingen uitvoeren\u2026 +session.status.commands=Opdrachten uitvoeren\u2026 + +session.part.reasoning=Redenering +session.part.compaction=context gecomprimeerd +session.part.tool.copy=Kopi\u00ebren +session.part.tool.error=Fout +session.part.tool.pending=In afwachting +session.part.tool.read=Lezen +session.part.tool.running=Actief +session.part.tool.shell=Shell +session.part.tool.truncated=Uitvoer ingekort in voorvertoning. Volledige uitvoer blijft beschikbaar in sessiegegevens. + +session.error.prompt=Prompt mislukt +session.error.compact=Sessiecomprimering mislukt +session.error.unknown=Onbekende fout + +session.header.tokens=Tokens +session.header.tokens.description=Tokens gebruikt door de laatste assistent-reactie: invoer, uitvoer, cache-schrijfacties en cache-leesacties. +session.header.input=in {0} +session.header.output=uit {0} +session.header.cache.write=cache schrijven {0} +session.header.cache.read=cache lezen {0} +session.header.compact=Sessie comprimeren +session.header.compact.description=Sessie samenvatten om de contextgrootte te verkleinen +session.header.expand=Sessiestatistieken weergeven +session.header.collapse=Sessiestatistieken verbergen +session.header.todos.progress={0}/{1} taken voltooid +session.header.todos.done=Alle {0} taken voltooid +session.header.context.tooltip.percent={0} tokens ({1}% van de context) +session.header.context.tooltip.tokens={0} tokens +session.header.context.used={0} / {1} tokens gebruikt +session.header.context.reserved={0} gereserveerd voor uitvoer +session.header.context.available={0} beschikbaar + +prompt.placeholder=Typ een bericht\u2026 +prompt.placeholder.with.shortcuts=Typ een bericht\u2026 ({0} om te verzenden, {1} voor nieuwe regel) +prompt.placeholder.with.send=Typ een bericht\u2026 ({0} om te verzenden) +prompt.placeholder.with.newline=Typ een bericht\u2026 ({0} voor nieuwe regel) +prompt.button.send=Verzenden +prompt.button.stop=Stoppen +prompt.button.send.tooltip.stop=Druk op {0} om te stoppen +mode.picker.tooltip=Modus selecteren +mode.picker.deprecated=verouderd +model.picker.tooltip=Model selecteren +model.picker.recommended=Aanbevolen +model.picker.favorites=Favorieten +model.picker.search=Modellen zoeken +model.picker.no.matches=Geen overeenkomende modellen +model.picker.favorite.add=Toevoegen aan favorieten +model.picker.favorite.remove=Verwijderen uit favorieten +model.picker.free=Gratis +model.picker.reset=Model terugzetten naar standaard +reasoning.picker.tooltip=Redeerniveau selecteren + +history.tab.local=Lokaal +history.tab.cloud=Cloud +history.back=Terug +history.search.placeholder=Sessies zoeken +history.empty=Geen sessies +history.loading=Laden\u2026 +history.untitled=Naamloos +history.delete.text=Verwijderen +history.delete.confirm.title=Sessie verwijderen? +history.delete.confirm.message="{0}" verwijderen uit lokale geschiedenis? +history.delete.confirm.message.multiple={0} sessies verwijderen uit lokale geschiedenis? +history.rename.title=Sessie hernoemen +history.rename.prompt=Nieuwe sessienaam: +history.cloud.load.more=Meer laden +history.cloud.repo.only=Alleen deze repository +history.group.today=Vandaag +history.group.yesterday=Gisteren +history.group.week=Deze week +history.group.month=Deze maand +history.group.older=Ouder +history.time.moments=Zojuist +history.time.minutes={0} min geleden +history.time.hours={0} u geleden +history.time.days={0} d geleden +history.time.months={0} mnd geleden +history.time.years={0} jr geleden +history.error.local=Laden van lokale geschiedenis mislukt +history.error.cloud=Laden van cloudgeschiedenis mislukt +history.error.local.delete=Verwijderen van sessie mislukt +history.error.local.rename=Hernoemen van sessie mislukt +history.error.cloud.delete=Cloudsessies kunnen nog niet worden verwijderd + +action.Kilo.Settings.text=Instellingen +action.Kilo.Settings.description=Kilo Code-instellingen +action.Kilo.NewSession.text=Nieuwe sessie +action.Kilo.NewSession.description=Een nieuwe Kilo-sessie starten +action.Kilo.History.text=Geschiedenis +action.Kilo.History.description=Sessiegeschiedenis weergeven +action.Kilo.SendPrompt.text=Prompt verzenden +action.Kilo.SendPrompt.description=Huidige Kilo-prompt verzenden +action.Kilo.StopSession.text=Sessie stoppen +action.Kilo.StopSession.description=Huidige Kilo-sessie stoppen +action.Kilo.SettingsGroup.text=Instellingen +action.Kilo.SettingsGroup.description=Kilo Code-instellingen +action.Kilo.Restart.text=Kilo herstarten +action.Kilo.Restart.description=CLI-proces be\u00ebindigen en herstarten +action.Kilo.Reinstall.text=Kilo herinstalleren +action.Kilo.Reinstall.description=CLI-binair opnieuw uitpakken en herstarten +action.Kilo.Session.Open.text=Openen +action.Kilo.Session.Open.description=Geselecteerde sessie openen +action.Kilo.Session.Rename.text=Hernoemen +action.Kilo.Session.Rename.description=Geselecteerde sessie hernoemen +action.Kilo.Session.Delete.text=Verwijderen +action.Kilo.Session.Delete.description=Geselecteerde sessie(s) verwijderen +action.Kilo.History.ContextMenu.text=Geschiedenisacties diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_no.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_no.properties new file mode 100644 index 00000000000..18c1d5bc99d --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_no.properties @@ -0,0 +1,139 @@ +session.connection.connecting=Laster\u2026 +session.connection.error.app=Tilkoblingsfeil +session.connection.error.workspace=Feil ved lasting av arbeidsomr\u00e5de +session.connection.error.unknown=Ukjent feil +session.connection.retry=Pr\u00f8v igjen +session.connection.warning.config=Konfigurasjonsadvarsler + +session.empty.welcome=Kilo Code er en AI-kodingsassistent. Be den om \u00e5 bygge funksjoner, fikse feil eller forklare kodebasen din. +session.empty.loading=Laster\u2026 +session.empty.recent=NYLIGE +session.showHistory=Vis historikk +session.scroll.bottom=Rull til bunnen +session.tab.new=Ny \u00f8kt +session.tab.untitled=Uten tittel + +session.permission.title=Tillatelsesforesp\u00f8rsel +session.permission.meta=Verkt\u00f8y: {0} \u2022 M\u00f8nstre: {1} +session.permission.allow=Tillat +session.permission.deny=Avsl\u00e5 +session.question.dismiss=Lukk + +session.status.considering=Vurderer neste steg\u2026 +session.status.thinking=Tenker\u2026 +session.status.writing=Skriver svar\u2026 +session.status.delegating=Delegerer arbeid\u2026 +session.status.planning=Planlegger\u2026 +session.status.gathering=Samler kontekst\u2026 +session.status.searching.codebase=S\u00f8ker i kodebasen\u2026 +session.status.searching.web=S\u00f8ker p\u00e5 nettet\u2026 +session.status.editing=Gj\u00f8r redigeringer\u2026 +session.status.commands=Kj\u00f8rer kommandoer\u2026 + +session.part.reasoning=Resonnering +session.part.compaction=kontekst komprimert +session.part.tool.copy=Kopier +session.part.tool.error=Feil +session.part.tool.pending=Venter +session.part.tool.read=Les +session.part.tool.running=Kj\u00f8rer +session.part.tool.shell=Shell +session.part.tool.truncated=Utdata avkortet i forh\u00e5ndsvisning. Fullstendig utdata finnes fortsatt i \u00f8ktdata. + +session.error.prompt=Foresp\u00f8rsel mislyktes +session.error.compact=Komprimer \u00f8kt mislyktes +session.error.unknown=Ukjent feil + +session.header.tokens=Tokens +session.header.tokens.description=Tokens brukt av siste assistentsvar: inndata, utdata, cache-skrivninger og cache-lesninger. +session.header.input=inn {0} +session.header.output=ut {0} +session.header.cache.write=cache-skriving {0} +session.header.cache.read=cache-lesing {0} +session.header.compact=Komprimer \u00f8kt +session.header.compact.description=Oppsummer \u00f8kten for \u00e5 redusere kontekstst\u00f8rrelsen +session.header.expand=Vis \u00f8ktberegninger +session.header.collapse=Skjul \u00f8ktberegninger +session.header.todos.progress={0}/{1} oppgaver fullf\u00f8rt +session.header.todos.done=Alle {0} oppgaver fullf\u00f8rt +session.header.context.tooltip.percent={0} tokens ({1}% av konteksten) +session.header.context.tooltip.tokens={0} tokens +session.header.context.used={0} / {1} tokens brukt +session.header.context.reserved={0} reservert for utdata +session.header.context.available={0} tilgjengelig + +prompt.placeholder=Skriv en melding\u2026 +prompt.placeholder.with.shortcuts=Skriv en melding\u2026 ({0} for \u00e5 sende, {1} for ny linje) +prompt.placeholder.with.send=Skriv en melding\u2026 ({0} for \u00e5 sende) +prompt.placeholder.with.newline=Skriv en melding\u2026 ({0} for ny linje) +prompt.button.send=Send +prompt.button.stop=Stopp +prompt.button.send.tooltip.stop=Trykk {0} for \u00e5 stoppe +mode.picker.tooltip=Velg modus +mode.picker.deprecated=utdatert +model.picker.tooltip=Velg modell +model.picker.recommended=Anbefalt +model.picker.favorites=Favoritter +model.picker.search=S\u00f8k etter modeller +model.picker.no.matches=Ingen samsvarende modeller +model.picker.favorite.add=Legg til favoritter +model.picker.favorite.remove=Fjern fra favoritter +model.picker.free=Gratis +model.picker.reset=Tilbakestill modell til standard +reasoning.picker.tooltip=Velg resonnementsniv\u00e5 + +history.tab.local=Lokal +history.tab.cloud=Sky +history.back=Tilbake +history.search.placeholder=S\u00f8k i \u00f8kter +history.empty=Ingen \u00f8kter +history.loading=Laster\u2026 +history.untitled=Uten tittel +history.delete.text=Slett +history.delete.confirm.title=Slette \u00f8kt? +history.delete.confirm.message=Slette "{0}" fra lokal historikk? +history.delete.confirm.message.multiple=Slette {0} \u00f8kter fra lokal historikk? +history.rename.title=Gi \u00f8kten nytt navn +history.rename.prompt=Nytt \u00f8ktnavn: +history.cloud.load.more=Last inn mer +history.cloud.repo.only=Bare dette depotet +history.group.today=I dag +history.group.yesterday=I g\u00e5r +history.group.week=Denne uken +history.group.month=Denne m\u00e5neden +history.group.older=Eldre +history.time.moments=Akkurat n\u00e5 +history.time.minutes={0} min siden +history.time.hours={0} t siden +history.time.days={0} d siden +history.time.months={0} mnd siden +history.time.years={0} \u00e5r siden +history.error.local=Kunne ikke laste lokal historikk +history.error.cloud=Kunne ikke laste sky-historikk +history.error.local.delete=Kunne ikke slette \u00f8kt +history.error.local.rename=Kunne ikke gi \u00f8kten nytt navn +history.error.cloud.delete=Sky-\u00f8kter kan ikke slettes enn\u00e5 + +action.Kilo.Settings.text=Innstillinger +action.Kilo.Settings.description=Kilo Code-innstillinger +action.Kilo.NewSession.text=Ny \u00f8kt +action.Kilo.NewSession.description=Start en ny Kilo-\u00f8kt +action.Kilo.History.text=Historikk +action.Kilo.History.description=Vis \u00f8kthistorikk +action.Kilo.SendPrompt.text=Send foresp\u00f8rsel +action.Kilo.SendPrompt.description=Send gjeldende Kilo-foresp\u00f8rsel +action.Kilo.StopSession.text=Stopp \u00f8kt +action.Kilo.StopSession.description=Stopp gjeldende Kilo-\u00f8kt +action.Kilo.SettingsGroup.text=Innstillinger +action.Kilo.SettingsGroup.description=Kilo Code-innstillinger +action.Kilo.Restart.text=Start Kilo p\u00e5 nytt +action.Kilo.Restart.description=Avslutt og start CLI-prosessen p\u00e5 nytt +action.Kilo.Reinstall.text=Installer Kilo p\u00e5 nytt +action.Kilo.Reinstall.description=Pakk ut CLI-bin\u00e6rfilen p\u00e5 nytt og start p\u00e5 nytt +action.Kilo.Session.Open.text=\u00c5pne +action.Kilo.Session.Open.description=\u00c5pne valgt \u00f8kt +action.Kilo.Session.Rename.text=Gi nytt navn +action.Kilo.Session.Rename.description=Gi valgt \u00f8kt nytt navn +action.Kilo.Session.Delete.text=Slett +action.Kilo.Session.Delete.description=Slett valgte \u00f8kt(er) +action.Kilo.History.ContextMenu.text=Historikkhandlinger diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pl.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pl.properties new file mode 100644 index 00000000000..a7fdaaa2395 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pl.properties @@ -0,0 +1,139 @@ +session.connection.connecting=\u0141adowanie\u2026 +session.connection.error.app=B\u0142\u0105d po\u0142\u0105czenia +session.connection.error.workspace=B\u0142\u0105d \u0142adowania obszaru roboczego +session.connection.error.unknown=Nieznany b\u0142\u0105d +session.connection.retry=Spr\u00f3buj ponownie +session.connection.warning.config=Ostrze\u017cenia konfiguracji + +session.empty.welcome=Kilo Code to asystent kodowania AI. Poproś go o tworzenie funkcji, naprawianie b\u0142\u0119d\u00f3w lub wyjaśnianie bazy kodu. +session.empty.loading=\u0141adowanie\u2026 +session.empty.recent=OSTATNIE +session.showHistory=Poka\u017c histori\u0119 +session.scroll.bottom=Przewiń na d\u00f3\u0142 +session.tab.new=Nowa sesja +session.tab.untitled=Sesja bez tytu\u0142u + +session.permission.title=Prośba o uprawnienia +session.permission.meta=Narz\u0119dzie: {0} \u2022 Wzorce: {1} +session.permission.allow=Zezw\u00f3l +session.permission.deny=Odmów +session.question.dismiss=Odrzuć + +session.status.considering=Rozwa\u017canie nast\u0119pnych krok\u00f3w\u2026 +session.status.thinking=Myślenie\u2026 +session.status.writing=Pisanie odpowiedzi\u2026 +session.status.delegating=Delegowanie pracy\u2026 +session.status.planning=Planowanie\u2026 +session.status.gathering=Zbieranie kontekstu\u2026 +session.status.searching.codebase=Przeszukiwanie bazy kodu\u2026 +session.status.searching.web=Przeszukiwanie sieci\u2026 +session.status.editing=Dokonywanie edycji\u2026 +session.status.commands=Uruchamianie polece\u0144\u2026 + +session.part.reasoning=Rozumowanie +session.part.compaction=kontekst skompresowany +session.part.tool.copy=Kopiuj +session.part.tool.error=B\u0142\u0105d +session.part.tool.pending=Oczekuje +session.part.tool.read=Odczyt +session.part.tool.running=Uruchomione +session.part.tool.shell=Pow\u0142oka +session.part.tool.truncated=Wyj\u015bcie skr\u00f3cone w podgl\u0105dzie. Pe\u0142ne wyj\u015bcie pozostaje w danych sesji. + +session.error.prompt=B\u0142\u0105d monitu +session.error.compact=B\u0142\u0105d kompresji sesji +session.error.unknown=Nieznany b\u0142\u0105d + +session.header.tokens=Tokeny +session.header.tokens.description=Tokeny u\u017cyte przez ostatni\u0105 odpowiedź asystenta: wej\u015bciowe, wyj\u015bciowe, zapisy do bufora i odczyty z bufora. +session.header.input=we {0} +session.header.output=wy {0} +session.header.cache.write=zapis bufora {0} +session.header.cache.read=odczyt bufora {0} +session.header.compact=Kompresuj sesj\u0119 +session.header.compact.description=Podsumuj sesj\u0119, aby zmniejszyć rozmiar kontekstu +session.header.expand=Poka\u017c metryki sesji +session.header.collapse=Ukryj metryki sesji +session.header.todos.progress={0}/{1} zadań ukończono +session.header.todos.done=Wszystkie {0} zadań ukończono +session.header.context.tooltip.percent={0} token\u00f3w ({1}% kontekstu) +session.header.context.tooltip.tokens={0} token\u00f3w +session.header.context.used={0} / {1} token\u00f3w u\u017cito +session.header.context.reserved={0} zarezerwowane dla wyj\u015bcia +session.header.context.available={0} dost\u0119pne + +prompt.placeholder=Wpisz wiadomość\u2026 +prompt.placeholder.with.shortcuts=Wpisz wiadomość\u2026 ({0} aby wyslać, {1} nowa linia) +prompt.placeholder.with.send=Wpisz wiadomość\u2026 ({0} aby wyslać) +prompt.placeholder.with.newline=Wpisz wiadomość\u2026 ({0} nowa linia) +prompt.button.send=Wyślij +prompt.button.stop=Zatrzymaj +prompt.button.send.tooltip.stop=Aby zatrzymać, naciśnij {0} +mode.picker.tooltip=Wybierz tryb +mode.picker.deprecated=przestarza\u0142y +model.picker.tooltip=Wybierz model +model.picker.recommended=Zalecane +model.picker.favorites=Ulubione +model.picker.search=Szukaj modeli +model.picker.no.matches=Brak pasuj\u0105cych modeli +model.picker.favorite.add=Dodaj do ulubionych +model.picker.favorite.remove=Usu\u0144 z ulubionych +model.picker.free=Bezp\u0142atny +model.picker.reset=Zresetuj model do domy\u015blnego +reasoning.picker.tooltip=Wybierz poziom rozumowania + +history.tab.local=Lokalne +history.tab.cloud=Chmura +history.back=Wstecz +history.search.placeholder=Szukaj sesji +history.empty=Brak sesji +history.loading=\u0141adowanie\u2026 +history.untitled=Bez tytu\u0142u +history.delete.text=Usu\u0144 +history.delete.confirm.title=Usun\u0105ć sesj\u0119? +history.delete.confirm.message=Usun\u0105ć "{0}" z lokalnej historii? +history.delete.confirm.message.multiple=Usun\u0105ć {0} sesji z lokalnej historii? +history.rename.title=Zmień nazw\u0119 sesji +history.rename.prompt=Nowa nazwa sesji: +history.cloud.load.more=Załaduj więcej +history.cloud.repo.only=Tylko to repozytorium +history.group.today=Dzisiaj +history.group.yesterday=Wczoraj +history.group.week=Ten tydzie\u0144 +history.group.month=Ten miesi\u0105c +history.group.older=Starsze +history.time.moments=Przed chwil\u0105 +history.time.minutes={0} min temu +history.time.hours={0} godz temu +history.time.days={0} dni temu +history.time.months={0} mies temu +history.time.years={0} lat temu +history.error.local=Nie udało się załadować lokalnej historii +history.error.cloud=Nie udało się załadować historii w chmurze +history.error.local.delete=Nie udało się usunąć sesji +history.error.local.rename=Nie udało się zmienić nazwy sesji +history.error.cloud.delete=Sesji w chmurze nie można jeszcze usuwać + +action.Kilo.Settings.text=Ustawienia +action.Kilo.Settings.description=Ustawienia Kilo Code +action.Kilo.NewSession.text=Nowa sesja +action.Kilo.NewSession.description=Rozpocznij nową sesj\u0119 Kilo +action.Kilo.History.text=Historia +action.Kilo.History.description=Poka\u017c histori\u0119 sesji +action.Kilo.SendPrompt.text=Wyślij monit +action.Kilo.SendPrompt.description=Wyślij bieżący monit Kilo +action.Kilo.StopSession.text=Zatrzymaj sesj\u0119 +action.Kilo.StopSession.description=Zatrzymaj bieżącą sesj\u0119 Kilo +action.Kilo.SettingsGroup.text=Ustawienia +action.Kilo.SettingsGroup.description=Ustawienia Kilo Code +action.Kilo.Restart.text=Uruchom ponownie Kilo +action.Kilo.Restart.description=Zakończ i uruchom ponownie proces CLI +action.Kilo.Reinstall.text=Zainstaluj ponownie Kilo +action.Kilo.Reinstall.description=Ponownie wyodrębnij plik binarny CLI i uruchom ponownie +action.Kilo.Session.Open.text=Otwórz +action.Kilo.Session.Open.description=Otwórz wybraną sesj\u0119 +action.Kilo.Session.Rename.text=Zmień nazwę +action.Kilo.Session.Rename.description=Zmień nazw\u0119 wybranej sesji +action.Kilo.Session.Delete.text=Usu\u0144 +action.Kilo.Session.Delete.description=Usu\u0144 wybran\u0105 sesj\u0119 (wybrane sesje) +action.Kilo.History.ContextMenu.text=Akcje historii diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pt_BR.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pt_BR.properties new file mode 100644 index 00000000000..8d98608abef --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pt_BR.properties @@ -0,0 +1,139 @@ +session.connection.connecting=Carregando\u2026 +session.connection.error.app=Falha na conex\u00e3o +session.connection.error.workspace=Falha ao carregar o espa\u00e7o de trabalho +session.connection.error.unknown=Erro desconhecido +session.connection.retry=Tentar novamente +session.connection.warning.config=Avisos de configura\u00e7\u00e3o + +session.empty.welcome=Kilo Code \u00e9 um assistente de codifica\u00e7\u00e3o com IA. Pe\u00e7a que construa funcionalidades, corrija bugs ou explique sua base de c\u00f3digo. +session.empty.loading=Carregando\u2026 +session.empty.recent=RECENTE +session.showHistory=Mostrar hist\u00f3rico +session.scroll.bottom=Rolar para o fim +session.tab.new=Nova sess\u00e3o +session.tab.untitled=Sess\u00e3o sem t\u00edtulo + +session.permission.title=Solicita\u00e7\u00e3o de permiss\u00e3o +session.permission.meta=Ferramenta: {0} \u2022 Padr\u00f5es: {1} +session.permission.allow=Permitir +session.permission.deny=Negar +session.question.dismiss=Dispensar + +session.status.considering=Considerando os pr\u00f3ximos passos\u2026 +session.status.thinking=Pensando\u2026 +session.status.writing=Escrevendo resposta\u2026 +session.status.delegating=Delegando trabalho\u2026 +session.status.planning=Planejando\u2026 +session.status.gathering=Coletando contexto\u2026 +session.status.searching.codebase=Pesquisando na base de c\u00f3digo\u2026 +session.status.searching.web=Pesquisando na web\u2026 +session.status.editing=Realizando edi\u00e7\u00f5es\u2026 +session.status.commands=Executando comandos\u2026 + +session.part.reasoning=Racioc\u00ednio +session.part.compaction=contexto compactado +session.part.tool.copy=Copiar +session.part.tool.error=Erro +session.part.tool.pending=Pendente +session.part.tool.read=Ler +session.part.tool.running=Executando +session.part.tool.shell=Shell +session.part.tool.truncated=Sa\u00edda truncada na pr\u00e9-visualiza\u00e7\u00e3o. A sa\u00edda completa permanece nos dados da sess\u00e3o. + +session.error.prompt=Falha no prompt +session.error.compact=Falha ao compactar a sess\u00e3o +session.error.unknown=Erro desconhecido + +session.header.tokens=Tokens +session.header.tokens.description=Tokens usados pela \u00faltima resposta do assistente: entrada, sa\u00edda, escritas em cache e leituras em cache. +session.header.input=entrada {0} +session.header.output=sa\u00edda {0} +session.header.cache.write=escrita em cache {0} +session.header.cache.read=leitura em cache {0} +session.header.compact=Compactar sess\u00e3o +session.header.compact.description=Resumir a sess\u00e3o para reduzir o tamanho do contexto +session.header.expand=Exibir m\u00e9tricas da sess\u00e3o +session.header.collapse=Ocultar m\u00e9tricas da sess\u00e3o +session.header.todos.progress={0}/{1} tarefas conclu\u00eddas +session.header.todos.done=Todas as {0} tarefas conclu\u00eddas +session.header.context.tooltip.percent={0} tokens ({1}% do contexto) +session.header.context.tooltip.tokens={0} tokens +session.header.context.used={0} / {1} tokens utilizados +session.header.context.reserved={0} reservados para sa\u00edda +session.header.context.available={0} dispon\u00edveis + +prompt.placeholder=Digite uma mensagem\u2026 +prompt.placeholder.with.shortcuts=Digite uma mensagem\u2026 ({0} para enviar, {1} para nova linha) +prompt.placeholder.with.send=Digite uma mensagem\u2026 ({0} para enviar) +prompt.placeholder.with.newline=Digite uma mensagem\u2026 ({0} para nova linha) +prompt.button.send=Enviar +prompt.button.stop=Parar +prompt.button.send.tooltip.stop=Para parar, pressione {0} +mode.picker.tooltip=Selecionar modo +mode.picker.deprecated=obsoleto +model.picker.tooltip=Selecionar modelo +model.picker.recommended=Recomendado +model.picker.favorites=Favoritos +model.picker.search=Pesquisar modelos +model.picker.no.matches=Nenhum modelo correspondente +model.picker.favorite.add=Adicionar aos favoritos +model.picker.favorite.remove=Remover dos favoritos +model.picker.free=Gratuito +model.picker.reset=Redefinir modelo para o padr\u00e3o +reasoning.picker.tooltip=Selecionar esfor\u00e7o de racioc\u00ednio + +history.tab.local=Local +history.tab.cloud=Nuvem +history.back=Voltar +history.search.placeholder=Pesquisar sess\u00f5es +history.empty=Nenhuma sess\u00e3o +history.loading=Carregando\u2026 +history.untitled=Sem t\u00edtulo +history.delete.text=Excluir +history.delete.confirm.title=Excluir sess\u00e3o? +history.delete.confirm.message=Excluir "{0}" do hist\u00f3rico local? +history.delete.confirm.message.multiple=Excluir {0} sess\u00f5es do hist\u00f3rico local? +history.rename.title=Renomear sess\u00e3o +history.rename.prompt=Novo nome da sess\u00e3o: +history.cloud.load.more=Carregar mais +history.cloud.repo.only=Somente este reposit\u00f3rio +history.group.today=Hoje +history.group.yesterday=Ontem +history.group.week=Esta semana +history.group.month=Este m\u00eas +history.group.older=Mais antigo +history.time.moments=Agora mesmo +history.time.minutes=H\u00e1 {0} min +history.time.hours=H\u00e1 {0} h +history.time.days=H\u00e1 {0} d +history.time.months=H\u00e1 {0} m\u00eas(es) +history.time.years=H\u00e1 {0} ano(s) +history.error.local=Falha ao carregar o hist\u00f3rico local +history.error.cloud=Falha ao carregar o hist\u00f3rico na nuvem +history.error.local.delete=Falha ao excluir a sess\u00e3o +history.error.local.rename=Falha ao renomear a sess\u00e3o +history.error.cloud.delete=As sess\u00f5es na nuvem ainda n\u00e3o podem ser exclu\u00eddas + +action.Kilo.Settings.text=Configura\u00e7\u00f5es +action.Kilo.Settings.description=Configura\u00e7\u00f5es do Kilo Code +action.Kilo.NewSession.text=Nova sess\u00e3o +action.Kilo.NewSession.description=Iniciar uma nova sess\u00e3o do Kilo +action.Kilo.History.text=Hist\u00f3rico +action.Kilo.History.description=Exibir hist\u00f3rico de sess\u00f5es +action.Kilo.SendPrompt.text=Enviar prompt +action.Kilo.SendPrompt.description=Enviar o prompt atual do Kilo +action.Kilo.StopSession.text=Parar sess\u00e3o +action.Kilo.StopSession.description=Parar a sess\u00e3o atual do Kilo +action.Kilo.SettingsGroup.text=Configura\u00e7\u00f5es +action.Kilo.SettingsGroup.description=Configura\u00e7\u00f5es do Kilo Code +action.Kilo.Restart.text=Reiniciar Kilo +action.Kilo.Restart.description=Encerrar e reiniciar o processo CLI +action.Kilo.Reinstall.text=Reinstalar Kilo +action.Kilo.Reinstall.description=Reextrair o bin\u00e1rio CLI e reiniciar +action.Kilo.Session.Open.text=Abrir +action.Kilo.Session.Open.description=Abrir a sess\u00e3o selecionada +action.Kilo.Session.Rename.text=Renomear +action.Kilo.Session.Rename.description=Renomear a sess\u00e3o selecionada +action.Kilo.Session.Delete.text=Excluir +action.Kilo.Session.Delete.description=Excluir a(s) sess\u00e3o(es) selecionada(s) +action.Kilo.History.ContextMenu.text=A\u00e7\u00f5es do hist\u00f3rico diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ru.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ru.properties new file mode 100644 index 00000000000..544daaba744 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ru.properties @@ -0,0 +1,139 @@ +session.connection.connecting=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u2026 +session.connection.error.app=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f +session.connection.error.workspace=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 +session.connection.error.unknown=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 +session.connection.retry=\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c +session.connection.warning.config=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 + +session.empty.welcome=Kilo Code \u2014 \u044d\u0442\u043e AI-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u043f\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435 \u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043b\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443. +session.empty.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u2026 +session.empty.recent=\u041d\u0415\u0414\u0410\u0412\u041d\u0418\u0415 +session.showHistory=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e +session.scroll.bottom=\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u0437 +session.tab.new=\u041d\u043e\u0432\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f +session.tab.untitled=\u041d\u0435\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0435\u0441\u0441\u0438\u044f + +session.permission.title=\u0417\u0430\u043f\u0440\u043e\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f +session.permission.meta=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442: {0} \u2022 \u0428\u0430\u0431\u043b\u043e\u043d\u044b: {1} +session.permission.allow=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c +session.permission.deny=\u041e\u0442\u043a\u0430\u0437\u0430\u0442\u044c +session.question.dismiss=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c + +session.status.considering=\u041e\u0431\u0434\u0443\u043c\u044b\u0432\u0430\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438\u2026 +session.status.thinking=\u0420\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u044e\u2026 +session.status.writing=\u041f\u0438\u0448\u0443 \u043e\u0442\u0432\u0435\u0442\u2026 +session.status.delegating=\u041f\u0435\u0440\u0435\u0434\u0430\u044e \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u2026 +session.status.planning=\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u044e\u2026 +session.status.gathering=\u0421\u0431\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u2026 +session.status.searching.codebase=\u041f\u043e\u0438\u0441\u043a \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435\u2026 +session.status.searching.web=\u041f\u043e\u0438\u0441\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435\u2026 +session.status.editing=\u0412\u043d\u043e\u0448\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u2026 +session.status.commands=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b\u2026 + +session.part.reasoning=\u0420\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 +session.part.compaction=\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0436\u0430\u0442 +session.part.tool.copy=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c +session.part.tool.error=\u041e\u0448\u0438\u0431\u043a\u0430 +session.part.tool.pending=\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 +session.part.tool.read=\u0427\u0442\u0435\u043d\u0438\u0435 +session.part.tool.running=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f +session.part.tool.shell=Shell +session.part.tool.truncated=\u0412\u044b\u0432\u043e\u0434 \u0443\u0441\u0435\u0447\u0451\u043d \u0432 \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435. \u041f\u043e\u043b\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0438. + +session.error.prompt=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 +session.error.compact=\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u0436\u0430\u0442\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 +session.error.unknown=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 + +session.header.tokens=\u0422\u043e\u043a\u0435\u043d\u044b +session.header.tokens.description=\u0422\u043e\u043a\u0435\u043d\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430: \u0432\u0445\u043e\u0434\u043d\u044b\u0435, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435, \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u044d\u0448 \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u044d\u0448\u0430. +session.header.input=\u0432\u0445\u043e\u0434 {0} +session.header.output=\u0432\u044b\u0445\u043e\u0434 {0} +session.header.cache.write=\u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u044d\u0448 {0} +session.header.cache.read=\u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u044d\u0448\u0430 {0} +session.header.compact=\u0421\u0436\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e +session.header.compact.description=\u0421\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 +session.header.expand=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 +session.header.collapse=\u0421\u043a\u0440\u044b\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 +session.header.todos.progress={0}/{1} \u0437\u0430\u0434\u0430\u0447 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e +session.header.todos.done=\u0412\u0441\u0435 {0} \u0437\u0430\u0434\u0430\u0447 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b +session.header.context.tooltip.percent={0} \u0442\u043e\u043a\u0435\u043d\u043e\u0432 ({1}% \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430) +session.header.context.tooltip.tokens={0} \u0442\u043e\u043a\u0435\u043d\u043e\u0432 +session.header.context.used={0} / {1} \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e +session.header.context.reserved={0} \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 +session.header.context.available={0} \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e + +prompt.placeholder=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u2026 +prompt.placeholder.with.shortcuts=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u2026 ({0} \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c, {1} \u2014 \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430) +prompt.placeholder.with.send=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u2026 ({0} \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c) +prompt.placeholder.with.newline=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u2026 ({0} \u2014 \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430) +prompt.button.send=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c +prompt.button.stop=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c +prompt.button.send.tooltip.stop=\u0414\u043b\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 {0} +mode.picker.tooltip=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c +mode.picker.deprecated=\u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 +model.picker.tooltip=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c +model.picker.recommended=\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0435 +model.picker.favorites=\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 +model.picker.search=\u041f\u043e\u0438\u0441\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 +model.picker.no.matches=\u041d\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 +model.picker.favorite.add=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 +model.picker.favorite.remove=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e +model.picker.free=\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e +model.picker.reset=\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e +reasoning.picker.tooltip=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f + +history.tab.local=\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f +history.tab.cloud=\u041e\u0431\u043b\u0430\u043a\u043e +history.back=\u041d\u0430\u0437\u0430\u0434 +history.search.placeholder=\u041f\u043e\u0438\u0441\u043a \u0441\u0435\u0441\u0441\u0438\u0439 +history.empty=\u041d\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u0439 +history.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u2026 +history.untitled=\u0411\u0435\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f +history.delete.text=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +history.delete.confirm.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e? +history.delete.confirm.message=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u00ab{0}\u00bb \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438? +history.delete.confirm.message.multiple=\u0423\u0434\u0430\u043b\u0438\u0442\u044c {0} \u0441\u0435\u0441\u0441\u0438\u0439 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438? +history.rename.title=\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e +history.rename.prompt=\u041d\u043e\u0432\u043e\u0435 \u0438\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438: +history.cloud.load.more=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0435\u0449\u0451 +history.cloud.repo.only=\u0422\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 +history.group.today=\u0421\u0435\u0433\u043e\u0434\u043d\u044f +history.group.yesterday=\u0412\u0447\u0435\u0440\u0430 +history.group.week=\u041d\u0430 \u044d\u0442\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 +history.group.month=\u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435 +history.group.older=\u0421\u0442\u0430\u0440\u0448\u0435 +history.time.moments=\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e +history.time.minutes={0} \u043c\u0438\u043d \u043d\u0430\u0437\u0430\u0434 +history.time.hours={0} \u0447 \u043d\u0430\u0437\u0430\u0434 +history.time.days={0} \u0434 \u043d\u0430\u0437\u0430\u0434 +history.time.months={0} \u043c\u0435\u0441 \u043d\u0430\u0437\u0430\u0434 +history.time.years={0} \u043b \u043d\u0430\u0437\u0430\u0434 +history.error.local=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 +history.error.cloud=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 +history.error.local.delete=\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 +history.error.local.rename=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 +history.error.cloud.delete=\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c + +action.Kilo.Settings.text=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 +action.Kilo.Settings.description=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Kilo Code +action.Kilo.NewSession.text=\u041d\u043e\u0432\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f +action.Kilo.NewSession.description=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e Kilo +action.Kilo.History.text=\u0418\u0441\u0442\u043e\u0440\u0438\u044f +action.Kilo.History.description=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u0435\u0441\u0441\u0438\u0439 +action.Kilo.SendPrompt.text=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 +action.Kilo.SendPrompt.description=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 Kilo +action.Kilo.StopSession.text=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e +action.Kilo.StopSession.description=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e Kilo +action.Kilo.SettingsGroup.text=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 +action.Kilo.SettingsGroup.description=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Kilo Code +action.Kilo.Restart.text=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Kilo +action.Kilo.Restart.description=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c CLI-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 +action.Kilo.Reinstall.text=\u041f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Kilo +action.Kilo.Reinstall.description=\u041f\u0435\u0440\u0435\u0438\u0437\u0432\u043b\u0435\u0447\u044c CLI-\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c +action.Kilo.Session.Open.text=\u041e\u0442\u043a\u0440\u044b\u0442\u044c +action.Kilo.Session.Open.description=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e +action.Kilo.Session.Rename.text=\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c +action.Kilo.Session.Rename.description=\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e +action.Kilo.Session.Delete.text=\u0423\u0434\u0430\u043b\u0438\u0442\u044c +action.Kilo.Session.Delete.description=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e(-\u044b\u0435) \u0441\u0435\u0441\u0441\u0438\u044e(-\u0438\u0438) +action.Kilo.History.ContextMenu.text=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_th.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_th.properties new file mode 100644 index 00000000000..6f3945e15c2 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_th.properties @@ -0,0 +1,139 @@ +session.connection.connecting=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14\u2026 +session.connection.error.app=\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 +session.connection.error.workspace=\u0e42\u0e2b\u0e25\u0e14\u0e1e\u0e37\u0e49\u0e19\u0e17\u0e35\u0e48\u0e17\u0e33\u0e07\u0e32\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 +session.connection.error.unknown=\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e17\u0e23\u0e32\u0e1a +session.connection.retry=\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07 +session.connection.warning.config=\u0e04\u0e33\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e01\u0e32\u0e23\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e04\u0e48\u0e32 + +session.empty.welcome=Kilo Code \u0e04\u0e37\u0e2d\u0e1c\u0e39\u0e49\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e04\u0e49\u0e14 AI \u0e02\u0e2d\u0e43\u0e2b\u0e49\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e1f\u0e35\u0e40\u0e08\u0e2d\u0e23\u0e4c\u0e41\u0e01\u0e49\u0e2a\u0e31\u0e19\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14 \u0e2b\u0e23\u0e37\u0e2d\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e42\u0e04\u0e49\u0e14\u0e40\u0e1a\u0e2a\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 +session.empty.loading=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14\u2026 +session.empty.recent=\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14 +session.showHistory=\u0e41\u0e2a\u0e14\u0e07\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34 +session.scroll.bottom=\u0e40\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e1b\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07 +session.tab.new=\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e43\u0e2b\u0e21\u0e48 +session.tab.untitled=\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e44\u0e21\u0e48\u0e21\u0e35\u0e0a\u0e37\u0e48\u0e2d + +session.permission.title=\u0e02\u0e2d\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c +session.permission.meta=\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d: {0} \u2022 \u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a: {1} +session.permission.allow=\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15 +session.permission.deny=\u0e1b\u0e0f\u0e34\u0e40\u0e2a\u0e18 +session.question.dismiss=\u0e1b\u0e34\u0e14 + +session.status.considering=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e1e\u0e34\u0e08\u0e32\u0e23\u0e13\u0e32\u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19\u0e16\u0e31\u0e14\u0e44\u0e1b\u2026 +session.status.thinking=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e04\u0e34\u0e14\u2026 +session.status.writing=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e02\u0e35\u0e22\u0e19\u0e04\u0e33\u0e15\u0e2d\u0e1a\u2026 +session.status.delegating=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e21\u0e2d\u0e1a\u0e2b\u0e21\u0e32\u0e22\u0e07\u0e32\u0e19\u2026 +session.status.planning=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e27\u0e32\u0e07\u0e41\u0e1c\u0e19\u2026 +session.status.gathering=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e23\u0e27\u0e1a\u0e23\u0e27\u0e21\u0e1a\u0e23\u0e34\u0e1a\u0e17\u2026 +session.status.searching.codebase=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e43\u0e19\u0e42\u0e04\u0e49\u0e14\u0e40\u0e1a\u0e2a\u2026 +session.status.searching.web=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e1a\u0e19\u0e40\u0e27\u0e47\u0e1a\u2026 +session.status.editing=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e41\u0e01\u0e49\u0e44\u0e02\u2026 +session.status.commands=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e23\u0e35\u0e22\u0e01\u0e43\u0e0a\u0e49\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u2026 + +session.part.reasoning=\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25 +session.part.compaction=\u0e1a\u0e23\u0e34\u0e1a\u0e17\u0e16\u0e39\u0e01\u0e1a\u0e35\u0e1a\u0e2d\u0e31\u0e14\u0e41\u0e25\u0e49\u0e27 +session.part.tool.copy=\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01 +session.part.tool.error=\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14 +session.part.tool.pending=\u0e23\u0e2d\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23 +session.part.tool.read=\u0e2d\u0e48\u0e32\u0e19 +session.part.tool.running=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e17\u0e33\u0e07\u0e32\u0e19 +session.part.tool.shell=Shell +session.part.tool.truncated=\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e16\u0e39\u0e01\u0e15\u0e31\u0e14\u0e17\u0e2d\u0e19\u0e43\u0e19\u0e2a\u0e48\u0e27\u0e19\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 \u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e22\u0e31\u0e07\u0e04\u0e07\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 + +session.error.prompt=\u0e04\u0e33\u0e02\u0e2d\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 +session.error.compact=\u0e01\u0e32\u0e23\u0e1a\u0e35\u0e1a\u0e2d\u0e31\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 +session.error.unknown=\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e17\u0e23\u0e32\u0e1a + +session.header.tokens=\u0e42\u0e17\u0e40\u0e04\u0e19 +session.header.tokens.description=\u0e42\u0e17\u0e40\u0e04\u0e19\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e42\u0e14\u0e22\u0e04\u0e33\u0e15\u0e2d\u0e1a\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e0a\u0e48\u0e27\u0e22: \u0e2d\u0e34\u0e19\u0e1e\u0e38\u0e15 \u0e40\u0e2d\u0e32\u0e15\u0e4c\u0e1e\u0e38\u0e15 \u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19\u0e41\u0e04\u0e0a \u0e41\u0e25\u0e30\u0e01\u0e32\u0e23\u0e2d\u0e48\u0e32\u0e19\u0e41\u0e04\u0e0a +session.header.input=\u0e2d\u0e34\u0e19\u0e1e\u0e38\u0e15 {0} +session.header.output=\u0e40\u0e2d\u0e32\u0e15\u0e4c\u0e1e\u0e38\u0e15 {0} +session.header.cache.write=\u0e40\u0e02\u0e35\u0e22\u0e19\u0e41\u0e04\u0e0a {0} +session.header.cache.read=\u0e2d\u0e48\u0e32\u0e19\u0e41\u0e04\u0e0a {0} +session.header.compact=\u0e1a\u0e35\u0e1a\u0e2d\u0e31\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +session.header.compact.description=\u0e2a\u0e23\u0e38\u0e1b\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e25\u0e14\u0e02\u0e19\u0e32\u0e14\u0e1a\u0e23\u0e34\u0e1a\u0e17 +session.header.expand=\u0e41\u0e2a\u0e14\u0e07\u0e40\u0e21\u0e15\u0e23\u0e34\u0e01\u0e2a\u0e4c\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +session.header.collapse=\u0e0b\u0e48\u0e2d\u0e19\u0e40\u0e21\u0e15\u0e23\u0e34\u0e01\u0e2a\u0e4c\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +session.header.todos.progress={0}/{1} \u0e07\u0e32\u0e19\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e2a\u0e34\u0e49\u0e19\u0e41\u0e25\u0e49\u0e27 +session.header.todos.done=\u0e04\u0e23\u0e1a\u0e17\u0e38\u0e01 {0} \u0e07\u0e32\u0e19\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e2a\u0e34\u0e49\u0e19\u0e41\u0e25\u0e49\u0e27 +session.header.context.tooltip.percent={0} \u0e42\u0e17\u0e40\u0e04\u0e19 ({1}% \u0e02\u0e2d\u0e07\u0e1a\u0e23\u0e34\u0e1a\u0e17) +session.header.context.tooltip.tokens={0} \u0e42\u0e17\u0e40\u0e04\u0e19 +session.header.context.used=\u0e43\u0e0a\u0e49\u0e41\u0e25\u0e49\u0e27 {0} / {1} \u0e42\u0e17\u0e40\u0e04\u0e19 +session.header.context.reserved={0} \u0e2a\u0e33\u0e23\u0e2d\u0e07\u0e44\u0e27\u0e49\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e40\u0e2d\u0e32\u0e15\u0e4c\u0e1e\u0e38\u0e15 +session.header.context.available={0} \u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 + +prompt.placeholder=\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u2026 +prompt.placeholder.with.shortcuts=\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u2026 ({0} \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e2a\u0e48\u0e07 {1} \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14\u0e43\u0e2b\u0e21\u0e48) +prompt.placeholder.with.send=\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u2026 ({0} \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e2a\u0e48\u0e07) +prompt.placeholder.with.newline=\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u2026 ({0} \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14\u0e43\u0e2b\u0e21\u0e48) +prompt.button.send=\u0e2a\u0e48\u0e07 +prompt.button.stop=\u0e2b\u0e22\u0e38\u0e14 +prompt.button.send.tooltip.stop=\u0e01\u0e14 {0} \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e2b\u0e22\u0e38\u0e14 +mode.picker.tooltip=\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e42\u0e2b\u0e21\u0e14 +mode.picker.deprecated=\u0e25\u0e49\u0e32\u0e2a\u0e21\u0e31\u0e22 +model.picker.tooltip=\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e42\u0e21\u0e40\u0e14\u0e25 +model.picker.recommended=\u0e41\u0e19\u0e30\u0e19\u0e33 +model.picker.favorites=\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e42\u0e1b\u0e23\u0e14 +model.picker.search=\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e42\u0e21\u0e40\u0e14\u0e25 +model.picker.no.matches=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e42\u0e21\u0e40\u0e14\u0e25\u0e17\u0e35\u0e48\u0e15\u0e23\u0e07\u0e01\u0e31\u0e19 +model.picker.favorite.add=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e43\u0e19\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e42\u0e1b\u0e23\u0e14 +model.picker.favorite.remove=\u0e19\u0e33\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e42\u0e1b\u0e23\u0e14 +model.picker.free=\u0e1f\u0e23\u0e35 +model.picker.reset=\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15\u0e42\u0e21\u0e40\u0e14\u0e25\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19 +reasoning.picker.tooltip=\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25 + +history.tab.local=\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e19\u0e35\u0e49 +history.tab.cloud=\u0e04\u0e25\u0e32\u0e27\u0e14\u0e4c +history.back=\u0e22\u0e49\u0e2d\u0e19\u0e01\u0e25\u0e31\u0e1a +history.search.placeholder=\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +history.empty=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +history.loading=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14\u2026 +history.untitled=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e0a\u0e37\u0e48\u0e2d +history.delete.text=\u0e25\u0e1a +history.delete.confirm.title=\u0e25\u0e1a\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19? +history.delete.confirm.message=\u0e25\u0e1a "{0}" \u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07? +history.delete.confirm.message.multiple=\u0e25\u0e1a {0} \u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07? +history.rename.title=\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +history.rename.prompt=\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e43\u0e2b\u0e21\u0e48: +history.cloud.load.more=\u0e42\u0e2b\u0e25\u0e14\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21 +history.cloud.repo.only=\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e23\u0e35\u0e42\u0e1b\u0e0b\u0e34\u0e17\u0e2d\u0e23\u0e35\u0e19\u0e35\u0e49 +history.group.today=\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 +history.group.yesterday=\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19 +history.group.week=\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c\u0e19\u0e35\u0e49 +history.group.month=\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e19\u0e35\u0e49 +history.group.older=\u0e40\u0e01\u0e48\u0e32\u0e01\u0e27\u0e48\u0e32 +history.time.moments=\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e01\u0e35\u0e49\u0e19\u0e35\u0e49 +history.time.minutes={0} \u0e19\u0e32\u0e17\u0e35\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 +history.time.hours={0} \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 +history.time.days={0} \u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 +history.time.months={0} \u0e40\u0e14\u0e37\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 +history.time.years={0} \u0e1b\u0e35\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 +history.error.local=\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e42\u0e2b\u0e25\u0e14\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07 +history.error.cloud=\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e42\u0e2b\u0e25\u0e14\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e04\u0e25\u0e32\u0e27\u0e14\u0e4c +history.error.local.delete=\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e25\u0e1a\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +history.error.local.rename=\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +history.error.cloud.delete=\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e25\u0e1a\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e04\u0e25\u0e32\u0e27\u0e14\u0e4c\u0e44\u0e14\u0e49 + +action.Kilo.Settings.text=\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 +action.Kilo.Settings.description=\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 Kilo Code +action.Kilo.NewSession.text=\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e43\u0e2b\u0e21\u0e48 +action.Kilo.NewSession.description=\u0e40\u0e23\u0e34\u0e48\u0e21\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 Kilo \u0e43\u0e2b\u0e21\u0e48 +action.Kilo.History.text=\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34 +action.Kilo.History.description=\u0e41\u0e2a\u0e14\u0e07\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +action.Kilo.SendPrompt.text=\u0e2a\u0e48\u0e07\u0e04\u0e33\u0e02\u0e2d +action.Kilo.SendPrompt.description=\u0e2a\u0e48\u0e07\u0e04\u0e33\u0e02\u0e2d Kilo \u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19 +action.Kilo.StopSession.text=\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +action.Kilo.StopSession.description=\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 Kilo \u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19 +action.Kilo.SettingsGroup.text=\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 +action.Kilo.SettingsGroup.description=\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 Kilo Code +action.Kilo.Restart.text=\u0e23\u0e35\u0e2a\u0e15\u0e32\u0e23\u0e4c\u0e15 Kilo +action.Kilo.Restart.description=\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e30\u0e23\u0e35\u0e2a\u0e15\u0e32\u0e23\u0e4c\u0e15\u0e01\u0e23\u0e30\u0e1a\u0e27\u0e19\u0e01\u0e32\u0e23 CLI +action.Kilo.Reinstall.text=\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07 Kilo \u0e43\u0e2b\u0e21\u0e48 +action.Kilo.Reinstall.description=\u0e41\u0e15\u0e01\u0e44\u0e1f\u0e25\u0e4c\u0e44\u0e1a\u0e19\u0e32\u0e23\u0e35 CLI \u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e41\u0e25\u0e30\u0e23\u0e35\u0e2a\u0e15\u0e32\u0e23\u0e4c\u0e15 +action.Kilo.Session.Open.text=\u0e40\u0e1b\u0e34\u0e14 +action.Kilo.Session.Open.description=\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e17\u0e35\u0e48\u0e40\u0e25\u0e37\u0e2d\u0e01 +action.Kilo.Session.Rename.text=\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d +action.Kilo.Session.Rename.description=\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e17\u0e35\u0e48\u0e40\u0e25\u0e37\u0e2d\u0e01 +action.Kilo.Session.Delete.text=\u0e25\u0e1a +action.Kilo.Session.Delete.description=\u0e25\u0e1a\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e17\u0e35\u0e48\u0e40\u0e25\u0e37\u0e2d\u0e01 +action.Kilo.History.ContextMenu.text=\u0e01\u0e32\u0e23\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34 diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_tr.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_tr.properties new file mode 100644 index 00000000000..fc8f166cb13 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_tr.properties @@ -0,0 +1,139 @@ +session.connection.connecting=Y\u00fckleniyor\u2026 +session.connection.error.app=Ba\u011flant\u0131 hatas\u0131 +session.connection.error.workspace=\u00c7al\u0131\u015fma alan\u0131 y\u00fcklenemedi +session.connection.error.unknown=Bilinmeyen hata +session.connection.retry=Tekrar dene +session.connection.warning.config=Yap\u0131land\u0131rma uyar\u0131lar\u0131 + +session.empty.welcome=Kilo Code, bir yapay zeka kodlama asistan\u0131d\u0131r. \u00d6zellik olu\u015fturmas\u0131n\u0131, hata d\u00fczeltirlmesi veya kod taban\u0131n\u0131z\u0131 a\u00e7\u0131klamas\u0131n\u0131 isteyin. +session.empty.loading=Y\u00fckleniyor\u2026 +session.empty.recent=SON +session.showHistory=Ge\u00e7mi\u015fi g\u00f6ster +session.scroll.bottom=En alta ka\u00fdr +session.tab.new=Yeni oturum +session.tab.untitled=Ba\u015fl\u0131ks\u0131z oturum + +session.permission.title=\u0130zin iste\u011fi +session.permission.meta=Ara\u00e7: {0} \u2022 Desenler: {1} +session.permission.allow=\u0130zin ver +session.permission.deny=Reddet +session.question.dismiss=Kapat + +session.status.considering=Sonraki ad\u0131mlar d\u00fc\u015f\u00fcn\u00fcl\u00fcyor\u2026 +session.status.thinking=D\u00fc\u015f\u00fcn\u00fcl\u00fcyor\u2026 +session.status.writing=Yan\u0131t yaz\u0131l\u0131yor\u2026 +session.status.delegating=\u0130\u015f devrediliyor\u2026 +session.status.planning=Plan haz\u0131rlan\u0131yor\u2026 +session.status.gathering=Ba\u011flam toplan\u0131yor\u2026 +session.status.searching.codebase=Kod taban\u0131 aran\u0131yor\u2026 +session.status.searching.web=Web aran\u0131yor\u2026 +session.status.editing=D\u00fczenleme yap\u0131l\u0131yor\u2026 +session.status.commands=Komutlar \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor\u2026 + +session.part.reasoning=Muhakeme +session.part.compaction=ba\u011flam s\u0131k\u0131\u015ft\u0131r\u0131ld\u0131 +session.part.tool.copy=Kopyala +session.part.tool.error=Hata +session.part.tool.pending=Bekliyor +session.part.tool.read=Oku +session.part.tool.running=\u00c7al\u0131\u015f\u0131yor +session.part.tool.shell=Kabuk +session.part.tool.truncated=\u00d6nizlemede \u00e7\u0131kt\u0131 k\u0131salt\u0131ld\u0131. Tam \u00e7\u0131kt\u0131 oturum verilerinde kal\u0131yor. + +session.error.prompt=\u0130stem hatas\u0131 +session.error.compact=Oturum s\u0131k\u0131\u015ft\u0131rma hatas\u0131 +session.error.unknown=Bilinmeyen hata + +session.header.tokens=Jeton +session.header.tokens.description=Son asistan yan\u0131t\u0131nda kullan\u0131lan jetonlar: giri\u015f, \u00e7\u0131k\u0131\u015f, \u00f6nbelle\u011fe yazma ve \u00f6nbellekten okuma. +session.header.input=giri\u015f {0} +session.header.output=\u00e7\u0131k\u0131\u015f {0} +session.header.cache.write=\u00f6nbelle\u011fe yazma {0} +session.header.cache.read=\u00f6nbellekten okuma {0} +session.header.compact=Oturumu s\u0131k\u0131\u015ft\u0131r +session.header.compact.description=Ba\u011flam boyutunu azaltmak i\u00e7in oturumu \u00f6zetle +session.header.expand=Oturum metriklerini g\u00f6ster +session.header.collapse=Oturum metriklerini gizle +session.header.todos.progress={0}/{1} g\u00f6rev tamamland\u0131 +session.header.todos.done=T\u00fcm {0} g\u00f6rev tamamland\u0131 +session.header.context.tooltip.percent={0} jeton (ba\u011flam\u0131n %{1}\u2019i) +session.header.context.tooltip.tokens={0} jeton +session.header.context.used={0} / {1} jeton kullan\u0131ld\u0131 +session.header.context.reserved={0} \u00e7\u0131k\u0131\u015f i\u00e7in ayr\u0131ld\u0131 +session.header.context.available={0} kullan\u0131labilir + +prompt.placeholder=Bir mesaj yaz\u0131n\u2026 +prompt.placeholder.with.shortcuts=Bir mesaj yaz\u0131n\u2026 ({0} g\u00f6ndermek i\u00e7in, {1} yeni sat\u0131r i\u00e7in) +prompt.placeholder.with.send=Bir mesaj yaz\u0131n\u2026 ({0} g\u00f6ndermek i\u00e7in) +prompt.placeholder.with.newline=Bir mesaj yaz\u0131n\u2026 ({0} yeni sat\u0131r i\u00e7in) +prompt.button.send=G\u00f6nder +prompt.button.stop=Durdur +prompt.button.send.tooltip.stop=Durdurmak i\u00e7in {0} bas\u0131n +mode.picker.tooltip=Mod se\u00e7 +mode.picker.deprecated=ge\u00e7ersiz +model.picker.tooltip=Model se\u00e7 +model.picker.recommended=\u00d6nerilen +model.picker.favorites=Favoriler +model.picker.search=Model ara +model.picker.no.matches=E\u015fle\u015fen model yok +model.picker.favorite.add=Favorilere ekle +model.picker.favorite.remove=Favorilerden \u00e7\u0131kar +model.picker.free=\u00dccretsiz +model.picker.reset=Modeli varsay\u0131lana s\u0131f\u0131rla +reasoning.picker.tooltip=Muhakeme \u00e7abas\u0131 se\u00e7 + +history.tab.local=Yerel +history.tab.cloud=Bulut +history.back=Geri +history.search.placeholder=Oturum ara +history.empty=Oturum yok +history.loading=Y\u00fckleniyor\u2026 +history.untitled=Ba\u015fl\u0131ks\u0131z +history.delete.text=Sil +history.delete.confirm.title=Oturum silinsin mi? +history.delete.confirm.message="{0}" yerel ge\u00e7mi\u015ften silinsin mi? +history.delete.confirm.message.multiple={0} oturum yerel ge\u00e7mi\u015ften silinsin mi? +history.rename.title=Oturumu yeniden adland\u0131r +history.rename.prompt=Yeni oturum ad\u0131: +history.cloud.load.more=Daha fazla y\u00fckle +history.cloud.repo.only=Yaln\u0131zca bu depo +history.group.today=Bug\u00fcn +history.group.yesterday=D\u00fcn +history.group.week=Bu hafta +history.group.month=Bu ay +history.group.older=Daha eski +history.time.moments=Az \u00f6nce +history.time.minutes={0} dk \u00f6nce +history.time.hours={0} sa \u00f6nce +history.time.days={0} g \u00f6nce +history.time.months={0} ay \u00f6nce +history.time.years={0} y\u0131l \u00f6nce +history.error.local=Yerel ge\u00e7mi\u015f y\u00fcklenemedi +history.error.cloud=Bulut ge\u00e7mi\u015fi y\u00fcklenemedi +history.error.local.delete=Oturum silinemedi +history.error.local.rename=Oturum yeniden adland\u0131r\u0131lamad\u0131 +history.error.cloud.delete=Bulut oturumlar\u0131 hen\u00fcz silinemiyor + +action.Kilo.Settings.text=Ayarlar +action.Kilo.Settings.description=Kilo Code ayarlar\u0131 +action.Kilo.NewSession.text=Yeni oturum +action.Kilo.NewSession.description=Yeni bir Kilo oturumu ba\u015flat +action.Kilo.History.text=Ge\u00e7mi\u015f +action.Kilo.History.description=Oturum ge\u00e7mi\u015fini g\u00f6ster +action.Kilo.SendPrompt.text=\u0130stem g\u00f6nder +action.Kilo.SendPrompt.description=Ge\u00e7erli Kilo istemini g\u00f6nder +action.Kilo.StopSession.text=Oturumu durdur +action.Kilo.StopSession.description=Ge\u00e7erli Kilo oturumunu durdur +action.Kilo.SettingsGroup.text=Ayarlar +action.Kilo.SettingsGroup.description=Kilo Code ayarlar\u0131 +action.Kilo.Restart.text=Kilo\u2019yu yeniden ba\u015flat +action.Kilo.Restart.description=CLI s\u00fcrecini sonland\u0131r ve yeniden ba\u015flat +action.Kilo.Reinstall.text=Kilo\u2019yu yeniden y\u00fckle +action.Kilo.Reinstall.description=CLI ikili dosyas\u0131n\u0131 yeniden \u00e7\u0131kar ve yeniden ba\u015flat +action.Kilo.Session.Open.text=A\u00e7 +action.Kilo.Session.Open.description=Se\u00e7ilen oturumu a\u00e7 +action.Kilo.Session.Rename.text=Yeniden adland\u0131r +action.Kilo.Session.Rename.description=Se\u00e7ilen oturumu yeniden adland\u0131r +action.Kilo.Session.Delete.text=Sil +action.Kilo.Session.Delete.description=Se\u00e7ilen oturumlar\u0131 sil +action.Kilo.History.ContextMenu.text=Ge\u00e7mi\u015f eylemleri diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_uk.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_uk.properties new file mode 100644 index 00000000000..4adc8b2d7d3 --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_uk.properties @@ -0,0 +1,139 @@ +session.connection.connecting=\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f\u2026 +session.connection.error.app=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437'\u0454\u0434\u043d\u0430\u043d\u043d\u044f +session.connection.error.workspace=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u0440\u043e\u0431\u043e\u0447\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0443 +session.connection.error.unknown=\u041d\u0435\u0432\u0456\u0434\u043e\u043c\u0430 \u043f\u043e\u043c\u0438\u043b\u043a\u0430 +session.connection.retry=\u0421\u043f\u0440\u043e\u0431\u0443\u0432\u0430\u0442\u0438 \u0437\u043d\u043e\u0432\u0443 +session.connection.warning.config=\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u0436\u0435\u043d\u043d\u044f \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u0457 + +session.empty.welcome=Kilo Code \u2014 \u0446\u0435 AI-\u0430\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0443\u0432\u0430\u043d\u043d\u044f. \u041f\u043e\u043f\u0440\u043e\u0441\u0456\u0442\u044c \u0439\u043e\u0433\u043e \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0456\u0457, \u0432\u0438\u043f\u0440\u0430\u0432\u0438\u0442\u0438 \u043f\u043e\u043c\u0438\u043b\u043a\u0438 \u0430\u0431\u043e \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u0438 \u0432\u0430\u0448 \u043a\u043e\u0434. +session.empty.loading=\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f\u2026 +session.empty.recent=\u041d\u0415\u0414\u0410\u0412\u041d\u0406 +session.showHistory=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0456\u0441\u0442\u043e\u0440\u0456\u044e +session.scroll.bottom=\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u0438 \u0434\u043e\u043d\u0438\u0437\u0443 +session.tab.new=\u041d\u043e\u0432\u0430 \u0441\u0435\u0441\u0456\u044f +session.tab.untitled=\u0421\u0435\u0441\u0456\u044f \u0431\u0435\u0437 \u043d\u0430\u0437\u0432\u0438 + +session.permission.title=\u0417\u0430\u043f\u0438\u0442 \u0434\u043e\u0437\u0432\u043e\u043b\u0443 +session.permission.meta=\u0406\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442: {0} \u2022 \u0428\u0430\u0431\u043b\u043e\u043d\u0438: {1} +session.permission.allow=\u0414\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0438 +session.permission.deny=\u0417\u0430\u0431\u043e\u0440\u043e\u043d\u0438\u0442\u0438 +session.question.dismiss=\u0417\u0430\u043a\u0440\u0438\u0442\u0438 + +session.status.considering=\u041e\u0431\u043c\u0456\u0440\u043a\u043e\u0432\u0443\u044e \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0456 \u043a\u0440\u043e\u043a\u0438\u2026 +session.status.thinking=\u041c\u0456\u0440\u043a\u0443\u044e\u2026 +session.status.writing=\u041f\u0438\u0448\u0443 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u044c\u2026 +session.status.delegating=\u0414\u0435\u043b\u0435\u0433\u0443\u044e \u0440\u043e\u0431\u043e\u0442\u0443\u2026 +session.status.planning=\u041f\u043b\u0430\u043d\u0443\u044e\u2026 +session.status.gathering=\u0417\u0431\u0438\u0440\u0430\u044e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u2026 +session.status.searching.codebase=\u0428\u0443\u043a\u0430\u044e \u0432 \u043a\u043e\u0434\u043e\u0432\u0456\u0439 \u0431\u0430\u0437\u0456\u2026 +session.status.searching.web=\u0428\u0443\u043a\u0430\u044e \u0432 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0456\u2026 +session.status.editing=\u0412\u043d\u043e\u0448\u0443 \u0437\u043c\u0456\u043d\u0438\u2026 +session.status.commands=\u0412\u0438\u043a\u043e\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0438\u2026 + +session.part.reasoning=\u041c\u0456\u0440\u043a\u0443\u0432\u0430\u043d\u043d\u044f +session.part.compaction=\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0442\u0438\u0441\u043d\u0443\u0442\u043e +session.part.tool.copy=\u041a\u043e\u043f\u0456\u044e\u0432\u0430\u0442\u0438 +session.part.tool.error=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 +session.part.tool.pending=\u041e\u0447\u0456\u043a\u0443\u0454\u0442\u044c\u0441\u044f +session.part.tool.read=\u0427\u0438\u0442\u0430\u043d\u043d\u044f +session.part.tool.running=\u0412\u0438\u043a\u043e\u043d\u0443\u0454\u0442\u044c\u0441\u044f +session.part.tool.shell=Shell +session.part.tool.truncated=\u0412\u0438\u0432\u0456\u0434 \u0443 \u043f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u044c\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434\u0456 \u0443\u0441\u0456\u0447\u0435\u043d\u043e. \u041f\u043e\u0432\u043d\u0438\u0439 \u0432\u0438\u0432\u0456\u0434 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u0438\u0445 \u0441\u0435\u0441\u0456\u0457. + +session.error.prompt=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437\u0430\u043f\u0438\u0442\u0443 +session.error.compact=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0441\u0442\u0438\u0441\u043d\u0435\u043d\u043d\u044f \u0441\u0435\u0441\u0456\u0457 +session.error.unknown=\u041d\u0435\u0432\u0456\u0434\u043e\u043c\u0430 \u043f\u043e\u043c\u0438\u043b\u043a\u0430 + +session.header.tokens=\u0422\u043e\u043a\u0435\u043d\u0438 +session.header.tokens.description=\u0422\u043e\u043a\u0435\u043d\u0438, \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0456 \u043e\u0441\u0442\u0430\u043d\u043d\u0456\u0439 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u434e\u044e \u0430\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430: \u0432\u0445\u0456\u0434, \u0432\u0438\u0445\u0456\u0434, \u0437\u0430\u043f\u0438\u0441 \u0443 \u043a\u0435\u0448 \u0456 \u0447\u0438\u0442\u0430\u043d\u043d\u044f \u0437 \u043a\u0435\u0448\u0443. +session.header.input=\u0432\u0445\u0456\u0434 {0} +session.header.output=\u0432\u0438\u0445\u0456\u0434 {0} +session.header.cache.write=\u0437\u0430\u043f\u0438\u0441 \u0443 \u043a\u0435\u0448 {0} +session.header.cache.read=\u0447\u0438\u0442\u0430\u043d\u043d\u044f \u0437 \u043a\u0435\u0448\u0443 {0} +session.header.compact=\u0421\u0442\u0438\u0441\u043d\u0443\u0442\u0438 \u0441\u0435\u0441\u0456\u044e +session.header.compact.description=\u0421\u0442\u0438\u0441\u043d\u0443\u0442\u0438 \u0441\u0435\u0441\u0456\u044e, \u0449\u043e\u0431 \u0437\u043c\u0435\u043d\u0448\u0438\u0442\u0438 \u0440\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 +session.header.expand=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u0435\u0441\u0456\u0457 +session.header.collapse=\u041f\u0440\u0438\u0445\u043e\u0432\u0430\u0442\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u0435\u0441\u0456\u0457 +session.header.todos.progress={0}/{1} \u0437\u0430\u0432\u0434\u0430\u043d\u044c \u0432\u0438\u043a\u043e\u043d\u0430\u043d\u043e +session.header.todos.done=\u0423\u0441\u0456 {0} \u0437\u0430\u0432\u0434\u0430\u043d\u044c \u0432\u0438\u043a\u043e\u043d\u0430\u043d\u043e +session.header.context.tooltip.percent={0} \u0442\u043e\u043a\u0435\u043d\u0456\u0432 ({1}% \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443) +session.header.context.tooltip.tokens={0} \u0442\u043e\u043a\u0435\u043d\u0456\u0432 +session.header.context.used={0} / {1} \u0442\u043e\u043a\u0435\u043d\u0456\u0432 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043e +session.header.context.reserved={0} \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u0432\u0438\u0445\u043e\u0434\u0443 +session.header.context.available={0} \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e + +prompt.placeholder=\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f\u2026 +prompt.placeholder.with.shortcuts=\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f\u2026 ({0} \u2014 \u043d\u0430\u0434\u0456\u0441\u043b\u0430\u0442\u0438, {1} \u2014 \u043d\u043e\u0432\u0438\u0439 \u0440\u044f\u0434\u043e\u043a) +prompt.placeholder.with.send=\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f\u2026 ({0} \u2014 \u043d\u0430\u0434\u0456\u0441\u043b\u0430\u0442\u0438) +prompt.placeholder.with.newline=\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f\u2026 ({0} \u2014 \u043d\u043e\u0432\u0438\u0439 \u0440\u044f\u0434\u043e\u043a) +prompt.button.send=\u041d\u0430\u0434\u0456\u0441\u043b\u0430\u0442\u0438 +prompt.button.stop=\u0417\u0443\u043f\u0438\u043d\u0438\u0442\u0438 +prompt.button.send.tooltip.stop=\u0429\u043e\u0431 \u0437\u0443\u043f\u0438\u043d\u0438\u0442\u0438, \u043d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c {0} +mode.picker.tooltip=\u041e\u0431\u0440\u0430\u0442\u0438 \u0440\u0435\u0436\u0438\u043c +mode.picker.deprecated=\u0437\u0430\u0441\u0442\u0430\u0440\u0456\u043b\u0438\u0439 +model.picker.tooltip=\u041e\u0431\u0440\u0430\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c +model.picker.recommended=\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u0456 +model.picker.favorites=\u0423\u043b\u044e\u0431\u043b\u0435\u043d\u0456 +model.picker.search=\u041f\u043e\u0448\u0443\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 +model.picker.no.matches=\u041d\u0435\u043c\u0430\u0454 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u043d\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 +model.picker.favorite.add=\u0414\u043e\u0434\u0430\u0442\u0438 \u0434\u043e \u0443\u043b\u044e\u0431\u043b\u0435\u043d\u0438\u0445 +model.picker.favorite.remove=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0437 \u0443\u043b\u044e\u0431\u043b\u0435\u043d\u0438\u0445 +model.picker.free=\u0411\u0435\u0437\u043a\u043e\u0448\u0442\u043e\u0432\u043d\u043e +model.picker.reset=\u0421\u043a\u0438\u043d\u0443\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0457 +reasoning.picker.tooltip=\u041e\u0431\u0440\u0430\u0442\u0438 \u0440\u0456\u0432\u0435\u043d\u044c \u043c\u0456\u0440\u043a\u0443\u0432\u0430\u043d\u043d\u044f + +history.tab.local=\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430 +history.tab.cloud=\u0425\u043c\u0430\u0440\u0430 +history.back=\u041d\u0430\u0437\u0430\u0434 +history.search.placeholder=\u041f\u043e\u0448\u0443\u043a \u0441\u0435\u0441\u0456\u0439 +history.empty=\u041d\u0435\u043c\u0430\u0454 \u0441\u0435\u0441\u0456\u0439 +history.loading=\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f\u2026 +history.untitled=\u0411\u0435\u0437 \u043d\u0430\u0437\u0432\u0438 +history.delete.text=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 +history.delete.confirm.title=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0441\u0435\u0441\u0456\u044e? +history.delete.confirm.message=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u00ab{0}\u00bb \u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0457 \u0456\u0441\u0442\u043e\u0440\u0456\u0457? +history.delete.confirm.message.multiple=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 {0} \u0441\u0435\u0441\u0456\u0439 \u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0457 \u0456\u0441\u0442\u043e\u0440\u0456\u0457? +history.rename.title=\u041f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0438 \u0441\u0435\u0441\u0456\u044e +history.rename.prompt=\u041d\u043e\u0432\u0430 \u043d\u0430\u0437\u0432\u0430 \u0441\u0435\u0441\u0456\u0457: +history.cloud.load.more=\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0431\u0456\u043b\u044c\u0448\u0435 +history.cloud.repo.only=\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0456\u0439 +history.group.today=\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 +history.group.yesterday=\u0412\u0447\u043e\u0440\u0430 +history.group.week=\u0426\u044c\u043e\u0433\u043e \u0442\u0438\u0436\u043d\u044f +history.group.month=\u0426\u044c\u043e\u0433\u043e \u043c\u0456\u0441\u044f\u0446\u044f +history.group.older=\u0421\u0442\u0430\u0440\u0456\u0448\u0435 +history.time.moments=\u0429\u043e\u0439\u043d\u043e +history.time.minutes={0} \u0445\u0432 \u0442\u043e\u043c\u0443 +history.time.hours={0} \u0433\u043e\u0434 \u0442\u043e\u043c\u0443 +history.time.days={0} \u0434\u043d \u0442\u043e\u043c\u0443 +history.time.months={0} \u043c\u0456\u0441 \u0442\u043e\u043c\u0443 +history.time.years={0} \u0440 \u0442\u043e\u043c\u0443 +history.error.local=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0457 \u0456\u0441\u0442\u043e\u0440\u0456\u0457 +history.error.cloud=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u0445\u043c\u0430\u0440\u043d\u043e\u0457 \u0456\u0441\u0442\u043e\u0440\u0456\u0457 +history.error.local.delete=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0432\u0438\u0434\u0430\u043b\u0435\u043d\u043d\u044f \u0441\u0435\u0441\u0456\u0457 +history.error.local.rename=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u043f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u0435\u0441\u0456\u0457 +history.error.cloud.delete=\u0425\u043c\u0430\u0440\u043d\u0456 \u0441\u0435\u0441\u0456\u0457 \u043f\u043e\u043a\u0438 \u043d\u0435 \u043c\u043e\u0436\u043d\u0430 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 + +action.Kilo.Settings.text=\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f +action.Kilo.Settings.description=\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f Kilo Code +action.Kilo.NewSession.text=\u041d\u043e\u0432\u0430 \u0441\u0435\u0441\u0456\u044f +action.Kilo.NewSession.description=\u0420\u043e\u0437\u043f\u043e\u0447\u0430\u0442\u0438 \u043d\u043e\u0432\u0443 \u0441\u0435\u0441\u0456\u044e Kilo +action.Kilo.History.text=\u0406\u0441\u0442\u043e\u0440\u0456\u044f +action.Kilo.History.description=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0456\u0441\u0442\u043e\u0440\u0456\u044e \u0441\u0435\u0441\u0456\u0439 +action.Kilo.SendPrompt.text=\u041d\u0430\u0434\u0456\u0441\u043b\u0430\u0442\u0438 \u0437\u0430\u043f\u0438\u0442 +action.Kilo.SendPrompt.description=\u041d\u0430\u0434\u0456\u0441\u043b\u0430\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u0437\u0430\u043f\u0438\u0442 Kilo +action.Kilo.StopSession.text=\u0417\u0443\u043f\u0438\u043d\u0438\u0442\u0438 \u0441\u0435\u0441\u0456\u044e +action.Kilo.StopSession.description=\u0417\u0443\u043f\u0438\u043d\u0438\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0443 \u0441\u0435\u0441\u0456\u044e Kilo +action.Kilo.SettingsGroup.text=\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f +action.Kilo.SettingsGroup.description=\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f Kilo Code +action.Kilo.Restart.text=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438 Kilo +action.Kilo.Restart.description=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0438 \u0456 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438 CLI-\u043f\u0440\u043e\u0446\u0435\u0441 +action.Kilo.Reinstall.text=\u041f\u0435\u0440\u0435\u0432\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 Kilo +action.Kilo.Reinstall.description=\u041f\u0435\u0440\u0435\u0440\u043e\u0437\u043f\u0430\u043a\u0443\u0432\u0430\u0442\u0438 CLI-\u0431\u0456\u043d\u0430\u0440\u043d\u0438\u0439 \u0444\u0430\u0439\u043b \u0456 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438 +action.Kilo.Session.Open.text=\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 +action.Kilo.Session.Open.description=\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043d\u0443 \u0441\u0435\u0441\u0456\u044e +action.Kilo.Session.Rename.text=\u041f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0438 +action.Kilo.Session.Rename.description=\u041f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043d\u0443 \u0441\u0435\u0441\u0456\u044e +action.Kilo.Session.Delete.text=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 +action.Kilo.Session.Delete.description=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043d\u0443(-\u0456) \u0441\u0435\u0441\u0456\u044e(-\u0457) +action.Kilo.History.ContextMenu.text=\u0414\u0456\u0457 \u0437 \u0456\u0441\u0442\u043e\u0440\u0456\u0454\u044e diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_CN.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_CN.properties new file mode 100644 index 00000000000..4b2ef4a9acc --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_CN.properties @@ -0,0 +1,139 @@ +session.connection.connecting=\u52a0\u8f7d\u4e2d\u2026 +session.connection.error.app=\u8fde\u63a5\u5931\u8d25 +session.connection.error.workspace=\u5de5\u4f5c\u533a\u52a0\u8f7d\u5931\u8d25 +session.connection.error.unknown=\u672a\u77e5\u9519\u8bef +session.connection.retry=\u91cd\u8bd5 +session.connection.warning.config=\u914d\u7f6e\u8b66\u544a + +session.empty.welcome=Kilo Code \u662f\u4e00\u4e2a AI \u7f16\u7a0b\u52a9\u624b\u3002\u53ef\u8bf7\u5b83\u6784\u5efa\u529f\u80fd\u3001\u4fee\u590d\u9519\u8bef\u6216\u89e3\u91ca\u60a8\u7684\u4ee3\u7801\u5e93\u3002 +session.empty.loading=\u52a0\u8f7d\u4e2d\u2026 +session.empty.recent=\u6700\u8fd1 +session.showHistory=\u663e\u793a\u5386\u53f2 +session.scroll.bottom=\u6eda\u52a8\u5230\u5e95\u90e8 +session.tab.new=\u65b0\u5efa\u4f1a\u8bdd +session.tab.untitled=\u65e0\u6807\u9898\u4f1a\u8bdd + +session.permission.title=\u6743\u9650\u8bf7\u6c42 +session.permission.meta=\u5de5\u5177\uff1a{0} \u2022 \u6a21\u5f0f\uff1a{1} +session.permission.allow=\u5141\u8bb8 +session.permission.deny=\u62d2\u7edd +session.question.dismiss=\u5173\u95ed + +session.status.considering=\u6b63\u5728\u8003\u8651\u4e0b\u4e00\u6b65\u2026 +session.status.thinking=\u601d\u8003\u4e2d\u2026 +session.status.writing=\u6b63\u5728\u7f16\u5199\u56de\u590d\u2026 +session.status.delegating=\u6b63\u5728\u59d4\u6d3e\u5de5\u4f5c\u2026 +session.status.planning=\u89c4\u5212\u4e2d\u2026 +session.status.gathering=\u6536\u96c6\u4e0a\u4e0b\u6587\u2026 +session.status.searching.codebase=\u641c\u7d22\u4ee3\u7801\u5e93\u2026 +session.status.searching.web=\u641c\u7d22\u7f51\u9875\u2026 +session.status.editing=\u6b63\u5728\u7f16\u8f91\u2026 +session.status.commands=\u8fd0\u884c\u547d\u4ee4\u2026 + +session.part.reasoning=\u63a8\u7406 +session.part.compaction=\u4e0a\u4e0b\u6587\u5df2\u538b\u7f29 +session.part.tool.copy=\u590d\u5236 +session.part.tool.error=\u9519\u8bef +session.part.tool.pending=\u5f85\u5904\u7406 +session.part.tool.read=\u8bfb\u53d6 +session.part.tool.running=\u8fd0\u884c\u4e2d +session.part.tool.shell=Shell +session.part.tool.truncated=\u9884\u89c8\u4e2d\u7684\u8f93\u51fa\u5df2\u622a\u65ad\u3002\u5b8c\u6574\u8f93\u51fa\u4ecd\u4fdd\u7559\u5728\u4f1a\u8bdd\u6570\u636e\u4e2d\u3002 + +session.error.prompt=\u63d0\u793a\u5931\u8d25 +session.error.compact=\u4f1a\u8bdd\u538b\u7f29\u5931\u8d25 +session.error.unknown=\u672a\u77e5\u9519\u8bef + +session.header.tokens=\u4ee4\u724c +session.header.tokens.description=\u6700\u8fd1\u4e00\u6b21\u52a9\u624b\u56de\u590d\u4e2d\u4f7f\u7528\u7684\u4ee4\u724c\uff1a\u8f93\u5165\u3001\u8f93\u51fa\u3001\u7f13\u5b58\u5199\u5165\u548c\u7f13\u5b58\u8bfb\u53d6\u3002 +session.header.input=\u8f93\u5165 {0} +session.header.output=\u8f93\u51fa {0} +session.header.cache.write=\u7f13\u5b58\u5199\u5165 {0} +session.header.cache.read=\u7f13\u5b58\u8bfb\u53d6 {0} +session.header.compact=\u538b\u7f29\u4f1a\u8bdd +session.header.compact.description=\u6c47\u603b\u4f1a\u8bdd\u4ee5\u51cf\u5c11\u4e0a\u4e0b\u6587\u5927\u5c0f +session.header.expand=\u663e\u793a\u4f1a\u8bdd\u6307\u6807 +session.header.collapse=\u9690\u85cf\u4f1a\u8bdd\u6307\u6807 +session.header.todos.progress={0}/{1} \u4e2a\u4efb\u52a1\u5df2\u5b8c\u6210 +session.header.todos.done=\u5168\u90e8 {0} \u4e2a\u4efb\u52a1\u5df2\u5b8c\u6210 +session.header.context.tooltip.percent={0} \u4ee4\u724c\uff08\u4e0a\u4e0b\u6587\u7684 {1}%\uff09 +session.header.context.tooltip.tokens={0} \u4ee4\u724c +session.header.context.used=\u5df2\u4f7f\u7528 {0} / {1} \u4ee4\u724c +session.header.context.reserved={0} \u4e3a\u8f93\u51fa\u9884\u7559 +session.header.context.available={0} \u53ef\u7528 + +prompt.placeholder=\u8f93\u5165\u6d88\u606f\u2026 +prompt.placeholder.with.shortcuts=\u8f93\u5165\u6d88\u606f\u2026\uff08{0} \u53d1\u9001\uff0c{1} \u6362\u884c\uff09 +prompt.placeholder.with.send=\u8f93\u5165\u6d88\u606f\u2026\uff08{0} \u53d1\u9001\uff09 +prompt.placeholder.with.newline=\u8f93\u5165\u6d88\u606f\u2026\uff08{0} \u6362\u884c\uff09 +prompt.button.send=\u53d1\u9001 +prompt.button.stop=\u505c\u6b62 +prompt.button.send.tooltip.stop=\u6309 {0} \u505c\u6b62 +mode.picker.tooltip=\u9009\u62e9\u6a21\u5f0f +mode.picker.deprecated=\u5df2\u5f03\u7528 +model.picker.tooltip=\u9009\u62e9\u6a21\u578b +model.picker.recommended=\u63a8\u8350 +model.picker.favorites=\u6536\u85cf\u5939 +model.picker.search=\u641c\u7d22\u6a21\u578b +model.picker.no.matches=\u65e0\u5339\u914d\u6a21\u578b +model.picker.favorite.add=\u6dfb\u52a0\u5230\u6536\u85cf\u5939 +model.picker.favorite.remove=\u4ece\u6536\u85cf\u5939\u79fb\u9664 +model.picker.free=\u514d\u8d39 +model.picker.reset=\u91cd\u7f6e\u6a21\u578b\u4e3a\u9ed8\u8ba4 +reasoning.picker.tooltip=\u9009\u62e9\u63a8\u7406\u529b\u5ea6 + +history.tab.local=\u672c\u5730 +history.tab.cloud=\u4e91\u7aef +history.back=\u8fd4\u56de +history.search.placeholder=\u641c\u7d22\u4f1a\u8bdd +history.empty=\u6682\u65e0\u4f1a\u8bdd +history.loading=\u52a0\u8f7d\u4e2d\u2026 +history.untitled=\u65e0\u6807\u9898 +history.delete.text=\u5220\u9664 +history.delete.confirm.title=\u5220\u9664\u4f1a\u8bdd\uff1f +history.delete.confirm.message=\u4ece\u672c\u5730\u5386\u53f2\u4e2d\u5220\u9664\u201c{0}\u201d\uff1f +history.delete.confirm.message.multiple=\u4ece\u672c\u5730\u5386\u53f2\u4e2d\u5220\u9664 {0} \u4e2a\u4f1a\u8bdd\uff1f +history.rename.title=\u91cd\u547d\u540d\u4f1a\u8bdd +history.rename.prompt=\u65b0\u4f1a\u8bdd\u540d\u79f0\uff1a +history.cloud.load.more=\u52a0\u8f7d\u66f4\u591a +history.cloud.repo.only=\u4ec5\u6b64\u4ed3\u5e93 +history.group.today=\u4eca\u5929 +history.group.yesterday=\u6628\u5929 +history.group.week=\u672c\u5468 +history.group.month=\u672c\u6708 +history.group.older=\u66f4\u65e9\u4ee5\u524d +history.time.moments=\u521a\u521a +history.time.minutes={0} \u5206\u949f\u524d +history.time.hours={0} \u5c0f\u65f6\u524d +history.time.days={0} \u5929\u524d +history.time.months={0} \u4e2a\u6708\u524d +history.time.years={0} \u5e74\u524d +history.error.local=\u65e0\u6cd5\u52a0\u8f7d\u672c\u5730\u5386\u53f2 +history.error.cloud=\u65e0\u6cd5\u52a0\u8f7d\u4e91\u7aef\u5386\u53f2 +history.error.local.delete=\u5220\u9664\u4f1a\u8bdd\u5931\u8d25 +history.error.local.rename=\u91cd\u547d\u540d\u4f1a\u8bdd\u5931\u8d25 +history.error.cloud.delete=\u4e91\u7aef\u4f1a\u8bdd\u6682\u65e0\u6cd5\u5220\u9664 + +action.Kilo.Settings.text=\u8bbe\u7f6e +action.Kilo.Settings.description=Kilo Code \u8bbe\u7f6e +action.Kilo.NewSession.text=\u65b0\u5efa\u4f1a\u8bdd +action.Kilo.NewSession.description=\u5f00\u59cb\u65b0\u7684 Kilo \u4f1a\u8bdd +action.Kilo.History.text=\u5386\u53f2 +action.Kilo.History.description=\u663e\u793a\u4f1a\u8bdd\u5386\u53f2 +action.Kilo.SendPrompt.text=\u53d1\u9001\u63d0\u793a +action.Kilo.SendPrompt.description=\u53d1\u9001\u5f53\u524d Kilo \u63d0\u793a +action.Kilo.StopSession.text=\u505c\u6b62\u4f1a\u8bdd +action.Kilo.StopSession.description=\u505c\u6b62\u5f53\u524d Kilo \u4f1a\u8bdd +action.Kilo.SettingsGroup.text=\u8bbe\u7f6e +action.Kilo.SettingsGroup.description=Kilo Code \u8bbe\u7f6e +action.Kilo.Restart.text=\u91cd\u542f Kilo +action.Kilo.Restart.description=\u7ec8\u6b62\u5e76\u91cd\u542f CLI \u8fdb\u7a0b +action.Kilo.Reinstall.text=\u91cd\u65b0\u5b89\u88c5 Kilo +action.Kilo.Reinstall.description=\u91cd\u65b0\u89e3\u538b CLI \u4e8c\u8fdb\u5236\u6587\u4ef6\u5e76\u91cd\u542f +action.Kilo.Session.Open.text=\u6253\u5f00 +action.Kilo.Session.Open.description=\u6253\u5f00\u6240\u9009\u4f1a\u8bdd +action.Kilo.Session.Rename.text=\u91cd\u547d\u540d +action.Kilo.Session.Rename.description=\u91cd\u547d\u540d\u6240\u9009\u4f1a\u8bdd +action.Kilo.Session.Delete.text=\u5220\u9664 +action.Kilo.Session.Delete.description=\u5220\u9664\u6240\u9009\u4f1a\u8bdd +action.Kilo.History.ContextMenu.text=\u5386\u53f2\u64cd\u4f5c diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_TW.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_TW.properties new file mode 100644 index 00000000000..3344f6431ce --- /dev/null +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_TW.properties @@ -0,0 +1,139 @@ +session.connection.connecting=\u8f09\u5165\u4e2d\u2026 +session.connection.error.app=\u9023\u7dda\u5931\u6557 +session.connection.error.workspace=\u5de5\u4f5c\u5340\u8f09\u5165\u5931\u6557 +session.connection.error.unknown=\u672a\u77e5\u9810\u8a2d +session.connection.retry=\u91cd\u8a66 +session.connection.warning.config=\u8a2d\u5b9a\u8b66\u544a + +session.empty.welcome=Kilo Code \u662f AI \u7a0b\u5f0f\u8f14\u52a9\u3002\u53ef\u8acb\u5b83\u5efa\u7f6e\u529f\u80fd\u3001\u4fee\u5fa9\u932f\u8aa4\u6216\u89e3\u91cb\u60a8\u7684\u7a0b\u5f0f\u7a0b\u5f0f\u5eab\u3002 +session.empty.loading=\u8f09\u5165\u4e2d\u2026 +session.empty.recent=\u6700\u8fd1 +session.showHistory=\u986f\u793a\u6b77\u53f2 +session.scroll.bottom=\u6efe\u52d5\u5230\u5e95\u90e8 +session.tab.new=\u65b0\u5efa\u5de5\u4f5c\u968e\u6bb5 +session.tab.untitled=\u672a\u547d\u540d\u7684\u5de5\u4f5c\u968e\u6bb5 + +session.permission.title=\u6b0a\u9650\u8acb\u6c42 +session.permission.meta=\u5de5\u5177\uff1a{0} \u2022 \u6a23\u5f0f\uff1a{1} +session.permission.allow=\u5141\u8a31 +session.permission.deny=\u62d2\u7d55 +session.question.dismiss=\u95dc\u9589 + +session.status.considering=\u8003\u616e\u4e0b\u4e00\u6b65\u2026 +session.status.thinking=\u601d\u8003\u4e2d\u2026 +session.status.writing=\u6b63\u5728\u64b0\u5beb\u56de\u8986\u2026 +session.status.delegating=\u6b63\u5728\u59d4\u6d3e\u5de5\u4f5c\u2026 +session.status.planning=\u8a08\u5283\u4e2d\u2026 +session.status.gathering=\u6536\u96c6\u4e0a\u4e0b\u6587\u2026 +session.status.searching.codebase=\u641c\u5c0b\u7a0b\u5f0f\u7a0b\u5f0f\u5eab\u2026 +session.status.searching.web=\u641c\u5c0b\u7db2\u9801\u2026 +session.status.editing=\u9032\u884c\u7de8\u8f2f\u2026 +session.status.commands=\u57f7\u884c\u6307\u4ee4\u2026 + +session.part.reasoning=\u63a8\u7406 +session.part.compaction=\u4e0a\u4e0b\u6587\u5df2\u58d3\u7e2e +session.part.tool.copy=\u8907\u88fd +session.part.tool.error=\u932f\u8aa4 +session.part.tool.pending=\u5f85\u8655\u7406 +session.part.tool.read=\u8b80\u53d6 +session.part.tool.running=\u57f7\u884c\u4e2d +session.part.tool.shell=Shell +session.part.tool.truncated=\u9810\u89bd\u4e2d\u7684\u8f38\u51fa\u5df2\u622a\u65b7\u3002\u5b8c\u6574\u8f38\u51fa\u4ecd\u4fdd\u7559\u5728\u5de5\u4f5c\u968e\u6bb5\u8cc7\u6599\u4e2d\u3002 + +session.error.prompt=\u63d0\u793a\u5931\u6557 +session.error.compact=\u5de5\u4f5c\u968e\u6bb5\u58d3\u7e2e\u5931\u6557 +session.error.unknown=\u672a\u77e5\u932f\u8aa4 + +session.header.tokens=\u8a18\u865f +session.header.tokens.description=\u6700\u65b0\u52a9\u624b\u56de\u8986\u4f7f\u7528\u7684\u8a18\u865f\uff1a\u8f38\u5165\u3001\u8f38\u51fa\u3001\u5feb\u53d6\u5beb\u5165\u548c\u5feb\u53d6\u8b80\u53d6\u3002 +session.header.input=\u8f38\u5165 {0} +session.header.output=\u8f38\u51fa {0} +session.header.cache.write=\u5feb\u53d6\u5beb\u5165 {0} +session.header.cache.read=\u5feb\u53d6\u8b80\u53d6 {0} +session.header.compact=\u58d3\u7e2e\u5de5\u4f5c\u968e\u6bb5 +session.header.compact.description=\u6458\u8981\u5de5\u4f5c\u968e\u6bb5\u4ee5\u6e1b\u5c11\u4e0a\u4e0b\u6587\u5927\u5c0f +session.header.expand=\u986f\u793a\u5de5\u4f5c\u968e\u6bb5\u5ea6\u91cf +session.header.collapse=\u96b1\u85cf\u5de5\u4f5c\u968e\u6bb5\u5ea6\u91cf +session.header.todos.progress={0}/{1} \u500b\u5f85\u8fa6\u4e8b\u9805\u5df2\u5b8c\u6210 +session.header.todos.done=\u5168\u90e8 {0} \u500b\u5f85\u8fa6\u4e8b\u9805\u5df2\u5b8c\u6210 +session.header.context.tooltip.percent={0} \u8a18\u865f\uff08\u4e0a\u4e0b\u6587\u7684 {1}%\uff09 +session.header.context.tooltip.tokens={0} \u8a18\u865f +session.header.context.used=\u5df2\u4f7f\u7528 {0} / {1} \u8a18\u865f +session.header.context.reserved={0} \u70ba\u8f38\u51fa\u9810\u7559 +session.header.context.available={0} \u53ef\u7528 + +prompt.placeholder=\u8f38\u5165\u8a0a\u606f\u2026 +prompt.placeholder.with.shortcuts=\u8f38\u5165\u8a0a\u606f\u2026\uff08{0} \u767c\u9001\uff0c{1} \u63db\u884c\uff09 +prompt.placeholder.with.send=\u8f38\u5165\u8a0a\u606f\u2026\uff08{0} \u767c\u9001\uff09 +prompt.placeholder.with.newline=\u8f38\u5165\u8a0a\u606f\u2026\uff08{0} \u63db\u884c\uff09 +prompt.button.send=\u767c\u9001 +prompt.button.stop=\u505c\u6b62 +prompt.button.send.tooltip.stop=\u6309 {0} \u505c\u6b62 +mode.picker.tooltip=\u9078\u64c7\u6a21\u5f0f +mode.picker.deprecated=\u5df2\u68c4\u7528 +model.picker.tooltip=\u9078\u64c7\u6a21\u578b +model.picker.recommended=\u63a8\u85a6 +model.picker.favorites=\u6536\u85cf\u593e +model.picker.search=\u641c\u5c0b\u6a21\u578b +model.picker.no.matches=\u7121\u5339\u914d\u6a21\u578b +model.picker.favorite.add=\u65b0\u589e\u81f3\u6536\u85cf\u593e +model.picker.favorite.remove=\u5f9e\u6536\u85cf\u593e\u79fb\u9664 +model.picker.free=\u514d\u8cbb +model.picker.reset=\u91cd\u8a2d\u6a21\u578b\u70ba\u9810\u8a2d +reasoning.picker.tooltip=\u9078\u64c7\u63a8\u7406\u529b\u5ea6 + +history.tab.local=\u672c\u6a5f +history.tab.cloud=\u96f2\u7aef +history.back=\u8fd4\u56de +history.search.placeholder=\u641c\u5c0b\u5de5\u4f5c\u968e\u6bb5 +history.empty=\u7121\u5de5\u4f5c\u968e\u6bb5 +history.loading=\u8f09\u5165\u4e2d\u2026 +history.untitled=\u672a\u547d\u540d +history.delete.text=\u522a\u9664 +history.delete.confirm.title=\u522a\u9664\u5de5\u4f5c\u968e\u6bb5\uff1f +history.delete.confirm.message=\u5f9e\u672c\u6a5f\u6b77\u53f2\u4e2d\u522a\u9664\u300c{0}\u300d\uff1f +history.delete.confirm.message.multiple=\u5f9e\u672c\u6a5f\u6b77\u53f2\u4e2d\u522a\u9664 {0} \u500b\u5de5\u4f5c\u968e\u6bb5\uff1f +history.rename.title=\u91cd\u547d\u540d\u5de5\u4f5c\u968e\u6bb5 +history.rename.prompt=\u65b0\u5de5\u4f5c\u968e\u6bb5\u540d\u7a31\uff1a +history.cloud.load.more=\u8f09\u5165\u66f4\u591a +history.cloud.repo.only=\u50c5\u6b64\u5132\u5b58\u5eab +history.group.today=\u4eca\u5929 +history.group.yesterday=\u6628\u5929 +history.group.week=\u672c\u9031 +history.group.month=\u672c\u6708 +history.group.older=\u66f4\u65e9\u4ee5\u524d +history.time.moments=\u525b\u525b +history.time.minutes={0} \u5206\u9418\u524d +history.time.hours={0} \u5c0f\u6642\u524d +history.time.days={0} \u5929\u524d +history.time.months={0} \u500b\u6708\u524d +history.time.years={0} \u5e74\u524d +history.error.local=\u7121\u6cd5\u8f09\u5165\u672c\u6a5f\u6b77\u53f2 +history.error.cloud=\u7121\u6cd5\u8f09\u5165\u96f2\u7aef\u6b77\u53f2 +history.error.local.delete=\u522a\u9664\u5de5\u4f5c\u968e\u6bb5\u5931\u6557 +history.error.local.rename=\u91cd\u547d\u540d\u5de5\u4f5c\u968e\u6bb5\u5931\u6557 +history.error.cloud.delete=\u96f2\u7aef\u5de5\u4f5c\u968e\u6bb5\u66ab\u6642\u7121\u6cd5\u522a\u9664 + +action.Kilo.Settings.text=\u8a2d\u5b9a +action.Kilo.Settings.description=Kilo Code \u8a2d\u5b9a +action.Kilo.NewSession.text=\u65b0\u5efa\u5de5\u4f5c\u968e\u6bb5 +action.Kilo.NewSession.description=\u958b\u59cb\u65b0\u7684 Kilo \u5de5\u4f5c\u968e\u6bb5 +action.Kilo.History.text=\u6b77\u53f2 +action.Kilo.History.description=\u986f\u793a\u5de5\u4f5c\u968e\u6bb5\u6b77\u53f2 +action.Kilo.SendPrompt.text=\u767c\u9001\u63d0\u793a +action.Kilo.SendPrompt.description=\u767c\u9001\u76ee\u524d\u7684 Kilo \u63d0\u793a +action.Kilo.StopSession.text=\u505c\u6b62\u5de5\u4f5c\u968e\u6bb5 +action.Kilo.StopSession.description=\u505c\u6b62\u76ee\u524d\u7684 Kilo \u5de5\u4f5c\u968e\u6bb5 +action.Kilo.SettingsGroup.text=\u8a2d\u5b9a +action.Kilo.SettingsGroup.description=Kilo Code \u8a2d\u5b9a +action.Kilo.Restart.text=\u91cd\u555f Kilo +action.Kilo.Restart.description=\u7d42\u6b62\u4e26\u91cd\u555f CLI \u7a0b\u5e8f +action.Kilo.Reinstall.text=\u91cd\u65b0\u5b89\u88dd Kilo +action.Kilo.Reinstall.description=\u91cd\u65b0\u89e3\u58d3\u7e2e CLI \u4e8c\u9032\u4f4d\u6a94\u6848\u4e26\u91cd\u555f +action.Kilo.Session.Open.text=\u958b\u555f +action.Kilo.Session.Open.description=\u958b\u555f\u6240\u9078\u5de5\u4f5c\u968e\u6bb5 +action.Kilo.Session.Rename.text=\u91cd\u547d\u540d +action.Kilo.Session.Rename.description=\u91cd\u547d\u540d\u6240\u9078\u5de5\u4f5c\u968e\u6bb5 +action.Kilo.Session.Delete.text=\u522a\u9664 +action.Kilo.Session.Delete.description=\u522a\u9664\u6240\u9078\u5de5\u4f5c\u968e\u6bb5 +action.Kilo.History.ContextMenu.text=\u6b77\u53f2\u64cd\u4f5c From 19988ccaae5d0eb9162dc14df139564160bb0ce9 Mon Sep 17 00:00:00 2001 From: kirillk Date: Wed, 13 May 2026 16:01:07 -0400 Subject: [PATCH 5/6] fix(jetbrains): harden cloud history git remote lookup --- .../client/session/history/GitRemoteUrl.kt | 21 ++++++++++++--- .../session/history/HistoryController.kt | 26 ++++++++++++++----- .../session/history/HistoryControllerTest.kt | 18 +++++++++++++ 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/GitRemoteUrl.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/GitRemoteUrl.kt index ad614060638..7093a5008b3 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/GitRemoteUrl.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/GitRemoteUrl.kt @@ -1,5 +1,9 @@ package ai.kilocode.client.session.history +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.TimeUnit + /** * Resolves the origin remote URL for a given directory by running * `git remote get-url origin` as a subprocess. @@ -11,9 +15,20 @@ package ai.kilocode.client.session.history */ internal fun resolveGitRemoteUrl(dir: String): String? = runCatching { val proc = ProcessBuilder("git", "remote", "get-url", "origin") - .directory(java.io.File(dir)) + .directory(File(dir)) + .redirectErrorStream(true) .start() - val out = proc.inputStream.bufferedReader().readText().trim() - val code = proc.waitFor() + + val text = CompletableFuture.supplyAsync { + proc.inputStream.bufferedReader().use { it.readText() } + } + val done = proc.waitFor(5, TimeUnit.SECONDS) + if (!done) { + proc.destroyForcibly() + return@runCatching null + } + + val out = text.get(1, TimeUnit.SECONDS).trim() + val code = proc.exitValue() if (code == 0 && out.isNotEmpty()) out else null }.getOrNull() diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt index 3fed465de6f..d4b6165e4d5 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/history/HistoryController.kt @@ -8,7 +8,11 @@ import ai.kilocode.rpc.dto.CloudSessionDto import ai.kilocode.rpc.dto.SessionDto import com.intellij.openapi.application.ApplicationManager import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext class HistoryController( private val sessions: KiloSessionService, @@ -30,6 +34,10 @@ class HistoryController( var gitUrl: String? = null private set + @Volatile + private var resolved = false + private val lock = Mutex() + /** Whether to filter cloud history by the current repository. */ var repoOnly: Boolean = false private set @@ -151,14 +159,18 @@ class HistoryController( * propagates state updates to EDT via [edt]. */ private suspend fun resolveUrlIfNeeded(): String? { - if (gitUrl != null) return gitUrl - val url = kotlinx.coroutines.withContext(kotlinx.coroutines.Dispatchers.IO) { - gitUrlProvider() + if (resolved) return gitUrl + return lock.withLock { + if (resolved) return@withLock gitUrl + val url = withContext(Dispatchers.IO) { + gitUrlProvider() + } + // Write gitUrl directly (volatile) so it is visible before EDT callbacks fire. + gitUrl = url + resolved = true + if (url != null) updateRepoOnly(true) + url } - // Write gitUrl directly (volatile) so it is visible before EDT callbacks fire. - gitUrl = url - if (url != null) updateRepoOnly(true) - return url } } diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt index 2f9d3cb960d..7cddaef3a4d 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/history/HistoryControllerTest.kt @@ -27,6 +27,7 @@ import java.awt.Cursor import java.awt.event.KeyEvent import java.time.Instant import java.time.temporal.ChronoUnit +import java.util.concurrent.atomic.AtomicInteger import javax.swing.JComponent import javax.swing.KeyStroke import javax.swing.event.ListDataEvent @@ -573,6 +574,23 @@ class HistoryControllerTest : BasePlatformTestCase() { assertNull(controller.gitUrl) } + fun `test cloud git url resolves once across overlapping reloads`() { + rpc.cloud += cloud("cloud_1", "Cloud One") + val calls = AtomicInteger() + val controller = HistoryController(sessions, workspace, scope, gitUrlProvider = { + calls.incrementAndGet() + Thread.sleep(100) + "git@github.com:test/repo.git" + }) + + controller.reloadCloud() + controller.reloadCloud() + flush() + + assertEquals(1, calls.get()) + assertEquals(2, rpc.cloudCalls.size) + } + fun `test cloud load passes null when repo only disabled`() { rpc.cloud += cloud("cloud_1", "Cloud One") val url = "git@github.com:test/repo.git" From d649e2496af2282ec3d2392343dab76e02654f19 Mon Sep 17 00:00:00 2001 From: kirillk Date: Wed, 13 May 2026 16:28:41 -0400 Subject: [PATCH 6/6] chore(jetbrains): decode locale bundle unicode escapes --- .../resources/messages/KiloBundle.properties | 22 +- .../messages/KiloBundle_ar.properties | 258 ++++++++--------- .../messages/KiloBundle_bs.properties | 116 ++++---- .../messages/KiloBundle_da.properties | 102 +++---- .../messages/KiloBundle_de.properties | 92 +++---- .../messages/KiloBundle_es.properties | 114 ++++---- .../messages/KiloBundle_fr.properties | 152 +++++----- .../messages/KiloBundle_ja.properties | 260 +++++++++--------- .../messages/KiloBundle_ko.properties | 260 +++++++++--------- .../messages/KiloBundle_nl.properties | 40 +-- .../messages/KiloBundle_no.properties | 130 ++++----- .../messages/KiloBundle_pl.properties | 130 ++++----- .../messages/KiloBundle_pt_BR.properties | 152 +++++----- .../messages/KiloBundle_ru.properties | 258 ++++++++--------- .../messages/KiloBundle_th.properties | 258 ++++++++--------- .../messages/KiloBundle_tr.properties | 188 ++++++------- .../messages/KiloBundle_uk.properties | 258 ++++++++--------- .../messages/KiloBundle_zh_CN.properties | 258 ++++++++--------- .../messages/KiloBundle_zh_TW.properties | 258 ++++++++--------- 19 files changed, 1653 insertions(+), 1653 deletions(-) diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties index 298028014b7..4277f72e785 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties @@ -14,21 +14,21 @@ session.tab.new=New Session session.tab.untitled=Untitled Session session.permission.title=Permission request -session.permission.meta=Tool: {0} \u2022 Patterns: {1} +session.permission.meta=Tool: {0} • Patterns: {1} session.permission.allow=Allow session.permission.deny=Deny session.question.dismiss=Dismiss -session.status.considering=Considering next steps\u2026 -session.status.thinking=Thinking\u2026 -session.status.writing=Writing response\u2026 -session.status.delegating=Delegating work\u2026 -session.status.planning=Planning\u2026 -session.status.gathering=Gathering context\u2026 -session.status.searching.codebase=Searching codebase\u2026 -session.status.searching.web=Searching web\u2026 -session.status.editing=Making edits\u2026 -session.status.commands=Running commands\u2026 +session.status.considering=Considering next steps… +session.status.thinking=Thinking… +session.status.writing=Writing response… +session.status.delegating=Delegating work… +session.status.planning=Planning… +session.status.gathering=Gathering context… +session.status.searching.codebase=Searching codebase… +session.status.searching.web=Searching web… +session.status.editing=Making edits… +session.status.commands=Running commands… session.part.reasoning=Reasoning session.part.compaction=context compacted diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ar.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ar.properties index acf55ee1378..9cb9ee73187 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ar.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ar.properties @@ -1,139 +1,139 @@ -session.connection.connecting=\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644\u2026 -session.connection.error.app=\u0641\u0634\u0644 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 -session.connection.error.workspace=\u0641\u0634\u0644 \u062a\u062d\u0645\u064a\u0644 \u0645\u0633\u0627\u062d\u0629 \u0627\u0644\u0639\u0645\u0644 -session.connection.error.unknown=\u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641 -session.connection.retry=\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 -session.connection.warning.config=\u062a\u062d\u0630\u064a\u0631\u0627\u062a \u0627\u0644\u062a\u0643\u0648\u064a\u0646 +session.connection.connecting=جاري التحميل… +session.connection.error.app=فشل الاتصال +session.connection.error.workspace=فشل تحميل مساحة العمل +session.connection.error.unknown=خطأ غير معروف +session.connection.retry=إعادة المحاولة +session.connection.warning.config=تحذيرات التكوين -session.empty.welcome=Kilo Code \u0647\u0648 \u0645\u0633\u0627\u0639\u062f \u0628\u0631\u0645\u062c\u0629 \u0628\u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a. \u0627\u0637\u0644\u0628 \u0645\u0646\u0647 \u0628\u0646\u0627\u0621 \u0645\u064a\u0632\u0627\u062a \u0623\u0648 \u0625\u0635\u0644\u0627\u062d \u0623\u062e\u0637\u0627\u0621 \u0623\u0648 \u0634\u0631\u062d \u0642\u0627\u0639\u062f\u0629 \u0627\u0644\u0643\u0648\u062f. -session.empty.loading=\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644\u2026 -session.empty.recent=\u0627\u0644\u062d\u062f\u064a\u062b\u0629 -session.showHistory=\u0639\u0631\u0636 \u0627\u0644\u0633\u062c\u0644 -session.scroll.bottom=\u0627\u0644\u062a\u0645\u0631\u064a\u0631 \u0625\u0644\u0649 \u0627\u0644\u0623\u0633\u0641\u0644 -session.tab.new=\u062c\u0644\u0633\u0629 \u062c\u062f\u064a\u062f\u0629 -session.tab.untitled=\u062c\u0644\u0633\u0629 \u0628\u062f\u0648\u0646 \u0639\u0646\u0648\u0627\u0646 +session.empty.welcome=Kilo Code هو مساعد برمجة بالذكاء الاصطناعي. اطلب منه بناء ميزات أو إصلاح أخطاء أو شرح قاعدة الكود. +session.empty.loading=جاري التحميل… +session.empty.recent=الحديثة +session.showHistory=عرض السجل +session.scroll.bottom=التمرير إلى الأسفل +session.tab.new=جلسة جديدة +session.tab.untitled=جلسة بدون عنوان -session.permission.title=\u0637\u0644\u0628 \u0625\u0630\u0646 -session.permission.meta=\u0627\u0644\u0623\u062f\u0627\u0629: {0} \u2022 \u0627\u0644\u0623\u0646\u0645\u0627\u0637: {1} -session.permission.allow=\u0633\u0645\u0627\u062d -session.permission.deny=\u0631\u0641\u0636 -session.question.dismiss=\u0631\u0641\u0636 +session.permission.title=طلب إذن +session.permission.meta=الأداة: {0} • الأنماط: {1} +session.permission.allow=سماح +session.permission.deny=رفض +session.question.dismiss=رفض -session.status.considering=\u062c\u0627\u0631 \u0627\u0644\u062a\u0641\u0643\u064a\u0631 \u0641\u064a \u0627\u0644\u062e\u0637\u0648\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629\u2026 -session.status.thinking=\u062c\u0627\u0631 \u0627\u0644\u062a\u0641\u0643\u064a\u0631\u2026 -session.status.writing=\u062c\u0627\u0631\u064a \u0643\u062a\u0627\u0628\u0629 \u0627\u0644\u0631\u062f\u2026 -session.status.delegating=\u062c\u0627\u0631 \u062a\u0641\u0648\u064a\u0636 \u0627\u0644\u0639\u0645\u0644\u2026 -session.status.planning=\u062c\u0627\u0631 \u0627\u0644\u062a\u062e\u0637\u064a\u0637\u2026 -session.status.gathering=\u062c\u0627\u0631 \u062c\u0645\u0639 \u0627\u0644\u0633\u064a\u0627\u0642\u2026 -session.status.searching.codebase=\u062c\u0627\u0631 \u0627\u0644\u0628\u062d\u062b \u0641\u064a \u0642\u0627\u0639\u062f\u0629 \u0627\u0644\u0643\u0648\u062f\u2026 -session.status.searching.web=\u062c\u0627\u0631 \u0627\u0644\u0628\u062d\u062b \u0639\u0644\u0649 \u0627\u0644\u0648\u064a\u0628\u2026 -session.status.editing=\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0631\u064a\u0631\u2026 -session.status.commands=\u062c\u0627\u0631\u064a \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u0623\u0648\u0627\u0645\u0631\u2026 +session.status.considering=جار التفكير في الخطوات التالية… +session.status.thinking=جار التفكير… +session.status.writing=جاري كتابة الرد… +session.status.delegating=جار تفويض العمل… +session.status.planning=جار التخطيط… +session.status.gathering=جار جمع السياق… +session.status.searching.codebase=جار البحث في قاعدة الكود… +session.status.searching.web=جار البحث على الويب… +session.status.editing=جاري التحرير… +session.status.commands=جاري تنفيذ الأوامر… -session.part.reasoning=\u0627\u0644\u0627\u0633\u062a\u062f\u0644\u0627\u0644 -session.part.compaction=\u0627\u0644\u0633\u064a\u0627\u0642 \u0645\u0636\u063a\u0648\u0637 -session.part.tool.copy=\u0646\u0633\u062e -session.part.tool.error=\u062e\u0637\u0623 -session.part.tool.pending=\u0645\u0639\u0644\u0642 -session.part.tool.read=\u0642\u0631\u0627\u0621\u0629 -session.part.tool.running=\u0642\u064a\u062f \u0627\u0644\u062a\u0634\u063a\u064a\u0644 +session.part.reasoning=الاستدلال +session.part.compaction=السياق مضغوط +session.part.tool.copy=نسخ +session.part.tool.error=خطأ +session.part.tool.pending=معلق +session.part.tool.read=قراءة +session.part.tool.running=قيد التشغيل session.part.tool.shell=Shell -session.part.tool.truncated=\u0627\u0644\u0645\u062e\u0631\u062c\u0627\u062a \u0645\u062e\u062a\u0635\u0631\u0629 \u0641\u064a \u0627\u0644\u0645\u0639\u0627\u064a\u0646\u0629 \u0627\u0644\u0645\u0633\u0628\u0642\u0629. \u0627\u0644\u0645\u062e\u0631\u062c\u0627\u062a \u0627\u0644\u0643\u0627\u0645\u0644\u0629 \u0644\u0627 \u062a\u0632\u0627\u0644 \u0641\u064a \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062c\u0644\u0633\u0629. +session.part.tool.truncated=المخرجات مختصرة في المعاينة المسبقة. المخرجات الكاملة لا تزال في بيانات الجلسة. -session.error.prompt=\u0641\u0634\u0644 \u0627\u0644\u0637\u0644\u0628 -session.error.compact=\u0641\u0634\u0644 \u0636\u063a\u0637 \u0627\u0644\u062c\u0644\u0633\u0629 -session.error.unknown=\u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641 +session.error.prompt=فشل الطلب +session.error.compact=فشل ضغط الجلسة +session.error.unknown=خطأ غير معروف -session.header.tokens=\u0627\u0644\u0631\u0645\u0648\u0632 -session.header.tokens.description=\u0627\u0644\u0631\u0645\u0648\u0632 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u0629 \u0641\u064a \u0622\u062e\u0631 \u0631\u062f \u0644\u0644\u0645\u0633\u0627\u0639\u062f: \u0627\u0644\u0625\u062f\u062e\u0627\u0644\u060c \u0627\u0644\u0625\u062e\u0631\u0627\u062c\u060c \u0643\u062a\u0627\u0628\u0627\u062a \u0627\u0644\u0645\u062e\u0632\u0646 \u0627\u0644\u0645\u0624\u0642\u062a \u0648\u0642\u0631\u0627\u0621\u0627\u062a\u0647. -session.header.input=\u0625\u062f\u062e\u0627\u0644 {0} -session.header.output=\u0625\u062e\u0631\u0627\u062c {0} -session.header.cache.write=\u0643\u062a\u0627\u0628\u0629 \u0645\u062e\u0632\u0646 \u0645\u0624\u0642\u062a {0} -session.header.cache.read=\u0642\u0631\u0627\u0621\u0629 \u0645\u062e\u0632\u0646 \u0645\u0624\u0642\u062a {0} -session.header.compact=\u0636\u063a\u0637 \u0627\u0644\u062c\u0644\u0633\u0629 -session.header.compact.description=\u062a\u0644\u062e\u064a\u0635 \u0627\u0644\u062c\u0644\u0633\u0629 \u0644\u062a\u0642\u0644\u064a\u0644 \u062d\u062c\u0645 \u0627\u0644\u0633\u064a\u0627\u0642 -session.header.expand=\u0639\u0631\u0636 \u0645\u0642\u0627\u064a\u064a\u0633 \u0627\u0644\u062c\u0644\u0633\u0629 -session.header.collapse=\u0625\u062e\u0641\u0627\u0621 \u0645\u0642\u0627\u064a\u064a\u0633 \u0627\u0644\u062c\u0644\u0633\u0629 -session.header.todos.progress={0}/{1} \u0645\u0647\u0627\u0645 \u0645\u0643\u062a\u0645\u0644\u0629 -session.header.todos.done=\u062c\u0645\u064a\u0639 {0} \u0645\u0647\u0627\u0645 \u0645\u0643\u062a\u0645\u0644\u0629 -session.header.context.tooltip.percent={0} \u0631\u0645\u0632 ({1}\u066a \u0645\u0646 \u0627\u0644\u0633\u064a\u0627\u0642) -session.header.context.tooltip.tokens={0} \u0631\u0645\u0632 -session.header.context.used={0} / {1} \u0631\u0645\u0632 \u0645\u0633\u062a\u062e\u062f\u0645 -session.header.context.reserved={0} \u0645\u062d\u062c\u0648\u0632 \u0644\u0644\u0625\u062e\u0631\u0627\u062c -session.header.context.available={0} \u0645\u062a\u0627\u062d +session.header.tokens=الرموز +session.header.tokens.description=الرموز المستخدمة في آخر رد للمساعد: الإدخال، الإخراج، كتابات المخزن المؤقت وقراءاته. +session.header.input=إدخال {0} +session.header.output=إخراج {0} +session.header.cache.write=كتابة مخزن مؤقت {0} +session.header.cache.read=قراءة مخزن مؤقت {0} +session.header.compact=ضغط الجلسة +session.header.compact.description=تلخيص الجلسة لتقليل حجم السياق +session.header.expand=عرض مقاييس الجلسة +session.header.collapse=إخفاء مقاييس الجلسة +session.header.todos.progress={0}/{1} مهام مكتملة +session.header.todos.done=جميع {0} مهام مكتملة +session.header.context.tooltip.percent={0} رمز ({1}٪ من السياق) +session.header.context.tooltip.tokens={0} رمز +session.header.context.used={0} / {1} رمز مستخدم +session.header.context.reserved={0} محجوز للإخراج +session.header.context.available={0} متاح -prompt.placeholder=\u0627\u0643\u062a\u0628 \u0631\u0633\u0627\u0644\u0629\u2026 -prompt.placeholder.with.shortcuts=\u0627\u0643\u062a\u0628 \u0631\u0633\u0627\u0644\u0629\u2026 ({0} \u0644\u0644\u0625\u0631\u0633\u0627\u0644\u060c {1} \u0644\u0633\u0637\u0631 \u062c\u062f\u064a\u062f) -prompt.placeholder.with.send=\u0627\u0643\u062a\u0628 \u0631\u0633\u0627\u0644\u0629\u2026 ({0} \u0644\u0644\u0625\u0631\u0633\u0627\u0644) -prompt.placeholder.with.newline=\u0627\u0643\u062a\u0628 \u0631\u0633\u0627\u0644\u0629\u2026 ({0} \u0644\u0633\u0637\u0631 \u062c\u062f\u064a\u062f) -prompt.button.send=\u0625\u0631\u0633\u0627\u0644 -prompt.button.stop=\u0625\u064a\u0642\u0627\u0641 -prompt.button.send.tooltip.stop=\u0644\u0644\u0625\u064a\u0642\u0627\u0641\u060c \u0627\u0636\u063a\u0637 {0} -mode.picker.tooltip=\u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0648\u0636\u0639 -mode.picker.deprecated=\u0645\u0647\u062c\u0648\u0631 -model.picker.tooltip=\u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0646\u0645\u0648\u0630\u062c -model.picker.recommended=\u0645\u0648\u0635\u0649 \u0628\u0647 -model.picker.favorites=\u0627\u0644\u0645\u0641\u0636\u0644\u0629 -model.picker.search=\u0628\u062d\u062b \u0639\u0646 \u0646\u0645\u0627\u0630\u062c -model.picker.no.matches=\u0644\u0627 \u062a\u0648\u062c\u062f \u0646\u0645\u0627\u0630\u062c \u0645\u0637\u0627\u0628\u0642\u0629 -model.picker.favorite.add=\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u0641\u0636\u0644\u0629 -model.picker.favorite.remove=\u0625\u0632\u0627\u0644\u0629 \u0645\u0646 \u0627\u0644\u0645\u0641\u0636\u0644\u0629 -model.picker.free=\u0645\u062c\u0627\u0646\u064a -model.picker.reset=\u0625\u0639\u0627\u062f\u0629 \u0636\u0628\u0637 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0644\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a -reasoning.picker.tooltip=\u0627\u062e\u062a\u064a\u0627\u0631 \u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u0627\u0633\u062a\u062f\u0644\u0627\u0644 +prompt.placeholder=اكتب رسالة… +prompt.placeholder.with.shortcuts=اكتب رسالة… ({0} للإرسال، {1} لسطر جديد) +prompt.placeholder.with.send=اكتب رسالة… ({0} للإرسال) +prompt.placeholder.with.newline=اكتب رسالة… ({0} لسطر جديد) +prompt.button.send=إرسال +prompt.button.stop=إيقاف +prompt.button.send.tooltip.stop=للإيقاف، اضغط {0} +mode.picker.tooltip=اختيار الوضع +mode.picker.deprecated=مهجور +model.picker.tooltip=اختيار النموذج +model.picker.recommended=موصى به +model.picker.favorites=المفضلة +model.picker.search=بحث عن نماذج +model.picker.no.matches=لا توجد نماذج مطابقة +model.picker.favorite.add=إضافة إلى المفضلة +model.picker.favorite.remove=إزالة من المفضلة +model.picker.free=مجاني +model.picker.reset=إعادة ضبط النموذج للافتراضي +reasoning.picker.tooltip=اختيار مستوى الاستدلال -history.tab.local=\u0645\u062d\u0644\u064a -history.tab.cloud=\u0633\u062d\u0627\u0628\u064a -history.back=\u0631\u062c\u0648\u0639 -history.search.placeholder=\u0628\u062d\u062b \u0641\u064a \u0627\u0644\u062c\u0644\u0633\u0627\u062a -history.empty=\u0644\u0627 \u062a\u0648\u062c\u062f \u062c\u0644\u0633\u0627\u062a -history.loading=\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644\u2026 -history.untitled=\u0628\u062f\u0648\u0646 \u0639\u0646\u0648\u0627\u0646 -history.delete.text=\u062d\u0630\u0641 -history.delete.confirm.title=\u062d\u0630\u0641 \u0627\u0644\u062c\u0644\u0633\u0629\u061f -history.delete.confirm.message=\u062d\u0630\u0641 "{0}" \u0645\u0646 \u0627\u0644\u0633\u062c\u0644 \u0627\u0644\u0645\u062d\u0644\u064a\u061f -history.delete.confirm.message.multiple=\u062d\u0630\u0641 {0} \u062c\u0644\u0633\u0627\u062a \u0645\u0646 \u0627\u0644\u0633\u062c\u0644 \u0627\u0644\u0645\u062d\u0644\u064a\u061f -history.rename.title=\u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u062c\u0644\u0633\u0629 -history.rename.prompt=\u0627\u0633\u0645 \u0627\u0644\u062c\u0644\u0633\u0629 \u0627\u0644\u062c\u062f\u064a\u062f: -history.cloud.load.more=\u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0645\u0632\u064a\u062f -history.cloud.repo.only=\u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u0648\u062f\u0639 \u0641\u0642\u0637 -history.group.today=\u0627\u0644\u064a\u0648\u0645 -history.group.yesterday=\u0623\u0645\u0633 -history.group.week=\u0647\u0630\u0627 \u0627\u0644\u0623\u0633\u0628\u0648\u0639 -history.group.month=\u0647\u0630\u0627 \u0627\u0644\u0634\u0647\u0631 -history.group.older=\u0623\u0642\u062f\u0645 -history.time.moments=\u0644\u0644\u062a\u0648 -history.time.minutes=\u0645\u0646\u0630 {0} \u062f\u0642\u064a\u0642\u0629 -history.time.hours=\u0645\u0646\u0630 {0} \u0633\u0627\u0639\u0629 -history.time.days=\u0645\u0646\u0630 {0} \u064a\u0648\u0645 -history.time.months=\u0645\u0646\u0630 {0} \u0634\u0647\u0631 -history.time.years=\u0645\u0646\u0630 {0} \u0633\u0646\u0629 -history.error.local=\u0641\u0634\u0644 \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0633\u062c\u0644 \u0627\u0644\u0645\u062d\u0644\u064a -history.error.cloud=\u0641\u0634\u0644 \u062a\u062d\u0645\u064a\u0644 \u0633\u062c\u0644 \u0627\u0644\u0633\u062d\u0627\u0628\u0629 -history.error.local.delete=\u0641\u0634\u0644 \u062d\u0630\u0641 \u0627\u0644\u062c\u0644\u0633\u0629 -history.error.local.rename=\u0641\u0634\u0644 \u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u062c\u0644\u0633\u0629 -history.error.cloud.delete=\u0644\u0627 \u064a\u0645\u0643\u0646 \u062d\u0630\u0641 \u062c\u0644\u0633\u0627\u062a \u0627\u0644\u0633\u062d\u0627\u0628\u0629 \u0628\u0639\u062f +history.tab.local=محلي +history.tab.cloud=سحابي +history.back=رجوع +history.search.placeholder=بحث في الجلسات +history.empty=لا توجد جلسات +history.loading=جاري التحميل… +history.untitled=بدون عنوان +history.delete.text=حذف +history.delete.confirm.title=حذف الجلسة؟ +history.delete.confirm.message=حذف "{0}" من السجل المحلي؟ +history.delete.confirm.message.multiple=حذف {0} جلسات من السجل المحلي؟ +history.rename.title=إعادة تسمية الجلسة +history.rename.prompt=اسم الجلسة الجديد: +history.cloud.load.more=تحميل المزيد +history.cloud.repo.only=هذا المستودع فقط +history.group.today=اليوم +history.group.yesterday=أمس +history.group.week=هذا الأسبوع +history.group.month=هذا الشهر +history.group.older=أقدم +history.time.moments=للتو +history.time.minutes=منذ {0} دقيقة +history.time.hours=منذ {0} ساعة +history.time.days=منذ {0} يوم +history.time.months=منذ {0} شهر +history.time.years=منذ {0} سنة +history.error.local=فشل تحميل السجل المحلي +history.error.cloud=فشل تحميل سجل السحابة +history.error.local.delete=فشل حذف الجلسة +history.error.local.rename=فشل إعادة تسمية الجلسة +history.error.cloud.delete=لا يمكن حذف جلسات السحابة بعد -action.Kilo.Settings.text=\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a -action.Kilo.Settings.description=\u0625\u0639\u062f\u0627\u062f\u0627\u062a Kilo Code -action.Kilo.NewSession.text=\u062c\u0644\u0633\u0629 \u062c\u062f\u064a\u062f\u0629 -action.Kilo.NewSession.description=\u0628\u062f\u0621 \u062c\u0644\u0633\u0629 Kilo \u062c\u062f\u064a\u062f\u0629 -action.Kilo.History.text=\u0627\u0644\u0633\u062c\u0644 -action.Kilo.History.description=\u0639\u0631\u0636 \u0633\u062c\u0644 \u0627\u0644\u062c\u0644\u0633\u0627\u062a -action.Kilo.SendPrompt.text=\u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0637\u0644\u0628 -action.Kilo.SendPrompt.description=\u0625\u0631\u0633\u0627\u0644 \u0637\u0644\u0628 Kilo \u0627\u0644\u062d\u0627\u0644\u064a -action.Kilo.StopSession.text=\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u062c\u0644\u0633\u0629 -action.Kilo.StopSession.description=\u0625\u064a\u0642\u0627\u0641 \u062c\u0644\u0633\u0629 Kilo \u0627\u0644\u062d\u0627\u0644\u064a\u0629 -action.Kilo.SettingsGroup.text=\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a -action.Kilo.SettingsGroup.description=\u0625\u0639\u062f\u0627\u062f\u0627\u062a Kilo Code -action.Kilo.Restart.text=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 Kilo -action.Kilo.Restart.description=\u0625\u0646\u0647\u0627\u0621 \u0639\u0645\u0644\u064a\u0629 CLI \u0648\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644\u0647\u0627 -action.Kilo.Reinstall.text=\u0625\u0639\u0627\u062f\u0629 \u062a\u062b\u0628\u064a\u062a Kilo -action.Kilo.Reinstall.description=\u0627\u0633\u062a\u062e\u0631\u0627\u062c CLI \u0645\u062c\u062f\u062f\u0627\u064b \u0648\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644 -action.Kilo.Session.Open.text=\u0641\u062a\u062d -action.Kilo.Session.Open.description=\u0641\u062a\u062d \u0627\u0644\u062c\u0644\u0633\u0629 \u0627\u0644\u0645\u062d\u062f\u062f\u0629 -action.Kilo.Session.Rename.text=\u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 -action.Kilo.Session.Rename.description=\u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u062c\u0644\u0633\u0629 \u0627\u0644\u0645\u062d\u062f\u062f\u0629 -action.Kilo.Session.Delete.text=\u062d\u0630\u0641 -action.Kilo.Session.Delete.description=\u062d\u0630\u0641 \u0627\u0644\u062c\u0644\u0633\u0629 (\u0627\u0644\u062c\u0644\u0633\u0627\u062a) \u0627\u0644\u0645\u062d\u062f\u062f\u0629 -action.Kilo.History.ContextMenu.text=\u0625\u062c\u0631\u0627\u0621\u0627\u062a \u0627\u0644\u0633\u062c\u0644 +action.Kilo.Settings.text=الإعدادات +action.Kilo.Settings.description=إعدادات Kilo Code +action.Kilo.NewSession.text=جلسة جديدة +action.Kilo.NewSession.description=بدء جلسة Kilo جديدة +action.Kilo.History.text=السجل +action.Kilo.History.description=عرض سجل الجلسات +action.Kilo.SendPrompt.text=إرسال الطلب +action.Kilo.SendPrompt.description=إرسال طلب Kilo الحالي +action.Kilo.StopSession.text=إيقاف الجلسة +action.Kilo.StopSession.description=إيقاف جلسة Kilo الحالية +action.Kilo.SettingsGroup.text=الإعدادات +action.Kilo.SettingsGroup.description=إعدادات Kilo Code +action.Kilo.Restart.text=إعادة تشغيل Kilo +action.Kilo.Restart.description=إنهاء عملية CLI وإعادة تشغيلها +action.Kilo.Reinstall.text=إعادة تثبيت Kilo +action.Kilo.Reinstall.description=استخراج CLI مجدداً وإعادة التشغيل +action.Kilo.Session.Open.text=فتح +action.Kilo.Session.Open.description=فتح الجلسة المحددة +action.Kilo.Session.Rename.text=إعادة تسمية +action.Kilo.Session.Rename.description=إعادة تسمية الجلسة المحددة +action.Kilo.Session.Delete.text=حذف +action.Kilo.Session.Delete.description=حذف الجلسة (الجلسات) المحددة +action.Kilo.History.ContextMenu.text=إجراءات السجل diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_bs.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_bs.properties index 5dec37fce29..a310da70e8e 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_bs.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_bs.properties @@ -1,81 +1,81 @@ -session.connection.connecting=U\u010ditavanje\u2026 -session.connection.error.app=Gre\u0161ka pri spajanju -session.connection.error.workspace=Gre\u0161ka pri u\u010ditavanju radnog prostora -session.connection.error.unknown=Nepoznata gre\u0161ka -session.connection.retry=Poku\u0161aj ponovo +session.connection.connecting=Učitavanje… +session.connection.error.app=Greška pri spajanju +session.connection.error.workspace=Greška pri učitavanju radnog prostora +session.connection.error.unknown=Nepoznata greška +session.connection.retry=Pokušaj ponovo session.connection.warning.config=Upozorenja konfiguracije -session.empty.welcome=Kilo Code je AI asistent za kodiranje. Zatra\u017eite od njega da gradi funkcije, ispravlja gre\u0161ke ili obja\u0161njava va\u0161u bazu koda. -session.empty.loading=U\u010ditavanje\u2026 +session.empty.welcome=Kilo Code je AI asistent za kodiranje. Zatražite od njega da gradi funkcije, ispravlja greške ili objašnjava vašu bazu koda. +session.empty.loading=Učitavanje… session.empty.recent=NEDAVNO -session.showHistory=Prika\u017ei historiju +session.showHistory=Prikaži historiju session.scroll.bottom=Skrolaj na dno session.tab.new=Nova sesija session.tab.untitled=Sesija bez naslova session.permission.title=Zahtjev za dozvolu -session.permission.meta=Alat: {0} \u2022 Uzorci: {1} +session.permission.meta=Alat: {0} • Uzorci: {1} session.permission.allow=Dozvoli session.permission.deny=Odbij session.question.dismiss=Zatvori -session.status.considering=Razmatranje sljede\u0107ih koraka\u2026 -session.status.thinking=Razmi\u0161ljanje\u2026 -session.status.writing=Pisanje odgovora\u2026 -session.status.delegating=Delegiranje posla\u2026 -session.status.planning=Planiranje\u2026 -session.status.gathering=Prikupljanje konteksta\u2026 -session.status.searching.codebase=Pretra\u017eivanje baze koda\u2026 -session.status.searching.web=Pretra\u017eivanje weba\u2026 -session.status.editing=Ure\u0111ivanje\u2026 -session.status.commands=Pokretanje komandi\u2026 +session.status.considering=Razmatranje sljedećih koraka… +session.status.thinking=Razmišljanje… +session.status.writing=Pisanje odgovora… +session.status.delegating=Delegiranje posla… +session.status.planning=Planiranje… +session.status.gathering=Prikupljanje konteksta… +session.status.searching.codebase=Pretraživanje baze koda… +session.status.searching.web=Pretraživanje weba… +session.status.editing=Uređivanje… +session.status.commands=Pokretanje komandi… session.part.reasoning=Rezonovanje session.part.compaction=kontekst komprimovan session.part.tool.copy=Kopiraj -session.part.tool.error=Gre\u0161ka -session.part.tool.pending=Na \u010dekanju -session.part.tool.read=\u010cita +session.part.tool.error=Greška +session.part.tool.pending=Na čekanju +session.part.tool.read=Čita session.part.tool.running=Pokrenuto session.part.tool.shell=Shell -session.part.tool.truncated=Izlaz skra\u0107en u pregledu. Potpuni izlaz ostaje u podacima sesije. +session.part.tool.truncated=Izlaz skraćen u pregledu. Potpuni izlaz ostaje u podacima sesije. -session.error.prompt=Gre\u0161ka upita -session.error.compact=Komprimiranje sesije neuspje\u0161no -session.error.unknown=Nepoznata gre\u0161ka +session.error.prompt=Greška upita +session.error.compact=Komprimiranje sesije neuspješno +session.error.unknown=Nepoznata greška session.header.tokens=Tokeni -session.header.tokens.description=Tokeni kori\u0161teni u posljednjem odgovoru asistenta: ulaz, izlaz, pisanja u ke\u0161 i \u010ditanja iz ke\u0161a. +session.header.tokens.description=Tokeni korišteni u posljednjem odgovoru asistenta: ulaz, izlaz, pisanja u keš i čitanja iz keša. session.header.input=ulaz {0} session.header.output=izlaz {0} -session.header.cache.write=pisanje u ke\u0161 {0} -session.header.cache.read=\u010ditanje iz ke\u0161a {0} +session.header.cache.write=pisanje u keš {0} +session.header.cache.read=čitanje iz keša {0} session.header.compact=Komprimiraj sesiju -session.header.compact.description=Sa\u017emite sesiju kako biste smanjili veli\u010dinu konteksta -session.header.expand=Prika\u017ei metrike sesije +session.header.compact.description=Sažmite sesiju kako biste smanjili veličinu konteksta +session.header.expand=Prikaži metrike sesije session.header.collapse=Sakrij metrike sesije -session.header.todos.progress={0}/{1} zadataka zavr\u0161eno -session.header.todos.done=Svih {0} zadataka zavr\u0161eno +session.header.todos.progress={0}/{1} zadataka završeno +session.header.todos.done=Svih {0} zadataka završeno session.header.context.tooltip.percent={0} tokena ({1}% konteksta) session.header.context.tooltip.tokens={0} tokena -session.header.context.used={0} / {1} tokena kori\u0161teno +session.header.context.used={0} / {1} tokena korišteno session.header.context.reserved={0} rezervisano za izlaz session.header.context.available={0} dostupno -prompt.placeholder=Upi\u0161ite poruku\u2026 -prompt.placeholder.with.shortcuts=Upi\u0161ite poruku\u2026 ({0} za slanje, {1} za novi red) -prompt.placeholder.with.send=Upi\u0161ite poruku\u2026 ({0} za slanje) -prompt.placeholder.with.newline=Upi\u0161ite poruku\u2026 ({0} za novi red) -prompt.button.send=Po\u0161alji +prompt.placeholder=Upišite poruku… +prompt.placeholder.with.shortcuts=Upišite poruku… ({0} za slanje, {1} za novi red) +prompt.placeholder.with.send=Upišite poruku… ({0} za slanje) +prompt.placeholder.with.newline=Upišite poruku… ({0} za novi red) +prompt.button.send=Pošalji prompt.button.stop=Zaustavi prompt.button.send.tooltip.stop=Da zaustavite, pritisnite {0} -mode.picker.tooltip=Odaberi na\u010din rada +mode.picker.tooltip=Odaberi način rada mode.picker.deprecated=zastarjelo model.picker.tooltip=Odaberi model -model.picker.recommended=Preporu\u010deno +model.picker.recommended=Preporučeno model.picker.favorites=Omiljeni -model.picker.search=Pretra\u017ei modele -model.picker.no.matches=Nema odgovaraju\u0107ih modela +model.picker.search=Pretraži modele +model.picker.no.matches=Nema odgovarajućih modela model.picker.favorite.add=Dodaj u omiljene model.picker.favorite.remove=Ukloni iz omiljenih model.picker.free=Besplatno @@ -85,20 +85,20 @@ reasoning.picker.tooltip=Odaberi razinu rezoniranja history.tab.local=Lokalno history.tab.cloud=Oblak history.back=Nazad -history.search.placeholder=Pretra\u017ei sesije +history.search.placeholder=Pretraži sesije history.empty=Nema sesija -history.loading=U\u010ditavanje\u2026 +history.loading=Učitavanje… history.untitled=Bez naslova -history.delete.text=Obri\u0161i +history.delete.text=Obriši history.delete.confirm.title=Obrisati sesiju? history.delete.confirm.message=Obrisati "{0}" iz lokalne historije? history.delete.confirm.message.multiple=Obrisati {0} sesija iz lokalne historije? history.rename.title=Preimenuj sesiju history.rename.prompt=Novi naziv sesije: -history.cloud.load.more=U\u010ditaj vi\u0161e +history.cloud.load.more=Učitaj više history.cloud.repo.only=Samo ovaj repozitorij history.group.today=Danas -history.group.yesterday=Ju\u010der +history.group.yesterday=Jučer history.group.week=Ove sedmice history.group.month=Ovog mjeseca history.group.older=Starije @@ -108,20 +108,20 @@ history.time.hours=Prije {0} h history.time.days=Prije {0} d history.time.months=Prije {0} mj history.time.years=Prije {0} g -history.error.local=U\u010ditavanje lokalne historije neuspje\u0161no -history.error.cloud=U\u010ditavanje historije iz oblaka neuspje\u0161no -history.error.local.delete=Brisanje sesije neuspje\u0161no -history.error.local.rename=Preimenovanje sesije neuspje\u0161no -history.error.cloud.delete=Sesije iz oblaka jo\u0161 uvijek nije mogu\u0107e brisati +history.error.local=Učitavanje lokalne historije neuspješno +history.error.cloud=Učitavanje historije iz oblaka neuspješno +history.error.local.delete=Brisanje sesije neuspješno +history.error.local.rename=Preimenovanje sesije neuspješno +history.error.cloud.delete=Sesije iz oblaka još uvijek nije moguće brisati action.Kilo.Settings.text=Postavke action.Kilo.Settings.description=Postavke Kilo Code action.Kilo.NewSession.text=Nova sesija action.Kilo.NewSession.description=Pokrenite novu Kilo sesiju action.Kilo.History.text=Historija -action.Kilo.History.description=Prika\u017ei historiju sesija -action.Kilo.SendPrompt.text=Po\u0161alji upit -action.Kilo.SendPrompt.description=Po\u0161alji trenutni Kilo upit +action.Kilo.History.description=Prikaži historiju sesija +action.Kilo.SendPrompt.text=Pošalji upit +action.Kilo.SendPrompt.description=Pošalji trenutni Kilo upit action.Kilo.StopSession.text=Zaustavi sesiju action.Kilo.StopSession.description=Zaustavi trenutnu Kilo sesiju action.Kilo.SettingsGroup.text=Postavke @@ -134,6 +134,6 @@ action.Kilo.Session.Open.text=Otvori action.Kilo.Session.Open.description=Otvorite odabranu sesiju action.Kilo.Session.Rename.text=Preimenuj action.Kilo.Session.Rename.description=Preimenujte odabranu sesiju -action.Kilo.Session.Delete.text=Obri\u0161i -action.Kilo.Session.Delete.description=Obri\u0161ite odabrane sesije +action.Kilo.Session.Delete.text=Obriši +action.Kilo.Session.Delete.description=Obrišite odabrane sesije action.Kilo.History.ContextMenu.text=Akcije historije diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_da.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_da.properties index 7ef0ebf9b81..706e2faf0b6 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_da.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_da.properties @@ -1,12 +1,12 @@ -session.connection.connecting=Indl\u00e6ser\u2026 +session.connection.connecting=Indlæser… session.connection.error.app=Forbindelsesfejl -session.connection.error.workspace=Fejl ved indl\u00e6sning af arbejdsomr\u00e5de +session.connection.error.workspace=Fejl ved indlæsning af arbejdsområde session.connection.error.unknown=Ukendt fejl -session.connection.retry=Pr\u00f8v igen +session.connection.retry=Prøv igen session.connection.warning.config=Konfigurationsadvarsler session.empty.welcome=Kilo Code er en AI-kodningsassistent. Bed den om at bygge funktioner, rette fejl eller forklare din kodebase. -session.empty.loading=Indl\u00e6ser\u2026 +session.empty.loading=Indlæser… session.empty.recent=SENESTE session.showHistory=Vis historik session.scroll.bottom=Rul til bunden @@ -14,104 +14,104 @@ session.tab.new=Ny session session.tab.untitled=Unavngivet session session.permission.title=Tilladelsesanmodning -session.permission.meta=V\u00e6rkt\u00f8j: {0} \u2022 M\u00f8nstre: {1} +session.permission.meta=Værktøj: {0} • Mønstre: {1} session.permission.allow=Tillad session.permission.deny=Afvis session.question.dismiss=Luk -session.status.considering=Overvejer n\u00e6ste skridt\u2026 -session.status.thinking=T\u00e6nker\u2026 -session.status.writing=Skriver svar\u2026 -session.status.delegating=Delegerer arbejde\u2026 -session.status.planning=Planlagger\u2026 -session.status.gathering=Indsamler kontekst\u2026 -session.status.searching.codebase=S\u00f8ger i kodebasen\u2026 -session.status.searching.web=S\u00f8ger p\u00e5 nettet\u2026 -session.status.editing=Foretager redigeringer\u2026 -session.status.commands=K\u00f8rer kommandoer\u2026 +session.status.considering=Overvejer næste skridt… +session.status.thinking=Tænker… +session.status.writing=Skriver svar… +session.status.delegating=Delegerer arbejde… +session.status.planning=Planlagger… +session.status.gathering=Indsamler kontekst… +session.status.searching.codebase=Søger i kodebasen… +session.status.searching.web=Søger på nettet… +session.status.editing=Foretager redigeringer… +session.status.commands=Kører kommandoer… -session.part.reasoning=R\u00e6sonnering +session.part.reasoning=Ræsonnering session.part.compaction=kontekst komprimeret -session.part.tool.copy=Kopi\u00e9r +session.part.tool.copy=Kopiér session.part.tool.error=Fejl session.part.tool.pending=Afventer -session.part.tool.read=L\u00e6s -session.part.tool.running=K\u00f8rer +session.part.tool.read=Læs +session.part.tool.running=Kører session.part.tool.shell=Shell -session.part.tool.truncated=Output afkortet i forh\u00e5ndsvisning. Fuldt output forbliver i sessionsdata. +session.part.tool.truncated=Output afkortet i forhåndsvisning. Fuldt output forbliver i sessionsdata. session.error.prompt=Prompt mislykkedes session.error.compact=Sessionskomprimering mislykkedes session.error.unknown=Ukendt fejl session.header.tokens=Tokens -session.header.tokens.description=Tokens brugt af det seneste assistentsvar: input, output, cache-skrivninger og cache-l\u00e6sninger. +session.header.tokens.description=Tokens brugt af det seneste assistentsvar: input, output, cache-skrivninger og cache-læsninger. session.header.input=ind {0} session.header.output=ud {0} session.header.cache.write=cache-skrivning {0} -session.header.cache.read=cache-l\u00e6sning {0} +session.header.cache.read=cache-læsning {0} session.header.compact=Komprimer session -session.header.compact.description=Opsummer sessionen for at reducere kontekstsst\u00f8rrelsen +session.header.compact.description=Opsummer sessionen for at reducere kontekstsstørrelsen session.header.expand=Vis sessionsmålinger session.header.collapse=Skjul sessionsmålinger -session.header.todos.progress={0}/{1} opgaver f\u00e6rdige -session.header.todos.done=Alle {0} opgaver f\u00e6rdige +session.header.todos.progress={0}/{1} opgaver færdige +session.header.todos.done=Alle {0} opgaver færdige session.header.context.tooltip.percent={0} tokens ({1}% af konteksten) session.header.context.tooltip.tokens={0} tokens session.header.context.used={0} / {1} tokens brugt session.header.context.reserved={0} reserveret til output -session.header.context.available={0} tilg\u00e6ngelige +session.header.context.available={0} tilgængelige -prompt.placeholder=Skriv en besked\u2026 -prompt.placeholder.with.shortcuts=Skriv en besked\u2026 ({0} for at sende, {1} for ny linje) -prompt.placeholder.with.send=Skriv en besked\u2026 ({0} for at sende) -prompt.placeholder.with.newline=Skriv en besked\u2026 ({0} for ny linje) +prompt.placeholder=Skriv en besked… +prompt.placeholder.with.shortcuts=Skriv en besked… ({0} for at sende, {1} for ny linje) +prompt.placeholder.with.send=Skriv en besked… ({0} for at sende) +prompt.placeholder.with.newline=Skriv en besked… ({0} for ny linje) prompt.button.send=Send prompt.button.stop=Stop -prompt.button.send.tooltip.stop=Tryk p\u00e5 {0} for at stoppe -mode.picker.tooltip=V\u00e6lg tilstand +prompt.button.send.tooltip.stop=Tryk på {0} for at stoppe +mode.picker.tooltip=Vælg tilstand mode.picker.deprecated=forældet -model.picker.tooltip=V\u00e6lg model +model.picker.tooltip=Vælg model model.picker.recommended=Anbefalet model.picker.favorites=Favoritter -model.picker.search=S\u00f8g efter modeller +model.picker.search=Søg efter modeller model.picker.no.matches=Ingen matchende modeller -model.picker.favorite.add=F\u00f8j til favoritter +model.picker.favorite.add=Føj til favoritter model.picker.favorite.remove=Fjern fra favoritter model.picker.free=Gratis model.picker.reset=Nulstil model til standard -reasoning.picker.tooltip=V\u00e6lg r\u00e6sonneringsindsats +reasoning.picker.tooltip=Vælg ræsonneringsindsats history.tab.local=Lokal history.tab.cloud=Sky history.back=Tilbage -history.search.placeholder=S\u00f8g i sessioner +history.search.placeholder=Søg i sessioner history.empty=Ingen sessioner -history.loading=Indl\u00e6ser\u2026 +history.loading=Indlæser… history.untitled=Unavngivet history.delete.text=Slet history.delete.confirm.title=Slet session? history.delete.confirm.message=Slet "{0}" fra lokal historik? history.delete.confirm.message.multiple=Slet {0} sessioner fra lokal historik? -history.rename.title=Omd\u00f8b session +history.rename.title=Omdøb session history.rename.prompt=Nyt sessionsnavn: -history.cloud.load.more=Indl\u00e6s mere +history.cloud.load.more=Indlæs mere history.cloud.repo.only=Kun dette arkiv history.group.today=I dag -history.group.yesterday=I g\u00e5r +history.group.yesterday=I går history.group.week=Denne uge -history.group.month=Denne m\u00e5ned +history.group.month=Denne måned history.group.older=Ældre history.time.moments=Lige nu history.time.minutes={0} min siden history.time.hours={0} t siden history.time.days={0} d siden history.time.months={0} mdr siden -history.time.years={0} \u00e5r siden -history.error.local=Kunne ikke indl\u00e6se lokal historik -history.error.cloud=Kunne ikke indl\u00e6se skyhistorik +history.time.years={0} år siden +history.error.local=Kunne ikke indlæse lokal historik +history.error.cloud=Kunne ikke indlæse skyhistorik history.error.local.delete=Kunne ikke slette session -history.error.local.rename=Kunne ikke omd\u00f8be session +history.error.local.rename=Kunne ikke omdøbe session history.error.cloud.delete=Skysessioner kan endnu ikke slettes action.Kilo.Settings.text=Indstillinger @@ -129,11 +129,11 @@ action.Kilo.SettingsGroup.description=Kilo Code-indstillinger action.Kilo.Restart.text=Genstart Kilo action.Kilo.Restart.description=Afslut og genstart CLI-processen action.Kilo.Reinstall.text=Geninstaller Kilo -action.Kilo.Reinstall.description=Udpak CLI-bin\u00e6rfilen igen og genstart -action.Kilo.Session.Open.text=\u00c5bn -action.Kilo.Session.Open.description=\u00c5bn den valgte session -action.Kilo.Session.Rename.text=Omd\u00f8b -action.Kilo.Session.Rename.description=Omd\u00f8b den valgte session +action.Kilo.Reinstall.description=Udpak CLI-binærfilen igen og genstart +action.Kilo.Session.Open.text=Åbn +action.Kilo.Session.Open.description=Åbn den valgte session +action.Kilo.Session.Rename.text=Omdøb +action.Kilo.Session.Rename.description=Omdøb den valgte session action.Kilo.Session.Delete.text=Slet action.Kilo.Session.Delete.description=Slet den/de valgte session(er) action.Kilo.History.ContextMenu.text=Historikhandlinger diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_de.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_de.properties index c69b1faa47d..f604c18c850 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_de.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_de.properties @@ -1,12 +1,12 @@ -session.connection.connecting=Wird geladen\u2026 +session.connection.connecting=Wird geladen… session.connection.error.app=Verbindung fehlgeschlagen session.connection.error.workspace=Workspace-Laden fehlgeschlagen session.connection.error.unknown=Unbekannter Fehler session.connection.retry=Erneut versuchen session.connection.warning.config=Konfigurationswarnungen -session.empty.welcome=Kilo Code ist ein KI-Coding-Assistent. Bitten Sie ihn, Funktionen zu erstellen, Fehler zu beheben oder Ihre Codebasis zu erkl\u00e4ren. -session.empty.loading=Wird geladen\u2026 +session.empty.welcome=Kilo Code ist ein KI-Coding-Assistent. Bitten Sie ihn, Funktionen zu erstellen, Fehler zu beheben oder Ihre Codebasis zu erklären. +session.empty.loading=Wird geladen… session.empty.recent=ZULETZT session.showHistory=Verlauf anzeigen session.scroll.bottom=Zum Ende scrollen @@ -14,21 +14,21 @@ session.tab.new=Neue Sitzung session.tab.untitled=Unbenannte Sitzung session.permission.title=Berechtigungsanfrage -session.permission.meta=Werkzeug: {0} \u2022 Muster: {1} +session.permission.meta=Werkzeug: {0} • Muster: {1} session.permission.allow=Erlauben session.permission.deny=Ablehnen -session.question.dismiss=Schlie\u00dfen +session.question.dismiss=Schließen -session.status.considering=N\u00e4chste Schritte abw\u00e4gen\u2026 -session.status.thinking=Nachdenken\u2026 -session.status.writing=Antwort schreiben\u2026 -session.status.delegating=Arbeit delegieren\u2026 -session.status.planning=Planen\u2026 -session.status.gathering=Kontext sammeln\u2026 -session.status.searching.codebase=Codebasis durchsuchen\u2026 -session.status.searching.web=Web durchsuchen\u2026 -session.status.editing=\u00c4nderungen vornehmen\u2026 -session.status.commands=Befehle ausf\u00fchren\u2026 +session.status.considering=Nächste Schritte abwägen… +session.status.thinking=Nachdenken… +session.status.writing=Antwort schreiben… +session.status.delegating=Arbeit delegieren… +session.status.planning=Planen… +session.status.gathering=Kontext sammeln… +session.status.searching.codebase=Codebasis durchsuchen… +session.status.searching.web=Web durchsuchen… +session.status.editing=Änderungen vornehmen… +session.status.commands=Befehle ausführen… session.part.reasoning=Denken session.part.compaction=Kontext komprimiert @@ -36,22 +36,22 @@ session.part.tool.copy=Kopieren session.part.tool.error=Fehler session.part.tool.pending=Ausstehend session.part.tool.read=Lesen -session.part.tool.running=L\u00e4uft +session.part.tool.running=Läuft session.part.tool.shell=Shell -session.part.tool.truncated=Ausgabe in der Vorschau gek\u00fcrzt. Vollst\u00e4ndige Ausgabe verbleibt in den Sitzungsdaten. +session.part.tool.truncated=Ausgabe in der Vorschau gekürzt. Vollständige Ausgabe verbleibt in den Sitzungsdaten. session.error.prompt=Anfrage fehlgeschlagen session.error.compact=Sitzungskomprimierung fehlgeschlagen session.error.unknown=Unbekannter Fehler session.header.tokens=Token -session.header.tokens.description=Von der letzten Assistentenantwort verwendete Token: Eingabe, Ausgabe, Cache-Schreibvorg\u00e4nge und Cache-Lesevorg\u00e4nge. +session.header.tokens.description=Von der letzten Assistentenantwort verwendete Token: Eingabe, Ausgabe, Cache-Schreibvorgänge und Cache-Lesevorgänge. session.header.input=ein {0} session.header.output=aus {0} session.header.cache.write=Cache-Schreiben {0} session.header.cache.read=Cache-Lesen {0} session.header.compact=Sitzung komprimieren -session.header.compact.description=Sitzung zusammenfassen, um die Kontextgr\u00f6\u00dfe zu reduzieren +session.header.compact.description=Sitzung zusammenfassen, um die Kontextgröße zu reduzieren session.header.expand=Sitzungsmetriken anzeigen session.header.collapse=Sitzungsmetriken ausblenden session.header.todos.progress={0}/{1} Aufgaben abgeschlossen @@ -59,40 +59,40 @@ session.header.todos.done=Alle {0} Aufgaben abgeschlossen session.header.context.tooltip.percent={0} Token ({1}% des Kontexts) session.header.context.tooltip.tokens={0} Token session.header.context.used={0} / {1} Token verwendet -session.header.context.reserved={0} f\u00fcr Ausgabe reserviert -session.header.context.available={0} verf\u00fcgbar +session.header.context.reserved={0} für Ausgabe reserviert +session.header.context.available={0} verfügbar -prompt.placeholder=Nachricht eingeben\u2026 -prompt.placeholder.with.shortcuts=Nachricht eingeben\u2026 ({0} zum Senden, {1} f\u00fcr neue Zeile) -prompt.placeholder.with.send=Nachricht eingeben\u2026 ({0} zum Senden) -prompt.placeholder.with.newline=Nachricht eingeben\u2026 ({0} f\u00fcr neue Zeile) +prompt.placeholder=Nachricht eingeben… +prompt.placeholder.with.shortcuts=Nachricht eingeben… ({0} zum Senden, {1} für neue Zeile) +prompt.placeholder.with.send=Nachricht eingeben… ({0} zum Senden) +prompt.placeholder.with.newline=Nachricht eingeben… ({0} für neue Zeile) prompt.button.send=Senden prompt.button.stop=Stopp -prompt.button.send.tooltip.stop=Zum Stoppen dr\u00fccken Sie {0} -mode.picker.tooltip=Modus ausw\u00e4hlen +prompt.button.send.tooltip.stop=Zum Stoppen drücken Sie {0} +mode.picker.tooltip=Modus auswählen mode.picker.deprecated=veraltet -model.picker.tooltip=Modell ausw\u00e4hlen +model.picker.tooltip=Modell auswählen model.picker.recommended=Empfohlen model.picker.favorites=Favoriten model.picker.search=Modelle suchen model.picker.no.matches=Keine passenden Modelle -model.picker.favorite.add=Zu Favoriten hinzuf\u00fcgen +model.picker.favorite.add=Zu Favoriten hinzufügen model.picker.favorite.remove=Aus Favoriten entfernen model.picker.free=Kostenlos -model.picker.reset=Modell auf Standard zur\u00fccksetzen -reasoning.picker.tooltip=Denkanstrengung ausw\u00e4hlen +model.picker.reset=Modell auf Standard zurücksetzen +reasoning.picker.tooltip=Denkanstrengung auswählen history.tab.local=Lokal history.tab.cloud=Cloud -history.back=Zur\u00fcck +history.back=Zurück history.search.placeholder=Sitzungen suchen history.empty=Keine Sitzungen -history.loading=Wird geladen\u2026 +history.loading=Wird geladen… history.untitled=Unbenannt -history.delete.text=L\u00f6schen -history.delete.confirm.title=Sitzung l\u00f6schen? -history.delete.confirm.message="{0}" aus dem lokalen Verlauf l\u00f6schen? -history.delete.confirm.message.multiple={0} Sitzungen aus dem lokalen Verlauf l\u00f6schen? +history.delete.text=Löschen +history.delete.confirm.title=Sitzung löschen? +history.delete.confirm.message="{0}" aus dem lokalen Verlauf löschen? +history.delete.confirm.message.multiple={0} Sitzungen aus dem lokalen Verlauf löschen? history.rename.title=Sitzung umbenennen history.rename.prompt=Neuer Sitzungsname: history.cloud.load.more=Mehr laden @@ -101,7 +101,7 @@ history.group.today=Heute history.group.yesterday=Gestern history.group.week=Diese Woche history.group.month=Dieser Monat -history.group.older=\u00c4lter +history.group.older=Älter history.time.moments=Gerade eben history.time.minutes={0} Min. zuvor history.time.hours={0} Std. zuvor @@ -110,9 +110,9 @@ history.time.months={0} Mon. zuvor history.time.years={0} J. zuvor history.error.local=Lokaler Verlauf konnte nicht geladen werden history.error.cloud=Cloud-Verlauf konnte nicht geladen werden -history.error.local.delete=Sitzung konnte nicht gel\u00f6scht werden +history.error.local.delete=Sitzung konnte nicht gelöscht werden history.error.local.rename=Sitzung konnte nicht umbenannt werden -history.error.cloud.delete=Cloud-Sitzungen k\u00f6nnen noch nicht gel\u00f6scht werden +history.error.cloud.delete=Cloud-Sitzungen können noch nicht gelöscht werden action.Kilo.Settings.text=Einstellungen action.Kilo.Settings.description=Kilo Code Einstellungen @@ -129,11 +129,11 @@ action.Kilo.SettingsGroup.description=Kilo Code Einstellungen action.Kilo.Restart.text=Kilo neu starten action.Kilo.Restart.description=CLI-Prozess beenden und neu starten action.Kilo.Reinstall.text=Kilo neu installieren -action.Kilo.Reinstall.description=CLI-Bin\u00e4rdatei neu extrahieren und neu starten -action.Kilo.Session.Open.text=\u00d6ffnen -action.Kilo.Session.Open.description=Ausgew\u00e4hlte Sitzung \u00f6ffnen +action.Kilo.Reinstall.description=CLI-Binärdatei neu extrahieren und neu starten +action.Kilo.Session.Open.text=Öffnen +action.Kilo.Session.Open.description=Ausgewählte Sitzung öffnen action.Kilo.Session.Rename.text=Umbenennen -action.Kilo.Session.Rename.description=Ausgew\u00e4hlte Sitzung umbenennen -action.Kilo.Session.Delete.text=L\u00f6schen -action.Kilo.Session.Delete.description=Ausgew\u00e4hlte Sitzung(en) l\u00f6schen +action.Kilo.Session.Rename.description=Ausgewählte Sitzung umbenennen +action.Kilo.Session.Delete.text=Löschen +action.Kilo.Session.Delete.description=Ausgewählte Sitzung(en) löschen action.Kilo.History.ContextMenu.text=Verlaufsaktionen diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_es.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_es.properties index 1109389fcff..92fbad3508f 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_es.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_es.properties @@ -1,34 +1,34 @@ -session.connection.connecting=Cargando\u2026 -session.connection.error.app=Error de conexi\u00f3n +session.connection.connecting=Cargando… +session.connection.error.app=Error de conexión session.connection.error.workspace=Error al cargar el espacio de trabajo session.connection.error.unknown=Error desconocido session.connection.retry=Reintentar -session.connection.warning.config=Advertencias de configuraci\u00f3n +session.connection.warning.config=Advertencias de configuración -session.empty.welcome=Kilo Code es un asistente de codificaci\u00f3n con IA. Pida que construya funciones, corrija errores o explique su base de c\u00f3digo. -session.empty.loading=Cargando\u2026 +session.empty.welcome=Kilo Code es un asistente de codificación con IA. Pida que construya funciones, corrija errores o explique su base de código. +session.empty.loading=Cargando… session.empty.recent=RECIENTE session.showHistory=Mostrar historial session.scroll.bottom=Desplazarse al final -session.tab.new=Nueva sesi\u00f3n -session.tab.untitled=Sesi\u00f3n sin t\u00edtulo +session.tab.new=Nueva sesión +session.tab.untitled=Sesión sin título session.permission.title=Solicitud de permiso -session.permission.meta=Herramienta: {0} \u2022 Patrones: {1} +session.permission.meta=Herramienta: {0} • Patrones: {1} session.permission.allow=Permitir session.permission.deny=Denegar session.question.dismiss=Descartar -session.status.considering=Considerando los pr\u00f3ximos pasos\u2026 -session.status.thinking=Pensando\u2026 -session.status.writing=Escribiendo respuesta\u2026 -session.status.delegating=Delegando trabajo\u2026 -session.status.planning=Planificando\u2026 -session.status.gathering=Recopilando contexto\u2026 -session.status.searching.codebase=Buscando en la base de c\u00f3digo\u2026 -session.status.searching.web=Buscando en la web\u2026 -session.status.editing=Realizando ediciones\u2026 -session.status.commands=Ejecutando comandos\u2026 +session.status.considering=Considerando los próximos pasos… +session.status.thinking=Pensando… +session.status.writing=Escribiendo respuesta… +session.status.delegating=Delegando trabajo… +session.status.planning=Planificando… +session.status.gathering=Recopilando contexto… +session.status.searching.codebase=Buscando en la base de código… +session.status.searching.web=Buscando en la web… +session.status.editing=Realizando ediciones… +session.status.commands=Ejecutando comandos… session.part.reasoning=Razonamiento session.part.compaction=contexto compactado @@ -38,22 +38,22 @@ session.part.tool.pending=Pendiente session.part.tool.read=Leer session.part.tool.running=Ejecutando session.part.tool.shell=Shell -session.part.tool.truncated=Salida truncada en la vista previa. La salida completa permanece en los datos de la sesi\u00f3n. +session.part.tool.truncated=Salida truncada en la vista previa. La salida completa permanece en los datos de la sesión. session.error.prompt=Error en el mensaje -session.error.compact=Error al compactar la sesi\u00f3n +session.error.compact=Error al compactar la sesión session.error.unknown=Error desconocido session.header.tokens=Tokens -session.header.tokens.description=Tokens utilizados por la \u00faltima respuesta del asistente: entrada, salida, escrituras en cach\u00e9 y lecturas en cach\u00e9. +session.header.tokens.description=Tokens utilizados por la última respuesta del asistente: entrada, salida, escrituras en caché y lecturas en caché. session.header.input=entrada {0} session.header.output=salida {0} -session.header.cache.write=escritura cach\u00e9 {0} -session.header.cache.read=lectura cach\u00e9 {0} -session.header.compact=Compactar sesi\u00f3n -session.header.compact.description=Resumir la sesi\u00f3n para reducir el tama\u00f1o del contexto -session.header.expand=Mostrar m\u00e9tricas de sesi\u00f3n -session.header.collapse=Ocultar m\u00e9tricas de sesi\u00f3n +session.header.cache.write=escritura caché {0} +session.header.cache.read=lectura caché {0} +session.header.compact=Compactar sesión +session.header.compact.description=Resumir la sesión para reducir el tamaño del contexto +session.header.expand=Mostrar métricas de sesión +session.header.collapse=Ocultar métricas de sesión session.header.todos.progress={0}/{1} tareas completadas session.header.todos.done=Todas las {0} tareas completadas session.header.context.tooltip.percent={0} tokens ({1}% del contexto) @@ -62,10 +62,10 @@ session.header.context.used={0} / {1} tokens utilizados session.header.context.reserved={0} reservados para la salida session.header.context.available={0} disponibles -prompt.placeholder=Escribe un mensaje\u2026 -prompt.placeholder.with.shortcuts=Escribe un mensaje\u2026 ({0} para enviar, {1} para nueva l\u00ednea) -prompt.placeholder.with.send=Escribe un mensaje\u2026 ({0} para enviar) -prompt.placeholder.with.newline=Escribe un mensaje\u2026 ({0} para nueva l\u00ednea) +prompt.placeholder=Escribe un mensaje… +prompt.placeholder.with.shortcuts=Escribe un mensaje… ({0} para enviar, {1} para nueva línea) +prompt.placeholder.with.send=Escribe un mensaje… ({0} para enviar) +prompt.placeholder.with.newline=Escribe un mensaje… ({0} para nueva línea) prompt.button.send=Enviar prompt.button.stop=Detener prompt.button.send.tooltip.stop=Para detener, presiona {0} @@ -76,7 +76,7 @@ model.picker.recommended=Recomendado model.picker.favorites=Favoritos model.picker.search=Buscar modelos model.picker.no.matches=No hay modelos coincidentes -model.picker.favorite.add=A\u00f1adir a favoritos +model.picker.favorite.add=Añadir a favoritos model.picker.favorite.remove=Eliminar de favoritos model.picker.free=Gratis model.picker.reset=Restablecer modelo a predeterminado @@ -84,56 +84,56 @@ reasoning.picker.tooltip=Seleccionar esfuerzo de razonamiento history.tab.local=Local history.tab.cloud=Nube -history.back=Atr\u00e1s +history.back=Atrás history.search.placeholder=Buscar sesiones history.empty=Sin sesiones -history.loading=Cargando\u2026 -history.untitled=Sin t\u00edtulo +history.loading=Cargando… +history.untitled=Sin título history.delete.text=Eliminar -history.delete.confirm.title=\u00bfEliminar sesi\u00f3n? -history.delete.confirm.message=\u00bfEliminar "{0}" del historial local? -history.delete.confirm.message.multiple=\u00bfEliminar {0} sesiones del historial local? -history.rename.title=Renombrar sesi\u00f3n -history.rename.prompt=Nuevo nombre de sesi\u00f3n: -history.cloud.load.more=Cargar m\u00e1s +history.delete.confirm.title=¿Eliminar sesión? +history.delete.confirm.message=¿Eliminar "{0}" del historial local? +history.delete.confirm.message.multiple=¿Eliminar {0} sesiones del historial local? +history.rename.title=Renombrar sesión +history.rename.prompt=Nuevo nombre de sesión: +history.cloud.load.more=Cargar más history.cloud.repo.only=Solo este repositorio history.group.today=Hoy history.group.yesterday=Ayer history.group.week=Esta semana history.group.month=Este mes -history.group.older=M\u00e1s antiguo +history.group.older=Más antiguo history.time.moments=Hace un momento history.time.minutes=Hace {0} min history.time.hours=Hace {0} h history.time.days=Hace {0} d history.time.months=Hace {0} mes(es) -history.time.years=Hace {0} a\u00f1o(s) +history.time.years=Hace {0} año(s) history.error.local=Error al cargar el historial local history.error.cloud=Error al cargar el historial en la nube -history.error.local.delete=Error al eliminar la sesi\u00f3n -history.error.local.rename=Error al renombrar la sesi\u00f3n -history.error.cloud.delete=Las sesiones en la nube no se pueden eliminar a\u00fan +history.error.local.delete=Error al eliminar la sesión +history.error.local.rename=Error al renombrar la sesión +history.error.cloud.delete=Las sesiones en la nube no se pueden eliminar aún -action.Kilo.Settings.text=Configuraci\u00f3n -action.Kilo.Settings.description=Configuraci\u00f3n de Kilo Code -action.Kilo.NewSession.text=Nueva sesi\u00f3n -action.Kilo.NewSession.description=Iniciar una nueva sesi\u00f3n de Kilo +action.Kilo.Settings.text=Configuración +action.Kilo.Settings.description=Configuración de Kilo Code +action.Kilo.NewSession.text=Nueva sesión +action.Kilo.NewSession.description=Iniciar una nueva sesión de Kilo action.Kilo.History.text=Historial action.Kilo.History.description=Mostrar el historial de sesiones action.Kilo.SendPrompt.text=Enviar mensaje action.Kilo.SendPrompt.description=Enviar el mensaje actual de Kilo -action.Kilo.StopSession.text=Detener sesi\u00f3n -action.Kilo.StopSession.description=Detener la sesi\u00f3n actual de Kilo -action.Kilo.SettingsGroup.text=Configuraci\u00f3n -action.Kilo.SettingsGroup.description=Configuraci\u00f3n de Kilo Code +action.Kilo.StopSession.text=Detener sesión +action.Kilo.StopSession.description=Detener la sesión actual de Kilo +action.Kilo.SettingsGroup.text=Configuración +action.Kilo.SettingsGroup.description=Configuración de Kilo Code action.Kilo.Restart.text=Reiniciar Kilo action.Kilo.Restart.description=Terminar y reiniciar el proceso CLI action.Kilo.Reinstall.text=Reinstalar Kilo action.Kilo.Reinstall.description=Reextraer el binario CLI y reiniciar action.Kilo.Session.Open.text=Abrir -action.Kilo.Session.Open.description=Abrir la sesi\u00f3n seleccionada +action.Kilo.Session.Open.description=Abrir la sesión seleccionada action.Kilo.Session.Rename.text=Renombrar -action.Kilo.Session.Rename.description=Renombrar la sesi\u00f3n seleccionada +action.Kilo.Session.Rename.description=Renombrar la sesión seleccionada action.Kilo.Session.Delete.text=Eliminar -action.Kilo.Session.Delete.description=Eliminar la(s) sesi\u00f3n(es) seleccionada(s) +action.Kilo.Session.Delete.description=Eliminar la(s) sesión(es) seleccionada(s) action.Kilo.History.ContextMenu.text=Acciones del historial diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_fr.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_fr.properties index ded2c4b670b..bf51dd4e426 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_fr.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_fr.properties @@ -1,139 +1,139 @@ -session.connection.connecting=Chargement\u2026 -session.connection.error.app=\u00c9chec de la connexion -session.connection.error.workspace=\u00c9chec du chargement de l'espace de travail +session.connection.connecting=Chargement… +session.connection.error.app=Échec de la connexion +session.connection.error.workspace=Échec du chargement de l'espace de travail session.connection.error.unknown=Erreur inconnue -session.connection.retry=R\u00e9essayer +session.connection.retry=Réessayer session.connection.warning.config=Avertissements de configuration -session.empty.welcome=Kilo Code est un assistant de codage IA. Demandez-lui de cr\u00e9er des fonctionnalit\u00e9s, corriger des bugs ou expliquer votre base de code. -session.empty.loading=Chargement\u2026 -session.empty.recent=R\u00c9CENT +session.empty.welcome=Kilo Code est un assistant de codage IA. Demandez-lui de créer des fonctionnalités, corriger des bugs ou expliquer votre base de code. +session.empty.loading=Chargement… +session.empty.recent=RÉCENT session.showHistory=Afficher l'historique -session.scroll.bottom=Faire d\u00e9filer vers le bas +session.scroll.bottom=Faire défiler vers le bas session.tab.new=Nouvelle session session.tab.untitled=Session sans titre session.permission.title=Demande de permission -session.permission.meta=Outil\u00a0: {0} \u2022 Mod\u00e8les\u00a0: {1} +session.permission.meta=Outil : {0} • Modèles : {1} session.permission.allow=Autoriser session.permission.deny=Refuser session.question.dismiss=Ignorer -session.status.considering=Consid\u00e9ration des prochaines \u00e9tapes\u2026 -session.status.thinking=R\u00e9flexion\u2026 -session.status.writing=R\u00e9daction de la r\u00e9ponse\u2026 -session.status.delegating=D\u00e9l\u00e9gation du travail\u2026 -session.status.planning=Planification\u2026 -session.status.gathering=Collecte du contexte\u2026 -session.status.searching.codebase=Recherche dans la base de code\u2026 -session.status.searching.web=Recherche sur le web\u2026 -session.status.editing=Modifications en cours\u2026 -session.status.commands=Ex\u00e9cution des commandes\u2026 +session.status.considering=Considération des prochaines étapes… +session.status.thinking=Réflexion… +session.status.writing=Rédaction de la réponse… +session.status.delegating=Délégation du travail… +session.status.planning=Planification… +session.status.gathering=Collecte du contexte… +session.status.searching.codebase=Recherche dans la base de code… +session.status.searching.web=Recherche sur le web… +session.status.editing=Modifications en cours… +session.status.commands=Exécution des commandes… session.part.reasoning=Raisonnement -session.part.compaction=contexte compact\u00e9 +session.part.compaction=contexte compacté session.part.tool.copy=Copier session.part.tool.error=Erreur session.part.tool.pending=En attente session.part.tool.read=Lire session.part.tool.running=En cours session.part.tool.shell=Shell -session.part.tool.truncated=Sortie tronqu\u00e9e dans l'aper\u00e7u. La sortie compl\u00e8te reste dans les donn\u00e9es de session. +session.part.tool.truncated=Sortie tronquée dans l'aperçu. La sortie complète reste dans les données de session. -session.error.prompt=\u00c9chec de l'invite -session.error.compact=\u00c9chec de la compaction de session +session.error.prompt=Échec de l'invite +session.error.compact=Échec de la compaction de session session.error.unknown=Erreur inconnue session.header.tokens=Tokens -session.header.tokens.description=Tokens utilis\u00e9s par la derni\u00e8re r\u00e9ponse de l'assistant\u00a0: entr\u00e9e, sortie, \u00e9critures en cache et lectures en cache. -session.header.input=entr\u00e9e {0} +session.header.tokens.description=Tokens utilisés par la dernière réponse de l'assistant : entrée, sortie, écritures en cache et lectures en cache. +session.header.input=entrée {0} session.header.output=sortie {0} -session.header.cache.write=\u00e9criture cache {0} +session.header.cache.write=écriture cache {0} session.header.cache.read=lecture cache {0} session.header.compact=Compacter la session -session.header.compact.description=R\u00e9sumer la session pour r\u00e9duire la taille du contexte -session.header.expand=Afficher les m\u00e9triques de session -session.header.collapse=Masquer les m\u00e9triques de session -session.header.todos.progress={0}/{1} t\u00e2ches termin\u00e9es -session.header.todos.done=Toutes les {0} t\u00e2ches termin\u00e9es -session.header.context.tooltip.percent={0} tokens ({1}\u00a0% du contexte) +session.header.compact.description=Résumer la session pour réduire la taille du contexte +session.header.expand=Afficher les métriques de session +session.header.collapse=Masquer les métriques de session +session.header.todos.progress={0}/{1} tâches terminées +session.header.todos.done=Toutes les {0} tâches terminées +session.header.context.tooltip.percent={0} tokens ({1} % du contexte) session.header.context.tooltip.tokens={0} tokens -session.header.context.used={0} / {1} tokens utilis\u00e9s -session.header.context.reserved={0} r\u00e9serv\u00e9s pour la sortie +session.header.context.used={0} / {1} tokens utilisés +session.header.context.reserved={0} réservés pour la sortie session.header.context.available={0} disponibles -prompt.placeholder=Saisir un message\u2026 -prompt.placeholder.with.shortcuts=Saisir un message\u2026 ({0} pour envoyer, {1} pour nouvelle ligne) -prompt.placeholder.with.send=Saisir un message\u2026 ({0} pour envoyer) -prompt.placeholder.with.newline=Saisir un message\u2026 ({0} pour nouvelle ligne) +prompt.placeholder=Saisir un message… +prompt.placeholder.with.shortcuts=Saisir un message… ({0} pour envoyer, {1} pour nouvelle ligne) +prompt.placeholder.with.send=Saisir un message… ({0} pour envoyer) +prompt.placeholder.with.newline=Saisir un message… ({0} pour nouvelle ligne) prompt.button.send=Envoyer -prompt.button.stop=Arr\u00eater -prompt.button.send.tooltip.stop=Pour arr\u00eater, appuyez sur {0} -mode.picker.tooltip=S\u00e9lectionner le mode -mode.picker.deprecated=obsol\u00e8te -model.picker.tooltip=S\u00e9lectionner le mod\u00e8le -model.picker.recommended=Recommand\u00e9 +prompt.button.stop=Arrêter +prompt.button.send.tooltip.stop=Pour arrêter, appuyez sur {0} +mode.picker.tooltip=Sélectionner le mode +mode.picker.deprecated=obsolète +model.picker.tooltip=Sélectionner le modèle +model.picker.recommended=Recommandé model.picker.favorites=Favoris -model.picker.search=Rechercher des mod\u00e8les -model.picker.no.matches=Aucun mod\u00e8le correspondant +model.picker.search=Rechercher des modèles +model.picker.no.matches=Aucun modèle correspondant model.picker.favorite.add=Ajouter aux favoris model.picker.favorite.remove=Retirer des favoris model.picker.free=Gratuit -model.picker.reset=R\u00e9initialiser le mod\u00e8le par d\u00e9faut -reasoning.picker.tooltip=S\u00e9lectionner l'effort de raisonnement +model.picker.reset=Réinitialiser le modèle par défaut +reasoning.picker.tooltip=Sélectionner l'effort de raisonnement history.tab.local=Local history.tab.cloud=Cloud history.back=Retour history.search.placeholder=Rechercher des sessions history.empty=Aucune session -history.loading=Chargement\u2026 +history.loading=Chargement… history.untitled=Sans titre history.delete.text=Supprimer -history.delete.confirm.title=Supprimer la session\u00a0? -history.delete.confirm.message=Supprimer \u00ab\u00a0{0}\u00a0\u00bb de l'historique local\u00a0? -history.delete.confirm.message.multiple=Supprimer {0} sessions de l'historique local\u00a0? +history.delete.confirm.title=Supprimer la session ? +history.delete.confirm.message=Supprimer « {0} » de l'historique local ? +history.delete.confirm.message.multiple=Supprimer {0} sessions de l'historique local ? history.rename.title=Renommer la session -history.rename.prompt=Nouveau nom de session\u00a0: +history.rename.prompt=Nouveau nom de session : history.cloud.load.more=Charger plus -history.cloud.repo.only=Ce d\u00e9p\u00f4t uniquement +history.cloud.repo.only=Ce dépôt uniquement history.group.today=Aujourd'hui history.group.yesterday=Hier history.group.week=Cette semaine history.group.month=Ce mois history.group.older=Plus ancien -history.time.moments=\u00c0 l'instant +history.time.moments=À l'instant history.time.minutes=Il y a {0} min -history.time.hours=Il y a {0}\u00a0h -history.time.days=Il y a {0}\u00a0j +history.time.hours=Il y a {0} h +history.time.days=Il y a {0} j history.time.months=Il y a {0} mois history.time.years=Il y a {0} an(s) -history.error.local=\u00c9chec du chargement de l'historique local -history.error.cloud=\u00c9chec du chargement de l'historique cloud -history.error.local.delete=\u00c9chec de la suppression de la session -history.error.local.rename=\u00c9chec du renommage de la session -history.error.cloud.delete=Les sessions cloud ne peuvent pas encore \u00eatre supprim\u00e9es +history.error.local=Échec du chargement de l'historique local +history.error.cloud=Échec du chargement de l'historique cloud +history.error.local.delete=Échec de la suppression de la session +history.error.local.rename=Échec du renommage de la session +history.error.cloud.delete=Les sessions cloud ne peuvent pas encore être supprimées -action.Kilo.Settings.text=Param\u00e8tres -action.Kilo.Settings.description=Param\u00e8tres de Kilo Code +action.Kilo.Settings.text=Paramètres +action.Kilo.Settings.description=Paramètres de Kilo Code action.Kilo.NewSession.text=Nouvelle session -action.Kilo.NewSession.description=D\u00e9marrer une nouvelle session Kilo +action.Kilo.NewSession.description=Démarrer une nouvelle session Kilo action.Kilo.History.text=Historique action.Kilo.History.description=Afficher l'historique des sessions action.Kilo.SendPrompt.text=Envoyer l'invite action.Kilo.SendPrompt.description=Envoyer l'invite Kilo actuelle -action.Kilo.StopSession.text=Arr\u00eater la session -action.Kilo.StopSession.description=Arr\u00eater la session Kilo actuelle -action.Kilo.SettingsGroup.text=Param\u00e8tres -action.Kilo.SettingsGroup.description=Param\u00e8tres de Kilo Code -action.Kilo.Restart.text=Red\u00e9marrer Kilo -action.Kilo.Restart.description=Tuer et red\u00e9marrer le processus CLI -action.Kilo.Reinstall.text=R\u00e9installer Kilo -action.Kilo.Reinstall.description=R\u00e9extraire le binaire CLI et red\u00e9marrer +action.Kilo.StopSession.text=Arrêter la session +action.Kilo.StopSession.description=Arrêter la session Kilo actuelle +action.Kilo.SettingsGroup.text=Paramètres +action.Kilo.SettingsGroup.description=Paramètres de Kilo Code +action.Kilo.Restart.text=Redémarrer Kilo +action.Kilo.Restart.description=Tuer et redémarrer le processus CLI +action.Kilo.Reinstall.text=Réinstaller Kilo +action.Kilo.Reinstall.description=Réextraire le binaire CLI et redémarrer action.Kilo.Session.Open.text=Ouvrir -action.Kilo.Session.Open.description=Ouvrir la session s\u00e9lectionn\u00e9e +action.Kilo.Session.Open.description=Ouvrir la session sélectionnée action.Kilo.Session.Rename.text=Renommer -action.Kilo.Session.Rename.description=Renommer la session s\u00e9lectionn\u00e9e +action.Kilo.Session.Rename.description=Renommer la session sélectionnée action.Kilo.Session.Delete.text=Supprimer -action.Kilo.Session.Delete.description=Supprimer la ou les sessions s\u00e9lectionn\u00e9es +action.Kilo.Session.Delete.description=Supprimer la ou les sessions sélectionnées action.Kilo.History.ContextMenu.text=Actions d'historique diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ja.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ja.properties index 00dd8a376b9..c32cc633e9f 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ja.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ja.properties @@ -1,139 +1,139 @@ -session.connection.connecting=\u8aad\u307f\u8fbc\u307f\u4e2d\u2026 -session.connection.error.app=\u63a5\u7d9a\u306b\u5931\u6557\u3057\u307e\u3057\u305f -session.connection.error.workspace=\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f -session.connection.error.unknown=\u4e0d\u660e\u306a\u30a8\u30e9\u30fc -session.connection.retry=\u518d\u8a66\u884c -session.connection.warning.config=\u8a2d\u5b9a\u306e\u8b66\u544a +session.connection.connecting=読み込み中… +session.connection.error.app=接続に失敗しました +session.connection.error.workspace=ワークスペースの読み込みに失敗しました +session.connection.error.unknown=不明なエラー +session.connection.retry=再試行 +session.connection.warning.config=設定の警告 -session.empty.welcome=Kilo Code\u306fAI\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a2\u30b7\u30b9\u30bf\u30f3\u30c8\u3067\u3059\u3002\u6a5f\u80fd\u306e\u4f5c\u6210\u3001\u30d0\u30b0\u306e\u4fee\u6b63\u3001\u307e\u305f\u306f\u30b3\u30fc\u30c9\u30d9\u30fc\u30b9\u306e\u8aac\u660e\u3092\u4f9d\u983c\u3067\u304d\u307e\u3059\u3002 -session.empty.loading=\u8aad\u307f\u8fbc\u307f\u4e2d\u2026 -session.empty.recent=\u6700\u8fd1 -session.showHistory=\u5c65\u6b74\u3092\u8868\u793a -session.scroll.bottom=\u4e00\u756a\u4e0b\u306b\u30b9\u30af\u30ed\u30fc\u30eb -session.tab.new=\u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3 -session.tab.untitled=\u540d\u524d\u306a\u3057\u306e\u30bb\u30c3\u30b7\u30e7\u30f3 +session.empty.welcome=Kilo CodeはAIコーディングアシスタントです。機能の作成、バグの修正、またはコードベースの説明を依頼できます。 +session.empty.loading=読み込み中… +session.empty.recent=最近 +session.showHistory=履歴を表示 +session.scroll.bottom=一番下にスクロール +session.tab.new=新しいセッション +session.tab.untitled=名前なしのセッション -session.permission.title=\u6a29\u9650\u30ea\u30af\u30a8\u30b9\u30c8 -session.permission.meta=\u30c4\u30fc\u30eb\uff1a{0} \u2022 \u30d1\u30bf\u30fc\u30f3\uff1a{1} -session.permission.allow=\u8a31\u53ef -session.permission.deny=\u62d2\u5426 -session.question.dismiss=\u9589\u3058\u308b +session.permission.title=権限リクエスト +session.permission.meta=ツール:{0} • パターン:{1} +session.permission.allow=許可 +session.permission.deny=拒否 +session.question.dismiss=閉じる -session.status.considering=\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3092\u691c\u8a0e\u4e2d\u2026 -session.status.thinking=\u8003\u3048\u4e2d\u2026 -session.status.writing=\u56de\u7b54\u3092\u4f5c\u6210\u4e2d\u2026 -session.status.delegating=\u4f5c\u696d\u3092\u59d4\u4efb\u4e2d\u2026 -session.status.planning=\u8a08\u753b\u4e2d\u2026 -session.status.gathering=\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u3092\u53ce\u96c6\u4e2d\u2026 -session.status.searching.codebase=\u30b3\u30fc\u30c9\u30d9\u30fc\u30b9\u3092\u691c\u7d22\u4e2d\u2026 -session.status.searching.web=\u30a6\u30a7\u30d6\u3092\u691c\u7d22\u4e2d\u2026 -session.status.editing=\u7de8\u96c6\u4e2d\u2026 -session.status.commands=\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u4e2d\u2026 +session.status.considering=次のステップを検討中… +session.status.thinking=考え中… +session.status.writing=回答を作成中… +session.status.delegating=作業を委任中… +session.status.planning=計画中… +session.status.gathering=コンテキストを収集中… +session.status.searching.codebase=コードベースを検索中… +session.status.searching.web=ウェブを検索中… +session.status.editing=編集中… +session.status.commands=コマンドを実行中… -session.part.reasoning=\u63a8\u8ad6 -session.part.compaction=\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u5727\u7e2e\u6e08\u307f -session.part.tool.copy=\u30b3\u30d4\u30fc -session.part.tool.error=\u30a8\u30e9\u30fc -session.part.tool.pending=\u4fdd\u7559\u4e2d -session.part.tool.read=\u8aad\u307f\u53d6\u308a -session.part.tool.running=\u5b9f\u884c\u4e2d -session.part.tool.shell=\u30b7\u30a7\u30eb -session.part.tool.truncated=\u30d7\u30ec\u30d3\u30e5\u30fc\u3067\u306f\u51fa\u529b\u304c\u5207\u308a\u8a70\u3081\u3089\u308c\u3066\u3044\u307e\u3059\u3002\u5b8c\u5168\u306a\u51fa\u529b\u306f\u30bb\u30c3\u30b7\u30e7\u30f3\u30c7\u30fc\u30bf\u306b\u6b8b\u3063\u3066\u3044\u307e\u3059\u3002 +session.part.reasoning=推論 +session.part.compaction=コンテキスト圧縮済み +session.part.tool.copy=コピー +session.part.tool.error=エラー +session.part.tool.pending=保留中 +session.part.tool.read=読み取り +session.part.tool.running=実行中 +session.part.tool.shell=シェル +session.part.tool.truncated=プレビューでは出力が切り詰められています。完全な出力はセッションデータに残っています。 -session.error.prompt=\u30d7\u30ed\u30f3\u30d7\u30c8\u304c\u5931\u6557\u3057\u307e\u3057\u305f -session.error.compact=\u30bb\u30c3\u30b7\u30e7\u30f3\u5727\u7e2e\u304c\u5931\u6557\u3057\u307e\u3057\u305f -session.error.unknown=\u4e0d\u660e\u306a\u30a8\u30e9\u30fc +session.error.prompt=プロンプトが失敗しました +session.error.compact=セッション圧縮が失敗しました +session.error.unknown=不明なエラー -session.header.tokens=\u30c8\u30fc\u30af\u30f3 -session.header.tokens.description=\u6700\u65b0\u306e\u30a2\u30b7\u30b9\u30bf\u30f3\u30c8\u306e\u56de\u7b54\u3067\u4f7f\u7528\u3055\u308c\u305f\u30c8\u30fc\u30af\u30f3\uff1a\u5165\u529b\u3001\u51fa\u529b\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u66f8\u304d\u8fbc\u307f\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u8aad\u307f\u53d6\u308a\u3002 -session.header.input=\u5165\u529b {0} -session.header.output=\u51fa\u529b {0} -session.header.cache.write=\u30ad\u30e3\u30c3\u30b7\u30e5\u66f8\u304d\u8fbc\u307f {0} -session.header.cache.read=\u30ad\u30e3\u30c3\u30b7\u30e5\u8aad\u307f\u53d6\u308a {0} -session.header.compact=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u5727\u7e2e -session.header.compact.description=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u8981\u7d04\u3057\u3066\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u30b5\u30a4\u30ba\u3092\u524a\u6e1b -session.header.expand=\u30bb\u30c3\u30b7\u30e7\u30f3\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u8868\u793a -session.header.collapse=\u30bb\u30c3\u30b7\u30e7\u30f3\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u975e\u8868\u793a -session.header.todos.progress={0}/{1}\u500b\u306e\u30bf\u30b9\u30af\u5b8c\u4e86 -session.header.todos.done=\u5168{0}\u500b\u306e\u30bf\u30b9\u30af\u5b8c\u4e86 -session.header.context.tooltip.percent={0}\u30c8\u30fc\u30af\u30f3\uff08\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e{1}%\uff09 -session.header.context.tooltip.tokens={0}\u30c8\u30fc\u30af\u30f3 -session.header.context.used={0} / {1}\u30c8\u30fc\u30af\u30f3\u4f7f\u7528\u4e2d -session.header.context.reserved={0}\u306f\u51fa\u529b\u7528\u306b\u4e88\u7d04\u6e08\u307f -session.header.context.available={0}\u5229\u7528\u53ef\u80fd +session.header.tokens=トークン +session.header.tokens.description=最新のアシスタントの回答で使用されたトークン:入力、出力、キャッシュ書き込み、キャッシュ読み取り。 +session.header.input=入力 {0} +session.header.output=出力 {0} +session.header.cache.write=キャッシュ書き込み {0} +session.header.cache.read=キャッシュ読み取り {0} +session.header.compact=セッションを圧縮 +session.header.compact.description=セッションを要約してコンテキストサイズを削減 +session.header.expand=セッションメトリクスを表示 +session.header.collapse=セッションメトリクスを非表示 +session.header.todos.progress={0}/{1}個のタスク完了 +session.header.todos.done=全{0}個のタスク完了 +session.header.context.tooltip.percent={0}トークン(コンテキストの{1}%) +session.header.context.tooltip.tokens={0}トークン +session.header.context.used={0} / {1}トークン使用中 +session.header.context.reserved={0}は出力用に予約済み +session.header.context.available={0}利用可能 -prompt.placeholder=\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u2026 -prompt.placeholder.with.shortcuts=\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u2026\uff08{0}\u3067\u9001\u4fe1\u3001{1}\u3067\u6539\u884c\uff09 -prompt.placeholder.with.send=\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u2026\uff08{0}\u3067\u9001\u4fe1\uff09 -prompt.placeholder.with.newline=\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u2026\uff08{0}\u3067\u6539\u884c\uff09 -prompt.button.send=\u9001\u4fe1 -prompt.button.stop=\u505c\u6b62 -prompt.button.send.tooltip.stop=\u505c\u6b62\u3059\u308b\u306b\u306f{0}\u3092\u62bc\u3057\u3066\u304f\u3060\u3055\u3044 -mode.picker.tooltip=\u30e2\u30fc\u30c9\u3092\u9078\u629e -mode.picker.deprecated=\u975e\u63a8\u5968 -model.picker.tooltip=\u30e2\u30c7\u30eb\u3092\u9078\u629e -model.picker.recommended=\u304a\u3059\u3059\u3081 -model.picker.favorites=\u304a\u6c17\u306b\u5165\u308a -model.picker.search=\u30e2\u30c7\u30eb\u3092\u691c\u7d22 -model.picker.no.matches=\u4e00\u81f4\u3059\u308b\u30e2\u30c7\u30eb\u306a\u3057 -model.picker.favorite.add=\u304a\u6c17\u306b\u5165\u308a\u306b\u8ffd\u52a0 -model.picker.favorite.remove=\u304a\u6c17\u306b\u5165\u308a\u304b\u3089\u524a\u9664 -model.picker.free=\u7121\u6599 -model.picker.reset=\u30e2\u30c7\u30eb\u3092\u30c7\u30d5\u30a9\u30eb\u30c8\u306b\u30ea\u30bb\u30c3\u30c8 -reasoning.picker.tooltip=\u63a8\u8ad6\u52aa\u529b\u3092\u9078\u629e +prompt.placeholder=メッセージを入力… +prompt.placeholder.with.shortcuts=メッセージを入力…({0}で送信、{1}で改行) +prompt.placeholder.with.send=メッセージを入力…({0}で送信) +prompt.placeholder.with.newline=メッセージを入力…({0}で改行) +prompt.button.send=送信 +prompt.button.stop=停止 +prompt.button.send.tooltip.stop=停止するには{0}を押してください +mode.picker.tooltip=モードを選択 +mode.picker.deprecated=非推奨 +model.picker.tooltip=モデルを選択 +model.picker.recommended=おすすめ +model.picker.favorites=お気に入り +model.picker.search=モデルを検索 +model.picker.no.matches=一致するモデルなし +model.picker.favorite.add=お気に入りに追加 +model.picker.favorite.remove=お気に入りから削除 +model.picker.free=無料 +model.picker.reset=モデルをデフォルトにリセット +reasoning.picker.tooltip=推論努力を選択 -history.tab.local=\u30ed\u30fc\u30ab\u30eb -history.tab.cloud=\u30af\u30e9\u30a6\u30c9 -history.back=\u623b\u308b -history.search.placeholder=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u691c\u7d22 -history.empty=\u30bb\u30c3\u30b7\u30e7\u30f3\u306a\u3057 -history.loading=\u8aad\u307f\u8fbc\u307f\u4e2d\u2026 -history.untitled=\u540d\u524d\u306a\u3057 -history.delete.text=\u524a\u9664 -history.delete.confirm.title=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f -history.delete.confirm.message=\u300c{0}\u300d\u3092\u30ed\u30fc\u30ab\u30eb\u5c65\u6b74\u304b\u3089\u524a\u9664\u3057\u307e\u3059\u304b\uff1f -history.delete.confirm.message.multiple={0}\u500b\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30ab\u30eb\u5c65\u6b74\u304b\u3089\u524a\u9664\u3057\u307e\u3059\u304b\uff1f -history.rename.title=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u5909\u540d -history.rename.prompt=\u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3\u540d\uff1a -history.cloud.load.more=\u3055\u3089\u306b\u8aad\u307f\u8fbc\u3080 -history.cloud.repo.only=\u3053\u306e\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u307f -history.group.today=\u4eca\u65e5 -history.group.yesterday=\u6628\u65e5 -history.group.week=\u4eca\u9031 -history.group.month=\u4eca\u6708 -history.group.older=\u3055\u3089\u306b\u53e4\u3044 -history.time.moments=\u305f\u3063\u305f\u4eca -history.time.minutes={0}\u5206\u524d -history.time.hours={0}\u6642\u9593\u524d -history.time.days={0}\u65e5\u524d -history.time.months={0}\u304b\u6708\u524d -history.time.years={0}\u5e74\u524d -history.error.local=\u30ed\u30fc\u30ab\u30eb\u5c65\u6b74\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f -history.error.cloud=\u30af\u30e9\u30a6\u30c9\u5c65\u6b74\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f -history.error.local.delete=\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u524a\u9664\u306b\u5931\u6557\u3057\u307e\u3057\u305f -history.error.local.rename=\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u5909\u540d\u306b\u5931\u6557\u3057\u307e\u3057\u305f -history.error.cloud.delete=\u30af\u30e9\u30a6\u30c9\u30bb\u30c3\u30b7\u30e7\u30f3\u306f\u307e\u3060\u524a\u9664\u3067\u304d\u307e\u305b\u3093 +history.tab.local=ローカル +history.tab.cloud=クラウド +history.back=戻る +history.search.placeholder=セッションを検索 +history.empty=セッションなし +history.loading=読み込み中… +history.untitled=名前なし +history.delete.text=削除 +history.delete.confirm.title=セッションを削除しますか? +history.delete.confirm.message=「{0}」をローカル履歴から削除しますか? +history.delete.confirm.message.multiple={0}個のセッションをローカル履歴から削除しますか? +history.rename.title=セッションを変名 +history.rename.prompt=新しいセッション名: +history.cloud.load.more=さらに読み込む +history.cloud.repo.only=このリポジトリのみ +history.group.today=今日 +history.group.yesterday=昨日 +history.group.week=今週 +history.group.month=今月 +history.group.older=さらに古い +history.time.moments=たった今 +history.time.minutes={0}分前 +history.time.hours={0}時間前 +history.time.days={0}日前 +history.time.months={0}か月前 +history.time.years={0}年前 +history.error.local=ローカル履歴の読み込みに失敗しました +history.error.cloud=クラウド履歴の読み込みに失敗しました +history.error.local.delete=セッションの削除に失敗しました +history.error.local.rename=セッションの変名に失敗しました +history.error.cloud.delete=クラウドセッションはまだ削除できません -action.Kilo.Settings.text=\u8a2d\u5b9a -action.Kilo.Settings.description=Kilo Code\u306e\u8a2d\u5b9a -action.Kilo.NewSession.text=\u65b0\u3057\u3044\u30bb\u30c3\u30b7\u30e7\u30f3 -action.Kilo.NewSession.description=\u65b0\u3057\u3044Kilo\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u958b\u59cb -action.Kilo.History.text=\u5c65\u6b74 -action.Kilo.History.description=\u30bb\u30c3\u30b7\u30e7\u30f3\u5c65\u6b74\u3092\u8868\u793a -action.Kilo.SendPrompt.text=\u30d7\u30ed\u30f3\u30d7\u30c8\u3092\u9001\u4fe1 -action.Kilo.SendPrompt.description=\u73fe\u5728\u306eKilo\u30d7\u30ed\u30f3\u30d7\u30c8\u3092\u9001\u4fe1 -action.Kilo.StopSession.text=\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u505c\u6b62 -action.Kilo.StopSession.description=\u73fe\u5728\u306eKilo\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u505c\u6b62 -action.Kilo.SettingsGroup.text=\u8a2d\u5b9a -action.Kilo.SettingsGroup.description=Kilo Code\u306e\u8a2d\u5b9a -action.Kilo.Restart.text=Kilo\u3092\u518d\u8d77\u52d5 -action.Kilo.Restart.description=CLI\u30d7\u30ed\u30bb\u30b9\u3092\u7d42\u4e86\u3057\u3066\u518d\u8d77\u52d5 -action.Kilo.Reinstall.text=Kilo\u3092\u518d\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb -action.Kilo.Reinstall.description=CLI\u30d0\u30a4\u30ca\u30ea\u3092\u518d\u5c55\u958b\u3057\u3066\u518d\u8d77\u52d5 -action.Kilo.Session.Open.text=\u958b\u304f -action.Kilo.Session.Open.description=\u9078\u629e\u3057\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u958b\u304f -action.Kilo.Session.Rename.text=\u5909\u540d -action.Kilo.Session.Rename.description=\u9078\u629e\u3057\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u5909\u540d -action.Kilo.Session.Delete.text=\u524a\u9664 -action.Kilo.Session.Delete.description=\u9078\u629e\u3057\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u524a\u9664 -action.Kilo.History.ContextMenu.text=\u5c65\u6b74\u30a2\u30af\u30b7\u30e7\u30f3 +action.Kilo.Settings.text=設定 +action.Kilo.Settings.description=Kilo Codeの設定 +action.Kilo.NewSession.text=新しいセッション +action.Kilo.NewSession.description=新しいKiloセッションを開始 +action.Kilo.History.text=履歴 +action.Kilo.History.description=セッション履歴を表示 +action.Kilo.SendPrompt.text=プロンプトを送信 +action.Kilo.SendPrompt.description=現在のKiloプロンプトを送信 +action.Kilo.StopSession.text=セッションを停止 +action.Kilo.StopSession.description=現在のKiloセッションを停止 +action.Kilo.SettingsGroup.text=設定 +action.Kilo.SettingsGroup.description=Kilo Codeの設定 +action.Kilo.Restart.text=Kiloを再起動 +action.Kilo.Restart.description=CLIプロセスを終了して再起動 +action.Kilo.Reinstall.text=Kiloを再インストール +action.Kilo.Reinstall.description=CLIバイナリを再展開して再起動 +action.Kilo.Session.Open.text=開く +action.Kilo.Session.Open.description=選択したセッションを開く +action.Kilo.Session.Rename.text=変名 +action.Kilo.Session.Rename.description=選択したセッションを変名 +action.Kilo.Session.Delete.text=削除 +action.Kilo.Session.Delete.description=選択したセッションを削除 +action.Kilo.History.ContextMenu.text=履歴アクション diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ko.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ko.properties index 5a56718ff1c..893abc95b96 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ko.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ko.properties @@ -1,139 +1,139 @@ -session.connection.connecting=\ub85c\ub529 \uc911\u2026 -session.connection.error.app=\uc5f0\uacb0 \uc2e4\ud328 -session.connection.error.workspace=\uc6cc\ud06c\uc2a4\ud398\uc774\uc2a4 \ub85c\ub529 \uc2e4\ud328 -session.connection.error.unknown=\uc54c \uc218 \uc5c6\ub294 \uc624\ub958 -session.connection.retry=\ub2e4\uc2dc \uc2dc\ub3c4 -session.connection.warning.config=\uad6c\uc131 \uacbd\uace0 +session.connection.connecting=로딩 중… +session.connection.error.app=연결 실패 +session.connection.error.workspace=워크스페이스 로딩 실패 +session.connection.error.unknown=알 수 없는 오류 +session.connection.retry=다시 시도 +session.connection.warning.config=구성 경고 -session.empty.welcome=Kilo Code\ub294 AI \ucf54\ub529 \uc5b4\uc2dc\uc2a4\ud134\ud2b8\uc785\ub2c8\ub2e4. \uae30\ub2a5 \uad6c\ucd95, \ubc84\uadf8 \uc218\uc815, \ucf54\ub4dc\ubca0\uc774\uc2a4 \uc124\uba85\uc744 \uc694\uccad\ud558\uc138\uc694. -session.empty.loading=\ub85c\ub529 \uc911\u2026 -session.empty.recent=\ucd5c\uadfc -session.showHistory=\uae30\ub85d \ubcf4\uae30 -session.scroll.bottom=\ub9e8 \uc544\ub798\ub85c \uc2a4\ud06c\ub864 -session.tab.new=\uc0c8 \uc138\uc158 -session.tab.untitled=\uc81c\ubaa9 \uc5c6\ub294 \uc138\uc158 +session.empty.welcome=Kilo Code는 AI 코딩 어시스턴트입니다. 기능 구축, 버그 수정, 코드베이스 설명을 요청하세요. +session.empty.loading=로딩 중… +session.empty.recent=최근 +session.showHistory=기록 보기 +session.scroll.bottom=맨 아래로 스크롤 +session.tab.new=새 세션 +session.tab.untitled=제목 없는 세션 -session.permission.title=\uad8c\ud55c \uc694\uccad -session.permission.meta=\ub3c4\uad6c: {0} \u2022 \ud328\ud134: {1} -session.permission.allow=\ud5c8\uc6a9 -session.permission.deny=\uac70\ubd80 -session.question.dismiss=\ub2eb\uae30 +session.permission.title=권한 요청 +session.permission.meta=도구: {0} • 패턴: {1} +session.permission.allow=허용 +session.permission.deny=거부 +session.question.dismiss=닫기 -session.status.considering=\ub2e4\uc74c \ub2e8\uacc4 \uace0\ub824 \uc911\u2026 -session.status.thinking=\uc0dd\uac01 \uc911\u2026 -session.status.writing=\uc751\ub2f5 \uc791\uc131 \uc911\u2026 -session.status.delegating=\uc791\uc5c5 \uc704\uc784 \uc911\u2026 -session.status.planning=\uacc4\ud68d \uc911\u2026 -session.status.gathering=\ucee8\ud14d\uc2a4\ud2b8 \uc218\uc9d1 \uc911\u2026 -session.status.searching.codebase=\ucf54\ub4dc\ubca0\uc774\uc2a4 \uac80\uc0c9 \uc911\u2026 -session.status.searching.web=\uc6f9 \uac80\uc0c9 \uc911\u2026 -session.status.editing=\ud3b8\uc9d1 \uc911\u2026 -session.status.commands=\uba85\ub839 \uc2e4\ud589 \uc911\u2026 +session.status.considering=다음 단계 고려 중… +session.status.thinking=생각 중… +session.status.writing=응답 작성 중… +session.status.delegating=작업 위임 중… +session.status.planning=계획 중… +session.status.gathering=컨텍스트 수집 중… +session.status.searching.codebase=코드베이스 검색 중… +session.status.searching.web=웹 검색 중… +session.status.editing=편집 중… +session.status.commands=명령 실행 중… -session.part.reasoning=\ucd94\ub860 -session.part.compaction=\ucee8\ud14d\uc2a4\ud2b8 \uc555\ucd95\ub428 -session.part.tool.copy=\ubcf5\uc0ac -session.part.tool.error=\uc624\ub958 -session.part.tool.pending=\ub300\uae30 \uc911 -session.part.tool.read=\uc77d\uae30 -session.part.tool.running=\uc2e4\ud589 \uc911 -session.part.tool.shell=\uc178 -session.part.tool.truncated=\ubbf8\ub9ac\ubcf4\uae30\uc5d0\uc11c \ucd9c\ub825\uc774 \uc798\ub838\uc2b5\ub2c8\ub2e4. \uc804\uccb4 \ucd9c\ub825\uc740 \uc138\uc158 \ub370\uc774\ud130\uc5d0 \ub0a8\uc544 \uc788\uc2b5\ub2c8\ub2e4. +session.part.reasoning=추론 +session.part.compaction=컨텍스트 압축됨 +session.part.tool.copy=복사 +session.part.tool.error=오류 +session.part.tool.pending=대기 중 +session.part.tool.read=읽기 +session.part.tool.running=실행 중 +session.part.tool.shell=셸 +session.part.tool.truncated=미리보기에서 출력이 잘렸습니다. 전체 출력은 세션 데이터에 남아 있습니다. -session.error.prompt=\ud504\ub86c\ud504\ud2b8 \uc2e4\ud328 -session.error.compact=\uc138\uc158 \uc555\ucd95 \uc2e4\ud328 -session.error.unknown=\uc54c \uc218 \uc5c6\ub294 \uc624\ub958 +session.error.prompt=프롬프트 실패 +session.error.compact=세션 압축 실패 +session.error.unknown=알 수 없는 오류 -session.header.tokens=\ud1a0\ud070 -session.header.tokens.description=\ub9c8\uc9c0\ub9c9 \uc5b4\uc2dc\uc2a4\ud134\ud2b8 \uc751\ub2f5\uc5d0\uc11c \uc0ac\uc6a9\ub41c \ud1a0\ud070: \uc785\ub825, \ucd9c\ub825, \uce90\uc2dc \uc4f0\uae30, \uce90\uc2dc \uc77d\uae30. -session.header.input=\uc785\ub825 {0} -session.header.output=\ucd9c\ub825 {0} -session.header.cache.write=\uce90\uc2dc \uc4f0\uae30 {0} -session.header.cache.read=\uce90\uc2dc \uc77d\uae30 {0} -session.header.compact=\uc138\uc158 \uc555\ucd95 -session.header.compact.description=\ucee8\ud14d\uc2a4\ud2b8 \ud06c\uae30\ub97c \uc904\uc774\uae30 \uc704\ud574 \uc138\uc158 \uc694\uc57d -session.header.expand=\uc138\uc158 \uba54\ud2b8\ub9ad \ud45c\uc2dc -session.header.collapse=\uc138\uc158 \uba54\ud2b8\ub9ad \uc228\uae30\uae30 -session.header.todos.progress={0}/{1} \ud560 \uc77c \uc644\ub8cc -session.header.todos.done=\ubaa8\ub4e0 {0}\uac1c \ud560 \uc77c \uc644\ub8cc -session.header.context.tooltip.percent={0} \ud1a0\ud070 (\ucee8\ud14d\uc2a4\ud2b8\uc758 {1}%) -session.header.context.tooltip.tokens={0} \ud1a0\ud070 -session.header.context.used={0} / {1} \ud1a0\ud070 \uc0ac\uc6a9 \uc911 -session.header.context.reserved={0} \ucd9c\ub825\uc6a9 \uc608\uc57d\ub428 -session.header.context.available={0} \uc0ac\uc6a9 \uac00\ub2a5 +session.header.tokens=토큰 +session.header.tokens.description=마지막 어시스턴트 응답에서 사용된 토큰: 입력, 출력, 캐시 쓰기, 캐시 읽기. +session.header.input=입력 {0} +session.header.output=출력 {0} +session.header.cache.write=캐시 쓰기 {0} +session.header.cache.read=캐시 읽기 {0} +session.header.compact=세션 압축 +session.header.compact.description=컨텍스트 크기를 줄이기 위해 세션 요약 +session.header.expand=세션 메트릭 표시 +session.header.collapse=세션 메트릭 숨기기 +session.header.todos.progress={0}/{1} 할 일 완료 +session.header.todos.done=모든 {0}개 할 일 완료 +session.header.context.tooltip.percent={0} 토큰 (컨텍스트의 {1}%) +session.header.context.tooltip.tokens={0} 토큰 +session.header.context.used={0} / {1} 토큰 사용 중 +session.header.context.reserved={0} 출력용 예약됨 +session.header.context.available={0} 사용 가능 -prompt.placeholder=\uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694\u2026 -prompt.placeholder.with.shortcuts=\uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694\u2026 ({0} \uc804\uc1a1, {1} \uc0c8 \uc904) -prompt.placeholder.with.send=\uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694\u2026 ({0} \uc804\uc1a1) -prompt.placeholder.with.newline=\uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694\u2026 ({0} \uc0c8 \uc904) -prompt.button.send=\uc804\uc1a1 -prompt.button.stop=\uc815\uc9c0 -prompt.button.send.tooltip.stop=\uc815\uc9c0\ud558\ub824\uba74 {0}\uc744 \ub204\ub974\uc138\uc694 -mode.picker.tooltip=\ubaa8\ub4dc \uc120\ud0dd -mode.picker.deprecated=\uc0ac\uc6a9 \uc911\ub2e8 -model.picker.tooltip=\ubaa8\ub378 \uc120\ud0dd -model.picker.recommended=\ucd94\ucc9c -model.picker.favorites=\uc990\uaca8\ucc3e\uae30 -model.picker.search=\ubaa8\ub378 \uac80\uc0c9 -model.picker.no.matches=\uc77c\uce58\ud558\ub294 \ubaa8\ub378 \uc5c6\uc74c -model.picker.favorite.add=\uc990\uaca8\ucc3e\uae30\uc5d0 \ucd94\uac00 -model.picker.favorite.remove=\uc990\uaca8\ucc3e\uae30\uc5d0\uc11c \uc81c\uac70 -model.picker.free=\ubb34\ub8cc -model.picker.reset=\ubaa8\ub378\uc744 \uae30\ubcf8\uac12\uc73c\ub85c \uc7ac\uc124\uc815 -reasoning.picker.tooltip=\ucd94\ub860 \ub178\ub825 \uc120\ud0dd +prompt.placeholder=메시지를 입력하세요… +prompt.placeholder.with.shortcuts=메시지를 입력하세요… ({0} 전송, {1} 새 줄) +prompt.placeholder.with.send=메시지를 입력하세요… ({0} 전송) +prompt.placeholder.with.newline=메시지를 입력하세요… ({0} 새 줄) +prompt.button.send=전송 +prompt.button.stop=정지 +prompt.button.send.tooltip.stop=정지하려면 {0}을 누르세요 +mode.picker.tooltip=모드 선택 +mode.picker.deprecated=사용 중단 +model.picker.tooltip=모델 선택 +model.picker.recommended=추천 +model.picker.favorites=즐겨찾기 +model.picker.search=모델 검색 +model.picker.no.matches=일치하는 모델 없음 +model.picker.favorite.add=즐겨찾기에 추가 +model.picker.favorite.remove=즐겨찾기에서 제거 +model.picker.free=무료 +model.picker.reset=모델을 기본값으로 재설정 +reasoning.picker.tooltip=추론 노력 선택 -history.tab.local=\ub85c\ucec8 -history.tab.cloud=\ud074\ub77c\uc6b0\ub4dc -history.back=\ub4a4\ub85c -history.search.placeholder=\uc138\uc158 \uac80\uc0c9 -history.empty=\uc138\uc158 \uc5c6\uc74c -history.loading=\ub85c\ub529 \uc911\u2026 -history.untitled=\uc81c\ubaa9 \uc5c6\uc74c -history.delete.text=\uc0ad\uc81c -history.delete.confirm.title=\uc138\uc158\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -history.delete.confirm.message=\ub85c\ucec8 \uae30\ub85d\uc5d0\uc11c "{0}"\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -history.delete.confirm.message.multiple=\ub85c\ucec8 \uae30\ub85d\uc5d0\uc11c {0}\uac1c\uc758 \uc138\uc158\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -history.rename.title=\uc138\uc158 \uc774\ub984 \ubc14\uafb8\uae30 -history.rename.prompt=\uc0c8 \uc138\uc158 \uc774\ub984: -history.cloud.load.more=\ub354 \ubd88\ub7ec\uc624\uae30 -history.cloud.repo.only=\uc774 \ub9ac\ud3ec\uc9c0\ud130\ub9ac\ub9cc -history.group.today=\uc624\ub298 -history.group.yesterday=\uc5b4\uc81c -history.group.week=\uc774\ubc88 \uc8fc -history.group.month=\uc774\ubc88 \ub2ec -history.group.older=\ub354 \uc624\ub798\ub41c -history.time.moments=\ubc29\uae08 -history.time.minutes={0}\ubd84 \uc804 -history.time.hours={0}\uc2dc\uac04 \uc804 -history.time.days={0}\uc77c \uc804 -history.time.months={0}\uac1c\uc6d4 \uc804 -history.time.years={0}\ub144 \uc804 -history.error.local=\ub85c\ucec8 \uae30\ub85d\uc744 \ub85c\ub4dc\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4 -history.error.cloud=\ud074\ub77c\uc6b0\ub4dc \uae30\ub85d\uc744 \ub85c\ub4dc\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4 -history.error.local.delete=\uc138\uc158\uc744 \uc0ad\uc81c\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4 -history.error.local.rename=\uc138\uc158\uc758 \uc774\ub984\uc744 \ubc14\uafb8\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4 -history.error.cloud.delete=\ud074\ub77c\uc6b0\ub4dc \uc138\uc158\uc740 \uc544\uc9c1 \uc0ad\uc81c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4 +history.tab.local=로컈 +history.tab.cloud=클라우드 +history.back=뒤로 +history.search.placeholder=세션 검색 +history.empty=세션 없음 +history.loading=로딩 중… +history.untitled=제목 없음 +history.delete.text=삭제 +history.delete.confirm.title=세션을 삭제하시겠습니까? +history.delete.confirm.message=로컈 기록에서 "{0}"을 삭제하시겠습니까? +history.delete.confirm.message.multiple=로컈 기록에서 {0}개의 세션을 삭제하시겠습니까? +history.rename.title=세션 이름 바꾸기 +history.rename.prompt=새 세션 이름: +history.cloud.load.more=더 불러오기 +history.cloud.repo.only=이 리포지터리만 +history.group.today=오늘 +history.group.yesterday=어제 +history.group.week=이번 주 +history.group.month=이번 달 +history.group.older=더 오래된 +history.time.moments=방금 +history.time.minutes={0}분 전 +history.time.hours={0}시간 전 +history.time.days={0}일 전 +history.time.months={0}개월 전 +history.time.years={0}년 전 +history.error.local=로컈 기록을 로드하지 못했습니다 +history.error.cloud=클라우드 기록을 로드하지 못했습니다 +history.error.local.delete=세션을 삭제하지 못했습니다 +history.error.local.rename=세션의 이름을 바꾸지 못했습니다 +history.error.cloud.delete=클라우드 세션은 아직 삭제할 수 없습니다 -action.Kilo.Settings.text=\uc124\uc815 -action.Kilo.Settings.description=Kilo Code \uc124\uc815 -action.Kilo.NewSession.text=\uc0c8 \uc138\uc158 -action.Kilo.NewSession.description=\uc0c8 Kilo \uc138\uc158 \uc2dc\uc791 -action.Kilo.History.text=\uae30\ub85d -action.Kilo.History.description=\uc138\uc158 \uae30\ub85d \ud45c\uc2dc -action.Kilo.SendPrompt.text=\ud504\ub86c\ud504\ud2b8 \uc804\uc1a1 -action.Kilo.SendPrompt.description=\ud604\uc7ac Kilo \ud504\ub86c\ud504\ud2b8 \uc804\uc1a1 -action.Kilo.StopSession.text=\uc138\uc158 \uc815\uc9c0 -action.Kilo.StopSession.description=\ud604\uc7ac Kilo \uc138\uc158 \uc815\uc9c0 -action.Kilo.SettingsGroup.text=\uc124\uc815 -action.Kilo.SettingsGroup.description=Kilo Code \uc124\uc815 -action.Kilo.Restart.text=Kilo \uc7ac\uc2dc\uc791 -action.Kilo.Restart.description=CLI \ud504\ub85c\uc138\uc2a4 \uc885\ub8cc \ud6c4 \uc7ac\uc2dc\uc791 -action.Kilo.Reinstall.text=Kilo \uc7ac\uc124\uce58 -action.Kilo.Reinstall.description=CLI \ubc14\uc774\ub108\ub9ac \uc7ac\ucd94\ucd9c \ud6c4 \uc7ac\uc2dc\uc791 -action.Kilo.Session.Open.text=\uc5f4\uae30 -action.Kilo.Session.Open.description=\uc120\ud0dd\ud55c \uc138\uc158 \uc5f4\uae30 -action.Kilo.Session.Rename.text=\uc774\ub984 \ubc14\uafb8\uae30 -action.Kilo.Session.Rename.description=\uc120\ud0dd\ud55c \uc138\uc158 \uc774\ub984 \ubc14\uafb8\uae30 -action.Kilo.Session.Delete.text=\uc0ad\uc81c -action.Kilo.Session.Delete.description=\uc120\ud0dd\ud55c \uc138\uc158 \uc0ad\uc81c -action.Kilo.History.ContextMenu.text=\uae30\ub85d \uc791\uc5c5 +action.Kilo.Settings.text=설정 +action.Kilo.Settings.description=Kilo Code 설정 +action.Kilo.NewSession.text=새 세션 +action.Kilo.NewSession.description=새 Kilo 세션 시작 +action.Kilo.History.text=기록 +action.Kilo.History.description=세션 기록 표시 +action.Kilo.SendPrompt.text=프롬프트 전송 +action.Kilo.SendPrompt.description=현재 Kilo 프롬프트 전송 +action.Kilo.StopSession.text=세션 정지 +action.Kilo.StopSession.description=현재 Kilo 세션 정지 +action.Kilo.SettingsGroup.text=설정 +action.Kilo.SettingsGroup.description=Kilo Code 설정 +action.Kilo.Restart.text=Kilo 재시작 +action.Kilo.Restart.description=CLI 프로세스 종료 후 재시작 +action.Kilo.Reinstall.text=Kilo 재설치 +action.Kilo.Reinstall.description=CLI 바이너리 재추출 후 재시작 +action.Kilo.Session.Open.text=열기 +action.Kilo.Session.Open.description=선택한 세션 열기 +action.Kilo.Session.Rename.text=이름 바꾸기 +action.Kilo.Session.Rename.description=선택한 세션 이름 바꾸기 +action.Kilo.Session.Delete.text=삭제 +action.Kilo.Session.Delete.description=선택한 세션 삭제 +action.Kilo.History.ContextMenu.text=기록 작업 diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_nl.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_nl.properties index 5d1b1ee6fdf..e88d7960997 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_nl.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_nl.properties @@ -1,4 +1,4 @@ -session.connection.connecting=Laden\u2026 +session.connection.connecting=Laden… session.connection.error.app=Verbinding mislukt session.connection.error.workspace=Werkruimte laden mislukt session.connection.error.unknown=Onbekende fout @@ -6,7 +6,7 @@ session.connection.retry=Opnieuw proberen session.connection.warning.config=Configuratiewaarschuwingen session.empty.welcome=Kilo Code is een AI-codeerassistent. Vraag het om functies te bouwen, bugs te repareren of uw codebase uit te leggen. -session.empty.loading=Laden\u2026 +session.empty.loading=Laden… session.empty.recent=RECENT session.showHistory=Geschiedenis weergeven session.scroll.bottom=Naar beneden scrollen @@ -14,25 +14,25 @@ session.tab.new=Nieuwe sessie session.tab.untitled=Naamloze sessie session.permission.title=Toestemmingsverzoek -session.permission.meta=Hulpmiddel: {0} \u2022 Patronen: {1} +session.permission.meta=Hulpmiddel: {0} • Patronen: {1} session.permission.allow=Toestaan session.permission.deny=Weigeren session.question.dismiss=Sluiten -session.status.considering=Volgende stappen overwegen\u2026 -session.status.thinking=Nadenken\u2026 -session.status.writing=Antwoord schrijven\u2026 -session.status.delegating=Werk delegeren\u2026 -session.status.planning=Plannen\u2026 -session.status.gathering=Context verzamelen\u2026 -session.status.searching.codebase=Codebase doorzoeken\u2026 -session.status.searching.web=Web doorzoeken\u2026 -session.status.editing=Bewerkingen uitvoeren\u2026 -session.status.commands=Opdrachten uitvoeren\u2026 +session.status.considering=Volgende stappen overwegen… +session.status.thinking=Nadenken… +session.status.writing=Antwoord schrijven… +session.status.delegating=Werk delegeren… +session.status.planning=Plannen… +session.status.gathering=Context verzamelen… +session.status.searching.codebase=Codebase doorzoeken… +session.status.searching.web=Web doorzoeken… +session.status.editing=Bewerkingen uitvoeren… +session.status.commands=Opdrachten uitvoeren… session.part.reasoning=Redenering session.part.compaction=context gecomprimeerd -session.part.tool.copy=Kopi\u00ebren +session.part.tool.copy=Kopiëren session.part.tool.error=Fout session.part.tool.pending=In afwachting session.part.tool.read=Lezen @@ -62,10 +62,10 @@ session.header.context.used={0} / {1} tokens gebruikt session.header.context.reserved={0} gereserveerd voor uitvoer session.header.context.available={0} beschikbaar -prompt.placeholder=Typ een bericht\u2026 -prompt.placeholder.with.shortcuts=Typ een bericht\u2026 ({0} om te verzenden, {1} voor nieuwe regel) -prompt.placeholder.with.send=Typ een bericht\u2026 ({0} om te verzenden) -prompt.placeholder.with.newline=Typ een bericht\u2026 ({0} voor nieuwe regel) +prompt.placeholder=Typ een bericht… +prompt.placeholder.with.shortcuts=Typ een bericht… ({0} om te verzenden, {1} voor nieuwe regel) +prompt.placeholder.with.send=Typ een bericht… ({0} om te verzenden) +prompt.placeholder.with.newline=Typ een bericht… ({0} voor nieuwe regel) prompt.button.send=Verzenden prompt.button.stop=Stoppen prompt.button.send.tooltip.stop=Druk op {0} om te stoppen @@ -87,7 +87,7 @@ history.tab.cloud=Cloud history.back=Terug history.search.placeholder=Sessies zoeken history.empty=Geen sessies -history.loading=Laden\u2026 +history.loading=Laden… history.untitled=Naamloos history.delete.text=Verwijderen history.delete.confirm.title=Sessie verwijderen? @@ -127,7 +127,7 @@ action.Kilo.StopSession.description=Huidige Kilo-sessie stoppen action.Kilo.SettingsGroup.text=Instellingen action.Kilo.SettingsGroup.description=Kilo Code-instellingen action.Kilo.Restart.text=Kilo herstarten -action.Kilo.Restart.description=CLI-proces be\u00ebindigen en herstarten +action.Kilo.Restart.description=CLI-proces beëindigen en herstarten action.Kilo.Reinstall.text=Kilo herinstalleren action.Kilo.Reinstall.description=CLI-binair opnieuw uitpakken en herstarten action.Kilo.Session.Open.text=Openen diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_no.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_no.properties index 18c1d5bc99d..e7631a21d2c 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_no.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_no.properties @@ -1,34 +1,34 @@ -session.connection.connecting=Laster\u2026 +session.connection.connecting=Laster… session.connection.error.app=Tilkoblingsfeil -session.connection.error.workspace=Feil ved lasting av arbeidsomr\u00e5de +session.connection.error.workspace=Feil ved lasting av arbeidsområde session.connection.error.unknown=Ukjent feil -session.connection.retry=Pr\u00f8v igjen +session.connection.retry=Prøv igjen session.connection.warning.config=Konfigurasjonsadvarsler -session.empty.welcome=Kilo Code er en AI-kodingsassistent. Be den om \u00e5 bygge funksjoner, fikse feil eller forklare kodebasen din. -session.empty.loading=Laster\u2026 +session.empty.welcome=Kilo Code er en AI-kodingsassistent. Be den om å bygge funksjoner, fikse feil eller forklare kodebasen din. +session.empty.loading=Laster… session.empty.recent=NYLIGE session.showHistory=Vis historikk session.scroll.bottom=Rull til bunnen -session.tab.new=Ny \u00f8kt +session.tab.new=Ny økt session.tab.untitled=Uten tittel -session.permission.title=Tillatelsesforesp\u00f8rsel -session.permission.meta=Verkt\u00f8y: {0} \u2022 M\u00f8nstre: {1} +session.permission.title=Tillatelsesforespørsel +session.permission.meta=Verktøy: {0} • Mønstre: {1} session.permission.allow=Tillat -session.permission.deny=Avsl\u00e5 +session.permission.deny=Avslå session.question.dismiss=Lukk -session.status.considering=Vurderer neste steg\u2026 -session.status.thinking=Tenker\u2026 -session.status.writing=Skriver svar\u2026 -session.status.delegating=Delegerer arbeid\u2026 -session.status.planning=Planlegger\u2026 -session.status.gathering=Samler kontekst\u2026 -session.status.searching.codebase=S\u00f8ker i kodebasen\u2026 -session.status.searching.web=S\u00f8ker p\u00e5 nettet\u2026 -session.status.editing=Gj\u00f8r redigeringer\u2026 -session.status.commands=Kj\u00f8rer kommandoer\u2026 +session.status.considering=Vurderer neste steg… +session.status.thinking=Tenker… +session.status.writing=Skriver svar… +session.status.delegating=Delegerer arbeid… +session.status.planning=Planlegger… +session.status.gathering=Samler kontekst… +session.status.searching.codebase=Søker i kodebasen… +session.status.searching.web=Søker på nettet… +session.status.editing=Gjør redigeringer… +session.status.commands=Kjører kommandoer… session.part.reasoning=Resonnering session.part.compaction=kontekst komprimert @@ -36,12 +36,12 @@ session.part.tool.copy=Kopier session.part.tool.error=Feil session.part.tool.pending=Venter session.part.tool.read=Les -session.part.tool.running=Kj\u00f8rer +session.part.tool.running=Kjører session.part.tool.shell=Shell -session.part.tool.truncated=Utdata avkortet i forh\u00e5ndsvisning. Fullstendig utdata finnes fortsatt i \u00f8ktdata. +session.part.tool.truncated=Utdata avkortet i forhåndsvisning. Fullstendig utdata finnes fortsatt i øktdata. -session.error.prompt=Foresp\u00f8rsel mislyktes -session.error.compact=Komprimer \u00f8kt mislyktes +session.error.prompt=Forespørsel mislyktes +session.error.compact=Komprimer økt mislyktes session.error.unknown=Ukjent feil session.header.tokens=Tokens @@ -50,90 +50,90 @@ session.header.input=inn {0} session.header.output=ut {0} session.header.cache.write=cache-skriving {0} session.header.cache.read=cache-lesing {0} -session.header.compact=Komprimer \u00f8kt -session.header.compact.description=Oppsummer \u00f8kten for \u00e5 redusere kontekstst\u00f8rrelsen -session.header.expand=Vis \u00f8ktberegninger -session.header.collapse=Skjul \u00f8ktberegninger -session.header.todos.progress={0}/{1} oppgaver fullf\u00f8rt -session.header.todos.done=Alle {0} oppgaver fullf\u00f8rt +session.header.compact=Komprimer økt +session.header.compact.description=Oppsummer økten for å redusere kontekststørrelsen +session.header.expand=Vis øktberegninger +session.header.collapse=Skjul øktberegninger +session.header.todos.progress={0}/{1} oppgaver fullført +session.header.todos.done=Alle {0} oppgaver fullført session.header.context.tooltip.percent={0} tokens ({1}% av konteksten) session.header.context.tooltip.tokens={0} tokens session.header.context.used={0} / {1} tokens brukt session.header.context.reserved={0} reservert for utdata session.header.context.available={0} tilgjengelig -prompt.placeholder=Skriv en melding\u2026 -prompt.placeholder.with.shortcuts=Skriv en melding\u2026 ({0} for \u00e5 sende, {1} for ny linje) -prompt.placeholder.with.send=Skriv en melding\u2026 ({0} for \u00e5 sende) -prompt.placeholder.with.newline=Skriv en melding\u2026 ({0} for ny linje) +prompt.placeholder=Skriv en melding… +prompt.placeholder.with.shortcuts=Skriv en melding… ({0} for å sende, {1} for ny linje) +prompt.placeholder.with.send=Skriv en melding… ({0} for å sende) +prompt.placeholder.with.newline=Skriv en melding… ({0} for ny linje) prompt.button.send=Send prompt.button.stop=Stopp -prompt.button.send.tooltip.stop=Trykk {0} for \u00e5 stoppe +prompt.button.send.tooltip.stop=Trykk {0} for å stoppe mode.picker.tooltip=Velg modus mode.picker.deprecated=utdatert model.picker.tooltip=Velg modell model.picker.recommended=Anbefalt model.picker.favorites=Favoritter -model.picker.search=S\u00f8k etter modeller +model.picker.search=Søk etter modeller model.picker.no.matches=Ingen samsvarende modeller model.picker.favorite.add=Legg til favoritter model.picker.favorite.remove=Fjern fra favoritter model.picker.free=Gratis model.picker.reset=Tilbakestill modell til standard -reasoning.picker.tooltip=Velg resonnementsniv\u00e5 +reasoning.picker.tooltip=Velg resonnementsnivå history.tab.local=Lokal history.tab.cloud=Sky history.back=Tilbake -history.search.placeholder=S\u00f8k i \u00f8kter -history.empty=Ingen \u00f8kter -history.loading=Laster\u2026 +history.search.placeholder=Søk i økter +history.empty=Ingen økter +history.loading=Laster… history.untitled=Uten tittel history.delete.text=Slett -history.delete.confirm.title=Slette \u00f8kt? +history.delete.confirm.title=Slette økt? history.delete.confirm.message=Slette "{0}" fra lokal historikk? -history.delete.confirm.message.multiple=Slette {0} \u00f8kter fra lokal historikk? -history.rename.title=Gi \u00f8kten nytt navn -history.rename.prompt=Nytt \u00f8ktnavn: +history.delete.confirm.message.multiple=Slette {0} økter fra lokal historikk? +history.rename.title=Gi økten nytt navn +history.rename.prompt=Nytt øktnavn: history.cloud.load.more=Last inn mer history.cloud.repo.only=Bare dette depotet history.group.today=I dag -history.group.yesterday=I g\u00e5r +history.group.yesterday=I går history.group.week=Denne uken -history.group.month=Denne m\u00e5neden +history.group.month=Denne måneden history.group.older=Eldre -history.time.moments=Akkurat n\u00e5 +history.time.moments=Akkurat nå history.time.minutes={0} min siden history.time.hours={0} t siden history.time.days={0} d siden history.time.months={0} mnd siden -history.time.years={0} \u00e5r siden +history.time.years={0} år siden history.error.local=Kunne ikke laste lokal historikk history.error.cloud=Kunne ikke laste sky-historikk -history.error.local.delete=Kunne ikke slette \u00f8kt -history.error.local.rename=Kunne ikke gi \u00f8kten nytt navn -history.error.cloud.delete=Sky-\u00f8kter kan ikke slettes enn\u00e5 +history.error.local.delete=Kunne ikke slette økt +history.error.local.rename=Kunne ikke gi økten nytt navn +history.error.cloud.delete=Sky-økter kan ikke slettes ennå action.Kilo.Settings.text=Innstillinger action.Kilo.Settings.description=Kilo Code-innstillinger -action.Kilo.NewSession.text=Ny \u00f8kt -action.Kilo.NewSession.description=Start en ny Kilo-\u00f8kt +action.Kilo.NewSession.text=Ny økt +action.Kilo.NewSession.description=Start en ny Kilo-økt action.Kilo.History.text=Historikk -action.Kilo.History.description=Vis \u00f8kthistorikk -action.Kilo.SendPrompt.text=Send foresp\u00f8rsel -action.Kilo.SendPrompt.description=Send gjeldende Kilo-foresp\u00f8rsel -action.Kilo.StopSession.text=Stopp \u00f8kt -action.Kilo.StopSession.description=Stopp gjeldende Kilo-\u00f8kt +action.Kilo.History.description=Vis økthistorikk +action.Kilo.SendPrompt.text=Send forespørsel +action.Kilo.SendPrompt.description=Send gjeldende Kilo-forespørsel +action.Kilo.StopSession.text=Stopp økt +action.Kilo.StopSession.description=Stopp gjeldende Kilo-økt action.Kilo.SettingsGroup.text=Innstillinger action.Kilo.SettingsGroup.description=Kilo Code-innstillinger -action.Kilo.Restart.text=Start Kilo p\u00e5 nytt -action.Kilo.Restart.description=Avslutt og start CLI-prosessen p\u00e5 nytt -action.Kilo.Reinstall.text=Installer Kilo p\u00e5 nytt -action.Kilo.Reinstall.description=Pakk ut CLI-bin\u00e6rfilen p\u00e5 nytt og start p\u00e5 nytt -action.Kilo.Session.Open.text=\u00c5pne -action.Kilo.Session.Open.description=\u00c5pne valgt \u00f8kt +action.Kilo.Restart.text=Start Kilo på nytt +action.Kilo.Restart.description=Avslutt og start CLI-prosessen på nytt +action.Kilo.Reinstall.text=Installer Kilo på nytt +action.Kilo.Reinstall.description=Pakk ut CLI-binærfilen på nytt og start på nytt +action.Kilo.Session.Open.text=Åpne +action.Kilo.Session.Open.description=Åpne valgt økt action.Kilo.Session.Rename.text=Gi nytt navn -action.Kilo.Session.Rename.description=Gi valgt \u00f8kt nytt navn +action.Kilo.Session.Rename.description=Gi valgt økt nytt navn action.Kilo.Session.Delete.text=Slett -action.Kilo.Session.Delete.description=Slett valgte \u00f8kt(er) +action.Kilo.Session.Delete.description=Slett valgte økt(er) action.Kilo.History.ContextMenu.text=Historikkhandlinger diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pl.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pl.properties index a7fdaaa2395..53ddeb68b15 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pl.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pl.properties @@ -1,85 +1,85 @@ -session.connection.connecting=\u0141adowanie\u2026 -session.connection.error.app=B\u0142\u0105d po\u0142\u0105czenia -session.connection.error.workspace=B\u0142\u0105d \u0142adowania obszaru roboczego -session.connection.error.unknown=Nieznany b\u0142\u0105d -session.connection.retry=Spr\u00f3buj ponownie -session.connection.warning.config=Ostrze\u017cenia konfiguracji +session.connection.connecting=Ładowanie… +session.connection.error.app=Błąd połączenia +session.connection.error.workspace=Błąd ładowania obszaru roboczego +session.connection.error.unknown=Nieznany błąd +session.connection.retry=Spróbuj ponownie +session.connection.warning.config=Ostrzeżenia konfiguracji -session.empty.welcome=Kilo Code to asystent kodowania AI. Poproś go o tworzenie funkcji, naprawianie b\u0142\u0119d\u00f3w lub wyjaśnianie bazy kodu. -session.empty.loading=\u0141adowanie\u2026 +session.empty.welcome=Kilo Code to asystent kodowania AI. Poproś go o tworzenie funkcji, naprawianie błędów lub wyjaśnianie bazy kodu. +session.empty.loading=Ładowanie… session.empty.recent=OSTATNIE -session.showHistory=Poka\u017c histori\u0119 -session.scroll.bottom=Przewiń na d\u00f3\u0142 +session.showHistory=Pokaż historię +session.scroll.bottom=Przewiń na dół session.tab.new=Nowa sesja -session.tab.untitled=Sesja bez tytu\u0142u +session.tab.untitled=Sesja bez tytułu session.permission.title=Prośba o uprawnienia -session.permission.meta=Narz\u0119dzie: {0} \u2022 Wzorce: {1} -session.permission.allow=Zezw\u00f3l +session.permission.meta=Narzędzie: {0} • Wzorce: {1} +session.permission.allow=Zezwól session.permission.deny=Odmów session.question.dismiss=Odrzuć -session.status.considering=Rozwa\u017canie nast\u0119pnych krok\u00f3w\u2026 -session.status.thinking=Myślenie\u2026 -session.status.writing=Pisanie odpowiedzi\u2026 -session.status.delegating=Delegowanie pracy\u2026 -session.status.planning=Planowanie\u2026 -session.status.gathering=Zbieranie kontekstu\u2026 -session.status.searching.codebase=Przeszukiwanie bazy kodu\u2026 -session.status.searching.web=Przeszukiwanie sieci\u2026 -session.status.editing=Dokonywanie edycji\u2026 -session.status.commands=Uruchamianie polece\u0144\u2026 +session.status.considering=Rozważanie następnych kroków… +session.status.thinking=Myślenie… +session.status.writing=Pisanie odpowiedzi… +session.status.delegating=Delegowanie pracy… +session.status.planning=Planowanie… +session.status.gathering=Zbieranie kontekstu… +session.status.searching.codebase=Przeszukiwanie bazy kodu… +session.status.searching.web=Przeszukiwanie sieci… +session.status.editing=Dokonywanie edycji… +session.status.commands=Uruchamianie poleceń… session.part.reasoning=Rozumowanie session.part.compaction=kontekst skompresowany session.part.tool.copy=Kopiuj -session.part.tool.error=B\u0142\u0105d +session.part.tool.error=Błąd session.part.tool.pending=Oczekuje session.part.tool.read=Odczyt session.part.tool.running=Uruchomione -session.part.tool.shell=Pow\u0142oka -session.part.tool.truncated=Wyj\u015bcie skr\u00f3cone w podgl\u0105dzie. Pe\u0142ne wyj\u015bcie pozostaje w danych sesji. +session.part.tool.shell=Powłoka +session.part.tool.truncated=Wyjście skrócone w podglądzie. Pełne wyjście pozostaje w danych sesji. -session.error.prompt=B\u0142\u0105d monitu -session.error.compact=B\u0142\u0105d kompresji sesji -session.error.unknown=Nieznany b\u0142\u0105d +session.error.prompt=Błąd monitu +session.error.compact=Błąd kompresji sesji +session.error.unknown=Nieznany błąd session.header.tokens=Tokeny -session.header.tokens.description=Tokeny u\u017cyte przez ostatni\u0105 odpowiedź asystenta: wej\u015bciowe, wyj\u015bciowe, zapisy do bufora i odczyty z bufora. +session.header.tokens.description=Tokeny użyte przez ostatnią odpowiedź asystenta: wejściowe, wyjściowe, zapisy do bufora i odczyty z bufora. session.header.input=we {0} session.header.output=wy {0} session.header.cache.write=zapis bufora {0} session.header.cache.read=odczyt bufora {0} -session.header.compact=Kompresuj sesj\u0119 -session.header.compact.description=Podsumuj sesj\u0119, aby zmniejszyć rozmiar kontekstu -session.header.expand=Poka\u017c metryki sesji +session.header.compact=Kompresuj sesję +session.header.compact.description=Podsumuj sesję, aby zmniejszyć rozmiar kontekstu +session.header.expand=Pokaż metryki sesji session.header.collapse=Ukryj metryki sesji session.header.todos.progress={0}/{1} zadań ukończono session.header.todos.done=Wszystkie {0} zadań ukończono -session.header.context.tooltip.percent={0} token\u00f3w ({1}% kontekstu) -session.header.context.tooltip.tokens={0} token\u00f3w -session.header.context.used={0} / {1} token\u00f3w u\u017cito -session.header.context.reserved={0} zarezerwowane dla wyj\u015bcia -session.header.context.available={0} dost\u0119pne +session.header.context.tooltip.percent={0} tokenów ({1}% kontekstu) +session.header.context.tooltip.tokens={0} tokenów +session.header.context.used={0} / {1} tokenów użito +session.header.context.reserved={0} zarezerwowane dla wyjścia +session.header.context.available={0} dostępne -prompt.placeholder=Wpisz wiadomość\u2026 -prompt.placeholder.with.shortcuts=Wpisz wiadomość\u2026 ({0} aby wyslać, {1} nowa linia) -prompt.placeholder.with.send=Wpisz wiadomość\u2026 ({0} aby wyslać) -prompt.placeholder.with.newline=Wpisz wiadomość\u2026 ({0} nowa linia) +prompt.placeholder=Wpisz wiadomość… +prompt.placeholder.with.shortcuts=Wpisz wiadomość… ({0} aby wyslać, {1} nowa linia) +prompt.placeholder.with.send=Wpisz wiadomość… ({0} aby wyslać) +prompt.placeholder.with.newline=Wpisz wiadomość… ({0} nowa linia) prompt.button.send=Wyślij prompt.button.stop=Zatrzymaj prompt.button.send.tooltip.stop=Aby zatrzymać, naciśnij {0} mode.picker.tooltip=Wybierz tryb -mode.picker.deprecated=przestarza\u0142y +mode.picker.deprecated=przestarzały model.picker.tooltip=Wybierz model model.picker.recommended=Zalecane model.picker.favorites=Ulubione model.picker.search=Szukaj modeli -model.picker.no.matches=Brak pasuj\u0105cych modeli +model.picker.no.matches=Brak pasujących modeli model.picker.favorite.add=Dodaj do ulubionych -model.picker.favorite.remove=Usu\u0144 z ulubionych -model.picker.free=Bezp\u0142atny -model.picker.reset=Zresetuj model do domy\u015blnego +model.picker.favorite.remove=Usuń z ulubionych +model.picker.free=Bezpłatny +model.picker.reset=Zresetuj model do domyślnego reasoning.picker.tooltip=Wybierz poziom rozumowania history.tab.local=Lokalne @@ -87,22 +87,22 @@ history.tab.cloud=Chmura history.back=Wstecz history.search.placeholder=Szukaj sesji history.empty=Brak sesji -history.loading=\u0141adowanie\u2026 -history.untitled=Bez tytu\u0142u -history.delete.text=Usu\u0144 -history.delete.confirm.title=Usun\u0105ć sesj\u0119? -history.delete.confirm.message=Usun\u0105ć "{0}" z lokalnej historii? -history.delete.confirm.message.multiple=Usun\u0105ć {0} sesji z lokalnej historii? -history.rename.title=Zmień nazw\u0119 sesji +history.loading=Ładowanie… +history.untitled=Bez tytułu +history.delete.text=Usuń +history.delete.confirm.title=Usunąć sesję? +history.delete.confirm.message=Usunąć "{0}" z lokalnej historii? +history.delete.confirm.message.multiple=Usunąć {0} sesji z lokalnej historii? +history.rename.title=Zmień nazwę sesji history.rename.prompt=Nowa nazwa sesji: history.cloud.load.more=Załaduj więcej history.cloud.repo.only=Tylko to repozytorium history.group.today=Dzisiaj history.group.yesterday=Wczoraj -history.group.week=Ten tydzie\u0144 -history.group.month=Ten miesi\u0105c +history.group.week=Ten tydzień +history.group.month=Ten miesiąc history.group.older=Starsze -history.time.moments=Przed chwil\u0105 +history.time.moments=Przed chwilą history.time.minutes={0} min temu history.time.hours={0} godz temu history.time.days={0} dni temu @@ -117,13 +117,13 @@ history.error.cloud.delete=Sesji w chmurze nie można jeszcze usuwać action.Kilo.Settings.text=Ustawienia action.Kilo.Settings.description=Ustawienia Kilo Code action.Kilo.NewSession.text=Nowa sesja -action.Kilo.NewSession.description=Rozpocznij nową sesj\u0119 Kilo +action.Kilo.NewSession.description=Rozpocznij nową sesję Kilo action.Kilo.History.text=Historia -action.Kilo.History.description=Poka\u017c histori\u0119 sesji +action.Kilo.History.description=Pokaż historię sesji action.Kilo.SendPrompt.text=Wyślij monit action.Kilo.SendPrompt.description=Wyślij bieżący monit Kilo -action.Kilo.StopSession.text=Zatrzymaj sesj\u0119 -action.Kilo.StopSession.description=Zatrzymaj bieżącą sesj\u0119 Kilo +action.Kilo.StopSession.text=Zatrzymaj sesję +action.Kilo.StopSession.description=Zatrzymaj bieżącą sesję Kilo action.Kilo.SettingsGroup.text=Ustawienia action.Kilo.SettingsGroup.description=Ustawienia Kilo Code action.Kilo.Restart.text=Uruchom ponownie Kilo @@ -131,9 +131,9 @@ action.Kilo.Restart.description=Zakończ i uruchom ponownie proces CLI action.Kilo.Reinstall.text=Zainstaluj ponownie Kilo action.Kilo.Reinstall.description=Ponownie wyodrębnij plik binarny CLI i uruchom ponownie action.Kilo.Session.Open.text=Otwórz -action.Kilo.Session.Open.description=Otwórz wybraną sesj\u0119 +action.Kilo.Session.Open.description=Otwórz wybraną sesję action.Kilo.Session.Rename.text=Zmień nazwę -action.Kilo.Session.Rename.description=Zmień nazw\u0119 wybranej sesji -action.Kilo.Session.Delete.text=Usu\u0144 -action.Kilo.Session.Delete.description=Usu\u0144 wybran\u0105 sesj\u0119 (wybrane sesje) +action.Kilo.Session.Rename.description=Zmień nazwę wybranej sesji +action.Kilo.Session.Delete.text=Usuń +action.Kilo.Session.Delete.description=Usuń wybraną sesję (wybrane sesje) action.Kilo.History.ContextMenu.text=Akcje historii diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pt_BR.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pt_BR.properties index 8d98608abef..27c7eb48436 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pt_BR.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_pt_BR.properties @@ -1,36 +1,36 @@ -session.connection.connecting=Carregando\u2026 -session.connection.error.app=Falha na conex\u00e3o -session.connection.error.workspace=Falha ao carregar o espa\u00e7o de trabalho +session.connection.connecting=Carregando… +session.connection.error.app=Falha na conexão +session.connection.error.workspace=Falha ao carregar o espaço de trabalho session.connection.error.unknown=Erro desconhecido session.connection.retry=Tentar novamente -session.connection.warning.config=Avisos de configura\u00e7\u00e3o +session.connection.warning.config=Avisos de configuração -session.empty.welcome=Kilo Code \u00e9 um assistente de codifica\u00e7\u00e3o com IA. Pe\u00e7a que construa funcionalidades, corrija bugs ou explique sua base de c\u00f3digo. -session.empty.loading=Carregando\u2026 +session.empty.welcome=Kilo Code é um assistente de codificação com IA. Peça que construa funcionalidades, corrija bugs ou explique sua base de código. +session.empty.loading=Carregando… session.empty.recent=RECENTE -session.showHistory=Mostrar hist\u00f3rico +session.showHistory=Mostrar histórico session.scroll.bottom=Rolar para o fim -session.tab.new=Nova sess\u00e3o -session.tab.untitled=Sess\u00e3o sem t\u00edtulo +session.tab.new=Nova sessão +session.tab.untitled=Sessão sem título -session.permission.title=Solicita\u00e7\u00e3o de permiss\u00e3o -session.permission.meta=Ferramenta: {0} \u2022 Padr\u00f5es: {1} +session.permission.title=Solicitação de permissão +session.permission.meta=Ferramenta: {0} • Padrões: {1} session.permission.allow=Permitir session.permission.deny=Negar session.question.dismiss=Dispensar -session.status.considering=Considerando os pr\u00f3ximos passos\u2026 -session.status.thinking=Pensando\u2026 -session.status.writing=Escrevendo resposta\u2026 -session.status.delegating=Delegando trabalho\u2026 -session.status.planning=Planejando\u2026 -session.status.gathering=Coletando contexto\u2026 -session.status.searching.codebase=Pesquisando na base de c\u00f3digo\u2026 -session.status.searching.web=Pesquisando na web\u2026 -session.status.editing=Realizando edi\u00e7\u00f5es\u2026 -session.status.commands=Executando comandos\u2026 +session.status.considering=Considerando os próximos passos… +session.status.thinking=Pensando… +session.status.writing=Escrevendo resposta… +session.status.delegating=Delegando trabalho… +session.status.planning=Planejando… +session.status.gathering=Coletando contexto… +session.status.searching.codebase=Pesquisando na base de código… +session.status.searching.web=Pesquisando na web… +session.status.editing=Realizando edições… +session.status.commands=Executando comandos… -session.part.reasoning=Racioc\u00ednio +session.part.reasoning=Raciocínio session.part.compaction=contexto compactado session.part.tool.copy=Copiar session.part.tool.error=Erro @@ -38,34 +38,34 @@ session.part.tool.pending=Pendente session.part.tool.read=Ler session.part.tool.running=Executando session.part.tool.shell=Shell -session.part.tool.truncated=Sa\u00edda truncada na pr\u00e9-visualiza\u00e7\u00e3o. A sa\u00edda completa permanece nos dados da sess\u00e3o. +session.part.tool.truncated=Saída truncada na pré-visualização. A saída completa permanece nos dados da sessão. session.error.prompt=Falha no prompt -session.error.compact=Falha ao compactar a sess\u00e3o +session.error.compact=Falha ao compactar a sessão session.error.unknown=Erro desconhecido session.header.tokens=Tokens -session.header.tokens.description=Tokens usados pela \u00faltima resposta do assistente: entrada, sa\u00edda, escritas em cache e leituras em cache. +session.header.tokens.description=Tokens usados pela última resposta do assistente: entrada, saída, escritas em cache e leituras em cache. session.header.input=entrada {0} -session.header.output=sa\u00edda {0} +session.header.output=saída {0} session.header.cache.write=escrita em cache {0} session.header.cache.read=leitura em cache {0} -session.header.compact=Compactar sess\u00e3o -session.header.compact.description=Resumir a sess\u00e3o para reduzir o tamanho do contexto -session.header.expand=Exibir m\u00e9tricas da sess\u00e3o -session.header.collapse=Ocultar m\u00e9tricas da sess\u00e3o -session.header.todos.progress={0}/{1} tarefas conclu\u00eddas -session.header.todos.done=Todas as {0} tarefas conclu\u00eddas +session.header.compact=Compactar sessão +session.header.compact.description=Resumir a sessão para reduzir o tamanho do contexto +session.header.expand=Exibir métricas da sessão +session.header.collapse=Ocultar métricas da sessão +session.header.todos.progress={0}/{1} tarefas concluídas +session.header.todos.done=Todas as {0} tarefas concluídas session.header.context.tooltip.percent={0} tokens ({1}% do contexto) session.header.context.tooltip.tokens={0} tokens session.header.context.used={0} / {1} tokens utilizados -session.header.context.reserved={0} reservados para sa\u00edda -session.header.context.available={0} dispon\u00edveis +session.header.context.reserved={0} reservados para saída +session.header.context.available={0} disponíveis -prompt.placeholder=Digite uma mensagem\u2026 -prompt.placeholder.with.shortcuts=Digite uma mensagem\u2026 ({0} para enviar, {1} para nova linha) -prompt.placeholder.with.send=Digite uma mensagem\u2026 ({0} para enviar) -prompt.placeholder.with.newline=Digite uma mensagem\u2026 ({0} para nova linha) +prompt.placeholder=Digite uma mensagem… +prompt.placeholder.with.shortcuts=Digite uma mensagem… ({0} para enviar, {1} para nova linha) +prompt.placeholder.with.send=Digite uma mensagem… ({0} para enviar) +prompt.placeholder.with.newline=Digite uma mensagem… ({0} para nova linha) prompt.button.send=Enviar prompt.button.stop=Parar prompt.button.send.tooltip.stop=Para parar, pressione {0} @@ -79,61 +79,61 @@ model.picker.no.matches=Nenhum modelo correspondente model.picker.favorite.add=Adicionar aos favoritos model.picker.favorite.remove=Remover dos favoritos model.picker.free=Gratuito -model.picker.reset=Redefinir modelo para o padr\u00e3o -reasoning.picker.tooltip=Selecionar esfor\u00e7o de racioc\u00ednio +model.picker.reset=Redefinir modelo para o padrão +reasoning.picker.tooltip=Selecionar esforço de raciocínio history.tab.local=Local history.tab.cloud=Nuvem history.back=Voltar -history.search.placeholder=Pesquisar sess\u00f5es -history.empty=Nenhuma sess\u00e3o -history.loading=Carregando\u2026 -history.untitled=Sem t\u00edtulo +history.search.placeholder=Pesquisar sessões +history.empty=Nenhuma sessão +history.loading=Carregando… +history.untitled=Sem título history.delete.text=Excluir -history.delete.confirm.title=Excluir sess\u00e3o? -history.delete.confirm.message=Excluir "{0}" do hist\u00f3rico local? -history.delete.confirm.message.multiple=Excluir {0} sess\u00f5es do hist\u00f3rico local? -history.rename.title=Renomear sess\u00e3o -history.rename.prompt=Novo nome da sess\u00e3o: +history.delete.confirm.title=Excluir sessão? +history.delete.confirm.message=Excluir "{0}" do histórico local? +history.delete.confirm.message.multiple=Excluir {0} sessões do histórico local? +history.rename.title=Renomear sessão +history.rename.prompt=Novo nome da sessão: history.cloud.load.more=Carregar mais -history.cloud.repo.only=Somente este reposit\u00f3rio +history.cloud.repo.only=Somente este repositório history.group.today=Hoje history.group.yesterday=Ontem history.group.week=Esta semana -history.group.month=Este m\u00eas +history.group.month=Este mês history.group.older=Mais antigo history.time.moments=Agora mesmo -history.time.minutes=H\u00e1 {0} min -history.time.hours=H\u00e1 {0} h -history.time.days=H\u00e1 {0} d -history.time.months=H\u00e1 {0} m\u00eas(es) -history.time.years=H\u00e1 {0} ano(s) -history.error.local=Falha ao carregar o hist\u00f3rico local -history.error.cloud=Falha ao carregar o hist\u00f3rico na nuvem -history.error.local.delete=Falha ao excluir a sess\u00e3o -history.error.local.rename=Falha ao renomear a sess\u00e3o -history.error.cloud.delete=As sess\u00f5es na nuvem ainda n\u00e3o podem ser exclu\u00eddas +history.time.minutes=Há {0} min +history.time.hours=Há {0} h +history.time.days=Há {0} d +history.time.months=Há {0} mês(es) +history.time.years=Há {0} ano(s) +history.error.local=Falha ao carregar o histórico local +history.error.cloud=Falha ao carregar o histórico na nuvem +history.error.local.delete=Falha ao excluir a sessão +history.error.local.rename=Falha ao renomear a sessão +history.error.cloud.delete=As sessões na nuvem ainda não podem ser excluídas -action.Kilo.Settings.text=Configura\u00e7\u00f5es -action.Kilo.Settings.description=Configura\u00e7\u00f5es do Kilo Code -action.Kilo.NewSession.text=Nova sess\u00e3o -action.Kilo.NewSession.description=Iniciar uma nova sess\u00e3o do Kilo -action.Kilo.History.text=Hist\u00f3rico -action.Kilo.History.description=Exibir hist\u00f3rico de sess\u00f5es +action.Kilo.Settings.text=Configurações +action.Kilo.Settings.description=Configurações do Kilo Code +action.Kilo.NewSession.text=Nova sessão +action.Kilo.NewSession.description=Iniciar uma nova sessão do Kilo +action.Kilo.History.text=Histórico +action.Kilo.History.description=Exibir histórico de sessões action.Kilo.SendPrompt.text=Enviar prompt action.Kilo.SendPrompt.description=Enviar o prompt atual do Kilo -action.Kilo.StopSession.text=Parar sess\u00e3o -action.Kilo.StopSession.description=Parar a sess\u00e3o atual do Kilo -action.Kilo.SettingsGroup.text=Configura\u00e7\u00f5es -action.Kilo.SettingsGroup.description=Configura\u00e7\u00f5es do Kilo Code +action.Kilo.StopSession.text=Parar sessão +action.Kilo.StopSession.description=Parar a sessão atual do Kilo +action.Kilo.SettingsGroup.text=Configurações +action.Kilo.SettingsGroup.description=Configurações do Kilo Code action.Kilo.Restart.text=Reiniciar Kilo action.Kilo.Restart.description=Encerrar e reiniciar o processo CLI action.Kilo.Reinstall.text=Reinstalar Kilo -action.Kilo.Reinstall.description=Reextrair o bin\u00e1rio CLI e reiniciar +action.Kilo.Reinstall.description=Reextrair o binário CLI e reiniciar action.Kilo.Session.Open.text=Abrir -action.Kilo.Session.Open.description=Abrir a sess\u00e3o selecionada +action.Kilo.Session.Open.description=Abrir a sessão selecionada action.Kilo.Session.Rename.text=Renomear -action.Kilo.Session.Rename.description=Renomear a sess\u00e3o selecionada +action.Kilo.Session.Rename.description=Renomear a sessão selecionada action.Kilo.Session.Delete.text=Excluir -action.Kilo.Session.Delete.description=Excluir a(s) sess\u00e3o(es) selecionada(s) -action.Kilo.History.ContextMenu.text=A\u00e7\u00f5es do hist\u00f3rico +action.Kilo.Session.Delete.description=Excluir a(s) sessão(es) selecionada(s) +action.Kilo.History.ContextMenu.text=Ações do histórico diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ru.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ru.properties index 544daaba744..e6bdb4d1c62 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ru.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_ru.properties @@ -1,139 +1,139 @@ -session.connection.connecting=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u2026 -session.connection.error.app=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f -session.connection.error.workspace=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 -session.connection.error.unknown=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 -session.connection.retry=\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c -session.connection.warning.config=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 +session.connection.connecting=Загрузка… +session.connection.error.app=Ошибка подключения +session.connection.error.workspace=Ошибка загрузки рабочей области +session.connection.error.unknown=Неизвестная ошибка +session.connection.retry=Повторить +session.connection.warning.config=Предупреждения конфигурации -session.empty.welcome=Kilo Code \u2014 \u044d\u0442\u043e AI-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u043f\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435 \u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043b\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443. -session.empty.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u2026 -session.empty.recent=\u041d\u0415\u0414\u0410\u0412\u041d\u0418\u0415 -session.showHistory=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e -session.scroll.bottom=\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u0437 -session.tab.new=\u041d\u043e\u0432\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f -session.tab.untitled=\u041d\u0435\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0435\u0441\u0441\u0438\u044f +session.empty.welcome=Kilo Code — это AI-ассистент по программированию. Попросите его разработать функции, исправить ошибки или объяснить кодовую базу. +session.empty.loading=Загрузка… +session.empty.recent=НЕДАВНИЕ +session.showHistory=Показать историю +session.scroll.bottom=Прокрутить вниз +session.tab.new=Новая сессия +session.tab.untitled=Незаголовок сессия -session.permission.title=\u0417\u0430\u043f\u0440\u043e\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f -session.permission.meta=\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442: {0} \u2022 \u0428\u0430\u0431\u043b\u043e\u043d\u044b: {1} -session.permission.allow=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c -session.permission.deny=\u041e\u0442\u043a\u0430\u0437\u0430\u0442\u044c -session.question.dismiss=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c +session.permission.title=Запрос разрешения +session.permission.meta=Инструмент: {0} • Шаблоны: {1} +session.permission.allow=Разрешить +session.permission.deny=Отказать +session.question.dismiss=Отклонить -session.status.considering=\u041e\u0431\u0434\u0443\u043c\u044b\u0432\u0430\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438\u2026 -session.status.thinking=\u0420\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u044e\u2026 -session.status.writing=\u041f\u0438\u0448\u0443 \u043e\u0442\u0432\u0435\u0442\u2026 -session.status.delegating=\u041f\u0435\u0440\u0435\u0434\u0430\u044e \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u2026 -session.status.planning=\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u044e\u2026 -session.status.gathering=\u0421\u0431\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u2026 -session.status.searching.codebase=\u041f\u043e\u0438\u0441\u043a \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435\u2026 -session.status.searching.web=\u041f\u043e\u0438\u0441\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435\u2026 -session.status.editing=\u0412\u043d\u043e\u0448\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u2026 -session.status.commands=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b\u2026 +session.status.considering=Обдумываю следующие шаги… +session.status.thinking=Размышляю… +session.status.writing=Пишу ответ… +session.status.delegating=Передаю задание… +session.status.planning=Планирую… +session.status.gathering=Сбор контекста… +session.status.searching.codebase=Поиск в кодовой базе… +session.status.searching.web=Поиск в интернете… +session.status.editing=Вношу изменения… +session.status.commands=Выполняю команды… -session.part.reasoning=\u0420\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 -session.part.compaction=\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0436\u0430\u0442 -session.part.tool.copy=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c -session.part.tool.error=\u041e\u0448\u0438\u0431\u043a\u0430 -session.part.tool.pending=\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 -session.part.tool.read=\u0427\u0442\u0435\u043d\u0438\u0435 -session.part.tool.running=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f +session.part.reasoning=Рассуждение +session.part.compaction=контекст сжат +session.part.tool.copy=Копировать +session.part.tool.error=Ошибка +session.part.tool.pending=Ожидание +session.part.tool.read=Чтение +session.part.tool.running=Выполняется session.part.tool.shell=Shell -session.part.tool.truncated=\u0412\u044b\u0432\u043e\u0434 \u0443\u0441\u0435\u0447\u0451\u043d \u0432 \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435. \u041f\u043e\u043b\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0438. +session.part.tool.truncated=Вывод усечён в предпросмотре. Полный вывод сохраняется в данных сессии. -session.error.prompt=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 -session.error.compact=\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u0436\u0430\u0442\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 -session.error.unknown=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 +session.error.prompt=Ошибка запроса +session.error.compact=Ошибка сжатия сессии +session.error.unknown=Неизвестная ошибка -session.header.tokens=\u0422\u043e\u043a\u0435\u043d\u044b -session.header.tokens.description=\u0422\u043e\u043a\u0435\u043d\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430: \u0432\u0445\u043e\u0434\u043d\u044b\u0435, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435, \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u044d\u0448 \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u044d\u0448\u0430. -session.header.input=\u0432\u0445\u043e\u0434 {0} -session.header.output=\u0432\u044b\u0445\u043e\u0434 {0} -session.header.cache.write=\u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u044d\u0448 {0} -session.header.cache.read=\u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u044d\u0448\u0430 {0} -session.header.compact=\u0421\u0436\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e -session.header.compact.description=\u0421\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 -session.header.expand=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 -session.header.collapse=\u0421\u043a\u0440\u044b\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 -session.header.todos.progress={0}/{1} \u0437\u0430\u0434\u0430\u0447 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e -session.header.todos.done=\u0412\u0441\u0435 {0} \u0437\u0430\u0434\u0430\u0447 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b -session.header.context.tooltip.percent={0} \u0442\u043e\u043a\u0435\u043d\u043e\u0432 ({1}% \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430) -session.header.context.tooltip.tokens={0} \u0442\u043e\u043a\u0435\u043d\u043e\u0432 -session.header.context.used={0} / {1} \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e -session.header.context.reserved={0} \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 -session.header.context.available={0} \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e +session.header.tokens=Токены +session.header.tokens.description=Токены, использованные последним ответом ассистента: входные, исходные, запись в кэш и чтение из кэша. +session.header.input=вход {0} +session.header.output=выход {0} +session.header.cache.write=запись в кэш {0} +session.header.cache.read=чтение из кэша {0} +session.header.compact=Сжать сессию +session.header.compact.description=Суммировать сессию для уменьшения размера контекста +session.header.expand=Показать метрики сессии +session.header.collapse=Скрыть метрики сессии +session.header.todos.progress={0}/{1} задач выполнено +session.header.todos.done=Все {0} задач выполнены +session.header.context.tooltip.percent={0} токенов ({1}% контекста) +session.header.context.tooltip.tokens={0} токенов +session.header.context.used={0} / {1} токенов использовано +session.header.context.reserved={0} зарезервировано для вывода +session.header.context.available={0} доступно -prompt.placeholder=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u2026 -prompt.placeholder.with.shortcuts=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u2026 ({0} \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c, {1} \u2014 \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430) -prompt.placeholder.with.send=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u2026 ({0} \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c) -prompt.placeholder.with.newline=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u2026 ({0} \u2014 \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430) -prompt.button.send=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c -prompt.button.stop=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c -prompt.button.send.tooltip.stop=\u0414\u043b\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 {0} -mode.picker.tooltip=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c -mode.picker.deprecated=\u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 -model.picker.tooltip=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c -model.picker.recommended=\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0435 -model.picker.favorites=\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 -model.picker.search=\u041f\u043e\u0438\u0441\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 -model.picker.no.matches=\u041d\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 -model.picker.favorite.add=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 -model.picker.favorite.remove=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e -model.picker.free=\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e -model.picker.reset=\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e -reasoning.picker.tooltip=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f +prompt.placeholder=Введите сообщение… +prompt.placeholder.with.shortcuts=Введите сообщение… ({0} — отправить, {1} — новая строка) +prompt.placeholder.with.send=Введите сообщение… ({0} — отправить) +prompt.placeholder.with.newline=Введите сообщение… ({0} — новая строка) +prompt.button.send=Отправить +prompt.button.stop=Остановить +prompt.button.send.tooltip.stop=Для остановки нажмите {0} +mode.picker.tooltip=Выбрать режим +mode.picker.deprecated=устаревший +model.picker.tooltip=Выбрать модель +model.picker.recommended=Рекомендуемые +model.picker.favorites=Избранное +model.picker.search=Поиск моделей +model.picker.no.matches=Нет подходящих моделей +model.picker.favorite.add=Добавить в избранное +model.picker.favorite.remove=Удалить из избранного +model.picker.free=Бесплатно +model.picker.reset=Сбросить модель на по умолчанию +reasoning.picker.tooltip=Выбрать уровень рассуждения -history.tab.local=\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f -history.tab.cloud=\u041e\u0431\u043b\u0430\u043a\u043e -history.back=\u041d\u0430\u0437\u0430\u0434 -history.search.placeholder=\u041f\u043e\u0438\u0441\u043a \u0441\u0435\u0441\u0441\u0438\u0439 -history.empty=\u041d\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u0439 -history.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u2026 -history.untitled=\u0411\u0435\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f -history.delete.text=\u0423\u0434\u0430\u043b\u0438\u0442\u044c -history.delete.confirm.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e? -history.delete.confirm.message=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u00ab{0}\u00bb \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438? -history.delete.confirm.message.multiple=\u0423\u0434\u0430\u043b\u0438\u0442\u044c {0} \u0441\u0435\u0441\u0441\u0438\u0439 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438? -history.rename.title=\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e -history.rename.prompt=\u041d\u043e\u0432\u043e\u0435 \u0438\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438: -history.cloud.load.more=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0435\u0449\u0451 -history.cloud.repo.only=\u0422\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 -history.group.today=\u0421\u0435\u0433\u043e\u0434\u043d\u044f -history.group.yesterday=\u0412\u0447\u0435\u0440\u0430 -history.group.week=\u041d\u0430 \u044d\u0442\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 -history.group.month=\u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435 -history.group.older=\u0421\u0442\u0430\u0440\u0448\u0435 -history.time.moments=\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e -history.time.minutes={0} \u043c\u0438\u043d \u043d\u0430\u0437\u0430\u0434 -history.time.hours={0} \u0447 \u043d\u0430\u0437\u0430\u0434 -history.time.days={0} \u0434 \u043d\u0430\u0437\u0430\u0434 -history.time.months={0} \u043c\u0435\u0441 \u043d\u0430\u0437\u0430\u0434 -history.time.years={0} \u043b \u043d\u0430\u0437\u0430\u0434 -history.error.local=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 -history.error.cloud=\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 -history.error.local.delete=\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 -history.error.local.rename=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 -history.error.cloud.delete=\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c +history.tab.local=Локальная +history.tab.cloud=Облако +history.back=Назад +history.search.placeholder=Поиск сессий +history.empty=Нет сессий +history.loading=Загрузка… +history.untitled=Без названия +history.delete.text=Удалить +history.delete.confirm.title=Удалить сессию? +history.delete.confirm.message=Удалить «{0}» из локальной истории? +history.delete.confirm.message.multiple=Удалить {0} сессий из локальной истории? +history.rename.title=Переименовать сессию +history.rename.prompt=Новое имя сессии: +history.cloud.load.more=Загрузить ещё +history.cloud.repo.only=Только этот репозиторий +history.group.today=Сегодня +history.group.yesterday=Вчера +history.group.week=На этой неделе +history.group.month=В этом месяце +history.group.older=Старше +history.time.moments=Только что +history.time.minutes={0} мин назад +history.time.hours={0} ч назад +history.time.days={0} д назад +history.time.months={0} мес назад +history.time.years={0} л назад +history.error.local=Ошибка загрузки локальной истории +history.error.cloud=Ошибка загрузки облачной истории +history.error.local.delete=Ошибка удаления сессии +history.error.local.rename=Ошибка переименования сессии +history.error.cloud.delete=Облачные сессии пока нельзя удалить -action.Kilo.Settings.text=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -action.Kilo.Settings.description=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Kilo Code -action.Kilo.NewSession.text=\u041d\u043e\u0432\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f -action.Kilo.NewSession.description=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e Kilo -action.Kilo.History.text=\u0418\u0441\u0442\u043e\u0440\u0438\u044f -action.Kilo.History.description=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u0435\u0441\u0441\u0438\u0439 -action.Kilo.SendPrompt.text=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 -action.Kilo.SendPrompt.description=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 Kilo -action.Kilo.StopSession.text=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e -action.Kilo.StopSession.description=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e Kilo -action.Kilo.SettingsGroup.text=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -action.Kilo.SettingsGroup.description=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Kilo Code -action.Kilo.Restart.text=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Kilo -action.Kilo.Restart.description=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c CLI-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 -action.Kilo.Reinstall.text=\u041f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Kilo -action.Kilo.Reinstall.description=\u041f\u0435\u0440\u0435\u0438\u0437\u0432\u043b\u0435\u0447\u044c CLI-\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c -action.Kilo.Session.Open.text=\u041e\u0442\u043a\u0440\u044b\u0442\u044c -action.Kilo.Session.Open.description=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e -action.Kilo.Session.Rename.text=\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c -action.Kilo.Session.Rename.description=\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e -action.Kilo.Session.Delete.text=\u0423\u0434\u0430\u043b\u0438\u0442\u044c -action.Kilo.Session.Delete.description=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e(-\u044b\u0435) \u0441\u0435\u0441\u0441\u0438\u044e(-\u0438\u0438) -action.Kilo.History.ContextMenu.text=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 +action.Kilo.Settings.text=Настройки +action.Kilo.Settings.description=Настройки Kilo Code +action.Kilo.NewSession.text=Новая сессия +action.Kilo.NewSession.description=Запустить новую сессию Kilo +action.Kilo.History.text=История +action.Kilo.History.description=Показать историю сессий +action.Kilo.SendPrompt.text=Отправить запрос +action.Kilo.SendPrompt.description=Отправить текущий запрос Kilo +action.Kilo.StopSession.text=Остановить сессию +action.Kilo.StopSession.description=Остановить текущую сессию Kilo +action.Kilo.SettingsGroup.text=Настройки +action.Kilo.SettingsGroup.description=Настройки Kilo Code +action.Kilo.Restart.text=Перезапустить Kilo +action.Kilo.Restart.description=Завершить и перезапустить CLI-процесс +action.Kilo.Reinstall.text=Переустановить Kilo +action.Kilo.Reinstall.description=Переизвлечь CLI-бинарник и перезапустить +action.Kilo.Session.Open.text=Открыть +action.Kilo.Session.Open.description=Открыть выбранную сессию +action.Kilo.Session.Rename.text=Переименовать +action.Kilo.Session.Rename.description=Переименовать выбранную сессию +action.Kilo.Session.Delete.text=Удалить +action.Kilo.Session.Delete.description=Удалить выбранную(-ые) сессию(-ии) +action.Kilo.History.ContextMenu.text=Действия с историей diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_th.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_th.properties index 6f3945e15c2..049b1e1d1ab 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_th.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_th.properties @@ -1,139 +1,139 @@ -session.connection.connecting=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14\u2026 -session.connection.error.app=\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 -session.connection.error.workspace=\u0e42\u0e2b\u0e25\u0e14\u0e1e\u0e37\u0e49\u0e19\u0e17\u0e35\u0e48\u0e17\u0e33\u0e07\u0e32\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 -session.connection.error.unknown=\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e17\u0e23\u0e32\u0e1a -session.connection.retry=\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07 -session.connection.warning.config=\u0e04\u0e33\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e01\u0e32\u0e23\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e04\u0e48\u0e32 +session.connection.connecting=กำลังโหลด… +session.connection.error.app=การเชื่อมต่อล้มเหลว +session.connection.error.workspace=โหลดพื้นที่ทำงานล้มเหลว +session.connection.error.unknown=ข้อผิดพลาดที่ไม่ทราบ +session.connection.retry=ลองอีกครั้ง +session.connection.warning.config=คำเตือนการกำหนดค่า -session.empty.welcome=Kilo Code \u0e04\u0e37\u0e2d\u0e1c\u0e39\u0e49\u0e0a\u0e48\u0e27\u0e22\u0e40\u0e02\u0e35\u0e22\u0e19\u0e42\u0e04\u0e49\u0e14 AI \u0e02\u0e2d\u0e43\u0e2b\u0e49\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e1f\u0e35\u0e40\u0e08\u0e2d\u0e23\u0e4c\u0e41\u0e01\u0e49\u0e2a\u0e31\u0e19\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14 \u0e2b\u0e23\u0e37\u0e2d\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e42\u0e04\u0e49\u0e14\u0e40\u0e1a\u0e2a\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -session.empty.loading=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14\u2026 -session.empty.recent=\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14 -session.showHistory=\u0e41\u0e2a\u0e14\u0e07\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34 -session.scroll.bottom=\u0e40\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e1b\u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07 -session.tab.new=\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e43\u0e2b\u0e21\u0e48 -session.tab.untitled=\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e44\u0e21\u0e48\u0e21\u0e35\u0e0a\u0e37\u0e48\u0e2d +session.empty.welcome=Kilo Code คือผู้ช่วยเขียนโค้ด AI ขอให้สร้างฟีเจอร์แก้สันข้อผิดพลาด หรืออธิบายโค้ดเบสของคุณ +session.empty.loading=กำลังโหลด… +session.empty.recent=ล่าสุด +session.showHistory=แสดงประวัติ +session.scroll.bottom=เลื่อนไปด้านล่าง +session.tab.new=เซสชันใหม่ +session.tab.untitled=เซสชันไม่มีชื่อ -session.permission.title=\u0e02\u0e2d\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c -session.permission.meta=\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d: {0} \u2022 \u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a: {1} -session.permission.allow=\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15 -session.permission.deny=\u0e1b\u0e0f\u0e34\u0e40\u0e2a\u0e18 -session.question.dismiss=\u0e1b\u0e34\u0e14 +session.permission.title=ขอสิทธิ์ +session.permission.meta=เครื่องมือ: {0} • รูปแบบ: {1} +session.permission.allow=อนุญาต +session.permission.deny=ปฏิเสธ +session.question.dismiss=ปิด -session.status.considering=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e1e\u0e34\u0e08\u0e32\u0e23\u0e13\u0e32\u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19\u0e16\u0e31\u0e14\u0e44\u0e1b\u2026 -session.status.thinking=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e04\u0e34\u0e14\u2026 -session.status.writing=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e02\u0e35\u0e22\u0e19\u0e04\u0e33\u0e15\u0e2d\u0e1a\u2026 -session.status.delegating=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e21\u0e2d\u0e1a\u0e2b\u0e21\u0e32\u0e22\u0e07\u0e32\u0e19\u2026 -session.status.planning=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e27\u0e32\u0e07\u0e41\u0e1c\u0e19\u2026 -session.status.gathering=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e23\u0e27\u0e1a\u0e23\u0e27\u0e21\u0e1a\u0e23\u0e34\u0e1a\u0e17\u2026 -session.status.searching.codebase=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e43\u0e19\u0e42\u0e04\u0e49\u0e14\u0e40\u0e1a\u0e2a\u2026 -session.status.searching.web=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e1a\u0e19\u0e40\u0e27\u0e47\u0e1a\u2026 -session.status.editing=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e41\u0e01\u0e49\u0e44\u0e02\u2026 -session.status.commands=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e23\u0e35\u0e22\u0e01\u0e43\u0e0a\u0e49\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u2026 +session.status.considering=กำลังพิจารณาขั้นตอนถัดไป… +session.status.thinking=กำลังคิด… +session.status.writing=กำลังเขียนคำตอบ… +session.status.delegating=กำลังมอบหมายงาน… +session.status.planning=กำลังวางแผน… +session.status.gathering=กำลังรวบรวมบริบท… +session.status.searching.codebase=กำลังค้นหาในโค้ดเบส… +session.status.searching.web=กำลังค้นหาบนเว็บ… +session.status.editing=กำลังแก้ไข… +session.status.commands=กำลังเรียกใช้คำสั่ง… -session.part.reasoning=\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25 -session.part.compaction=\u0e1a\u0e23\u0e34\u0e1a\u0e17\u0e16\u0e39\u0e01\u0e1a\u0e35\u0e1a\u0e2d\u0e31\u0e14\u0e41\u0e25\u0e49\u0e27 -session.part.tool.copy=\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01 -session.part.tool.error=\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14 -session.part.tool.pending=\u0e23\u0e2d\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23 -session.part.tool.read=\u0e2d\u0e48\u0e32\u0e19 -session.part.tool.running=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e17\u0e33\u0e07\u0e32\u0e19 +session.part.reasoning=การใช้เหตุผล +session.part.compaction=บริบทถูกบีบอัดแล้ว +session.part.tool.copy=คัดลอก +session.part.tool.error=ข้อผิดพลาด +session.part.tool.pending=รอดำเนินการ +session.part.tool.read=อ่าน +session.part.tool.running=กำลังทำงาน session.part.tool.shell=Shell -session.part.tool.truncated=\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e16\u0e39\u0e01\u0e15\u0e31\u0e14\u0e17\u0e2d\u0e19\u0e43\u0e19\u0e2a\u0e48\u0e27\u0e19\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 \u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e22\u0e31\u0e07\u0e04\u0e07\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 +session.part.tool.truncated=ผลลัพธ์ถูกตัดทอนในส่วนตัวอย่าง ผลลัพธ์ทั้งหมดยังคงอยู่ในข้อมูลเซสชัน -session.error.prompt=\u0e04\u0e33\u0e02\u0e2d\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 -session.error.compact=\u0e01\u0e32\u0e23\u0e1a\u0e35\u0e1a\u0e2d\u0e31\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 -session.error.unknown=\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e17\u0e23\u0e32\u0e1a +session.error.prompt=คำขอล้มเหลว +session.error.compact=การบีบอัดเซสชันล้มเหลว +session.error.unknown=ข้อผิดพลาดที่ไม่ทราบ -session.header.tokens=\u0e42\u0e17\u0e40\u0e04\u0e19 -session.header.tokens.description=\u0e42\u0e17\u0e40\u0e04\u0e19\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e42\u0e14\u0e22\u0e04\u0e33\u0e15\u0e2d\u0e1a\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e0a\u0e48\u0e27\u0e22: \u0e2d\u0e34\u0e19\u0e1e\u0e38\u0e15 \u0e40\u0e2d\u0e32\u0e15\u0e4c\u0e1e\u0e38\u0e15 \u0e01\u0e32\u0e23\u0e40\u0e02\u0e35\u0e22\u0e19\u0e41\u0e04\u0e0a \u0e41\u0e25\u0e30\u0e01\u0e32\u0e23\u0e2d\u0e48\u0e32\u0e19\u0e41\u0e04\u0e0a -session.header.input=\u0e2d\u0e34\u0e19\u0e1e\u0e38\u0e15 {0} -session.header.output=\u0e40\u0e2d\u0e32\u0e15\u0e4c\u0e1e\u0e38\u0e15 {0} -session.header.cache.write=\u0e40\u0e02\u0e35\u0e22\u0e19\u0e41\u0e04\u0e0a {0} -session.header.cache.read=\u0e2d\u0e48\u0e32\u0e19\u0e41\u0e04\u0e0a {0} -session.header.compact=\u0e1a\u0e35\u0e1a\u0e2d\u0e31\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 -session.header.compact.description=\u0e2a\u0e23\u0e38\u0e1b\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e25\u0e14\u0e02\u0e19\u0e32\u0e14\u0e1a\u0e23\u0e34\u0e1a\u0e17 -session.header.expand=\u0e41\u0e2a\u0e14\u0e07\u0e40\u0e21\u0e15\u0e23\u0e34\u0e01\u0e2a\u0e4c\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 -session.header.collapse=\u0e0b\u0e48\u0e2d\u0e19\u0e40\u0e21\u0e15\u0e23\u0e34\u0e01\u0e2a\u0e4c\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 -session.header.todos.progress={0}/{1} \u0e07\u0e32\u0e19\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e2a\u0e34\u0e49\u0e19\u0e41\u0e25\u0e49\u0e27 -session.header.todos.done=\u0e04\u0e23\u0e1a\u0e17\u0e38\u0e01 {0} \u0e07\u0e32\u0e19\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e2a\u0e34\u0e49\u0e19\u0e41\u0e25\u0e49\u0e27 -session.header.context.tooltip.percent={0} \u0e42\u0e17\u0e40\u0e04\u0e19 ({1}% \u0e02\u0e2d\u0e07\u0e1a\u0e23\u0e34\u0e1a\u0e17) -session.header.context.tooltip.tokens={0} \u0e42\u0e17\u0e40\u0e04\u0e19 -session.header.context.used=\u0e43\u0e0a\u0e49\u0e41\u0e25\u0e49\u0e27 {0} / {1} \u0e42\u0e17\u0e40\u0e04\u0e19 -session.header.context.reserved={0} \u0e2a\u0e33\u0e23\u0e2d\u0e07\u0e44\u0e27\u0e49\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e40\u0e2d\u0e32\u0e15\u0e4c\u0e1e\u0e38\u0e15 -session.header.context.available={0} \u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 +session.header.tokens=โทเคน +session.header.tokens.description=โทเคนที่ใช้โดยคำตอบล่าสุดของผู้ช่วย: อินพุต เอาต์พุต การเขียนแคช และการอ่านแคช +session.header.input=อินพุต {0} +session.header.output=เอาต์พุต {0} +session.header.cache.write=เขียนแคช {0} +session.header.cache.read=อ่านแคช {0} +session.header.compact=บีบอัดเซสชัน +session.header.compact.description=สรุปเซสชันเพื่อลดขนาดบริบท +session.header.expand=แสดงเมตริกส์เซสชัน +session.header.collapse=ซ่อนเมตริกส์เซสชัน +session.header.todos.progress={0}/{1} งานเสร็จสิ้นแล้ว +session.header.todos.done=ครบทุก {0} งานเสร็จสิ้นแล้ว +session.header.context.tooltip.percent={0} โทเคน ({1}% ของบริบท) +session.header.context.tooltip.tokens={0} โทเคน +session.header.context.used=ใช้แล้ว {0} / {1} โทเคน +session.header.context.reserved={0} สำรองไว้สำหรับเอาต์พุต +session.header.context.available={0} พร้อมใช้งาน -prompt.placeholder=\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u2026 -prompt.placeholder.with.shortcuts=\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u2026 ({0} \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e2a\u0e48\u0e07 {1} \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14\u0e43\u0e2b\u0e21\u0e48) -prompt.placeholder.with.send=\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u2026 ({0} \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e2a\u0e48\u0e07) -prompt.placeholder.with.newline=\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u2026 ({0} \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14\u0e43\u0e2b\u0e21\u0e48) -prompt.button.send=\u0e2a\u0e48\u0e07 -prompt.button.stop=\u0e2b\u0e22\u0e38\u0e14 -prompt.button.send.tooltip.stop=\u0e01\u0e14 {0} \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e2b\u0e22\u0e38\u0e14 -mode.picker.tooltip=\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e42\u0e2b\u0e21\u0e14 -mode.picker.deprecated=\u0e25\u0e49\u0e32\u0e2a\u0e21\u0e31\u0e22 -model.picker.tooltip=\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e42\u0e21\u0e40\u0e14\u0e25 -model.picker.recommended=\u0e41\u0e19\u0e30\u0e19\u0e33 -model.picker.favorites=\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e42\u0e1b\u0e23\u0e14 -model.picker.search=\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e42\u0e21\u0e40\u0e14\u0e25 -model.picker.no.matches=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e42\u0e21\u0e40\u0e14\u0e25\u0e17\u0e35\u0e48\u0e15\u0e23\u0e07\u0e01\u0e31\u0e19 -model.picker.favorite.add=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e43\u0e19\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e42\u0e1b\u0e23\u0e14 -model.picker.favorite.remove=\u0e19\u0e33\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e42\u0e1b\u0e23\u0e14 -model.picker.free=\u0e1f\u0e23\u0e35 -model.picker.reset=\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15\u0e42\u0e21\u0e40\u0e14\u0e25\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e48\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19 -reasoning.picker.tooltip=\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25 +prompt.placeholder=พิมพ์ข้อความ… +prompt.placeholder.with.shortcuts=พิมพ์ข้อความ… ({0} เพื่อส่ง {1} สำหรับบรรทัดใหม่) +prompt.placeholder.with.send=พิมพ์ข้อความ… ({0} เพื่อส่ง) +prompt.placeholder.with.newline=พิมพ์ข้อความ… ({0} สำหรับบรรทัดใหม่) +prompt.button.send=ส่ง +prompt.button.stop=หยุด +prompt.button.send.tooltip.stop=กด {0} เพื่อหยุด +mode.picker.tooltip=เลือกโหมด +mode.picker.deprecated=ล้าสมัย +model.picker.tooltip=เลือกโมเดล +model.picker.recommended=แนะนำ +model.picker.favorites=รายการโปรด +model.picker.search=ค้นหาโมเดล +model.picker.no.matches=ไม่พบโมเดลที่ตรงกัน +model.picker.favorite.add=เพิ่มในรายการโปรด +model.picker.favorite.remove=นำออกจากรายการโปรด +model.picker.free=ฟรี +model.picker.reset=รีเซ็ตโมเดลเป็นค่าเริ่มต้น +reasoning.picker.tooltip=เลือกระดับการใช้เหตุผล -history.tab.local=\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e19\u0e35\u0e49 -history.tab.cloud=\u0e04\u0e25\u0e32\u0e27\u0e14\u0e4c -history.back=\u0e22\u0e49\u0e2d\u0e19\u0e01\u0e25\u0e31\u0e1a -history.search.placeholder=\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 -history.empty=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 -history.loading=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14\u2026 -history.untitled=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e0a\u0e37\u0e48\u0e2d -history.delete.text=\u0e25\u0e1a -history.delete.confirm.title=\u0e25\u0e1a\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19? -history.delete.confirm.message=\u0e25\u0e1a "{0}" \u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07? -history.delete.confirm.message.multiple=\u0e25\u0e1a {0} \u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07? -history.rename.title=\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 -history.rename.prompt=\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e43\u0e2b\u0e21\u0e48: -history.cloud.load.more=\u0e42\u0e2b\u0e25\u0e14\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21 -history.cloud.repo.only=\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e23\u0e35\u0e42\u0e1b\u0e0b\u0e34\u0e17\u0e2d\u0e23\u0e35\u0e19\u0e35\u0e49 -history.group.today=\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 -history.group.yesterday=\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19 -history.group.week=\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c\u0e19\u0e35\u0e49 -history.group.month=\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e19\u0e35\u0e49 -history.group.older=\u0e40\u0e01\u0e48\u0e32\u0e01\u0e27\u0e48\u0e32 -history.time.moments=\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e01\u0e35\u0e49\u0e19\u0e35\u0e49 -history.time.minutes={0} \u0e19\u0e32\u0e17\u0e35\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 -history.time.hours={0} \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 -history.time.days={0} \u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 -history.time.months={0} \u0e40\u0e14\u0e37\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 -history.time.years={0} \u0e1b\u0e35\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 -history.error.local=\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e42\u0e2b\u0e25\u0e14\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e43\u0e19\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07 -history.error.cloud=\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e42\u0e2b\u0e25\u0e14\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e04\u0e25\u0e32\u0e27\u0e14\u0e4c -history.error.local.delete=\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e25\u0e1a\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 -history.error.local.rename=\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 -history.error.cloud.delete=\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e25\u0e1a\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e04\u0e25\u0e32\u0e27\u0e14\u0e4c\u0e44\u0e14\u0e49 +history.tab.local=เครื่องนี้ +history.tab.cloud=คลาวด์ +history.back=ย้อนกลับ +history.search.placeholder=ค้นหาเซสชัน +history.empty=ไม่มีเซสชัน +history.loading=กำลังโหลด… +history.untitled=ไม่มีชื่อ +history.delete.text=ลบ +history.delete.confirm.title=ลบเซสชัน? +history.delete.confirm.message=ลบ "{0}" ออกจากประวัติในเครื่อง? +history.delete.confirm.message.multiple=ลบ {0} เซสชันออกจากประวัติในเครื่อง? +history.rename.title=เปลี่ยนชื่อเซสชัน +history.rename.prompt=ชื่อเซสชันใหม่: +history.cloud.load.more=โหลดเพิ่มเติม +history.cloud.repo.only=เฉพาะรีโปซิทอรีนี้ +history.group.today=วันนี้ +history.group.yesterday=เมื่อวาน +history.group.week=สัปดาห์นี้ +history.group.month=เดือนนี้ +history.group.older=เก่ากว่า +history.time.moments=เมื่อกี้นี้ +history.time.minutes={0} นาทีที่แล้ว +history.time.hours={0} ชั่วโมงที่แล้ว +history.time.days={0} วันที่แล้ว +history.time.months={0} เดือนที่แล้ว +history.time.years={0} ปีที่แล้ว +history.error.local=ไม่สามารถโหลดประวัติในเครื่อง +history.error.cloud=ไม่สามารถโหลดประวัติคลาวด์ +history.error.local.delete=ไม่สามารถลบเซสชัน +history.error.local.rename=ไม่สามารถเปลี่ยนชื่อเซสชัน +history.error.cloud.delete=ยังไม่สามารถลบเซสชันคลาวด์ได้ -action.Kilo.Settings.text=\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 -action.Kilo.Settings.description=\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 Kilo Code -action.Kilo.NewSession.text=\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e43\u0e2b\u0e21\u0e48 -action.Kilo.NewSession.description=\u0e40\u0e23\u0e34\u0e48\u0e21\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 Kilo \u0e43\u0e2b\u0e21\u0e48 -action.Kilo.History.text=\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34 -action.Kilo.History.description=\u0e41\u0e2a\u0e14\u0e07\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 -action.Kilo.SendPrompt.text=\u0e2a\u0e48\u0e07\u0e04\u0e33\u0e02\u0e2d -action.Kilo.SendPrompt.description=\u0e2a\u0e48\u0e07\u0e04\u0e33\u0e02\u0e2d Kilo \u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19 -action.Kilo.StopSession.text=\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 -action.Kilo.StopSession.description=\u0e2b\u0e22\u0e38\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19 Kilo \u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19 -action.Kilo.SettingsGroup.text=\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 -action.Kilo.SettingsGroup.description=\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 Kilo Code -action.Kilo.Restart.text=\u0e23\u0e35\u0e2a\u0e15\u0e32\u0e23\u0e4c\u0e15 Kilo -action.Kilo.Restart.description=\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e30\u0e23\u0e35\u0e2a\u0e15\u0e32\u0e23\u0e4c\u0e15\u0e01\u0e23\u0e30\u0e1a\u0e27\u0e19\u0e01\u0e32\u0e23 CLI -action.Kilo.Reinstall.text=\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07 Kilo \u0e43\u0e2b\u0e21\u0e48 -action.Kilo.Reinstall.description=\u0e41\u0e15\u0e01\u0e44\u0e1f\u0e25\u0e4c\u0e44\u0e1a\u0e19\u0e32\u0e23\u0e35 CLI \u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e41\u0e25\u0e30\u0e23\u0e35\u0e2a\u0e15\u0e32\u0e23\u0e4c\u0e15 -action.Kilo.Session.Open.text=\u0e40\u0e1b\u0e34\u0e14 -action.Kilo.Session.Open.description=\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e17\u0e35\u0e48\u0e40\u0e25\u0e37\u0e2d\u0e01 -action.Kilo.Session.Rename.text=\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d -action.Kilo.Session.Rename.description=\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e17\u0e35\u0e48\u0e40\u0e25\u0e37\u0e2d\u0e01 -action.Kilo.Session.Delete.text=\u0e25\u0e1a -action.Kilo.Session.Delete.description=\u0e25\u0e1a\u0e40\u0e0b\u0e2a\u0e0a\u0e31\u0e19\u0e17\u0e35\u0e48\u0e40\u0e25\u0e37\u0e2d\u0e01 -action.Kilo.History.ContextMenu.text=\u0e01\u0e32\u0e23\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34 +action.Kilo.Settings.text=การตั้งค่า +action.Kilo.Settings.description=การตั้งค่า Kilo Code +action.Kilo.NewSession.text=เซสชันใหม่ +action.Kilo.NewSession.description=เริ่มเซสชัน Kilo ใหม่ +action.Kilo.History.text=ประวัติ +action.Kilo.History.description=แสดงประวัติเซสชัน +action.Kilo.SendPrompt.text=ส่งคำขอ +action.Kilo.SendPrompt.description=ส่งคำขอ Kilo ปัจจุบัน +action.Kilo.StopSession.text=หยุดเซสชัน +action.Kilo.StopSession.description=หยุดเซสชัน Kilo ปัจจุบัน +action.Kilo.SettingsGroup.text=การตั้งค่า +action.Kilo.SettingsGroup.description=การตั้งค่า Kilo Code +action.Kilo.Restart.text=รีสตาร์ต Kilo +action.Kilo.Restart.description=สิ้นสุดและรีสตาร์ตกระบวนการ CLI +action.Kilo.Reinstall.text=ติดตั้ง Kilo ใหม่ +action.Kilo.Reinstall.description=แตกไฟล์ไบนารี CLI อีกครั้งและรีสตาร์ต +action.Kilo.Session.Open.text=เปิด +action.Kilo.Session.Open.description=เปิดเซสชันที่เลือก +action.Kilo.Session.Rename.text=เปลี่ยนชื่อ +action.Kilo.Session.Rename.description=เปลี่ยนชื่อเซสชันที่เลือก +action.Kilo.Session.Delete.text=ลบ +action.Kilo.Session.Delete.description=ลบเซสชันที่เลือก +action.Kilo.History.ContextMenu.text=การดำเนินการประวัติ diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_tr.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_tr.properties index fc8f166cb13..096fcb1ee94 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_tr.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_tr.properties @@ -1,139 +1,139 @@ -session.connection.connecting=Y\u00fckleniyor\u2026 -session.connection.error.app=Ba\u011flant\u0131 hatas\u0131 -session.connection.error.workspace=\u00c7al\u0131\u015fma alan\u0131 y\u00fcklenemedi +session.connection.connecting=Yükleniyor… +session.connection.error.app=Bağlantı hatası +session.connection.error.workspace=Çalışma alanı yüklenemedi session.connection.error.unknown=Bilinmeyen hata session.connection.retry=Tekrar dene -session.connection.warning.config=Yap\u0131land\u0131rma uyar\u0131lar\u0131 +session.connection.warning.config=Yapılandırma uyarıları -session.empty.welcome=Kilo Code, bir yapay zeka kodlama asistan\u0131d\u0131r. \u00d6zellik olu\u015fturmas\u0131n\u0131, hata d\u00fczeltirlmesi veya kod taban\u0131n\u0131z\u0131 a\u00e7\u0131klamas\u0131n\u0131 isteyin. -session.empty.loading=Y\u00fckleniyor\u2026 +session.empty.welcome=Kilo Code, bir yapay zeka kodlama asistanıdır. Özellik oluşturmasını, hata düzeltirlmesi veya kod tabanınızı açıklamasını isteyin. +session.empty.loading=Yükleniyor… session.empty.recent=SON -session.showHistory=Ge\u00e7mi\u015fi g\u00f6ster -session.scroll.bottom=En alta ka\u00fdr +session.showHistory=Geçmişi göster +session.scroll.bottom=En alta kaýr session.tab.new=Yeni oturum -session.tab.untitled=Ba\u015fl\u0131ks\u0131z oturum +session.tab.untitled=Başlıksız oturum -session.permission.title=\u0130zin iste\u011fi -session.permission.meta=Ara\u00e7: {0} \u2022 Desenler: {1} -session.permission.allow=\u0130zin ver +session.permission.title=İzin isteği +session.permission.meta=Araç: {0} • Desenler: {1} +session.permission.allow=İzin ver session.permission.deny=Reddet session.question.dismiss=Kapat -session.status.considering=Sonraki ad\u0131mlar d\u00fc\u015f\u00fcn\u00fcl\u00fcyor\u2026 -session.status.thinking=D\u00fc\u015f\u00fcn\u00fcl\u00fcyor\u2026 -session.status.writing=Yan\u0131t yaz\u0131l\u0131yor\u2026 -session.status.delegating=\u0130\u015f devrediliyor\u2026 -session.status.planning=Plan haz\u0131rlan\u0131yor\u2026 -session.status.gathering=Ba\u011flam toplan\u0131yor\u2026 -session.status.searching.codebase=Kod taban\u0131 aran\u0131yor\u2026 -session.status.searching.web=Web aran\u0131yor\u2026 -session.status.editing=D\u00fczenleme yap\u0131l\u0131yor\u2026 -session.status.commands=Komutlar \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor\u2026 +session.status.considering=Sonraki adımlar düşünülüyor… +session.status.thinking=Düşünülüyor… +session.status.writing=Yanıt yazılıyor… +session.status.delegating=İş devrediliyor… +session.status.planning=Plan hazırlanıyor… +session.status.gathering=Bağlam toplanıyor… +session.status.searching.codebase=Kod tabanı aranıyor… +session.status.searching.web=Web aranıyor… +session.status.editing=Düzenleme yapılıyor… +session.status.commands=Komutlar çalıştırılıyor… session.part.reasoning=Muhakeme -session.part.compaction=ba\u011flam s\u0131k\u0131\u015ft\u0131r\u0131ld\u0131 +session.part.compaction=bağlam sıkıştırıldı session.part.tool.copy=Kopyala session.part.tool.error=Hata session.part.tool.pending=Bekliyor session.part.tool.read=Oku -session.part.tool.running=\u00c7al\u0131\u015f\u0131yor +session.part.tool.running=Çalışıyor session.part.tool.shell=Kabuk -session.part.tool.truncated=\u00d6nizlemede \u00e7\u0131kt\u0131 k\u0131salt\u0131ld\u0131. Tam \u00e7\u0131kt\u0131 oturum verilerinde kal\u0131yor. +session.part.tool.truncated=Önizlemede çıktı kısaltıldı. Tam çıktı oturum verilerinde kalıyor. -session.error.prompt=\u0130stem hatas\u0131 -session.error.compact=Oturum s\u0131k\u0131\u015ft\u0131rma hatas\u0131 +session.error.prompt=İstem hatası +session.error.compact=Oturum sıkıştırma hatası session.error.unknown=Bilinmeyen hata session.header.tokens=Jeton -session.header.tokens.description=Son asistan yan\u0131t\u0131nda kullan\u0131lan jetonlar: giri\u015f, \u00e7\u0131k\u0131\u015f, \u00f6nbelle\u011fe yazma ve \u00f6nbellekten okuma. -session.header.input=giri\u015f {0} -session.header.output=\u00e7\u0131k\u0131\u015f {0} -session.header.cache.write=\u00f6nbelle\u011fe yazma {0} -session.header.cache.read=\u00f6nbellekten okuma {0} -session.header.compact=Oturumu s\u0131k\u0131\u015ft\u0131r -session.header.compact.description=Ba\u011flam boyutunu azaltmak i\u00e7in oturumu \u00f6zetle -session.header.expand=Oturum metriklerini g\u00f6ster +session.header.tokens.description=Son asistan yanıtında kullanılan jetonlar: giriş, çıkış, önbelleğe yazma ve önbellekten okuma. +session.header.input=giriş {0} +session.header.output=çıkış {0} +session.header.cache.write=önbelleğe yazma {0} +session.header.cache.read=önbellekten okuma {0} +session.header.compact=Oturumu sıkıştır +session.header.compact.description=Bağlam boyutunu azaltmak için oturumu özetle +session.header.expand=Oturum metriklerini göster session.header.collapse=Oturum metriklerini gizle -session.header.todos.progress={0}/{1} g\u00f6rev tamamland\u0131 -session.header.todos.done=T\u00fcm {0} g\u00f6rev tamamland\u0131 -session.header.context.tooltip.percent={0} jeton (ba\u011flam\u0131n %{1}\u2019i) +session.header.todos.progress={0}/{1} görev tamamlandı +session.header.todos.done=Tüm {0} görev tamamlandı +session.header.context.tooltip.percent={0} jeton (bağlamın %{1}’i) session.header.context.tooltip.tokens={0} jeton -session.header.context.used={0} / {1} jeton kullan\u0131ld\u0131 -session.header.context.reserved={0} \u00e7\u0131k\u0131\u015f i\u00e7in ayr\u0131ld\u0131 -session.header.context.available={0} kullan\u0131labilir +session.header.context.used={0} / {1} jeton kullanıldı +session.header.context.reserved={0} çıkış için ayrıldı +session.header.context.available={0} kullanılabilir -prompt.placeholder=Bir mesaj yaz\u0131n\u2026 -prompt.placeholder.with.shortcuts=Bir mesaj yaz\u0131n\u2026 ({0} g\u00f6ndermek i\u00e7in, {1} yeni sat\u0131r i\u00e7in) -prompt.placeholder.with.send=Bir mesaj yaz\u0131n\u2026 ({0} g\u00f6ndermek i\u00e7in) -prompt.placeholder.with.newline=Bir mesaj yaz\u0131n\u2026 ({0} yeni sat\u0131r i\u00e7in) -prompt.button.send=G\u00f6nder +prompt.placeholder=Bir mesaj yazın… +prompt.placeholder.with.shortcuts=Bir mesaj yazın… ({0} göndermek için, {1} yeni satır için) +prompt.placeholder.with.send=Bir mesaj yazın… ({0} göndermek için) +prompt.placeholder.with.newline=Bir mesaj yazın… ({0} yeni satır için) +prompt.button.send=Gönder prompt.button.stop=Durdur -prompt.button.send.tooltip.stop=Durdurmak i\u00e7in {0} bas\u0131n -mode.picker.tooltip=Mod se\u00e7 -mode.picker.deprecated=ge\u00e7ersiz -model.picker.tooltip=Model se\u00e7 -model.picker.recommended=\u00d6nerilen +prompt.button.send.tooltip.stop=Durdurmak için {0} basın +mode.picker.tooltip=Mod seç +mode.picker.deprecated=geçersiz +model.picker.tooltip=Model seç +model.picker.recommended=Önerilen model.picker.favorites=Favoriler model.picker.search=Model ara -model.picker.no.matches=E\u015fle\u015fen model yok +model.picker.no.matches=Eşleşen model yok model.picker.favorite.add=Favorilere ekle -model.picker.favorite.remove=Favorilerden \u00e7\u0131kar -model.picker.free=\u00dccretsiz -model.picker.reset=Modeli varsay\u0131lana s\u0131f\u0131rla -reasoning.picker.tooltip=Muhakeme \u00e7abas\u0131 se\u00e7 +model.picker.favorite.remove=Favorilerden çıkar +model.picker.free=Ücretsiz +model.picker.reset=Modeli varsayılana sıfırla +reasoning.picker.tooltip=Muhakeme çabası seç history.tab.local=Yerel history.tab.cloud=Bulut history.back=Geri history.search.placeholder=Oturum ara history.empty=Oturum yok -history.loading=Y\u00fckleniyor\u2026 -history.untitled=Ba\u015fl\u0131ks\u0131z +history.loading=Yükleniyor… +history.untitled=Başlıksız history.delete.text=Sil history.delete.confirm.title=Oturum silinsin mi? -history.delete.confirm.message="{0}" yerel ge\u00e7mi\u015ften silinsin mi? -history.delete.confirm.message.multiple={0} oturum yerel ge\u00e7mi\u015ften silinsin mi? -history.rename.title=Oturumu yeniden adland\u0131r -history.rename.prompt=Yeni oturum ad\u0131: -history.cloud.load.more=Daha fazla y\u00fckle -history.cloud.repo.only=Yaln\u0131zca bu depo -history.group.today=Bug\u00fcn -history.group.yesterday=D\u00fcn +history.delete.confirm.message="{0}" yerel geçmişten silinsin mi? +history.delete.confirm.message.multiple={0} oturum yerel geçmişten silinsin mi? +history.rename.title=Oturumu yeniden adlandır +history.rename.prompt=Yeni oturum adı: +history.cloud.load.more=Daha fazla yükle +history.cloud.repo.only=Yalnızca bu depo +history.group.today=Bugün +history.group.yesterday=Dün history.group.week=Bu hafta history.group.month=Bu ay history.group.older=Daha eski -history.time.moments=Az \u00f6nce -history.time.minutes={0} dk \u00f6nce -history.time.hours={0} sa \u00f6nce -history.time.days={0} g \u00f6nce -history.time.months={0} ay \u00f6nce -history.time.years={0} y\u0131l \u00f6nce -history.error.local=Yerel ge\u00e7mi\u015f y\u00fcklenemedi -history.error.cloud=Bulut ge\u00e7mi\u015fi y\u00fcklenemedi +history.time.moments=Az önce +history.time.minutes={0} dk önce +history.time.hours={0} sa önce +history.time.days={0} g önce +history.time.months={0} ay önce +history.time.years={0} yıl önce +history.error.local=Yerel geçmiş yüklenemedi +history.error.cloud=Bulut geçmişi yüklenemedi history.error.local.delete=Oturum silinemedi -history.error.local.rename=Oturum yeniden adland\u0131r\u0131lamad\u0131 -history.error.cloud.delete=Bulut oturumlar\u0131 hen\u00fcz silinemiyor +history.error.local.rename=Oturum yeniden adlandırılamadı +history.error.cloud.delete=Bulut oturumları henüz silinemiyor action.Kilo.Settings.text=Ayarlar -action.Kilo.Settings.description=Kilo Code ayarlar\u0131 +action.Kilo.Settings.description=Kilo Code ayarları action.Kilo.NewSession.text=Yeni oturum -action.Kilo.NewSession.description=Yeni bir Kilo oturumu ba\u015flat -action.Kilo.History.text=Ge\u00e7mi\u015f -action.Kilo.History.description=Oturum ge\u00e7mi\u015fini g\u00f6ster -action.Kilo.SendPrompt.text=\u0130stem g\u00f6nder -action.Kilo.SendPrompt.description=Ge\u00e7erli Kilo istemini g\u00f6nder +action.Kilo.NewSession.description=Yeni bir Kilo oturumu başlat +action.Kilo.History.text=Geçmiş +action.Kilo.History.description=Oturum geçmişini göster +action.Kilo.SendPrompt.text=İstem gönder +action.Kilo.SendPrompt.description=Geçerli Kilo istemini gönder action.Kilo.StopSession.text=Oturumu durdur -action.Kilo.StopSession.description=Ge\u00e7erli Kilo oturumunu durdur +action.Kilo.StopSession.description=Geçerli Kilo oturumunu durdur action.Kilo.SettingsGroup.text=Ayarlar -action.Kilo.SettingsGroup.description=Kilo Code ayarlar\u0131 -action.Kilo.Restart.text=Kilo\u2019yu yeniden ba\u015flat -action.Kilo.Restart.description=CLI s\u00fcrecini sonland\u0131r ve yeniden ba\u015flat -action.Kilo.Reinstall.text=Kilo\u2019yu yeniden y\u00fckle -action.Kilo.Reinstall.description=CLI ikili dosyas\u0131n\u0131 yeniden \u00e7\u0131kar ve yeniden ba\u015flat -action.Kilo.Session.Open.text=A\u00e7 -action.Kilo.Session.Open.description=Se\u00e7ilen oturumu a\u00e7 -action.Kilo.Session.Rename.text=Yeniden adland\u0131r -action.Kilo.Session.Rename.description=Se\u00e7ilen oturumu yeniden adland\u0131r +action.Kilo.SettingsGroup.description=Kilo Code ayarları +action.Kilo.Restart.text=Kilo’yu yeniden başlat +action.Kilo.Restart.description=CLI sürecini sonlandır ve yeniden başlat +action.Kilo.Reinstall.text=Kilo’yu yeniden yükle +action.Kilo.Reinstall.description=CLI ikili dosyasını yeniden çıkar ve yeniden başlat +action.Kilo.Session.Open.text=Aç +action.Kilo.Session.Open.description=Seçilen oturumu aç +action.Kilo.Session.Rename.text=Yeniden adlandır +action.Kilo.Session.Rename.description=Seçilen oturumu yeniden adlandır action.Kilo.Session.Delete.text=Sil -action.Kilo.Session.Delete.description=Se\u00e7ilen oturumlar\u0131 sil -action.Kilo.History.ContextMenu.text=Ge\u00e7mi\u015f eylemleri +action.Kilo.Session.Delete.description=Seçilen oturumları sil +action.Kilo.History.ContextMenu.text=Geçmiş eylemleri diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_uk.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_uk.properties index 4adc8b2d7d3..73d770b3c05 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_uk.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_uk.properties @@ -1,139 +1,139 @@ -session.connection.connecting=\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f\u2026 -session.connection.error.app=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437'\u0454\u0434\u043d\u0430\u043d\u043d\u044f -session.connection.error.workspace=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u0440\u043e\u0431\u043e\u0447\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0443 -session.connection.error.unknown=\u041d\u0435\u0432\u0456\u0434\u043e\u043c\u0430 \u043f\u043e\u043c\u0438\u043b\u043a\u0430 -session.connection.retry=\u0421\u043f\u0440\u043e\u0431\u0443\u0432\u0430\u0442\u0438 \u0437\u043d\u043e\u0432\u0443 -session.connection.warning.config=\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u0436\u0435\u043d\u043d\u044f \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u0457 +session.connection.connecting=Завантаження… +session.connection.error.app=Помилка з'єднання +session.connection.error.workspace=Помилка завантаження робочого простору +session.connection.error.unknown=Невідома помилка +session.connection.retry=Спробувати знову +session.connection.warning.config=Попередження конфігурації -session.empty.welcome=Kilo Code \u2014 \u0446\u0435 AI-\u0430\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0443\u0432\u0430\u043d\u043d\u044f. \u041f\u043e\u043f\u0440\u043e\u0441\u0456\u0442\u044c \u0439\u043e\u0433\u043e \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0456\u0457, \u0432\u0438\u043f\u0440\u0430\u0432\u0438\u0442\u0438 \u043f\u043e\u043c\u0438\u043b\u043a\u0438 \u0430\u0431\u043e \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u0438 \u0432\u0430\u0448 \u043a\u043e\u0434. -session.empty.loading=\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f\u2026 -session.empty.recent=\u041d\u0415\u0414\u0410\u0412\u041d\u0406 -session.showHistory=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0456\u0441\u0442\u043e\u0440\u0456\u044e -session.scroll.bottom=\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u0438 \u0434\u043e\u043d\u0438\u0437\u0443 -session.tab.new=\u041d\u043e\u0432\u0430 \u0441\u0435\u0441\u0456\u044f -session.tab.untitled=\u0421\u0435\u0441\u0456\u044f \u0431\u0435\u0437 \u043d\u0430\u0437\u0432\u0438 +session.empty.welcome=Kilo Code — це AI-асистент для програмування. Попросіть його створити функції, виправити помилки або пояснити ваш код. +session.empty.loading=Завантаження… +session.empty.recent=НЕДАВНІ +session.showHistory=Показати історію +session.scroll.bottom=Прокрутити донизу +session.tab.new=Нова сесія +session.tab.untitled=Сесія без назви -session.permission.title=\u0417\u0430\u043f\u0438\u0442 \u0434\u043e\u0437\u0432\u043e\u043b\u0443 -session.permission.meta=\u0406\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442: {0} \u2022 \u0428\u0430\u0431\u043b\u043e\u043d\u0438: {1} -session.permission.allow=\u0414\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0438 -session.permission.deny=\u0417\u0430\u0431\u043e\u0440\u043e\u043d\u0438\u0442\u0438 -session.question.dismiss=\u0417\u0430\u043a\u0440\u0438\u0442\u0438 +session.permission.title=Запит дозволу +session.permission.meta=Інструмент: {0} • Шаблони: {1} +session.permission.allow=Дозволити +session.permission.deny=Заборонити +session.question.dismiss=Закрити -session.status.considering=\u041e\u0431\u043c\u0456\u0440\u043a\u043e\u0432\u0443\u044e \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0456 \u043a\u0440\u043e\u043a\u0438\u2026 -session.status.thinking=\u041c\u0456\u0440\u043a\u0443\u044e\u2026 -session.status.writing=\u041f\u0438\u0448\u0443 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u044c\u2026 -session.status.delegating=\u0414\u0435\u043b\u0435\u0433\u0443\u044e \u0440\u043e\u0431\u043e\u0442\u0443\u2026 -session.status.planning=\u041f\u043b\u0430\u043d\u0443\u044e\u2026 -session.status.gathering=\u0417\u0431\u0438\u0440\u0430\u044e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u2026 -session.status.searching.codebase=\u0428\u0443\u043a\u0430\u044e \u0432 \u043a\u043e\u0434\u043e\u0432\u0456\u0439 \u0431\u0430\u0437\u0456\u2026 -session.status.searching.web=\u0428\u0443\u043a\u0430\u044e \u0432 \u0456\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0456\u2026 -session.status.editing=\u0412\u043d\u043e\u0448\u0443 \u0437\u043c\u0456\u043d\u0438\u2026 -session.status.commands=\u0412\u0438\u043a\u043e\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0438\u2026 +session.status.considering=Обмірковую наступні кроки… +session.status.thinking=Міркую… +session.status.writing=Пишу відповідь… +session.status.delegating=Делегую роботу… +session.status.planning=Планую… +session.status.gathering=Збираю контекст… +session.status.searching.codebase=Шукаю в кодовій базі… +session.status.searching.web=Шукаю в інтернеті… +session.status.editing=Вношу зміни… +session.status.commands=Виконую команди… -session.part.reasoning=\u041c\u0456\u0440\u043a\u0443\u0432\u0430\u043d\u043d\u044f -session.part.compaction=\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0442\u0438\u0441\u043d\u0443\u0442\u043e -session.part.tool.copy=\u041a\u043e\u043f\u0456\u044e\u0432\u0430\u0442\u0438 -session.part.tool.error=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 -session.part.tool.pending=\u041e\u0447\u0456\u043a\u0443\u0454\u0442\u044c\u0441\u044f -session.part.tool.read=\u0427\u0438\u0442\u0430\u043d\u043d\u044f -session.part.tool.running=\u0412\u0438\u043a\u043e\u043d\u0443\u0454\u0442\u044c\u0441\u044f +session.part.reasoning=Міркування +session.part.compaction=контекст стиснуто +session.part.tool.copy=Копіювати +session.part.tool.error=Помилка +session.part.tool.pending=Очікується +session.part.tool.read=Читання +session.part.tool.running=Виконується session.part.tool.shell=Shell -session.part.tool.truncated=\u0412\u0438\u0432\u0456\u0434 \u0443 \u043f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u044c\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434\u0456 \u0443\u0441\u0456\u0447\u0435\u043d\u043e. \u041f\u043e\u0432\u043d\u0438\u0439 \u0432\u0438\u0432\u0456\u0434 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u0438\u0445 \u0441\u0435\u0441\u0456\u0457. +session.part.tool.truncated=Вивід у попередньому перегляді усічено. Повний вивід зберігається в даних сесії. -session.error.prompt=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437\u0430\u043f\u0438\u0442\u0443 -session.error.compact=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0441\u0442\u0438\u0441\u043d\u0435\u043d\u043d\u044f \u0441\u0435\u0441\u0456\u0457 -session.error.unknown=\u041d\u0435\u0432\u0456\u0434\u043e\u043c\u0430 \u043f\u043e\u043c\u0438\u043b\u043a\u0430 +session.error.prompt=Помилка запиту +session.error.compact=Помилка стиснення сесії +session.error.unknown=Невідома помилка -session.header.tokens=\u0422\u043e\u043a\u0435\u043d\u0438 -session.header.tokens.description=\u0422\u043e\u043a\u0435\u043d\u0438, \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u0456 \u043e\u0441\u0442\u0430\u043d\u043d\u0456\u0439 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u434e\u044e \u0430\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430: \u0432\u0445\u0456\u0434, \u0432\u0438\u0445\u0456\u0434, \u0437\u0430\u043f\u0438\u0441 \u0443 \u043a\u0435\u0448 \u0456 \u0447\u0438\u0442\u0430\u043d\u043d\u044f \u0437 \u043a\u0435\u0448\u0443. -session.header.input=\u0432\u0445\u0456\u0434 {0} -session.header.output=\u0432\u0438\u0445\u0456\u0434 {0} -session.header.cache.write=\u0437\u0430\u043f\u0438\u0441 \u0443 \u043a\u0435\u0448 {0} -session.header.cache.read=\u0447\u0438\u0442\u0430\u043d\u043d\u044f \u0437 \u043a\u0435\u0448\u0443 {0} -session.header.compact=\u0421\u0442\u0438\u0441\u043d\u0443\u0442\u0438 \u0441\u0435\u0441\u0456\u044e -session.header.compact.description=\u0421\u0442\u0438\u0441\u043d\u0443\u0442\u0438 \u0441\u0435\u0441\u0456\u044e, \u0449\u043e\u0431 \u0437\u043c\u0435\u043d\u0448\u0438\u0442\u0438 \u0440\u043e\u0437\u043c\u0456\u0440 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 -session.header.expand=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u0435\u0441\u0456\u0457 -session.header.collapse=\u041f\u0440\u0438\u0445\u043e\u0432\u0430\u0442\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u0435\u0441\u0456\u0457 -session.header.todos.progress={0}/{1} \u0437\u0430\u0432\u0434\u0430\u043d\u044c \u0432\u0438\u043a\u043e\u043d\u0430\u043d\u043e -session.header.todos.done=\u0423\u0441\u0456 {0} \u0437\u0430\u0432\u0434\u0430\u043d\u044c \u0432\u0438\u043a\u043e\u043d\u0430\u043d\u043e -session.header.context.tooltip.percent={0} \u0442\u043e\u043a\u0435\u043d\u0456\u0432 ({1}% \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443) -session.header.context.tooltip.tokens={0} \u0442\u043e\u043a\u0435\u043d\u0456\u0432 -session.header.context.used={0} / {1} \u0442\u043e\u043a\u0435\u043d\u0456\u0432 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043e -session.header.context.reserved={0} \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u0432\u0438\u0445\u043e\u0434\u0443 -session.header.context.available={0} \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e +session.header.tokens=Токени +session.header.tokens.description=Токени, використані останній відповід䍎ю асистента: вхід, вихід, запис у кеш і читання з кешу. +session.header.input=вхід {0} +session.header.output=вихід {0} +session.header.cache.write=запис у кеш {0} +session.header.cache.read=читання з кешу {0} +session.header.compact=Стиснути сесію +session.header.compact.description=Стиснути сесію, щоб зменшити розмір контексту +session.header.expand=Показати метрики сесії +session.header.collapse=Приховати метрики сесії +session.header.todos.progress={0}/{1} завдань виконано +session.header.todos.done=Усі {0} завдань виконано +session.header.context.tooltip.percent={0} токенів ({1}% контексту) +session.header.context.tooltip.tokens={0} токенів +session.header.context.used={0} / {1} токенів використано +session.header.context.reserved={0} зарезервовано для виходу +session.header.context.available={0} доступно -prompt.placeholder=\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f\u2026 -prompt.placeholder.with.shortcuts=\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f\u2026 ({0} \u2014 \u043d\u0430\u0434\u0456\u0441\u043b\u0430\u0442\u0438, {1} \u2014 \u043d\u043e\u0432\u0438\u0439 \u0440\u044f\u0434\u043e\u043a) -prompt.placeholder.with.send=\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f\u2026 ({0} \u2014 \u043d\u0430\u0434\u0456\u0441\u043b\u0430\u0442\u0438) -prompt.placeholder.with.newline=\u0412\u0432\u0435\u0434\u0456\u0442\u044c \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f\u2026 ({0} \u2014 \u043d\u043e\u0432\u0438\u0439 \u0440\u044f\u0434\u043e\u043a) -prompt.button.send=\u041d\u0430\u0434\u0456\u0441\u043b\u0430\u0442\u0438 -prompt.button.stop=\u0417\u0443\u043f\u0438\u043d\u0438\u0442\u0438 -prompt.button.send.tooltip.stop=\u0429\u043e\u0431 \u0437\u0443\u043f\u0438\u043d\u0438\u0442\u0438, \u043d\u0430\u0442\u0438\u0441\u043d\u0456\u0442\u044c {0} -mode.picker.tooltip=\u041e\u0431\u0440\u0430\u0442\u0438 \u0440\u0435\u0436\u0438\u043c -mode.picker.deprecated=\u0437\u0430\u0441\u0442\u0430\u0440\u0456\u043b\u0438\u0439 -model.picker.tooltip=\u041e\u0431\u0440\u0430\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c -model.picker.recommended=\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u0456 -model.picker.favorites=\u0423\u043b\u044e\u0431\u043b\u0435\u043d\u0456 -model.picker.search=\u041f\u043e\u0448\u0443\u043a \u043c\u043e\u0434\u0435\u043b\u0435\u0439 -model.picker.no.matches=\u041d\u0435\u043c\u0430\u0454 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u043d\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 -model.picker.favorite.add=\u0414\u043e\u0434\u0430\u0442\u0438 \u0434\u043e \u0443\u043b\u044e\u0431\u043b\u0435\u043d\u0438\u0445 -model.picker.favorite.remove=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0437 \u0443\u043b\u044e\u0431\u043b\u0435\u043d\u0438\u0445 -model.picker.free=\u0411\u0435\u0437\u043a\u043e\u0448\u0442\u043e\u0432\u043d\u043e -model.picker.reset=\u0421\u043a\u0438\u043d\u0443\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0457 -reasoning.picker.tooltip=\u041e\u0431\u0440\u0430\u0442\u0438 \u0440\u0456\u0432\u0435\u043d\u044c \u043c\u0456\u0440\u043a\u0443\u0432\u0430\u043d\u043d\u044f +prompt.placeholder=Введіть повідомлення… +prompt.placeholder.with.shortcuts=Введіть повідомлення… ({0} — надіслати, {1} — новий рядок) +prompt.placeholder.with.send=Введіть повідомлення… ({0} — надіслати) +prompt.placeholder.with.newline=Введіть повідомлення… ({0} — новий рядок) +prompt.button.send=Надіслати +prompt.button.stop=Зупинити +prompt.button.send.tooltip.stop=Щоб зупинити, натисніть {0} +mode.picker.tooltip=Обрати режим +mode.picker.deprecated=застарілий +model.picker.tooltip=Обрати модель +model.picker.recommended=Рекомендовані +model.picker.favorites=Улюблені +model.picker.search=Пошук моделей +model.picker.no.matches=Немає відповідних моделей +model.picker.favorite.add=Додати до улюблених +model.picker.favorite.remove=Видалити з улюблених +model.picker.free=Безкоштовно +model.picker.reset=Скинути модель до стандартної +reasoning.picker.tooltip=Обрати рівень міркування -history.tab.local=\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430 -history.tab.cloud=\u0425\u043c\u0430\u0440\u0430 -history.back=\u041d\u0430\u0437\u0430\u0434 -history.search.placeholder=\u041f\u043e\u0448\u0443\u043a \u0441\u0435\u0441\u0456\u0439 -history.empty=\u041d\u0435\u043c\u0430\u0454 \u0441\u0435\u0441\u0456\u0439 -history.loading=\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f\u2026 -history.untitled=\u0411\u0435\u0437 \u043d\u0430\u0437\u0432\u0438 -history.delete.text=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 -history.delete.confirm.title=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0441\u0435\u0441\u0456\u044e? -history.delete.confirm.message=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u00ab{0}\u00bb \u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0457 \u0456\u0441\u0442\u043e\u0440\u0456\u0457? -history.delete.confirm.message.multiple=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 {0} \u0441\u0435\u0441\u0456\u0439 \u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0457 \u0456\u0441\u0442\u043e\u0440\u0456\u0457? -history.rename.title=\u041f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0438 \u0441\u0435\u0441\u0456\u044e -history.rename.prompt=\u041d\u043e\u0432\u0430 \u043d\u0430\u0437\u0432\u0430 \u0441\u0435\u0441\u0456\u0457: -history.cloud.load.more=\u0417\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0438\u0442\u0438 \u0431\u0456\u043b\u044c\u0448\u0435 -history.cloud.repo.only=\u0422\u0456\u043b\u044c\u043a\u0438 \u0446\u0435\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0456\u0439 -history.group.today=\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 -history.group.yesterday=\u0412\u0447\u043e\u0440\u0430 -history.group.week=\u0426\u044c\u043e\u0433\u043e \u0442\u0438\u0436\u043d\u044f -history.group.month=\u0426\u044c\u043e\u0433\u043e \u043c\u0456\u0441\u044f\u0446\u044f -history.group.older=\u0421\u0442\u0430\u0440\u0456\u0448\u0435 -history.time.moments=\u0429\u043e\u0439\u043d\u043e -history.time.minutes={0} \u0445\u0432 \u0442\u043e\u043c\u0443 -history.time.hours={0} \u0433\u043e\u0434 \u0442\u043e\u043c\u0443 -history.time.days={0} \u0434\u043d \u0442\u043e\u043c\u0443 -history.time.months={0} \u043c\u0456\u0441 \u0442\u043e\u043c\u0443 -history.time.years={0} \u0440 \u0442\u043e\u043c\u0443 -history.error.local=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0457 \u0456\u0441\u0442\u043e\u0440\u0456\u0457 -history.error.cloud=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u0445\u043c\u0430\u0440\u043d\u043e\u0457 \u0456\u0441\u0442\u043e\u0440\u0456\u0457 -history.error.local.delete=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0432\u0438\u0434\u0430\u043b\u0435\u043d\u043d\u044f \u0441\u0435\u0441\u0456\u0457 -history.error.local.rename=\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u043f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u043d\u043d\u044f \u0441\u0435\u0441\u0456\u0457 -history.error.cloud.delete=\u0425\u043c\u0430\u0440\u043d\u0456 \u0441\u0435\u0441\u0456\u0457 \u043f\u043e\u043a\u0438 \u043d\u0435 \u043c\u043e\u0436\u043d\u0430 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 +history.tab.local=Локальна +history.tab.cloud=Хмара +history.back=Назад +history.search.placeholder=Пошук сесій +history.empty=Немає сесій +history.loading=Завантаження… +history.untitled=Без назви +history.delete.text=Видалити +history.delete.confirm.title=Видалити сесію? +history.delete.confirm.message=Видалити «{0}» з локальної історії? +history.delete.confirm.message.multiple=Видалити {0} сесій з локальної історії? +history.rename.title=Перейменувати сесію +history.rename.prompt=Нова назва сесії: +history.cloud.load.more=Завантажити більше +history.cloud.repo.only=Тільки цей репозиторій +history.group.today=Сьогодні +history.group.yesterday=Вчора +history.group.week=Цього тижня +history.group.month=Цього місяця +history.group.older=Старіше +history.time.moments=Щойно +history.time.minutes={0} хв тому +history.time.hours={0} год тому +history.time.days={0} дн тому +history.time.months={0} міс тому +history.time.years={0} р тому +history.error.local=Помилка завантаження локальної історії +history.error.cloud=Помилка завантаження хмарної історії +history.error.local.delete=Помилка видалення сесії +history.error.local.rename=Помилка перейменування сесії +history.error.cloud.delete=Хмарні сесії поки не можна видалити -action.Kilo.Settings.text=\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f -action.Kilo.Settings.description=\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f Kilo Code -action.Kilo.NewSession.text=\u041d\u043e\u0432\u0430 \u0441\u0435\u0441\u0456\u044f -action.Kilo.NewSession.description=\u0420\u043e\u0437\u043f\u043e\u0447\u0430\u0442\u0438 \u043d\u043e\u0432\u0443 \u0441\u0435\u0441\u0456\u044e Kilo -action.Kilo.History.text=\u0406\u0441\u0442\u043e\u0440\u0456\u044f -action.Kilo.History.description=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0438 \u0456\u0441\u0442\u043e\u0440\u0456\u044e \u0441\u0435\u0441\u0456\u0439 -action.Kilo.SendPrompt.text=\u041d\u0430\u0434\u0456\u0441\u043b\u0430\u0442\u0438 \u0437\u0430\u043f\u0438\u0442 -action.Kilo.SendPrompt.description=\u041d\u0430\u0434\u0456\u0441\u043b\u0430\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u0437\u0430\u043f\u0438\u0442 Kilo -action.Kilo.StopSession.text=\u0417\u0443\u043f\u0438\u043d\u0438\u0442\u0438 \u0441\u0435\u0441\u0456\u044e -action.Kilo.StopSession.description=\u0417\u0443\u043f\u0438\u043d\u0438\u0442\u0438 \u043f\u043e\u0442\u043e\u0447\u043d\u0443 \u0441\u0435\u0441\u0456\u044e Kilo -action.Kilo.SettingsGroup.text=\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f -action.Kilo.SettingsGroup.description=\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f Kilo Code -action.Kilo.Restart.text=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438 Kilo -action.Kilo.Restart.description=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0438 \u0456 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438 CLI-\u043f\u0440\u043e\u0446\u0435\u0441 -action.Kilo.Reinstall.text=\u041f\u0435\u0440\u0435\u0432\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0438 Kilo -action.Kilo.Reinstall.description=\u041f\u0435\u0440\u0435\u0440\u043e\u0437\u043f\u0430\u043a\u0443\u0432\u0430\u0442\u0438 CLI-\u0431\u0456\u043d\u0430\u0440\u043d\u0438\u0439 \u0444\u0430\u0439\u043b \u0456 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438 -action.Kilo.Session.Open.text=\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 -action.Kilo.Session.Open.description=\u0412\u0456\u0434\u043a\u0440\u0438\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043d\u0443 \u0441\u0435\u0441\u0456\u044e -action.Kilo.Session.Rename.text=\u041f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0438 -action.Kilo.Session.Rename.description=\u041f\u0435\u0440\u0435\u0439\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043d\u0443 \u0441\u0435\u0441\u0456\u044e -action.Kilo.Session.Delete.text=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 -action.Kilo.Session.Delete.description=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043d\u0443(-\u0456) \u0441\u0435\u0441\u0456\u044e(-\u0457) -action.Kilo.History.ContextMenu.text=\u0414\u0456\u0457 \u0437 \u0456\u0441\u0442\u043e\u0440\u0456\u0454\u044e +action.Kilo.Settings.text=Налаштування +action.Kilo.Settings.description=Налаштування Kilo Code +action.Kilo.NewSession.text=Нова сесія +action.Kilo.NewSession.description=Розпочати нову сесію Kilo +action.Kilo.History.text=Історія +action.Kilo.History.description=Показати історію сесій +action.Kilo.SendPrompt.text=Надіслати запит +action.Kilo.SendPrompt.description=Надіслати поточний запит Kilo +action.Kilo.StopSession.text=Зупинити сесію +action.Kilo.StopSession.description=Зупинити поточну сесію Kilo +action.Kilo.SettingsGroup.text=Налаштування +action.Kilo.SettingsGroup.description=Налаштування Kilo Code +action.Kilo.Restart.text=Перезапустити Kilo +action.Kilo.Restart.description=Завершити і перезапустити CLI-процес +action.Kilo.Reinstall.text=Перевстановити Kilo +action.Kilo.Reinstall.description=Перерозпакувати CLI-бінарний файл і перезапустити +action.Kilo.Session.Open.text=Відкрити +action.Kilo.Session.Open.description=Відкрити вибрану сесію +action.Kilo.Session.Rename.text=Перейменувати +action.Kilo.Session.Rename.description=Перейменувати вибрану сесію +action.Kilo.Session.Delete.text=Видалити +action.Kilo.Session.Delete.description=Видалити вибрану(-і) сесію(-ї) +action.Kilo.History.ContextMenu.text=Дії з історією diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_CN.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_CN.properties index 4b2ef4a9acc..2288060553f 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_CN.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_CN.properties @@ -1,139 +1,139 @@ -session.connection.connecting=\u52a0\u8f7d\u4e2d\u2026 -session.connection.error.app=\u8fde\u63a5\u5931\u8d25 -session.connection.error.workspace=\u5de5\u4f5c\u533a\u52a0\u8f7d\u5931\u8d25 -session.connection.error.unknown=\u672a\u77e5\u9519\u8bef -session.connection.retry=\u91cd\u8bd5 -session.connection.warning.config=\u914d\u7f6e\u8b66\u544a +session.connection.connecting=加载中… +session.connection.error.app=连接失败 +session.connection.error.workspace=工作区加载失败 +session.connection.error.unknown=未知错误 +session.connection.retry=重试 +session.connection.warning.config=配置警告 -session.empty.welcome=Kilo Code \u662f\u4e00\u4e2a AI \u7f16\u7a0b\u52a9\u624b\u3002\u53ef\u8bf7\u5b83\u6784\u5efa\u529f\u80fd\u3001\u4fee\u590d\u9519\u8bef\u6216\u89e3\u91ca\u60a8\u7684\u4ee3\u7801\u5e93\u3002 -session.empty.loading=\u52a0\u8f7d\u4e2d\u2026 -session.empty.recent=\u6700\u8fd1 -session.showHistory=\u663e\u793a\u5386\u53f2 -session.scroll.bottom=\u6eda\u52a8\u5230\u5e95\u90e8 -session.tab.new=\u65b0\u5efa\u4f1a\u8bdd -session.tab.untitled=\u65e0\u6807\u9898\u4f1a\u8bdd +session.empty.welcome=Kilo Code 是一个 AI 编程助手。可请它构建功能、修复错误或解释您的代码库。 +session.empty.loading=加载中… +session.empty.recent=最近 +session.showHistory=显示历史 +session.scroll.bottom=滚动到底部 +session.tab.new=新建会话 +session.tab.untitled=无标题会话 -session.permission.title=\u6743\u9650\u8bf7\u6c42 -session.permission.meta=\u5de5\u5177\uff1a{0} \u2022 \u6a21\u5f0f\uff1a{1} -session.permission.allow=\u5141\u8bb8 -session.permission.deny=\u62d2\u7edd -session.question.dismiss=\u5173\u95ed +session.permission.title=权限请求 +session.permission.meta=工具:{0} • 模式:{1} +session.permission.allow=允许 +session.permission.deny=拒绝 +session.question.dismiss=关闭 -session.status.considering=\u6b63\u5728\u8003\u8651\u4e0b\u4e00\u6b65\u2026 -session.status.thinking=\u601d\u8003\u4e2d\u2026 -session.status.writing=\u6b63\u5728\u7f16\u5199\u56de\u590d\u2026 -session.status.delegating=\u6b63\u5728\u59d4\u6d3e\u5de5\u4f5c\u2026 -session.status.planning=\u89c4\u5212\u4e2d\u2026 -session.status.gathering=\u6536\u96c6\u4e0a\u4e0b\u6587\u2026 -session.status.searching.codebase=\u641c\u7d22\u4ee3\u7801\u5e93\u2026 -session.status.searching.web=\u641c\u7d22\u7f51\u9875\u2026 -session.status.editing=\u6b63\u5728\u7f16\u8f91\u2026 -session.status.commands=\u8fd0\u884c\u547d\u4ee4\u2026 +session.status.considering=正在考虑下一步… +session.status.thinking=思考中… +session.status.writing=正在编写回复… +session.status.delegating=正在委派工作… +session.status.planning=规划中… +session.status.gathering=收集上下文… +session.status.searching.codebase=搜索代码库… +session.status.searching.web=搜索网页… +session.status.editing=正在编辑… +session.status.commands=运行命令… -session.part.reasoning=\u63a8\u7406 -session.part.compaction=\u4e0a\u4e0b\u6587\u5df2\u538b\u7f29 -session.part.tool.copy=\u590d\u5236 -session.part.tool.error=\u9519\u8bef -session.part.tool.pending=\u5f85\u5904\u7406 -session.part.tool.read=\u8bfb\u53d6 -session.part.tool.running=\u8fd0\u884c\u4e2d +session.part.reasoning=推理 +session.part.compaction=上下文已压缩 +session.part.tool.copy=复制 +session.part.tool.error=错误 +session.part.tool.pending=待处理 +session.part.tool.read=读取 +session.part.tool.running=运行中 session.part.tool.shell=Shell -session.part.tool.truncated=\u9884\u89c8\u4e2d\u7684\u8f93\u51fa\u5df2\u622a\u65ad\u3002\u5b8c\u6574\u8f93\u51fa\u4ecd\u4fdd\u7559\u5728\u4f1a\u8bdd\u6570\u636e\u4e2d\u3002 +session.part.tool.truncated=预览中的输出已截断。完整输出仍保留在会话数据中。 -session.error.prompt=\u63d0\u793a\u5931\u8d25 -session.error.compact=\u4f1a\u8bdd\u538b\u7f29\u5931\u8d25 -session.error.unknown=\u672a\u77e5\u9519\u8bef +session.error.prompt=提示失败 +session.error.compact=会话压缩失败 +session.error.unknown=未知错误 -session.header.tokens=\u4ee4\u724c -session.header.tokens.description=\u6700\u8fd1\u4e00\u6b21\u52a9\u624b\u56de\u590d\u4e2d\u4f7f\u7528\u7684\u4ee4\u724c\uff1a\u8f93\u5165\u3001\u8f93\u51fa\u3001\u7f13\u5b58\u5199\u5165\u548c\u7f13\u5b58\u8bfb\u53d6\u3002 -session.header.input=\u8f93\u5165 {0} -session.header.output=\u8f93\u51fa {0} -session.header.cache.write=\u7f13\u5b58\u5199\u5165 {0} -session.header.cache.read=\u7f13\u5b58\u8bfb\u53d6 {0} -session.header.compact=\u538b\u7f29\u4f1a\u8bdd -session.header.compact.description=\u6c47\u603b\u4f1a\u8bdd\u4ee5\u51cf\u5c11\u4e0a\u4e0b\u6587\u5927\u5c0f -session.header.expand=\u663e\u793a\u4f1a\u8bdd\u6307\u6807 -session.header.collapse=\u9690\u85cf\u4f1a\u8bdd\u6307\u6807 -session.header.todos.progress={0}/{1} \u4e2a\u4efb\u52a1\u5df2\u5b8c\u6210 -session.header.todos.done=\u5168\u90e8 {0} \u4e2a\u4efb\u52a1\u5df2\u5b8c\u6210 -session.header.context.tooltip.percent={0} \u4ee4\u724c\uff08\u4e0a\u4e0b\u6587\u7684 {1}%\uff09 -session.header.context.tooltip.tokens={0} \u4ee4\u724c -session.header.context.used=\u5df2\u4f7f\u7528 {0} / {1} \u4ee4\u724c -session.header.context.reserved={0} \u4e3a\u8f93\u51fa\u9884\u7559 -session.header.context.available={0} \u53ef\u7528 +session.header.tokens=令牌 +session.header.tokens.description=最近一次助手回复中使用的令牌:输入、输出、缓存写入和缓存读取。 +session.header.input=输入 {0} +session.header.output=输出 {0} +session.header.cache.write=缓存写入 {0} +session.header.cache.read=缓存读取 {0} +session.header.compact=压缩会话 +session.header.compact.description=汇总会话以减少上下文大小 +session.header.expand=显示会话指标 +session.header.collapse=隐藏会话指标 +session.header.todos.progress={0}/{1} 个任务已完成 +session.header.todos.done=全部 {0} 个任务已完成 +session.header.context.tooltip.percent={0} 令牌(上下文的 {1}%) +session.header.context.tooltip.tokens={0} 令牌 +session.header.context.used=已使用 {0} / {1} 令牌 +session.header.context.reserved={0} 为输出预留 +session.header.context.available={0} 可用 -prompt.placeholder=\u8f93\u5165\u6d88\u606f\u2026 -prompt.placeholder.with.shortcuts=\u8f93\u5165\u6d88\u606f\u2026\uff08{0} \u53d1\u9001\uff0c{1} \u6362\u884c\uff09 -prompt.placeholder.with.send=\u8f93\u5165\u6d88\u606f\u2026\uff08{0} \u53d1\u9001\uff09 -prompt.placeholder.with.newline=\u8f93\u5165\u6d88\u606f\u2026\uff08{0} \u6362\u884c\uff09 -prompt.button.send=\u53d1\u9001 -prompt.button.stop=\u505c\u6b62 -prompt.button.send.tooltip.stop=\u6309 {0} \u505c\u6b62 -mode.picker.tooltip=\u9009\u62e9\u6a21\u5f0f -mode.picker.deprecated=\u5df2\u5f03\u7528 -model.picker.tooltip=\u9009\u62e9\u6a21\u578b -model.picker.recommended=\u63a8\u8350 -model.picker.favorites=\u6536\u85cf\u5939 -model.picker.search=\u641c\u7d22\u6a21\u578b -model.picker.no.matches=\u65e0\u5339\u914d\u6a21\u578b -model.picker.favorite.add=\u6dfb\u52a0\u5230\u6536\u85cf\u5939 -model.picker.favorite.remove=\u4ece\u6536\u85cf\u5939\u79fb\u9664 -model.picker.free=\u514d\u8d39 -model.picker.reset=\u91cd\u7f6e\u6a21\u578b\u4e3a\u9ed8\u8ba4 -reasoning.picker.tooltip=\u9009\u62e9\u63a8\u7406\u529b\u5ea6 +prompt.placeholder=输入消息… +prompt.placeholder.with.shortcuts=输入消息…({0} 发送,{1} 换行) +prompt.placeholder.with.send=输入消息…({0} 发送) +prompt.placeholder.with.newline=输入消息…({0} 换行) +prompt.button.send=发送 +prompt.button.stop=停止 +prompt.button.send.tooltip.stop=按 {0} 停止 +mode.picker.tooltip=选择模式 +mode.picker.deprecated=已弃用 +model.picker.tooltip=选择模型 +model.picker.recommended=推荐 +model.picker.favorites=收藏夹 +model.picker.search=搜索模型 +model.picker.no.matches=无匹配模型 +model.picker.favorite.add=添加到收藏夹 +model.picker.favorite.remove=从收藏夹移除 +model.picker.free=免费 +model.picker.reset=重置模型为默认 +reasoning.picker.tooltip=选择推理力度 -history.tab.local=\u672c\u5730 -history.tab.cloud=\u4e91\u7aef -history.back=\u8fd4\u56de -history.search.placeholder=\u641c\u7d22\u4f1a\u8bdd -history.empty=\u6682\u65e0\u4f1a\u8bdd -history.loading=\u52a0\u8f7d\u4e2d\u2026 -history.untitled=\u65e0\u6807\u9898 -history.delete.text=\u5220\u9664 -history.delete.confirm.title=\u5220\u9664\u4f1a\u8bdd\uff1f -history.delete.confirm.message=\u4ece\u672c\u5730\u5386\u53f2\u4e2d\u5220\u9664\u201c{0}\u201d\uff1f -history.delete.confirm.message.multiple=\u4ece\u672c\u5730\u5386\u53f2\u4e2d\u5220\u9664 {0} \u4e2a\u4f1a\u8bdd\uff1f -history.rename.title=\u91cd\u547d\u540d\u4f1a\u8bdd -history.rename.prompt=\u65b0\u4f1a\u8bdd\u540d\u79f0\uff1a -history.cloud.load.more=\u52a0\u8f7d\u66f4\u591a -history.cloud.repo.only=\u4ec5\u6b64\u4ed3\u5e93 -history.group.today=\u4eca\u5929 -history.group.yesterday=\u6628\u5929 -history.group.week=\u672c\u5468 -history.group.month=\u672c\u6708 -history.group.older=\u66f4\u65e9\u4ee5\u524d -history.time.moments=\u521a\u521a -history.time.minutes={0} \u5206\u949f\u524d -history.time.hours={0} \u5c0f\u65f6\u524d -history.time.days={0} \u5929\u524d -history.time.months={0} \u4e2a\u6708\u524d -history.time.years={0} \u5e74\u524d -history.error.local=\u65e0\u6cd5\u52a0\u8f7d\u672c\u5730\u5386\u53f2 -history.error.cloud=\u65e0\u6cd5\u52a0\u8f7d\u4e91\u7aef\u5386\u53f2 -history.error.local.delete=\u5220\u9664\u4f1a\u8bdd\u5931\u8d25 -history.error.local.rename=\u91cd\u547d\u540d\u4f1a\u8bdd\u5931\u8d25 -history.error.cloud.delete=\u4e91\u7aef\u4f1a\u8bdd\u6682\u65e0\u6cd5\u5220\u9664 +history.tab.local=本地 +history.tab.cloud=云端 +history.back=返回 +history.search.placeholder=搜索会话 +history.empty=暂无会话 +history.loading=加载中… +history.untitled=无标题 +history.delete.text=删除 +history.delete.confirm.title=删除会话? +history.delete.confirm.message=从本地历史中删除“{0}”? +history.delete.confirm.message.multiple=从本地历史中删除 {0} 个会话? +history.rename.title=重命名会话 +history.rename.prompt=新会话名称: +history.cloud.load.more=加载更多 +history.cloud.repo.only=仅此仓库 +history.group.today=今天 +history.group.yesterday=昨天 +history.group.week=本周 +history.group.month=本月 +history.group.older=更早以前 +history.time.moments=刚刚 +history.time.minutes={0} 分钟前 +history.time.hours={0} 小时前 +history.time.days={0} 天前 +history.time.months={0} 个月前 +history.time.years={0} 年前 +history.error.local=无法加载本地历史 +history.error.cloud=无法加载云端历史 +history.error.local.delete=删除会话失败 +history.error.local.rename=重命名会话失败 +history.error.cloud.delete=云端会话暂无法删除 -action.Kilo.Settings.text=\u8bbe\u7f6e -action.Kilo.Settings.description=Kilo Code \u8bbe\u7f6e -action.Kilo.NewSession.text=\u65b0\u5efa\u4f1a\u8bdd -action.Kilo.NewSession.description=\u5f00\u59cb\u65b0\u7684 Kilo \u4f1a\u8bdd -action.Kilo.History.text=\u5386\u53f2 -action.Kilo.History.description=\u663e\u793a\u4f1a\u8bdd\u5386\u53f2 -action.Kilo.SendPrompt.text=\u53d1\u9001\u63d0\u793a -action.Kilo.SendPrompt.description=\u53d1\u9001\u5f53\u524d Kilo \u63d0\u793a -action.Kilo.StopSession.text=\u505c\u6b62\u4f1a\u8bdd -action.Kilo.StopSession.description=\u505c\u6b62\u5f53\u524d Kilo \u4f1a\u8bdd -action.Kilo.SettingsGroup.text=\u8bbe\u7f6e -action.Kilo.SettingsGroup.description=Kilo Code \u8bbe\u7f6e -action.Kilo.Restart.text=\u91cd\u542f Kilo -action.Kilo.Restart.description=\u7ec8\u6b62\u5e76\u91cd\u542f CLI \u8fdb\u7a0b -action.Kilo.Reinstall.text=\u91cd\u65b0\u5b89\u88c5 Kilo -action.Kilo.Reinstall.description=\u91cd\u65b0\u89e3\u538b CLI \u4e8c\u8fdb\u5236\u6587\u4ef6\u5e76\u91cd\u542f -action.Kilo.Session.Open.text=\u6253\u5f00 -action.Kilo.Session.Open.description=\u6253\u5f00\u6240\u9009\u4f1a\u8bdd -action.Kilo.Session.Rename.text=\u91cd\u547d\u540d -action.Kilo.Session.Rename.description=\u91cd\u547d\u540d\u6240\u9009\u4f1a\u8bdd -action.Kilo.Session.Delete.text=\u5220\u9664 -action.Kilo.Session.Delete.description=\u5220\u9664\u6240\u9009\u4f1a\u8bdd -action.Kilo.History.ContextMenu.text=\u5386\u53f2\u64cd\u4f5c +action.Kilo.Settings.text=设置 +action.Kilo.Settings.description=Kilo Code 设置 +action.Kilo.NewSession.text=新建会话 +action.Kilo.NewSession.description=开始新的 Kilo 会话 +action.Kilo.History.text=历史 +action.Kilo.History.description=显示会话历史 +action.Kilo.SendPrompt.text=发送提示 +action.Kilo.SendPrompt.description=发送当前 Kilo 提示 +action.Kilo.StopSession.text=停止会话 +action.Kilo.StopSession.description=停止当前 Kilo 会话 +action.Kilo.SettingsGroup.text=设置 +action.Kilo.SettingsGroup.description=Kilo Code 设置 +action.Kilo.Restart.text=重启 Kilo +action.Kilo.Restart.description=终止并重启 CLI 进程 +action.Kilo.Reinstall.text=重新安装 Kilo +action.Kilo.Reinstall.description=重新解压 CLI 二进制文件并重启 +action.Kilo.Session.Open.text=打开 +action.Kilo.Session.Open.description=打开所选会话 +action.Kilo.Session.Rename.text=重命名 +action.Kilo.Session.Rename.description=重命名所选会话 +action.Kilo.Session.Delete.text=删除 +action.Kilo.Session.Delete.description=删除所选会话 +action.Kilo.History.ContextMenu.text=历史操作 diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_TW.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_TW.properties index 3344f6431ce..40fb78179b3 100644 --- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_TW.properties +++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle_zh_TW.properties @@ -1,139 +1,139 @@ -session.connection.connecting=\u8f09\u5165\u4e2d\u2026 -session.connection.error.app=\u9023\u7dda\u5931\u6557 -session.connection.error.workspace=\u5de5\u4f5c\u5340\u8f09\u5165\u5931\u6557 -session.connection.error.unknown=\u672a\u77e5\u9810\u8a2d -session.connection.retry=\u91cd\u8a66 -session.connection.warning.config=\u8a2d\u5b9a\u8b66\u544a +session.connection.connecting=載入中… +session.connection.error.app=連線失敗 +session.connection.error.workspace=工作區載入失敗 +session.connection.error.unknown=未知預設 +session.connection.retry=重試 +session.connection.warning.config=設定警告 -session.empty.welcome=Kilo Code \u662f AI \u7a0b\u5f0f\u8f14\u52a9\u3002\u53ef\u8acb\u5b83\u5efa\u7f6e\u529f\u80fd\u3001\u4fee\u5fa9\u932f\u8aa4\u6216\u89e3\u91cb\u60a8\u7684\u7a0b\u5f0f\u7a0b\u5f0f\u5eab\u3002 -session.empty.loading=\u8f09\u5165\u4e2d\u2026 -session.empty.recent=\u6700\u8fd1 -session.showHistory=\u986f\u793a\u6b77\u53f2 -session.scroll.bottom=\u6efe\u52d5\u5230\u5e95\u90e8 -session.tab.new=\u65b0\u5efa\u5de5\u4f5c\u968e\u6bb5 -session.tab.untitled=\u672a\u547d\u540d\u7684\u5de5\u4f5c\u968e\u6bb5 +session.empty.welcome=Kilo Code 是 AI 程式輔助。可請它建置功能、修復錯誤或解釋您的程式程式庫。 +session.empty.loading=載入中… +session.empty.recent=最近 +session.showHistory=顯示歷史 +session.scroll.bottom=滾動到底部 +session.tab.new=新建工作階段 +session.tab.untitled=未命名的工作階段 -session.permission.title=\u6b0a\u9650\u8acb\u6c42 -session.permission.meta=\u5de5\u5177\uff1a{0} \u2022 \u6a23\u5f0f\uff1a{1} -session.permission.allow=\u5141\u8a31 -session.permission.deny=\u62d2\u7d55 -session.question.dismiss=\u95dc\u9589 +session.permission.title=權限請求 +session.permission.meta=工具:{0} • 樣式:{1} +session.permission.allow=允許 +session.permission.deny=拒絕 +session.question.dismiss=關閉 -session.status.considering=\u8003\u616e\u4e0b\u4e00\u6b65\u2026 -session.status.thinking=\u601d\u8003\u4e2d\u2026 -session.status.writing=\u6b63\u5728\u64b0\u5beb\u56de\u8986\u2026 -session.status.delegating=\u6b63\u5728\u59d4\u6d3e\u5de5\u4f5c\u2026 -session.status.planning=\u8a08\u5283\u4e2d\u2026 -session.status.gathering=\u6536\u96c6\u4e0a\u4e0b\u6587\u2026 -session.status.searching.codebase=\u641c\u5c0b\u7a0b\u5f0f\u7a0b\u5f0f\u5eab\u2026 -session.status.searching.web=\u641c\u5c0b\u7db2\u9801\u2026 -session.status.editing=\u9032\u884c\u7de8\u8f2f\u2026 -session.status.commands=\u57f7\u884c\u6307\u4ee4\u2026 +session.status.considering=考慮下一步… +session.status.thinking=思考中… +session.status.writing=正在撰寫回覆… +session.status.delegating=正在委派工作… +session.status.planning=計劃中… +session.status.gathering=收集上下文… +session.status.searching.codebase=搜尋程式程式庫… +session.status.searching.web=搜尋網頁… +session.status.editing=進行編輯… +session.status.commands=執行指令… -session.part.reasoning=\u63a8\u7406 -session.part.compaction=\u4e0a\u4e0b\u6587\u5df2\u58d3\u7e2e -session.part.tool.copy=\u8907\u88fd -session.part.tool.error=\u932f\u8aa4 -session.part.tool.pending=\u5f85\u8655\u7406 -session.part.tool.read=\u8b80\u53d6 -session.part.tool.running=\u57f7\u884c\u4e2d +session.part.reasoning=推理 +session.part.compaction=上下文已壓縮 +session.part.tool.copy=複製 +session.part.tool.error=錯誤 +session.part.tool.pending=待處理 +session.part.tool.read=讀取 +session.part.tool.running=執行中 session.part.tool.shell=Shell -session.part.tool.truncated=\u9810\u89bd\u4e2d\u7684\u8f38\u51fa\u5df2\u622a\u65b7\u3002\u5b8c\u6574\u8f38\u51fa\u4ecd\u4fdd\u7559\u5728\u5de5\u4f5c\u968e\u6bb5\u8cc7\u6599\u4e2d\u3002 +session.part.tool.truncated=預覽中的輸出已截斷。完整輸出仍保留在工作階段資料中。 -session.error.prompt=\u63d0\u793a\u5931\u6557 -session.error.compact=\u5de5\u4f5c\u968e\u6bb5\u58d3\u7e2e\u5931\u6557 -session.error.unknown=\u672a\u77e5\u932f\u8aa4 +session.error.prompt=提示失敗 +session.error.compact=工作階段壓縮失敗 +session.error.unknown=未知錯誤 -session.header.tokens=\u8a18\u865f -session.header.tokens.description=\u6700\u65b0\u52a9\u624b\u56de\u8986\u4f7f\u7528\u7684\u8a18\u865f\uff1a\u8f38\u5165\u3001\u8f38\u51fa\u3001\u5feb\u53d6\u5beb\u5165\u548c\u5feb\u53d6\u8b80\u53d6\u3002 -session.header.input=\u8f38\u5165 {0} -session.header.output=\u8f38\u51fa {0} -session.header.cache.write=\u5feb\u53d6\u5beb\u5165 {0} -session.header.cache.read=\u5feb\u53d6\u8b80\u53d6 {0} -session.header.compact=\u58d3\u7e2e\u5de5\u4f5c\u968e\u6bb5 -session.header.compact.description=\u6458\u8981\u5de5\u4f5c\u968e\u6bb5\u4ee5\u6e1b\u5c11\u4e0a\u4e0b\u6587\u5927\u5c0f -session.header.expand=\u986f\u793a\u5de5\u4f5c\u968e\u6bb5\u5ea6\u91cf -session.header.collapse=\u96b1\u85cf\u5de5\u4f5c\u968e\u6bb5\u5ea6\u91cf -session.header.todos.progress={0}/{1} \u500b\u5f85\u8fa6\u4e8b\u9805\u5df2\u5b8c\u6210 -session.header.todos.done=\u5168\u90e8 {0} \u500b\u5f85\u8fa6\u4e8b\u9805\u5df2\u5b8c\u6210 -session.header.context.tooltip.percent={0} \u8a18\u865f\uff08\u4e0a\u4e0b\u6587\u7684 {1}%\uff09 -session.header.context.tooltip.tokens={0} \u8a18\u865f -session.header.context.used=\u5df2\u4f7f\u7528 {0} / {1} \u8a18\u865f -session.header.context.reserved={0} \u70ba\u8f38\u51fa\u9810\u7559 -session.header.context.available={0} \u53ef\u7528 +session.header.tokens=記號 +session.header.tokens.description=最新助手回覆使用的記號:輸入、輸出、快取寫入和快取讀取。 +session.header.input=輸入 {0} +session.header.output=輸出 {0} +session.header.cache.write=快取寫入 {0} +session.header.cache.read=快取讀取 {0} +session.header.compact=壓縮工作階段 +session.header.compact.description=摘要工作階段以減少上下文大小 +session.header.expand=顯示工作階段度量 +session.header.collapse=隱藏工作階段度量 +session.header.todos.progress={0}/{1} 個待辦事項已完成 +session.header.todos.done=全部 {0} 個待辦事項已完成 +session.header.context.tooltip.percent={0} 記號(上下文的 {1}%) +session.header.context.tooltip.tokens={0} 記號 +session.header.context.used=已使用 {0} / {1} 記號 +session.header.context.reserved={0} 為輸出預留 +session.header.context.available={0} 可用 -prompt.placeholder=\u8f38\u5165\u8a0a\u606f\u2026 -prompt.placeholder.with.shortcuts=\u8f38\u5165\u8a0a\u606f\u2026\uff08{0} \u767c\u9001\uff0c{1} \u63db\u884c\uff09 -prompt.placeholder.with.send=\u8f38\u5165\u8a0a\u606f\u2026\uff08{0} \u767c\u9001\uff09 -prompt.placeholder.with.newline=\u8f38\u5165\u8a0a\u606f\u2026\uff08{0} \u63db\u884c\uff09 -prompt.button.send=\u767c\u9001 -prompt.button.stop=\u505c\u6b62 -prompt.button.send.tooltip.stop=\u6309 {0} \u505c\u6b62 -mode.picker.tooltip=\u9078\u64c7\u6a21\u5f0f -mode.picker.deprecated=\u5df2\u68c4\u7528 -model.picker.tooltip=\u9078\u64c7\u6a21\u578b -model.picker.recommended=\u63a8\u85a6 -model.picker.favorites=\u6536\u85cf\u593e -model.picker.search=\u641c\u5c0b\u6a21\u578b -model.picker.no.matches=\u7121\u5339\u914d\u6a21\u578b -model.picker.favorite.add=\u65b0\u589e\u81f3\u6536\u85cf\u593e -model.picker.favorite.remove=\u5f9e\u6536\u85cf\u593e\u79fb\u9664 -model.picker.free=\u514d\u8cbb -model.picker.reset=\u91cd\u8a2d\u6a21\u578b\u70ba\u9810\u8a2d -reasoning.picker.tooltip=\u9078\u64c7\u63a8\u7406\u529b\u5ea6 +prompt.placeholder=輸入訊息… +prompt.placeholder.with.shortcuts=輸入訊息…({0} 發送,{1} 換行) +prompt.placeholder.with.send=輸入訊息…({0} 發送) +prompt.placeholder.with.newline=輸入訊息…({0} 換行) +prompt.button.send=發送 +prompt.button.stop=停止 +prompt.button.send.tooltip.stop=按 {0} 停止 +mode.picker.tooltip=選擇模式 +mode.picker.deprecated=已棄用 +model.picker.tooltip=選擇模型 +model.picker.recommended=推薦 +model.picker.favorites=收藏夾 +model.picker.search=搜尋模型 +model.picker.no.matches=無匹配模型 +model.picker.favorite.add=新增至收藏夾 +model.picker.favorite.remove=從收藏夾移除 +model.picker.free=免費 +model.picker.reset=重設模型為預設 +reasoning.picker.tooltip=選擇推理力度 -history.tab.local=\u672c\u6a5f -history.tab.cloud=\u96f2\u7aef -history.back=\u8fd4\u56de -history.search.placeholder=\u641c\u5c0b\u5de5\u4f5c\u968e\u6bb5 -history.empty=\u7121\u5de5\u4f5c\u968e\u6bb5 -history.loading=\u8f09\u5165\u4e2d\u2026 -history.untitled=\u672a\u547d\u540d -history.delete.text=\u522a\u9664 -history.delete.confirm.title=\u522a\u9664\u5de5\u4f5c\u968e\u6bb5\uff1f -history.delete.confirm.message=\u5f9e\u672c\u6a5f\u6b77\u53f2\u4e2d\u522a\u9664\u300c{0}\u300d\uff1f -history.delete.confirm.message.multiple=\u5f9e\u672c\u6a5f\u6b77\u53f2\u4e2d\u522a\u9664 {0} \u500b\u5de5\u4f5c\u968e\u6bb5\uff1f -history.rename.title=\u91cd\u547d\u540d\u5de5\u4f5c\u968e\u6bb5 -history.rename.prompt=\u65b0\u5de5\u4f5c\u968e\u6bb5\u540d\u7a31\uff1a -history.cloud.load.more=\u8f09\u5165\u66f4\u591a -history.cloud.repo.only=\u50c5\u6b64\u5132\u5b58\u5eab -history.group.today=\u4eca\u5929 -history.group.yesterday=\u6628\u5929 -history.group.week=\u672c\u9031 -history.group.month=\u672c\u6708 -history.group.older=\u66f4\u65e9\u4ee5\u524d -history.time.moments=\u525b\u525b -history.time.minutes={0} \u5206\u9418\u524d -history.time.hours={0} \u5c0f\u6642\u524d -history.time.days={0} \u5929\u524d -history.time.months={0} \u500b\u6708\u524d -history.time.years={0} \u5e74\u524d -history.error.local=\u7121\u6cd5\u8f09\u5165\u672c\u6a5f\u6b77\u53f2 -history.error.cloud=\u7121\u6cd5\u8f09\u5165\u96f2\u7aef\u6b77\u53f2 -history.error.local.delete=\u522a\u9664\u5de5\u4f5c\u968e\u6bb5\u5931\u6557 -history.error.local.rename=\u91cd\u547d\u540d\u5de5\u4f5c\u968e\u6bb5\u5931\u6557 -history.error.cloud.delete=\u96f2\u7aef\u5de5\u4f5c\u968e\u6bb5\u66ab\u6642\u7121\u6cd5\u522a\u9664 +history.tab.local=本機 +history.tab.cloud=雲端 +history.back=返回 +history.search.placeholder=搜尋工作階段 +history.empty=無工作階段 +history.loading=載入中… +history.untitled=未命名 +history.delete.text=刪除 +history.delete.confirm.title=刪除工作階段? +history.delete.confirm.message=從本機歷史中刪除「{0}」? +history.delete.confirm.message.multiple=從本機歷史中刪除 {0} 個工作階段? +history.rename.title=重命名工作階段 +history.rename.prompt=新工作階段名稱: +history.cloud.load.more=載入更多 +history.cloud.repo.only=僅此儲存庫 +history.group.today=今天 +history.group.yesterday=昨天 +history.group.week=本週 +history.group.month=本月 +history.group.older=更早以前 +history.time.moments=剛剛 +history.time.minutes={0} 分鐘前 +history.time.hours={0} 小時前 +history.time.days={0} 天前 +history.time.months={0} 個月前 +history.time.years={0} 年前 +history.error.local=無法載入本機歷史 +history.error.cloud=無法載入雲端歷史 +history.error.local.delete=刪除工作階段失敗 +history.error.local.rename=重命名工作階段失敗 +history.error.cloud.delete=雲端工作階段暫時無法刪除 -action.Kilo.Settings.text=\u8a2d\u5b9a -action.Kilo.Settings.description=Kilo Code \u8a2d\u5b9a -action.Kilo.NewSession.text=\u65b0\u5efa\u5de5\u4f5c\u968e\u6bb5 -action.Kilo.NewSession.description=\u958b\u59cb\u65b0\u7684 Kilo \u5de5\u4f5c\u968e\u6bb5 -action.Kilo.History.text=\u6b77\u53f2 -action.Kilo.History.description=\u986f\u793a\u5de5\u4f5c\u968e\u6bb5\u6b77\u53f2 -action.Kilo.SendPrompt.text=\u767c\u9001\u63d0\u793a -action.Kilo.SendPrompt.description=\u767c\u9001\u76ee\u524d\u7684 Kilo \u63d0\u793a -action.Kilo.StopSession.text=\u505c\u6b62\u5de5\u4f5c\u968e\u6bb5 -action.Kilo.StopSession.description=\u505c\u6b62\u76ee\u524d\u7684 Kilo \u5de5\u4f5c\u968e\u6bb5 -action.Kilo.SettingsGroup.text=\u8a2d\u5b9a -action.Kilo.SettingsGroup.description=Kilo Code \u8a2d\u5b9a -action.Kilo.Restart.text=\u91cd\u555f Kilo -action.Kilo.Restart.description=\u7d42\u6b62\u4e26\u91cd\u555f CLI \u7a0b\u5e8f -action.Kilo.Reinstall.text=\u91cd\u65b0\u5b89\u88dd Kilo -action.Kilo.Reinstall.description=\u91cd\u65b0\u89e3\u58d3\u7e2e CLI \u4e8c\u9032\u4f4d\u6a94\u6848\u4e26\u91cd\u555f -action.Kilo.Session.Open.text=\u958b\u555f -action.Kilo.Session.Open.description=\u958b\u555f\u6240\u9078\u5de5\u4f5c\u968e\u6bb5 -action.Kilo.Session.Rename.text=\u91cd\u547d\u540d -action.Kilo.Session.Rename.description=\u91cd\u547d\u540d\u6240\u9078\u5de5\u4f5c\u968e\u6bb5 -action.Kilo.Session.Delete.text=\u522a\u9664 -action.Kilo.Session.Delete.description=\u522a\u9664\u6240\u9078\u5de5\u4f5c\u968e\u6bb5 -action.Kilo.History.ContextMenu.text=\u6b77\u53f2\u64cd\u4f5c +action.Kilo.Settings.text=設定 +action.Kilo.Settings.description=Kilo Code 設定 +action.Kilo.NewSession.text=新建工作階段 +action.Kilo.NewSession.description=開始新的 Kilo 工作階段 +action.Kilo.History.text=歷史 +action.Kilo.History.description=顯示工作階段歷史 +action.Kilo.SendPrompt.text=發送提示 +action.Kilo.SendPrompt.description=發送目前的 Kilo 提示 +action.Kilo.StopSession.text=停止工作階段 +action.Kilo.StopSession.description=停止目前的 Kilo 工作階段 +action.Kilo.SettingsGroup.text=設定 +action.Kilo.SettingsGroup.description=Kilo Code 設定 +action.Kilo.Restart.text=重啟 Kilo +action.Kilo.Restart.description=終止並重啟 CLI 程序 +action.Kilo.Reinstall.text=重新安裝 Kilo +action.Kilo.Reinstall.description=重新解壓縮 CLI 二進位檔案並重啟 +action.Kilo.Session.Open.text=開啟 +action.Kilo.Session.Open.description=開啟所選工作階段 +action.Kilo.Session.Rename.text=重命名 +action.Kilo.Session.Rename.description=重命名所選工作階段 +action.Kilo.Session.Delete.text=刪除 +action.Kilo.Session.Delete.description=刪除所選工作階段 +action.Kilo.History.ContextMenu.text=歷史操作