feat(i18n): add Indonesian locale (#30134)

Co-authored-by: khidhir-ziyan <khdihirziyan@gmail.com>
Co-authored-by: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com>
This commit is contained in:
Khidhir Zyenn
2026-09-12 06:43:18 +00:00
committed by GitHub
co-authored by khidhir-ziyan Bandhan Majumder
parent 39c96bc04d
commit b0a34f21c9
3 changed files with 62 additions and 2 deletions
+1
View File
@@ -20,6 +20,7 @@
"fr", "fr",
"he", "he",
"hu", "hu",
"id",
"it", "it",
"ja", "ja",
"km", "km",
+45 -2
View File
@@ -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", "trial_days_left": "Tersisa $t(day, {\"count\": {{days}} }) di akun PRO kamu",
"day_one": "{{count}} hari", "day_one": "{{count}} hari",
"day_other": "{{count}} hari", "day_other": "{{count}} hari",
@@ -128,7 +171,7 @@
"no_account_exists": "Tidak ada akun dengan email tersebut.", "no_account_exists": "Tidak ada akun dengan email tersebut.",
"need_help": "Butuh bantuan?", "need_help": "Butuh bantuan?",
"email_team_invite|subject|invited_to_regular_team": "{{user}} mengundangmu untuk bergabung ke tim {{team}} di {{appName}}", "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.", "signing_up_terms": "Dengan melanjutkan, Anda menyetujui <0>Persyaratan</0> dan <1>Kebijakan Privasi</1> {{appName}}.",
"multiple_duration_timeUnit_short": "{{count}}$t({{unit}}_short)", "multiple_duration_timeUnit_short": "{{count}}$t({{unit}}_short)",
"minute_short": "menit", "minute_short": "menit",
"hour_short": "jam", "hour_short": "jam",
@@ -143,7 +186,7 @@
"ooo_reasons_travel": "Perjalanan", "ooo_reasons_travel": "Perjalanan",
"ooo_reasons_sick_leave": "Izin sakit", "ooo_reasons_sick_leave": "Izin sakit",
"ooo_reasons_public_holiday": "Hari libur umum", "ooo_reasons_public_holiday": "Hari libur umum",
"ooo_forwarding_to": "Dialihkan ke {{username}}", "ooo_forwarding_to": "Dialihkan ke <0>{{username}}</0>",
"ooo_not_forwarding": "Tidak ada pengalihan", "ooo_not_forwarding": "Tidak ada pengalihan",
"ooo_empty_title": "Buat OOO", "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_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.",
+16
View File
@@ -49,4 +49,20 @@ describe("@calcom/i18n/next-i18next.config", () => {
expect(typeof enTranslations).toBe("object"); expect(typeof enTranslations).toBe("object");
expect(Object.keys(enTranslations).length).toBeGreaterThan(0); 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]));
}
});
}); });