Files
cal.diy/packages/lib/server/locales/id/common.json
T
163c7ff791 refactor: replace i18n HTTP requests with build-time bundling (#22422)
* refactor: replace i18n HTTP requests with build-time bundling

- Create translationBundler.ts for build-time translation loading
- Replace HTTP fetch in loadTranslations with file system reads
- Add CalComVersion cache invalidation to prevent stale translations
- Fix TypeScript errors in booking page components
- Eliminate 60s timeout issues by removing network dependency

Resolves translation timeout issues by bundling translations at build time
instead of making runtime HTTP requests to /static/locales/ endpoints.

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* fix: move i18n files back to packages/lib/server with proper imports

- Move i18n.ts and translationBundler.ts back to packages/lib/server/
- Replace all relative imports with @calcom/lib/server/i18n pattern
- Fix LOCALES_PATH to point to correct directory
- Maintain optimized serverless-friendly translation loading

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* refactor: move locale files to packages/lib/server to eliminate circular deps

- Move all locale files from apps/web/public/static/locales to packages/lib/server/locales
- Create copy-locales-static.js script to copy files during build
- Update all references to use new location for build-time access
- Maintain public folder copying for Next.js runtime access
- Update platform atoms, scripts, and config files
- Fix copy script relative path issue

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* fix: update test imports after locale refactor

- Fix import paths in test files updated by pre-commit hooks
- Ensure all tests use correct locale import paths

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* fix: revert import paths from @calcom/web/lib/i18n to @calcom/lib/server/i18n

- Revert all test file imports back to @calcom/lib/server/i18n as requested
- Addresses GitHub comment feedback to stick with packages/lib/server location
- Fixes import paths in 6 test files that were incorrectly changed

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* fix: update vite config alias to use new locale path

- Update @calcom/web/public/static/locales/en/common.json to @calcom/lib/server/locales/en/common.json
- Addresses GitHub comment about updating platform atoms vite config
- Maintains correct path resolution after locale files moved to packages/lib/server

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* fix: update translationBundler path resolution for production builds

- Use process.cwd() instead of __dirname for locale file path resolution
- Ensures locale files can be found in both development and production environments
- Fixes E2E test failures caused by missing locale files in .next/server/chunks/

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* fix: use relative path resolution for locale files in translationBundler

- Change from process.cwd() to __dirname with relative paths
- Ensures locale files can be found in both development and production environments
- Fixes E2E test failures caused by incorrect path resolution in Next.js builds

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* fix: use process.cwd() for locale path resolution in production builds

- Change from __dirname to process.cwd() with relative paths
- Ensures locale files can be found when bundled into Next.js server chunks
- Fixes E2E test failures caused by incorrect path resolution in production environment
- Follows same pattern used in getStaticProps.tsx for cross-package file access

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* fix: use path.resolve pattern from sendVerificationRequest for locale access

- Change from process.cwd() to path.resolve(process.cwd(), '..', '..', 'packages/lib/server/locales')
- Follows same pattern used in sendVerificationRequest.ts for cross-environment file access
- Should resolve E2E test failures by ensuring locale files can be found when bundled into Next.js server chunks
- Pattern navigates up from current working directory to reach packages directory consistently

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* fix: use dynamic monorepo root detection for locale path resolution

- Replace relative path resolution with dynamic monorepo root finder
- Ensures locale files can be found from any working directory (root, apps/web, apps/api/v2)
- Update API v2 i18n config to use new locale path
- Fixes remaining E2E test failures in API v2 and E2E (1/4) test suites

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* fix: use require.resolve(__filename) for robust path resolution in all contexts

- Replace __dirname with require.resolve(__filename) in monorepo root detection
- Ensures locale files can be found when running from any working directory
- Fixes E2E API v2 test failures where __dirname resolves to '.' instead of actual file path

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* Revert "fix: use require.resolve(__filename) for robust path resolution in all contexts"

This reverts commit b37d8226000da8f7d5fb98b83dd0e95a53d45372.

* fix: update copied locale files after translationBundler path resolution fix

- Copy script updated all locale files in public directory
- Ensures E2E tests have access to latest locale files
- Fixes regression where all E2E tests were failing

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* feat: remove existing locale files to establish copy script as single source of truth

- Delete all common.json files from apps/web/public/static/locales/
- Eliminates developer confusion about which files are authoritative
- copy-locales-static.js script now clearly the only mechanism for populating public folder
- packages/lib/server/locales/ remains the definitive source of truth for translations

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* add comment

* refactor: simplify findMonorepoRoot by removing redundant fallback loop

- Remove unnecessary second while loop using process.cwd()
- The first loop from __dirname will always find the monorepo root
- Add clear error message for fail-fast behavior if repo structure is corrupted
- Improves code clarity and maintainability

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* feat: integrate updated translations from main branch

- Restore all common.json files from main branch to apps/web/public/static/locales/
- Overwrite packages/lib/server/locales/ with up-to-date translation content
- Resolve merge conflicts using Benny's safer 2-step approach
- Ensure translation source of truth remains in packages/lib/server/locales/
- Complete safer conflict resolution to eliminate merge conflicts on PR #22422

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* chore: update package.json and yarn.lock after translation integration

- Update dependencies after ts-node installation for pre-commit hooks
- Ensure yarn.lock reflects current dependency state
- Complete translation integration process

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

* feat: remove duplicate locale files from apps/web to establish single source of truth

- Delete all common.json files from apps/web/public/static/locales/
- Maintain packages/lib/server/locales/ as the single source of truth for translations
- copy-locales-static.js script will populate public folder during build process
- Complete Benny's safer 2-step approach: restore from main, then remove duplicates
- Resolve merge conflicts and eliminate developer confusion about translation file locations

Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: hbjORbj <sldisek783@gmail.com>
2025-07-12 07:49:27 +00:00

170 lines
11 KiB
JSON

{
"trial_days_left": "Tersisa $t(day, {\"count\": {{days}} }) di akun PRO kamu",
"day_one": "{{count}} hari",
"day_other": "{{count}} hari",
"second_one": "{{count}} detik",
"second_other": "{{count}} detik",
"upgrade_now": "Upgrade sekarang",
"accept_invitation": "Terima undangan",
"calcom_explained": "{{appName}} menyediakan infrastruktur penjadwalan untuk semua orang.",
"calcom_explained_new_user": "Selesaikan pengaturan akun {{appName}}! Tinggal selangkah lagi untuk solusi penjadwalan kamu.",
"have_any_questions": "Punya pertanyaan? Kami siap membantu.",
"reset_password_subject": "{{appName}}: Petunjuk pengaturan ulang kata sandi",
"event_declined_subject": "Ditolak: {{title}} pada {{date}}",
"event_request_declined": "Permintaan acara kamu telah ditolak",
"event_request_declined_recurring": "Acara berulang kamu telah ditolak",
"organizer": "Pengelola",
"need_to_reschedule_or_cancel": "Perlu penjadwalan ulang atau pembatalan?",
"cancellation_reason": "Alasan pembatalan (opsional)",
"cancellation_reason_placeholder": "Mengapa kamu membatalkan?",
"rejection_reason": "Alasan untuk menolak",
"rejection_reason_title": "Tolak permintaan pemesanan?",
"rejection_reason_description": "Kamu yakin menolak pemesanan? Kami akan memberitahu orang yang memesan. Kamu bisa menyediakan alasan di bawah ini.",
"rejection_confirmation": "Tolak pesanan",
"manage_this_event": "Kelola acara ini",
"invite_team_member": "Undang anggota tim",
"your_event_has_been_scheduled": "Acara kamu telah terjadwal",
"your_event_has_been_scheduled_recurring": "Acara berulang kamu telah terjadwal",
"accept_our_license": "Setujui lisensi dengan mengganti variabel .env <1>NEXT_PUBLIC_LICENSE_CONSENT</1> menjadi {{agree}}.",
"remove_banner_instructions": "Untuk menghilangkan spanduk ini, buka file .env kamu dan ganti variabel <1>NEXT_PUBLIC_LICENSE_CONSENT</1> menjadi '{{agree}}'.",
"error_message": "Pesan kesalahannya adalah: '{{errorMessage}}'",
"refund_failed_subject": "Pengembalian dana gagal: {{name}}-{{date}}-{{eventType}}",
"refund_failed": "Pengembalian dana untuk acara {{eventType}} dengan {{userName}} pada {{date}} gagal.",
"check_with_provider_and_user": "Silakan periksa kembali dengan penyedia layanan pembayaran kamu dan {{user}} bagaimana untuk menangani ini.",
"a_refund_failed": "Pengembalian dana gagal",
"awaiting_payment_subject": "Menunggu Pembayaran: {{title}} pada {{date}}",
"meeting_awaiting_payment": "Pertemuan kamu sedang menunggu pembayaran",
"help": "Bantuan",
"price": "Harga",
"paid": "Lunas",
"refunded": "Dikembalikan",
"payment": "Pembayaran",
"missing_card_fields": "Kolom kartu belum terisi",
"pay_now": "Bayar sekarang",
"codebase_has_to_stay_opensource": "Basis kode harus tetap sebagau sumber terbuka, walau diubah atau tidak",
"cannot_repackage_codebase": "Kamu tidak bisa mengemas ulang atau menjual basis kode",
"acquire_license": "Dapatkan lisensi komersial untuk menghilangkan ketentuan ini dengan mengirimkan email",
"terms_summary": "Ringkasan ketentuan",
"open_env": "Buka .env dan setujui lisensi kami",
"env_changed": "Saya telah mengubah .env saya",
"accept_license": "Terima Lisensi",
"still_waiting_for_approval": "Satu acara menunggu persetujuan",
"event_is_still_waiting": "Permintaan acara masih menunggu: {{attendeeName}} - {{date}} - {{eventType}}",
"no_more_results": "Tidak ada lagi",
"no_results": "Tidak ada hasil",
"load_more_results": "Muat lagi",
"integration_meeting_id": "{{integrationName}} ID pertemuan: {{meetingId}}",
"confirmed_event_type_subject": "Terkonfirmasi: {{eventType}} dengan {{name}} pada {{date}}",
"new_event_request": "Permintaan acara baru: {{attendeeName}} - {{date}} - {{eventType}}",
"confirm_or_reject_request": "Konfirmasi atau tolak permintaan",
"check_bookings_page_to_confirm_or_reject": "Periksa halaman penjadwalan untuk mengkonfirmasi atau menolak.",
"event_awaiting_approval": "Sebuah acara menunggu persetujuanmu",
"event_awaiting_approval_recurring": "Acara berulang menunggu persetujuanmu",
"someone_requested_an_event": "Sesorang mengirimkan permintaan penjadwalan acara di kalender kamu.",
"someone_requested_password_reset": "Seseorang mengirimkan link permintaan penggantian kata sandi.",
"password_reset_instructions": "Jika kamu tidak meminta ini, hiraukan email ini dan kata sandi tidak akan diganti.",
"event_awaiting_approval_subject": "Menunggu persetujuan: {{title}} pada {{date}}",
"event_still_awaiting_approval": "Sebuah acara masih menunggu persetujuanmu",
"booking_submitted_subject": "Pendaftaran Terkirim: {{title}} pada {{date}}",
"your_meeting_has_been_booked": "Pertemuanmu telah terdaftar",
"event_type_has_been_rescheduled_on_time_date": "{{title}} kamu telah dijadwalkan ulang menjadi {{date}}.",
"event_has_been_rescheduled": "Terkini - Acara kamu telah dijadwalkan ulang",
"request_reschedule_title_organizer": "Kamu telah meminta {{attendee}} untuk menjadwalkan ulang",
"rescheduled_event_type_subject": "Permintaan penjadwalan ulang terkirim: {{eventType}} dengan {{name}} pada {{date}}",
"team_info": "Informasi Tim",
"request_another_invitation_email": "Jika kamu lebih suka tidak menggukan {{toEmail}} sebagai email {{appName}} atau telah memiliki akun {{appName}} silakan membuat permintaan lain kepada email tersebut.",
"you_have_been_invited": "Kamu telah diundang untuk bergabung ke tim {{teamName}}",
"hidden_team_member_title": "Kamu tersembunyi di tim ini",
"hidden_team_member_message": "Kamu tidak dibayari, upgrade ke PRO atau beritahu pemilik tim bahwa mereka bisa membayari kamu.",
"hidden_team_owner_message": "Kamu perlu akun pro untuk menggunakan tim, kamu disembunyikan sementara hingga kamu upgrade.",
"link_expires": "oya, ini hangus dalam {{expiresIn}} jam.",
"upgrade_to_per_seat": "Upgrade ke Per-Orang",
"team_upgrade_seats_details": "Dari {{memberCount}} anggota di tim kamu, {{unpaidCount}} orang tidak berbayar. Dengan harga ${{seatPrice}}/bulan per orang, perkiraan biaya total keanggotaan adalah ${{totalCost}}/bulan.",
"team_upgrade_banner_description": "Terimakasih telah mencoba paket tim kami. Kami perhatikan tim kamu \"{{teamName}}\" perlu diupgrade.",
"upgrade_banner_action": "Upgrade disini",
"team_upgraded_successfully": "Tim kamu telah berhasil diupgrade!",
"use_link_to_reset_password": "Gunakan link di bawah ini untuk mengatur ulang kata sandi kamu",
"hey_there": "Halo,",
"forgot_your_password_calcom": "Lupa kata sandi? - {{appName}}",
"delete_webhook_confirmation_message": "Apakah kamu yakin untuk menghapus webhook ini? Kamu tidak akan lagi menerima data pertemuan {{appName}} di URL tersebut secara langsung, pada saat acara terjadwal atau dibatalkan.",
"confirm_delete_webhook": "Ya, hapus webhook",
"edit_webhook": "Ubah Webhook",
"delete_webhook": "Hapus Webhook",
"webhook_status": "Status Webhook",
"webhook_enabled": "Webhook Diaktifkan",
"webhook_disabled": "Webhook Dinonaktifkan",
"webhook_response": "Response webhook",
"webhook_test": "Tes webhook",
"manage_your_webhook": "Atur webhook kamu",
"webhook_created_successfully": "Webhook berhasil dibuat!",
"webhook_updated_successfully": "Webhook berhasil diperbarui!",
"webhook_removed_successfully": "Webhook berhasil dihapus!",
"payload_template": "Template Payload",
"dismiss": "Singkirkan",
"no_data_yet": "Belum ada data",
"ping_test": "Tes ping",
"add_to_homescreen": "Tambahkan aplikasi ini ke tampilan depan untuk akses yang lebih cepat dan mudah.",
"upcoming": "Akan datang",
"recurring": "Berulang",
"past": "Yang lalu",
"choose_a_file": "Pilih file...",
"upload_image": "Unggah gambar",
"upload_target": "Unggah {{target}}",
"no_target": "Tidak ada {{target}}",
"slide_zoom_drag_instructions": "Gulir untuk perbesar, tarik untuk reposisi",
"view_notifications": "Lihat notifikasi",
"view_public_page": "Lihat halaman publik",
"copy_public_page_link": "Salin tautan halaman publik",
"sign_out": "Keluar",
"add_another": "Tambah lagi",
"install_another": "Pasang lagi",
"until": "hingga",
"powered_by": "dipersembahkan oleh",
"youve_been_logged_out": "Kamu telah keluar",
"hope_to_see_you_soon": "Semoga segera bertemu lagi!",
"logged_out": "Telah keluar",
"please_try_again_and_contact_us": "Silakan coba lagi dan hubungi kami jika masalah terulang.",
"incorrect_2fa_code": "Kode dua faktor salah.",
"no_account_exists": "Tidak ada akun dengan email tersebut.",
"need_help": "Butuh bantuan?",
"email_team_invite|subject|invited_to_regular_team": "{{user}} mengundangmu untuk bergabung ke tim {{team}} di {{appName}}",
"signing_up_terms": "Dengan melanjutkan, Anda menyetujui <0>Persyaratan</0> dan <1>Kebijakan Privasi</1> kami.",
"multiple_duration_timeUnit_short": "{{count}}$t({{unit}}_short)",
"minute_short": "menit",
"hour_short": "jam",
"minute_one_short": "{{count}} menit",
"hour_one_short": "{{count}} jam",
"travel_schedule": "Jadwal perjalanan",
"travel_schedule_description": "Rencanakan perjalanan Anda sebelumnya untuk menjaga jadwal Anda yang ada di zona waktu yang berbeda dan mencegah pemesanan pada tengah malam.",
"schedule_timezone_change": "Perubahan zona waktu jadwal",
"schedule_tz_without_end_date": "Jadwal zona waktu tanpa tanggal akhir",
"ooo_reasons_unspecified": "Tidak ditentukan",
"ooo_reasons_vacation": "Liburan",
"ooo_reasons_travel": "Perjalanan",
"ooo_reasons_sick_leave": "Izin sakit",
"ooo_reasons_public_holiday": "Hari libur umum",
"ooo_forwarding_to": "Dialihkan ke {{username}}",
"ooo_not_forwarding": "Tidak ada pengalihan",
"ooo_empty_title": "Buat OOO",
"ooo_empty_description": "Beri tahu pemesan Anda ketika Anda tidak tersedia untuk menerima pemesanan. Mereka masih dapat memesan Anda saat Anda kembali atau Anda dapat mengalihkan mereka ke anggota tim.",
"ooo_user_is_ooo": "{{displayName}} sedang OOO",
"ooo_slots_returning": "<0>{{displayName}}</0> dapat mengikuti rapat mereka saat sedang tidak ada.",
"ooo_slots_book_with": "Pesan {{displayName}}",
"ooo_select_reason": "Pilih alasan",
"enterprise_license_locally": "Anda dapat menguji fitur ini secara lokal tetapi tidak pada produksi.",
"enterprise_license_sales": "Untuk meningkatkan ke edisi perusahaan, hubungi tim penjualan kami. Jika kunci lisensi sudah ada, hubungi support@cal.com untuk bantuan.",
"apply_to_all_event_types": "Terapkan untuk semua, termasuk jenis acara di masa depan",
"date_and_time": "Tanggal & Waktu",
"email_reminder_upcoming_event_notice": "Ini adalah pengingat tentang acara mendatang Anda.",
"email_reminder_triggered_by_workflow": "Pengingat ini dipicu oleh Workflow di Cal.",
"event_upper_case": "Acara",
"scheduling_by": "Dijadwalkan oleh",
"experience_review_prompt": "Bagaimana pengalaman terakhir Anda?",
"improve_customer_experience_message": "Kami selalu berusaha meningkatkan pengalaman pelanggan.",
"meeting_satisfaction_question": "Seberapa puas Anda dengan rapat terakhir Anda?",
"meeting_not_joined_question": "tidak bergabung dengan rapat?",
"reschedule_cta_short": "Jadwal ulang di sini.",
"you_and_conjunction": "Anda &",
"email_survey_triggered_by_workflow": "Survei ini dipicu oleh Workflow di Cal."
}