Skip to content

Add Indonesian locale#414

Open
aqilaziz wants to merge 1 commit intonexu-io:mainfrom
aqilaziz:add-indonesian-locale
Open

Add Indonesian locale#414
aqilaziz wants to merge 1 commit intonexu-io:mainfrom
aqilaziz:add-indonesian-locale

Conversation

@aqilaziz
Copy link
Copy Markdown

@aqilaziz aqilaziz commented May 4, 2026

Summary

  • add Bahasa Indonesia (id) to the supported locale registry and language picker
  • register the Indonesian dictionary with fallback coverage for the main UI
  • update locale tests to include the new language

Tests

  • corepack pnpm --filter @open-design/web typecheck
  • corepack pnpm --filter @open-design/web test -- src/i18n/locales.test.ts

@lefarcen lefarcen added the feature New feature or enhancement label May 4, 2026
@lefarcen
Copy link
Copy Markdown
Contributor

lefarcen commented May 4, 2026

Hi @aqilaziz! 🎉
Thanks for the contribution — adding Indonesian locale support is awesome!
I will run a deep review and get back to you within 24h.

Thanks for making open-design better!
— open-design team

Copy link
Copy Markdown
Contributor

@mrcfps mrcfps left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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? 🙏

Copy link
Copy Markdown
Contributor

@lefarcen lefarcen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'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',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'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.',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'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.',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'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.',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to add comma, before "atau".

Suggested change
'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',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'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.',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'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',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'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',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'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',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'newproj.filePlural': 'file',
'newproj.filePlural': 'berkas',

Comment on lines +132 to +133
'notify.successTitle': 'Generasi selesai',
'notify.failureTitle': 'Generasi gagal',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'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)',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'avatar.customSuffix': '(custom)',
'avatar.customSuffix': '(kustom)',

Comment on lines +639 to +640
'pet.useCustom': 'Gunakan custom',
'pet.customTitle': 'Pet custom',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'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...',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'assistant.statusStreaming': 'Streaming...',
'assistant.statusStreaming': 'Memuat...',

'fileViewer.draw': 'Gambar',
'fileViewer.zoomOut': 'Perkecil',
'fileViewer.zoomIn': 'Perbesar',
'fileViewer.resetZoom': 'Reset zoom',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'fileViewer.resetZoom': 'Reset zoom',
'fileViewer.resetZoom': 'Atur ulang zoom',

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature New feature or enhancement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants