diff --git a/i18n.json b/i18n.json index 79a542f8fa..df2cc53ecd 100644 --- a/i18n.json +++ b/i18n.json @@ -20,6 +20,7 @@ "fr", "he", "hu", + "id", "it", "ja", "km", diff --git a/packages/i18n/locales/id/common.json b/packages/i18n/locales/id/common.json index e312d9f0a5..11f650163a 100644 --- a/packages/i18n/locales/id/common.json +++ b/packages/i18n/locales/id/common.json @@ -1,4 +1,47 @@ { + "apply_to_all": "Terapkan ke semua", + "identity_provider": "Penyedia identitas", + "untitled": "Tanpa judul", + "invalid_characters_in_name": "Hanya huruf, angka, spasi, dan tanda baca yang didukung yang diperbolehkan.", + "max_characters": "Maks. karakter", + "min_characters": "Min. karakter", + "min_characters_required": "Diperlukan minimal {{count}} karakter", + "max_characters_allowed": "Maksimal {{count}} karakter diperbolehkan", + "verify_email_subject": "{{appName}}: Verifikasi akun Anda", + "verify_email_subject_verifying_email": "{{appName}}: Verifikasi email Anda", + "verify_email_subject_no_branding": "Verifikasi email Anda", + "check_your_email": "Periksa email Anda", + "old_email_address": "Email lama", + "new_email_address": "Email baru", + "verify_email_page_body": "Kami telah mengirim email ke {{email}}. Verifikasi alamat email Anda untuk memastikan pengiriman email dan sinkronisasi kalender terbaik dari {{appName}}.", + "verify_email_banner_body": "Verifikasi alamat email Anda untuk memastikan pengiriman email dan sinkronisasi kalender terbaik", + "verify_email_email_header": "Verifikasi alamat email Anda", + "verify_email_button": "Verifikasi email", + "verify_email_email_body": "Silakan verifikasi alamat email Anda dengan mengeklik tombol di bawah.", + "verify_email_by_code_email_body": "Silakan verifikasi alamat email Anda menggunakan kode di bawah.", + "verify_email_email_link_text": "Berikut tautannya jika Anda tidak ingin mengeklik tombol:", + "email_verification_code": "Masukkan kode verifikasi", + "email_verification_code_placeholder": "Masukkan kode verifikasi yang dikirim ke email Anda", + "incorrect_email_verification_code": "Kode verifikasi salah.", + "email_sent": "Email berhasil dikirim", + "email_not_sent": "Terjadi kesalahan saat mengirim email", + "event_cancelled_subject": "Dibatalkan: {{title}} pada {{date}}", + "event_reassigned_subject": "Dialihkan: {{title}} pada {{date}}", + "reassigned_to": "Dialihkan kepada", + "you_can_view_booking_details_with_this_url": "Anda dapat melihat detail pemesanan melalui URL ini {{url}} dan menambahkan acara ke kalender Anda", + "no_options_available": "Tidak ada opsi yang tersedia", + "cancellation_reason_optional_label": "Alasan pembatalan (opsional)", + "cancelled_by": "Dibatalkan oleh", + "notify_attendee_cancellation_reason_warning": "Alasan pembatalan akan dibagikan kepada tamu", + "rejection_reason_placeholder": "Mengapa Anda menolak pemesanan ini?", + "report_reason_spam": "Spam atau pemesanan yang tidak diinginkan", + "report_reason_dont_know_person": "Saya tidak mengenal orang ini", + "report_reason_other": "Lainnya", + "cancel_booking_when_reporting": "Batalkan pemesanan ini", + "submit_report": "Kirim laporan", + "report_booking_description_placeholder": "Berikan detail tambahan tentang alasan Anda melaporkan pemesanan ini (opsional)", + "invite_team_individual_segment": "Undang satu per satu", + "invite_team_bulk_segment": "Impor massal", "trial_days_left": "Tersisa $t(day, {\"count\": {{days}} }) di akun PRO kamu", "day_one": "{{count}} hari", "day_other": "{{count}} hari", @@ -128,7 +171,7 @@ "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 dan <1>Kebijakan Privasi kami.", + "signing_up_terms": "Dengan melanjutkan, Anda menyetujui <0>Persyaratan dan <1>Kebijakan Privasi {{appName}}.", "multiple_duration_timeUnit_short": "{{count}}$t({{unit}}_short)", "minute_short": "menit", "hour_short": "jam", @@ -143,7 +186,7 @@ "ooo_reasons_travel": "Perjalanan", "ooo_reasons_sick_leave": "Izin sakit", "ooo_reasons_public_holiday": "Hari libur umum", - "ooo_forwarding_to": "Dialihkan ke {{username}}", + "ooo_forwarding_to": "Dialihkan ke <0>{{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.", diff --git a/packages/i18n/next-i18next.config.test.ts b/packages/i18n/next-i18next.config.test.ts index d4b927809e..26c3bab3d4 100644 --- a/packages/i18n/next-i18next.config.test.ts +++ b/packages/i18n/next-i18next.config.test.ts @@ -49,4 +49,20 @@ describe("@calcom/i18n/next-i18next.config", () => { expect(typeof enTranslations).toBe("object"); expect(Object.keys(enTranslations).length).toBeGreaterThan(0); }); + + it("Indonesian translations preserve interpolation and rich-text tokens", () => { + const enTranslations = JSON.parse( + fs.readFileSync(path.join(config.localePath, "en", "common.json"), "utf-8") + ); + const idTranslations = JSON.parse( + fs.readFileSync(path.join(config.localePath, "id", "common.json"), "utf-8") + ); + const tokenPattern = /\{\{[^}]+\}\}|<\/?\d+>|\$t\([^)]*\)/g; + const tokens = (value: string): string[] => (value.match(tokenPattern) ?? []).sort(); + + for (const [key, translation] of Object.entries(idTranslations)) { + if (typeof enTranslations[key] !== "string" || typeof translation !== "string") continue; + expect(tokens(translation), key).toEqual(tokens(enTranslations[key])); + } + }); });