mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 23:25:24 +00:00
* fix(sso): send the PKCE verifier for GitHub login (#1534) * fix(remote-desktop): clip cursor overflow without disabling zoom (#1535) * test(remote-desktop): preserve sessions beyond one hour (#1536) * fix(hosts): expose controls for overflowing editor tabs (#1537) * fix(hosts): expose controls for overflowing editor tabs * test(hosts): mock resize observation in admin panel tests * fix(status): skip TCP probes while host sessions are active (#1538) * fix(database): batch session activity persistence (#1539) * docs(api): describe cookie and API key authentication (#1540) * fix(snippets): repair missing note column on SQLite upgrades (#1541) * fix(docker): retain stored SSH credential association (#1543) * fix(file-manager): render transfer toasts without plugin hooks (#1546) * feat(hosts): keep compact row actions inline (#1547) * fix(auth): allow retrying unavailable second-factor interfaces (#1549) * fix(auth): reject unresolved legacy identity provisioning (#1550) * fix(desktop): ship the plugin SDK inside Mac App Store builds (#1551) * fix(tmux): pass full session info to the terminal's session picker (#1552) The tmux.sessions service reduced detected sessions to bare names, but the picker reads session.name, so every entry rendered blank and selecting one sent an empty name, which created a new session instead of attaching. * fix(ssh): read force keyboard-interactive as a boolean when resolving hosts (#1553) The column holds the text "true"/"false", and the resolver passed it through as-is. The string "false" is truthy, so the password provider treated every saved host as forced keyboard-interactive and left the password out. Jump hops are built straight from the resolved host, so a password hop whose server doesn't offer keyboard-interactive failed with "All configured authentication methods failed". * fix(database): batch database saves for bulk host writes (#1554) * fix(database): yield to the event loop between database saves Each SQLite save serializes and encrypts the whole database into new buffers, which V8 only releases once the event loop turns. Boot migrations and bulk host import write plugin settings per host and per key in an awaited loop, so hundreds of full copies piled up and the container ran out of memory. * fix(database): save once per bulk host write instead of once per row On SQLite every repository write force-saves the whole database. Boot plugin data migrations, host defaults materialization and the bulk host routes write one row per host per setting, so they serialized and encrypted the full database hundreds of times in a row. DatabaseSaveTrigger.batched wraps a function so force saves made while it runs collapse into a single save when it finishes. Nested scopes fold into the outer one, and work that outlives its scope saves normally. * feat(hosts): add instance-wide predefined tag suggestions (#1548) * feat(hosts): add shared predefined tag suggestions * style(hosts): format tag catalog routes * test(database): advance fake timers past the save yield (#1555) * fix(i18n): complete Simplified Chinese core and plugin translations (#1542) * fix(i18n): complete Chinese onboarding and navigation labels * fix(i18n): translate remaining Chinese core and plugin interfaces * fix(i18n): translate host editor tab overflow controls * fix(i18n): use consistent Chinese fleet terminology * fix(i18n): localize hardcoded controls and plugin views * fix(i18n): translate built-in homepage widget catalog * test(homepage): follow translated timezone placeholder * fix(i18n): translate plugin-provided homepage widgets * fix(i18n): localize feature settings section titles * fix: 2.8 oidc accounts unable to sign in after upgrading (#1381) * fix: plugins losing the saved ssh login when copying a host (#1391) * fix: fleets, proxmox and automations not getting the host sudo password * fix: host imports running a defaults pass and metrics restart per host (#1384) * fix: high cpu from status probes and full database saves on every sample (#1300) * fix: user data export freezing the server (#1393) * fix: op:// secret references rejected as ssh keys on credentials (#1394) * fix: slow file deletes from the trash lookups on every delete (#1390) * fix: add openapi docs and error handling to host tag routes * test: compare download stream buffers directly so it stops timing out * chore: drop em dash from host row comment * chore: update release notes for 2.9.1 * fix: restore space to add host tags and redesign predefined tags editor * fix: host key silently accepted when the host is missing from the database (#1397) * fix: clearer host login failed status label and fix its translations (#1396) * chore: add host key and status label fixes to release notes * fix: sso and ldap provider dialogs overflowing the screen and using mismatched toggles * chore: increment ver * fix(audit): store plugin entries with no acting user as a null user_id (#1556) Plugin audit entries written outside a request used the literal "system" as user_id. That column references users.id, so the insert was refused (Postgres logs it as an FK violation) and the entry was silently dropped. Write null instead and keep "system" / plugin:<id> in username. * chore: add sso/ldap dialog and audit log fixes to release notes * fix: tunnels and host settings missing from shared hosts on desktop * fix: remote desktop logins missing from shared hosts on desktop * fix: simplify host status to online/offline and keep it live without a refresh * chore: sync Crowdin translations for 2.9.1 --------- Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
316 lines
12 KiB
JSON
316 lines
12 KiB
JSON
{
|
|
"nav": {
|
|
"hostMetrics": "Metrik Host"
|
|
},
|
|
"hostMetrics": {
|
|
"cpu": "CPU",
|
|
"memory": "Ingatan",
|
|
"disk": "Disk",
|
|
"network": "Jaringan",
|
|
"uptime": "Waktu aktif",
|
|
"processes": "Proses",
|
|
"available": "Tersedia",
|
|
"free": "Bebas",
|
|
"connecting": "Menghubungkan...",
|
|
"connectionFailed": "Gagal terhubung ke server",
|
|
"naCpus": "CPU tidak tersedia",
|
|
"cpuCores_one": "{{count}} Inti",
|
|
"cpuCores_other": "{{count}} Inti",
|
|
"cpuUsage": "Penggunaan CPU",
|
|
"memoryUsage": "Penggunaan Memori",
|
|
"diskUsage": "Penggunaan Disk",
|
|
"selectFilesystem": "Pilih sistem file",
|
|
"temperature": "Suhu",
|
|
"highestTemperature": "Suhu tertinggi",
|
|
"primaryTemperatureSensor": "Sensor utama",
|
|
"gpu": {
|
|
"title": "GPU",
|
|
"noDevice": "GPU NVIDIA tidak terdeteksi. Instal driver NVIDIA (yang menyediakan nvidia-smi) untuk melihat metrik GPU.",
|
|
"driver": "Pengemudi {{version}}",
|
|
"utilization": "Pemanfaatan",
|
|
"memory": "VRAM",
|
|
"temperature": "Suhu",
|
|
"power": "Kekuatan",
|
|
"fan": "Penggemar",
|
|
"processes": "Proses GPU",
|
|
"noProcesses": "Tidak ada proses yang menggunakan GPU."
|
|
},
|
|
"failedToFetchHostConfig": "Gagal mengambil konfigurasi host",
|
|
"serverOffline": "Server Offline",
|
|
"cannotFetchMetrics": "Tidak dapat mengambil metrik dari server offline.",
|
|
"totpFailed": "Verifikasi TOTP gagal",
|
|
"noneAuthNotSupported": "Host Metrics tidak mendukung tipe otentikasi 'none'.",
|
|
"noHostSelected": "Tidak ada pembawa acara yang dipilih.",
|
|
"load": "Memuat",
|
|
"systemInfo": "Informasi Sistem",
|
|
"hostname": "Nama host",
|
|
"operatingSystem": "Sistem Operasi",
|
|
"kernel": "Inti",
|
|
"seconds": "detik",
|
|
"networkInterfaces": "Antarmuka Jaringan",
|
|
"noInterfacesFound": "Tidak ditemukan antarmuka jaringan.",
|
|
"noProcessesFound": "Tidak ada proses yang ditemukan.",
|
|
"processesTotal": "total",
|
|
"processesRunning": "berlari",
|
|
"loginStats": "Statistik Login SSH",
|
|
"noRecentLoginData": "Tidak ada data login terbaru.",
|
|
"ports": {
|
|
"title": "Port Pendengaran",
|
|
"protocol": "Protokol",
|
|
"port": "Pelabuhan",
|
|
"address": "Alamat",
|
|
"process": "Proses",
|
|
"search": "Cari pelabuhan...",
|
|
"allProtocols": "Semua",
|
|
"noData": "Tidak ada data port yang mendengarkan."
|
|
},
|
|
"firewall": {
|
|
"title": "Firewall",
|
|
"inactive": "Tidak aktif",
|
|
"policy": "Kebijakan",
|
|
"rules": "aturan",
|
|
"noRules": "Tidak ada aturan dalam rantai ini",
|
|
"noData": "Tidak ada data firewall yang tersedia.",
|
|
"action": "Tindakan",
|
|
"protocol": "Proto",
|
|
"port": "Pelabuhan",
|
|
"source": "Sumber",
|
|
"anywhere": "Di mana saja",
|
|
"chains": "rantai"
|
|
},
|
|
"loadAvg": "Beban Rata-rata",
|
|
"swap": "Menukar",
|
|
"architecture": "Arsitektur",
|
|
"refresh": "Menyegarkan",
|
|
"retry": "Mencoba kembali",
|
|
"customize": "Sesuaikan tata letak",
|
|
"reset": "Mengatur ulang",
|
|
"tabLive": "Hidup",
|
|
"editModeInstructions": "Seret kartu untuk mengatur ulang, seret tepi bawah untuk mengubah ukurannya, dan gunakan tombol lebar untuk mengubah rentang kartu. Tambahkan atau hapus kartu di bawah ini.",
|
|
"managers": {
|
|
"services": "Layanan",
|
|
"processInspector": "Inspektur Proses",
|
|
"logViewer": "Penampil Log",
|
|
"cron": "Tugas Cron",
|
|
"packages": "Paket",
|
|
"ssl": "Sertifikat SSL",
|
|
"firewall": "Firewall",
|
|
"users": "Pengguna & Izin",
|
|
"healthCheck": "Pemeriksaan Kesehatan",
|
|
"diskBreakdown": "Kerusakan Disk",
|
|
"systemdTimers": "Pengatur waktu",
|
|
"topMemory": "Atas oleh Memory",
|
|
"noData": "Tidak ada data",
|
|
"sudoHint": "Tetapkan kata sandi sudo untuk host ini di editor host untuk mengaktifkan tindakan istimewa.",
|
|
"filter": "Menyaring...",
|
|
"start": "Awal",
|
|
"stop": "Berhenti",
|
|
"restart": "Mulai ulang",
|
|
"actionDone": "{{name}} diperbarui",
|
|
"actionFailed": "Tindakan gagal",
|
|
"signalSent": "Sinyal dikirim ke PID {{pid}}",
|
|
"killHint": "Klik: akhiri (SIGTERM). Klik kanan: paksa matikan (SIGKILL).",
|
|
"working": "Bekerja...",
|
|
"update": "Memperbarui",
|
|
"upgradeAll": "Tingkatkan semuanya",
|
|
"allUpToDate": "Semuanya sudah diperbarui",
|
|
"save": "Menyimpan",
|
|
"command": "Memerintah",
|
|
"enabled": "Diaktifkan",
|
|
"cronSaved": "Crontab diperbarui",
|
|
"clients": "Klien",
|
|
"dryRun": "Simulasi",
|
|
"renew": "Memperbarui",
|
|
"noAcmeClient": "Tidak ditemukan klien ACME (certbot atau acme.sh) pada host ini.",
|
|
"addInputRule": "Tambahkan aturan INPUT",
|
|
"firewallWarning": "Perubahan hanya berlaku saat runtime hingga disimpan. Berhati-hatilah agar tidak mengunci akses Anda sendiri.",
|
|
"ruleApplied": "Aturan diterapkan",
|
|
"invalidPort": "Masukkan port yang valid (1-65535)",
|
|
"newUsername": "Nama pengguna baru",
|
|
"addUser": "Menambahkan",
|
|
"deleteUser": "Hapus pengguna",
|
|
"noHealthChecks": "Belum ada pemeriksaan kesehatan yang dikonfigurasi.",
|
|
"follow": "Mengikuti",
|
|
"noLogData": "Tidak ada output log.",
|
|
"tree": "Pohon",
|
|
"enableDisable": "Aktifkan/nonaktifkan saat booting",
|
|
"grantSudo": "Berikan sudo",
|
|
"revokeSudo": "Cabut sudo",
|
|
"sslIssueCert": "Menerbitkan sertifikat",
|
|
"sslExpired": "Kedaluwarsa",
|
|
"sslInDays": "di {{days}}d",
|
|
"sslNeedDomain": "Masukkan setidaknya satu domain",
|
|
"sslIssued": "Sertifikat diterbitkan",
|
|
"sslDomainsPlaceholder": "example.com, www.example.com",
|
|
"sslHttpStandalone": "HTTP (mandiri)",
|
|
"sslHttpWebroot": "HTTP (webroot)",
|
|
"sslDns": "DNS",
|
|
"sslDnsProvider": "Penyedia DNS (misalnya Cloudflare)",
|
|
"sslIssueHint": "Kredensial penyedia DNS harus sudah dikonfigurasi pada host.",
|
|
"sslRevoke": "Cabut sertifikat",
|
|
"sslRevoked": "Sertifikat dicabut",
|
|
"sslRevokeConfirm": "Cabut dan hapus sertifikat \"{{name}}\"? Ini tidak dapat dibatalkan.",
|
|
"healthRun": "Berlari",
|
|
"healthName": "Nama",
|
|
"healthTarget": "Host / alamat",
|
|
"healthAddCheck": "Tambahkan pemeriksaan",
|
|
"healthSaved": "Pemeriksaan kesehatan tersimpan",
|
|
"healthMissingFields": "Setiap cek memerlukan nama dan target.",
|
|
"logFile": "Mengajukan",
|
|
"logUnit": "Satuan",
|
|
"logCustomPath": "Jalur khusus di bawah /var/log (opsional)",
|
|
"logGrep": "Garis filter...",
|
|
"firewallPersist": "Pertahankan aturan",
|
|
"firewallPersisted": "Aturan firewall tetap berlaku.",
|
|
"wireguard": "Pelindung Kawat",
|
|
"wgNotInstalled": "WireGuard tidak terpasang pada host ini.",
|
|
"wgNoInterfaces": "Tidak ada antarmuka WireGuard yang dikonfigurasi.",
|
|
"wgInterfaceUp": "Membesarkan",
|
|
"wgInterfaceDown": "Menurunkan",
|
|
"wgBringingUp": "Membawa {{name}} ke atas...",
|
|
"wgBringingDown": "Menurunkan {{name}}...",
|
|
"wgInterfaceUpDone": "{{name}} sudah aktif",
|
|
"wgInterfaceDownDone": "{{name}} sedang down",
|
|
"wgListenPort": "Pelabuhan",
|
|
"wgPublicKey": "Kunci publik",
|
|
"wgEndpoint": "Titik akhir",
|
|
"wgAllowedIPs": "IP yang Diizinkan",
|
|
"wgLastHandshake": "Jabat tangan terakhir",
|
|
"wgHandshakeNever": "Tidak pernah",
|
|
"wgTransfer": "Transfer",
|
|
"wgNoPeers": "Tidak ada tandingan"
|
|
}
|
|
},
|
|
"metricsHistory": {
|
|
"title": "Riwayat Metrik",
|
|
"historySuffix": "Sejarah",
|
|
"cpuMemoryDisk": "CPU / Memori / Disk",
|
|
"network": "Jaringan",
|
|
"download": "RX",
|
|
"upload": "TX",
|
|
"noData": "Tidak ada data riwayat yang tersedia untuk rentang waktu ini.",
|
|
"custom": "Kebiasaan",
|
|
"to": "ke",
|
|
"apply": "Menerapkan",
|
|
"viewHistory": "Lihat Riwayat"
|
|
},
|
|
"hosts": {
|
|
"tabHostMetrics": "Metrik Host",
|
|
"metricsCollectionLabel": "Pengumpulan Metrik",
|
|
"enableMetricsLabel": "Aktifkan Metrik",
|
|
"enableMetricsDesc": "Kumpulkan data CPU, RAM, disk, dan metrik lainnya dari host ini.",
|
|
"useGlobalMetrics": "Gunakan Interval Global",
|
|
"useGlobalMetricsDesc": "Ganti dengan interval metrik di seluruh server.",
|
|
"metricsIntervalS": "Interval Metrik (detik)",
|
|
"metricsIntervalDesc2": "Detik antara pengambilan snapshot metrik",
|
|
"excludedMountsLabel": "Dudukan yang Dikecualikan",
|
|
"monitoredMountsLabel": "Jalur yang dipantau secara khusus",
|
|
"monitoredMountsDesc": "Tambahkan jalur yang tidak terekspos sebagai mount terpisah, termasuk jalur Home Assistant yang dipasang secara bind-mount seperti /config.",
|
|
"monitoredMountPathPlaceholder": "Jalur (/config, /mnt/data)",
|
|
"monitoredMountLabelPlaceholder": "Label (opsional)",
|
|
"addMonitoredMount": "Tambahkan jalur",
|
|
"excludedMountsDesc": "Sembunyikan titik pemasangan atau jenis sistem file tertentu (misalnya nfs, cifs) dari penggunaan disk dan peringatan untuk host ini.",
|
|
"excludedMountsPlaceholder": "Jalur pemasangan (/mnt/nas) atau tipe sistem file (nfs, cifs)",
|
|
"excludedMountsEmpty": "Tidak ada mount yang dikecualikan. Semua sistem file yang terdeteksi ditampilkan.",
|
|
"addExcludedMount": "Menambahkan",
|
|
"visibleWidgets": "Widget yang Terlihat",
|
|
"widgetsMovedToHostMetrics": "Kartu sekarang ditambahkan, diatur, dan diubah ukurannya langsung di tab Metrik Host. Buka Metrik Host untuk host ini dan gunakan Sesuaikan untuk memilih kartu mana yang akan ditampilkan.",
|
|
"hostNotFound": "Host tidak ditemukan",
|
|
"loadingHost": "Memuat host..."
|
|
},
|
|
"onboarding": {
|
|
"feature_metrics": "Metrik dan peringatan",
|
|
"feature_metrics_desc": "Pantau CPU, memori, dan disk dari waktu ke waktu, dan dapatkan peringatan saat terjadi kerusakan."
|
|
},
|
|
"admin": {
|
|
"metricsHistoryRetention": "Retensi Riwayat Metrik",
|
|
"metricsHistoryRetentionRange": "1 hingga 90 hari",
|
|
"days": "hari"
|
|
},
|
|
"homepage": {
|
|
"noData": "Tidak ada data yang tersedia",
|
|
"showCurrentValue": "Tampilkan Nilai Saat Ini",
|
|
"chartMetric": "Metrik",
|
|
"metricRange": "Jangkauan",
|
|
"host": "Tuan rumah",
|
|
"loading": "Memuat...",
|
|
"metricCpu": "CPU",
|
|
"metricDisk": "Disk",
|
|
"metricHostname": "Nama host",
|
|
"metricKernel": "Inti",
|
|
"metricMemory": "Ingatan",
|
|
"metricNetwork": "Jaringan",
|
|
"metricOs": "Sistem Operasi",
|
|
"metricProcesses": "Proses",
|
|
"metricProcessesRunning": "berlari",
|
|
"metricProcessesTotal": "total",
|
|
"metricUptime": "Waktu aktif",
|
|
"metricsNotAvailable": "Metrik tidak tersedia",
|
|
"noHostSelected": "Tidak ada pembawa acara yang dipilih.",
|
|
"selectHost": "Pilih tuan rumah..."
|
|
},
|
|
"terminalStatus": {
|
|
"unavailable": "Statistik langsung tidak tersedia"
|
|
},
|
|
"dashboard": {
|
|
"cpu": "CPU",
|
|
"ram": "RAM"
|
|
},
|
|
"dashboardTab": {
|
|
"disk": "Disk"
|
|
},
|
|
"terminal": {
|
|
"connected": "Terhubung"
|
|
},
|
|
"permissions": {
|
|
"use": {
|
|
"title": "Gunakan Metrik Host",
|
|
"description": "Lihat metrik host dan gunakan pengelola host (layanan, paket, firewall, dan lainnya) pada host yang dapat Anda jangkau."
|
|
}
|
|
},
|
|
"settings": {
|
|
"admin": {
|
|
"metricsInterval": {
|
|
"label": "Interval metrik (detik)",
|
|
"description": "Seberapa sering sebuah host yang sedang dilihat diambil sampelnya, kecuali jika host tersebut menetapkan intervalnya sendiri."
|
|
},
|
|
"historyRetentionDays": {
|
|
"label": "Retensi riwayat (hari)",
|
|
"description": "Berapa lama sampel metrik disimpan untuk grafik riwayat."
|
|
},
|
|
"enabledForNewHosts": {
|
|
"label": "Metrik diaktifkan untuk host baru.",
|
|
"description": "Apakah host baru memulai dengan pengumpulan metrik yang diaktifkan."
|
|
}
|
|
},
|
|
"user": {
|
|
"temperatureUnit": {
|
|
"label": "Satuan suhu",
|
|
"description": "Bagaimana suhu ditampilkan di Host Metrics.",
|
|
"celsius": "Celsius",
|
|
"fahrenheit": "Fahrenheit"
|
|
}
|
|
},
|
|
"host": {
|
|
"metricsEnabled": {
|
|
"label": "Kumpulkan metrik"
|
|
},
|
|
"metricsInterval": {
|
|
"label": "Interval metrik (detik)"
|
|
},
|
|
"enabledWidgets": {
|
|
"label": "Widget yang diaktifkan"
|
|
},
|
|
"excludedMounts": {
|
|
"label": "Dudukan yang dikecualikan"
|
|
},
|
|
"monitoredMounts": {
|
|
"label": "Jalur yang dipantau"
|
|
}
|
|
}
|
|
},
|
|
"plugin": {
|
|
"name": "Host Metrics"
|
|
}
|
|
}
|