Add Indonesian locale#414
Conversation
|
Hi @aqilaziz! 🎉 Thanks for making open-design better! |
mrcfps
left a comment
There was a problem hiding this comment.
Thanks for adding Indonesian locale support — the registry wiring is clear and the placeholder-alignment test is a helpful guard. I found one non-blocking coverage gap to consider before this is treated as a fully supported locale.
Generated by Looper 0.0.0-dev · runner=reviewer · agent=opencode| }; | ||
|
|
||
| export const id: Dict = { | ||
| ...en, |
There was a problem hiding this comment.
This fallback merge makes id look complete to the registry and to locales.test.ts, but it still leaves many UI strings in English because overrides is only Partial<Dict>. I counted 113 English keys that are supplied only by ...en, including visible areas such as pasteDialog.*, designFiles.kind*, fileViewer.*Meta, pet.atlas* / pet.codex*, and settings.notifySound*. That matters because line 37 in index.tsx registers Indonesian as a selectable supported locale, so users can pick it and still see untranslated English copy with no test failure. Could you either make this file a full Dict like the other locale files, or add an explicit coverage check/export that asserts the Indonesian override set intentionally covers every non-English key before adding id to LOCALES? 🙏
lefarcen
left a comment
There was a problem hiding this comment.
Thanks for adding Indonesian locale support! 🎉
Agreeing with @mrcfps's excellent review on the 113 untranslated keys — the Partial<Dict> + ...en spread pattern means Indonesian users will see mixed English/Indonesian UI. Completing those translations or marking this as beta/experimental would help set clear expectations.
One additional dimension to consider:
Test coverage (P3): The sibling copy-regression tests (design-files-dropzone-copy.test.ts, design-files-agent-copy.test.ts) hard-code locale imports and don't include Indonesian yet. That leaves the new Indonesian copy outside existing "no unsupported Figma/Claude wording" checks. Consider either refactoring those tests to iterate LOCALES through a shared loadDict, or adding the id dictionary to their locale sets to ensure consistency checks cover all supported languages.
Looking forward to the next iteration! 🚀
| 'settings.codeAgent': 'Code agent', | ||
| 'settings.codeAgentHint': | ||
| 'Terdeteksi dari PATH. Pilih CLI yang ingin dipakai untuk menjalankan generasi.', | ||
| 'settings.rescan': 'Scan ulang', |
There was a problem hiding this comment.
| 'settings.rescan': 'Scan ulang', | |
| 'settings.rescan': 'Pindai ulang', |
| 'settings.codeAgentHint': | ||
| 'Terdeteksi dari PATH. Pilih CLI yang ingin dipakai untuk menjalankan generasi.', | ||
| 'settings.rescan': 'Scan ulang', | ||
| 'settings.rescanTitle': 'Scan ulang PATH', |
There was a problem hiding this comment.
| 'settings.rescanTitle': 'Scan ulang PATH', | |
| 'settings.rescanTitle': 'Pindai ulang PATH', |
| 'settings.rescan': 'Scan ulang', | ||
| 'settings.rescanTitle': 'Scan ulang PATH', | ||
| 'settings.noAgentsDetected': | ||
| 'Belum ada agent terdeteksi. Pasang salah satu dari Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen, atau GitHub Copilot CLI, lalu klik Scan ulang.', |
There was a problem hiding this comment.
| 'Belum ada agent terdeteksi. Pasang salah satu dari Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen, atau GitHub Copilot CLI, lalu klik Scan ulang.', | |
| 'Belum ada agent terdeteksi. Pasang salah satu dari Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen, atau GitHub Copilot CLI, lalu klik pindai ulang.', |
| 'settings.baseUrl': 'Base URL', | ||
| 'settings.maxTokens': 'Token maks (opsional)', | ||
| 'settings.maxTokensHint': | ||
| 'Batas panjang respons. Setiap model punya default sendiri; kosongkan untuk memakainya, atau isi angka untuk override.', |
There was a problem hiding this comment.
| 'Batas panjang respons. Setiap model punya default sendiri; kosongkan untuk memakainya, atau isi angka untuk override.', | |
| 'Batas panjang respons. Setiap model punya default sendiri; kosongkan untuk memakainya, atau isi angka untuk menimpa.', |
| 'settings.language': 'Bahasa', | ||
| 'settings.languageHint': 'Ganti bahasa antarmuka. Disimpan di browser ini.', | ||
| 'settings.appearance': 'Tampilan', | ||
| 'settings.appearanceHint': 'Pilih terang, gelap, atau ikuti pengaturan sistem.', |
There was a problem hiding this comment.
No need to add comma, before "atau".
| 'settings.appearanceHint': 'Pilih terang, gelap, atau ikuti pengaturan sistem.', | |
| 'settings.appearanceHint': 'Pilih terang, gelap atau ikuti pengaturan sistem.', |
| 'newproj.toggleAnimations': 'Sertakan animasi', | ||
| 'newproj.toggleAnimationsHint': 'Tambahkan motion, hover, dan transisi di atas template.', | ||
| 'newproj.templateLabel': 'Template', | ||
| 'newproj.noTemplatesTitle': 'Belum ada template', |
There was a problem hiding this comment.
| 'newproj.noTemplatesTitle': 'Belum ada template', | |
| 'newproj.noTemplatesTitle': 'Belum ada templat', |
| 'newproj.templateLabel': 'Template', | ||
| 'newproj.noTemplatesTitle': 'Belum ada template', | ||
| 'newproj.noTemplatesBody': | ||
| 'Buka proyek apa pun, lalu pakai menu Share di file viewer untuk mengubahnya menjadi template.', |
There was a problem hiding this comment.
| 'Buka proyek apa pun, lalu pakai menu Share di file viewer untuk mengubahnya menjadi template.', | |
| 'Buka proyek apa pun, lalu pakai menu Bagikan di penampil berkas untuk mengubahnya menjadi templat.', |
| 'newproj.noTemplatesTitle': 'Belum ada template', | ||
| 'newproj.noTemplatesBody': | ||
| 'Buka proyek apa pun, lalu pakai menu Share di file viewer untuk mengubahnya menjadi template.', | ||
| 'newproj.savedTemplate': 'Template tersimpan', |
There was a problem hiding this comment.
| 'newproj.savedTemplate': 'Template tersimpan', | |
| 'newproj.savedTemplate': 'Templat tersimpan', |
| 'newproj.noTemplatesBody': | ||
| 'Buka proyek apa pun, lalu pakai menu Share di file viewer untuk mengubahnya menjadi template.', | ||
| 'newproj.savedTemplate': 'Template tersimpan', | ||
| 'newproj.fileSingular': 'file', |
There was a problem hiding this comment.
| 'newproj.fileSingular': 'file', | |
| 'newproj.fileSingular': 'berkas', |
| 'Buka proyek apa pun, lalu pakai menu Share di file viewer untuk mengubahnya menjadi template.', | ||
| 'newproj.savedTemplate': 'Template tersimpan', | ||
| 'newproj.fileSingular': 'file', | ||
| 'newproj.filePlural': 'file', |
There was a problem hiding this comment.
| 'newproj.filePlural': 'file', | |
| 'newproj.filePlural': 'berkas', |
| 'notify.successTitle': 'Generasi selesai', | ||
| 'notify.failureTitle': 'Generasi gagal', |
There was a problem hiding this comment.
| 'notify.successTitle': 'Generasi selesai', | |
| 'notify.failureTitle': 'Generasi gagal', | |
| 'notify.successTitle': 'Pembuatan selesai', // atau 'Berhasil dibuat' | |
| 'notify.failureTitle': 'Pembuatan gagal', // atau 'Gagal membuat' |
| 'avatar.modelSection': 'Model', | ||
| 'avatar.modelLabel': 'Model', | ||
| 'avatar.reasoningLabel': 'Penalaran', | ||
| 'avatar.customSuffix': '(custom)', |
There was a problem hiding this comment.
| 'avatar.customSuffix': '(custom)', | |
| 'avatar.customSuffix': '(kustom)', |
| 'pet.useCustom': 'Gunakan custom', | ||
| 'pet.customTitle': 'Pet custom', |
There was a problem hiding this comment.
| 'pet.useCustom': 'Gunakan custom', | |
| 'pet.customTitle': 'Pet custom', | |
| 'pet.useCustom': 'Gunakan kustom', | |
| 'pet.customTitle': 'Kustom Pet', |
| 'assistant.statusStarting': 'Memulai...', | ||
| 'assistant.statusRequesting': 'Mengirim permintaan...', | ||
| 'assistant.statusThinking': 'Berpikir...', | ||
| 'assistant.statusStreaming': 'Streaming...', |
There was a problem hiding this comment.
| 'assistant.statusStreaming': 'Streaming...', | |
| 'assistant.statusStreaming': 'Memuat...', |
| 'fileViewer.draw': 'Gambar', | ||
| 'fileViewer.zoomOut': 'Perkecil', | ||
| 'fileViewer.zoomIn': 'Perbesar', | ||
| 'fileViewer.resetZoom': 'Reset zoom', |
There was a problem hiding this comment.
| 'fileViewer.resetZoom': 'Reset zoom', | |
| 'fileViewer.resetZoom': 'Atur ulang zoom', |
Summary
Tests