From 1515253f8bf127804e4721bfd9b1f1550d1f59f9 Mon Sep 17 00:00:00 2001 From: Zulfazli Date: Sun, 27 Sep 2026 17:23:50 +0700 Subject: [PATCH 1/2] Add Indonesian (id) locale for frontend i18n Translate all 10 frontend locale domains into Bahasa Indonesia (1860 keys, full parity with en). Register the bundle in locales/index.ts and i18n/index.ts, add the 'Bahasa Indonesia' language switcher label, and cover key parity with a unit test. --- src/app/App.tsx | 1 + src/i18n/index.ts | 3 +- src/i18n/locales/id/chart.json | 278 +++++ src/i18n/locales/id/common.json | 1056 +++++++++++++++++++ src/i18n/locales/id/dataLoading.json | 115 ++ src/i18n/locales/id/encoding.json | 84 ++ src/i18n/locales/id/errors.json | 38 + src/i18n/locales/id/index.ts | 26 + src/i18n/locales/id/loader.json | 116 ++ src/i18n/locales/id/messages.json | 92 ++ src/i18n/locales/id/model.json | 140 +++ src/i18n/locales/id/navigation.json | 18 + src/i18n/locales/id/upload.json | 199 ++++ src/i18n/locales/index.ts | 3 +- tests/frontend/unit/app/i18nLocales.test.ts | 5 + 15 files changed, 2172 insertions(+), 2 deletions(-) create mode 100644 src/i18n/locales/id/chart.json create mode 100644 src/i18n/locales/id/common.json create mode 100644 src/i18n/locales/id/dataLoading.json create mode 100644 src/i18n/locales/id/encoding.json create mode 100644 src/i18n/locales/id/errors.json create mode 100644 src/i18n/locales/id/index.ts create mode 100644 src/i18n/locales/id/loader.json create mode 100644 src/i18n/locales/id/messages.json create mode 100644 src/i18n/locales/id/model.json create mode 100644 src/i18n/locales/id/navigation.json create mode 100644 src/i18n/locales/id/upload.json diff --git a/src/app/App.tsx b/src/app/App.tsx index 650e237c8..74b723765 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -195,6 +195,7 @@ const LANGUAGE_LABELS: Record = { en: 'EN', zh: '中文', hi: 'हिन्दी', + id: 'Bahasa Indonesia', ja: '日本語', ko: '한국어', fr: 'FR', diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 6165166d3..2a7b1e7d8 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -4,7 +4,7 @@ import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; import LanguageDetector from 'i18next-browser-languagedetector'; -import { en, zh, hi } from './locales'; +import { en, zh, hi, id } from './locales'; // NOTE: locale JSON is ingested into the i18next store once, here, at init(). // Adding keys to a locale file requires a full page reload (not just HMR) for @@ -13,6 +13,7 @@ const resources = { en: { translation: en }, zh: { translation: zh }, hi: { translation: hi }, + id: { translation: id }, }; export const SUPPORTED_UI_LANGUAGES: readonly string[] = Object.keys(resources); diff --git a/src/i18n/locales/id/chart.json b/src/i18n/locales/id/chart.json new file mode 100644 index 000000000..ddf7d8433 --- /dev/null +++ b/src/i18n/locales/id/chart.json @@ -0,0 +1,278 @@ +{ + "chart": { + "vegaLocale": { + "dateTime": "%A, %-d %B %Y %X", + "date": "%-d/%-m/%Y", + "time": "%H:%M:%S", + "periods": [ + "PG", + "SG" + ], + "days": [ + "Minggu", + "Senin", + "Selasa", + "Rabu", + "Kamis", + "Jumat", + "Sabtu" + ], + "shortDays": [ + "Min", + "Sen", + "Sel", + "Rab", + "Kam", + "Jum", + "Sab" + ], + "months": [ + "Januari", + "Februari", + "Maret", + "April", + "Mei", + "Juni", + "Juli", + "Agustus", + "September", + "Oktober", + "November", + "Desember" + ], + "shortMonths": [ + "Jan", + "Feb", + "Mar", + "Apr", + "Mei", + "Jun", + "Jul", + "Agu", + "Sep", + "Okt", + "Nov", + "Des" + ] + }, + "derivedConcepts": "Rumus", + "dataTransformCode": "Kode transformasi data", + "dataTransformExplanation": "Penjelasan transformasi data", + "zoomIn": "perbesar", + "zoomOut": "perkecil", + "resizeSliderAria": "Skala tampilan bagan", + "saveCopy": "simpan salinan", + "duplicate": "gandakan bagan", + "delete": "hapus", + "deleteChart": "hapus bagan", + "deleteChartConfirm": "Hapus bagan ini?", + "deleteChartCancel": "batal", + "deleteChartYes": "hapus", + "sampleSize": "Ukuran sampel", + "sampleSizeAria": "Ukuran sampel", + "sampleAgain": "ambil sampel lagi!", + "chartType": "Jenis bagan", + "chartPreview": "Pratinjau bagan", + "noChart": "Tidak ada bagan yang dipilih", + "createChart": "Buat bagan untuk memulai", + "addChart": "Tambah Bagan", + "chartSettings": "Pengaturan Bagan", + "chartBuilder": "Penyusun Bagan", + "dataSource": "Sumber data", + "data": "data", + "chat": "obrolan", + "code": "kode", + "agentLog": "Log Agen", + "explain": "jelaskan", + "concepts": "rumus", + "orStartWithChartType": "buat bagan baru?", + "orCreateYourself": "atau buat sendiri?", + "emptyStateTitle": "Siap menjelajahi data Anda?", + "emptyStateSubtitle": "Ajukan pertanyaan kepada agen di obrolan — ia dapat menyarankan ide, menjelaskan data, mentransformasi data, dan membuat bagan untuk Anda.", + "emptyStateChatHint": "Coba masukkan pertanyaan di kiri bawah", + "emptyStateOrPickType": "Atau pilih jenis bagan untuk memulai secara manual", + "resample": "Ambil sampel ulang", + "adjustSampleSize": "Sesuaikan ukuran sampel: {{sampleSize}} / {{totalSize}} baris", + "log": "log", + "insight": "wawasan", + "openInVegaEditor": "Buka di Vega Editor", + "viewChartSpec": "Lihat spesifikasi bagan", + "editChart": "Ubah bagan", + "chartInsight": "Wawasan bagan", + "analyzingChart": "Menganalisis bagan...", + "regenerate": "buat ulang", + "noInsightAvailable": "Tidak ada wawasan tersedia.", + "generateInsight": "hasilkan wawasan", + "iLikeIt": "Saya suka!", + "notAnymore": "Tidak lagi", + "visualizing": "memvisualisasikan", + "sampleRows": "baris sampel", + "msgTable": "Beri tahu saya apa yang ingin Anda visualisasikan!", + "msgAuto": "Katakan sesuatu untuk mendapatkan rekomendasi bagan!", + "msgEncodingEmpty": "Letakkan kolom data ke penyusun bagan atau jelaskan keinginan Anda!", + "msgUnavailable": "Formulasikan data untuk membuat visualisasi!", + "msgSynthesizing": "Sintesis sedang berlangsung...", + "msgWarning": "Hasil buatan AI bisa tidak akurat, periksalah!", + "templateGroups": { + "table": "Tabel", + "scatter": "Sebar", + "bar": "Batang", + "map": "Peta", + "pie": "Lingkaran", + "line": "Garis", + "custom": "Kustom" + }, + "templateNames": { + "auto": "Otomatis", + "table": "Tabel", + "scatterPlot": "Diagram Pencar", + "regression": "Regresi", + "rangedDotPlot": "Diagram Titik Rentang", + "boxplot": "Boxplot", + "stripPlot": "Diagram Strip", + "barChart": "Bagan Batang", + "groupedBarChart": "Bagan Batang Berkelompok", + "stackedBarChart": "Bagan Batang Bertumpuk", + "histogram": "Histogram", + "lollipopChart": "Bagan Lolipop", + "pyramidChart": "Bagan Piramida", + "lineChart": "Bagan Garis", + "bumpChart": "Bagan Bump", + "areaChart": "Bagan Area", + "streamgraph": "Streamgraph", + "pieChart": "Bagan Lingkaran", + "roseChart": "Bagan Mawar", + "heatmap": "Peta Panas", + "waterfallChart": "Bagan Air Terjun", + "densityPlot": "Diagram Kepadatan", + "radarChart": "Bagan Radar", + "candlestickChart": "Bagan Lilin", + "usMap": "Peta AS", + "worldMap": "Peta Dunia", + "customPoint": "Titik Kustom", + "customLine": "Garis Kustom", + "customBar": "Batang Kustom", + "customRect": "Persegi Kustom", + "customArea": "Area Kustom" + }, + "chartCategoryTip": { + "points": "Bagan berbasis titik (sebar, titik, regresi)", + "bars": "Bagan batang & kolom", + "distributions": "Bagan distribusi & statistik", + "linesAndAreas": "Bagan garis & area", + "circular": "Bagan radial (lingkaran, mawar, radar)", + "tablesAndMaps": "Bagan ubin, tabel, KPI & peta", + "custom": "Jenis tanda kustom" + }, + "gallery": { + "inferredSize": "Ukuran tersimpul: {{size}}", + "warningLabel": "Peringatan:", + "copySpecVL": "Salin Spesifikasi + VL", + "copyMarkdownAgentsInputHeading": "## spesifikasi masukan agents-chart", + "copyMarkdownVegaLiteOutputHeading": "## spesifikasi keluaran vega-lite (50 baris pertama)", + "spec": "Spesifikasi", + "noTestCases": "Tidak ada kasus uji yang ditetapkan untuk \"{{chartGroup}}\"", + "echartsLabel": "ECharts", + "echartsOption": "Opsi ECharts", + "vegaLiteLabel": "Vega-Lite", + "vegaLiteSpec": "Spesifikasi Vega-Lite", + "chartJsLabel": "Chart.js", + "chartJsConfig": "Konfigurasi Chart.js", + "noSpec": "{{assembler}} tidak mengembalikan spesifikasi", + "noOption": "{{assembler}} tidak mengembalikan opsi", + "noConfig": "{{assembler}} tidak mengembalikan konfigurasi", + "noVLSpec": "Tidak ada spesifikasi VL", + "embedError": "kesalahan semat {{backend}}: {{message}}", + "assemblyError": "Kesalahan perakitan: {{message}}", + "backendError": "kesalahan {{backend}}: {{message}}", + "sectionLabels": { + "semanticContext": "Konteks Semantik", + "vegaLite": "VegaLite", + "facets": "Faset", + "stressTests": "Uji Tekanan", + "echartsBackend": "Backend ECharts", + "chartJsBackend": "Backend Chart.js", + "goFishBasic": "GoFish Dasar" + }, + "sectionDescriptions": { + "semanticContext": "Menunjukkan bagaimana anotasi tipe semantik meningkatkan keluaran bagan: pemformatan, batasan domain, pembalikan sumbu, tipe skala, dan interpolasi", + "vegaLite": "Demo untuk setiap jenis bagan yang didukung", + "facets": "Mode faset dan kombinasi fitur", + "stressTests": "Uji tekanan luapan, elastisitas, dan format temporal", + "echartsBackend": "Masukan yang sama melalui backend ECharts — bandingkan keluaran berbasis deret vs keluaran berbasis pengodean VL", + "chartJsBackend": "Masukan yang sama melalui backend Chart.js — bandingkan keluaran berbasis kumpulan data vs keluaran VL/EC", + "goFishBasic": "Semua contoh bagan GoFish dalam satu halaman" + }, + "entryLabels": { + "semanticContext": "Konteks Semantik", + "snapToBound": "Jepret-ke-Batas", + "scatterPlot": "Diagram Pencar", + "regression": "Regresi", + "barChart": "Bagan Batang", + "stackedBarChart": "Bagan Batang Bertumpuk", + "groupedBarChart": "Bagan Batang Berkelompok", + "histogram": "Histogram", + "heatmap": "Peta Panas", + "lineChart": "Bagan Garis", + "boxplot": "Diagram Kotak", + "pieChart": "Bagan Lingkaran", + "rangedDotPlot": "Diagram Titik Rentang", + "areaChart": "Bagan Area", + "streamgraph": "Streamgraph", + "lollipopChart": "Bagan Lolipop", + "densityPlot": "Diagram Kepadatan", + "bumpChart": "Bagan Bump", + "candlestickChart": "Bagan Lilin", + "waterfallChart": "Bagan Air Terjun", + "stripPlot": "Diagram Strip", + "radarChart": "Bagan Radar", + "pyramidChart": "Bagan Piramida", + "roseChart": "Bagan Mawar", + "customCharts": "Bagan Kustom", + "facetColumns": "Faset: Kolom", + "facetRows": "Faset: Baris", + "facetColsRows": "Faset: Kolom+Baris", + "facetSmall": "Faset: Kecil", + "facetWrap": "Faset: Bungkus", + "facetClip": "Faset: Potong", + "facetOverflowedCol": "Faset: Kolom Meluap", + "facetOverflowedColRow": "Faset: Kolom+Baris Meluap", + "facetOverflowedRow": "Faset: Baris Meluap", + "facetDenseLine": "Faset: Garis Padat", + "overflow": "Luapan", + "elasticityStretch": "Elastisitas & Regangan", + "discreteAxisSizing": "Ukuran Sumbu Diskret", + "gasPressure": "Tekanan Gas (§2)", + "lineAreaStretch": "Regangan Garis/Area", + "datesYear": "Tanggal: Tahun", + "datesMonth": "Tanggal: Bulan", + "datesYearMonth": "Tanggal: Tahun-Bulan", + "datesDecade": "Tanggal: Dasawarsa", + "datesDateTime": "Tanggal: Tanggal/Waktu", + "datesHours": "Tanggal: Jam", + "echartsFacetSmall": "ECharts: Faset Kecil", + "echartsFacetWrap": "ECharts: Faset Bungkus", + "echartsFacetClip": "ECharts: Faset Potong", + "echartsGauge": "ECharts: Pengukur", + "echartsFunnel": "ECharts: Corong", + "echartsTreemap": "ECharts: Treemap", + "echartsSunburst": "ECharts: Sunburst", + "echartsSankey": "ECharts: Sankey", + "echartsUniqueStress": "ECharts: Tekanan Unik", + "echartsStressTests": "ECharts: Uji Tekanan", + "chartJsScatter": "Chart.js: Sebar", + "chartJsLine": "Chart.js: Garis", + "chartJsBar": "Chart.js: Batang", + "chartJsStackedBar": "Chart.js: Batang Bertumpuk", + "chartJsGroupedBar": "Chart.js: Batang Berkelompok", + "chartJsArea": "Chart.js: Area", + "chartJsPie": "Chart.js: Lingkaran", + "chartJsHistogram": "Chart.js: Histogram", + "chartJsRadar": "Chart.js: Radar", + "chartJsRose": "Chart.js: Mawar", + "chartJsStressTests": "Chart.js: Uji Tekanan", + "goFishBasic": "GoFish Dasar" + } + } + } +} diff --git a/src/i18n/locales/id/common.json b/src/i18n/locales/id/common.json new file mode 100644 index 000000000..b5f7c462e --- /dev/null +++ b/src/i18n/locales/id/common.json @@ -0,0 +1,1056 @@ +{ + "app": { + "name": "Data Formulator", + "loading": "Memuat...", + "save": "Simpan", + "cancel": "Batal", + "close": "Tutup", + "delete": "Hapus", + "edit": "Ubah", + "create": "Buat", + "confirm": "Konfirmasi", + "back": "Kembali", + "next": "Berikutnya", + "done": "Selesai", + "reset": "Atur ulang", + "apply": "Terapkan", + "search": "Cari", + "filter": "Filter", + "sort": "Urutkan", + "copy": "Salin", + "duplicate": "Gandakan", + "download": "Unduh", + "upload": "Unggah", + "refresh": "Segarkan", + "settings": "Pengaturan", + "help": "Bantuan", + "info": "Info", + "warning": "Peringatan", + "error": "Kesalahan", + "success": "Berhasil" + }, + "common": { + "save": "Simpan" + }, + "appBar": { + "session": "Sesi", + "explore": "Jelajahi", + "reports": "Laporan", + "reportsWithCount": "Laporan ({{count}})", + "watchVideo": "Tonton Video", + "viewOnGitHub": "Lihat di GitHub", + "pipInstall": "Instal Pip", + "joinDiscord": "Gabung Discord", + "errorOccurred": "Terjadi kesalahan, silakan segarkan sesi. Jika masalah masih ada, klik tutup sesi.", + "about": "Tentang", + "app": "Aplikasi", + "data": "Data", + "moreOptions": "Opsi lainnya", + "moreLanguages": "Bahasa lainnya", + "microsoftResearch": "Microsoft Research" + }, + "logs": { + "title": "Log Backend", + "viewLogs": "Lihat log backend", + "refresh": "Segarkan", + "searchSavedState": "Cari status tersimpan (Cmd/Ctrl+F)", + "download": "Unduh log lengkap", + "empty": "Berkas log kosong." + }, + "session": { + "exportSession": "ekspor sesi", + "importSession": "impor sesi", + "saveSessionLocally": "simpan sesi secara lokal", + "databaseFile": "berkas basis data", + "containsDatabaseWarning": "Sesi ini berisi data yang tersimpan di basis data, ekspor dan muat ulang basis data untuk melanjutkan sesi nanti.", + "downloadDatabase": "unduh basis data", + "importDatabase": "impor basis data", + "databaseImportedSuccess": "Basis data berhasil diimpor", + "importFailed": "Impor gagal", + "resetSessionTitle": "Atur Ulang Sesi?", + "resetSessionWarning": "Semua konten yang belum diekspor (bagan, data turunan, konsep) akan hilang saat diatur ulang.", + "resetSessionAction": "atur ulang sesi", + "resetToDefault": "Kembalikan ke bawaan", + "saveTitle": "Simpan Sesi", + "sessionName": "Nama sesi", + "tablesWillBeSaved": "{{count}} tabel akan disimpan", + "sessionSaved": "Sesi \"{{name}}\" tersimpan", + "saveFailed": "Penyimpanan gagal", + "failedToSave": "Gagal menyimpan sesi", + "loadTitle": "Muat Sesi", + "refreshList": "Segarkan daftar sesi", + "loadingSessions": "Memuat sesi...", + "noSavedSessions": "Tidak ditemukan sesi tersimpan.", + "deleteSession": "Hapus sesi", + "sessionLoaded": "Sesi \"{{name}}\" dimuat", + "loadFailed": "Pemuatan gagal", + "failedToLoad": "Gagal memuat sesi", + "saveSession": "Simpan sesi", + "openSession": "Buka sesi...", + "quickResume": "Lanjutkan cepat", + "localFile": "berkas lokal", + "exportToFile": "Ekspor ke berkas", + "exporting": "Mengekspor...", + "sessionExported": "Sesi diekspor", + "failedToExport": "Gagal mengekspor sesi", + "importFromFile": "Impor dari berkas", + "importingFrom": "Mengimpor sesi dari {{file}}...", + "sessionImported": "Sesi diimpor dari {{file}}", + "failedToImport": "Gagal mengimpor sesi", + "resetTitle": "Atur Ulang Sesi?", + "resetWarning": "Semua konten yang belum disimpan (data, bagan, laporan) akan hilang. Pastikan menyimpan sesi Anda sebelum mengatur ulang.", + "resetAction": "Atur ulang sesi", + "resetButton": "Atur Ulang", + "cleaningWorkspace": "Membersihkan ruang kerja...", + "installLocallyHint": "Instal secara lokal untuk memakai fitur ini" + }, + "config": { + "frontend": "Frontend", + "backend": "Backend", + "defaultChartWidth": "lebar bagan bawaan", + "defaultChartHeight": "tinggi bagan bawaan", + "chartSizeRangeError": "Nilai harus antara 100 dan 1000 piksel", + "formulateTimeout": "batas waktu formulasi (detik)", + "formulateTimeoutRangeError": "Nilai harus antara 1 dan 3600 detik", + "formulateTimeoutHint": "Waktu maksimum yang diizinkan untuk proses perumusan sebelum melewati batas waktu.", + "maxRepairAttempts": "upaya perbaikan maks", + "maxRepairAttemptsRangeError": "Nilai harus antara 1 dan 5", + "maxRepairAttemptsHint": "Berapa kali LLM akan mencoba memperbaiki kode jika eksekusi kode gagal (disarankan = 1, nilai lebih tinggi dapat meningkatkan peluang berhasil tetapi lambat).", + "colorTheme": "Tema Warna", + "localRowLimit": "batas baris lokal saja", + "localRowLimitRangeError": "Nilai harus antara 100 dan 2.000.000 baris", + "localRowLimitHint": "Jumlah maksimum baris yang dipertahankan saat memuat data secara lokal (tidak tersimpan di server).", + "maxStretchFactor": "faktor regang bagan maks", + "maxStretchFactorRangeError": "Nilai harus antara 1,0 dan 5,0", + "maxStretchFactorHint": "Seberapa besar bagan dapat tumbuh melampaui ukuran dasar (1,0 = tanpa regangan, 2,0 = hingga 2×)." + }, + "landing": { + "tagline": "Jelajahi data dengan visualisasi, didukung agen AI.", + "demos": "Demo", + "demoBannerBody": "Ini situs demo! Coba contoh di bawah atau unggah berkas. Untuk bekerja dengan kumpulan data besar, menghubungkan ke basis data, menautkan folder lokal, membuat sesi analisis persisten, memakai model kustom, dan mengelola pengguna, periksa ", + "demoBannerCta": "panduan instalasi", + "demoBannerSuffix": ".", + "firstSelectModelPrefix": "Pertama, mari", + "modelTip": "Model dengan kemampuan pengodean dan multimodal yang kuat memberikan pengalaman terbaik dengan Data Formulator." + }, + "about": { + "startExploration": "Mulai Eksplorasi", + "installLocally": "Instal Secara Lokal", + "tryOnlineDemo": "Coba Demo Daring", + "video": "Video", + "github": "GitHub", + "featuresAria": "Fitur", + "feature1Title": "Hubungkan ke Data Apa Pun", + "feature1Description": "Unggah berkas, tautkan folder lokal, atau hubungkan ke basis data dan sumber cloud — Postgres, MySQL, Kusto, Cosmos DB, S3, OneLake, dan lainnya. Koneksi tersimpan tetap siap untuk lain waktu. Agen juga dapat menarik data ad-hoc dari tangkapan layar dan teks.", + "feature2Title": "Agen Data Percakapan", + "feature2Description": "Mengobrol dengan agen yang mengenal tabel Anda. Ajukan pertanyaan, minta transformasi, atau jelajahi ide — ia menalar data Anda, menjalankan kode, dan menampilkan hasil secara sebaris.", + "feature3Title": "Penyuntingan Interaktif", + "feature3Description": "Padukan UI dan bahasa alami untuk membentuk bagan. Gunakan agen penyempurnaan gaya untuk memoles tipografi, warna, dan tata letak, dapatkan rekomendasi, dan gunakan Data Threads untuk mundur atau bercabang.", + "feature4Title": "Simpan dan Bagikan", + "feature4Description": "Simpan dan pertahankan pekerjaan Anda lintas sesi. Periksa data, rumus, dan kode di balik setiap bagan, dan buat laporan untuk membagikan temuan Anda.", + "videoDemoAria": "Demonstrasi video: {{title}}", + "dataHandling": "Penanganan data:", + "dataHandlingText": "Data hanya tersimpan di peramban • Instalasi lokal menjalankan Python secara lokal; demo daring memproses di sisi server (tidak disimpan) • LLM menerima sampel kecil beserta perintah", + "researchPrototype": "Prototipe Riset dari Microsoft Research", + "installViaPipAria": "Instal Secara Lokal via pip (terbuka di tab baru)", + "watchVideoAria": "Tonton Video di YouTube (terbuka di tab baru)", + "viewGithubAria": "Lihat di GitHub (terbuka di tab baru)" + }, + "footer": { + "privacyCookies": "Privasi & Kuki", + "termsOfUse": "Syarat Penggunaan", + "contactUs": "Hubungi Kami", + "privacyCookiesAria": "Privasi & Kuki (terbuka di tab baru)", + "termsOfUseAria": "Syarat Penggunaan (terbuka di tab baru)", + "contactUsAria": "Hubungi Kami (terbuka di tab baru)" + }, + "agentRules": { + "title": "Aturan Agen", + "codingRules": "Aturan Pengodean", + "codingRulesHint": "(Aturan yang memandu agen AI saat menghasilkan kode untuk mentransformasi data dan merekomendasikan visualisasi.)", + "explorationRules": "Aturan Eksplorasi", + "explorationRulesHint": "(Aturan yang memandu agen AI saat menjelajahi kumpulan data, menghasilkan pertanyaan, dan menemukan wawasan)", + "saveCodingRules": "Simpan Aturan Pengodean", + "saveExplorationRules": "Simpan Aturan Eksplorasi" + }, + "refresh": { + "titleForTable": "Segarkan Data untuk \"{{table}}\"", + "description": "Unggah data baru untuk mengganti isi tabel saat ini. Kolom yang diperlukan:", + "installLocallyForUpload": "Instal Data Formulator secara lokal untuk mengaktifkan unggahan berkas.", + "urlPlaceholder": "Muat berkas CSV, TSV, atau JSON dari URL, misalnya https://example.com/data.json", + "urlSuffixHelper": "URL harus menaut ke berkas .csv, .tsv, atau .json", + "refreshData": "Segarkan Data", + "contentExceedsLimit": "Konten melampaui batas {{limit}}MB ({{size}}MB)", + "errorNoData": "Tidak ditemukan data dalam konten yang diunggah.", + "errorColumnCountMismatch": "Jumlah kolom tidak cocok. Diharapkan {{expected}} kolom ({{expectedNames}}), tetapi mendapat {{actual}} kolom ({{actualNames}}).", + "errorColumnNamesMismatch": "Nama kolom tidak cocok.", + "errorMissingColumns": "Hilang: {{columns}}.", + "errorUnexpectedColumns": "Tak terduga: {{columns}}.", + "errorPleaseAddData": "Silakan tempelkan data.", + "errorJsonArray": "Konten JSON harus berupa larik objek.", + "errorParsePaste": "Tidak dapat mengurai konten yang ditempel sebagai JSON atau CSV/TSV.", + "errorParseContent": "Gagal mengurai konten yang ditempel.", + "errorPleaseEnterUrl": "Silakan masukkan URL.", + "errorUrlSuffix": "URL harus menunjuk ke berkas .csv, .tsv, atau .json.", + "errorParseUrl": "Tidak dapat mengurai konten URL sebagai JSON atau CSV/TSV.", + "errorParseFile": "Tidak dapat mengurai isi berkas.", + "errorParseExcel": "Gagal mengurai berkas Excel.", + "errorUnsupportedFormat": "Format berkas tidak didukung. Gunakan berkas CSV, TSV, JSON, atau Excel.", + "errorFileTooLarge": "Berkas terlalu besar ({{size}}MB). Ukuran maksimum 5MB.", + "errorFetchUrl": "Gagal mengambil data dari URL: {{message}}", + "errorReadFile": "Gagal membaca berkas: {{message}}" + }, + "report": { + "deleteReport": "Hapus laporan", + "backToEditor": "Kembali ke editor", + "editReport": "Ubah laporan", + "doneEditing": "Selesai menyunting", + "createChartifactReport": "Buat laporan Chartifact", + "shareReportAsImage": "Bagikan laporan sebagai gambar", + "couldNotFindContent": "Tidak dapat menemukan konten laporan untuk ditangkap", + "failedToGenerateImage": "Gagal menghasilkan gambar", + "imageCopied": "Gambar laporan disalin ke papan klip! Anda kini dapat menempelkannya di mana pun untuk berbagi.", + "failedToCopyClipboard": "Gagal menyalin ke papan klip. Peramban Anda mungkin tidak mendukung fitur ini.", + "clipboardNotSupported": "Clipboard API tidak didukung di peramban Anda. Gunakan peramban modern.", + "clipboardRequiresSecureContext": "Menyalin ke papan klip memerlukan HTTPS atau localhost. Halaman HTTP ini tidak dapat mengakses Clipboard API; gunakan HTTPS, atau gunakan Unduh PNG sebagai gantinya.", + "failedToGenerateReportImage": "Gagal menghasilkan gambar laporan. Silakan coba lagi.", + "couldNotParseSvg": "Tidak dapat mengurai SVG", + "couldNotGetCanvasContext": "Tidak dapat memperoleh konteks kanvas", + "pleaseSelectChart": "Pilih setidaknya satu bagan", + "noModelSelected": "Belum ada model yang dipilih", + "failedToGenerateReport": "Gagal menghasilkan laporan", + "noResponseBody": "Tidak ada badan respons", + "errorGeneratingReport": "Kesalahan menghasilkan laporan", + "backToExplore": "kembali menjelajahi", + "viewReports": "lihat laporan", + "createA": "Buat", + "from": "dari", + "chart": "bagan", + "charts": "bagan", + "composing": "menyusun...", + "compose": "susun", + "styleLiveReport": "laporan langsung", + "styleBlogPost": "tulisan blog", + "styleSocialPost": "kiriman sosial", + "styleExecutiveSummary": "ringkasan eksekutif", + "styleShortNote": "catatan singkat", + "truncationNote": "Catatan: Sebagian tabel dipotong hingga {{maxRows}} baris untuk laporan ini. Tabel terdampak: {{list}}.", + "truncationTableEntry": "\"{{name}}\" ({{totalRows}} baris total)", + "noChartsAvailable": "Tidak ada bagan tersedia. Buat visualisasi terlebih dahulu.", + "loadingChartPreviews": "memuat pratinjau bagan...", + "noAvailableCharts": "Tidak ada bagan tersedia untuk ditampilkan. Bagan mungkin masih dimuat atau tidak tersedia.", + "createNewReport": "buat laporan baru", + "aiDisclaimer": "AI menghasilkan kiriman dari bagan yang dipilih, dan bisa tidak akurat!", + "showAllReports": "tampilkan semua laporan", + "reports": "laporan", + "createChartifact": "Buat Chartifact", + "copied": "Tersalin!", + "copyContent": "Salin konten", + "contentCopied": "Konten laporan disalin ke papan klip.", + "inspectingCharts": "memeriksa bagan...", + "inspectedCharts": "bagan yang diperiksa", + "downloadAndShare": "Unduh & bagikan", + "saveAsImage": "Simpan sebagai gambar", + "downloadPdf": "Unduh PDF", + "imageActions": "Gambar", + "copyImage": "Salin gambar ke papan klip", + "downloadPng": "Unduh PNG", + "exportPdf": "Ekspor PDF", + "pngDownloaded": "PNG diunduh", + "failedToDownloadPng": "Gagal mengunduh PNG. Silakan coba lagi.", + "pdfPrintOpened": "Dialog cetak dibuka. Pilih Simpan sebagai PDF.", + "failedToExportPdf": "Gagal mengekspor PDF. Silakan coba lagi.", + "shareImage": "Bagikan Gambar", + "createdWithAI": "dibuat dengan AI memakai", + "chartAlt": "Bagan", + "untitled": "Laporan Tanpa Judul" + }, + "db": { + "manager": "Pengelola DB", + "externalDataLoaders": "Pemuat Data Eksternal", + "localDuckDB": "DuckDB Lokal", + "noTablesAvailable": "tidak ada tabel tersedia", + "viewsWithCount": "Tampilan ({{count}})", + "cleanUnusedViews": "Bersihkan tampilan yang tak terpakai", + "refreshTableList": "Segarkan daftar tabel", + "importDatabaseFile": "Impor berkas basis data", + "exportDatabaseFile": "Ekspor berkas basis data", + "resetDatabase": "Atur ulang basis data", + "uploadTableTooltip": "unggah berkas csv/tsv ke basis data lokal", + "uploading": "mengunggah...", + "uploadTableCta": "unggah berkas csv/tsv ke basis data lokal", + "databaseEmptyHint": "Basis data kosong, segarkan daftar tabel atau impor data untuk memulai.", + "dropTable": "Hapus Tabel", + "showingFirstRows": "Menampilkan 9 baris pertama dari {{count}} baris total", + "loaded": "Dimuat", + "watchMode": "Mode Pantau", + "checkUpdatesEvery": "periksa pembaruan setiap", + "watchHint": "periksa dan segarkan data dari basis data secara otomatis pada interval berkala", + "loadTable": "Muat {{live}}Tabel", + "livePrefix": "Langsung ", + "resetConfirm": "Atur ulang basis data backend dan hapus semua tabel? Ini tidak dapat dibatalkan.", + "tableName": "Nama Tabel", + "columns": "Kolom", + "importOptions": "Opsi Impor", + "skip": "Lewati", + "full": "Penuh", + "subset": "Subset", + "dontImportTable": "Jangan impor tabel ini", + "importEntireTable": "Impor seluruh tabel", + "importSubsetTooltip": "Impor K baris pertama (dengan pengurutan opsional)", + "createSubsetOf": "Buat subset dari \"{{table}}\"", + "rowLimit": "Batas Baris (maks: {{count}} baris)", + "sortByOptional": "Urutkan Berdasarkan (opsional)", + "selectColumns": "Pilih kolom...", + "asc": "Naik", + "desc": "Turun", + "done": "Selesai", + "importSelectedTables": "Impor Tabel Terpilih ke DuckDB Lokal ({{count}})", + "importTablesFrom": "Impor tabel dari {{loader}}", + "tableFilter": "filter tabel", + "tableFilterPlaceholder": "hanya muat tabel yang mengandung kata kunci", + "refresh": "Segarkan", + "connect": "Hubungkan {{suffix}}", + "withFilter": "dengan filter", + "disconnect": "Putuskan", + "failedFetchTables": "Gagal mengambil tabel, periksa apakah server berjalan", + "failedUploadTable": "Gagal mengunggah tabel", + "failedUploadTableServer": "Gagal mengunggah tabel, periksa apakah server berjalan", + "tableRenamed": "Tabel {{original}} sudah ada. Diganti nama menjadi {{renamed}}", + "failedResetDatabase": "Gagal mengatur ulang basis data", + "failedDeleteTable": "Gagal menghapus tabel", + "failedDeleteTableServer": "Gagal menghapus tabel, periksa apakah server berjalan", + "deletedUnusedViews": "Menghapus {{count}} tampilan turunan tak terpakai: {{views}}", + "downloadDatabaseFailed": "Gagal mengunduh berkas basis data", + "confirmDeleteUnusedViews": "Apakah Anda yakin ingin menghapus tampilan turunan tak terpakai berikut?", + "confirmDeleteTableLoaded": "Apakah Anda yakin ingin menghapus {{table}}? \n {{table}} saat ini dimuat di data formulator dan akan dihapus dari basis data.", + "failedFetchLoaderTables": "Gagal mengambil tabel pemuat data: {{message}}", + "failedFetchLoaderTablesServer": "Gagal mengambil tabel pemuat data, periksa apakah server berjalan", + "successImportTables": "Berhasil mengimpor {{count}} tabel", + "failedImportSomeTables": "Gagal mengimpor sebagian tabel: {{errors}}", + "failedIngestData": "Gagal menyerap data: {{error}}", + "emptyValue": "(kosong)", + "notInstalledHint": "Belum terinstal. Jalankan: {{hint}}", + "selectDataLoader": "Pilih sumber data dari panel kiri", + "connectedSection": "Terhubung", + "availableSection": "Tersedia", + "uploadingData": "Mengunggah data...", + "rowsCount": "{{count}} baris", + "sampleRowsCount": "{{count}} baris sampel", + "loadSubset": "Muat subset", + "rowsLabel": "Baris:", + "subsetLoaded": "Subset dimuat", + "unload": "Bongkar", + "loadTableSubset": "Muat Subset Tabel", + "loadTableBtn": "Muat Tabel", + "loadWithFilters": "Muat dengan Filter", + "maxRows": "Baris maks", + "datasets": "Kumpulan data", + "dashboards": "Dasbor", + "rememberCredentials": "Ingat kredensial", + "setupDetails": "Detail penyiapan", + "askAgent": "Tanya agen", + "askAgentPrompt": "Saya butuh bantuan menyiapkan koneksi {{connector}}. Pandu saya melalui opsi yang tersedia, jelaskan yang diharapkan setiap parameter, dan bantu memecahkan masalah jika gagal.", + "setupFieldsIntro": "Berikan berikut untuk menghubungkan:", + "optional": "opsional", + "connectionTimeout": "Koneksi melewati batas waktu. Periksa kredensial Anda dan coba lagi.", + "delegatedLogin": "Masuk via layanan", + "cliLoginReady": "Masuk sebagai {{user}}. Anda siap menghubungkan.", + "cliLogin": "Masuk dengan Azure CLI", + "cliLoginCurrentAccount": "akun Anda saat ini", + "cliLoginRequired": "Masuk dengan Azure CLI sebelum menghubungkan. Jalankan `az login` di terminal, lalu buka kembali formulir ini.", + "cliNotInstalled": "Azure CLI tidak ditemukan. Instal lalu jalankan `az login` di terminal sebelum menghubungkan.", + "cliLoginFailed": "Masuk gagal. Coba jalankan perintah masuk di terminal.", + "popupBlocked": "Popup diblokir. Izinkan popup dan coba lagi.", + "tierConnection": "Koneksi", + "tierAuth": "Masuk", + "tierFilter": "Cakupan", + "tierAuthOr": "atau", + "tierAuthManual": "Masukkan kredensial secara manual", + "selectTableFromTree": "Pilih tabel dari pohon untuk dipratinjau", + "noTablesFound": "Tidak ditemukan tabel", + "localFilterPlaceholder": "Filter berdasarkan nama...", + "createConnector": "Buat Konektor", + "deleteConnector": "Hapus", + "showingPreview": "Pratinjau menampilkan {{count}} baris pertama" + }, + "connectorPreview": { + "rowCount": "{{count}} baris", + "showingPreview": "Pratinjau menampilkan {{count}} baris pertama", + "previewRowsNotice": "Pratinjau hanya menampilkan {{count}} baris pertama", + "maxRows": "Baris maks", + "addFilter": "Tambah filter", + "filterColumn": "Kolom", + "filterValue": "Nilai", + "filterValueTo": "Ke", + "filterValueSearch": "Masukkan & cari", + "filterOptionsTruncated": "Hasil dipotong, ketik untuk mempersempit", + "noValueNeeded": "Tidak perlu nilai", + "opBetween": "ANTARA", + "opContains": "MENGANDUNG", + "refreshPreview": "Pratinjau", + "noMatchingRows": "Tidak ada baris yang cocok dengan filter saat ini", + "noPreviewAvailable": "Tidak ada pratinjau tersedia", + "loaded": "Dimuat", + "unload": "Bongkar", + "loadTable": "Muat Tabel", + "sourceMetadata": "Metadata sumber", + "noSourceMetadata": "Tidak ada metadata sumber", + "columnsCount": "kolom", + "colName": "Kolom", + "colType": "Tipe", + "colDesc": "Deskripsi", + "metadataStatus": { + "synced": "Tersinkron", + "partial": "Sebagian", + "unavailable": "Tidak tersedia", + "not_synced": "Belum tersinkron" + }, + "loadInNewSession": "Muat di sesi baru" + }, + "canvas": { + "close": "Tutup kanvas" + }, + "dataThread": { + "title": "Utas Data", + "refreshNow": "Segarkan sekarang", + "watchForUpdates": "Pantau pembaruan", + "every": "setiap", + "refreshInterval": { + "1": "1 dtk", + "10": "10 dtk", + "30": "30 dtk", + "60": "1 mnt", + "300": "5 mnt", + "600": "10 mnt", + "1800": "30 mnt", + "3600": "1 jam", + "86400": "24 jam" + }, + "tableCardActionsAria": "Tindakan kartu tabel", + "attachMetadataTo": "Lampirkan metadata ke {{table}}", + "metadata": "metadata", + "metadataPlaceholder": "Lampirkan konteks atau panduan tambahan agar agen AI dapat lebih memahami dan memproses data.", + "sourceDescription": "Deskripsi sumber", + "deleteMessage": "Hapus pesan", + "editTableName": "ubah nama tabel", + "moreOptions": "opsi lainnya", + "createNewChart": "buat bagan baru", + "deleteTable": "hapus tabel", + "deleteChart": "hapus bagan", + "deleteReport": "hapus laporan", + "attachMetadata": "Lampirkan metadata", + "editMetadata": "Ubah metadata", + "refreshData": "Segarkan data", + "autoRefreshTooltip": "Segarkan otomatis setiap {{interval}} - Klik untuk mengubah interval atau berhenti memantau", + "threadIndex": "utas - {{index}}", + "continuedFromAbove": "lanjutan", + "continuesBelow": "berlanjut", + "textTurnEarlier": "{{count}} balasan sebelumnya", + "textTurnEarlier_other": "{{count}} balasan sebelumnya", + "textTurnCollapse": "Ciutkan", + "usingSources": "Memakai", + "switchingSources": "Beralih ke", + "hmm": "hmm...", + "oops": "ups...", + "completed": "selesai", + "workspace": "ruang kerja", + "thinking": "berpikir...", + "runningCode": "menjalankan kode...", + "creatingChart": "membuat bagan...", + "inspectingData": "memeriksa data sumber...", + "inspectedData": "data sumber yang diperiksa", + "inspectingChart": "membaca bagan...", + "loadingSkill": "memuat skill: {{skill}}...", + "rulesLoaded": "Membaca aturan: {{rules}}", + "knowledgeLoaded": "Membaca pengetahuan: {{knowledge}}", + "searching": "mencari...", + "listingConnectors": "Memeriksa konektor yang tersedia", + "readingConnector": "Membaca penyiapan konektor", + "producingAction": "mengeluarkan {{action}}...", + "jumpToThreadRange": "Lompat ke utas {{label}}", + "collapse": "ciutkan", + "expand": "bentangkan", + "renameTable": "Ganti nama tabel", + "addData": "tambah data", + "addMoreData": "Tambah data lagi", + "dataSources": "Sumber data", + "tablesAvailableToAgent": "{{count}} tabel tersedia untuk agen", + "tablesAvailableToAgent_other": "{{count}} tabel tersedia untuk agen", + "showAllTables": "Tampilkan semua {{count}}", + "importedTables_one": "{{count}} tabel terimpor", + "importedTables_other": "{{count}} tabel terimpor", + "importsFrom": "Impor dari {{name}}", + "showFewerTables": "Tampilkan lebih sedikit", + "earlierTurns": "{{count}} giliran sebelumnya", + "earlierTurns_other": "{{count}} giliran sebelumnya", + "hideEarlierTurns": "Sembunyikan giliran sebelumnya", + "working": "bekerja...", + "waitingForClarification": "menunggu klarifikasi...", + "emptySessionTitle": "Belum ada data di sini", + "emptySession": "Minta agen di bawah untuk memuat data. Data akan muncul di sini saat siap.", + "startingRun": "Mengerjakan permintaan Anda…", + "rename": "Ganti nama", + "refreshSettings": "Pengaturan penyegaran", + "replaceData": "Ganti data", + "viewMetadata": "Lihat metadata", + "metadataFor": "Metadata untuk {{table}}", + "derivationSummary": "Ringkasan turunan", + "noMetadata": "Tidak ada deskripsi tersedia untuk tabel ini.", + "rowsByColumns": "{{rows}}b × {{cols}}k", + "chartAlt": "bagan {{type}}", + "streamSourceLabel": "aliran", + "sourceFile": "Berkas", + "sourcePaste": "Data tempel", + "sourceUrl": "URL", + "sourceStream": "Aliran", + "sourceDatabase": "Basis data", + "sourceExample": "Contoh", + "sourceExtract": "Diekstrak", + "failedRefreshDerivedTable": "Gagal menyegarkan tabel turunan \"{{table}}\": {{message}}", + "errorRefreshingDerivedTable": "Kesalahan menyegarkan tabel turunan \"{{table}}\"", + "alsoUses": "juga memakai" + }, + "dataLoading": { + "extractingData": "mengekstrak data...", + "examples": "contoh", + "stopGeneration": "Hentikan pembuatan", + "deleteTable": "hapus tabel", + "loadingThread": "memuat - {{index}}", + "noDataSelected": "Tidak ada data dipilih", + "imageUrlPrefix": "URL Gambar: ", + "dataUrl": "URL Data", + "imageAlt": "Gambar dari {{name}}", + "extractFromImagePlaceholder": "ekstrak data dari gambar ini", + "followUpPlaceholder": "instruksi lanjutan (misalnya perbaiki tajuk, hapus total, buat 15 baris, dll.)", + "pasteContentPlaceholder": "tempel konten (situs web, gambar, blok teks, dll.) dan minta AI mengekstrak / membersihkan data darinya", + "unableToExtract": "Tidak dapat mengekstrak tabel dari respons", + "stoppedByUser": "Pembuatan dihentikan oleh pengguna", + "serverError": "Kesalahan server saat memproses data: {{message}}", + "pastedImageAlt": "Gambar ditempel {{index}}", + "uploadedImageAlt": "Gambar diunggah pengguna {{index}}", + "sampleExtractRepos": "Ekstrak repositori teratas dari https://github.com/microsoft", + "sampleExtractFromImage": "Ekstrak data dari gambar ini", + "sampleExtractGrowth": "Ekstrak data pertumbuhan dari teks", + "sampleGenerateDataset": "Buat kumpulan data dinasti UK", + "textOnlyModelWarning": "Model saat ini mungkin tidak mendukung masukan gambar. Kami akan lanjutkan dengan analisis teks saja bila perlu." + }, + "preview": { + "preview": "Pratinjau", + "removeTable": "Hapus tabel", + "rowsColumns": "{{rows}} baris × {{columns}} kolom", + "noTablesToPreview": "Tidak ada tabel untuk dipratinjau." + }, + "conceptShelf": { + "cleanUnusedFields": "bersihkan kolom yang tak terpakai", + "showAllFields": "... tampilkan semua {{count}} kolom {{group}} ▾", + "dataFields": "Kolom Data", + "fieldOperators": "operator kolom", + "openPanel": "buka panel konsep", + "hidePanel": "sembunyikan panel konsep" + }, + "chartRec": { + "skipAnswer": "Lewati", + "generateFromDescription": "Buat bagan dari deskripsi", + "getSomeIdeas": "Dapatkan ide!", + "ideasPrompt": "ide?", + "interactive": "interaktif", + "agent": "agen", + "getIdeas": "Dapatkan Ide", + "whatsNext": "Apa selanjutnya?", + "editor": "Editor", + "getIdeasForVisualization": "dapatkan ide untuk visualisasi", + "differentIdeas": "Ide yang berbeda?", + "getIdeasQuestion": "Dapatkan Ide?", + "placeholderVisualize": "apa yang ingin Anda visualisasikan?", + "placeholderVisualizeEmphasis": "✏️ apa yang ingin Anda visualisasikan?", + "defaultInterestingPromptPlaceholder": "tampilkan sesuatu yang menarik tentang data", + "placeholderFormulate": "rumuskan data", + "placeholderFormulateEmphasis": "✏️ rumuskan data", + "formulateAndOverride": "rumuskan dan timpa", + "agentWorking": "Agen sedang bekerja...", + "attachUploadFailed": "Gagal melampirkan {{name}}", + "replyPlaceholder": "Balas pertanyaan agen...", + "emptyAnalysisInputsPlaceholder": "Tekan Tab untuk menanyakan data apa saja yang tersedia untuk dimuat", + "explorePlaceholder": "Ajukan pertanyaan atau jelaskan yang ingin dijelajahi (tambah konteks dengan @)", + "explorePlaceholderSingleTable": "Ajukan pertanyaan atau jelaskan yang ingin dijelajahi", + "addMoreData": "Tambah data lagi ke ruang kerja", + "mentionTable": "Tambahkan tabel ke konteks (@)", + "searchTables": "Cari tabel...", + "noMoreTables": "Tidak ada tabel lain tersedia", + "getIdeaSuggestions": "Dapatkan saran ide", + "exploreIdeasPrompt": "Bantu saya memutuskan apa yang dijelajahi berikutnya — gunakan tindakan `clarify` untuk memberi saya 3–5 opsi, dan jangan pilihkan untuk saya dulu.\n\nSetiap opsi harus berupa arahan singkat yang dapat diklik — misalnya gali detail, beralih sudut pandang, perluas pandangan, libatkan tabel lain, atau coba teknik statistik. Tambahkan alasan satu baris yang **sangat singkat** untuk setiap opsi (maksimal 10 kata).", + "askedForRecommendations": "Apa yang sebaiknya saya jelajahi berikutnya?", + "generateReport": "Buat laporan", + "quickActions": "Tindakan cepat", + "writeReport": "Tulis laporan", + "createWorkflow": "Buat alur kerja", + "reportConversationPrompt": "Bantu saya menulis laporan dari percakapan dan data saat ini. Sarankan beberapa arahan bermanfaat untuk saya pilih sebelum menyusun draf.", + "reportPrompt": "Tulis laporan yang meringkas temuan kunci dari penjelajahan ini.", + "askedForReport": "Tulis laporan yang meringkas penjelajahan.", + "expandStarters": "Tampilkan saran", + "collapseStarters": "Sembunyikan saran", + "endConversation": "Akhiri percakapan", + "sendReply": "Kirim balasan", + "explore": "Jelajahi", + "regenerateIdeas": "Buat ulang ide", + "interruptedByRefresh": "Terputus oleh penyegaran halaman", + "generatingIdeas": "Menghasilkan ide penjelajahan...", + "progressBuildingContext": "Menyiapkan konteks data...", + "progressGenerating": "AI sedang menghasilkan saran...", + "conversationEnded": "Percakapan diakhiri pengguna.", + "explorationCancelled": "Penjelajahan dibatalkan", + "explorationTimedOut": "Penjelajahan kedaluwarsa", + "noResponseReader": "Tidak ada pembaca badan respons tersedia", + "explorationFailed": "Penjelajahan gagal: {{message}}", + "agentLost": "Agen tersesat di data.", + "couldYouClarify": "Dapatkah Anda menjelaskan?", + "clarificationTitle": "Pertanyaan", + "minimizeClarification": "Minimalkan", + "expandClarification": "Bentangkan", + "pauseClose": "Tutup (alih fokus)", + "pauseDelete": "Hapus", + "clarificationQuestionLabel": "{{index}}.", + "optionalClarification": "(opsional)", + "freeTextClarificationPlaceholder": "Ketik jawaban Anda...", + "customAnswerPlaceholder": "Atau ketik jawaban Anda sendiri...", + "freeTextClarificationHint": "Ketik jawaban Anda di kotak obrolan di bawah.", + "directClarificationLabel": "Atau jelaskan pilihan Anda secara langsung:", + "directClarificationPlaceholder": "Jelaskan yang Anda ingin agen lakukan...", + "submitClarification": "Lanjutkan", + "cancelClarification": "Batal", + "invalidClarification": "Agen mengembalikan permintaan klarifikasi yang tidak valid.", + "invalidExplanation": "Agen mengembalikan penjelasan yang tidak valid.", + "explanationTitle": "Penjelasan", + "explanationFollowupsLabel": "Kemungkinan langkah berikutnya:", + "delegateTitle": "Agen berikutnya yang disarankan", + "delegateMinimize": "Minimalkan", + "delegateExpand": "Bentangkan", + "delegateDismiss": "Abaikan", + "delegateToDataLoading": "Cari di Pemuatan Data", + "delegateToReportGen": "Buat laporan", + "errorDuringExploration": "Kesalahan saat penjelajahan", + "explorationStep": "Langkah penjelajahan {{step}}: {{question}}", + "emptyAnalysisInputsPrompt": "Data apa yang tersedia untuk dimuat?", + "threadExplorePrompt": "Jelajahi pola dan tren menarik dalam data ini", + "explorationThreadDeriveDescription": "Turunkan dari {{source}} dengan instruksi: {{instruction}}", + "explorationStepCodeComment": "# Langkah penjelajahan {{step}}", + "maxIterationsReached": "Mencapai jumlah maksimum langkah penjelajahan." + }, + "dataGrid": { + "loading": "Memuat ...", + "sortBy": "Urutkan berdasarkan {{label}}", + "rowCount": "{{count}} baris", + "columnCount_one": "{{count}} kolom", + "columnCount_other": "{{count}} kolom", + "filename": "nama berkas: {{name}}", + "loadedOfTotal": "{{loaded}} / {{total}} baris", + "viewRandomRows": "lihat 10000 baris acak dari tabel ini", + "restoreOrder": "Kembalikan urutan semula", + "downloadAsCsv": "Unduh sebagai CSV", + "downloading": "Mengunduh...", + "columnMenu": { + "openMenu": "Opsi kolom", + "sortAsc": "Urutkan menaik", + "sortDesc": "Urutkan menurun", + "clearSort": "Hapus pengurutan", + "filter": "Filter…", + "filterActive": "Filter (aktif)", + "clearFilter": "Hapus filter", + "filterComingSoon": "UI filter segera hadir." + }, + "filter": { + "from": "Dari", + "to": "Ke", + "includeBlanks": "Tampilkan yang kosong", + "showBlanksOnly": "Hanya tampilkan yang kosong", + "contains": "Mengandung…", + "blank": "(kosong)", + "apply": "Terapkan", + "clear": "Hapus filter", + "search": "Cari nilai", + "selectAll": "(Pilih semua)", + "noMatches": "Tidak ada nilai yang cocok", + "distinctHint": "{{count}} nilai berbeda", + "sectionSort": "Urutkan", + "sectionFilter": "Filter", + "filterApplied": "Filter diterapkan", + "summaryRows": "{{count, number}} baris", + "summaryDistinct": "{{count, number}} berbeda", + "summaryBlanks": "{{count, number}} kosong" + } + }, + "chatDialog": { + "noHistory": "Belum ada riwayat percakapan", + "you": "Anda", + "assistant": "Asisten", + "agentLog": "Log Agen", + "truncatedPreview": "Konten diciutkan. Bentangkan untuk melihat pesan lengkap.", + "expandFullMessage": "Bentangkan pesan lengkap ({{count}} karakter)", + "collapseFullMessage": "Ciutkan pesan lengkap" + }, + "dataView": { + "breadcrumb": "remah roti" + }, + "auth": { + "loginTitle": "Masuk ke Data Formulator", + "loginSubtitle": "Hubungkan akun Superset Anda untuk mengakses kumpulan data, atau lanjutkan sebagai tamu.", + "username": "Nama pengguna", + "password": "Kata sandi", + "signIn": "Masuk", + "signingIn": "Masuk...", + "continueAsGuest": "Lanjutkan sebagai Tamu", + "guestDescription": "Unggah kumpulan data Anda sendiri tanpa akun Superset.", + "loginFailed": "Masuk gagal: {{message}}", + "or": "atau", + "supersetConnection": "Koneksi Superset", + "connectedAs": "Masuk sebagai {{name}}", + "signOut": "Keluar", + "signOutConfirm": "Keluar dan hapus data sesi?", + "notConfigured": "Superset belum dikonfigurasi. Melanjutkan dalam mode tamu.", + "ssoLogin": "Masuk SSO", + "ssoLoggingIn": "Masuk via SSO...", + "ssoDescription": "Masuk dengan akun perusahaan Anda via Single Sign-On", + "ssoPopupBlocked": "Popup diblokir. Izinkan popup untuk situs ini.", + "ssoFailed": "Masuk SSO gagal: {{message}}", + "ssoOrPassword": "atau masuk dengan akun Superset", + "completingLogin": "Menyelesaikan masuk…", + "idpRedirecting": "Mengalihkan dari SSO, mohon tunggu…", + "callbackFailed": "Callback masuk gagal: {{message}}", + "ssoErrorAccessDenied": "Otorisasi dibatalkan. Jika Anda ingin memakai SSO, silakan coba masuk lagi.", + "ssoErrorInvalidState": "Sesi SSO kedaluwarsa atau terputus. Silakan coba masuk lagi.", + "ssoErrorInvalidClient": "Kredensial klien SSO salah. Hubungi administrator Anda untuk memverifikasi konfigurasi.", + "ssoErrorTokenExchange": "Masuk SSO gagal saat pertukaran token. Coba lagi atau hubungi administrator Anda.", + "ssoErrorMissingEndpoint": "SSO belum dikonfigurasi dengan benar (endpoint token hilang). Hubungi administrator Anda.", + "ssoErrorGeneric": "Masuk SSO gagal. Coba lagi atau hubungi administrator Anda.", + "sessionExpired": "Sesi kedaluwarsa. Silakan masuk lagi.", + "silentRenewFailed": "Penyegaran token latar gagal. Mengalihkan ke masuk…", + "migration": { + "title": "Impor Data Sebelumnya?", + "description": "Anda sebelumnya bekerja secara anonim dan memiliki {{count}} ruang kerja berisi data. Apakah Anda ingin mengimpornya ke akun Anda?", + "importButton": "Impor Data", + "freshButton": "Mulai Baru", + "importing": "Mengimpor ruang kerja…", + "success": "Berhasil mengimpor {{count}} ruang kerja.", + "failed": "Impor gagal: {{message}}" + } + }, + "supersetPanel": { + "datasets": "Kumpulan data", + "dashboards": "Dasbor" + }, + "supersetDashboard": { + "title": "Dasbor Superset", + "searchPlaceholder": "Cari dasbor...", + "noDashboards": "Tidak ditemukan dasbor.", + "noDatasetsInDashboard": "Tidak ada kumpulan data dalam dasbor ini." + }, + "workspace": { + "sessions": "Sesi", + "refreshList": "Segarkan daftar", + "deleteSession": "Hapus sesi", + "delete": "Hapus", + "cancel": "Batal", + "close": "Tutup", + "newSession": "+ Sesi Baru", + "loadingSessions": "Memuat sesi...", + "active": "(aktif)", + "openingWorkspace": "Membuka ruang kerja...", + "openedSession": "Membuka sesi \"{{name}}\"", + "failedToOpenWorkspace": "Gagal membuka ruang kerja", + "expiredReadOnly": "Sesi sementara ini telah kedaluwarsa di server. Anda melihat snapshot peramban hanya-baca.", + "deletedSession": "Menghapus sesi \"{{name}}\"", + "sessionTooltip": "Sesi: {{name}}", + "newSessionTooltip": "Sesi Baru", + "exit": "Keluar", + "exitSessionTooltip": "Keluar sesi", + "recoveredSession": "Sesi Terpulihkan", + "errorOccurred": "Terjadi kesalahan, silakan", + "refreshSession": "segarkan sesi", + "errorPersistHint": "Jika masalah masih ada, klik tutup sesi.", + "yourSessions": "Sesi Anda", + "rename": "Ganti nama", + "export": "Ekspor", + "importZip": "Impor ruang kerja (.zip)", + "importingFile": "Mengimpor {{name}}...", + "deleteTitle": "Hapus sesi?", + "deleteConfirm": "Ini akan menghapus permanen {{name}} ({{id}}) dan seluruh datanya.", + "deleteFailed": "Gagal menghapus ruang kerja", + "renameFailed": "Gagal mengganti nama ruang kerja", + "exportFailed": "Gagal mengekspor ruang kerja", + "importFailed": "Gagal mengimpor ruang kerja", + "sortNewest": "terbaru", + "sortOldest": "terlama", + "sortRecentlyModified": "baru diubah", + "sortName": "nama", + "sortNewestFirst": "terbaru dulu", + "sortOldestFirst": "terlama dulu", + "sortRecentlyModifiedFirst": "baru diubah", + "sortNameAsc": "nama (a–z)", + "sortSessions": "Urutkan sesi" + }, + "supersetCatalog": { + "title": "Kumpulan Data Superset", + "searchPlaceholder": "Cari kumpulan data...", + "loadDataset": "Muat", + "loadOverwrite": "Muat & Timpa", + "loadAsNewTip": "Muat sebagai tabel baru dengan alias", + "createNewDataset": "Buat Kumpulan Data Baru", + "loading": "Memuat kumpulan data...", + "loadingDataset": "Memuat kumpulan data...", + "noDatasets": "Tidak ditemukan kumpulan data.", + "columns": "{{count}} kolom", + "rows": "{{count}} baris", + "database": "Basis data", + "schema": "Skema", + "loadSuccess": "Kumpulan data \"{{name}}\" berhasil dimuat ({{count}} baris).", + "loadFailed": "Gagal memuat kumpulan data: {{message}}", + "refresh": "Segarkan", + "aliasPlaceholder": "Alias tabel (opsional)", + "suffixDialogTitle": "Masukkan Akhiran Nama Kumpulan Data", + "suffixDialogDesc": "Tentukan akhiran untuk kumpulan data \"{{name}}\". Kumpulan akan dimuat ke panel kanan dengan nama baru.", + "suffixPlaceholder": "Masukkan akhiran", + "suffixPreview": "Nama tabel akhir", + "cancel": "Batal", + "confirmLoad": "Konfirmasi & Muat", + "rowLimitTip": "Baris maks untuk dimuat" + }, + "tableSelection": { + "noTables": "Tidak ada tabel tersedia.", + "loadDataset": "muat kumpulan data", + "loadInNewSession": "muat di sesi baru", + "fromSource": "[dari {{source}}]" + }, + "interaction": { + "askedForClarification": "meminta klarifikasi", + "gaveExplanation": "membagikan penjelasan", + "delegatedToDataLoading": "menyarankan memuat lebih banyak data", + "delegatedToReportGen": "menyarankan membuat laporan", + "delegateLabelDataLoading": "Data yang disarankan", + "delegateLabelReportGen": "Laporan yang disarankan", + "clarificationNeeded": "Menunggu tindakan" + }, + "concepts": { + "showFewer": "Tampilkan lebih sedikit rumus", + "showAll": "Tampilkan semua rumus", + "showFirstN": "Tampilkan {{count}} rumus pertama", + "showAllN": "Tampilkan semua {{count}} rumus" + }, + "dataframe": { + "columnCount": "{{count}} kolom" + }, + "editor": { + "bold": "Tebal (⌘B)", + "italic": "Miring (⌘I)", + "heading1": "Tajuk 1", + "heading2": "Tajuk 2", + "bulletList": "Daftar Bullet", + "numberedList": "Daftar Bernomor", + "quote": "Kutipan", + "generating": "Menghasilkan…", + "writingReport": "Menulis laporan Anda…", + "workingTitle": "Mengerjakan laporan Anda" + }, + "sidebar": { + "openDataSources": "Sumber Data", + "openUpload": "Unggah data", + "openDataLoadingChat": "Tambah data dengan agen", + "openDataConnectors": "Konektor data", + "uploadData": "Unggah Data", + "dataConnectorsTitle": "Konektor Data", + "dataSources": "Sumber Data", + "sessions": "Sesi", + "collapse": "Ciutkan", + "loadData": "Muat data", + "dataConnectors": "Konektor data", + "refreshCatalog": "Segarkan", + "refresh": "Segarkan data", + "emptyTree": "Tidak ditemukan tabel", + "addConnector": "Tambah konektor data", + "add": "Tambah", + "new": "Baru", + "import": "Impor", + "connectDataSource": "Hubungkan sumber data", + "browseInDataView": "Jelajahi di tampilan data", + "connectConnector": "Hubungkan", + "linkLocalFolder": "Tautkan folder lokal", + "newSession": "Sesi baru", + "importSession": "Impor sesi", + "noSessions": "Tidak ada sesi tersimpan", + "tableCount": "{{count}} tabel", + "chartCount": "{{count}} bagan", + "andMore": "+{{count}} lainnya", + "emptyWorkspace": "Ruang kerja kosong", + "unableToLoadInfo": "Tidak dapat memuat info", + "openingWorkspace": "Membuka ruang kerja...", + "sessionDeleted": "Sesi dihapus", + "failedDeleteSession": "Gagal menghapus sesi", + "loadedTable": "Memuat tabel \"{{name}}\"", + "loadedTableTruncated": "Memuat {{count}} baris dari \"{{name}}\" (batas baris tercapai, sumber mungkin punya lebih banyak data)", + "failedLoadTable": "Gagal memuat \"{{name}}\": {{error}}", + "refreshedTable": "Menyegarkan \"{{name}}\"", + "currentSession": "Sesi saat ini", + "currentSessionWithDate": "Sesi saat ini · {{date}}", + "clickToOpen": "Klik untuk membuka", + "previewRowCount": "{{count}} baris", + "previewColumnsHeader": "Kolom ({{count}})", + "noPreviewAvailable": "Tidak ada pratinjau tersedia", + "alreadyLoaded": "Sudah dimuat", + "maxRows": "Baris maks", + "allRows": "Semua", + "loadingEllipsis": "Memuat...", + "loadWithFilters": "Muat dengan Filter", + "load": "Muat", + "disconnectConnector": "Putuskan", + "connectorConnected": "Terhubung ke \"{{name}}\"", + "failedConnectConnector": "Gagal menghubungkan", + "connectorDisconnected": "Konektor \"{{name}}\" diputus", + "failedDisconnectConnector": "Gagal memutuskan konektor", + "failedSearchConnector": "Gagal mencari {{connector}}", + "deleteConnector": "Hapus konektor", + "deleteConnectorTitle": "Hapus konektor", + "deleteConnectorConfirm": "Apakah Anda yakin ingin menghapus \"{{name}}\"? Data yang diimpor tidak akan terdampak.", + "connectorDeleted": "Konektor \"{{name}}\" dihapus", + "failedDeleteConnector": "Gagal menghapus konektor", + "deletingEllipsis": "Menghapus...", + "deleteConfirmBtn": "Hapus", + "searchTables": "Cari tabel...", + "addFilter": "Tambah filter", + "filterColumn": "Kolom", + "filterValue": "Nilai", + "filterValueTo": "Ke", + "filterValueSearch": "Masukkan untuk mencari", + "filterOptionsTruncated": "Hasil dipotong, ketik untuk mempersempit", + "noValueNeeded": "Tidak perlu nilai", + "opBetween": "ANTARA", + "opContains": "MENGANDUNG", + "refreshPreview": "Pratinjau", + "noMatchingRows": "Tidak ada baris yang cocok dengan filter saat ini", + "knowledge": "Pengetahuan", + "metadataPartial": "Metadata sebagian", + "metadataUnavailable": "Metadata tidak tersedia", + "largeTableChatPrompt": "Saya ingin memuat tabel berikut dari \"{{connector}}\": {{tables}}. Tabel ini terlalu besar untuk diimpor penuh: {{large}}. Bantu saya memuat subset yang difilter, disampel, atau diagregat alih-alih seluruh tabel.", + "semanticFieldCounts": "{{measures}} ukuran · {{dimensions}} dimensi", + "semanticModelSummary": "Model semantik · {{measures}} ukuran · {{dimensions}} dimensi", + "semanticSampleCaption": "Sampel: beberapa ukuran berdasarkan beberapa dimensi", + "semanticAddToWorkspace": "Tambahkan ke ruang kerja", + "semanticTag": "model", + "openInDataView": "Buka di tampilan data", + "saving": "Menyimpan...", + "rename": "Ganti nama", + "exportSession": "Ekspor", + "exportFailed": "Gagal mengekspor sesi", + "importFailed": "Gagal mengimpor ruang kerja", + "failedRenameSession": "Gagal mengganti nama sesi", + "sortNewest": "terbaru", + "sortOldest": "terlama", + "sortRecentlyModified": "baru diubah", + "sortName": "nama", + "sortNewestFirst": "terbaru dulu", + "sortOldestFirst": "terlama dulu", + "sortRecentlyModifiedFirst": "baru diubah", + "sortNameAsc": "nama (a–z)", + "sortSessions": "Urutkan sesi", + "organizeSessions": "Kelompokkan dan urutkan sesi", + "groupSessions": "Kelompok", + "groupBySource": "Sumber data", + "groupSourceShort": "Sumber", + "noGrouping": "Tanpa pengelompokan", + "sourceUpload": "Unggahan", + "sourceExampleDatasets": "Kumpulan data contoh", + "sourceNoData": "Tidak ada data", + "sourceOther": "Lainnya", + "runCatalogSearch": "Cari", + "clearCatalogSearch": "Hapus pencarian", + "timeJustNow": "baru saja", + "timeMinutes": "{{count}}mnt", + "timeHours": "{{count}}jam", + "timeYesterday": "kemarin", + "timeDays": "{{count}}h" + }, + "knowledge": { + "title": "Pengetahuan Agen", + "rules": "Aturan", + "workflows": "Alur Kerja", + "rulesDescription": "Batasan dan standar yang harus diikuti agen", + "workflowsDescription": "Alur kerja analisis yang dapat digunakan kembali, diringkas dari sesi sebelumnya agar agen dapat menyimpan dan memutar ulang", + "newItem": "Baru", + "search": "Cari", + "searchPlaceholder": "Cari pengetahuan...", + "noItems": "Belum ada item", + "noSearchResults": "Tidak ditemukan hasil", + "editTitle": "Ubah Pengetahuan", + "fileName": "Nama berkas", + "fileNamePlaceholder": "misalnya aturan-saya.md", + "content": "Konten", + "tags": "Tag", + "tagsPlaceholder": "Tag dipisah koma", + "source": "Sumber", + "sourceManual": "Manual", + "sourceAgent": "Diringkas agen", + "save": "Simpan", + "saving": "Menyimpan...", + "saved": "Pengetahuan tersimpan", + "deleted": "Pengetahuan dihapus", + "deleteConfirm": "Hapus \"{{title}}\"?", + "deleteConfirmBody": "Tindakan ini tidak dapat dibatalkan.", + "failedToLoad": "Gagal memuat pengetahuan", + "failedToSave": "Gagal menyimpan pengetahuan", + "failedToDelete": "Gagal menghapus pengetahuan", + "failedToSearch": "Pencarian gagal", + "saveAsExperience": "Simpan sebagai Alur Kerja", + "saveAsExperienceTitle": "Simpan sebagai Alur Kerja", + "distillHint": "Ringkas alur kerja dari analisis ini agar agen dapat menyimpan dan memutar ulang di sesi mendatang.", + "distillFromHeading": "Ringkas dari", + "distillFromCaption": "Utas di bawah akan dikirim ke LLM. Klik utas untuk memeriksa peristiwanya.", + "distillingOverlay": "Menyarikan alur kerja… ini mungkin perlu waktu.", + "userInstruction": "Instruksi pengguna (opsional)", + "userInstructionPlaceholder": "yang difokuskan, yang dilewati…", + "distillationInstructions": "Instruksi penyarian (opsional)", + "distillationInstructionsPlaceholder": "misalnya fokus pada langkah pembersihan data; lewati variasi bagan eksploratif; tekankan jebakan saat menggabung tabel…", + "distillWorkflow": "Ringkas Alur Kerja", + "distillStarted": "Menyarikan alur kerja...", + "distilling": "Menyarikan alur kerja...", + "distilled": "Alur kerja tersimpan", + "distillFailedRetry": "Penyimpanan gagal, coba lagi", + "failedToDistill": "Gagal menyarikan alur kerja", + "distillSessionTitle": "Ringkas Alur Kerja Sesi", + "updateSessionTitle": "Perbarui Alur Kerja Sesi", + "distillSessionHint": "Ringkas analisis ini menjadi dokumen alur kerja yang dapat digunakan kembali dan diputar ulang oleh agen.", + "distillSessionUpdateHint": "Ringkas kembali analisis ini ke dokumen alur kerja yang ada.", + "distillSessionNothing": "Belum ada utas analisis selesai di sesi ini.", + "distillFromSession": "Ringkas dari sesi ini", + "workflowPlaceholderHint": "Simpan analisis ini sebagai alur kerja", + "updateFromSession": "Perbarui dari sesi ini", + "updateFromSessionHint": "Segarkan dengan pelajaran baru", + "addNewRule": "Tambah aturan baru", + "addNewRuleHint": "Tetapkan konvensi untuk agen", + "updateSession": "Perbarui", + "updateSessionTooltip": "Perbarui dari sesi ini", + "sessionStatsLine": "sesi · {{threads}} utas · {{steps}} langkah", + "threadHeader": "Utas {{idx}} · {{label}}", + "threadStepBadge": "{{steps}} langkah", + "itemCount": "({{count}})", + "collapse": "Ciutkan", + "expand": "Bentangkan", + "emptyState": "Tambahkan aturan atau alur kerja agar agen AI bekerja lebih baik.", + "rulesHint": "Berikan aturan yang harus diikuti agen.", + "workflowsHint": "Ringkas analisis menjadi alur kerja yang dapat digunakan kembali. Putar ulang dalam konteks baru.", + "markdownEditor": "Editor Markdown", + "description": "Deskripsi", + "descriptionPlaceholder": "Ringkasan singkat aturan ini (maks {{max}} karakter)", + "alwaysApply": "Selalu dimuat ke AI", + "alwaysApplyHint": "Jika diaktifkan, aturan ini selalu disuntikkan ke setiap perintah agen AI, apa pun konteksnya", + "charCount": "{{current}} / {{max}}", + "charCountExceeded": "Melampaui batas {{max}} karakter ({{current}} / {{max}})", + "replay": "Putar ulang", + "replayTooltip": "Putar ulang analisis ini pada data saat ini", + "replayBusy": "Agen sedang sibuk — tunggu hingga selesai sebelum memutar ulang.", + "replayNoData": "Muat kumpulan data sebelum memutar ulang alur kerja.", + "replayStarted": "Memutar ulang alur kerja pada data saat ini…", + "deleteItem": "Hapus", + "threadExpand": "Bentangkan utas", + "threadCollapse": "Ciutkan utas", + "replayPrompt": "Reproduksi alur kerja analisis berikut pada data yang sedang dimuat. Ikuti langkah berurutan, sesuaikan acuan kolom dengan kolom yang tersedia di kumpulan data saat ini. Tidak apa jika hasilnya tidak identik — reproduksi analisis keseluruhan yang sama.\n\nSebelum membuat asumsi besar, periksa apakah data saat ini benar-benar dapat mendukung alur kerja. Jika ada perbedaan besar — misalnya kolom atau ukuran wajib hilang, granularitas atau bentuk sangat berbeda, atau suatu langkah tidak punya padanan yang masuk akal pada data ini — jeda dan minta saya mengonfirmasi cara melanjutkan (atau jelaskan singkat ketidakcocokan dan adaptasi yang Anda usulkan) alih-alih menebak. Perbedaan kecil (nama kolom diganti, kolom tambahan) dapat diadaptasi diam-diam.\n\n{{content}}" + } +} diff --git a/src/i18n/locales/id/dataLoading.json b/src/i18n/locales/id/dataLoading.json new file mode 100644 index 000000000..29cb2553e --- /dev/null +++ b/src/i18n/locales/id/dataLoading.json @@ -0,0 +1,115 @@ +{ + "dataLoading": { + "title": "Asisten Pemuatan Data", + "subtitle": "Saya dapat membantu Anda mengekstrak, membuat, atau menjelajahi data — atau tanyakan saja apa pun.", + "capabilityAsk": "Ajukan pertanyaan tentang sumber data Anda yang terhubung", + "capabilitySearch": "Cari dan jelajahi kumpulan data contoh pilihan", + "capabilityExtractImage": "Ekstrak data terstruktur dari gambar", + "capabilityExtractFile": "Ekstrak data dari PDF atau teks tempel", + "capabilityHint": "Mulai mengetik di kolom di bawah untuk melihat contoh perintah.", + "newRequestDivider": "Permintaan baru", + "continueFromSection": "Lanjutkan dari bagian ini", + "continueTask": "Lanjutkan", + "previewShowingRows": "Menampilkan {{shown}} dari {{total}} baris", + "previewShowingFirstRows": "Menampilkan {{shown}} baris pertama", + "sectionTry": "Coba tugas", + "sectionChat": "Atau tanyakan saja", + "chatHint": "", + "chatHintExample": "Data apa yang kita miliki di sini?", + "placeholder": "Jelaskan data untuk diekstrak, diunggah, atau dibuat...", + "attachTooltip": "Lampirkan berkas atau gambar", + "stopTooltip": "Hentikan pembuatan", + "sendTooltip": "Kirim (Enter)", + "shiftEnterHint": "Shift+Enter untuk baris baru", + "canvasConnection": "Penyiapan koneksi", + "canvasLoadPlan": "Rencana pemuatan tabel", + "canvasClose": "Tutup", + "canvasOpen": "Buka", + "canvasView": "Lihat", + "canvasReview": "Tinjau", + "canvasConnectCaption": "Isi detail koneksi", + "canvasPlanCaption": "{{count}} tabel diusulkan", + "canvasPlanLoaded": "Dimuat", + "canvasRow": "{{formatted}} baris", + "canvasRows": "{{formatted}} baris", + "canvasSourceLabel": "sumber", + "canvasPythonSource": "Python", + "canvasExtractedSource": "Diekstrak", + "canvasMoreTables": "+{{count}} lainnya", + "load": "Muat", + "loadTable": "Muat tabel", + "loadAllTables": "Muat semua {{count}} tabel", + "ranPythonCode": "Menjalankan kode Python", + "error": "kesalahan", + "rows": "baris", + "cols": "kolom", + "showRawData": "Tampilkan data pesan mentah", + "stopped": "— dihentikan", + "uploaded": "[Diunggah: {{name}}]", + "defaultImageMessage": "Ekstrak data dari gambar ini", + "syncInProgress": "Menyinkronkan metadata katalog…", + "syncComplete": "Sinkronisasi katalog selesai", + "syncPartial": "Sinkronisasi katalog selesai sebagian — sebagian metadata mungkin hilang", + "metadataStatusSynced": "Tersinkron", + "metadataStatusPartial": "Sebagian", + "metadataStatusUnavailable": "Tidak tersedia", + "metadataStatusNotSynced": "Belum tersinkron", + "loadPlan": { + "filters": "Filter", + "filtersLabel": "Filter:", + "rowLimit": "Batas baris", + "loadSelected": "Muat yang dipilih", + "loadInNewWorkspace": "Muat di ruang kerja baru", + "addToCurrent": "Tambahkan ke ruang kerja saat ini", + "loadedCount": "✓ Memuat {{count}} tabel", + "loadedCount_plural": "✓ Memuat {{count}} tabel", + "preview": "Pratinjau", + "hidePreview": "Sembunyikan", + "previewing": "Mempratinjau...", + "previewFailed": "Pratinjau gagal", + "retryPreview": "Coba lagi", + "reconnectAndRetry": "Hubungkan ulang", + "fromSource": "dari" + }, + "operation": { + "virtualSource": "{{name}}: Sumber virtual (baris tetap jarak jauh)", + "title": "Opsi pemuatan data", + "previewHeading": "Tabel untuk dimuat", + "previewGuide": "Pratinjau setiap tabel sebelum ditambahkan ke ruang kerja Anda.", + "previewColumns": "{{count}} kolom", + "previewColumns_plural": "{{count}} kolom", + "previewShowingRows": "menampilkan {{count}} baris", + "previewShowingRows_plural": "menampilkan {{count}} baris", + "previewUnavailable": "Pratinjau tidak tersedia", + "reconnectSource": "Periksa koneksi", + "failedSteps": "{{count}} tabel tidak dapat dimuat", + "failedSteps_plural": "{{count}} tabel tidak dapat dimuat", + "partialFailure": "Sebagian data dimuat, tetapi {{count}} tabel gagal.", + "partialFailure_plural": "Sebagian data dimuat, tetapi {{count}} tabel gagal." + }, + "toolLabels": { + "readingFile": "Membaca berkas", + "writingFile": "Menulis berkas", + "listingFiles": "Mencantumkan berkas", + "runningPython": "Menjalankan Python", + "preparingPreview": "Menyiapkan pratinjau", + "summarizingSources": "Meringkas data yang terhubung", + "browsingCatalog": "Menjelajahi katalog", + "searchingData": "Mencari", + "describingData": "Membaca tabel", + "probingData": "Memeriksa", + "proposingLoadPlan": "Mengusulkan rencana pemuatan" + }, + "examples": { + "extractFromImage": "Ekstrak data dari gambar", + "extractFromImageExample": "Ekstrak data pendapatan dari gambar ini", + "extractFromText": "Ekstrak data dari teks", + "extractFromTextExample": "Ekstrak data pertumbuhan pendapatan dari teks ini: Sorotan Bisnis ...", + "extractFromTextPrompt": "Extract revenue growth data from this text:\n\nBusiness Highlights\n\nMicrosoft Cloud revenue was $51.5 billion and increased 26% (up 24% in constant currency), and commercial remaining performance obligation increased 110% to $625 billion.\n\nRevenue in Productivity and Business Processes was $34.1 billion and increased 16% (up 14% in constant currency), with the following business highlights:\n\n· Microsoft 365 Commercial cloud revenue increased 17% (up 14% in constant currency)\n\n· Microsoft 365 Consumer cloud revenue increased 29% (up 27% in constant currency)\n\n· LinkedIn revenue increased 11% (up 10% in constant currency)\n\n· Dynamics 365 revenue increased 19% (up 17% in constant currency)\n\nRevenue in Intelligent Cloud was $32.9 billion and increased 29% (up 28% in constant currency), with the following business highlights:\n\n· Azure and other cloud services revenue increased 39% (up 38% in constant currency)\n\nRevenue in More Personal Computing was $14.3 billion and decreased 3%, with the following business highlights:\n\n· Windows OEM and Devices revenue increased 1% (relatively unchanged in constant currency)\n\n· Xbox content and services revenue decreased 5% (down 6% in constant currency)\n\n· Search and news advertising revenue excluding traffic acquisition costs increased 10% (up 9% in constant currency)\n\nMicrosoft returned $12.7 billion to shareholders in the form of dividends and share repurchases in the second quarter of fiscal year 2026, an increase of 32% compared to the second quarter of fiscal year 2025.", + "generateSynthetic": "Buat data sintetis", + "generateSyntheticExample": "Buat kumpulan data dinasti UK dengan 20 baris", + "browseSamples": "Jelajahi kumpulan data contoh", + "browseSamplesExample": "Kumpulan data contoh apa yang tersedia?" + } + } +} diff --git a/src/i18n/locales/id/encoding.json b/src/i18n/locales/id/encoding.json new file mode 100644 index 000000000..3eb5cffa2 --- /dev/null +++ b/src/i18n/locales/id/encoding.json @@ -0,0 +1,84 @@ +{ + "encoding": { + "dataType": "Tipe Data", + "stack": "Tumpuk", + "sortBy": "Urutkan Berdasarkan", + "sortOrder": "Urutan Pengurutan", + "colorScheme": "Skema warna", + "smartSort": "simpulkan urutan cerdas", + "ascending": "Menaik", + "descending": "Menurun", + "normalize": "Normalisasi", + "aggregate": "Agregat", + "bin": "Bin", + "field": "Kolom", + "channel": "Kanal", + "xAxis": "Sumbu X", + "yAxis": "Sumbu Y", + "color": "Warna", + "size": "Ukuran", + "shape": "Bentuk", + "tooltip": "Tooltip", + "auto": "otomatis", + "default": "bawaan", + "layered": "berlapis", + "center": "tengah", + "rerunSmartSort": "jalankan ulang pengurutan cerdas", + "fieldPlaceholder": "kolom", + "newFieldNamePlaceholder": "ketik nama kolom baru", + "createNewFieldGroup": "buat kolom baru", + "axisSettings": "pengaturan sumbu", + "legends": "legenda", + "facets": "faset", + "dataFields": "kolom data", + "editor": "Editor", + "ideas": "Ide", + "ideasHeading": "Beberapa arah untuk dijelajahi:", + "getIdeas": "Dapatkan Ide", + "getIdeasQuestion": "Dapatkan Ide?", + "differentIdeas": "Ide yang berbeda?", + "formulateData": "rumuskan data", + "ideating": "menyusun ide...", + "formulateAndOverride": "rumuskan dan timpa", + "formulate": "Rumuskan", + "whatDoYouWantToVisualize": "apa yang ingin Anda visualisasikan?", + "getIdeasForVisualization": "dapatkan ide untuk visualisasi", + "channelX": "sumbu-x", + "channelY": "sumbu-y", + "channelColor": "warna", + "channelSize": "ukuran", + "channelShape": "bentuk", + "channelTooltip": "Tooltip", + "channelOpacity": "opasitas", + "channelColumn": "kolom", + "channelRow": "baris", + "channelDetail": "detail", + "channelGroup": "grup", + "channelRadius": "radius", + "channelStrokeDash": "garis putus-putus", + "channelX_tip": "Memetakan data ke posisi horizontal", + "channelY_tip": "Memetakan data ke posisi vertikal", + "channelColor_tip": "Memetakan data ke rona warna / kategori", + "channelSize_tip": "Memetakan data ke ukuran elemen", + "channelShape_tip": "Memetakan data ke bentuk penanda", + "channelOpacity_tip": "Memetakan data ke tingkat transparansi", + "channelColumn_tip": "Membagi bagan menjadi beberapa kolom (faset horizontal)", + "channelRow_tip": "Membagi bagan menjadi beberapa baris (faset vertikal)", + "channelDetail_tip": "Pengelompokan tambahan tanpa pengodean visual", + "channelGroup_tip": "Mengelompokkan elemen data menjadi satu", + "channelRadius_tip": "Memetakan data ke jarak radial", + "channelStrokeDash_tip": "Memetakan data ke pola garis putus-putus", + "ascShort": "↑ naik", + "descShort": "↓ turun", + "sortOrderLabel": "Urutan Pengurutan:", + "autoSortFailed": "tidak dapat melakukan pengurutan otomatis.", + "autoSortServerError": "tidak dapat melakukan pengurutan otomatis karena masalah server.", + "followUpChartPlaceholder": "perbarui gaya bagan atau analisis lanjutan", + "refreshIdeas": "Segarkan ide", + "stylePresetsTooltip": "Ubah gaya bagan menjadi…", + "stylePresetsHeader": "Ubah gaya bagan menjadi", + "stylePresetsHint": "Atau jelaskan gaya di kotak masukan — misalnya \"gunakan palet teal\", \"tebalkan judul\", \"putar label sumbu\", \"anotasi titik puncak\".", + "formulationSucceeded": "Perumusan data untuk {{fields}} berhasil.", + "formulationFailed": "Perumusan data gagal." + } +} diff --git a/src/i18n/locales/id/errors.json b/src/i18n/locales/id/errors.json new file mode 100644 index 000000000..c282fa4cf --- /dev/null +++ b/src/i18n/locales/id/errors.json @@ -0,0 +1,38 @@ +{ + "errors": { + "authRequired": "Autentikasi diperlukan", + "authExpired": "Sesi kedaluwarsa — silakan masuk kembali", + "accessDenied": "Akses ditolak", + + "invalidRequest": "Permintaan tidak valid", + "tableNotFound": "Tabel tidak ditemukan", + "fileParseError": "Gagal mengurai berkas yang diunggah", + "fileTooLarge": "Berkas terlalu besar", + "validationError": "Kesalahan validasi", + + "llmAuthFailed": "Autentikasi gagal — silakan periksa kunci API Anda", + "llmRateLimit": "Batas laju terlampaui — silakan tunggu dan coba lagi", + "llmContextTooLong": "Masukan terlalu panjang — silakan kurangi ukuran data atau panjang perintah", + "llmModelNotFound": "Model tidak ditemukan — silakan periksa nama model", + "llmTimeout": "Permintaan kedaluwarsa — silakan periksa konektivitas dan coba lagi", + "llmServiceError": "Layanan model mengembalikan kesalahan — silakan coba lagi nanti", + "llmContentFiltered": "Permintaan diblokir oleh filter keamanan konten", + "llmUnknownError": "Permintaan model gagal", + + "connectorAuthFailed": "Autentikasi sumber data gagal", + "dbConnectionFailed": "Koneksi sumber data gagal", + "dbQueryError": "Kesalahan kueri basis data", + "dataLoadError": "Gagal memuat data", + "connectorError": "Kesalahan konektor data", + + "codeExecutionError": "Terjadi kesalahan saat eksekusi kode", + "agentError": "Agen mengalami kesalahan", + + "catalogSyncTimeout": "Sinkronisasi katalog kedaluwarsa — silakan coba lagi", + "catalogNotFound": "Konektor tidak ditemukan atau belum terhubung", + + "internalError": "Terjadi kesalahan tak terduga", + "serviceUnavailable": "Layanan sementara tidak tersedia", + "storageFull": "Penyimpanan ruang kerja penuh. Kosongkan ruang disk dan coba lagi." + } +} diff --git a/src/i18n/locales/id/index.ts b/src/i18n/locales/id/index.ts new file mode 100644 index 000000000..051f1644b --- /dev/null +++ b/src/i18n/locales/id/index.ts @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import common from './common.json'; +import upload from './upload.json'; +import chart from './chart.json'; +import model from './model.json'; +import encoding from './encoding.json'; +import messages from './messages.json'; +import navigation from './navigation.json'; +import dataLoading from './dataLoading.json'; +import loader from './loader.json'; +import errors from './errors.json'; + +export default { + ...common, + ...upload, + ...chart, + ...model, + ...encoding, + ...messages, + ...navigation, + ...dataLoading, + ...loader, + ...errors, +}; diff --git a/src/i18n/locales/id/loader.json b/src/i18n/locales/id/loader.json new file mode 100644 index 000000000..9df5a86c7 --- /dev/null +++ b/src/i18n/locales/id/loader.json @@ -0,0 +1,116 @@ +{ + "loader": { + "mysql": { + "user": "Nama pengguna MySQL", + "password": "kosongkan jika tanpa kata sandi", + "host": "alamat server", + "port": "port server", + "database": "Nama basis data (kosongkan untuk menjelajahi semua basis data)", + "authInstructions": "**Contoh:** user: `root` · host: `localhost` · port: `3306` · database: `mydb`\n\n**Penyiapan lokal:** Pastikan MySQL berjalan — `brew services list` (macOS) atau `systemctl status mysql` (Linux). Kosongkan kata sandi jika tidak diatur.\n\n**Penyiapan jarak jauh:** Dapatkan host, port, nama pengguna, dan kata sandi dari administrator basis data Anda. Pastikan server mengizinkan koneksi jarak jauh dan IP Anda masuk daftar putih.\n\n**Cakupan:** Kosongkan *database* untuk menjelajahi semua basis data di server, atau isi untuk langsung menuju tabel di basis data tersebut.\n\n**Pemecahan masalah:** Uji dengan `mysql -u -p -h -P `" + }, + "mssql": { + "server": "Alamat host atau nama instans SQL Server", + "database": "Nama basis data (kosongkan untuk menjelajahi semua basis data)", + "user": "Nama pengguna (kosongkan untuk autentikasi Entra ID / Windows)", + "password": "Kata sandi (kosongkan untuk autentikasi Entra ID / Windows)", + "port": "Port SQL Server (bawaan: 1433)", + "encrypt": "Aktifkan enkripsi (yes/no)", + "trust_server_certificate": "Percayai sertifikat server (yes/no)", + "connection_timeout": "Batas waktu koneksi dalam detik", + "authInstructions": "**Microsoft Entra ID (disarankan):** Jalankan `az login` sekali di terminal Anda, lalu jalankan Data Formulator. Pilih *Microsoft Entra ID*, isi hanya `server` dan (opsional) `database`, dan kosongkan nama pengguna/kata sandi — kredensial Azure CLI Anda digunakan secara otomatis. Managed Identity, VS Code, dan kredensial lingkungan juga berfungsi via `DefaultAzureCredential`.\n\n> Identitas Entra Anda harus diberi akses ke basis data, misalnya admin menjalankan `CREATE USER [you@contoso.com] FROM EXTERNAL PROVIDER;` dan memberikan peran yang diperlukan.\n\n**Contoh (Entra ID):** server: `myserver.database.windows.net` · database: `mydb` (nama pengguna/kata sandi kosong)\n\n**Autentikasi SQL Server:** Pilih *autentikasi SQL Server* dan berikan nama pengguna dan kata sandi.\n\n**Contoh (autentikasi SQL):** server: `localhost` · database: `mydb` · user: `sa` · password: `MyP@ss` · port: `1433`\n\n**Autentikasi Windows (khusus Windows):** Pilih *autentikasi Windows* dan kosongkan nama pengguna/kata sandi.\n\n**Driver:** Driver Microsoft SQL Server sudah terkemas bersama Data Formulator; tidak perlu instalasi ODBC terpisah. Untuk Entra ID, instal Azure CLI dan jalankan `az login`.\n\n**Pemecahan masalah:** Pastikan Anda masuk dengan `az account show`. Pastikan layanan SQL Server berjalan dan TCP/IP diaktifkan. Uji autentikasi SQL dengan `sqlcmd -S -d -U -P `." + }, + "postgresql": { + "user": "Nama pengguna PostgreSQL", + "password": "kosongkan jika tanpa kata sandi", + "host": "Host PostgreSQL", + "port": "Port PostgreSQL", + "database": "Nama basis data (kosongkan untuk menjelajahi semua basis data)", + "authInstructions": "**Contoh:** user: `postgres` · host: `localhost` · port: `5432` · database: `mydb`\n\n**Penyiapan lokal:** Pastikan PostgreSQL berjalan — `brew services list` (macOS) atau `systemctl status postgresql` (Linux). Kosongkan kata sandi jika tidak diatur.\n\n**Penyiapan jarak jauh:** Dapatkan host, port, nama pengguna, dan kata sandi dari administrator basis data Anda. Pengguna harus memiliki izin SELECT pada tabel yang ingin Anda akses.\n\n**Cakupan:** Kosongkan *database* untuk menjelajahi semua basis data di server, atau isi untuk langsung menuju skema/tabel di basis data tersebut.\n\n**Pemecahan masalah:** Uji dengan `psql -U -h -p -d `" + }, + "mongodb": { + "host": "alamat server", + "port": "port server", + "username": "kosongkan jika tanpa autentikasi", + "password": "kosongkan jika tanpa autentikasi", + "database": "nama basis data", + "collection": "kosongkan untuk mencantumkan semua koleksi", + "authSource": "basis data autentikasi (bawaan ke basis data target)", + "authInstructions": "**Contoh:** host: `localhost` · port: `27017` · database: `mydb` · collection: `users`\n\n**Penyiapan lokal:** Pastikan MongoDB berjalan. Kosongkan nama pengguna dan kata sandi jika autentikasi tidak diaktifkan.\n\n**Penyiapan jarak jauh:** Dapatkan host, port, nama pengguna, dan kata sandi dari administrator basis data Anda.\n\n**Pemecahan masalah:** Uji dengan `mongosh --host --port `" + }, + "cosmosdb": { + "endpoint": "URL endpoint akun Cosmos DB", + "key": "kunci akun atau kunci emulator", + "database": "nama basis data", + "container": "kosongkan untuk mencantumkan semua kontainer", + "authInstructions": "**Contoh:** endpoint: `https://myaccount.documents.azure.com:443/` · database: `mydb`\n\n**Penyiapan Azure:** Temukan endpoint dan kunci Anda di Azure Portal pada bagian *Keys* untuk akun Cosmos DB Anda.\n\n**Emulator lokal:** Gunakan endpoint `https://localhost:8081` dengan kunci emulator yang sudah dikenal.\n\n**Pemecahan masalah:** Pastikan firewall akun mengizinkan IP Anda, atau gunakan koneksi dari jaringan yang diizinkan." + }, + "bigquery": { + "project_id": "ID Proyek Google Cloud", + "dataset_id": "ID Kumpulan Data — kosongkan untuk semua, atau tentukan satu atau beberapa dipisah koma", + "credentials_path": "Jalur ke berkas JSON akun layanan (opsional)", + "location": "Lokasi BigQuery (bawaan: US)", + "authInstructions": "**Contoh:** project_id: `my-gcp-project` · dataset_id: `analytics` · credentials_path: `/path/to/key.json` · location: `US`\n\n**Opsi 1 — Kredensial Bawaan Aplikasi (disarankan):**\nInstal [Google Cloud SDK](https://cloud.google.com/sdk/docs/install), lalu jalankan `gcloud auth application-default login`. Kosongkan `credentials_path`.\n\n**Opsi 2 — Berkas Kunci Akun Layanan:**\nBuat akun layanan di Google Cloud Console, unduh kunci JSON, dan masukkan jalur lengkap di `credentials_path`. Berikan peran **BigQuery Data Viewer** dan **BigQuery Job User** pada akun tersebut.\n\n**Opsi 3 — Variabel Lingkungan:**\nAtur `GOOGLE_APPLICATION_CREDENTIALS` ke jalur berkas JSON akun layanan Anda. Kosongkan `credentials_path`." + }, + "athena": { + "aws_profile": "Nama profil AWS dari ~/.aws/credentials (jika diatur, kunci akses dan rahasia tidak diperlukan)", + "aws_access_key_id": "ID kunci akses AWS (tidak diperlukan jika menggunakan aws_profile)", + "aws_secret_access_key": "Kunci rahasia AWS (tidak diperlukan jika menggunakan aws_profile)", + "aws_session_token": "Token sesi AWS (diperlukan untuk kredensial sementara)", + "region_name": "Nama region AWS", + "workgroup": "Nama workgroup Athena (lokasi keluaran diambil dari konfigurasi workgroup)", + "output_location": "Lokasi keluaran S3 untuk hasil kueri (misalnya s3://bucket/path/). Jika kosong, memakai konfigurasi workgroup.", + "database": "Basis data/katalog bawaan untuk kueri", + "query_timeout": "Batas waktu eksekusi kueri dalam detik (bawaan: 300 = 5 menit)", + "authInstructions": "**Contoh (profil):** aws_profile: `default` · region_name: `us-east-1` · workgroup: `primary` · database: `my_database`\n\n**Contoh (kunci):** aws_access_key_id: `AKIA...` · aws_secret_access_key: `wJalr...` · region_name: `us-east-1`\n\n**Opsi 1 — Profil AWS (disarankan):**\nAtur `aws_profile` ke nama profil dari `~/.aws/credentials`. Siapkan dengan `aws configure --profile `. Tidak perlu kunci akses atau rahasia.\n\n**Opsi 2 — Kredensial Eksplisit:**\nMasukkan `aws_access_key_id` dan `aws_secret_access_key` secara langsung. Tambahkan `aws_session_token` untuk kredensial sementara.\n\n**Izin IAM yang diperlukan:** `athena:StartQueryExecution`, `athena:GetQueryExecution`, `athena:GetQueryResults`, `athena:GetWorkGroup`, `athena:ListDatabases`, `athena:ListTableMetadata`, ditambah izin S3 dan Glue pada bucket data/hasil Anda." + }, + "kusto": { + "kusto_cluster": "misalnya https://mycluster.region.kusto.windows.net", + "kusto_database": "Nama basis data (wajib)", + "client_id": "Hanya perwakilan layanan", + "client_secret": "Hanya perwakilan layanan", + "tenant_id": "Hanya perwakilan layanan", + "authInstructions": "**Opsi 1 — Masuk dengan Microsoft (disarankan):** Masuk sebagai diri sendiri dan gunakan izin Kusto Anda yang ada. Opsi ini muncul ketika server telah mengonfigurasi `KUSTO_OAUTH_CLIENT_ID`.\n\n**Opsi 2 — Identitas Bawaan Azure:** Gunakan login Azure CLI (`az login`), Managed Identity, kredensial VS Code, atau kredensial lingkungan.\n\n**Opsi 3 — Perwakilan Layanan:** Berikan `client_id`, `client_secret`, dan `tenant_id` untuk perwakilan layanan dengan akses kluster.\n\nSetiap identitas harus sudah memiliki akses bidang-data ke basis data Kusto yang dipilih." + }, + "databricks": { + "server_hostname": "misalnya adb-1234567890.11.azuredatabricks.net", + "http_path": "Jalur HTTP gudang SQL, misalnya /sql/1.0/warehouses/abc123", + "catalog": "Nama Unity Catalog (kosongkan untuk menjelajahi semua katalog)", + "schema": "Nama skema (kosongkan untuk menjelajahi semua skema dalam katalog)", + "access_token": "Token akses personal Databricks (dapi...)", + "authInstructions": "**Tempat menemukannya:** Di ruang kerja Databricks Anda, buka **SQL → SQL Warehouses** (bilah sisi kiri), klik gudang Anda, dan buka tab **Connection details** — salin **Server hostname** dan **HTTP path** dari sana.\n\n**Token akses:** Klik avatar Anda (kanan atas) → **Settings → Developer → Access tokens → Generate new token**. Token diawali `dapi` dan hanya ditampilkan sekali.\n\n**Izin:** Pengguna token memerlukan `USE CATALOG` / `USE SCHEMA` dan `SELECT` pada objek Unity Catalog yang ingin dibaca.\n\n**Cakupan:** Kosongkan *catalog* dan *schema* untuk menjelajahi semua yang dapat Anda akses, atau atur untuk langsung menuju katalog/skema tertentu — misalnya coba `samples` → `nyctaxi` → `trips` bawaan.\n\n**Belum punya akun?** Databricks Free Edition tanpa server, gratis, dan menyertakan katalog `samples` — tidak perlu penyiapan kluster atau gudang." + }, + "superset": { + "url": "URL dasar Superset (misalnya https://bi.company.com)", + "username": "Nama pengguna Superset (opsional jika memakai SSO)", + "password": "Kata sandi Superset (opsional jika memakai SSO)", + "authInstructions": "**Contoh:** url: `https://bi.company.com` · username: `admin` · password: `***`\n\n**Penyiapan:** Berikan URL dasar instans Superset Anda dan kredensial pengguna dengan setidaknya peran **Gamma** (akses baca ke kumpulan data).\n\n**SSO:** Jika Superset Anda memakai SSO, gunakan alur SSO bridge alih-alih autentikasi kata sandi (konfigurasikan via `PLG_SUPERSET_SSO_LOGIN_URL`)." + }, + "azure_blob": { + "account_name": "Nama akun penyimpanan Azure", + "container_name": "Nama kontainer blob Azure", + "connection_string": "String koneksi penyimpanan Azure (alternatif untuk account_name + kredensial)", + "credential_chain": "Daftar berurutan penyedia kredensial Azure (cli;managed_identity;env)", + "account_key": "Kunci akun penyimpanan Azure", + "sas_token": "Token SAS Azure", + "endpoint": "Penggantian endpoint Azure", + "authInstructions": "**Contoh (string koneksi):** connection_string: `DefaultEndpointsProtocol=https;AccountName=...` · container_name: `mydata`\n\n**Contoh (kunci akun):** account_name: `mystorageacct` · container_name: `mydata` · account_key: `abc123...`\n\n**Opsi 1 — String Koneksi (paling mudah):**\nDapatkan dari Azure Portal → Storage Account → Access keys. Masukkan di `connection_string`; `account_name` boleh dikosongkan.\n\n**Opsi 2 — Kunci Akun:**\nDari Azure Portal → Storage Account → Access keys. Gunakan `account_name` + `account_key`.\n\n**Opsi 3 — Token SAS (disarankan untuk akses terbatas):**\nBuat dari Azure Portal → Storage Account → Shared access signature. Gunakan `account_name` + `sas_token`. Dapat dibatasi waktu dan izin.\n\n**Opsi 4 — Azure CLI / Managed Identity (paling aman):**\nCukup berikan `account_name` + `container_name`. Memerlukan `az login` atau Managed Identity.\n\n**Format yang didukung:** CSV, Parquet, JSON, JSONL" + }, + "s3": { + "aws_access_key_id": "ID kunci akses AWS", + "aws_secret_access_key": "Kunci rahasia AWS", + "aws_session_token": "Token sesi AWS (diperlukan untuk kredensial sementara)", + "region_name": "Nama region AWS", + "bucket": "Nama bucket S3", + "authInstructions": "**Contoh:** aws_access_key_id: `AKIA...` · aws_secret_access_key: `wJalr...` · region_name: `us-east-1` · bucket: `my-data-bucket`\n\n**Mendapatkan kredensial:** Konsol AWS → IAM → Users → Security credentials → Create access key → pilih \"Application running outside AWS\".\n\n**Izin yang diperlukan:** `s3:GetObject` dan `s3:ListBucket` pada bucket Anda.\n\n**Format yang didukung:** CSV, Parquet, JSON, JSONL" + }, + "local_folder": { + "root_dir": "Jalur absolut ke direktori lokal untuk dijelajahi", + "recursive": "Sertakan berkas dalam subdirektori", + "file_pattern": "Pola glob untuk memfilter berkas (misalnya '*.csv')", + "authInstructions": "Arahkan `root_dir` ke direktori lokal berisi berkas data.\n\n**Format yang didukung:** CSV, TSV, Parquet, JSON, JSONL, Excel (.xlsx/.xls)\n\nKlik **Jelajahi** untuk membuka pemilih folder, atau tempel jalur direktori." + }, + "_common": { + "table_filter": "Filter tabel berdasarkan kata kunci (misalnya 'sales')" + } + } +} diff --git a/src/i18n/locales/id/messages.json b/src/i18n/locales/id/messages.json new file mode 100644 index 000000000..5dbe55f05 --- /dev/null +++ b/src/i18n/locales/id/messages.json @@ -0,0 +1,92 @@ +{ + "messages": { + "noMessages": "Belum ada pesan", + "noConversation": "Belum ada riwayat percakapan", + "loadingExample": "Memuat sesi contoh: {{title}}", + "loadSuccess": "Berhasil memuat {{title}}", + "loadFailed": "Gagal memuat {{title}}: {{error}}", + "saving": "Menyimpan...", + "saved": "Tersimpan", + "error": "Terjadi kesalahan", + "retry": "Coba lagi", + "undo": "Urungkan", + "redo": "Ulangi", + "processing": "Memproses...", + "completed": "Selesai", + "noData": "Tidak ada data tersedia", + "loadingData": "Memuat data...", + "dataLoaded": "Data berhasil dimuat", + "confirmDelete": "Apakah Anda yakin ingin menghapus?", + "confirmReset": "Apakah Anda yakin ingin mengatur ulang?", + "changesSaved": "Perubahan tersimpan", + "changesDiscarded": "Perubahan dibuang", + "formulate": "Rumuskan", + "formulateAndOverride": "Rumuskan dan timpa", + "viewSystemMessages": "Lihat pesan sistem", + "systemMessagesWithCount": "Pesan sistem ({{count}})", + "showingLatest": "Menampilkan {{count}} terbaru", + "clearAllMessages": "Hapus semua pesan", + "details": "Detail", + "generatedCode": "[kode yang dihasilkan]", + "chatWithAgents": "Dialog dengan Agen", + "you": "Anda", + "assistant": "Asisten", + "sortBy": "Urutkan berdasarkan {{label}}", + "copyColumnName": "Salin tajuk: {{label}}", + "columnNameCopied": "Tersalin: {{label}}", + "loading": "Memuat ...", + "rowsWithCount": "{{count}} baris", + "randomRowsTooltip": "lihat 10000 baris acak dari tabel ini", + "close": "Tutup", + "autoSortFailed": "tidak dapat melakukan pengurutan otomatis.", + "autoSortServerFailed": "tidak dapat melakukan pengurutan otomatis karena masalah server.", + "removeTable": "Hapus tabel", + "preview": "Pratinjau", + "noTablesToPreview": "Tidak ada tabel untuk dipratinjau.", + "rowLimitReached": "Memuat {{count}} baris, mencapai batas baris yang dipilih. Sumber mungkin berisi lebih banyak baris.", + "report": { + "component": "Laporan" + }, + "dataRefresh": { + "component": "Penyegaran data", + "unknownError": "Kesalahan tidak dikenal", + "failedDerivedTable": "Gagal menyegarkan tabel turunan ({{table}}): {{detail}}", + "errorRefreshingDerivedTable": "Terjadi kesalahan saat menyegarkan tabel turunan ({{table}})", + "successRefreshedWithDerived": "Berhasil menyegarkan data untuk ({{table}}) dan memperbarui tabel turunan.", + "errorRefreshingData": "Terjadi kesalahan saat menyegarkan data: {{error}}" + }, + "catalog": { + "syncComplete": "Sinkronisasi katalog selesai", + "syncPartial": "Sinkronisasi katalog selesai sebagian — {{synced}}/{{total}} tabel tersinkron, {{failed}} gagal" + }, + "agent": { + "clarifyExhausted": "Saya sudah menjelajah cukup jauh tetapi belum mencapai kesimpulan.\n\nLangkah yang sudah selesai:\n{{steps}}\n\nBagaimana Anda ingin melanjutkan?", + "clarifyOptionContinue": "Lanjutkan penjelajahan", + "clarifyOptionSimplify": "Sederhanakan tugas", + "clarifyOptionPresent": "Tampilkan hasil sejauh ini", + "clarifyOptionSummary": "Ringkas hasil sejauh ini", + "maxIterationsSummary": "Mencapai jumlah maksimum langkah penjelajahan.", + "emptyDataframe": "DataFrame keluaran kosong (0 baris). Periksa filter atau pemuatan data.", + "fieldsNotFound": "Kolom pengodean bagan tidak ditemukan di DataFrame keluaran: {{missing}}. Kolom yang tersedia: {{available}}", + "llmApiError": "Kesalahan API LLM", + "llmEmptyResponse": "LLM mengembalikan respons kosong", + "parseActionFailed": "Gagal mengurai tindakan agen dari respons LLM", + "unknownAction": "Tindakan tidak dikenal: {{actionType}}", + "noCodeBlock": "Tidak ditemukan blok kode dalam respons. Model tidak dapat menghasilkan kode untuk menyelesaikan tugas.", + "unexpectedError": "Kesalahan tak terduga", + "codeExecError": "Terjadi kesalahan saat eksekusi kode.", + "unableExtractTables": "Tidak dapat mengekstrak tabel dari respons", + "unableExtractScript": "Tidak dapat mengekstrak skrip dari respons", + "errorCallingModel": "Kesalahan memanggil model: {{error}}", + "noModelConfigured": "Belum ada model yang dikonfigurasi", + "requestTimedOut": "Permintaan melampaui {{seconds}} detik tanpa respons lengkap. Frontend berhenti menunggu secara otomatis. Anda dapat mencoba lagi nanti atau menaikkan \"Batas waktu formulasi\" di Pengaturan.", + "suggestionsTimedOut": "Pembuatan saran AI melampaui {{seconds}} detik tanpa hasil. Frontend berhenti menunggu. Anda dapat mencoba lagi atau menaikkan \"Batas waktu formulasi\" di Pengaturan.", + "formulationTimedOut": "Perumusan data melewati batas waktu setelah {{seconds}} detik. Pertimbangkan untuk memecah tugas, menggunakan model lain, atau menaikkan \"Batas waktu formulasi\" di Pengaturan." + }, + "chartInsightTimedOut": "Wawasan bagan melewati batas waktu setelah {{seconds}} detik. Anda dapat mencoba lagi atau menaikkan \"Batas waktu formulasi\" di Pengaturan.", + "chartInsightImageNotReady": "Gambar bagan belum siap tepat waktu. Tunggu bagan selesai dirender lalu coba lagi.", + "chartInsightFailed": "Gagal menghasilkan wawasan bagan. Silakan periksa konfigurasi model Anda.", + "globalModelListFailed": "Gagal memuat model yang dikonfigurasi di server.", + "availableModelsFailed": "Gagal memeriksa konektivitas model yang dikonfigurasi di server." + } +} diff --git a/src/i18n/locales/id/model.json b/src/i18n/locales/id/model.json new file mode 100644 index 000000000..5115ead9f --- /dev/null +++ b/src/i18n/locales/id/model.json @@ -0,0 +1,140 @@ +{ + "model": { + "selectModel": "Pilih model", + "provider": "Penyedia", + "account": "Akun", + "signInCategory": "Masuk", + "apiCategory": "API", + "connectChatGPT": "Masuk dengan ChatGPT", + "chatgptAccount": "Akun ChatGPT", + "openChatGPTAuthorization": "Buka ChatGPT", + "manageChatGPTConnection": "Kelola di ChatGPT", + "chatgptBilling": "Eksperimental. Batas langganan ChatGPT dan ketersediaan model berlaku. Masuk dengan kode perangkat harus diaktifkan di pengaturan keamanan ChatGPT.", + "disconnectChatGPTTitle": "Putuskan ChatGPT?", + "disconnectChatGPTMessage": "Lupakan koneksi ini di Data Formulator. Model yang tersimpan akan tetap ada. Ini tidak mencabut otorisasi ChatGPT.", + "connectCopilot": "Hubungkan GitHub Copilot", + "copilotAccount": "Akun GitHub Copilot", + "openGitHubAuthorization": "Buka GitHub", + "manageCopilotConnection": "Kelola di GitHub", + "deviceCode": "Kode perangkat", + "deviceCodeInstructions": "Masukkan kode ini di {{provider}} untuk menghubungkan akun Anda.", + "copyDeviceCode": "Salin kode perangkat", + "copyDeviceCodeFailed": "Tidak dapat menyalin kode. Pilih kode untuk menyalin secara manual.", + "copilotBilling": "Eksperimental. Batas langganan Copilot dan kebijakan organisasi berlaku. Hanya model obrolan yang kompatibel yang dicantumkan.", + "disconnectCopilotTitle": "Putuskan GitHub Copilot?", + "disconnectCopilotMessage": "Lupakan koneksi ini di Data Formulator. Model yang tersimpan akan tetap ada. Ini tidak mencabut otorisasi GitHub.", + "manageGitHubAuthorizations": "Kelola otorisasi GitHub", + "apiKey": "Kunci API", + "model": "Model", + "apiBase": "URL Dasar", + "optionalApiKey": "Kunci API (opsional)", + "apiVersion": "Versi API", + "status": "Status", + "none": "Tidak ada", + "active": "Aktif", + "inactive": "Tidak aktif", + "configureModel": "Konfigurasi Model", + "addModel": "Tambah Model", + "models": "Model", + "newModel": "Model baru", + "edit": "Ubah", + "copyDetails": "Salin detail", + "testModel": "Uji model", + "testPassed": "Pengujian lolos", + "testFailedRetry": "Pengujian gagal, coba lagi", + "testAndSave": "Uji dan simpan", + "back": "Kembali", + "testAndAdd": "Uji dan tambah", + "deploymentName": "Deployment model", + "azureDeploymentSource": "Pemilihan deployment", + "browseDeployments": "Jelajahi deployment", + "enterManually": "Masukkan secara manual", + "azureSubscription": "Langganan", + "refreshAzureDeployments": "Segarkan deployment Azure", + "loadingAzureDeployments": "Memuat deployment Azure...", + "noAzureDeployments": "Tidak ditemukan deployment OpenAI yang siap. Coba langganan lain atau masukkan secara manual.", + "noAzureSubscriptions": "Tidak ditemukan langganan yang aktif di tenant Azure CLI saat ini.", + "authentication": "Autentikasi", + "apiKeyAlternative": "Kunci API (alternatif)", + "endpoint": "URL Endpoint", + "azureAccount": "Akun: {{user}}", + "azureCliAccess": "Anda dapat mengakses model Azure yang diizinkan untuk {{user}}.", + "existingModels": "Model yang ada", + "copyExistingHint": "Gunakan model yang ada sebagai titik awal.", + "useAsTemplate": "Gunakan sebagai templat", + "removeModel": "Hapus Model", + "testConnection": "Uji Koneksi", + "connectionSuccess": "Koneksi berhasil", + "connectionFailed": "Koneksi gagal", + "litellmNote": "Konfigurasi model berbasis LiteLLM. Lihat penyedia yang didukung.", + "seeDocs": "Lihat penyedia yang didukung", + "default": "Bawaan", + "ready": "Siap", + "retest": "Uji ulang", + "test": "Uji", + "selectModels": "Pilih Model", + "current": "Saat ini", + "unselected": "Belum dipilih", + "pleaseSelectModel": "Silakan pilih model", + "providerPlaceholder": "penyedia", + "example": "contoh", + "optionalKeylessEndpoint": "opsional untuk endpoint tanpa kunci", + "modelPlaceholder": "misalnya gpt-5.4", + "enterModelName": "Masukkan nama model", + "optional": "opsional", + "providerModelExists": "penyedia + model sudah ada", + "addAndTestModel": "tambah dan uji model", + "clear": "bersihkan", + "modelReadyMessage": "Model siap digunakan", + "clickToTestModel": "Klik untuk menguji apakah model ini berfungsi", + "unknownError": "Kesalahan tidak dikenal", + "errorMessage": "Kesalahan: {{message}}. Klik untuk menguji ulang.", + "showKeys": "Tampilkan kunci API", + "hideKeys": "Sembunyikan kunci API", + "useModel": "Gunakan {{modelName}}", + "cancel": "Batal", + "recommendedModelTip": "Model dengan kemampuan pengodean dan multimodal yang kuat memberikan pengalaman terbaik.", + "openaiProviderTip": "Gunakan penyedia openai untuk API yang kompatibel dengan OpenAI.", + "loadingModels": "Memuat model...", + "serverManaged": "Dikelola server", + "serverChip": "dikonfigurasi di server", + "serverConfigured": "dikonfigurasi di server", + "serverManagedTooltip": "Dikelola oleh administrator", + "serverManagedSection": "Model yang dikonfigurasi di server", + "serverManagedReadonly": "Hanya-baca", + "userManagedSection": "Model saya", + "testing": "Menguji…", + "configured": "Dikonfigurasi", + "available": "Tersedia", + "advancedSettings": "Pengaturan lanjutan", + "copyDiagnostic": "Salin diagnostik", + "viewRecentLog": "Lihat log terbaru", + "recentLog": "Log terbaru", + "recentConfigurations": "Konfigurasi terbaru", + "useRecent": "Gunakan yang terbaru", + "connectOpenRouter": "Hubungkan OpenRouter", + "openRouterAccount": "Akun OpenRouter", + "openRouterConnected": "Terhubung", + "checkingConnection": "Memeriksa koneksi...", + "authorizationExpired": "Otorisasi kedaluwarsa", + "connectionUnavailable": "Koneksi tidak tersedia", + "keyCreatorId": "ID pembuat kunci", + "connectionActions": "Tindakan koneksi", + "manageOpenRouterConnection": "Kelola di OpenRouter", + "manageConnection": "Lihat akun di {{provider}}", + "authorizeAgain": "Otorisasi lagi...", + "retryConnection": "Coba lagi", + "reconnectAccount": "Hubungkan ulang", + "disconnectAccount": "Putuskan", + "refreshAccount": "Segarkan model", + "waitingForAuthorization": "Menunggu otorisasi...", + "openAuthorization": "Buka OpenRouter", + "accountAuthorizationFailed": "Otorisasi gagal atau kedaluwarsa. Hubungkan lagi untuk mencoba.", + "noCompatibleModels": "Tidak ada model kompatibel yang tersedia", + "openRouterBilling": "Pengujian dan penggunaan model ditagihkan ke akun OpenRouter Anda.", + "disconnectOpenRouterTitle": "Putuskan OpenRouter?", + "disconnectOpenRouterMessage": "Ini melupakan kunci yang tersimpan di Data Formulator. Semua model yang menggunakan koneksi ini perlu dihubungkan ulang. Untuk mencabut kunci di OpenRouter juga, hapus dari kunci OpenRouter Anda.", + "manageOpenRouterKeys": "Kelola kunci OpenRouter", + "configuredMessage": "Dikonfigurasi di server, klik untuk memverifikasi konektivitas" + } +} diff --git a/src/i18n/locales/id/navigation.json b/src/i18n/locales/id/navigation.json new file mode 100644 index 000000000..bf17fa75f --- /dev/null +++ b/src/i18n/locales/id/navigation.json @@ -0,0 +1,18 @@ +{ + "navigation": { + "startExploration": "Mulai Eksplorasi", + "installLocally": "Instal Secara Lokal", + "tryOnlineDemo": "Coba Demo Daring", + "video": "Video", + "github": "GitHub", + "contactUs": "Hubungi Kami", + "termsOfUse": "Syarat Penggunaan", + "about": "Tentang", + "home": "Beranda", + "data": "Data", + "visualization": "Visualisasi", + "report": "Laporan", + "chat": "Obrolan", + "agentRules": "Aturan Agen" + } +} diff --git a/src/i18n/locales/id/upload.json b/src/i18n/locales/id/upload.json new file mode 100644 index 000000000..ba699369f --- /dev/null +++ b/src/i18n/locales/id/upload.json @@ -0,0 +1,199 @@ +{ + "upload": { + "title": "Muat Data", + "sampleDatasets": "Kumpulan Data Contoh", + "sampleDatasetsDesc": "Kumpulan data contoh pilihan", + "uploadFile": "Unggah Berkas", + "uploadFileDesc": "Tabel, buku kerja Excel, atau dokumen", + "pasteData": "Tempel Data", + "pasteDataDesc": "Tempel dari papan klip", + "extractData": "Agen Pemuatan Data", + "extractDataDesc": "Temukan dan ekstrak data dengan AI", + "loadFromUrl": "Muat dari URL", + "loadFromUrlTitle": "Muat dari URL", + "loadFromUrlDesc": "Ambil data dari URL jarak jauh", + "database": "Basis data", + "databaseDesc": "Hubungkan ke basis data atau layanan", + "databaseDisabled": "Koneksi basis data dinonaktifkan di lingkungan ini", + "dragDrop": "Seret & letakkan berkas di sini", + "orBrowse": "atau Jelajahi", + "or": "atau", + "browse": "Jelajahi", + "supportedFormats": "CSV, TSV, dan JSON menjadi tabel; Excel dan berkas lain disimpan untuk agen", + "workspaceFile": "Berkas", + "previewUnavailable": "Pratinjau cepat tidak tersedia untuk berkas ini.", + "emptyFile": "Berkas ini kosong.", + "previewTruncated": "Pratinjau dipotong.", + "removeFile": "Hapus berkas", + "filesSelected": "{{count}} berkas dipilih", + "addMoreFiles": "Tambah berkas lagi", + "addToWorkspace": "Tambahkan ke ruang kerja", + "addAllToWorkspace": "Tambahkan semua ke ruang kerja", + "placeholder": { + "url": "Masukkan URL: https://example.com/data.json atau /api/data", + "paste": "Tempel data Anda di sini (format CSV, TSV, atau JSON)" + }, + "helperText": { + "urlInvalid": "Masukkan URL valid yang diawali http://, https://, atau /" + }, + "resetExtraction": "Atur ulang ekstraksi", + "autoRefresh": "Segarkan otomatis", + "refreshInterval": "Interval penyegaran", + "seconds": "detik", + "liveData": "Data langsung", + "from": "dari", + "previewMode": "Mode pratinjau: Penyuntingan dinonaktifkan. Klik \"Tampilkan Penuh\" untuk mengaktifkan penyuntingan.", + "showPreview": "Tampilkan Pratinjau", + "showFull": "Tampilkan Penuh", + "dataLoadingAgent": "Agen Pemuatan Data", + "resumePreviousConversation": "Percakapan sebelumnya →", + "agentChatPlaceholder": "Minta agen menemukan kumpulan data, atau mengekstrak data dari gambar atau teks…", + "agentChatTabSuggestion": "Kumpulan data apa yang kita miliki di sini?", + "agentChatSuggestionsLabel": "Coba tanyakan", + "agentChatSendTooltip": "Mulai mengobrol dengan agen", + "dataSourcesLabel": "Terhubung ke:", + "addSourceLabel": "Tambah data:", + "agentChatQuickAction": { + "connect": "Pandu saya menghubungkan sumber data", + "askConnected": "Cantumkan tabel dari sumber saya yang terhubung" + }, + "agentChatSuggestion": { + "askConnected": "Kumpulan data apa yang kita miliki dari sumber yang terhubung?", + "findCPI": "Bantu saya memuat data indeks harga konsumen", + "extractFromExcel": "Ekstrak data dari berkas Excel yang dilampirkan", + "kind": { + "ask": "tanya", + "find": "cari", + "extract": "ekstrak" + } + }, + "uploadData": "Unggah Data", + "importData": "Impor data", + "dataConnections": "Koneksi data", + "connectToLiveData": "Hubungkan ke sumber data langsung", + "loadLocalData": "Muat data lokal", + "localData": "Data lokal", + "orConnectToDataSource": "Atau hubungkan ke sumber data (dengan segarkan otomatis opsional)", + "addConnection": "Hubungkan basis data", + "addConnectionDesc": "Hubungkan ke basis data langsung", + "connectorConnected": "Terhubung", + "connectorDisconnected": "Klik untuk menghubungkan", + "connectorNotConnected": "Belum terhubung", + "pickDataSourceType": "Pilih jenis sumber data untuk membuat koneksi baru.", + "nameYourConnection": "Beri nama koneksi {{type}} Anda.", + "connectionName": "Nama koneksi", + "createConnection": "Buat Koneksi", + "creating": "Membuat...", + "dataAssistant": "Asisten Pemuatan Data", + "addData": "Tambah Data", + "loadDataIn": "Muat data di", + "browserLabel": "Peramban", + "browserTooltip": "Data hanya tersimpan di peramban (terbatas hingga {{limit}} baris)", + "installLocallyTooltip": "Instal Data Formulator secara lokal untuk membuka analisis bagi kumpulan data besar", + "azureBlobTooltip": "Data tersimpan di Azure Blob Storage (mendukung tabel besar)", + "diskTooltip": "Data tersimpan di ruang kerja pada disk (mendukung tabel besar)", + "azureLabel": "Azure", + "diskLabel": "Disk", + "openWorkspace": "Buka ruang kerja: {{path}}", + "fileUploadDisabled": "Unggahan berkas dinonaktifkan di lingkungan ini.", + "useLoadFromUrl": "Gunakan \"Muat dari URL\" untuk memuat data dari sumber jarak jauh.", + "selectFileToPreview": "Pilih berkas untuk dipratinjau.", + "loadTable": "Muat Tabel", + "loadingTable": "Memuat...", + "loadAllTables": "Muat Semua Tabel", + "preview": "Pratinjau", + "urlFormatHint": "URL harus menunjuk ke data dalam format CSV, JSON, atau JSONL", + "watchMode": "Mode Pantau", + "checkUpdatesEvery": "periksa pembaruan data setiap", + "watchHint": "periksa dan segarkan data dari URL secara otomatis pada interval berkala", + "tryExamples": "Coba contoh:", + "resetLabel": "atur ulang", + "enterUrlToPreview": "Masukkan URL dan klik Pratinjau untuk melihat data.", + "watchModeStatus": "Mode pantau:", + "contentExceedsSizeLimit": "⚠️ Konten melampaui batas ukuran {{limit}}MB. Ukuran saat ini: {{size}}MB. Gunakan tab DATABASE untuk kumpulan data besar.", + "largeContentDetected": "Konten besar terdeteksi ({{size}}KB).", + "showingFullContent": "Menampilkan konten penuh (mungkin lambat)", + "showingPreview": "Menampilkan pratinjau demi kinerja", + "pastePreviewTruncatedSuffix": "... (dipotong demi kinerja)", + "loadingData": "Memuat data...", + "loadingDataset": "Memuat {{name}}...", + "connect": "Hubungkan", + "createConnectionTo": "Buat koneksi ke {{name}}", + "connectionNameLabel": "nama koneksi", + "dataSourceTypes": "Sumber Data", + "connectorGroups": { + "samples": "Contoh", + "files": "Berkas", + "databases": "Basis data", + "warehouses": "Gudang data", + "semantic": "BI & semantik", + "other": "Lainnya" + }, + "folderPathPlaceholder": "/path/ke/folder/data/anda", + "includeSubfolders": "Sertakan subfolder", + "localFolder": "Tautkan folder lokal", + "localFolderConnected": "Folder lokal", + "localFolderDesc": "Jelajahi berkas di komputer Anda", + "localFolderHint": "Pilih folder di komputer Anda untuk menjelajahi dan mengimpor berkas data.", + "opening": "Membuka...", + "orTypePath": "atau ketik jalur secara manual", + "selectDataSourceType": "Pilih jenis sumber data", + "selectFolder": "Pilih Folder", + "storedInAzure": "Data tersimpan di Azure Blob Storage", + "storedInBrowser": "Data hanya tersimpan di peramban", + "storedTemporarily": "Data tersimpan sementara di server ini", + "temporaryServerLabel": "Server sementara", + "storedOnDisk": "Data tersimpan di disk", + "connectorDesc": { + "sample_datasets": "Coba dengan data contoh", + "mysql": "Kueri tabel MySQL", + "postgresql": "Kueri tabel Postgres", + "mssql": "Kueri tabel SQL Server", + "cosmosdb": "Kueri kontainer Cosmos DB", + "mongodb": "Kueri koleksi MongoDB", + "bigquery": "Kueri kumpulan data BigQuery", + "athena": "Kueri Amazon Athena", + "kusto": "Kueri Azure Data Explorer", + "superset": "Jelajahi kumpulan data Superset", + "azure_blob": "Muat berkas Azure Blob", + "s3": "Muat berkas Amazon S3", + "local_folder": "Jelajahi berkas lokal" + }, + "localFolderDefaultName": "Folder Lokal", + "errors": { + "fileTooLarge": "Berkas {{name}} terlalu besar ({{size}}MB). Gunakan Basis data untuk berkas besar.", + "failedToParse": "Gagal mengurai {{name}}.", + "failedToRead": "Gagal membaca {{name}}.", + "failedToParseExcel": "Gagal mengurai berkas Excel {{name}}.", + "unsupportedFormat": "Format berkas tidak didukung: {{name}}.", + "unableToParseUrl": "Tidak dapat mengurai data dari URL yang diberikan. Pastikan URL menunjuk ke data CSV, JSON, atau JSONL.", + "failedToFetch": "Gagal mengambil data: {{message}}. Pastikan URL menunjuk ke data CSV, JSON, atau JSONL.", + "failedToCreateConnector": "Gagal membuat konektor", + "failedToConnectFolder": "Gagal menghubungkan folder", + "failedToOpenFolder": "Gagal membuka folder", + "failedToDeleteConnector": "Gagal menghapus konektor" + }, + "messages": { + "connectedTo": "Terhubung ke \"{{name}}\"", + "deletedConnector": "Menghapus konektor \"{{name}}\"" + }, + "upgrade": { + "title": "Konektor data memerlukan instalasi lokal", + "subtitle": "Konektor basis data dinonaktifkan dalam mode hanya-peramban. Instal secara lokal untuk pengalaman penuh.", + "featureDb": "Hubungkan ke basis data langsung", + "featureDbDesc": "MySQL, Postgres, Kusto, BigQuery, MongoDB, S3, dan lainnya.", + "featureLocalFolder": "Jelajahi folder lokal & berkas besar", + "featureWorkspaces": "Ruang kerja persisten & pengetahuan agen", + "featureCredentials": "Bawa kunci model Anda sendiri", + "pythonHint": "Memerlukan Python 3.11 atau lebih baru.", + "installHeading": "Instal & luncurkan", + "copy": "Salin", + "copied": "Tersalin", + "viewOnGithub": "Lihat di GitHub", + "viewOnPypi": "Paket PyPI", + "requirements": "Memerlukan Python 3.11+ dan ", + "requirementsTail": ". Lebih suka pip, conda, atau Docker? Lihat ", + "otherInstallMethods": "metode instalasi lain" + } + } +} diff --git a/src/i18n/locales/index.ts b/src/i18n/locales/index.ts index afdf021de..9e621620a 100644 --- a/src/i18n/locales/index.ts +++ b/src/i18n/locales/index.ts @@ -4,5 +4,6 @@ import en from './en'; import zh from './zh'; import hi from './hi'; +import id from './id'; -export { en, zh, hi }; +export { en, zh, hi, id }; diff --git a/tests/frontend/unit/app/i18nLocales.test.ts b/tests/frontend/unit/app/i18nLocales.test.ts index dd6c9933b..dad111389 100644 --- a/tests/frontend/unit/app/i18nLocales.test.ts +++ b/tests/frontend/unit/app/i18nLocales.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"; import en from "../../../../src/i18n/locales/en"; import zh from "../../../../src/i18n/locales/zh"; +import id from "../../../../src/i18n/locales/id"; type TranslationValue = string | Record; type TranslationMap = Record; @@ -27,4 +28,8 @@ describe("i18n locale bundles", () => { it("keeps Simplified Chinese translation keys aligned with English", () => { expect(collectKeys(zh)).toEqual(collectKeys(en)); }); + + it("keeps Indonesian translation keys aligned with English", () => { + expect(collectKeys(id)).toEqual(collectKeys(en)); + }); }); From 290369cc3d07bb5a12c359a45df676b20e2f6c7a Mon Sep 17 00:00:00 2001 From: Zulfazli Date: Sun, 27 Sep 2026 17:39:33 +0700 Subject: [PATCH 2/2] Backfill missing hi and zh locale keys to full parity with en Add 36 missing Hindi keys and 5 missing Simplified Chinese keys introduced by newer features (semantic model sidebar, connector groups, chart quick actions, virtual sources). All four UI locales now share the same 1860-key set. --- src/i18n/locales/hi/common.json | 20 ++++++++++++++++++++ src/i18n/locales/hi/dataLoading.json | 1 + src/i18n/locales/hi/upload.json | 17 +++++++++++++++++ src/i18n/locales/zh/common.json | 4 ++++ src/i18n/locales/zh/dataLoading.json | 1 + 5 files changed, 43 insertions(+) diff --git a/src/i18n/locales/hi/common.json b/src/i18n/locales/hi/common.json index 47008e353..b4446a211 100644 --- a/src/i18n/locales/hi/common.json +++ b/src/i18n/locales/hi/common.json @@ -450,6 +450,7 @@ "textTurnEarlier_other": "{{count}} पहले के उत्तर", "textTurnCollapse": "समेटें", "usingSources": "उपयोग हो रहा है", + "switchingSources": "इस पर स्विच करें", "hmm": "हम्म...", "oops": "उफ़...", "completed": "पूर्ण", @@ -477,6 +478,9 @@ "tablesAvailableToAgent": "एजेंट के लिए {{count}} तालिका उपलब्ध है", "tablesAvailableToAgent_other": "एजेंट के लिए {{count}} तालिकाएं उपलब्ध हैं", "showAllTables": "सभी {{count}} दिखाएं", + "importedTables_one": "{{count}} आयातित तालिका", + "importedTables_other": "{{count}} आयातित तालिकाएं", + "importsFrom": "{{name}} से आयात", "showFewerTables": "कम दिखाएं", "earlierTurns": "{{count}} पहले की बारी", "earlierTurns_other": "{{count}} पहले की बारियां", @@ -578,6 +582,10 @@ "exploreIdeasPrompt": "यह तय करने में मेरी मदद करें कि आगे क्या अन्वेषण करना है — मुझे 3–5 विकल्प देने के लिए `clarify` क्रिया का उपयोग करें, और अभी मेरे लिए एक न चुनें।\n\nप्रत्येक विकल्प एक छोटी, क्लिक करने योग्य दिशा होनी चाहिए — उदाहरण के लिए, किसी विवरण में गहराई से जाना, किसी अलग कोण की ओर मुड़ना, दृश्य को व्यापक बनाना, कोई अन्य तालिका लाना, या कोई सांख्यिकीय तकनीक आज़माना। प्रत्येक विकल्प के लिए एक **बहुत संक्षिप्त** एक-पंक्ति तर्क जोड़ें (10 शब्दों से अधिक नहीं)।", "askedForRecommendations": "मुझे आगे क्या अन्वेषण करना चाहिए?", "generateReport": "एक रिपोर्ट उत्पन्न करें", + "quickActions": "त्वरित कार्रवाइयां", + "writeReport": "रिपोर्ट लिखें", + "createWorkflow": "वर्कफ़्लो बनाएं", + "reportConversationPrompt": "हमारी वर्तमान बातचीत और डेटा से मुझे एक रिपोर्ट लिखने में मदद करें। मसौदा तैयार करने से पहले चुनने के लिए कुछ उपयोगी दिशाएं सुझाएं।", "reportPrompt": "इस अन्वेषण से मुख्य निष्कर्षों का सारांश देते हुए एक रिपोर्ट लिखें।", "askedForReport": "अन्वेषण का सारांश देते हुए एक रिपोर्ट लिखें।", "expandStarters": "सुझाव दिखाएं", @@ -846,6 +854,7 @@ "sidebar": { "openDataSources": "डेटा स्रोत", "openUpload": "डेटा अपलोड करें", + "openDataLoadingChat": "एजेंट के साथ डेटा जोड़ें", "openDataConnectors": "डेटा कनेक्टर", "uploadData": "डेटा अपलोड करें", "dataConnectorsTitle": "डेटा कनेक्टर", @@ -858,6 +867,11 @@ "refresh": "डेटा रिफ्रेश करें", "emptyTree": "कोई तालिका नहीं मिली", "addConnector": "डेटा कनेक्टर जोड़ें", + "add": "जोड़ें", + "new": "नया", + "import": "आयात करें", + "connectDataSource": "डेटा स्रोत कनेक्ट करें", + "browseInDataView": "डेटा दृश्य में ब्राउज़ करें", "connectConnector": "कनेक्ट करें", "linkLocalFolder": "स्थानीय फ़ोल्डर लिंक करें", "newSession": "नया सत्र", @@ -916,6 +930,12 @@ "metadataPartial": "आंशिक मेटाडेटा", "metadataUnavailable": "मेटाडेटा अनुपलब्ध", "largeTableChatPrompt": "मैं \"{{connector}}\" से निम्नलिखित तालिका(एं) लोड करना चाहता हूं: {{tables}}। ये पूर्ण रूप से आयात करने के लिए बहुत बड़ी हैं: {{large}}। पूरी तालिका के बजाय एक फ़िल्टर की गई, नमूनाकृत, या समुच्चित उपसमुच्चय लोड करने में मेरी मदद करें।", + "semanticFieldCounts": "{{measures}} माप · {{dimensions}} आयाम", + "semanticModelSummary": "सिमेंटिक मॉडल · {{measures}} माप · {{dimensions}} आयाम", + "semanticSampleCaption": "नमूना: कुछ आयामों पर कुछ माप", + "semanticAddToWorkspace": "वर्कस्पेस में जोड़ें", + "semanticTag": "मॉडल", + "openInDataView": "डेटा दृश्य में खोलें", "saving": "सहेजा जा रहा है...", "rename": "नाम बदलें", "exportSession": "निर्यात करें", diff --git a/src/i18n/locales/hi/dataLoading.json b/src/i18n/locales/hi/dataLoading.json index d9bcc83e6..beffb5b00 100644 --- a/src/i18n/locales/hi/dataLoading.json +++ b/src/i18n/locales/hi/dataLoading.json @@ -72,6 +72,7 @@ "fromSource": "से" }, "operation": { + "virtualSource": "{{name}}: वर्चुअल स्रोत (पंक्तियां रिमोट रहती हैं)", "title": "डेटा लोडिंग विकल्प", "previewHeading": "लोड करने के लिए तालिकाएं", "previewGuide": "आपके वर्कस्पेस में जोड़ने से पहले प्रत्येक तालिका का पूर्वावलोकन।", diff --git a/src/i18n/locales/hi/upload.json b/src/i18n/locales/hi/upload.json index ab030bdec..b8f13badf 100644 --- a/src/i18n/locales/hi/upload.json +++ b/src/i18n/locales/hi/upload.json @@ -20,6 +20,15 @@ "or": "या", "browse": "ब्राउज़ करें", "supportedFormats": "समर्थित: CSV, TSV, JSON, Excel (xlsx, xls)", + "workspaceFile": "फ़ाइल", + "previewUnavailable": "इस फ़ाइल के लिए त्वरित पूर्वावलोकन उपलब्ध नहीं है।", + "emptyFile": "यह फ़ाइल खाली है।", + "previewTruncated": "पूर्वावलोकन छोटा किया गया।", + "removeFile": "फ़ाइल हटाएं", + "filesSelected": "{{count}} फ़ाइलें चुनी गईं", + "addMoreFiles": "और फ़ाइलें जोड़ें", + "addToWorkspace": "वर्कस्पेस में जोड़ें", + "addAllToWorkspace": "सभी को वर्कस्पेस में जोड़ें", "placeholder": { "url": "URL दर्ज करें: https://example.com/data.json या /api/data", "paste": "अपना डेटा यहां पेस्ट करें (CSV, TSV, या JSON प्रारूप)" @@ -112,6 +121,14 @@ "createConnectionTo": "{{name}} से कनेक्शन बनाएं", "connectionNameLabel": "कनेक्शन नाम", "dataSourceTypes": "डेटा स्रोत", + "connectorGroups": { + "samples": "उदाहरण", + "files": "फ़ाइलें", + "databases": "डेटाबेस", + "warehouses": "डेटा वेयरहाउस", + "semantic": "BI और सिमेंटिक", + "other": "अन्य" + }, "folderPathPlaceholder": "/path/to/your/data/folder", "includeSubfolders": "उप-फ़ोल्डर शामिल करें", "localFolder": "स्थानीय फ़ोल्डर लिंक करें", diff --git a/src/i18n/locales/zh/common.json b/src/i18n/locales/zh/common.json index 2c4864a7d..b291beff0 100644 --- a/src/i18n/locales/zh/common.json +++ b/src/i18n/locales/zh/common.json @@ -637,6 +637,10 @@ "exploreIdeasPrompt": "帮我决定下一步探索什么 —— 请使用 `clarify` 动作给我 3–5 个选项,先不要替我选。\n\n每个选项应该是一个简短、可点击的方向 —— 比如深入某个细节、换个分析角度、放宽视角、引入另一张表,或者试试统计方法。为每个选项增加**非常简短**的一句话推荐理由(不超过 10 个字)。", "askedForRecommendations": "接下来应该探索什么呢?", "generateReport": "生成报告", + "quickActions": "快捷操作", + "writeReport": "写报告", + "createWorkflow": "创建工作流", + "reportConversationPrompt": "帮我根据当前对话和数据撰写报告。在起草之前,先推荐几个有用的方向供我选择。", "reportPrompt": "撰写一份报告,总结本次探索的主要发现。", "askedForReport": "撰写一份报告,总结本次探索。", "expandStarters": "显示建议", diff --git a/src/i18n/locales/zh/dataLoading.json b/src/i18n/locales/zh/dataLoading.json index 06f340602..945fcf8f5 100644 --- a/src/i18n/locales/zh/dataLoading.json +++ b/src/i18n/locales/zh/dataLoading.json @@ -72,6 +72,7 @@ "fromSource": "来自" }, "operation": { + "virtualSource": "{{name}}:虚拟源(数据行保留在远端)", "title": "数据加载选项", "previewHeading": "待加载的数据表", "previewGuide": "在加入工作区之前先预览每张表。",