Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/components/video-editor/SettingsPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -869,12 +869,14 @@ const CAPTION_LANGUAGE_OPTIONS = [
{ value: "zh", label: "Chinese (Simplified)" },
{ value: "ja", label: "Japanese" },
{ value: "ko", label: "Korean" },
{ value: "id", label: "Indonesian" },
] as const;

const APP_LANGUAGE_LABELS: Record<AppLocale, string> = {
en: "English",
es: "Español",
fr: "Français",
id: "Bahasa Indonesia",
it: "Italiano",
nl: "Nederlands",
ko: "한국어",
Expand Down
18 changes: 18 additions & 0 deletions src/contexts/I18nContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,14 @@ import frLaunch from "@/i18n/locales/fr/launch.json";
import frSettings from "@/i18n/locales/fr/settings.json";
import frShortcuts from "@/i18n/locales/fr/shortcuts.json";
import frTimeline from "@/i18n/locales/fr/timeline.json";
import idCommon from "@/i18n/locales/id/common.json";
import idDialogs from "@/i18n/locales/id/dialogs.json";
import idEditor from "@/i18n/locales/id/editor.json";
import idExtensions from "@/i18n/locales/id/extensions.json";
import idLaunch from "@/i18n/locales/id/launch.json";
import idSettings from "@/i18n/locales/id/settings.json";
import idShortcuts from "@/i18n/locales/id/shortcuts.json";
import idTimeline from "@/i18n/locales/id/timeline.json";
import itCommon from "@/i18n/locales/it/common.json";
import itDialogs from "@/i18n/locales/it/dialogs.json";
import itEditor from "@/i18n/locales/it/editor.json";
Expand Down Expand Up @@ -122,6 +130,16 @@ const messages: Record<AppLocale, LocaleBundle> = {
shortcuts: frShortcuts,
extensions: frExtensions,
},
id: {
common: idCommon,
launch: idLaunch,
editor: idEditor,
timeline: idTimeline,
settings: idSettings,
dialogs: idDialogs,
shortcuts: idShortcuts,
extensions: idExtensions,
},
it: {
common: itCommon,
launch: itLaunch,
Expand Down
2 changes: 1 addition & 1 deletion src/i18n/config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export const DEFAULT_LOCALE = "en" as const;

export const SUPPORTED_LOCALES = ["en", "es", "fr", "it", "nl", "ko", "pt-BR", "zh-CN", "zh-TW"] as const;
export const SUPPORTED_LOCALES = ["en", "es", "fr", "id", "it", "nl", "ko", "pt-BR", "zh-CN", "zh-TW"] as const;

export const I18N_NAMESPACES = [
"common",
Expand Down
26 changes: 26 additions & 0 deletions src/i18n/locales/id/common.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"app": {
"name": "Recordly",
"editorTitle": "Editor Recordly",
"subtitle": "Perekaman dan pengeditan layar",
"language": "Bahasa",
"manageRecordings": "Buka folder rekaman"
},
"actions": {
"cancel": "Batal",
"close": "Tutup",
"export": "Ekspor",
"load": "Muat",
"redo": "Ulangi",
"reset": "Atur Ulang",
"save": "Simpan",
"undo": "Urungkan",
"delete": "Hapus",
"done": "Selesai"
},
"errors": {
"invalidFileType": "Jenis file tidak valid",
"failedToUploadImage": "Gagal mengunggah gambar",
"fileReadError": "Terjadi kesalahan saat membaca file."
}
}
62 changes: 62 additions & 0 deletions src/i18n/locales/id/dialogs.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
{
"export": {
"pleaseTryAgain": "Silakan coba lagi",
"compilingGifProgress": "Mengompilasi GIF... {{progress}}%",
"compilingGifWait": "Mengompilasi GIF... Ini mungkin membutuhkan waktu",
"takeMoment": "Ini mungkin memakan waktu sebentar...",
"exportFailed": "Ekspor Gagal",
"compilingGifTitle": "Mengompilasi GIF",
"exportingFormat": "Mengekspor {{format}}",
"exportComplete": "Ekspor Selesai",
"formatReady": "{{format}} Anda sudah siap",
"showInFolder": "Tampilkan dalam Folder",
"compiling": "Mengompilasi",
"renderingFrames": "Merender Bingkai",
"processing": "Memproses...",
"status": "Status",
"format": "Format",
"compilingStatus": "Mengompilasi...",
"frames": "Bingkai",
"cancelExport": "Batalkan Ekspor",
"reopenSaveDialog": "Buka Kembali Dialog Simpan",
"savedSuccess": "{{format}} berhasil disimpan!"
},
"addFont": {
"title": "Tambah Font Google",
"heading": "Tambah Font Google",
"description": "Tambahkan font kustom dari Google Fonts untuk digunakan dalam anotasi Anda.",
"urlLabel": "URL Impor Google Fonts",
"urlPlaceholder": "https://fonts.googleapis.com/css2?family=Roboto&display=swap",
"urlHelp": "Dapatkan ini dari Google Fonts: Pilih font → Klik \"Get font\" → Salin URL @import",
"nameLabel": "Nama Tampilan",
"namePlaceholder": "Font Kustom Saya",
"nameHelp": "Ini adalah bagaimana font akan muncul dalam pemilih font",
"adding": "Menambahkan...",
"addFont": "Tambah Font",
"enterUrl": "Silakan masukkan URL impor Google Fonts",
"invalidUrl": "Silakan masukkan URL Google Fonts yang valid",
"enterName": "Silakan masukkan nama font",
"extractFailed": "Tidak dapat mengekstrak jenis font dari URL",
"addSuccess": "Font \"{{name}}\" berhasil ditambahkan",
"addFailed": "Gagal menambahkan font",
"loadTimeout": "Font memakan waktu terlalu lama untuk dimuat. Silakan periksa URL dan coba lagi.",
"loadFailed": "Font tidak dapat dimuat. Silakan pastikan URL Google Fonts sudah benar."
},
"shortcutsConfig": {
"title": "Pintasan Keyboard",
"configurable": "Dapat Dikonfigurasi",
"fixed": "Tetap",
"pressEscToCancel": "Tekan Esc untuk membatalkan",
"clickToChange": "Klik untuk mengubah",
"pressAKey": "Tekan sebuah tombol…",
"alreadyUsedBy": "Sudah digunakan oleh <strong>{{action}}</strong>",
"swap": "Tukar",
"reserved": "Pintasan ini dicadangkan untuk \"{{label}}\" dan tidak dapat ditetapkan ulang.",
"saved": "Pintasan keyboard disimpan",
"resetNotice": "Atur ulang ke pintasan default — klik Simpan untuk menerapkan",
"instructions": "Klik pintasan lalu tekan kombinasi tombol baru. Tekan Esc untuk membatalkan.",
"resetToDefaults": "Atur ulang ke default",
"cancel": "Batal",
"save": "Simpan"
}
}
141 changes: 141 additions & 0 deletions src/i18n/locales/id/editor.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
{
"playback": {
"play": "Putar",
"pause": "Jeda",
"skipBack": "Lompat ke Belakang",
"skipForward": "Lompat ke Depan",
"muteUnmute": "Bisukan/Bunyikan"
},
"annotations": {
"settings": "Pengaturan Anotasi",
"active": "Aktif",
"text": "Teks",
"image": "Gambar",
"arrow": "Panah",
"blur": "Buram",
"textContent": "Konten Teks",
"textPlaceholder": "Masukkan teks Anda...",
"fontStyle": "Gaya Font",
"selectStyle": "Pilih gaya",
"size": "Ukuran",
"toggleBold": "Alihkan tebal",
"toggleItalic": "Alihkan miring",
"toggleUnderline": "Alihkan garis bawah",
"alignLeft": "Rata kiri",
"alignCenter": "Rata tengah",
"alignRight": "Rata kanan",
"textColor": "Warna Teks",
"background": "Latar Belakang",
"none": "Tidak ada",
"clearBackground": "Hapus Latar Belakang",
"uploadImage": "Unggah Gambar",
"supportedFormats": "Format yang didukung: JPG, PNG, GIF, WebP",
"arrowDirection": "Arah Panah",
"strokeWidth": "Lebar Garis: {{width}}px",
"arrowColor": "Warna Panah",
"deleteAnnotation": "Hapus Anotasi",
"shortcutsAndTips": "Pintasan & Tips",
"tipSelectAnnotation": "Pindahkan playhead ke bagian anotasi yang tumpang tindih dan pilih item.",
"tipCycleForward": "Gunakan Tab untuk menelusuri item yang tumpang tindih.",
"tipCycleBackward": "Gunakan Shift+Tab untuk menelusuri mundur.",
"imageUploadSuccess": "Gambar berhasil diunggah!",
"imageUploadError": "Harap unggah file gambar JPG, PNG, GIF, atau WebP.",
"blurStrength": "Kekuatan Buram: {{strength}}",
"solidColor": "Warna Solid (Penyensoran)",
"borderRadius": "Radius Batas"
},
"fontStyles": {
"classic": "Klasik",
"editor": "Editor",
"strong": "Kuat",
"typewriter": "Mesik Tik",
"deco": "Deko",
"simple": "Sederhana",
"modern": "Modern",
"clean": "Bersih"
},
"format": {
"mp4Video": "Video MP4",
"mp4Description": "File video kualitas tinggi",
"gifAnimation": "Animasi GIF",
"gifDescription": "Gambar animasi untuk dibagikan"
},
"gifOptions": {
"frameRate": "Kecepatan Bingkai",
"outputSize": "Ukuran Keluaran",
"outputDimensions": "Keluaran: {{width}} × {{height}}px",
"loopAnimation": "Putar Ulang Animasi",
"loopDescription": "GIF akan diputar terus-menerus"
},
"tutorial": {
"howTrimmingWorks": "Bagaimana pemangkasan bekerja",
"title": "Bagaimana Pemangkasan Bekerja",
"understanding": "Memahami cara memotong bagian yang tidak diinginkan dari video Anda.",
"descriptionP1": "Alat Pangkas bekerja dengan menentukan segmen yang ingin Anda",
"descriptionRemove": "hapus",
"descriptionP2": "dari video Anda.",
"descriptionP3": "Setiap bagian dari timeline yang ditutupi oleh segmen potong merah akan dihilangkan saat Anda mengekspor.",
"visualExample": "Contoh Visual",
"removed": "DIHAPUS",
"kept": "Disimpan",
"finalVideo": "Video Akhir",
"part": "Bagian {{number}}",
"addTrimStep": "1. Tambah Pangkas",
"addTrimDesc": "Tekan T atau klik ikon gunting untuk menandai bagian yang akan dihapus.",
"adjustStep": "2. Sesuaikan",
"adjustDesc": "Tarik tepi wilayah merah untuk menutupi bagian yang tepat yang ingin Anda potong."
},
"feedback": {
"trigger": "Umpan Balik",
"title": "Umpan Balik & Kontak",
"description": "Hubungi langsung atau buka masalah jika ada yang rusak atau hilang.",
"emailLabel": "Email",
"xLabel": "X",
"reportIssue": "Laporkan masalah / kirim umpan balik",
"openFailed": "Gagal membuka tautan."
},
"keyboardShortcuts": {
"trigger": "Pintasan",
"title": "Pintasan Keyboard",
"description": "Referensi cepat untuk kontrol timeline dan editor.",
"customizeTooltip": "Sesuaikan pintasan",
"customize": "Sesuaikan",
"panTimeline": "Geser Timeline",
"zoomTimeline": "Perbesar Timeline",
"cycleAnnotations": "Siklus Anotasi",
"tab": "Tab"
},
"actions": {
"saveAgain": "Simpan Lagi",
"showInFolder": "Tampilkan Dalam Folder"
},
"project": {
"untitled": "Tanpa Judul"
},
"nativeCaptureUnavailable": {
"title": "Tidak ada yang rusak, tetapi kami tidak dapat merender overlay kursor animasi.",
"description": "Perangkat Anda tidak mendukung perekaman asli. Ini mungkin karena berbagai alasan yang belum kami ketahui. Ini tidak merusak Recordly, tetapi membuat penghalusan kursor menjadi tidak mungkin.",
"confirm": "Oke"
},
"exportStatus": {
"exporting": "Mengekspor",
"renderingFile": "Merender file Anda.",
"preparing": "Menyiapkan ekspor...",
"completePercent": "{{percent}}% selesai",
"issue": "Masalah ekspor",
"complete": "Ekspor selesai",
"savedSuccessfully": "File Anda berhasil disimpan."
},
"export": {
"processingAudioEdits": "Memproses audio dengan pengeditan kecepatan/overlay"
},
"toolbar": {
"addLayer": "Tambah Lapisan",
"splitClip": "Pisahkan Klip (C)"
},
"timeline": {
"expand": "Perluas Timeline",
"collapse": "Ciutkan Timeline"
},
"openRecordingsFolder": "Buka folder rekaman"
}
60 changes: 60 additions & 0 deletions src/i18n/locales/id/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"title": "Ekstensi",
"tabs": {
"browse": "Jelajahi",
"installed": "Terinstal"
},
"actions": {
"submit": "Kirimkan ekstensi",
"docs": "Dokumentasi ekstensi",
"refresh": "Segarkan",
"openFolder": "Buka folder ekstensi",
"uninstall": "Copot pemasangan",
"install": "Instal",
"installing": "Menginstal",
"add": "Tambah",
"retry": "Coba lagi",
"close": "Tutup",
"folder": "Folder"
},
"status": {
"enabled": "Diaktifkan",
"disabled": "Dinonaktifkan",
"installed": "Terinstal"
},
"detail": {
"by": "Oleh {{author}}",
"unknownAuthor": "Penulis tidak diketahui",
"noDescription": "Tidak ada deskripsi",
"downloads": "{{count}} unduhan",
"preview": "Pratinjau",
"screenshotAlt": "Tangkapan layar {{number}}",
"description": "Deskripsi",
"tags": "Tag",
"permissions": "Izin",
"location": "Lokasi",
"error": "Kesalahan: {{message}}"
},
"empty": {
"title": "Tidak Ada Ekstensi",
"description": "Instal ekstensi untuk menambahkan bingkai, efek kursor, dan alat editor."
},
"search": {
"placeholder": "Cari ekstensi...",
"noResults": "Ekstensi tidak ditemukan",
"noMarketplace": "Belum ada ekstensi marketplace yang tersedia",
"count": "{{count}} ekstensi",
"countPlural": "{{count}} ekstensi"
},
"toast": {
"installedAndEnabled": "Ekstensi terinstal dan diaktifkan",
"uninstalled": "Copot pemasangan {{name}} berhasil",
"uninstallFailed": "Gagal mencopot pemasangan {{name}}",
"searchFailed": "Gagal mencari marketplace",
"refreshed": "Ekstensi disegarkan",
"refreshFailed": "Gagal menyegarkan ekstensi",
"marketplaceInstalled": "Terinstal dan diaktifkan {{name}}",
"marketplaceInstallFailed": "Gagal menginstal {{name}}",
"enableFailed": "Gagal mengaktifkan ekstensi"
}
}
Loading