feat: add Japanese (ja) and Spanish (es) localization#96
feat: add Japanese (ja) and Spanish (es) localization#96haritabh-z01 merged 3 commits intoamicalhq:mainfrom
Conversation
Add full Japanese translation for the desktop app UI, register the ja locale in i18n config, and add the language option to the preferences selector. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
📝 WalkthroughWalkthroughAdds Spanish (es) and Japanese (ja) locales: two new full locale JSON files, registers them in i18n resources and supportedLocales, and adds the new language options to the Preferences language selector. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches🧪 Generate unit tests (beta)
Tip Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Add LATAM Spanish translation for the desktop app UI, register the es locale in i18n config, and add the language option to the preferences selector across all locale files. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
arendon1
left a comment
There was a problem hiding this comment.
Can't approve, but this is a fantastic rendition of the locale.
Can confirm that this adapts very well to most LATAM Spanish vocabulary and its usage.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@apps/desktop/src/i18n/locales/es.json`:
- Around line 839-857: Fix spacing around interpolation placeholders in the
syncDialog locale entries: update "syncDialog.title" to have a space before "de"
(change "{{modelType}}de" → "{{modelType}} de"), update "syncDialog.description"
to have a space before "quieres" (change "{{modelType}}quieres" → "{{modelType}}
quieres"), and update "syncDialog.fetching" to add a space between "modelos" and
the "{{available}}" placeholder (change "modelos{{available}}" → "modelos
{{available}}"); modify the values for the keys syncDialog.title,
syncDialog.description, and syncDialog.fetching in
apps/desktop/src/i18n/locales/es.json accordingly.
| "syncDialog": { | ||
| "title": "Seleccionar modelos {{modelType}}de {{provider}}", | ||
| "description": "Elige qué modelos {{modelType}}quieres sincronizar de {{provider}}.", | ||
| "fetching": "Obteniendo modelos{{available}}...", | ||
| "available": " disponibles", | ||
| "fetchFailed": "No se pudieron obtener los modelos", | ||
| "fetchFailedWithMessage": "No se pudieron obtener los modelos: {{message}}", | ||
| "searchPlaceholder": "Buscar modelos...", | ||
| "clear": "Limpiar", | ||
| "size": "Tamaño: {{size}}", | ||
| "context": "Contexto: {{context}}", | ||
| "cancel": "Cancelar", | ||
| "syncing": "Sincronizando...", | ||
| "syncButton": "Sincronizar {{count}} modelo", | ||
| "syncButton_other": "Sincronizar {{count}} modelos", | ||
| "toast": { | ||
| "synced": "¡Modelos sincronizados con la base de datos correctamente!", | ||
| "syncFailed": "No se pudieron sincronizar los modelos con la base de datos. Por favor, inténtalo de nuevo." | ||
| } |
There was a problem hiding this comment.
Missing spaces before words adjacent to interpolation placeholders.
Lines 840, 841, and 842 are missing spaces between the {{modelType}} / {{available}} placeholder and the following word. When the placeholder resolves to a non-empty string, the text will render correctly only by accident (if the interpolated value itself ends with a space). When the placeholder is empty, words will be concatenated without a separator.
- Line 840:
{{modelType}}de→{{modelType}} de - Line 841:
{{modelType}}quieres→{{modelType}} quieres - Line 842:
modelos{{available}}→modelos {{available}}
🔧 Proposed fix
- "title": "Seleccionar modelos {{modelType}}de {{provider}}",
- "description": "Elige qué modelos {{modelType}}quieres sincronizar de {{provider}}.",
- "fetching": "Obteniendo modelos{{available}}...",
+ "title": "Seleccionar modelos {{modelType}} de {{provider}}",
+ "description": "Elige qué modelos {{modelType}} quieres sincronizar de {{provider}}.",
+ "fetching": "Obteniendo modelos {{available}}...",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "syncDialog": { | |
| "title": "Seleccionar modelos {{modelType}}de {{provider}}", | |
| "description": "Elige qué modelos {{modelType}}quieres sincronizar de {{provider}}.", | |
| "fetching": "Obteniendo modelos{{available}}...", | |
| "available": " disponibles", | |
| "fetchFailed": "No se pudieron obtener los modelos", | |
| "fetchFailedWithMessage": "No se pudieron obtener los modelos: {{message}}", | |
| "searchPlaceholder": "Buscar modelos...", | |
| "clear": "Limpiar", | |
| "size": "Tamaño: {{size}}", | |
| "context": "Contexto: {{context}}", | |
| "cancel": "Cancelar", | |
| "syncing": "Sincronizando...", | |
| "syncButton": "Sincronizar {{count}} modelo", | |
| "syncButton_other": "Sincronizar {{count}} modelos", | |
| "toast": { | |
| "synced": "¡Modelos sincronizados con la base de datos correctamente!", | |
| "syncFailed": "No se pudieron sincronizar los modelos con la base de datos. Por favor, inténtalo de nuevo." | |
| } | |
| "syncDialog": { | |
| "title": "Seleccionar modelos {{modelType}} de {{provider}}", | |
| "description": "Elige qué modelos {{modelType}} quieres sincronizar de {{provider}}.", | |
| "fetching": "Obteniendo modelos {{available}}...", | |
| "available": " disponibles", | |
| "fetchFailed": "No se pudieron obtener los modelos", | |
| "fetchFailedWithMessage": "No se pudieron obtener los modelos: {{message}}", | |
| "searchPlaceholder": "Buscar modelos...", | |
| "clear": "Limpiar", | |
| "size": "Tamaño: {{size}}", | |
| "context": "Contexto: {{context}}", | |
| "cancel": "Cancelar", | |
| "syncing": "Sincronizando...", | |
| "syncButton": "Sincronizar {{count}} modelo", | |
| "syncButton_other": "Sincronizar {{count}} modelos", | |
| "toast": { | |
| "synced": "¡Modelos sincronizados con la base de datos correctamente!", | |
| "syncFailed": "No se pudieron sincronizar los modelos con la base de datos. Por favor, inténtalo de nuevo." | |
| } |
🤖 Prompt for AI Agents
In `@apps/desktop/src/i18n/locales/es.json` around lines 839 - 857, Fix spacing
around interpolation placeholders in the syncDialog locale entries: update
"syncDialog.title" to have a space before "de" (change "{{modelType}}de" →
"{{modelType}} de"), update "syncDialog.description" to have a space before
"quieres" (change "{{modelType}}quieres" → "{{modelType}} quieres"), and update
"syncDialog.fetching" to add a space between "modelos" and the "{{available}}"
placeholder (change "modelos{{available}}" → "modelos {{available}}"); modify
the values for the keys syncDialog.title, syncDialog.description, and
syncDialog.fetching in apps/desktop/src/i18n/locales/es.json accordingly.
|
@Mgtantheta can you give my changes a review - 381cae3 |
|
@haritabh-z01 |
|
@arendon1 |

Summary
Adds Japanese (ja) and Spanish (es) localization to the desktop app — the first non-English locales.
ja.jsonwith full Japanese translations for all UI strings (~910 lines)es.jsonwith full LATAM Spanish translations for all UI strings (~910 lines)jaandeslocales inshared.ts(resources,supportedLocales)jaandesoptions to language selector dropdown in Preferences"ja": "日本語","es": "Español") across all locale filesscreenshot
Changes
apps/desktop/src/i18n/locales/ja.jsonapps/desktop/src/i18n/locales/es.jsonapps/desktop/src/i18n/shared.tsjaandesin resources and supportedLocalesapps/desktop/src/i18n/locales/en.jsonjaandeslanguage optionsapps/desktop/src/renderer/.../preferences/index.tsxjaandesto language selector dropdownRelated
Test plan
🤖 Generated with Claude Code
Summary by CodeRabbit