From 1ef5ca99467c64ad0b66df21f56e84aec1b872b0 Mon Sep 17 00:00:00 2001 From: mukhayyar Date: Tue, 24 Mar 2026 19:24:44 +0000 Subject: [PATCH 1/3] feat: add Indonesian (id) language support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add full Bahasa Indonesia translation with 100% key coverage: - ductor_bot/i18n/id/chat.toml (271 keys — Telegram/Matrix messages) - ductor_bot/i18n/id/cli.toml (218 keys — terminal/Rich strings) - ductor_bot/i18n/id/wizard.toml (42 keys — onboarding wizard) - ductor_bot/i18n/id/commands.toml (21 keys — bot command descriptions) - Register "id": "Bahasa Indonesia" in LANGUAGES dict Co-Authored-By: Claude Sonnet 4.6 --- ductor_bot/i18n/__init__.py | 1 + ductor_bot/i18n/id/chat.toml | 446 +++++++++++++++++++++++++++++++ ductor_bot/i18n/id/cli.toml | 286 ++++++++++++++++++++ ductor_bot/i18n/id/commands.toml | 26 ++ ductor_bot/i18n/id/wizard.toml | 182 +++++++++++++ 5 files changed, 941 insertions(+) create mode 100644 ductor_bot/i18n/id/chat.toml create mode 100644 ductor_bot/i18n/id/cli.toml create mode 100644 ductor_bot/i18n/id/commands.toml create mode 100644 ductor_bot/i18n/id/wizard.toml diff --git a/ductor_bot/i18n/__init__.py b/ductor_bot/i18n/__init__.py index a657201..7b9a445 100644 --- a/ductor_bot/i18n/__init__.py +++ b/ductor_bot/i18n/__init__.py @@ -28,6 +28,7 @@ "nl": "Nederlands", "es": "Español", "fr": "Français", + "id": "Bahasa Indonesia", "pt": "Português", "ru": "Русский", } diff --git a/ductor_bot/i18n/id/chat.toml b/ductor_bot/i18n/id/chat.toml new file mode 100644 index 0000000..17824aa --- /dev/null +++ b/ductor_bot/i18n/id/chat.toml @@ -0,0 +1,446 @@ +# Indonesian chat strings (Markdown-formatted, sent to Telegram/Matrix/API). + +# -- Session management ------------------------------------------------------- + +[session] +error_header = "**Error Sesi**" +error_body = """\ +[{model}] Terjadi kesalahan. +Sesi Anda telah disimpan -- kirim pesan lain untuk mencoba lagi. +Gunakan /new untuk memulai sesi baru jika masalah berlanjut.""" +error_cause = "**Penyebab:** {hint}" +error_detail = "**Detail:** `{detail}`" +error_auth = "Autentikasi gagal. Silakan autentikasi ulang CLI (misalnya `codex auth` atau periksa API key Anda)." +error_rate = "Batas permintaan tercapai. Tunggu sebentar dan coba lagi." +error_context = "Panjang konteks terlampaui. Gunakan /new untuk memulai sesi baru." + +reset_header = "**Sesi Direset**" +reset_body = """\ +Sesi direset untuk {provider} di obrolan ini saja. +Sesi provider lain tetap disimpan. +Kirim pesan untuk melanjutkan.""" + +age_warning = "[Sesi telah berjalan selama {age}. Gunakan /new untuk memulai ulang.]" + +recovered = "_Sesi sebelumnya tidak dapat dipulihkan. Sesi baru dimulai secara otomatis._" +sigkill = "Eksekusi terganggu. Silakan kirim permintaan yang sama lagi." + +not_found = "Sesi '{name}' tidak ditemukan." +ended = "Sesi '{name}' telah berakhir. Mulai yang baru dengan /session." +still_running = "Sesi '{name}' masih diproses. Tunggu atau gunakan /stop untuk membatalkan." + +# -- Stop/interrupt ------------------------------------------------------------ + +[stop] +header = "**Agen Dihentikan**" +killed = "{provider} dihentikan. Semua pesan dalam antrean dibuang." +nothing = "Tidak ada yang sedang berjalan." + +[interrupt] +done = "Menghentikan {count} proses." +nothing = "Tidak ada proses aktif." + +[abort_all] +done = "Menghentikan {count} proses di semua agen." +nothing = "Tidak ada proses aktif yang ditemukan di agen mana pun." + +# -- Timeout ------------------------------------------------------------------- + +[timeout] +error_header = "**Waktu Habis**" +error_body = """\ +[{model}] CLI dihentikan setelah {minutes} menit. +Sesi Anda telah disimpan -- kirim pesan lain untuk melanjutkan dari terakhir kali. +Gunakan /new untuk memulai sesi baru.""" + +result_header = "**Waktu Habis**" +result_body = """\ +Agen kehabisan waktu setelah {elapsed} detik (batas: {configured} detik). +Coba prompt yang lebih pendek, atau tanyakan dalam langkah-langkah kecil.""" + +warning_minutes = "Waktu habis dalam {mins} menit" +warning_seconds = "Waktu habis dalam {secs} detik" +extended = "Waktu diperpanjang (+{secs} detik, sisa {remaining})" + +generic = "Agen kehabisan waktu. Silakan coba lagi." + +# -- Startup / lifecycle ------------------------------------------------------- + +[startup] +first_start_header = "**Bot Dimulai**" +first_start_body = "Pertama kali dimulai — siap digunakan." +reboot_header = "**Bot Dimulai**" +reboot_body = "Reboot sistem terdeteksi — kembali online." + +restart_default = "Restart selesai." +restart_header = "**Memulai Ulang**" +restart_body = "Bot sedang dimatikan dan akan segera kembali." + +upgrade_complete = "**Pembaruan selesai** `{old}` -> `{new}`" + +matrix_restart = "**Bot dimulai ulang** ({reason})" +matrix_update = "**Pembaruan tersedia:** `{version}`\nGunakan `/upgrade` untuk memperbarui." +matrix_upgraded_restarting = "Diperbarui {old} → {new}. Memulai ulang..." + +[recovery] +named_header = "**Pemulihan Otomatis**" +named_body = "Melanjutkan sesi latar **{session}**\n`{preview}`" +interrupted_header = "**Tugas Terputus**" +interrupted_body = "Sebuah tugas terputus saat restart.\n`{preview}`\nSilakan kirim ulang untuk melanjutkan." + +# -- Memory -------------------------------------------------------------------- + +[memory] +header = "**Memori Utama**" +empty = "Kosong. Agen akan membangun memori saat Anda berinteraksi." +empty_tip = "*Tips: Minta agen Anda untuk \"mengingat\" sesuatu untuk memulai.*" +filled_tip = "*Tips: Agen membaca dan memperbarui ini secara otomatis.*" + +# -- Status -------------------------------------------------------------------- + +[status] +header = "**Status**" +no_session = "Tidak ada sesi aktif." +model_line = "Model: {model}" +model_line_configured = "Model: {model} (dikonfigurasi: {configured})" +topic_line = "Topik: {topic}" +session_line = "Sesi: `{sid}`" +messages_line = "Pesan: {count}" +tokens_line = "Token: {tokens}" +cost_line = "Biaya: ${cost}" +bg_header = "Tugas latar: {count} berjalan" +auth_header = "Autentikasi:" +agents_header = "Agen:" + +# -- Technical footer ---------------------------------------------------------- + +[footer] +model = "Model: {name}" +tokens = "Token: {total} (masuk: {input}, keluar: {output})" +cost = "Biaya: ${cost}" +time = "Waktu: {secs} detik" + +# -- Upgrade ------------------------------------------------------------------- + +[upgrade] +dev_header = "**Berjalan dari Kode Sumber**" +dev_body = "Pembaruan mandiri tidak tersedia untuk instalasi pengembangan.\nPerbarui dengan `git pull` di direktori proyek Anda." +pypi_unreachable = "Tidak dapat menjangkau PyPI untuk memeriksa pembaruan. Coba lagi nanti." +up_to_date_header = "**Sudah Terbaru**" +up_to_date_body = "Terpasang: `{current}`\nTerbaru: `{latest}`\n\nAnda menjalankan versi terbaru." +available_header = "**Pembaruan Tersedia**" +available_body = "Terpasang: `{current}`\nBaru: `{latest}`\n\nPerbarui sekarang?" +btn_changelog = "Catatan Rilis v{version}" +btn_yes = "Ya, perbarui sekarang" +btn_not_now = "Tidak sekarang" + +# -- Diagnose ------------------------------------------------------------------ + +[diagnose] +header = "**Diagnostik Sistem**" +version_line = "Versi: `{version}`" +configured_line = "Dikonfigurasi: {provider} / {model}" +effective_line = "Runtime efektif: {provider} / {model}" +log_header = "Log terkini (50 baris terakhir):" +no_log = "File log tidak ditemukan." +codex_cache_not_init = "Cache Model Codex: Observer belum diinisialisasi" +codex_cache_not_loaded = "Cache Model Codex: Belum dimuat" +codex_cache_info = "Cache Model Codex:\n Terakhir diperbarui: {updated}\n Model dicache: {count}\n Model default: {default}" +health_header = "**Kesehatan Multi-Agen:**" + +# -- Tasks --------------------------------------------------------------------- + +[tasks] +header = "**Tugas Latar**" +disabled = "Sistem tugas tidak diaktifkan." +empty = "Tidak ada tugas latar." +hint = "Tugas dibuat oleh agen untuk pekerjaan yang membutuhkan waktu lama." +too_many = "Terlalu banyak tugas latar ({max} maks)" +internal_error = "Kesalahan internal (periksa log)" + +cancelled_one = "Membatalkan {count} tugas." +cancelled_other = "Membatalkan {count} tugas." +no_running = "Tidak ada tugas yang berjalan." +task_cancelled = "Tugas `{id}` dibatalkan." +task_not_running = "Tugas `{id}` tidak berjalan." +cleaned_one = "Menghapus {count} tugas yang selesai." +cleaned_other = "Menghapus {count} tugas yang selesai." +nothing_to_clean = "Tidak ada yang perlu dibersihkan." + +running_header = "**Berjalan**" +waiting_header = "**Menunggu jawaban**" +finished_header = "**Selesai**" + +btn_cancel = "Batalkan {name}" +btn_cancel_all = "Batalkan Semua" +btn_refresh = "Segarkan" +btn_delete_finished = "Hapus yang Selesai" + +summary_running = "Berjalan: {count}" +summary_waiting = "Menunggu: {count}" +summary_finished = "Selesai: {count}" + +# -- Sessions selector --------------------------------------------------------- + +[sessions] +header = "**Sesi**" +empty = "Tidak ada sesi aktif." +start_hint = "Mulai dengan `/session `." +followup_hint = "Tindak lanjut: `@ `" +active_count = "Aktif: {count}" +btn_end = "Akhiri {name}" +btn_refresh = "Segarkan" +btn_end_all = "Akhiri Semua" +topics_header = "Topik:" +named_header = "Bernama:" +named_empty = "Tidak ada sesi aktif.\n Mulai dengan `/session `." + +ended_all_one = "Semua {count} sesi diakhiri." +ended_all_none = "Tidak ada sesi aktif." +ended_one = "Sesi '{name}' diakhiri." +ended_not_found = "Sesi '{name}' tidak ditemukan." +unknown_action = "Tindakan tidak dikenal." + +# -- Model selector ------------------------------------------------------------ + +[model] +header = "**Pemilih Model**" +current = "Saat ini: {model}" +current_with_effort = "Saat ini: {model} ({effort})" +configured_default = "Default yang dikonfigurasi: {configured}" + +switched = "**Model beralih.**" +model_line = "Model: {model}" +model_change = "Model: {old} -> {new}" +provider_change = "Provider: {old} -> {new}" +reasoning_line = "Penalaran: {effort}" +effort_updated = "Upaya penalaran diperbarui." +already_running = "Sudah menggunakan {model}. Tidak ada perubahan." + +resume_hint = """\ +Melanjutkan sesi `{sid}`. +Anda telah mengirim {count} {label} dalam sesi provider ini. +Model saat ini: `{model}`. +Gunakan /new untuk memulai sesi baru.""" +resume_msg_one = "pesan" +resume_msg_other = "pesan" + +no_auth = "Tidak ada provider yang terautentikasi.\nJalankan `claude auth`, `codex auth`, atau autentikasi di `gemini` untuk memulai." +pick_provider = "Pilih provider:" +select_claude = "Pilih model Claude:" +select_gemini = "Pilih model Gemini:" +select_codex = "Pilih model Codex:" +no_codex = "Tidak ada model Codex yang tersedia." +no_gemini = "Tidak ada model Gemini yang ditemukan dari file lokal Gemini CLI." +thinking_level = "Tingkat berpikir untuk {model}:" +unknown_action = "Tindakan tidak dikenal." +btn_back = "<< Kembali" +switched_while_busy = "**Model beralih.** Proses saat ini masih berjalan — model baru berlaku untuk pesan berikutnya." + +# -- Cron selector ------------------------------------------------------------- + +[cron] +header = "**Tugas Terjadwal**" +empty = "Tidak ada cron job yang dikonfigurasi." +empty_hint = "*Tanya agen Anda: \"Jalankan pemeriksaan cadangan setiap hari pukul 9 pagi\"*" +job_line = "{number}. **{title}** ({status}){last_run}\n `{schedule}`" +status_active = "aktif" +status_paused = "dijeda" +btn_disable = "{number}. Nonaktifkan" +btn_enable = "{number}. Aktifkan" +btn_prev = "<< Sebelumnya" +btn_refresh = "Segarkan" +btn_next = "Berikutnya >>" +btn_all_on = "Semua ON" +btn_all_off = "Semua OFF" +info_active = "{active}/{total} aktif" +info_page = "halaman {current}/{total}" +all_enabled = "Semua cron job diaktifkan." +all_disabled = "Semua cron job dinonaktifkan." +already_enabled = "Semua cron job sudah aktif." +already_disabled = "Semua cron job sudah dinonaktifkan." +toggled = "'{title}' {state}." +list_changed = "Daftar cron berubah. Silakan coba lagi." +unknown_action = "Tindakan tidak dikenal. Daftar cron disegarkan." + +# -- Welcome (Telegram) ------------------------------------------------------- + +[welcome] +header = "**Selamat datang di ductor.dev{name}!**" +tagline = """\ +Deploy dari saku Anda. Otomatisasi dari sofa Anda. +Claude Code, Codex & Gemini -- langsung dari Telegram.""" +hint_model = "/model — ganti model" +hint_info = "/info — dokumen & tautan" +hint_help = "/help — semua perintah" + +no_auth = "Belum ada CLI yang terautentikasi. Jalankan `claude auth`, `codex auth`, atau autentikasi di `gemini` untuk memulai." +auth_line = "{providers} terautentikasi.\nModel: **{model}**" + +btn_know = "Ayo saling mengenal!" +btn_system = "Lihat sistemnya!" +btn_who = "Siapa kamu? Siapa aku?" + +prompt_know = """\ +Hei, saya baru menyiapkan ductor.dev dan ingin kamu mengenalku. \ +Tanyakan semua yang perlu kamu tahu agar kita bisa bekerja sama dengan baik -- \ +namaku, apa yang kulakukan, apa yang sedang kukerjakan, bagaimana aku suka berkomunikasi. \ +Simpan apa yang kamu pelajari ke memorimu.""" +prompt_system = """\ +Lihat-lihat sistem tempat kamu berjalan. \ +Periksa OS, alat yang terpasang, folder proyek, apa pun yang menarik. \ +Berikan ringkasan singkat tentang apa yang kamu temukan.""" +prompt_who = """\ +Mari mulai! Perkenalkan dirimu -- siapa kamu, apa yang bisa kamu lakukan untukku? \ +Kemudian tanya siapa aku dan apa yang perlu kubantuan.""" + +# -- Info ---------------------------------------------------------------------- + +[info] +header = "**ductor.dev**" +version = "Versi: `{version}`" +telegram_description = "Agen AI coding (Claude, Codex, Gemini) di Telegram.\nSesi bernama, memori persisten, cron job, webhook, streaming langsung." +matrix_description = "Agen AI coding (Claude, Codex, Gemini) di Matrix.\nSesi bernama, memori persisten, cron job, webhook, streaming langsung." + +# -- Help (categories) -------------------------------------------------------- + +[help] +header = "**Referensi Perintah**" +cat_daily = "Harian" +cat_automation = "Otomatisasi" +cat_multiagent = "Multi-Agen" +cat_browse = "Jelajah & Info" +cat_maintenance = "Pemeliharaan" +footer = "Kirim pesan apa pun untuk mulai bekerja dengan agen Anda." +matrix_footer = "Gunakan awalan `!` atau `/`. Kirim pesan apa pun untuk memulai." + +# -- Multi-agent --------------------------------------------------------------- + +[agents] +header = "**Agen**" +empty = "Tidak ada agen." +not_active = "Mode multi-agen tidak aktif." +usage_stop = "Penggunaan: /agent_stop " +usage_start = "Penggunaan: /agent_start " +usage_restart = "Penggunaan: /agent_restart " +cannot_stop_main = "Tidak dapat menghentikan agen utama." +not_running = "Agen '{name}' tidak berjalan." +stopped = "Agen '{name}' dihentikan." + +system_header = "**Sistem Multi-Agen**" +telegram_explanation = """\ +Sistem multi-agen memungkinkan Anda menjalankan bot tambahan sebagai \ +sub-agen — masing-masing dengan token Telegram, workspace, \ +dan daftar pengguna sendiri. Semua agen berbagi satu proses dan dapat \ +berkomunikasi melalui bus antar-agen.""" +matrix_explanation = """\ +Sistem multi-agen memungkinkan Anda menjalankan bot tambahan sebagai \ +sub-agen — masing-masing dengan workspace dan daftar pengguna sendiri. \ +Semua agen berbagi satu proses dan dapat berkomunikasi \ +melalui bus antar-agen.""" +commands_header = "**Perintah**" +setup_header = "**Pengaturan**" +setup_instruction = "Minta agen Anda untuk membuat sub-agen baru atau edit `agents.json` di direktori ductor home Anda." + +# -- Errors (generic) --------------------------------------------------------- + +[error] +generic = "Kesalahan: {detail}" +check_logs = "Kesalahan: periksa log untuk detailnya." + +# -- Gemini warning ------------------------------------------------------------ + +[gemini] +missing_key = """\ +Gemini diatur ke mode autentikasi API key, tetapi `gemini_api_key` di \ +`~/.ductor/config/config.json` bernilai `"null"` atau kosong. +Mengapa ini diperlukan: ketika ductor memanggil Gemini CLI sebagai proses eksternal, \ +Gemini CLI tidak mengekspos API key yang dimasukkan secara internal kepada pemanggil tersebut. +Atur API key yang valid di `gemini_api_key` dan restart `ductor`.""" + +# -- New session (handler) ----------------------------------------------------- + +[new] +topic_not_found = "Topik \"{name}\" tidak ditemukan." +topic_reset = "Sesi baru untuk **{name}** ({provider})." + +# -- Transport-specific -------------------------------------------------------- + +[telegram] +group_rejected = "Bot ini tidak diizinkan untuk grup ini." +where_header = "**Lokasi**" +where_no_tracker = "Pelacak obrolan tidak tersedia." +where_empty = "Belum ada aktivitas obrolan yang tercatat." +leave_usage_header = "**Penggunaan**" +leave_usage = "`/leave `" +leave_invalid_id = "ID grup tidak valid." +leave_failed = "Gagal keluar: {error}" +left_group = "Keluar dari grup {group_id}." + +[matrix] +room_rejected = "Bot ini tidak diizinkan untuk ruangan ini." + +# -- Session help (transport-specific) ----------------------------------------- + +[session_help] +header = "**Sesi Latar**" +telegram_explanation = """\ +Sesi latar menjalankan tugas secara paralel tanpa memblokir \ +obrolan utama. Setiap sesi mendapat nama unik dan berjalan \ +secara independen — Anda dapat memiliki beberapa sesi aktif sekaligus.""" +usage_header = "**Penggunaan**" +followup_header = "**Tindak lanjut**" +followup_line = "`@nama-sesi ` — kirim tindak lanjut ke sesi yang berjalan" +commands_header = "**Perintah**" +telegram_sessions_cmd = "`/sessions` — lihat dan kelola semua sesi latar" +telegram_stop_cmd = "`/stop` — batalkan sesi yang berjalan" +matrix_session_cmd = "`!session ` — mulai sesi latar" +matrix_sessions_cmd = "`!sessions` — lihat dan kelola semua sesi" +matrix_stop_cmd = "`!stop` — batalkan sesi yang berjalan" +default_provider = "`/session ` — provider default" +claude_single = "`/session ` — berjalan di Claude" +claude_model = "`/session @opus ` — model spesifik" +codex_single = "`/session ` — berjalan di Codex" +gemini_single = "`/session ` — berjalan di Gemini" +gemini_model = "`/session @flash ` — model spesifik" +claude_multi = "`/session @opus ` — Claude (opus)" +codex_multi = "`/session @codex ` — Codex" +gemini_multi = "`/session @flash ` — Gemini (flash)" +explicit = "`/session @provider model ` — eksplisit" + +# -- File browser -------------------------------------------------------------- + +[file_browser] +header = "**Penjelajah File**" +directory_not_found = "Direktori tidak ditemukan." +empty = "(kosong)" +btn_back = "<< Kembali" +btn_request_files = "Kirimkan saya file dari folder ini" +file_request_prompt = "Daftarkan semua file di {dir}/ dan kirimkan yang saya minta. Kirimkan file menggunakan tag file." + +# Matrix variant +matrix_header = "**File Workspace**" +matrix_hint = "_Gunakan `!showfiles ` untuk mendaftarkan direktori tertentu._" +matrix_dir_not_found = "Direktori `{subdir}` tidak ditemukan." +matrix_permission_denied = "(akses ditolak)" +matrix_file_count = "{count} file" +matrix_no_dirs = "(tidak ada direktori workspace yang ditemukan)" + +# -- Upgrade handler (Telegram) ------------------------------------------------ + +[upgrade_handler] +btn_changelog = "Catatan Rilis v{version}" +btn_upgrade_now = "Perbarui sekarang" +btn_later = "Nanti" +skipped = "Pembaruan dilewati." +already_in_progress = "Pembaruan sedang berlangsung. Harap tunggu." +in_progress = "Memperbarui ke {version}..." +verification_failed = "Pembaruan tidak dapat memverifikasi versi baru yang terpasang (masih {version}) setelah percobaan ulang otomatis.{details}" +restarting = "Bot sedang memulai ulang..." +no_changelog = "Tidak ada catatan rilis untuk v{version}." +changelog_header = "**Catatan Rilis v{version}**" + +# -- Multi-agent notifications ------------------------------------------------- + +[multiagent] +async_task_received = "📥 **Tugas async diterima** dari `{sender}`\nSesi: `{session}` · ID Tugas: `{task_id}`\n\n_{preview}_" diff --git a/ductor_bot/i18n/id/cli.toml b/ductor_bot/i18n/id/cli.toml new file mode 100644 index 0000000..aa30730 --- /dev/null +++ b/ductor_bot/i18n/id/cli.toml @@ -0,0 +1,286 @@ +# Indonesian CLI strings (Rich-formatted, shown in terminal). + +# -- Status command ------------------------------------------------------------ + +[status] +running = "[bold green]Berjalan[/bold green] pid={pid} uptime: {uptime}" +not_running = "[dim]Tidak berjalan[/dim]" +provider = "Provider: [cyan]{provider}[/cyan] ({model})" +docker_enabled = "Docker: [green]aktif[/green] ({name})" +docker_disabled = "Docker: [dim]nonaktif[/dim]" +errors_found = "Kesalahan: [bold red]{count}[/bold red] di log terbaru" +errors_none = "Kesalahan: [green]0[/green]" +paths_header = "[bold]Path:[/bold]" +not_configured = "[bold yellow]Belum dikonfigurasi.[/bold yellow]\n\nJalankan [bold]ductor[/bold] untuk memulai wizard pengaturan." + +# -- Config validation --------------------------------------------------------- + +[config] +incomplete = "[bold yellow]Konfigurasi tidak lengkap. Jalankan [bold]ductor onboarding[/bold].[/bold yellow]" +matrix_no_homeserver = "[bold yellow]URL homeserver Matrix diperlukan.{hint}[/bold yellow]" +matrix_no_user = "[bold yellow]user_id Matrix diperlukan.{hint}[/bold yellow]" +matrix_no_auth = "[bold yellow]Kata sandi atau access_token Matrix diperlukan.{hint}[/bold yellow]" +matrix_no_target = "[bold yellow]Setidaknya satu allowed_room atau allowed_user diperlukan.{hint}[/bold yellow]" +onboarding_hint = " Jalankan [bold]ductor onboarding[/bold] untuk mengonfigurasi ulang." + +# -- Lifecycle ----------------------------------------------------------------- + +[lifecycle] +stopping_docker = "[dim]Menghentikan kontainer Docker '{name}'...[/dim]" +docker_stopped = "[green]Kontainer Docker dihentikan.[/green]" +stopping_bot = "[dim]Menghentikan bot (pid={pid})...[/dim]" +bot_stopped = "[green]Bot dihentikan.[/green]" +killed_extra = "[dim]Mematikan {count} proses ductor yang tersisa.[/dim]" +no_instance = "[dim]Tidak ada instance bot yang berjalan.[/dim]" + +[lifecycle.uninstall] +title = "[bold red]Hapus Instalasi ductor[/bold red]" +body = """\ +[bold red]Ini akan menghapus ductor secara permanen dari sistem Anda.[/bold red]\n + 1. Hentikan bot yang berjalan (jika aktif) + 2. Hapus kontainer dan image Docker (jika digunakan) + 3. Hapus semua data di ~/.ductor/ + 4. Hapus instalasi paket ductor""" +confirm = "Apakah Anda yakin ingin menghapus segalanya?" +cancelled = "[dim]Penghapusan instalasi dibatalkan.[/dim]" +removing_image = "[dim]Menghapus image Docker '{image}'...[/dim]" +image_removed = "[green]Image Docker dihapus.[/green]" +uninstalling = "[dim]Menghapus instalasi paket ductor...[/dim]" +delete_warning = "[yellow]Peringatan: Tidak dapat menghapus sepenuhnya {home} (beberapa file mungkin terkunci). Hapus secara manual.[/yellow]" +deleted = "[green]Dihapus {home}[/green]" +done_title = "[bold green]Selamat Tinggal[/bold green]" +done_body = "[bold green]ductor telah dihapus sepenuhnya.[/bold green]\n\nTerima kasih telah menggunakan ductor!" + +[lifecycle.upgrade] +dev_title = "[bold yellow]Instalasi Pengembangan[/bold yellow]" +dev_body = """\ +[bold yellow]Berjalan dari kode sumber (editable install).[/bold yellow]\n +Pembaruan mandiri tidak tersedia. +Perbarui dengan [bold]git pull[/bold] di direktori proyek Anda.""" +title = "[bold cyan]Memperbarui ductor...[/bold cyan]" +body = """\ + 1. Hentikan bot yang berjalan dengan baik + 2. Perbarui ke versi terbaru + 3. Restart""" +upgrading = "[dim]Memperbarui paket...[/dim]" +complete = "[green]Pembaruan selesai: {old} -> {new}[/green]" +unchanged = "[bold yellow]Versi tidak berubah setelah pembaruan ({version}).[/bold yellow]\nPercobaan ulang otomatis dilakukan, tetapi versi baru yang terpasang belum dapat diverifikasi." +restarting = "[dim]Memulai ulang...[/dim]" + +# -- Docker commands ----------------------------------------------------------- + +[docker] +config_not_found = "[bold red]Konfigurasi tidak ditemukan. Jalankan ductor terlebih dahulu.[/bold red]" +config_read_error = "[bold red]Gagal membaca konfigurasi.[/bold red]" +enabled = "Docker sandboxing: [green]aktif[/green]" +disabled = "Docker sandboxing: [dim]nonaktif[/dim]" +restart_hint = "[dim]Restart bot untuk menerapkan.[/dim]" + +[docker.rebuild] +stopping = "[dim]Menghentikan bot...[/dim]" +removing_container = "[dim]Menghapus kontainer '{name}'...[/dim]" +removing_image = "[dim]Menghapus image '{name}'...[/dim]" +done = "[green]Selesai.[/green] Image akan dibangun ulang saat bot berikutnya dimulai.\n[dim]Jika berjalan sebagai layanan, akan restart otomatis.[/dim]" + +[docker.mount] +usage = "[bold red]Penggunaan: ductor docker mount [/bold red]" +not_exist = "[bold red]Path tidak ada: {path}[/bold red]" +not_dir = "[bold red]Bukan direktori: {path}[/bold red]" +already = "[dim]Sudah dimount: {path}[/dim]" +done = "[green]Dimount:[/green] {path}{target}" +apply_hint = "[dim]Restart bot (atau rebuild kontainer) untuk menerapkan.[/dim]" + +[docker.unmount] +usage = "[bold red]Penggunaan: ductor docker unmount [/bold red]" +not_found = "[bold red]Mount tidak ditemukan: {path}[/bold red]" +done = "[green]Di-unmount:[/green] {path}" + +[docker.mounts] +empty = "[dim]Tidak ada mount yang dikonfigurasi.[/dim]" +add_hint = "[dim]Gunakan 'ductor docker mount ' untuk menambahkan.[/dim]" + +[docker.extras] +col_package = "Paket" +col_description = "Fungsi" +col_status = "Status" +selected = "[green]dipilih[/green]" +not_selected = "[dim]—[/dim]" +apply_hint = "[dim]Jalankan 'ductor docker rebuild' untuk menerapkan extras yang dipilih ke image.[/dim]" +add_hint = "[dim]Gunakan 'ductor docker extras-add ' untuk menambahkan extra.[/dim]" +remove_hint = "[dim]Gunakan 'ductor docker extras-remove ' untuk menghapus extra.[/dim]" +usage_add = "[bold red]Penggunaan: ductor docker extras-add [/bold red]" +usage_remove = "[bold red]Penggunaan: ductor docker extras-remove [/bold red]" +see_ids = "[dim]Jalankan 'ductor docker extras' untuk melihat ID yang tersedia.[/dim]" +see_installed = "[dim]Jalankan 'ductor docker extras' untuk melihat ID yang terpasang.[/dim]" +unknown = "[bold red]Extra tidak dikenal: {id}[/bold red]" +already_installed = "[dim]Sudah terpasang: {id}[/dim]" +not_installed = "[bold red]Belum terpasang: {id}[/bold red]" +added = "[green]Ditambahkan:[/green] {names}" +auto_deps = "[dim]Dependensi otomatis ditambahkan: {names}[/dim]" +removed = "[green]Dihapus:[/green] {name}" +rebuild_hint = "[yellow]Jalankan 'ductor docker rebuild' untuk menerapkan.[/yellow]" +dep_warning = "[yellow]Peringatan: {dependents} bergantung pada {name}.[/yellow]" + +# -- Service commands ---------------------------------------------------------- + +[service] +not_installed = "[dim]Layanan belum terpasang. Jalankan [bold]ductor service install[/bold].[/dim]" +not_running = "[dim]Layanan tidak berjalan.[/dim]" +no_service = "[dim]Tidak ada layanan yang terpasang.[/dim]" +no_binary = "[bold red]Tidak dapat menemukan biner ductor di PATH.[/bold red]" +removed = "[green]Layanan dihapus.[/green]" +started = "[green]Layanan dimulai.[/green]" +stopped = "[green]Layanan dihentikan.[/green]" +start_failed = "[red]Gagal memulai: {error}[/red]" +stop_failed = "[red]Gagal menghentikan: {error}[/red]" + +[service.install] +title = "layanan latar ductor" +body = """\ +[bold green]ductor sekarang berjalan sebagai layanan latar.[/bold green]\n +{detail}\n +[bold]Perintah yang berguna:[/bold]\n + [cyan]ductor service status[/cyan] Periksa apakah sedang berjalan + [cyan]ductor service stop[/cyan] Hentikan layanan + [cyan]ductor service logs[/cyan] {logs_hint} + [cyan]ductor service uninstall[/cyan] Hapus layanan""" + +[service.linux] +no_systemd = "[bold red]systemd tidak ditemukan. Instalasi layanan memerlukan Linux dengan systemd.[/bold red]" +linger_warning = "[bold yellow]Linger harus diaktifkan agar ductor tetap berjalan setelah Anda keluar.[/bold yellow]" +linger_enabled = "[green]Linger diaktifkan.[/green]" +linger_manual = "[yellow]Tidak dapat mengaktifkan linger secara otomatis.[/yellow]\nJalankan secara manual: [bold]sudo loginctl enable-linger {user}[/bold]" +start_failed = "[bold red]Gagal memulai layanan:[/bold red] {error}" +detail = "Dimulai saat boot dan restart saat crash." + +[service.macos] +no_launchctl = "[bold red]launchctl tidak ditemukan. Instalasi layanan memerlukan macOS.[/bold red]" +start_failed = "[bold red]Gagal memuat Launch Agent:[/bold red] {error}" +detail = "Dimulai saat login dan restart saat crash (throttle 10 detik)." +unload_failed = "[red]Gagal membongkar agent: {error}[/red]" +not_loaded = "[red]Agent tidak dimuat. Coba: [bold]ductor service install[/bold][/red]" + +[service.windows] +admin_title = "[bold yellow]Hak Administrator Diperlukan[/bold yellow]" +admin_body = """\ +[bold yellow]Diperlukan hak administrator.[/bold yellow]\n +Buka terminal sebagai Administrator dan coba lagi:\n + [bold]1.[/bold] Klik kanan pada CMD atau PowerShell + [bold]2.[/bold] Pilih [cyan]'Jalankan sebagai administrator'[/cyan] + [bold]3.[/bold] Jalankan: [cyan]ductor service install[/cyan]""" +no_scheduler = "[bold red]Task Scheduler tidak tersedia. Instalasi layanan memerlukan Windows.[/bold red]" +no_pythonw = "[dim]Catatan: pythonw.exe tidak ditemukan. Jendela konsol mungkin terlihat.[/dim]" +create_failed = "[bold red]Gagal membuat tugas terjadwal:[/bold red] {error}" +start_failed = "[bold red]Tugas dibuat tetapi gagal dimulai:[/bold red] {error}" +remove_failed = "[red]Gagal menghapus tugas: {error}[/red]" +detail = "Dimulai 10 detik setelah login dan restart saat crash (hingga 3 percobaan, interval 1 menit)." +query_failed = "[red]Tidak dapat menanyakan status tugas: {error}[/red]" + +[service.logs] +no_logs = "[dim]Tidak ada file log yang ditemukan.[/dim]" +showing = "[dim]Menampilkan {count} baris terakhir dari {name}[/dim]" +read_error = "[red]Tidak dapat membaca file log: {error}[/red]" +full_path = "[dim]Log lengkap: {path}[/dim]" +not_installed = "[dim]Layanan belum terpasang.[/dim]" +streaming = "[dim]Menampilkan log (Ctrl+C untuk berhenti)...[/dim]" +no_journalctl = "[bold red]journalctl tidak ditemukan.[/bold red]" + +# -- API commands -------------------------------------------------------------- + +[api] +title = "[bold]Perintah API[/bold] [dim](beta)[/dim]" +status_not_configured = "[dim]belum dikonfigurasi[/dim]" +status_enabled = "[green]aktif[/green] (port {port})" +status_disabled = "[dim]nonaktif[/dim]" + +[api.missing_dep] +title = "[bold]Dependensi tidak ditemukan[/bold]" +body = """\ +[bold yellow]PyNaCl diperlukan untuk server API (enkripsi E2E).[/bold yellow]\n +Pasang dengan:\n + [bold]{hint}[/bold]\n +Kemudian jalankan [bold]ductor api enable[/bold] lagi.""" + +[api.enabled] +title = "[bold]Server API[/bold] [dim](beta)[/dim]" +body = """\ +[bold green]Server API diaktifkan.[/bold green]\n + Host: [cyan]{host}[/cyan] + Port: [cyan]{port}[/cyan] + Token: [cyan]{token}[/cyan]\n +[dim]Restart bot untuk memulai server API.[/dim] +[dim]Dirancang untuk digunakan dengan Tailscale atau jaringan privat lainnya.[/dim]""" + +[api.disabled] +status = "Server API: [dim]nonaktif[/dim]" + +# -- Agent commands ------------------------------------------------------------ + +[agents] +col_agent = "Agen" +col_status = "Status" +col_uptime = "Uptime" +col_provider = "Provider" +col_model = "Model" +status_running = "[bold green]berjalan[/bold green]" +status_starting = "[yellow]memulai[/yellow]" +status_crashed = "[bold red]crash[/bold red]" +status_stopped = "[dim]dihentikan[/dim]" +empty = "[dim]Tidak ada sub-agen yang dikonfigurasi.[/dim]" +add_hint = "[dim]Gunakan 'ductor agents add ' untuk membuat satu.[/dim]" + +[agents.add] +usage = "[bold red]Penggunaan: ductor agents add [/bold red]" +reserved = "[bold red]Nama 'main' sudah dicadangkan.[/bold red]" +exists = "[bold red]Agen '{name}' sudah ada.[/bold red]" +prompt_token = "Token bot Telegram untuk '{name}':" +prompt_users = "ID pengguna yang diizinkan (dipisah koma):" +prompt_groups = "ID grup yang diizinkan (dipisah koma, kosongkan jika tidak ada):" +prompt_provider = "Provider:" +prompt_model = "Model (mis. opus, sonnet, o3):" +cancelled = "[dim]Dibatalkan.[/dim]" +done = "[green]Agen '{name}' ditambahkan ke agents.json.[/green]" +auto_start = "[dim]Akan dimulai otomatis saat bot berikutnya (re)start.[/dim]" + +[agents.remove] +usage = "[bold red]Penggunaan: ductor agents remove [/bold red]" +not_found = "[bold red]Agen '{name}' tidak ditemukan.[/bold red]" +confirm = "Hapus agen '{name}'? (Data workspace tidak akan dihapus.)" +done = "[green]Agen '{name}' dihapus dari agents.json.[/green]" +data_hint = "[dim]Data workspace tersimpan di {path}[/dim]" + +# -- Install extras ------------------------------------------------------------ + +[install] +already = "[green]✓[/green] {description} sudah terpasang." +installing = "Memasang {description}..." +command = "[dim]$ {cmd}[/dim]" +done = "[green]✓[/green] {description} berhasil dipasang." +failed = "[red]✗[/red] Pemasangan gagal." +col_extra = "Extra" +col_description = "Deskripsi" +col_status = "Status" +status_installed = "[green]terpasang[/green]" +status_not_installed = "[dim]belum terpasang[/dim]" + +# -- Help table ---------------------------------------------------------------- + +[help] +col_command = "Perintah" +col_description = "Deskripsi" +ductor = "Mulai bot (jalankan onboarding jika perlu)" +onboarding = "Wizard pengaturan (reset jika sudah dikonfigurasi)" +stop = "Hentikan bot dan kontainer Docker yang berjalan" +restart = "Restart bot" +reset = "Reset penuh dan pengaturan ulang" +upgrade = "Hentikan, perbarui ke terbaru, restart" +uninstall = "Hapus segalanya dan hapus instalasi" +service_install = "Jalankan sebagai layanan latar ({hint})" +service = "Manajemen layanan (status/stop/logs/...)" +agents = "Manajemen sub-agen (list/add/remove)" +docker = "Manajemen Docker (rebuild/enable/disable)" +api = "Manajemen server API (enable/disable) [beta]" +install = "Pasang extras opsional (matrix, api)" +status = "Tampilkan status bot, path, dan agen" +help = "Tampilkan pesan ini" +verbose = "Output log verbose" diff --git a/ductor_bot/i18n/id/commands.toml b/ductor_bot/i18n/id/commands.toml new file mode 100644 index 0000000..2d30ab5 --- /dev/null +++ b/ductor_bot/i18n/id/commands.toml @@ -0,0 +1,26 @@ +# Deskripsi perintah bot (maks 22 karakter untuk klien Telegram mobile). + +[bot] +new = "Mulai obrolan baru" +stop = "Hentikan + kosongkan antrean" +interrupt = "Interupsi, simpan antrean" +model = "Tampilkan/ganti model" +status = "Info sesi" +memory = "Tampilkan memori utama" +session = "Sesi latar" +tasks = "Tugas latar" +cron = "Kelola cron job" +agent_commands = "Sistem multi-agen" +showfiles = "Jelajah file" +info = "Dokumen, tautan & tentang" +help = "Tampilkan semua perintah" +diagnose = "Diagnostik sistem" +upgrade = "Periksa pembaruan" +restart = "Restart bot" + +[multiagent] +agents = "Daftar semua agen" +agent_start = "Mulai sub-agen" +agent_stop = "Hentikan sub-agen" +agent_restart = "Restart sub-agen" +stop_all = "Hentikan semua" diff --git a/ductor_bot/i18n/id/wizard.toml b/ductor_bot/i18n/id/wizard.toml new file mode 100644 index 0000000..4128273 --- /dev/null +++ b/ductor_bot/i18n/id/wizard.toml @@ -0,0 +1,182 @@ +# Indonesian wizard strings (Rich-formatted, shown in terminal during onboarding). + +[common] +cancelled = "[dim]Pengaturan dibatalkan.[/dim]" +subtitle = "ductor.dev" + +[cli_backends] +title = "Backend CLI" +header = "[bold]Backend AI yang Terdeteksi:[/bold]\n" +claude = " Claude Code CLI {status}" +codex = " OpenAI Codex CLI {status}" +gemini = " Google Gemini CLI {status}" +no_auth = """\ +\n[bold red]Setidaknya satu CLI harus terpasang dan terautentikasi.[/bold red]\n + Claude: [dim]https://docs.anthropic.com/en/docs/claude-code[/dim] + Codex: [dim]https://github.com/openai/codex[/dim] + Gemini: [dim]https://github.com/google-gemini/gemini-cli[/dim]""" + +[disclaimer] +title = "[bold yellow]Penafian[/bold yellow]" +body = """\ +[bold]Penting -- harap baca sebelum melanjutkan.[/bold]\n +ductor terhubung ke [bold]Anthropic Claude CLI[/bold] dan \ +[bold]OpenAI Codex CLI[/bold] sebagai backend agen AI.\n +Bot beroperasi dalam [bold yellow]mode bypass izin penuh[/bold yellow]. \ +Agen dapat membaca, menulis, dan menghapus file, menjalankan perintah, \ +dan berinteraksi dengan sistem Anda tanpa meminta konfirmasi.\n +Meskipun ada perlindungan, [bold red]tindakan yang tidak diinginkan dapat terjadi[/bold red] \ +-- termasuk kehilangan data, perubahan file yang tidak terduga, atau eksekusi perintah yang tidak diinginkan.\n +[bold green]Kami sangat menyarankan untuk menjalankan ductor di dalam kontainer Docker[/bold green] \ +untuk mengisolasi dari sistem host Anda.""" +confirm = "Saya memahami risikonya dan ingin melanjutkan." + +[transport] +title = "[bold]Transport Pesan[/bold]" +body = """\ +[bold]Pilih cara pengguna berkomunikasi dengan bot:[/bold]\n + [bold cyan]Telegram[/bold cyan] — Memerlukan token bot dari @BotFather + [bold cyan]Matrix[/bold cyan] — Memerlukan akun Matrix di homeserver (mis. Element)""" +prompt = "Pilih transport:" + +[telegram.token] +title = "[bold]Token Bot Telegram[/bold]" +body = """\ +[bold]Cara mendapatkan Token Bot Telegram Anda:[/bold]\n + 1. Buka Telegram dan cari [bold cyan]@BotFather[/bold cyan] + 2. Kirim [bold]/newbot[/bold] dan ikuti petunjuknya + 3. Pilih nama dan username untuk bot Anda + 4. BotFather akan membalas dengan token bot Anda\n +[dim]Format token: 1234567890:ABCdefGHIjklMNOpqrsTUVwxyz[/dim]""" +prompt = "Tempel token bot Anda:" +error = "[red]Format token tidak valid. Diharapkan: angka:alfanumerik (mis. 123456:ABC-xyz)[/red]" + +[telegram.user_id] +title = "[bold]ID Pengguna Telegram[/bold]" +body = """\ +[bold]Cara menemukan ID Pengguna Telegram Anda:[/bold]\n + 1. Buka Telegram dan cari [bold cyan]@userinfobot[/bold cyan] + 2. Kirim [bold]/start[/bold] ke bot + 3. Bot akan membalas dengan ID pengguna numerik Anda\n +[dim]Hanya pesan dari ID pengguna ini yang akan diterima oleh bot.[/dim]""" +prompt = "Masukkan ID pengguna numerik Anda:" +error_nan = "[red]Masukkan angka yang valid.[/red]" +error_negative = "[red]ID pengguna harus berupa angka positif.[/red]" + +[matrix.homeserver] +title = "[bold]Homeserver Matrix[/bold]" +body = """\ +[bold]Masukkan URL homeserver Matrix Anda.[/bold]\n + Ini adalah server tempat akun bot Anda berada.\n +[dim]Contoh: https://matrix.example.com[/dim]""" +prompt = "URL Homeserver:" +error = "[red]Harus berupa URL HTTPS (mis. https://matrix.example.com)[/red]" + +[matrix.user_id] +title = "[bold]ID Pengguna Bot Matrix[/bold]" +body = """\ +[bold]Masukkan ID pengguna Matrix bot.[/bold]\n + Buat akun khusus untuk bot di homeserver Anda.\n +[dim]Format: @namabot:homeserver.domain[/dim]""" +prompt = "ID pengguna bot:" +error = "[red]Format tidak valid. Diharapkan: @localpart:domain (mis. @mybot:matrix.org)[/red]" + +[matrix.password] +title = "[bold]Kata Sandi Matrix[/bold]" +body = """\ +[bold]Masukkan kata sandi akun bot.[/bold]\n + Digunakan hanya untuk login pertama kali. Setelah login pertama, + access token disimpan dan kata sandi tidak lagi diperlukan.""" +prompt = "Kata sandi:" +error = "[red]Kata sandi tidak boleh kosong.[/red]" + +[matrix.allowed_users] +title = "[bold]Pengguna yang Diizinkan[/bold]" +body = """\ +[bold]Siapa yang diizinkan berbicara dengan bot ini?[/bold]\n + Masukkan ID pengguna Matrix Anda. Hanya pesan dari pengguna + yang diizinkan yang akan diproses.\n +[dim]Format: @username:homeserver.domain[/dim]""" +prompt = "ID pengguna Matrix Anda:" +error = "[red]Format tidak valid. Diharapkan: @user:domain (mis. @nik:matrix.org)[/red]" + +[docker] +title = "[bold]Docker Sandboxing[/bold]" +found_body = """\ +[bold green]Docker terdeteksi di sistem Anda.[/bold green]\n +Menjalankan ductor di dalam Docker mengisolasinya dari host Anda. +Ini adalah pengaturan yang disarankan untuk keamanan.""" +found_prompt = "Aktifkan Docker sandboxing? (Disarankan)" +not_found_body = """\ +[bold yellow]Docker tidak ditemukan di sistem Anda.[/bold yellow]\n +Kami menyarankan untuk memasang Docker agar bot berjalan di kontainer terisolasi. +Anda dapat mengaktifkan Docker sandboxing nanti di konfigurasi.\n +[dim]https://docs.docker.com/get-docker/[/dim]""" + +[docker.extras] +title = "[bold]Docker Extras yang Tersedia[/bold]" +col_package = "Paket" +col_description = "Fungsi" +col_size = "Ukuran" +prompt = "Pilih extras (Spasi untuk pilih/batal, Enter untuk konfirmasi):" +hint = """\ +[dim]Paket-paket ini opsional dan meningkatkan waktu build image. +Anda dapat mengubah ini nanti dengan [cyan]ductor docker extras-add / extras-remove[/cyan].[/dim]""" +auto_deps = "[dim]Dependensi otomatis ditambahkan: {names}[/dim]" + +[timezone] +title = "[bold]Zona Waktu[/bold]" +body = """\ +Zona waktu Anda digunakan untuk penjadwalan cron, jam tenang heartbeat, +dan reset sesi harian.""" +prompt = "Pilih zona waktu Anda:" +manual_prompt = "Masukkan zona waktu IANA (mis. Asia/Jakarta):" +error = "[red]Zona waktu tidak dikenal: {tz}[/red]" + +[service] +title = "[bold]Layanan Latar[/bold]" +body = """\ +[bold]Jalankan ductor sebagai layanan latar?[/bold]\n +Ini membuat {mechanism} yang:\n + - Memulai ductor saat {trigger} + - Restart otomatis saat crash + - Tetap berjalan di latar\n +[dim]Disarankan untuk VPS atau pengaturan yang selalu menyala.[/dim]""" +prompt = "Pasang sebagai layanan latar? (Disarankan untuk VPS)" + +[complete] +title = "[bold green]Siap[/bold green]" +header = "[bold green]Pengaturan selesai![/bold green]" +files_header = "[bold]File ductor Anda:[/bold]" +home = " Home: [cyan]{path}[/cyan]" +config = " Config: [cyan]{path}[/cyan]" +workspace = " Workspace: [cyan]{path}[/cyan]" +logs = " Log: [cyan]{path}[/cyan]" +installing_service = "Memasang layanan..." +starting_bot = "Memulai bot..." + +[reset] +title = "[bold yellow]Pengaturan yang Ada Terdeteksi[/bold yellow]" +body = """\ +[bold yellow]Anda sudah memiliki pengaturan yang dikonfigurasi.[/bold yellow]\n +Menjalankan onboarding ulang akan melakukan [bold red]reset penuh[/bold red]:\n + [dim]{home}[/dim] akan dihapus seluruhnya. + Semua sesi, konfigurasi, memori, dan tugas cron akan hilang.""" + +[reset.docker] +title = "[bold]Pembersihan Docker[/bold]" +body = """\ +[bold]Docker sandboxing diaktifkan di konfigurasi Anda saat ini.[/bold]\n + Kontainer: [cyan]{container}[/cyan] + Image: [cyan]{image}[/cyan]""" +prompt = "Hapus kontainer dan image Docker?" +removing = "[dim]Menghapus sumber daya Docker...[/dim]" +done = "[green]Pembersihan Docker selesai.[/green]" + +[reset.confirm] +prompt = "Hapus segalanya dan mulai dari awal?" +deleted = "[dim]Workspace dihapus.[/dim]" +warning = "[yellow]Peringatan: Tidak dapat menghapus sepenuhnya {home}. Hapus secara manual.[/yellow]" + +[language] +prompt = "Pilih bahasa / Select language:" From 95856fd9e7398eb98ee0858806b1097fac6406b2 Mon Sep 17 00:00:00 2001 From: Tsaqif Mukhayyar <34240150+mukhayyar@users.noreply.github.com> Date: Wed, 25 Mar 2026 03:27:09 +0700 Subject: [PATCH 2/3] Update ductor_bot/i18n/id/commands.toml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bot command descriptions are intended to be ≤22 characters for Telegram mobile clients (see ductor_bot/commands.py and the header comment in en/commands.toml). This Indonesian translation for bot.stop is ~28 chars and will likely be truncated in Telegram’s command picker; consider shortening while preserving meaning. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- ductor_bot/i18n/id/commands.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ductor_bot/i18n/id/commands.toml b/ductor_bot/i18n/id/commands.toml index 2d30ab5..882780c 100644 --- a/ductor_bot/i18n/id/commands.toml +++ b/ductor_bot/i18n/id/commands.toml @@ -3,7 +3,7 @@ [bot] new = "Mulai obrolan baru" stop = "Hentikan + kosongkan antrean" -interrupt = "Interupsi, simpan antrean" +interrupt = "Interupsi + simpan" model = "Tampilkan/ganti model" status = "Info sesi" memory = "Tampilkan memori utama" From 7ad26d7d00c7fbab0e6692c5d84da4721d88146a Mon Sep 17 00:00:00 2001 From: Tsaqif Mukhayyar <34240150+mukhayyar@users.noreply.github.com> Date: Wed, 25 Mar 2026 03:27:23 +0700 Subject: [PATCH 3/3] Update ductor_bot/i18n/id/commands.toml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bot command descriptions are intended to be ≤22 characters for Telegram mobile clients (see ductor_bot/commands.py and the header comment in en/commands.toml). bot.info (~25 chars) and bot.help (~23 chars) exceed that and may be truncated in the Telegram UI; consider shortening these descriptions. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- ductor_bot/i18n/id/commands.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ductor_bot/i18n/id/commands.toml b/ductor_bot/i18n/id/commands.toml index 882780c..908b2ce 100644 --- a/ductor_bot/i18n/id/commands.toml +++ b/ductor_bot/i18n/id/commands.toml @@ -12,8 +12,8 @@ tasks = "Tugas latar" cron = "Kelola cron job" agent_commands = "Sistem multi-agen" showfiles = "Jelajah file" -info = "Dokumen, tautan & tentang" -help = "Tampilkan semua perintah" +info = "Info & tautan" +help = "Daftar perintah" diagnose = "Diagnostik sistem" upgrade = "Periksa pembaruan" restart = "Restart bot"