* feat: add OIDC/SSO database schema and models (Phase 1) Add database foundation for OpenID Connect authentication: Database Migrations: - Create oidc_identities table (links users to OIDC accounts) - Create oidc_state_nonces table (OAuth state/nonce for CSRF protection) - Create auth_audit_log table (security event logging) - Make password_digest nullable in users table (allow OIDC-only users) Models: - OIDCIdentity: Links users to external OIDC providers - OIDCStateNonce: Temporary OAuth state management - AuthAuditLog: Authentication event audit trail Changes: - Updated User model to allow null password_digest - Added model associations in models/index.js - All migrations tested and verified Related to #977 * feat: add OIDC core services (Phase 2) - Install openid-client@^6.2.0 for OIDC protocol support - Implement providerConfig.js for loading providers from .env - Support single provider or numbered providers (OIDC_PROVIDER_1_*, etc.) - Auto-provision and admin email domain configuration - Provider caching for performance - Implement stateManager.js for OAuth state/nonce management - CSRF protection with 10-minute TTL - One-time use state consumption - Automatic cleanup of expired states - Implement auditService.js for authentication event logging - Track login success/failure, logout, OIDC linking/unlinking - Store IP address, user agent, and metadata - Support for event queries and retention cleanup - Add comprehensive unit tests (60 tests, all passing) - providerConfig: 36 tests for env parsing and validation - stateManager: 12 tests for state lifecycle and security - auditService: 12 tests for event logging and queries Phase 2 completes the backend core services needed for OIDC authentication. * feat: implement OIDC authentication flow (Phase 3) Core OIDC Flow (service.js): - Provider discovery with issuer caching - Authorization URL generation with state/nonce - OAuth callback handling and token exchange - ID token validation using openid-client - Token refresh functionality JIT User Provisioning (provisioningService.js): - Auto-create users from OIDC claims - Link existing email accounts to OIDC identities - Admin role assignment based on email domain rules - Automatic username generation from email - Transaction-safe identity creation Identity Management (oidcIdentityService.js): - List user's linked OIDC identities - Link additional providers to existing accounts - Unlink identities with safety checks - Prevent unlinking last auth method - Update identity claims on login HTTP Layer (controller.js + routes.js): - GET /api/oidc/providers - List configured providers - GET /api/oidc/auth/:slug - Initiate OIDC flow - GET /api/oidc/callback/:slug - Handle OAuth callback - POST /api/oidc/link/:slug - Link provider to current user - DELETE /api/oidc/unlink/:id - Unlink identity - GET /api/oidc/identities - Get user's identities Integration: - Register OIDC routes in Express app (public + authenticated) - Update auth service to reject password login for OIDC-only users - Audit logging for all OIDC operations - Session creation on successful authentication Security: - State/nonce CSRF protection - One-time use state consumption - Transaction-safe user provisioning - Foreign key constraints enforced * feat: implement OIDC frontend login flow (Phase 4) - Created OIDCProviderButtons component for SSO login options - Created OIDCCallback component for OAuth callback handling - Updated Login page to fetch and display OIDC providers - Added /auth/callback/:provider route to App.tsx - Added i18n translations for OIDC UI elements - Downgraded openid-client to v5.7.0 (CommonJS compatibility) - Fixed linting issues in backend OIDC modules Phase 4 completes the frontend login flow for OIDC/SSO authentication. Users can now see configured SSO providers on the login page. * feat: implement OIDC account linking UI (Phase 5) Add Connected Accounts section to Profile Security tab allowing users to: - View linked OIDC provider accounts - Link new SSO providers to their account - Unlink OIDC identities with validation - Prevent unlinking last authentication method Backend changes: - Add has_password virtual field to User model - Include has_password in profile API response - Track whether user has password set for validation Frontend changes: - Create oidcService for OIDC API operations - Create ConnectedAccounts component with link/unlink flows - Add confirmation dialog before unlinking accounts - Validate that users cannot unlink their last auth method - Show warning if user has no password set - Integrate Connected Accounts into SecurityTab User experience: - View all linked SSO provider accounts with email and link date - Link additional providers via "Link Provider" buttons - Unlink with two-step confirmation to prevent accidents - Clear error messages when unlinking would leave no auth method - Warning message suggesting password setup for OIDC-only users Fixes #977 * feat: complete OIDC documentation and UI improvements (Phase 6) This commit completes Phase 6 of the OIDC/SSO implementation with comprehensive documentation, bug fixes, and UI reorganization. Documentation: - Add comprehensive user guide at docs/10-oidc-sso.md with: - Setup guides for 6 major providers (Google, Okta, Keycloak, Authentik, PocketID, Azure AD) - Configuration examples for single and multiple providers - User features documentation (login, account linking, management) - Advanced topics (auto-provisioning, admin role assignment, hybrid auth) - Comprehensive troubleshooting section - Security considerations and best practices - Update README.md with OIDC/SSO section and quick setup examples Internationalization: - Add i18n support to OIDCProviderButtons component - Add translation keys for all OIDC UI text - Update English translations with "sign_in_with" key Bug Fixes: - Fix oidcService.ts to correctly unwrap API responses - Backend returns {providers: [...]} and {identities: [...]} - Frontend was expecting plain arrays, causing "map is not a function" error - Fix initiateOIDCLink to properly handle POST response UI Improvements: - Move OIDC/SSO to dedicated tab in profile settings - Create new OIDCTab component with green LinkIcon - Remove ConnectedAccounts from SecurityTab - Add OIDC tab between Security and API Keys tabs - Update ProfileSettings with new tab configuration - Security tab now focuses solely on password management Testing: - All linting passes - All tests pass (82 suites, 1223 tests) Related to #977 * feat: add OIDC/SSO translations for all 24 languages Add i18n support for OIDC/SSO features across all supported languages: - "Sign in with {{provider}}" button text - "OIDC/SSO" tab label in profile settings - OIDC authentication flow messages Translations added for: Arabic, Bulgarian, Danish, German, Greek, Spanish, Finnish, French, Indonesian, Italian, Japanese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Slovenian, Swedish, Turkish, Ukrainian, Vietnamese, and Chinese. * fix: resolve 13 CodeQL security alerts This commit addresses critical security vulnerabilities identified by CodeQL scanning: **Security Configuration (2 fixes)** - Fix insecure Helmet configuration - enable CSP and HSTS in production - Fix clear text cookie transmission - enable secure cookies in production **Path Injection (3 fixes)** - Add path validation in users/controller.js to prevent arbitrary file deletion - Add path validation in users/service.js for avatar operations - Add path sanitization in attachment-utils.js deleteFileFromDisk function **Cross-Site Scripting (1 fix)** - Fix XSS vulnerability in GeneralTab.tsx avatar URL handling - Add URL sanitization to prevent javascript: protocol attacks **URL Security (2 fixes)** - Fix double escaping in url/service.js HTML entity decoding - Fix incomplete URL sanitization for YouTube domain validation **Denial of Service (1 fix)** - Add loop bound protection in inboxProcessingService.js (10k char limit) **Rate Limiting (3 fixes)** - Add rate limiting to auth routes (register, verify-email) - Add rate limiting to task attachment upload/delete endpoints - Add rate limiting to user avatar upload/delete endpoints **GitHub Actions Security (1 fix)** - Add explicit read-only permissions to CI workflow Note: CSRF middleware (#10) requires frontend changes and is tracked separately. Relates to PR #1008 * fix: allow test files in path validation for tests * fix: format long condition in attachment-utils for Prettier compliance Break the path validation condition across multiple lines to meet Prettier formatting requirements and fix CI linting failure. * fix: resolve CodeQL security alerts - Add rate limiting to OIDC authentication routes using authLimiter and authenticatedApiLimiter - Implement CSRF protection middleware using csrf-sync (skips for API tokens and test environment) - Add CSRF token endpoint at /api/csrf-token - Fix incomplete URL scheme validation in GeneralTab to block all dangerous schemes (javascript:, data:, vbscript:, file:) This addresses 5 high-severity CodeQL security vulnerabilities: - Missing rate limiting on OIDC auth routes - Missing CSRF middleware protection - Incomplete URL sanitization in avatar handling All 1223 tests passing. * fix: implement CSRF protection with lusca for CodeQL compliance Add CSRF protection using lusca.csrf (CodeQL's recommended library) to protect session-based authentication while supporting hybrid auth patterns. Implementation: - Pre-check middleware marks exempt requests (test env, Bearer tokens) - Lusca CSRF middleware applied with exemption flag check - Session-based requests require valid x-csrf-token header - Bearer token requests exempt (don't use cookies) - Test environment exempt for test execution This addresses CodeQL security alert js/missing-token-validation while maintaining support for both cookie-based and token-based authentication. Related: #977 (OIDC/SSO authentication feature)
1402 lines
61 KiB
JSON
1402 lines
61 KiB
JSON
{
|
|
"common": {
|
|
"save": "Simpan",
|
|
"cancel": "Batal",
|
|
"delete": "Hapus",
|
|
"edit": "Edit",
|
|
"create": "Buat",
|
|
"submit": "Kirim",
|
|
"close": "Tutup",
|
|
"back": "Kembali",
|
|
"next": "Berikutnya",
|
|
"loading": "Memuat...",
|
|
"appLoading": "Memuat aplikasi... Silakan tunggu.",
|
|
"completed": "Selesai",
|
|
"error": "Kesalahan",
|
|
"success": "Sukses",
|
|
"area": "Area",
|
|
"status": "Status",
|
|
"saving": "Menyimpan...",
|
|
"settings": "Pengaturan",
|
|
"none": "Tidak ada",
|
|
"discardChanges": "Buang perubahan?",
|
|
"discardChangesMessage": "Anda memiliki perubahan yang belum disimpan. Apakah Anda yakin ingin membuangnya?",
|
|
"no": "Tidak, lanjutkan mengedit",
|
|
"yesDiscard": "Ya, buang",
|
|
"uploading": "Mengunggah...",
|
|
"refresh": "Segarkan",
|
|
"unlinking": "Menghapus tautan..."
|
|
},
|
|
"sidebar": {
|
|
"dashboard": "Dasbor",
|
|
"projects": "Proyek",
|
|
"tasks": "Tugas",
|
|
"calendar": "Kalender",
|
|
"notes": "Catatan",
|
|
"settings": "Pengaturan",
|
|
"areas": "Area",
|
|
"tags": "Tag",
|
|
"addAreaAriaLabel": "Tambahkan Area",
|
|
"addAreaTitle": "Tambahkan Area",
|
|
"addTagAriaLabel": "Tambahkan Tag",
|
|
"addTagTitle": "Tambahkan Tag",
|
|
"today": "Hari Ini",
|
|
"total": "Total",
|
|
"upcoming": "Akan Datang",
|
|
"nextActions": "Tindakan Selanjutnya",
|
|
"inbox": "Kotak Masuk",
|
|
"completed": "Selesai",
|
|
"allTasks": "Semua Tugas",
|
|
"addInboxAriaLabel": "Tambahkan Item Kotak Masuk",
|
|
"addInboxTitle": "Tambahkan Item Kotak Masuk",
|
|
"addProjectAriaLabel": "Tambahkan Proyek",
|
|
"addProjectTitle": "Tambahkan Proyek",
|
|
"addNoteAriaLabel": "Tambahkan Catatan",
|
|
"addNoteTitle": "Tambahkan Catatan",
|
|
"createNew": "Buat Baru",
|
|
"views": "Tampilan",
|
|
"unpinView": "Lepaskan tampilan",
|
|
"pinView": "Sematkan tampilan"
|
|
},
|
|
"navigation": {
|
|
"home": "Beranda",
|
|
"dashboard": "Dasbor",
|
|
"profile": "Profil",
|
|
"profileSettings": "Pengaturan Profil",
|
|
"settings": "Pengaturan",
|
|
"about": "Tentang",
|
|
"logout": "Keluar",
|
|
"backupRestore": "Cadangkan & Pulihkan"
|
|
},
|
|
"settings": {
|
|
"todayPageSettings": "Pengaturan Halaman Hari Ini",
|
|
"showDailyQuote": "Tampilkan Kutipan Harian",
|
|
"showMetrics": "Tampilkan Metrik",
|
|
"showProductivity": "Tampilkan Wawasan Produktivitas",
|
|
"showIntelligence": "Tampilkan Saran Kecerdasan",
|
|
"showNextTaskSuggestion": "Saran Tugas Berikutnya",
|
|
"showSuggestions": "Tampilkan Saran",
|
|
"showDueToday": "Tampilkan Tugas Jatuh Tempo Hari Ini",
|
|
"showCompleted": "Tampilkan Tugas yang Selesai"
|
|
},
|
|
"dashboard": {
|
|
"overview": "Ikhtisar",
|
|
"sameAsYesterday": "Sama seperti kemarin",
|
|
"betterThanYesterday": "{{percentage}}% lebih baik dari kemarin",
|
|
"worseThanYesterday": "{{percentage}}% lebih buruk dari kemarin",
|
|
"sameAsAverage": "Sama seperti rata-rata",
|
|
"betterThanAverage": "{{percentage}}% lebih baik dari rata-rata",
|
|
"worseThanAverage": "{{percentage}}% lebih buruk dari rata-rata",
|
|
"metrics": "Metrik",
|
|
"showMetrics": "Tampilkan Metrik",
|
|
"hideMetrics": "Sembunyikan Metrik",
|
|
"insights": "Wawasan",
|
|
"showInsights": "Tampilkan Wawasan",
|
|
"hideInsights": "Sembunyikan Wawasan",
|
|
"intelligence": "Inteligensi",
|
|
"showIntelligence": "Tampilkan Saran Inteligensi",
|
|
"hideIntelligence": "Sembunyikan Saran Inteligensi",
|
|
"completed": "Selesai",
|
|
"showCompleted": "Tampilkan Tugas yang Selesai",
|
|
"hideCompleted": "Sembunyikan Tugas yang Selesai"
|
|
},
|
|
"tasks": {
|
|
"title": "Tugas",
|
|
"today": "Hari Ini",
|
|
"total": "Total",
|
|
"backlog": "Backlog",
|
|
"inProgress": "Dalam Proses",
|
|
"dueToday": "Jatuh Tempo Hari Ini",
|
|
"stale": "Kadaluarsa",
|
|
"suggested": "Disarankan",
|
|
"completedToday": "Selesai Hari Ini",
|
|
"weeklyCompletions": "Kemajuan Mingguan",
|
|
"taskCompleted": "tugas selesai",
|
|
"tasksCompleted": "tugas selesai",
|
|
"noTasksAvailable": "Tidak ada tugas yang tersedia.",
|
|
"searchPlaceholder": "Cari tugas...",
|
|
"addNewTask": "Tambahkan Tugas Baru",
|
|
"metrics": "Metrik",
|
|
"myPlanToday": "Rencana Saya untuk Hari Ini",
|
|
"noPlanToday": "Belum ada tugas yang direncanakan untuk hari ini",
|
|
"addToPlanHint": "Klik ikon 🗓 'tambahkan ke rencana hari ini' di sebelah kanan tugas mana pun untuk menambahkannya di sini",
|
|
"blankSlateHint": "Mulailah dengan membuat tugas baru atau mengubah filter Anda.",
|
|
"addToToday": "Tambahkan ke rencana hari ini",
|
|
"removeFromToday": "Hapus dari rencana hari ini",
|
|
"setInProgress": "Tandai sebagai sedang berlangsung",
|
|
"setNotStarted": "Tandai sebagai belum dimulai",
|
|
"showSubtasks": "Tampilkan subtugas",
|
|
"hideSubtasks": "Sembunyikan subtugas",
|
|
"edit": "Edit tugas",
|
|
"delete": "Hapus tugas",
|
|
"sortTasks": "Urutkan tugas",
|
|
"sortBy": "Urutkan berdasarkan",
|
|
"direction": "Arah",
|
|
"ascending": "Menaik",
|
|
"descending": "Menurun",
|
|
"groupBy": "Kelompokkan berdasarkan",
|
|
"groupByProject": "Proyek",
|
|
"grouping": {
|
|
"none": "Tidak ada"
|
|
},
|
|
"show": "Tampilkan",
|
|
"all": "Semua",
|
|
"completedOnly": "Hanya selesai",
|
|
"notCompleted": "Belum selesai",
|
|
"noProject": "Tanpa proyek",
|
|
"unknownProject": "Proyek tidak dikenal",
|
|
"tasks": "tugas",
|
|
"showingItems": "Menampilkan {{current}} dari {{total}} tugas",
|
|
"overdue": "Terlambat",
|
|
"planned": "Direncanakan",
|
|
"open": "Buka",
|
|
"completed": "Selesai",
|
|
"noCompletedTasksToday": "Tidak ada tugas yang diselesaikan hari ini.",
|
|
"markAsDone": "Mark as done",
|
|
"notStarted": "Belum Dimulai",
|
|
"done": "Selesai"
|
|
},
|
|
"timeline": {
|
|
"activityTimeline": "Garis Waktu Aktivitas",
|
|
"showActivityTimeline": "Tampilkan Garis Waktu Aktivitas",
|
|
"hideActivityTimeline": "Sembunyikan Garis Waktu Aktivitas",
|
|
"hideTimeline": "Sembunyikan Garis Waktu",
|
|
"failedToLoad": "Gagal memuat garis waktu",
|
|
"events": {
|
|
"taskCreated": "Tugas dibuat",
|
|
"statusChanged": "Status diubah",
|
|
"priorityChanged": "Prioritas diubah",
|
|
"dueDateChanged": "Tanggal jatuh tempo diubah",
|
|
"deferUntilChanged": "Defer date changed",
|
|
"nameUpdated": "Nama diperbarui",
|
|
"descriptionUpdated": "Deskripsi diperbarui",
|
|
"noteUpdated": "Catatan diperbarui",
|
|
"projectChanged": "Proyek diubah",
|
|
"tagsUpdated": "Tag diperbarui",
|
|
"taskArchived": "Tugas diarsipkan",
|
|
"todayFlagChanged": "Bendera Hari Ini Diubah",
|
|
"status": "Status",
|
|
"priority": "Prioritas",
|
|
"dueDate": "Tanggal jatuh tempo",
|
|
"deferUntil": "Defer until",
|
|
"none": "Tidak ada",
|
|
"recurrenceEndDateChanged": "Tanggal akhir pengulangan telah diubah",
|
|
"recurrenceEndDate": "Tanggal akhir pengulangan",
|
|
"recurrence_type_changed": "Tipe pengulangan berubah",
|
|
"recurrence_interval_changed": "Interval pengulangan berubah",
|
|
"completionBasedChanged": "Perulangan berbasis penyelesaian diubah",
|
|
"projectIdChanged": "Ditugaskan ke proyek",
|
|
"recurrenceType": "Jenis perulangan",
|
|
"recurrenceTypeChanged": "Jenis perulangan diubah",
|
|
"recurrence_weekday_changed": "Hari ulang tahun berubah",
|
|
"recurrence_month_day_changed": "Hari bulan ulang tahun berubah",
|
|
"recurrence_week_of_month_changed": "Minggu bulan ulang tahun berubah"
|
|
},
|
|
"justNow": "Baru saja",
|
|
"minutesAgo": "{{minutes}}m yang lalu",
|
|
"hoursAgo": "{{hours}}j yang lalu",
|
|
"daysAgo": "{{days}}h yang lalu",
|
|
"loadingTimeline": "Memuat garis waktu...",
|
|
"timelineWillAppear": "Garis waktu akan muncul setelah disimpan",
|
|
"noActivity": "Belum ada aktivitas"
|
|
},
|
|
"profile": {
|
|
"settings": "Pengaturan Profil",
|
|
"language": "Bahasa",
|
|
"theme": "Tema",
|
|
"notifications": "Notifikasi",
|
|
"english": "Inggris",
|
|
"spanish": "Spanyol",
|
|
"greek": "Yunani",
|
|
"japanese": "Jepang",
|
|
"ukrainian": "Ukraina",
|
|
"deutsch": "Jerman",
|
|
"italian": "Italia",
|
|
"french": "Prancis",
|
|
"russian": "Rusia",
|
|
"turkish": "Turki",
|
|
"korean": "Korea",
|
|
"vietnamese": "Vietnam",
|
|
"arabic": "Arab",
|
|
"dutch": "Belanda",
|
|
"romanian": "Rumania",
|
|
"chinese": "Cina",
|
|
"portuguese": "Portugis",
|
|
"indonesian": "Bahasa Indonesia",
|
|
"title": "Pengaturan Profil",
|
|
"appearance": "Tampilan",
|
|
"lightMode": "Mode Terang",
|
|
"darkMode": "Mode Gelap",
|
|
"light": "Cerah",
|
|
"dark": "Gelap",
|
|
"timezone": "Zona Waktu",
|
|
"saveChanges": "Simpan Perubahan",
|
|
"successMessage": "Profil berhasil diperbarui!",
|
|
"languageChangedNote": "Perubahan bahasa diterapkan segera",
|
|
"languageChanging": "Mengubah bahasa...",
|
|
"languagePreference": "Preferensi Bahasa",
|
|
"personalInfo": "Informasi Pribadi",
|
|
"errorMessage": "Gagal memperbarui profil",
|
|
"telegramIntegration": "Integrasi Telegram",
|
|
"telegramDescription": "Hubungkan akun tududi Anda ke bot Telegram untuk menambahkan item ke kotak masuk Anda melalui pesan Telegram.",
|
|
"telegramBotToken": "Token Bot Telegram",
|
|
"telegramTokenDescription": "Buat bot dengan @BotFather di Telegram dan tempel token di sini.",
|
|
"telegramConnected": "Akun Telegram Anda terhubung! Kirim pesan ke bot Anda untuk menambahkan item ke kotak masuk tududi Anda.",
|
|
"setupTelegram": "Siapkan Telegram",
|
|
"setupTelegramLower": "siapkan telegram",
|
|
"settingUp": "Sedang menyiapkan...",
|
|
"telegramSetupSuccess": "Bot Telegram \"{{botName}}\" berhasil dikonfigurasi!",
|
|
"telegramSetupFailed": "Gagal mengatur bot Telegram.",
|
|
"invalidTelegramToken": "Format token bot Telegram tidak valid.",
|
|
"telegramInstructions": "Kunjungi https://t.me/{{botUsername}} dan mulai chat dengan bot Anda untuk menghubungkannya ke akun tududi Anda.",
|
|
"botConfigured": "Bot berhasil dikonfigurasi!",
|
|
"botUsername": "Nama Pengguna Bot:",
|
|
"pollingStatus": "Status Polling:",
|
|
"pollingActive": "Aktif - Menerima pesan",
|
|
"pollingInactive": "Tidak Aktif - Tidak menerima pesan",
|
|
"pollingNote": "Polling secara berkala memeriksa pesan baru dari Telegram dan menambahkannya ke kotak masuk Anda.",
|
|
"pollingDescription": "Polling secara berkala memeriksa pesan baru dari Telegram dan menambahkannya ke kotak masuk Anda.",
|
|
"startPolling": "Mulai Polling",
|
|
"stopPolling": "Hentikan Polling",
|
|
"startPollingLower": "mulai polling",
|
|
"stopPollingLower": "hentikan polling",
|
|
"pollingStarted": "Polling Telegram dimulai",
|
|
"pollingStopped": "Polling Telegram dihentikan",
|
|
"pollingError": "Kesalahan dalam mengelola polling Telegram",
|
|
"startPollingFailed": "Gagal memulai polling",
|
|
"stopPollingFailed": "Gagal menghentikan polling",
|
|
"openTelegram": "Buka di Telegram",
|
|
"openInTelegram": "buka di telegram",
|
|
"testTelegramMessage": "Uji Telegram",
|
|
"testMessageSent": "Pesan uji berhasil dikirim!",
|
|
"testMessageFailed": "Gagal mengirim pesan uji.",
|
|
"testMessageError": "Kesalahan saat mengirim pesan uji.",
|
|
"taskSummaryNotifications": "Notifikasi Ringkasan Tugas",
|
|
"taskSummaryDescription": "Terima ringkasan tugas Anda secara berkala melalui Telegram. Fitur ini memerlukan integrasi Telegram yang harus diatur.",
|
|
"enableTaskSummaries": "Aktifkan Ringkasan Tugas",
|
|
"enableTaskSummary": "Aktifkan Ringkasan Tugas",
|
|
"summaryFrequency": "Frekuensi ringkasan",
|
|
"summaryFrequencyDescription": "Pilih seberapa sering Anda ingin menerima ringkasan tugas",
|
|
"sendTestSummary": "Kirim ringkasan uji",
|
|
"frequency": {
|
|
"1h": "1 jam",
|
|
"2h": "2 jam",
|
|
"4h": "4 jam",
|
|
"8h": "8 jam",
|
|
"12h": "12 jam",
|
|
"daily": "1 hari",
|
|
"weekly": "1 minggu"
|
|
},
|
|
"frequencyHelp": "Pilih seberapa sering Anda ingin menerima ringkasan tugas",
|
|
"taskIntelligence": "Inteligensi Tugas",
|
|
"taskIntelligenceDescription": "Dapatkan saran yang berguna untuk membuat nama tugas Anda lebih deskriptif dan dapat ditindaklanjuti.",
|
|
"enableTaskIntelligence": "Aktifkan Asisten Inteligensi Tugas",
|
|
"autoSuggestNextActions": "Saran Tindakan Berikutnya Secara Otomatis",
|
|
"autoSuggestNextActionsDescription": "Saat membuat proyek, secara otomatis minta tindakan fisik berikutnya yang harus diambil.",
|
|
"enableAutoSuggestNextActions": "Aktifkan Saran Tindakan Berikutnya",
|
|
"productivityFeatures": "Fitur Produktivitas",
|
|
"pomodoroDescription": "Aktifkan timer Pomodoro di bilah navigasi untuk sesi kerja yang fokus.",
|
|
"enablePomodoro": "Aktifkan Timer Pomodoro",
|
|
"productivityAssistant": "Asisten Produktivitas",
|
|
"productivityAssistantDescription": "Tampilkan wawasan produktivitas yang membantu mengidentifikasi proyek yang terhenti, tugas yang samar, dan perbaikan alur kerja di halaman Hari Ini Anda.",
|
|
"enableProductivityAssistant": "Aktifkan Wawasan Produktivitas",
|
|
"nextTaskSuggestion": "Saran Tugas Berikutnya",
|
|
"nextTaskSuggestionDescription": "Secara otomatis sarankan tugas terbaik berikutnya untuk dikerjakan ketika Anda tidak memiliki yang sedang berlangsung, memprioritaskan tugas yang jatuh tempo hari ini, kemudian tugas yang disarankan dari halaman Hari Ini Anda.",
|
|
"enableNextTaskSuggestion": "Aktifkan Saran Tugas Berikutnya",
|
|
"nextActionPrompt": "Apa tindakan fisik berikutnya untuk proyek ini?",
|
|
"nextActionPlaceholder": "misalnya, Hubungi klien untuk menjadwalkan pertemuan, Riset pesaing secara online, Buat folder proyek...",
|
|
"addNextAction": "Tambahkan Tindakan Berikutnya",
|
|
"skipNextAction": "Lewati untuk saat ini",
|
|
"nextActionHint": "Pikirkan langkah terkecil dan paling konkret yang dapat Anda ambil sekarang untuk memajukan proyek ini.",
|
|
"tabs": {
|
|
"general": "Umum",
|
|
"security": "Keamanan",
|
|
"productivity": "Produktivitas",
|
|
"telegram": "Telegram",
|
|
"ai": "Fitur AI",
|
|
"notifications": "Preferensi Notifikasi",
|
|
"oidc": "OIDC/SSO"
|
|
},
|
|
"security": "Pengaturan Keamanan",
|
|
"changePassword": "Ubah Kata Sandi",
|
|
"currentPassword": "Kata Sandi Saat Ini",
|
|
"newPassword": "Kata Sandi Baru",
|
|
"confirmPassword": "Konfirmasi Kata Sandi Baru",
|
|
"enterCurrentPassword": "Masukkan kata sandi saat ini Anda",
|
|
"enterNewPassword": "Masukkan kata sandi baru Anda",
|
|
"confirmNewPassword": "Konfirmasi kata sandi baru Anda",
|
|
"currentPasswordRequired": "Kata sandi saat ini diperlukan",
|
|
"newPasswordRequired": "Kata sandi baru diperlukan",
|
|
"passwordTooShort": "Kata sandi harus terdiri dari minimal 6 karakter",
|
|
"passwordMismatch": "Kata sandi tidak cocok",
|
|
"passwordChangeError": "Gagal mengubah kata sandi",
|
|
"passwordChangeSuccess": "Kata sandi berhasil diubah!",
|
|
"changingPassword": "Mengubah kata sandi...",
|
|
"accountSettings": "Akun & Preferensi",
|
|
"botSetup": "Pengaturan Bot",
|
|
"passwordChangeNote": "Perubahan kata sandi akan disimpan ketika Anda mengklik \"Simpan Perubahan\" di bagian bawah formulir.",
|
|
"passwordChangeOptional": "Biarkan kolom kata sandi kosong untuk memperbarui pengaturan lain tanpa mengubah kata sandi Anda.",
|
|
"bulgarian": "Bulgaria",
|
|
"danish": "Denmark",
|
|
"finnish": "Finlandia",
|
|
"norwegian": "Norwegia",
|
|
"polish": "Polandia",
|
|
"slovenian": "Slovenia",
|
|
"swedish": "Swedia",
|
|
"firstDayOfWeek": "Hari pertama dalam minggu",
|
|
"name": "Nama",
|
|
"surname": "Nama Belakang",
|
|
"enterName": "Masukkan nama Anda",
|
|
"enterSurname": "Masukkan nama belakang Anda",
|
|
"avatar": "Profile Photo",
|
|
"uploadAvatar": "Upload Photo",
|
|
"removeAvatar": "Remove Avatar",
|
|
"avatarDescription": "Upload a profile photo (max 5MB)",
|
|
"avatarUploadError": "Please upload an image file",
|
|
"avatarSizeError": "Image must be smaller than 5MB",
|
|
"avatarUploadSuccess": "Avatar uploaded successfully!",
|
|
"avatarRemoveSuccess": "Avatar removed successfully!",
|
|
"avatarUploadFailed": "Failed to upload avatar",
|
|
"avatarRemoveFailed": "Failed to remove avatar",
|
|
"notificationsDescription": "Pilih bagaimana Anda ingin diberi tahu tentang peristiwa penting.",
|
|
"aiFeatures": "Fitur AI",
|
|
"keyboardShortcuts": "Pintasan Keyboard",
|
|
"shortcuts": {
|
|
"enableShortcuts": "Aktifkan Pintasan Keyboard",
|
|
"enableDescription": "Nyalakan atau matikan pintasan keyboard secara global.",
|
|
"duplicateWarning": "Pintasan duplikat terdeteksi:",
|
|
"pressKeys": "Tekan tombol...",
|
|
"duplicateWith": "Bertentangan dengan {{action}}",
|
|
"record": "Rekam",
|
|
"resetToDefaults": "Reset ke Pengaturan Awal",
|
|
"info": "Pintasan keyboard membantu Anda bernavigasi dengan cepat. Perubahan disimpan ketika Anda mengklik \"Simpan Perubahan\" di bagian bawah halaman. Pintasan dinonaktifkan saat mengetik di kolom teks.",
|
|
"actions": {
|
|
"inbox": "Buat item Kotak Masuk baru",
|
|
"task": "Buat Tugas baru",
|
|
"project": "Buat Proyek baru",
|
|
"note": "Buat Catatan baru",
|
|
"area": "Buat Area baru",
|
|
"tag": "Buat Tag baru"
|
|
}
|
|
},
|
|
"connectedAccounts": {
|
|
"title": "Akun Terhubung",
|
|
"description": "Tautkan akun eksternal untuk masuk dengan penyedia SSO.",
|
|
"link": "Tautkan {{provider}}",
|
|
"unlink": "Hapus tautan",
|
|
"confirmUnlink": "Konfirmasi Hapus Tautan",
|
|
"linkedOn": "Tautkan pada {{date}}",
|
|
"cannotUnlinkLast": "Tidak dapat menghapus tautan metode otentikasi terakhir Anda. Silakan atur kata sandi terlebih dahulu.",
|
|
"noPasswordWarning": "Anda belum mengatur kata sandi. Pertimbangkan untuk mengatur satu untuk memiliki metode login alternatif."
|
|
}
|
|
},
|
|
"productivity": {
|
|
"stalledProjects": "Proyek Terhenti",
|
|
"stalledProjectsDesc": "Proyek ini tidak memiliki tugas atau tindakan",
|
|
"needsNextAction": "Proyek Memerlukan Tindakan Selanjutnya",
|
|
"needsNextActionDesc": "Proyek ini memiliki tugas yang telah diselesaikan tetapi tidak ada tindakan selanjutnya",
|
|
"tasksAreProjects": "Tugas yang Tampak Seperti Proyek",
|
|
"tasksAreProjectsDesc": "Tugas-tugas ini mungkin perlu dipecah",
|
|
"vagueTasks": "Tugas Tanpa Tindakan Jelas",
|
|
"vagueTasksDesc": "Tugas-tugas ini memerlukan kata kerja tindakan yang lebih jelas",
|
|
"staleTasks": "Tugas Usang",
|
|
"staleTasksDesc": "Tugas yang tidak diperbarui dalam {{days}} hari",
|
|
"stuckProjects": "Proyek Terjebak",
|
|
"stuckProjectsDesc": "Proyek yang tidak diperbarui baru-baru ini",
|
|
"reviewItems": "Klik untuk meninjau dan meningkatkan alur kerja Anda",
|
|
"suggestion": "Klik pada item mana pun di atas untuk membukanya dan melakukan perbaikan.",
|
|
"issuesFound_other": "{{count}} masalah produktivitas memerlukan perhatian",
|
|
"issuesFound_one": "1 masalah produktivitas membutuhkan perhatian"
|
|
},
|
|
"nextTask": {
|
|
"suggestion": "Karena tidak ada yang sedang berlangsung, bagaimana jika mulai dengan",
|
|
"suggestionTodayPlan": "Karena tidak ada yang sedang berlangsung, bagaimana jika mulai dengan tugas ini dari rencana hari ini",
|
|
"suggestionDueToday": "Karena tidak ada yang sedang berlangsung, bagaimana jika mulai dengan tugas ini yang jatuh tempo hari ini",
|
|
"suggestionSuggested": "Karena tidak ada yang sedang berlangsung, bagaimana jika mulai dengan tugas yang disarankan ini",
|
|
"letsDoIt": "Ya, mari kita lakukan!",
|
|
"starting": "Memulai...",
|
|
"startedSuccessfully": "Tugas berhasil dimulai!",
|
|
"giveMeSomethingElse": "Berikan saya sesuatu yang lain"
|
|
},
|
|
"modals": {
|
|
"confirmDelete": "Apakah Anda yakin ingin menghapus?",
|
|
"taskCreation": "Buat Tugas Baru",
|
|
"taskEdit": "Edit Tugas",
|
|
"deleteTask": {
|
|
"title": "Hapus Tugas",
|
|
"confirmation": "Apakah Anda yakin ingin menghapus tugas ini? Tindakan ini tidak dapat dibatalkan."
|
|
},
|
|
"noteCreation": "Buat Catatan Baru",
|
|
"noteEdit": "Edit Catatan",
|
|
"updateNote": "Perbarui Catatan",
|
|
"createNote": "Buat Catatan",
|
|
"submitting": "Mengirim...",
|
|
"areaCreation": "Buat Area Baru",
|
|
"areaEdit": "Edit Area",
|
|
"updateArea": "Perbarui Area",
|
|
"createArea": "Buat Area",
|
|
"updateTag": "Perbarui Tag",
|
|
"createTag": "Buat Tag",
|
|
"createProject": "Buat Proyek",
|
|
"updateProject": "Perbarui Proyek",
|
|
"deleteTag": {
|
|
"title": "Hapus Tag",
|
|
"message": "Apakah Anda yakin ingin menghapus tag \"{{tagName}}\"?"
|
|
},
|
|
"deleteArea": {
|
|
"title": "Hapus Area",
|
|
"message": "Apakah Anda yakin ingin menghapus area \"{{areaName}}\"?"
|
|
},
|
|
"deleteNote": {
|
|
"title": "Hapus Catatan",
|
|
"message": "Apakah Anda yakin ingin menghapus catatan \"{{noteTitle}}\"?"
|
|
},
|
|
"deleteProject": {
|
|
"title": "Hapus Proyek",
|
|
"message": "Apakah Anda yakin ingin menghapus proyek \"{{projectName}}\"?"
|
|
}
|
|
},
|
|
"forms": {
|
|
"title": "Judul",
|
|
"description": "Deskripsi",
|
|
"dueDate": "Tanggal Jatuh Tempo",
|
|
"deferUntil": "Defer until",
|
|
"priority": "Prioritas",
|
|
"status": "Status",
|
|
"assignedTo": "Ditetapkan Untuk",
|
|
"category": "Kategori",
|
|
"tags": "Tag",
|
|
"required": "Kolom ini wajib diisi",
|
|
"optional": "Opsional",
|
|
"task": {
|
|
"namePlaceholder": "Tambahkan Nama Tugas",
|
|
"statusAndOptions": "Status & Opsi",
|
|
"recurrence": "Pengulangan",
|
|
"labels": {
|
|
"tags": "Tag",
|
|
"project": "Proyek",
|
|
"status": "Status",
|
|
"priority": "Prioritas",
|
|
"dueDate": "Tanggal Jatuh Tempo",
|
|
"deferUntil": "Tunda Hingga",
|
|
"note": "Catatan",
|
|
"recurrenceType": "Ulangi",
|
|
"recurrenceInterval": "Setiap",
|
|
"weekday": "Pada hari",
|
|
"monthDay": "Hari dalam bulan",
|
|
"weekOfMonth": "Minggu dalam bulan",
|
|
"recurrenceEndDate": "Tanggal akhir (opsional)",
|
|
"completionBased": "Ulangi setelah penyelesaian",
|
|
"repeatOn": "Ulangi pada"
|
|
},
|
|
"projectSearchPlaceholder": "Cari atau buat proyek...",
|
|
"noMatchingProjects": "Tidak ada proyek yang cocok",
|
|
"creatingProject": "Membuat...",
|
|
"createProject": "+ Buat",
|
|
"recurrenceSettings": "Pengaturan Pengulangan",
|
|
"completionBasedHelp": "Jika dicentang, tugas berikutnya akan dibuat berdasarkan tanggal penyelesaian alih-alih tanggal jatuh tempo",
|
|
"dueDatePlaceholder": "Pilih tanggal jatuh tempo",
|
|
"endDatePlaceholder": "Pilih tanggal akhir",
|
|
"nameHelper": {
|
|
"title": "Buat lebih deskriptif!",
|
|
"suggestion": "Cobalah menambahkan lebih banyak detail seperti \"Hubungi dokter gigi untuk menjadwalkan janji pembersihan\" alih-alih hanya \"Hubungi dokter gigi\"",
|
|
"short": "Buat lebih deskriptif!",
|
|
"noVerb": "Tambahkan kata kerja aksi!",
|
|
"vague": "Jadilah lebih spesifik!"
|
|
},
|
|
"suggestions": {
|
|
"short": "Cobalah untuk lebih spesifik tentang apa yang perlu dilakukan",
|
|
"noVerb": "Tindakan spesifik apa yang perlu Anda ambil? Cobalah mulai dengan kata kerja.",
|
|
"vague": "Cobalah mulai dengan kata kerja aksi seperti \"Hubungi\", \"Tulis\", \"Jadwalkan\", atau \"Teliti\""
|
|
},
|
|
"selectAtLeastOneDay": "Silakan pilih setidaknya satu hari",
|
|
"deferUntilPlaceholder": "Pilih tanggal dan waktu tunda hingga"
|
|
},
|
|
"noteTitle": "Judul Catatan",
|
|
"noteContent": "Konten Catatan",
|
|
"noteTitlePlaceholder": "Masukkan judul catatan",
|
|
"noteContentPlaceholder": "Masukkan konten catatan",
|
|
"areaName": "Nama Area",
|
|
"areaDescription": "Deskripsi Area",
|
|
"areaNamePlaceholder": "Masukkan nama area",
|
|
"areaDescriptionPlaceholder": "Masukkan deskripsi area",
|
|
"tagName": "Nama Tag",
|
|
"tagNamePlaceholder": "Masukkan nama tag",
|
|
"tagInputPlaceholder": "Ketik untuk menambahkan tag",
|
|
"createTagOption": "+ Buat \"{{tagName}}\"",
|
|
"removeTagAriaLabel": "Hapus tag {{tagName}}",
|
|
"projectDescriptionPlaceholder": "Masukkan deskripsi proyek"
|
|
},
|
|
"auth": {
|
|
"login": "Masuk",
|
|
"register": "Daftar",
|
|
"forgotPassword": "Lupa Kata Sandi",
|
|
"email": "Email",
|
|
"password": "Kata Sandi",
|
|
"confirmPassword": "Konfirmasi Kata Sandi",
|
|
"username": "Nama Pengguna",
|
|
"signup": "Daftar",
|
|
"signin": "Masuk",
|
|
"signout": "Keluar",
|
|
"resetPassword": "Atur Ulang Kata Sandi",
|
|
"newPassword": "Kata Sandi Baru",
|
|
"rememberMe": "Ingat Saya",
|
|
"loginSuccess": "Login Berhasil",
|
|
"loginFailed": "Login Gagal",
|
|
"logoutSuccess": "Logout Berhasil",
|
|
"or_continue_with_email": "Atau lanjutkan dengan email",
|
|
"sign_in_with": "Masuk dengan {{provider}}",
|
|
"oidc": {
|
|
"completing_signin": "Menyelesaikan masuk...",
|
|
"authenticating_with_provider": "Mengautentikasi dengan penyedia. Silakan tunggu..."
|
|
}
|
|
},
|
|
"dropdown": {
|
|
"createNew": "Buat Baru",
|
|
"task": "Tugas",
|
|
"project": "Proyek",
|
|
"note": "Catatan",
|
|
"area": "Area",
|
|
"inbox": "Kotak Masuk",
|
|
"tag": "Tag"
|
|
},
|
|
"sort": {
|
|
"due_date": "Tanggal Jatuh Tempo",
|
|
"name": "Nama",
|
|
"priority": "Prioritas",
|
|
"status": "Status",
|
|
"created_at": "Dibuat Pada"
|
|
},
|
|
"priority": {
|
|
"low": "Rendah",
|
|
"medium": "Sedang",
|
|
"high": "Tinggi",
|
|
"none": "Tidak ada"
|
|
},
|
|
"status": {
|
|
"notStarted": "Belum Dimulai",
|
|
"inProgress": "Dalam Proses",
|
|
"done": "Selesai",
|
|
"archived": "Arsip",
|
|
"unknown": "Tidak Diketahui",
|
|
"telegramConnected": "Telegram terhubung dan memeriksa",
|
|
"telegramConnectionProblem": "Masalah koneksi Telegram",
|
|
"completed": "Selesai",
|
|
"waiting": "Menunggu"
|
|
},
|
|
"project": {
|
|
"name": "Nama Proyek",
|
|
"projectImage": "Gambar Proyek",
|
|
"uploadImageHint": "Unggah gambar untuk proyek Anda (maks 10MB)",
|
|
"browseImage": "Telusuri Gambar",
|
|
"noNotes": "Tidak ada catatan untuk proyek ini.",
|
|
"deleteProject": "Hapus Proyek",
|
|
"createSuccess": "Proyek berhasil dibuat!",
|
|
"createdAndAssigned": "Proyek dibuat dan ditugaskan",
|
|
"createError": "Gagal membuat proyek",
|
|
"viewProject": "Pergi ke proyek",
|
|
"editProject": "Edit proyek",
|
|
"editBanner": "Edit spanduk proyek",
|
|
"currentBanner": "Spanduk saat ini",
|
|
"choosePreset": "Pilih spanduk preset:",
|
|
"orUploadOwn": "Atau unggah milik Anda sendiri:"
|
|
},
|
|
"errors": {
|
|
"required": "Kolom ini diperlukan",
|
|
"invalidEmail": "Alamat email tidak valid",
|
|
"projectCreationFailed": "Gagal membuat proyek.",
|
|
"passwordMismatch": "Kata sandi tidak cocok",
|
|
"minLength": "Panjang minimum adalah {{length}} karakter",
|
|
"maxLength": "Panjang maksimum adalah {{length}} karakter",
|
|
"serverError": "Kesalahan server, silakan coba lagi nanti",
|
|
"networkError": "Kesalahan jaringan, silakan periksa koneksi Anda",
|
|
"somethingWentWrong": "Terjadi kesalahan, silakan coba lagi",
|
|
"taskFetch": "Gagal mengambil tugas.",
|
|
"projectFetch": "Gagal untuk mengambil proyek.",
|
|
"taskCreate": "Gagal untuk membuat tugas.",
|
|
"taskUpdate": "Gagal untuk memperbarui tugas.",
|
|
"taskDelete": "Gagal untuk menghapus tugas.",
|
|
"noteTitleRequired": "Judul catatan diperlukan.",
|
|
"failedToLoadTags": "Gagal untuk memuat tag yang tersedia.",
|
|
"failedToSaveNote": "Gagal untuk menyimpan catatan.",
|
|
"areaNameRequired": "Nama area diperlukan.",
|
|
"failedToSaveArea": "Gagal untuk menyimpan area.",
|
|
"tagNameRequired": "Nama tag diperlukan.",
|
|
"failedToSaveTag": "Gagal untuk menyimpan tag.",
|
|
"projectNameRequired": "Nama proyek diperlukan.",
|
|
"projectSaveFailed": "Gagal untuk menyimpan proyek.",
|
|
"projectImageTooLarge": "Gambar terlalu besar. Silakan pilih file di bawah 10MB.",
|
|
"projectImageUpload": "Gagal mengunggah gambar. Silakan coba file yang lebih kecil atau format yang berbeda.",
|
|
"bannerSaveFailed": "Gagal menyimpan spanduk"
|
|
},
|
|
"inbox": {
|
|
"title": "Kotak Masuk",
|
|
"empty": "Kotak masuk Anda kosong",
|
|
"emptyDescription": "Tangkap pikiran dan ide dengan cepat menggunakan ikon ⚡ di navbar atas atau tombol + di sidebar",
|
|
"description": "Kotak masuk adalah tempat semua tugas yang tidak tercategorikan berada. Tugas yang belum ditugaskan ke proyek atau tidak memiliki tanggal jatuh tempo akan muncul di sini. Ini adalah area 'pembuangan otak' Anda di mana Anda dapat dengan cepat mencatat tugas dan mengorganisasikannya nanti.",
|
|
"captureThought": "Tangkap pikiran Anda...",
|
|
"saveToInbox": "Simpan ke Kotak Masuk",
|
|
"itemAdded": "Item ditambahkan ke kotak masuk",
|
|
"itemProcessed": "Item diproses",
|
|
"itemDeleted": "Item dihapus",
|
|
"itemUpdated": "Item diperbarui",
|
|
"newTelegramItem": "Item baru dari Telegram: {{content}}",
|
|
"newItem": "Item baru di kotak masuk ditambahkan: {{content}}",
|
|
"multipleNewItems": "{{count}} item baru lainnya ditambahkan",
|
|
"loadError": "Gagal memuat item kotak masuk",
|
|
"addError": "Gagal menambahkan item kotak masuk",
|
|
"processError": "Gagal memproses item kotak masuk",
|
|
"deleteError": "Gagal menghapus item kotak masuk",
|
|
"updateError": "Gagal memperbarui item kotak masuk",
|
|
"contentRequired": "Konten tidak boleh kosong",
|
|
"createTask": "Buat tugas",
|
|
"createProject": "Buat proyek",
|
|
"createNote": "Buat catatan",
|
|
"convertTo": "Konversi ke",
|
|
"unprocessedItems": "Anda memiliki {{count}} item di kotak masuk Anda",
|
|
"processNow": "Proses sekarang",
|
|
"deleteConfirmTitle": "Hapus Item",
|
|
"deleteConfirmMessage": "Apakah Anda yakin ingin menghapus item ini dari kotak masuk Anda? Tindakan ini tidak dapat dibatalkan.",
|
|
"loadMoreError": "Gagal memuat lebih banyak item",
|
|
"loading": "Memuat...",
|
|
"loadMore": "Muat lebih banyak item kotak masuk",
|
|
"showingItems": "Menampilkan {{current}} dari {{total}} item"
|
|
},
|
|
"dateFormats": {
|
|
"long": "EEEE, MMMM d, yyyy",
|
|
"short": "MMM d, yyyy",
|
|
"monthYear": "MMMM yyyy",
|
|
"dayMonth": "MMMM d",
|
|
"time": "h:mm a",
|
|
"dateTime": "MMM d, yyyy h:mm a",
|
|
"todayHeader": "dddd, MMMM do, yyyy"
|
|
},
|
|
"dateIndicators": {
|
|
"today": "HARI INI",
|
|
"total": "Total",
|
|
"tomorrow": "ESOK",
|
|
"yesterday": "KEMARIN",
|
|
"nextWeek": "minggu depan",
|
|
"nextMonth": "bulan depan"
|
|
},
|
|
"taskViews": {
|
|
"project": {
|
|
"withName": "Anda saat ini melihat semua tugas yang terkait dengan proyek \"{{projectName}}\". Anda dapat mengorganisir tugas dalam proyek ini, menetapkan prioritasnya, dan melacak penyelesaiannya. Gunakan ruang ini untuk fokus pada tugas yang secara khusus milik proyek ini.",
|
|
"noName": "Anda sedang melihat tugas untuk proyek tertentu. Gunakan ruang ini untuk mengelola dan melacak tugas yang terkait dengan proyek ini."
|
|
},
|
|
"today": "Ini adalah tugas yang jatuh tempo hari ini atau tugas yang telah Anda jadwalkan untuk perhatian segera. Gunakan tampilan ini untuk fokus pada apa yang perlu diselesaikan hari ini. Tandai tugas sebagai selesai, perbarui statusnya, atau sesuaikan tanggal jatuh temponya jika perlu.",
|
|
"total": "Total",
|
|
"inbox": "Kotak masuk adalah tempat semua tugas yang tidak terkategori berada. Tugas yang belum ditugaskan ke proyek atau diberikan tanggal jatuh tempo akan muncul di sini. Ini adalah area \"brain dump\" Anda di mana Anda dapat dengan cepat mencatat tugas dan mengorganisirnya nanti.",
|
|
"next": "Tampilan ini menunjukkan semua tugas yang dapat dikerjakan dalam waktu dekat. Tugas-tugas ini siap untuk dikerjakan selanjutnya dan tidak memiliki tenggat waktu jangka panjang. Ini adalah tempat yang baik untuk fokus ketika Anda ingin membuat kemajuan cepat pada tugas.",
|
|
"upcoming": "Tampilan ini menyoroti tugas yang dijadwalkan untuk minggu mendatang. Ini membantu Anda mempersiapkan dan tetap di depan tenggat waktu dengan memberikan gambaran umum tentang pekerjaan yang perlu Anda tangani dalam waktu dekat. Tugas dengan tanggal jatuh tempo dalam 7 hari ke depan akan muncul di sini.",
|
|
"someday": "Tampilan \"Suatu Hari\" adalah untuk tugas yang tidak mendesak dan tidak memiliki tanggal jatuh tempo tertentu. Ini adalah tugas yang mungkin ingin Anda kerjakan di suatu saat, tetapi bukan prioritas saat ini. Gunakan bagian ini untuk melacak ide atau tujuan jangka panjang.",
|
|
"completed": "Di sini Anda dapat melihat semua tugas yang telah Anda selesaikan. Ini adalah cara yang bagus untuk meninjau pencapaian Anda dan merenungkan pekerjaan yang telah Anda selesaikan. Anda juga dapat menemukan tugas yang mungkin perlu diarsipkan kembali atau dirujuk di masa depan.",
|
|
"allTasks": "Anda sedang melihat semua tugas. Ini termasuk tugas dari berbagai proyek, tugas tanpa tanggal jatuh tempo tertentu, dan tugas dengan tingkat prioritas yang bervariasi. Gunakan tampilan ini untuk melihat secara keseluruhan semua yang ada dalam daftar tugas Anda."
|
|
},
|
|
"success": {
|
|
"noteUpdated": "Catatan berhasil diperbarui!",
|
|
"noteCreated": "Catatan berhasil dibuat!",
|
|
"areaUpdated": "Area berhasil diperbarui!",
|
|
"areaCreated": "Area berhasil dibuat!",
|
|
"tagUpdated": "Tag berhasil diperbarui!",
|
|
"tagCreated": "Tag berhasil dibuat!",
|
|
"projectCreated": "Proyek berhasil dibuat!",
|
|
"projectDeleted": "Proyek berhasil dihapus!",
|
|
"nextActionAdded": "Tindakan berikutnya berhasil ditambahkan!",
|
|
"taskCreated": "Tugas berhasil dibuat!",
|
|
"taskUpdated": "Tugas berhasil diperbarui!",
|
|
"taskDeleted": "Tugas berhasil dihapus!",
|
|
"noteDeleted": "Catatan berhasil dihapus!",
|
|
"bannerUpdated": "Spanduk berhasil diperbarui!"
|
|
},
|
|
"note": {
|
|
"title": "Judul",
|
|
"content": "Konten",
|
|
"titlePlaceholder": "Masukkan judul catatan",
|
|
"contentPlaceholder": "Masukkan konten catatan",
|
|
"project": "Proyek Terkait (Opsional)",
|
|
"createSuccess": "Catatan berhasil dibuat",
|
|
"createError": "Gagal membuat catatan"
|
|
},
|
|
"task": {
|
|
"labels": {
|
|
"tags": "Tag",
|
|
"project": "Proyek",
|
|
"status": "Status",
|
|
"priority": "Prioritas",
|
|
"dueDate": "Tanggal Jatuh Tempo",
|
|
"deferUntil": "Defer until",
|
|
"note": "Catatan"
|
|
},
|
|
"create": "Buat",
|
|
"addTaskName": "Tambahkan nama tugas",
|
|
"createSuccess": "Tugas berhasil dibuat",
|
|
"createError": "Gagal membuat tugas",
|
|
"saveAsTask": "Simpan sebagai Tugas",
|
|
"updateSuccess": "Tugas berhasil diperbarui",
|
|
"updateError": "Gagal memperbarui tugas",
|
|
"deleteSuccess": "Tugas berhasil dihapus",
|
|
"deleteError": "Gagal menghapus tugas",
|
|
"startedSuccessfully": "Tugas berhasil dimulai!",
|
|
"created": "Tugas",
|
|
"createdSuccessfully": "berhasil dibuat!",
|
|
"updated": "Tugas",
|
|
"updatedSuccessfully": "berhasil diperbarui!",
|
|
"deleted": "Tugas",
|
|
"deletedSuccessfully": "berhasil dihapus!",
|
|
"suggestions": {
|
|
"short": "Cobalah untuk lebih spesifik tentang apa yang perlu dilakukan",
|
|
"noVerb": "Apa tindakan spesifik yang perlu Anda ambil? Cobalah mulai dengan kata kerja.",
|
|
"vague": "Cobalah mulai dengan kata kerja aksi seperti \"Panggil\", \"Tulis\", \"Jadwalkan\", atau \"Riset\""
|
|
},
|
|
"nameHelper": {
|
|
"title": "Buat lebih deskriptif!",
|
|
"suggestion": "Cobalah menambahkan lebih banyak detail seperti \"Hubungi dokter gigi untuk menjadwalkan janji pembersihan\" alih-alih hanya \"Hubungi dokter gigi\""
|
|
},
|
|
"overdueAlert": "Tugas ini ada dalam rencana Anda kemarin dan belum diselesaikan.",
|
|
"overdueYesterday": "Pertimbangkan untuk memprioritaskan tugas ini atau membaginya menjadi langkah-langkah yang lebih kecil.",
|
|
"overdueMultipleDays": "Tugas ini telah ditunda {{count}} kali.",
|
|
"content": "Konten",
|
|
"noNotes": "Belum ada konten yang ditambahkan",
|
|
"subtasks": "Subtugas",
|
|
"noSubtasks": "Belum ada subtugas",
|
|
"recentActivity": "Aktivitas Terbaru",
|
|
"noActivityYet": "Belum ada aktivitas",
|
|
"thisTask": "Tugas ini",
|
|
"is": "adalah",
|
|
"and": "dan",
|
|
"dueOn": "jatuh tempo",
|
|
"inProject": "dari proyek",
|
|
"lowPriority": "prioritas rendah",
|
|
"mediumPriority": "prioritas sedang",
|
|
"highPriority": "prioritas tinggi",
|
|
"inDays": "dalam {{count}} hari",
|
|
"daysAgo": "{{count}} hari yang lalu",
|
|
"tagsUpdated": "Tag berhasil diperbarui",
|
|
"tagsUpdateError": "Gagal memperbarui tag",
|
|
"recurrenceUpdated": "Perulangan berhasil diperbarui",
|
|
"recurrenceUpdateError": "Gagal memperbarui perulangan",
|
|
"dueDateUpdated": "Tanggal jatuh tempo berhasil diperbarui",
|
|
"dueDateUpdateError": "Gagal memperbarui tanggal jatuh tempo",
|
|
"titleUpdated": "Judul tugas berhasil diperbarui",
|
|
"titleUpdateError": "Gagal memperbarui judul tugas",
|
|
"contentUpdated": "Konten tugas berhasil diperbarui",
|
|
"contentUpdateError": "Gagal memperbarui konten tugas",
|
|
"subtasksUpdated": "Subtugas berhasil diperbarui",
|
|
"subtasksUpdateError": "Gagal memperbarui subtugas",
|
|
"projectUpdated": "Proyek berhasil diperbarui",
|
|
"projectUpdateError": "Gagal memperbarui proyek",
|
|
"projectCleared": "Proyek berhasil dibersihkan",
|
|
"projectClearError": "Gagal membersihkan proyek",
|
|
"priorityUpdated": "Prioritas berhasil diperbarui",
|
|
"priorityUpdateError": "Gagal memperbarui prioritas",
|
|
"status": {
|
|
"notStarted": "belum dimulai",
|
|
"inProgress": "sedang berlangsung",
|
|
"done": "selesai",
|
|
"archived": "diarsipkan",
|
|
"unknown": "berlangsung",
|
|
"waiting": "Menunggu",
|
|
"setAsDone": "Tandai sebagai selesai",
|
|
"planned": "Direncanakan",
|
|
"cancelled": "Dibatalkan"
|
|
},
|
|
"noSubtasksClickToAdd": "Belum ada subtugas, klik untuk menambah",
|
|
"project": "Proyek",
|
|
"noProject": "Tidak ada proyek - Klik untuk menugaskan",
|
|
"tags": "Tag",
|
|
"noTags": "Tidak ada tag",
|
|
"priority": "Prioritas",
|
|
"dueDate": "Tanggal Jatuh Tempo",
|
|
"deferUntil": "Tunda Hingga",
|
|
"recurringSetup": "Pengaturan Berulang",
|
|
"notRecurring": "Tugas ini belum berulang.",
|
|
"clickToEditTitle": "Klik untuk mengedit judul",
|
|
"clickToEditContent": "Klik untuk mengedit konten",
|
|
"clickToAddContent": "Klik untuk menambah konten",
|
|
"clickToEditSubtasks": "Klik untuk mengedit subtugas",
|
|
"clickToAddOrEditSubtasks": "Klik untuk menambah atau mengedit subtugas",
|
|
"contentPlaceholder": "Tambahkan konten di sini... (Markdown didukung)",
|
|
"contentEditHint": "Tekan Cmd/Ctrl+Enter untuk menyimpan, Esc untuk membatalkan",
|
|
"noContentPreview": "Tidak ada konten untuk ditampilkan. Beralih ke mode Edit untuk menambahkan konten.",
|
|
"deleteConfirmTitle": "Hapus Tugas",
|
|
"deleteConfirmMessage": "Apakah Anda yakin ingin menghapus tugas ini? Tindakan ini tidak dapat dibatalkan.",
|
|
"noMoreIterations": "Tidak ada iterasi lain yang dijadwalkan",
|
|
"nextOccurrences": "Kejadian Berikutnya",
|
|
"nextOccurrencesAfterThis": "Kejadian Berikutnya Setelah Ini",
|
|
"noDueDate": "Tidak ada tanggal jatuh tempo",
|
|
"instanceOf": "Ini adalah instance dari tugas berulang",
|
|
"parentTask": "Tugas Induk",
|
|
"includingToday": "termasuk hari ini",
|
|
"has": "memiliki",
|
|
"fromProject": "dari proyek",
|
|
"noDeferUntil": "Tidak ada tunda hingga",
|
|
"deferUntilUpdated": "Tunda hingga diperbarui dengan sukses",
|
|
"deferUntilUpdateError": "Gagal memperbarui tunda hingga",
|
|
"showOverdueWarning": "Tampilkan peringatan keterlambatan",
|
|
"dueDateInPastWarning": "Peringatan: Anda sedang menetapkan tanggal jatuh tempo di masa lalu",
|
|
"overview": "Ikhtisar",
|
|
"schedule": "Jadwal",
|
|
"attachments": "Lampiran",
|
|
"attachmentsComingSoon": "Fitur lampiran akan segera hadir",
|
|
"activity": "Aktivitas",
|
|
"lastUpdatedAt": "Terakhir diperbarui pada",
|
|
"statusUpdated": "Status berhasil diperbarui",
|
|
"statusUpdateError": "Gagal memperbarui status",
|
|
"updatedAt": "Diperbarui pada",
|
|
"upcoming": "mendatang"
|
|
},
|
|
"projects": {
|
|
"loading": "Memuat proyek...",
|
|
"error": "Kesalahan memuat proyek",
|
|
"searchPlaceholder": "Cari proyek...",
|
|
"title": "Proyek",
|
|
"noProjectsFound": "Tidak ada proyek ditemukan",
|
|
"cardViewAriaLabel": "Tampilan Kartu",
|
|
"listViewAriaLabel": "Tampilan Daftar",
|
|
"active": "Aktif",
|
|
"inactive": "Tidak Aktif",
|
|
"metrics": "Proyek",
|
|
"filters": {
|
|
"active": "Aktif",
|
|
"inactive": "Tidak Aktif",
|
|
"all": "Semua",
|
|
"allAreas": "Semua Area",
|
|
"notCompleted": "Belum Selesai"
|
|
},
|
|
"selectState": "Pilih Status",
|
|
"state": "Status Proyek",
|
|
"states": {
|
|
"idea": "Ide",
|
|
"planned": "Direncanakan",
|
|
"in_progress": "Sedang Berlangsung",
|
|
"blocked": "Terblokir",
|
|
"completed": "Selesai",
|
|
"idea_desc": "Tercatat tetapi belum direncanakan",
|
|
"planned_desc": "Sudah ditentukan dan siap untuk dimulai",
|
|
"in_progress_desc": "Pekerjaan aktif sedang berlangsung",
|
|
"blocked_desc": "Sementara terhenti atau terjebak",
|
|
"completed_desc": "Selesai dan selesai",
|
|
"active": "Sedang Berlangsung",
|
|
"active_desc": "Pekerjaan aktif sedang berlangsung"
|
|
},
|
|
"showMetrics": "Tampilkan metrik",
|
|
"hideMetrics": "Sembunyikan metrik",
|
|
"progress": "Kemajuan",
|
|
"taskMomentum": "Momentum tugas",
|
|
"activeTasks": "Tugas aktif",
|
|
"dueSchedule": "Jadwal jatuh tempo",
|
|
"next14Days": "14 hari ke depan",
|
|
"noUpcomingDue": "Tidak ada tanggal jatuh tempo dalam 14 hari ke depan.",
|
|
"peakDay": "Puncak",
|
|
"none": "Tidak ada",
|
|
"next3days": "3 hari ke depan",
|
|
"nextWeek": "7 hari ke depan",
|
|
"recentCompletion": "Penyelesaian terkini",
|
|
"last7And30": "7 & 30 hari terakhir",
|
|
"weeklyPace": "Kecepatan mingguan",
|
|
"prevWeekCompleted": "{{count}} minggu sebelumnya",
|
|
"vsPrevWeek": "vs minggu sebelumnya",
|
|
"monthlyCompletion": "Penyelesaian 30 hari",
|
|
"last30Days": "30 hari terakhir",
|
|
"nextUp": "Tindakan terbaik selanjutnya",
|
|
"focusTask": "Tugas paling berdampak",
|
|
"focusHint": "Memindahkan tugas ini ke sedang berlangsung dan hari ini",
|
|
"noNextAction": "Semua bersih—tidak ada tugas tertunda."
|
|
},
|
|
"projectItem": {
|
|
"edit": "Sunting",
|
|
"delete": "Hapus",
|
|
"completion": "Penyelesaian",
|
|
"completionPercentage": "{{percentage}}% selesai",
|
|
"toggleDropdownMenu": "Alihkan menu dropdown",
|
|
"projectInitials": "Inisial proyek",
|
|
"share": "Bagikan",
|
|
"sharedProject": "Dibagikan dengan tim",
|
|
"noDueDate": "Tidak ada tanggal jatuh tempo",
|
|
"dueToday": "Jatuh tempo hari ini",
|
|
"dueIn": "Jatuh tempo dalam {{count}} {{unit}}",
|
|
"overdue": "Terlambat {{count}} {{unit}}",
|
|
"day": "hari",
|
|
"days": "hari",
|
|
"sharedUser": "Pengguna bersama",
|
|
"moreSharedUsers": "+{{count}} pengguna lagi"
|
|
},
|
|
"areas": {
|
|
"title": "Area",
|
|
"noAreasFound": "Tidak ada area ditemukan",
|
|
"editAreaAriaLabel": "Edit area {{name}}",
|
|
"editAreaTitle": "Edit area {{name}}",
|
|
"deleteAreaAriaLabel": "Hapus area {{name}}",
|
|
"deleteAreaTitle": "Hapus area {{name}}",
|
|
"addArea": "Tambah Area",
|
|
"loading": "Memuat detail area...",
|
|
"error": "Kesalahan memuat detail area.",
|
|
"notFound": "Area tidak ditemukan.",
|
|
"details": "Detail Area",
|
|
"viewProjects": "Lihat Proyek di {{name}}"
|
|
},
|
|
"notes": {
|
|
"loading": "Memuat catatan...",
|
|
"error": "Kesalahan memuat catatan",
|
|
"searchPlaceholder": "Cari catatan...",
|
|
"noNotesFound": "Tidak ada catatan ditemukan",
|
|
"title": "Catatan",
|
|
"deleteNoteAriaLabel": "Hapus catatan {{noteTitle}}",
|
|
"deleteNoteTitle": "Hapus catatan {{noteTitle}}",
|
|
"editNoteAriaLabel": "Edit catatan {{noteTitle}}",
|
|
"editNoteTitle": "Edit catatan {{noteTitle}}"
|
|
},
|
|
"tags": {
|
|
"loading": "Memuat tag...",
|
|
"searchPlaceholder": "Cari tag...",
|
|
"title": "Tag",
|
|
"noTagsFound": "Tidak ada tag ditemukan",
|
|
"editTagAriaLabel": "Edit tag {{tagName}}",
|
|
"editTagTitle": "Edit tag {{tagName}}",
|
|
"deleteTagAriaLabel": "Hapus tag {{tagName}}",
|
|
"deleteTagTitle": "Hapus tag {{tagName}}",
|
|
"error": "Kesalahan saat mengambil tag.",
|
|
"notFound": "Tag tidak ditemukan.",
|
|
"details": "Detail Tag",
|
|
"name": "Nama",
|
|
"status": "Status",
|
|
"active": "Aktif",
|
|
"inactive": "Tidak Aktif",
|
|
"viewTasksWithTag": "Lihat tugas dengan tag ini",
|
|
"typeToAdd": "Ketik untuk menambahkan tag",
|
|
"noItemsWithTag": "Tidak ada item yang ditemukan dengan tag ini"
|
|
},
|
|
"recurrence": {
|
|
"none": "Tidak ada",
|
|
"daily": "Harian",
|
|
"weekly": "Mingguan",
|
|
"monthly": "Bulanan",
|
|
"monthlyWeekday": "Bulanan pada hari kerja",
|
|
"monthlyLastDay": "Bulanan pada hari terakhir",
|
|
"firstWeek": "Minggu pertama",
|
|
"secondWeek": "Minggu kedua",
|
|
"thirdWeek": "Minggu ketiga",
|
|
"fourthWeek": "Minggu keempat",
|
|
"lastWeek": "Minggu terakhir",
|
|
"days": "hari",
|
|
"loadingParentSettings": "Memuat pengaturan pengulangan tugas induk...",
|
|
"recurringTaskInstance": "Instansi Tugas Berulang",
|
|
"inheritedSettingsMessage": "Tugas ini dihasilkan dari tugas berulang. Pengaturan pengulangan yang ditunjukkan di bawah ini diwarisi dari tugas asli dan tidak dapat diedit di sini.",
|
|
"cancelEdit": "Batalkan Edit",
|
|
"editParentRecurrence": "Edit Pengulangan Induk",
|
|
"parentEditWarning": "⚠️ Anda sedang mengedit pengaturan pengulangan tugas induk. Perubahan akan mempengaruhi semua instance masa depan dari tugas berulang ini."
|
|
},
|
|
"weekdays": {
|
|
"sunday": "Min",
|
|
"monday": "Sen",
|
|
"tuesday": "Sel",
|
|
"wednesday": "Rab",
|
|
"thursday": "Kam",
|
|
"friday": "Jum",
|
|
"saturday": "Sab"
|
|
},
|
|
"pomodoro": {
|
|
"play": "Main",
|
|
"pause": "Jeda",
|
|
"reset": "Atur Ulang",
|
|
"close": "Tutup",
|
|
"complete": "Pomodoro Selesai!",
|
|
"completeMessage": "Kerja bagus! Saatnya istirahat.",
|
|
"done": "Selesai"
|
|
},
|
|
"calendar": {
|
|
"month": "Bulan",
|
|
"week": "Minggu",
|
|
"day": "Hari",
|
|
"today": "Hari Ini",
|
|
"total": "Total",
|
|
"addEvent": "Tambah Acara",
|
|
"weekView": "Tampilan Minggu",
|
|
"dayView": "Tampilan Hari",
|
|
"loadingTasks": "Memuat tugas...",
|
|
"noEvents": "Tidak ada acara untuk hari ini",
|
|
"moreEvents": "lebih banyak",
|
|
"googleIntegration": "Integrasi Google Calendar",
|
|
"googleDescription": "Hubungkan Google Calendar Anda untuk menyinkronkan acara dan melihatnya bersamaan dengan tugas Anda.",
|
|
"googleStatus": "Status",
|
|
"notConnected": "Tidak Terhubung",
|
|
"connected": "Terhubung",
|
|
"connectGoogle": "Sambungkan Google Calendar",
|
|
"disconnectGoogle": "Putuskan Sambungan Google Calendar",
|
|
"connecting": "Menghubungkan...",
|
|
"connectionError": "Gagal terhubung ke Google Calendar. Silakan coba lagi.",
|
|
"disconnectionError": "Gagal memutuskan sambungan dari Google Calendar. Silakan coba lagi.",
|
|
"taskDetails": "Detail Tugas",
|
|
"editTask": "Edit Tugas",
|
|
"goToTasks": "Pergi ke Tugas",
|
|
"close": "Tutup",
|
|
"title": "Judul",
|
|
"status": "Status",
|
|
"dueDate": "Tanggal Jatuh Tempo",
|
|
"deferUntil": "Defer until",
|
|
"priority": "Prioritas",
|
|
"project": "Proyek",
|
|
"area": "Area",
|
|
"description": "Deskripsi",
|
|
"created": "Dibuat",
|
|
"completed": "Selesai",
|
|
"pending": "Tertunda",
|
|
"high": "Tinggi",
|
|
"medium": "Sedang",
|
|
"low": "Rendah",
|
|
"time": "Waktu",
|
|
"allDay": "Sepanjang hari"
|
|
},
|
|
"pages": {
|
|
"notFound": {
|
|
"title": "404 - Halaman Tidak Ditemukan",
|
|
"message": "Halaman yang Anda cari tidak ada."
|
|
}
|
|
},
|
|
"navbar": {
|
|
"appName": "tududi",
|
|
"quickInboxCapture": "Tangkap Kotak Masuk Cepat",
|
|
"userMenu": "Menu Pengguna",
|
|
"collapseSidebar": "Sembunyikan Sidebar",
|
|
"expandSidebar": "Perluas Sidebar"
|
|
},
|
|
"upload": {
|
|
"uploading": "Mengunggah..."
|
|
},
|
|
"searchPlaceholders": {
|
|
"searchProjects": "Cari proyek...",
|
|
"searchTags": "Cari tag...",
|
|
"searchTasks": "Cari tugas..."
|
|
},
|
|
"ariaLabels": {
|
|
"hideInfo": "Sembunyikan info",
|
|
"aboutTasks": "Tentang Tugas",
|
|
"hideSearch": "Sembunyikan pencarian",
|
|
"searchTasks": "Cari Tugas",
|
|
"aboutInbox": "Tentang Kotak Masuk",
|
|
"collapseInfoPanel": "Tutup panel informasi",
|
|
"showTasksInformation": "Tampilkan informasi tugas",
|
|
"collapseSearchPanel": "Tutup panel pencarian",
|
|
"showSearchInput": "Tampilkan input pencarian",
|
|
"showInboxInformation": "Tampilkan informasi kotak masuk"
|
|
},
|
|
"api": {
|
|
"errors": {
|
|
"authenticationRequired": "Autentikasi diperlukan",
|
|
"userNotFound": "Pengguna tidak ditemukan",
|
|
"authenticationError": "Kesalahan autentikasi",
|
|
"internalServerError": "Kesalahan server internal",
|
|
"invalidLoginParameters": "Parameter login tidak valid.",
|
|
"invalidCredentials": "Kredensial tidak valid",
|
|
"couldNotLogout": "Tidak dapat keluar",
|
|
"loggedOutSuccessfully": "Berhasil keluar",
|
|
"contentRequired": "Konten diperlukan",
|
|
"inboxItemNotFound": "Item kotak masuk tidak ditemukan.",
|
|
"inboxItemDeleted": "Item kotak masuk berhasil dihapus",
|
|
"contentRequiredString": "Konten diperlukan dan harus berupa string",
|
|
"problemCreatingInboxItem": "Terjadi masalah saat membuat item kotak masuk.",
|
|
"problemUpdatingInboxItem": "Terjadi masalah saat memperbarui item kotak masuk.",
|
|
"problemDeletingInboxItem": "Terjadi masalah saat menghapus item kotak masuk.",
|
|
"problemProcessingInboxItem": "Terjadi masalah saat memproses item kotak masuk.",
|
|
"invalidOrderColumn": "Kolom urutan yang ditentukan tidak valid.",
|
|
"taskNotFound": "Tugas tidak ditemukan.",
|
|
"taskNameRequired": "Nama tugas diperlukan.",
|
|
"invalidProject": "Proyek tidak valid.",
|
|
"unableToUpdateTask": "Tidak dapat memperbarui tugas",
|
|
"taskDeleted": "Tugas berhasil dihapus",
|
|
"failedToGenerateRecurringTasks": "Gagal menghasilkan tugas berulang",
|
|
"failedToUpdateTodayFlag": "Gagal memperbarui tanda tugas hari ini",
|
|
"noImageProvided": "Tidak ada file gambar yang disediakan",
|
|
"failedToUploadImage": "Gagal mengunggah gambar",
|
|
"projectNotFound": "Proyek tidak ditemukan",
|
|
"projectNameRequired": "Nama proyek diperlukan",
|
|
"projectDeleted": "Proyek berhasil dihapus",
|
|
"noteNotFound": "Catatan tidak ditemukan.",
|
|
"noteDeleted": "Catatan berhasil dihapus.",
|
|
"profileNotFound": "Profil tidak ditemukan.",
|
|
"passwordTooShort": "Kata sandi harus terdiri dari setidaknya 6 karakter",
|
|
"currentPasswordIncorrect": "Kata sandi saat ini salah",
|
|
"failedToUpdateProfile": "Gagal memperbarui profil.",
|
|
"passwordChangeRequired": "Kata sandi saat ini dan kata sandi baru diperlukan",
|
|
"passwordChangedSuccessfully": "Kata sandi berhasil diubah",
|
|
"failedToUpdateTaskSummary": "Gagal memperbarui pengaturan ringkasan tugas.",
|
|
"frequencyRequired": "Frekuensi diperlukan.",
|
|
"invalidFrequency": "Nilai frekuensi tidak valid.",
|
|
"failedToStartTelegramPolling": "Gagal memulai polling Telegram.",
|
|
"failedToStopTelegramPolling": "Gagal menghentikan polling Telegram.",
|
|
"invalidTelegramTokenFormat": "Format token bot Telegram tidak valid.",
|
|
"invalidBotToken": "Token bot tidak valid atau bot tidak dapat diakses.",
|
|
"chatIdRequired": "ID obrolan diperlukan.",
|
|
"areaNotFound": "Area tidak ditemukan atau tidak milik pengguna saat ini.",
|
|
"areaNameRequired": "Nama area diperlukan.",
|
|
"tagNotFound": "Tag tidak ditemukan",
|
|
"tagNameRequired": "Nama tag diperlukan",
|
|
"tagDeleted": "Tag berhasil dihapus",
|
|
"demoModeGoogleCalendar": "Mode demo: integrasi Google Calendar disimulasikan",
|
|
"failedToGenerateAuthUrl": "Gagal menghasilkan URL otorisasi",
|
|
"authCodeNotProvided": "Kode otorisasi tidak disediakan",
|
|
"failedToCheckCalendarStatus": "Gagal memeriksa status kalender",
|
|
"failedToFetchCalendarEvents": "Gagal mengambil acara kalender",
|
|
"googleCalendarDisconnected": "Google Calendar terputus",
|
|
"failedToDisconnectCalendar": "Gagal memutuskan kalender",
|
|
"urlParameterRequired": "Parameter URL diperlukan",
|
|
"couldNotExtractMetadata": "Tidak dapat mengekstrak metadata",
|
|
"textParameterRequired": "Parameter teks diperlukan",
|
|
"notFound": "Tidak Ditemukan",
|
|
"resourceNotFound": "Sumber yang diminta tidak dapat ditemukan."
|
|
}
|
|
},
|
|
"telegram": {
|
|
"welcomeMessage": "🎉 Selamat datang di tududi!\n\nBot manajemen tugas pribadi Anda sekarang terhubung dan siap membantu!\n\n📝 Cukup kirimkan saya pesan apa pun dan saya akan menambahkannya ke kotak masuk tududi Anda sebagai item.\n\n✨ Perintah:\n• /help - Tampilkan informasi bantuan\n• /start - Tampilkan pesan sambutan\n• Cukup ketik teks apa pun - Tambahkan sebagai item kotak masuk\n\nMari kita terorganisir! 🚀",
|
|
"helpMessage": "📋 Bantuan Bot tududi\n\nKirimkan saya pesan teks apa pun dan saya akan menambahkannya ke kotak masuk tududi Anda sebagai item kotak masuk.\n\nPerintah:\n/start - Pesan sambutan\n/help - Tampilkan pesan bantuan ini\n\nCukup ketik item Anda dan saya akan mengurus sisanya!",
|
|
"commandProcessed": "Perintah diproses dengan sukses",
|
|
"messageProcessed": "Pesan diproses dengan sukses",
|
|
"failedToAddToInbox": "❌ Gagal menambah ke kotak masuk: {{error}}"
|
|
},
|
|
"about": {
|
|
"title": "Tentang",
|
|
"version": "Versi",
|
|
"description": "Manajemen tugas yang dihosting sendiri dengan organisasi hierarkis, dukungan multi-bahasa, dan integrasi Telegram. Dibangun dengan cinta untuk para penggemar produktivitas.",
|
|
"madeWithLove": "Dibuat dengan cinta",
|
|
"appreciation": "Terima kasih telah menggunakan tududi! Dukungan Anda membantu menjaga proyek ini tetap hidup dan berkembang. Jika Anda merasa ini berguna, pertimbangkan untuk mendukung pengembangannya.",
|
|
"supportDevelopment": "Dukung Pengembangan",
|
|
"community": "Komunitas",
|
|
"viewOnGitHub": "Lihat di GitHub",
|
|
"license": "Lisensi untuk penggunaan pribadi",
|
|
"builtBy": "Dibangun oleh"
|
|
},
|
|
"weekdaysFull": {
|
|
"sunday": "Minggu",
|
|
"monday": "Senin",
|
|
"tuesday": "Selasa",
|
|
"wednesday": "Rabu",
|
|
"thursday": "Kamis",
|
|
"friday": "Jumat",
|
|
"saturday": "Sabtu"
|
|
},
|
|
"admin": {
|
|
"manageUsers": "Kelola pengguna",
|
|
"userManagement": "Manajemen Pengguna",
|
|
"addUser": "Tambah pengguna",
|
|
"remove": "Hapus",
|
|
"email": "Email",
|
|
"created": "Dibuat",
|
|
"role": "Peran",
|
|
"loadingUsers": "Memuat pengguna...",
|
|
"noUsers": "Tidak ada pengguna",
|
|
"admin": "admin",
|
|
"user": "pengguna",
|
|
"password": "Kata Sandi",
|
|
"name": "Nama",
|
|
"surname": "Nama Belakang",
|
|
"authenticationRequired": "Autentikasi diperlukan",
|
|
"forbidden": "Dilarang",
|
|
"failedToLoadUsers": "Gagal memuat pengguna",
|
|
"emailAlreadyExists": "Email sudah ada",
|
|
"failedToCreateUser": "Gagal membuat pengguna",
|
|
"badRequest": "Permintaan tidak valid",
|
|
"userNotFound": "Pengguna tidak ditemukan",
|
|
"failedToDeleteUser": "Gagal menghapus pengguna",
|
|
"editUser": "Edit pengguna",
|
|
"actions": "Tindakan",
|
|
"passwordOptional": "Biarkan kosong untuk mempertahankan yang sekarang",
|
|
"failedToUpdateUser": "Gagal memperbarui pengguna",
|
|
"confirmDelete": "Apakah Anda yakin ingin menghapus pengguna ini?",
|
|
"deleteUser": "Hapus Pengguna",
|
|
"confirmDeleteUser": "Apakah Anda yakin ingin menghapus {{email}}? Tindakan ini tidak dapat dibatalkan."
|
|
},
|
|
"shares": {
|
|
"shareProject": "Bagikan proyek",
|
|
"targetUser": "Pilih pengguna",
|
|
"selectUserPlaceholder": "Pilih pengguna...",
|
|
"permission": "Izin",
|
|
"readOnly": "Hanya baca",
|
|
"readWrite": "Baca & tulis",
|
|
"owner": "Pemilik",
|
|
"share": "Bagikan",
|
|
"revoke": "Cabut",
|
|
"currentShares": "Pengguna dengan akses",
|
|
"noShares": "Belum dibagikan",
|
|
"noAvailableUsers": "Tidak ada pengguna yang tersedia untuk dibagikan",
|
|
"shared": "Dibagikan",
|
|
"sharedWithTeam": "Dibagikan dengan tim"
|
|
},
|
|
"views": {
|
|
"title": "Tampilan Cerdas",
|
|
"loading": "Memuat tampilan...",
|
|
"searchPlaceholder": "Cari tampilan...",
|
|
"noViewsFound": "Tidak ada tampilan yang ditemukan. Buat tampilan dengan melakukan pencarian dan mengklik \"Simpan sebagai Tampilan Cerdas\".",
|
|
"deleteView": "Hapus Tampilan",
|
|
"confirmDelete": "Apakah Anda yakin ingin menghapus tampilan \"{{viewName}}\"?",
|
|
"pinView": "Sematkan tampilan",
|
|
"unpinView": "Lepaskan tampilan",
|
|
"searchCriteria": "Kriteria Pencarian",
|
|
"entityTypes": "Jenis Entitas",
|
|
"searchText": "Teks Pencarian",
|
|
"priority": "Prioritas",
|
|
"dueDate": "Tanggal Jatuh Tempo",
|
|
"deferUntil": "Defer until",
|
|
"noCriteriaSet": "Tidak ada kriteria spesifik yang ditetapkan",
|
|
"priorityLabel": "Prioritas:",
|
|
"dueLabel": "Jatuh Tempo:",
|
|
"tags": "Tag",
|
|
"recurring": "Berulang"
|
|
},
|
|
"search": {
|
|
"placeholder": "Cari tugas, proyek, catatan...",
|
|
"searchingFor": "Anda sedang mencari",
|
|
"allItems": "semua item",
|
|
"containingText": ", yang mengandung teks",
|
|
"withPriority": ", dengan",
|
|
"priority": "prioritas",
|
|
"due": ", jatuh tempo",
|
|
"taggedWith": ", ditandai dengan",
|
|
"and": "dan",
|
|
"criteria": "Kriteria Pencarian",
|
|
"metadataFilters": "Filter Metadata",
|
|
"priorityFilter": "Prioritas",
|
|
"dueFilter": "Jatuh Tempo",
|
|
"tagsFilter": "Tag",
|
|
"saveAsSmartView": "Simpan sebagai Tampilan Cerdas",
|
|
"viewName": "Nama Tampilan",
|
|
"viewNameRequired": "Nama tampilan diperlukan",
|
|
"viewNamePlaceholder": "Masukkan nama tampilan",
|
|
"failedToSave": "Gagal menyimpan tampilan. Silakan coba lagi.",
|
|
"cancel": "Batal",
|
|
"saving": "Menyimpan...",
|
|
"saveView": "Simpan Tampilan",
|
|
"startTyping": "Mulai mengetik untuk mencari atau pilih filter di atas",
|
|
"noResults": "Tidak ada hasil yang ditemukan",
|
|
"entityTypes": {
|
|
"task": "tugas",
|
|
"project": "proyek",
|
|
"area": "area",
|
|
"note": "catatan"
|
|
},
|
|
"thatAre": ", yang adalah",
|
|
"extras": "Ekstra",
|
|
"recurringFilter": {
|
|
"label": "Berulang",
|
|
"recurring": "template berulang",
|
|
"nonRecurring": "tidak berulang",
|
|
"instances": "instansi berulang"
|
|
},
|
|
"deferUntilFilter": "Tunda Hingga",
|
|
"deferUntil": ", tunda hingga",
|
|
"extrasFilter": {
|
|
"isRecurring": "adalah Berulang",
|
|
"isOverdue": "adalah Terlambat",
|
|
"hasContent": "memiliki Konten",
|
|
"isDeferred": "adalah Ditunda",
|
|
"hasTags": "memiliki Tag",
|
|
"isAssignedToProject": "adalah Ditugaskan ke Proyek"
|
|
}
|
|
},
|
|
"subtasks": {
|
|
"placeholder": "Tambahkan subtugas..."
|
|
},
|
|
"backup": {
|
|
"title": "Cadangkan & Pulihkan",
|
|
"description": "Buat cadangan atau pulihkan dari cadangan sebelumnya. 5 cadangan terakhir Anda disimpan secara otomatis.",
|
|
"createBackup": "Buat Cadangan",
|
|
"importFromFile": "Impor dari Berkas",
|
|
"createNewBackup": "Buat Cadangan Baru",
|
|
"createDescription": "Buat cadangan baru dari semua data Anda. Cadangan disimpan di server dan Anda dapat memulihkannya nanti.",
|
|
"createBackupNow": "Buat Cadangan Sekarang",
|
|
"creating": "Membuat cadangan...",
|
|
"exportSuccess": "Cadangan berhasil dibuat!",
|
|
"exportError": "Gagal membuat cadangan",
|
|
"savedBackups": "Cadangan yang Disimpan",
|
|
"noBackups": "Tidak ada cadangan yang ditemukan. Buat cadangan pertama Anda di atas.",
|
|
"createdAt": "Dibuat",
|
|
"version": "Versi",
|
|
"currentVersion": "Versi saat ini",
|
|
"size": "Ukuran",
|
|
"contents": "Isi",
|
|
"actions": "Tindakan",
|
|
"restore": "Pulihkan",
|
|
"download": "Unduh",
|
|
"downloadSuccess": "Cadangan berhasil diunduh!",
|
|
"downloadError": "Gagal mengunduh cadangan",
|
|
"confirmRestore": "Pulihkan Cadangan",
|
|
"confirmRestoreMessage": "Apakah Anda yakin ingin memulihkan cadangan ini? Ini akan menggabungkan data yang dicadangkan dengan data Anda saat ini.",
|
|
"restoreSuccess": "Cadangan berhasil dipulihkan! Dibuat: {{tasks}} tugas, {{projects}} proyek, {{notes}} catatan",
|
|
"restoreError": "Gagal memulihkan cadangan",
|
|
"confirmDelete": "Hapus Cadangan",
|
|
"confirmDeleteMessage": "Apakah Anda yakin ingin menghapus cadangan ini? Tindakan ini tidak dapat dibatalkan.",
|
|
"deleteSuccess": "Cadangan berhasil dihapus!",
|
|
"deleteError": "Gagal menghapus cadangan",
|
|
"importTitle": "Impor dari File",
|
|
"importDescription": "Unggah file cadangan untuk memulihkan data Anda. Data Anda yang ada akan dilestarikan, dan item baru dari cadangan akan ditambahkan.",
|
|
"importNote": "Penting:",
|
|
"importNoteDescription": "Impor akan menggabungkan data dengan item Anda yang ada. Item duplikat (UID yang sama) akan dilewati.",
|
|
"selectFile": "Pilih File Cadangan",
|
|
"clickToUpload": "Klik untuk menjelajahi file",
|
|
"restoreBackup": "Pulihkan Cadangan",
|
|
"importing": "Mengimpor...",
|
|
"importSuccess": "Cadangan berhasil diimpor! Dibuat: {{tasks}} tugas, {{projects}} proyek, {{notes}} catatan",
|
|
"importError": "Gagal mengimpor cadangan",
|
|
"backupContents": "Isi cadangan:",
|
|
"validationError": "File yang dipilih bukan cadangan yang valid",
|
|
"validationErrors": "Kesalahan validasi:",
|
|
"versionIncompatible": "Versi Tidak Kompatibel",
|
|
"backupVersion": "Versi cadangan",
|
|
"restoreButton": "Pulihkan"
|
|
},
|
|
"notifications": {
|
|
"table": {
|
|
"type": "Jenis Notifikasi"
|
|
},
|
|
"channels": {
|
|
"inApp": "Dalam aplikasi",
|
|
"email": "Email",
|
|
"push": "Push",
|
|
"telegram": "Telegram"
|
|
},
|
|
"types": {
|
|
"dueTasks": "Tugas Jatuh Tempo",
|
|
"overdueTasks": "Tugas Terlambat",
|
|
"deferUntil": "Tunda Hingga",
|
|
"dueProjects": "Proyek Jatuh Tempo",
|
|
"overdueProjects": "Proyek Terlambat"
|
|
},
|
|
"descriptions": {
|
|
"dueTasks": "Tugas yang jatuh tempo dalam 24 jam",
|
|
"overdueTasks": "Tugas yang telah melewati tanggal jatuh tempo",
|
|
"deferUntil": "Tugas yang sekarang tersedia untuk dikerjakan",
|
|
"dueProjects": "Proyek yang jatuh tempo dalam 24 jam",
|
|
"overdueProjects": "Proyek yang telah melewati tanggal jatuh tempo"
|
|
},
|
|
"telegram": {
|
|
"notConfigured": {
|
|
"title": "Telegram Tidak Dikonfigurasi:",
|
|
"message": "Untuk menerima notifikasi Telegram, silakan konfigurasikan bot Telegram Anda di tab Telegram."
|
|
}
|
|
},
|
|
"test": {
|
|
"title": "Notifikasi Uji",
|
|
"description": "Kirim notifikasi percobaan untuk melihat bagaimana tampilannya di dalam aplikasi dan di saluran yang diaktifkan (Telegram, dll.)",
|
|
"send": "Kirim Percobaan",
|
|
"sending": "Mengirim..."
|
|
},
|
|
"info": {
|
|
"title": "Catatan:",
|
|
"message": "Notifikasi Email dan Push akan segera hadir. Notifikasi di dalam aplikasi dan Telegram saat ini tersedia."
|
|
}
|
|
},
|
|
"projectStatus": {
|
|
"not_started": "Belum Dimulai",
|
|
"not_started_desc": "Tercatat tetapi belum dimulai",
|
|
"planned": "Direncanakan",
|
|
"planned_desc": "Sudah ditentukan dan siap untuk dimulai",
|
|
"in_progress": "Sedang Berlangsung",
|
|
"in_progress_desc": "Pekerjaan aktif sedang berlangsung",
|
|
"waiting": "Menunggu",
|
|
"waiting_desc": "Menunggu masukan eksternal",
|
|
"done": "Selesai",
|
|
"done_desc": "Telah selesai dan selesai",
|
|
"cancelled": "Dibatalkan",
|
|
"cancelled_desc": "Tidak akan diselesaikan"
|
|
}
|
|
}
|