Skip to content

fix(i18n): backfill locale translations#2588

Merged
senamakel merged 5 commits into
tinyhumansai:mainfrom
senamakel:fix/i18n-backfill-locale-translations
May 25, 2026
Merged

fix(i18n): backfill locale translations#2588
senamakel merged 5 commits into
tinyhumansai:mainfrom
senamakel:fix/i18n-backfill-locale-translations

Conversation

@senamakel
Copy link
Copy Markdown
Member

@senamakel senamakel commented May 25, 2026

Summary

  • Replace large batches of mirrored English fallback strings in non-English locale chunk files with actual translated copy.
  • Keep the chunk catalogs aligned with the English source-of-truth and extend chunk coverage assertions to Korean.
  • Switch Korean locale loading to the same chunk-aggregated pattern used by the other locales so updated translations are actually served.

Problem

  • Many locale files existed, but a substantial portion of newer keys were still copied straight from English.
  • That left translated locales partially localized, especially in settings, MCP, migration, and AI configuration surfaces.
  • Korean also still relied on a stale standalone catalog instead of the maintained chunk files.

Solution

  • Backfill translated values across the locale chunk catalogs under app/src/lib/i18n/chunks.
  • Update app/src/lib/i18n/ko.ts to aggregate the ko-1 through ko-5 chunk files.
  • Add Korean to the i18n chunk coverage test so chunk completeness and chunk placement are asserted consistently.

Submission Checklist

If a section does not apply to this change, mark the item as N/A with a one-line reason. Do not delete items.

  • Tests added or updated (happy path + at least one failure / edge case) per Testing Strategy
  • Diff coverage ≥ 80% — changed lines (Vitest + cargo-llvm-cov merged via diff-cover) meet the gate enforced by .github/workflows/coverage.yml. pnpm test:coverage passed locally; pnpm test:rust is reported below under blocked validation because it failed outside the changed surface.
  • Coverage matrix updated — N/A: locale catalog/test maintenance only
  • All affected feature IDs from the matrix are listed in the PR description under ## RelatedN/A: no matrix-managed feature rows changed
  • No new external network dependencies introduced (mock backend used per Testing Strategy)
  • Manual smoke checklist updated if this touches release-cut surfaces (docs/RELEASE-MANUAL-SMOKE.md) — N/A: translation/catalog only
  • Linked issue closed via Closes #NNN in the ## Related section — N/A: no linked issue for this branch

Impact

  • App UI localization only.
  • No intended behavior change outside translated strings being shown instead of English fallbacks.
  • No Rust core, RPC, persistence, or protocol impact.

Related

  • Closes: N/A
  • Follow-up PR(s)/TODOs: N/A

AI Authored PR Metadata (required for Codex/Linear PRs)

Keep this section for AI-authored PRs. For human-only PRs, mark each field N/A.

Linear Issue

  • Key: N/A
  • URL: N/A

Commit & Branch

  • Branch: fix/i18n-backfill-locale-translations
  • Commit SHA: 70c4f9eea

Validation Run

  • pnpm --filter openhuman-app format:check
  • pnpm typecheck
  • Focused tests: pnpm --dir app exec vitest run src/lib/i18n/__tests__/coverage.test.ts
  • Rust fmt/check (if changed): Pre-push hook ran cargo fmt --check and cargo check; no Rust files changed
  • Tauri fmt/check (if changed): Pre-push hook ran app/src-tauri cargo fmt --check and cargo check; no Tauri files changed

Validation Blocked

  • command: pnpm test:rust
  • error: FAILED outside changed surface with 5 failing tests: openhuman::credentials::ops::tests::store_session_local_token_succeeds_without_network_and_forces_local_user_id, openhuman::meet_agent::rpc::tests::push_then_poll_returns_audio_after_brain_turn, openhuman::memory_tree::tools::query_global::tests::execute_accepts_window_days_alias, openhuman::memory_tree::tools::memory_tree_dispatcher_tests::memory_tree_query_global_mode_dispatches_successfully, openhuman::security::policy::tests::dotfile_in_workspace_allowed
  • impact: full local Rust merge-gate validation could not be claimed green from this branch; failures appear unrelated to the locale-only diff

Behavior Changes

  • Intended behavior change: translated locales now render localized copy for many keys that previously fell back to English.
  • User-visible effect: non-English UI surfaces show substantially fewer English strings.

Parity Contract

  • Legacy behavior preserved: locale keys, chunk boundaries, and English source-of-truth mapping remain intact.
  • Guard/fallback/dispatch parity checks: i18n chunk coverage test verifies key parity and chunk placement; Korean now uses the same chunk aggregation pattern as other locales.

Duplicate / Superseded PR Handling

  • Duplicate PR(s): N/A
  • Canonical PR: #2588
  • Resolution (closed/superseded/updated): updated

Summary by CodeRabbit

  • Localization
    • Comprehensive translations added for Arabic, Bengali, German, Spanish, French, Hindi, Indonesian, Italian, and Korean.
    • Translation coverage now spans settings interfaces, developer menus, notification systems, channel integrations, device management, AI configuration, onboarding flows, and various UI elements.
    • Improved language support enables better user experience for speakers of these languages across the entire application.

@senamakel senamakel requested a review from a team May 25, 2026 01:33
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 25, 2026

Warning

Review limit reached

@senamakel, we couldn't start this review because you've used your available PR reviews for now.

Your plan includes 5 reviews of capacity. Refill in 17 minutes and 2 seconds.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more review capacity refills, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than trial, open-source, and free plans. In all cases, review capacity refills continuously over time.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ef37e784-d9d2-4195-bc7f-b287e9b9801a

📥 Commits

Reviewing files that changed from the base of the PR and between a85ba7f and 448cf9c.

📒 Files selected for processing (8)
  • app/src/lib/i18n/chunks/bn-5.ts
  • app/src/lib/i18n/chunks/hi-4.ts
  • app/src/lib/i18n/chunks/hi-5.ts
  • app/src/lib/i18n/chunks/it-4.ts
  • app/src/lib/i18n/chunks/ko-5.ts
  • docs/whatsapp-data-flow.md
  • src/openhuman/meet_agent/rpc.rs
  • src/openhuman/memory_store/README.md
📝 Walkthrough

Walkthrough

This PR adds comprehensive localization for 11 languages by translating UI strings across core features: navigation, settings, developer options, provider configuration, onboarding flows, MCP integration, skills, and billing interfaces. Strings updated across 40 i18n chunk files (5 files per locale: ar, bn, de, es, fr, hi, id, it, ko) plus test coverage expansion.

Changes

i18n Translation Updates

Layer / File(s) Summary
Test Infrastructure & Locale Coverage
app/src/lib/i18n/__tests__/coverage.test.ts
Test file updated to enumerate all 11 supported locales (ar, bn, de, es, fr, hi, id, it, ko, pt, ru, zh-CN) in multi-line array format with as const type safety.
Core UI & Navigation Translations
app/src/lib/i18n/chunks/{ar,bn,de,es,fr,hi,id,it,ko}-*.ts
Navigation labels (chat, human, memory), common UI buttons (on/off, coming soon), and basic settings labels translated consistently across all locales.
Settings & Notification UI
app/src/lib/i18n/chunks/{ar,bn,de,es,fr,hi,id,it,ko}-*.ts
Settings tab labels (preferences, routing), local session exit strings, and notification configuration UI translated across all locale chunks.
Developer Options Menu
app/src/lib/i18n/chunks/{ar,bn,de,es,fr,hi,id,it,ko}-2.ts, ko-2.ts
Developer menu items (AI configuration, screen awareness, messaging, tools, webhooks, intelligence, notification routing, Composio triggers) and microphone device selector localized across all language variants.
OpenAI-Compatible & Embeddings Configuration
app/src/lib/i18n/chunks/{ar,bn,de,es,fr,hi,id,it,ko}-4.ts
AI embeddings labels and OpenAI-compatible endpoint UI (auth header example, base URL fields, key management actions, endpoint title) translated for provider configuration consistency.
Composio Integration & Scope Configuration
app/src/lib/i18n/chunks/{ar,bn,de,es,fr,hi,id,it,ko}-4.ts, {ar,de,es,fr,hi,id,it,ko}-5.ts
Composio scope labels (read/write/admin with hints), section descriptions, and preview UI strings (badge, tooltip) localized to support agent permission management.
Welcome & Local Session Onboarding
app/src/lib/i18n/chunks/{ar,bn,de,es,fr,hi,id,it,ko}-3.ts
Welcome messaging (continue locally, local session descriptions) and channel integration strings (Discord, Telegram, Web descriptions and auth-mode configurations) translated for onboarding flow consistency.
MCP Server & Advanced Features
app/src/lib/i18n/chunks/{ar,bn,de,es,fr,hi,id,it,ko}-1.ts, {ar,de,es,fr,hi,id,it,ko}-{2,3,4,5}.ts, ko-{1,2,3,4,5}.ts
MCP-related UI, agent autonomy controls, device pairing flows, notification routing, billing inference budget, knowledge vault, and skills installation help/error messages localized for advanced feature configuration.
Mascot Configuration & Voice Settings
app/src/lib/i18n/chunks/{ar,bn,de,es,fr,hi,id,it,ko}-5.ts
Mascot custom GIF input validation/error messages, mascot preview UI, voice activation descriptors (e.g., Fn → language-specific equivalents), and Composio preview strings translated for avatar customization.
Autocomplete, Webhooks & Workspace
app/src/lib/i18n/chunks/{ar,bn,de,es,fr,hi,id,it,ko}-3.ts, {ar,de,es,fr,hi,id,it,ko}-4.ts, ko-5.ts
Autocomplete settings (runtime, debounce), webhook tunnel labels, workspace vault opening/reveal UI, and related onboarding prompts translated consistently across locales.
Comprehensive Settings & Feature Localization
app/src/lib/i18n/chunks/{ar,bn,de,es,fr,hi,id,it,ko}-{1,5}.ts
Large contiguous translation blocks covering appearance themes, mascot placeholders, MCP server labels, autonomy/composio/reward settings, onboarding status, autocomplete debug, local model capability status, and extensive skills installation help/error messaging and meeting-bot platform labels.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • tinyhumansai/openhuman#1884: i18n coverage test and Indonesian (id) locale wiring across translation chunks and context registration.
  • tinyhumansai/openhuman#2378: German (de) locale support addition and i18n coverage/test infrastructure updates.
  • tinyhumansai/openhuman#2250: Developer menu localization keys (devOptions.menu*, settings.developerMenu.*) and UI integration with translation chunk updates.

Suggested labels

working

Suggested reviewers

  • graycyrus

🐰 A localization feast, translations near and far,
Eleven tongues now speak of chat and avatar,
From Arabic to Korean, from Spanish to the rest,
The UI sings in languages—our global zest!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'fix(i18n): backfill locale translations' is specific and accurately describes the main change in the pull request—replacing English fallback strings with translated copy across multiple locale chunks.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot added the working A PR that is being worked on by the team. label May 25, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
app/src/lib/i18n/chunks/hi-5.ts (1)

1-697: 🛠️ Refactor suggestion | 🟠 Major | 🏗️ Heavy lift

Split this module to stay under repository size guidance.

This file is ~697 lines, above the ~500-line threshold.

As per coding guidelines "**/*.{ts,tsx,rs}: File size should not exceed approximately 500 lines. When a module grows beyond this threshold, split it into smaller, more focused modules with clear responsibilities."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/hi-5.ts` around lines 1 - 697, This file (const hi5:
TranslationMap / export default hi5) is oversized; split the large translation
map into multiple smaller modules (e.g., hi-5-a.ts, hi-5-b.ts) each exporting a
partial TranslationMap (named exports or default), then create an index module
that imports those partials and merges them into the single hi5 TranslationMap
(using object spread or Object.assign) and re-exports the combined hi5 as the
default; update any imports that currently point to this file to import the new
index so consumers see the same default export.
🟡 Minor comments (18)
app/src/lib/i18n/chunks/bn-2.ts-403-403 (1)

403-403: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Replace corrupted localization artifacts in Bengali strings.

Line 403 and Line 422 include malformed placeholder/artifact text, which will leak directly into the UI.

💡 Suggested patch (safe fallback values)
-  'devOptions.menuToolsDesc':
-    'টুলগুলি [[I18N_SEP_92731] BR__7 সক্ষম করতে সক্ষম]__3 সক্ষম করতে পারে। আপনার পক্ষে ব্যবহার করুন',
+  'devOptions.menuToolsDesc':
+    'Enable or disable capabilities OpenHuman can use on your behalf',
@@
-  'devOptions.menuComposioRoutingDesc':
-    'আপনার নিজের Composio এবং Composio Composio __বিরুট সরাসরি কল করুন।',
+  'devOptions.menuComposioRoutingDesc':
+    'Bring your own Composio API key and route calls directly to backend.composio.dev',

Based on learnings: “Only flag problems related to key structure/validity (e.g., missing exports, syntax/type errors), not the use of English fallback text in these locale chunks.”

Also applies to: 422-422

app/src/lib/i18n/chunks/bn-3.ts-220-220 (1)

220-220: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix malformed Bengali copy for welcome.localSessionDesc.

Line 220 has corrupted token text (skips__ BR__Ans) that will render broken UI copy.

💡 Suggested patch (fallback-safe)
-  'welcome.localSessionDesc': 'একটি অফলাইন skips__ BR__Ans স্থানীয় প্রোফাইল ব্যবহার করে।',
+  'welcome.localSessionDesc':
+    'Uses a local offline profile and skips TinyHumans OAuth.',

Based on learnings: “Only flag problems related to key structure/validity … not the use of English fallback text in these locale chunks.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/bn-3.ts` at line 220, The value for the localization
key welcome.localSessionDesc contains corrupted token text ("skips__ BR__Ans");
update the string for welcome.localSessionDesc to a clean, valid Bengali
sentence (e.g., replace the corrupted fragment with an appropriate Bengali
phrase meaning "uses a local offline profile") so the UI renders correctly while
preserving the key name welcome.localSessionDesc and surrounding
punctuation/quotes.
app/src/lib/i18n/chunks/ko-3.ts-218-218 (1)

218-218: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix broken OAuth sentence punctuation in localized copy.

Line 218 splits the phrase (...건너뜁니다. OAuth.), which reads as a broken sentence and can confuse users.

Suggested fix
-  'welcome.localSessionDesc': '오프라인 로컬 프로필을 사용하고 TinyHumans를 건너뜁니다. OAuth.',
+  'welcome.localSessionDesc': '오프라인 로컬 프로필을 사용하며 TinyHumans OAuth를 건너뜁니다.',
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/ko-3.ts` at line 218, The localized string key
'welcome.localSessionDesc' contains a broken sentence ("...건너뜁니다.
OAuth.")—replace the value with a single coherent Korean sentence by removing
the stray period and connecting the clauses (for example: "오프라인 로컬 프로필을 사용하고
TinyHumans를 건너뛰며 OAuth를 사용합니다.") so the copy reads naturally and includes OAuth
as part of the sentence.
app/src/lib/i18n/chunks/id-5.ts-603-603 (1)

603-603: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix notAvailable value typo (t/an/a).

't/a' looks like an accidental typo and creates inconsistent status text in two places.

Suggested patch
-  'settings.localModel.download.notAvailable': 't/a',
+  'settings.localModel.download.notAvailable': 'n/a',
...
-  'settings.localModel.status.notAvailable': 't/a',
+  'settings.localModel.status.notAvailable': 'n/a',

Also applies to: 623-623

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/id-5.ts` at line 603, Typo in the translation value
for the key 'settings.localModel.download.notAvailable' (and the duplicate
occurrence) — replace the incorrect 't/a' string with the intended 'n/a'. Locate
the entries for settings.localModel.download.notAvailable in the id-5.ts chunk
(both occurrences) and update their values from 't/a' to 'n/a' so status text is
consistent.
app/src/lib/i18n/chunks/id-5.ts-687-687 (1)

687-687: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Correct the Teams URL example domain.

team.microsoft.com is not the standard Teams host; this example should use teams.microsoft.com.

Suggested patch
-  'skills.meetingBots.platformHints.teams': 'team.microsoft.com/...',
+  'skills.meetingBots.platformHints.teams': 'teams.microsoft.com/...',
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/id-5.ts` at line 687, The i18n entry for
'skills.meetingBots.platformHints.teams' uses the wrong domain; update the value
string to use the correct Teams host by replacing "team.microsoft.com/..." with
"teams.microsoft.com/..." so the example URL is accurate.
app/src/lib/i18n/chunks/bn-4.ts-303-303 (1)

303-303: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Replace malformed authHeaderLabel text.

'2th head]9' is unreadable and looks accidental; please replace it with a valid label (native translation or English fallback).

Suggested patch
-  'settings.ai.openAiCompat.authHeaderLabel': '2th head]9',
+  'settings.ai.openAiCompat.authHeaderLabel': 'Auth header',
Based on learnings: in `app/src/lib/i18n/chunks/*.ts`, English fallback values in non-English locale chunks are acceptable placeholders when native translations are pending.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/bn-4.ts` at line 303, The value for the i18n key
'settings.ai.openAiCompat.authHeaderLabel' contains a malformed string; replace
the existing value `'2th head]9'` with a readable label (use an English fallback
such as `'Authorization header'` or an appropriate Bengali translation) so the
key maps to a valid user-facing string; update the literal in the bn-4.ts chunk
where 'settings.ai.openAiCompat.authHeaderLabel' is defined.
app/src/lib/i18n/chunks/es-2.ts-100-100 (1)

100-100: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use canonical technical labels for mode/auth terms.

Line 100 ('devOptions.local': 'locales') and Line 105 ('devOptions.token': 'ficha') read as non-technical Spanish and can confuse core mode/auth UX. Prefer stable technical terms (Local, Token) here.

Suggested fix
-  'devOptions.local': 'locales',
+  'devOptions.local': 'Local',
...
-  'devOptions.token': 'ficha',
+  'devOptions.token': 'Token',

Also applies to: 105-105

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/es-2.ts` at line 100, Update the Spanish i18n entries
for the technical mode/auth labels so they use canonical technical terms: change
the value for 'devOptions.local' from 'locales' to 'Local' and change the value
for 'devOptions.token' from 'ficha' to 'Token' in the es-2.ts chunk so the UI
displays stable, technical labels for these options.
app/src/lib/i18n/chunks/es-3.ts-95-95 (1)

95-95: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Normalize technical terms to avoid misleading UI labels.

A few changed strings now use non-technical words in technical contexts:

  • Line 95 locales for local mode
  • Line 101 garrapatas for scheduler ticks
  • Line 395 / Line 405 ficha for bot token

These should use stable terms (Local, ticks, token) for clarity.

Suggested fix
-  'backend.local': 'locales',
+  'backend.local': 'Local',
...
-  'subconscious.ticks': 'garrapatas',
+  'subconscious.ticks': 'ticks',
...
-  'channels.discord.fields.bot_token.label': 'Ficha de robot',
+  'channels.discord.fields.bot_token.label': 'Token del bot',
...
-  'channels.telegram.fields.bot_token.label': 'Ficha de robot',
+  'channels.telegram.fields.bot_token.label': 'Token del bot',

Also applies to: 101-101, 395-395, 405-405

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/es-3.ts` at line 95, Replace the misleading
non-technical Spanish strings with stable technical terms: update the
translation value for the key 'backend.local' from "locales" to "Local"; update
the scheduler/tick-related key(s) (e.g., the key referencing scheduler ticks) to
use "ticks" instead of "garrapatas"; and update the bot token label key(s)
(e.g., 'bot.token' or the token field labels) to use "token" instead of "ficha";
keep casing consistent with surrounding translations and run a quick grep for
those keys to ensure all occurrences are normalized.
app/src/lib/i18n/chunks/fr-4.ts-191-191 (1)

191-191: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use a semantic equivalent for “embeddings,” not “integrations.”

Line 191 maps pages.settings.ai.embeddings to Intégrations, which changes the feature meaning. Please use a term aligned with vector embeddings (e.g., Embeddings or Vectorisations).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/fr-4.ts` at line 191, The translation for the key
pages.settings.ai.embeddings incorrectly uses "Intégrations" which changes the
meaning; update the value for pages.settings.ai.embeddings in the fr-4.ts
translations to a semantic equivalent for vector embeddings such as "Embeddings"
or the French "Vectorisations" (matching capitalization/locale style used
elsewhere in the file) so the label reflects vector embeddings rather than
integrations.
app/src/lib/i18n/chunks/bn-5.ts-492-493 (1)

492-493: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove corrupted i18n separator artifacts from rendered copy.

These values include broken marker text ([[I18N_SEP_...]]) and a malformed token tail, so users will see raw artifacts instead of readable labels.

🛠️ Suggested fix
-  'settings.developerMenu.mcpServer.desc': '[[I18N_SEP_92731]] OpenHuman',
+  'settings.developerMenu.mcpServer.desc':
+    'Configure external MCP clients to connect to OpenHuman',
...
-  'skills.meetingBots.platforms.gmeet': 'zoom.us/j/... [[I18N_SEP_92731]__7]92',
+  'skills.meetingBots.platforms.gmeet': 'Google Meet',

Based on learnings, English fallback values are acceptable in non-English locale chunks when native translation is pending.

Also applies to: 688-689

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/bn-5.ts` around lines 492 - 493, Remove the corrupted
I18N separator artifacts from the i18n values for the affected keys (e.g.,
'settings.developerMenu.mcpServer.desc' and the similar keys around the 688-689
region) so the rendered copy shows a clean fallback string; replace values
containing patterns like '[[I18N_SEP_92731]] OpenHuman' with a plain
human-readable fallback (e.g., 'OpenHuman') or the proper translated text,
ensuring no stray marker text or malformed token tails remain.
app/src/lib/i18n/chunks/it-1.ts-933-933 (1)

933-933: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Correct the STT provider label value.

voice.providers.sttProvider currently says “Provider di sintesi vocale” (TTS wording), which mismatches the STT key and can mislead users in settings.

🛠️ Suggested fix
-  'voice.providers.sttProvider': 'Provider di sintesi vocale',
+  'voice.providers.sttProvider': 'Provider di trascrizione vocale',
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/it-1.ts` at line 933, The Italian translation for the
key voice.providers.sttProvider is incorrect (it uses TTS wording); update the
value for voice.providers.sttProvider to an STT-appropriate label such as
"Provider di riconoscimento vocale" (or "Provider di trascrizione vocale") so
the key matches its intent and users see the correct label in settings.
app/src/lib/i18n/chunks/de-1.ts-1290-1290 (1)

1290-1290: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

vault.syncedTitle currently displays a failure message.

Line 1290 uses “fehlgeschlagen” for a success-title key, which inverts success/failure UX feedback after sync.

💡 Suggested fix
-  'vault.syncedTitle': 'Synchronisierung „{name}“ fehlgeschlagen',
+  'vault.syncedTitle': '„{name}“ synchronisiert',
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/de-1.ts` at line 1290, The translation for the key
'vault.syncedTitle' wrongly reads as a failure message; update the value for the
symbol 'vault.syncedTitle' in de-1.ts to a success-oriented string (e.g.,
replace "Synchronisierung „{name}“ fehlgeschlagen" with a phrase like
"Synchronisierung „{name}“ erfolgreich" or similar German success wording) so
the title correctly reflects a successful sync event.
app/src/lib/i18n/chunks/ko-1.ts-1273-1276 (1)

1273-1276: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

vault.syncSummary* fragments are semantically swapped.

Lines 1274–1276 currently map “failed/skipped/duration” keys to the wrong Korean fragments, so composed sync summaries will read incorrectly.

💡 Suggested fix
-  'vault.syncSummaryFailed': '제거, {count}',
-  'vault.syncSummarySkipped': '실패, {count}',
-  'vault.syncSummaryDuration': '건너뛰었습니다. {seconds}s',
+  'vault.syncSummaryFailed': '실패, {count}',
+  'vault.syncSummarySkipped': '건너뜀, {count}',
+  'vault.syncSummaryDuration': '· {seconds}s',
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/ko-1.ts` around lines 1273 - 1276, The three i18n
keys 'vault.syncSummaryFailed', 'vault.syncSummarySkipped', and
'vault.syncSummaryDuration' are mapped to the wrong Korean fragments; update
their values so they semantically match the keys (i.e.,
'vault.syncSummaryFailed' should contain the failure fragment with the count,
'vault.syncSummarySkipped' should contain the skipped fragment with the count,
and 'vault.syncSummaryDuration' should contain the duration fragment with
seconds). Locate these keys in ko-1.ts and replace the incorrect strings so each
key's value correctly corresponds to failed/skipped/duration messaging
respectively.
app/src/lib/i18n/chunks/de-1.ts-497-498 (1)

497-498: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

settings.search.parallelKeyLabel is mapped to an error message instead of a field label.

Line 497 currently reads like a failure status, but this key is the input label. That will mislabel the API key field in UI.

💡 Suggested fix
-  'settings.search.parallelKeyLabel': 'Parallel API fehlgeschlagen',
+  'settings.search.parallelKeyLabel': 'Parallel API-Schlüssel',
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/de-1.ts` around lines 497 - 498, The translation for
settings.search.parallelKeyLabel currently contains an error message; update the
value for settings.search.parallelKeyLabel to be a proper input label (e.g.,
"Parallel API Schlüssel" or similar) so the API key field is labelled correctly
in the UI; locate the string settings.search.parallelKeyLabel in de-1.ts and
replace the erroneous failure-text with the appropriate label text.
app/src/lib/i18n/chunks/id-1.ts-767-767 (1)

767-767: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix mixed-language typo in message placeholder.

Line 767 has "Ketik a pesan..."; this should be fully Indonesian to avoid a visible typo in chat input UI.

Suggested fix
-  'iosMascot.typeMessage': 'Ketik a pesan...',
+  'iosMascot.typeMessage': 'Ketik pesan...',
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/id-1.ts` at line 767, The translation key
'iosMascot.typeMessage' contains a mixed-language placeholder "Ketik a
pesan..."; update this value to a fully Indonesian phrase (for example "Ketik
sebuah pesan..." or "Ketik pesan...") in the id-1.ts chunk so the chat input UI
shows a correct Indonesian placeholder; locate the 'iosMascot.typeMessage' entry
and replace the string accordingly.
app/src/lib/i18n/chunks/es-5.ts-482-482 (1)

482-482: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

modeSystem translation is semantically incorrect.

Line 482 uses "Sistema de partidos", which means political party system, not system theme mode. This label will confuse users in appearance settings.

🔧 Suggested fix
-  'settings.appearance.modeSystem': 'Sistema de partidos',
+  'settings.appearance.modeSystem': 'Sistema',
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/es-5.ts` at line 482, The translation for
settings.appearance.modeSystem is incorrect ("Sistema de partidos" is
political); update the value for the key settings.appearance.modeSystem to a
correct Spanish UI string such as "Seguir la configuración del sistema" or "Usar
configuración del sistema" (or "Modo del sistema" if shorter) so it correctly
conveys the system theme option in appearance settings.
app/src/lib/i18n/chunks/ar-1.ts-1226-1226 (1)

1226-1226: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

routeToOrchestrator is translated as a failure message, not an action label.

Line 1226 currently says "فشل التوجيه إلى المنسق" ("failed to route to orchestrator"), which changes the key meaning and will render incorrect UI copy.

🔧 Suggested fix
-  'notifications.routing.routeToOrchestrator': 'فشل التوجيه إلى المنسق',
+  'notifications.routing.routeToOrchestrator': 'التوجيه إلى المنسق',
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/ar-1.ts` at line 1226, The translation for the key
'notifications.routing.routeToOrchestrator' is currently a failure message ("فشل
التوجيه إلى المنسق"); update its value to an action/label form such as "توجيه
إلى المنسق" (or "التوجيه إلى المنسق") so the string conveys the action "Route to
orchestrator" instead of a failure state; locate the key
'notifications.routing.routeToOrchestrator' in ar-1.ts and replace the Arabic
text accordingly.
app/src/lib/i18n/chunks/fr-1.ts-965-965 (1)

965-965: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

sttProvider label currently describes TTS instead of STT.

Line 965 maps voice.providers.sttProvider to "Fournisseur de synthèse vocale" (text-to-speech). This inverts the meaning of the STT selector label in the UI.

🔧 Suggested fix
-  'voice.providers.sttProvider': 'Fournisseur de synthèse vocale',
+  'voice.providers.sttProvider': 'Fournisseur de reconnaissance vocale',
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/fr-1.ts` at line 965, The translation for the key
voice.providers.sttProvider is incorrect (it currently reads as TTS); update the
value for voice.providers.sttProvider to a correct French label for STT such as
"Fournisseur de reconnaissance vocale" (or "Fournisseur STT") so the UI selector
correctly reflects speech-to-text providers instead of text-to-speech; locate
the mapping for voice.providers.sttProvider in fr-1.ts and replace the existing
string accordingly.
🧹 Nitpick comments (6)
app/src/lib/i18n/chunks/bn-5.ts (1)

1-696: 🏗️ Heavy lift

Split this locale chunk into smaller modules to stay within the size guideline.

This module is ~696 lines, which is beyond the repo’s ~500-line threshold.

As per coding guidelines: **/*.{ts,tsx,rs} file size should not exceed approximately 500 lines; split oversized modules into smaller focused modules.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/bn-5.ts` around lines 1 - 696, The bn5 translation
map constant is too large (~696 lines); split the bn5 object into smaller
modules (e.g., bn-5-part1.ts, bn-5-part2.ts) each exporting a partial
TranslationMap (unique symbols: the current bn5 constant and its default
export), then create an index module that imports and merges those partial maps
into a single bn5 object and re-exports it as default; ensure the merged object
preserves key order and types (TranslationMap) so existing imports that expect
the default export remain unchanged.
app/src/lib/i18n/chunks/ar-5.ts (1)

1-683: 🏗️ Heavy lift

Split this locale chunk to stay under the file-size guideline.

This module is ~683 lines, above the repo’s ~500-line target for maintainability.

As per coding guidelines: **/*.{ts,tsx,rs} file size should not exceed approximately 500 lines; split oversized modules into smaller focused modules.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/ar-5.ts` around lines 1 - 683, The ar5 TranslationMap
export (const ar5 / export default ar5) is ~683 lines and exceeds the ~500-line
guideline; split the map into smaller modules (e.g., ar-5-partA.ts,
ar-5-partB.ts) that each export a partial TranslationMap (named exports like
ar5_partA, ar5_partB), then create a small aggregator module that imports those
parts and merges them (e.g., const ar5 = { ...ar5_partA, ...ar5_partB } and
export default ar5) so the original symbol ar5 remains the single default export
consumers use.
app/src/lib/i18n/chunks/it-1.ts (1)

1-1329: 🏗️ Heavy lift

Split this locale chunk to meet the module size guideline.

This file is ~1329 lines, well above the repo’s recommended module size.

As per coding guidelines: **/*.{ts,tsx,rs} file size should not exceed approximately 500 lines; split oversized modules into smaller focused modules.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/it-1.ts` around lines 1 - 1329, This file defines a
large TranslationMap constant it1 and exports it (const it1 / export default
it1); split it into multiple smaller modules (e.g., multiple files each
exporting a partial TranslationMap) so no single .ts exceeds ~500 lines, keep
each module importing type { TranslationMap } and exporting its partial object,
then add a small aggregator module that imports the partial maps and merges them
(Object.assign or spread) into the final it1 constant and re-exports export
default it1 so existing imports remain unchanged; ensure keys remain unique and
preserve the original export name it1 and the TranslationMap typing.
app/src/lib/i18n/chunks/ar-1.ts (1)

4-1310: 🏗️ Heavy lift

This file exceeds the configured TS module size guideline.

Please split this translation map into smaller files/modules to keep maintenance and review manageable.

As per coding guidelines "**/*.{ts,tsx,rs}: File size should not exceed approximately 500 lines. When a module grows beyond this threshold, split it into smaller, more focused modules with clear responsibilities."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/ar-1.ts` around lines 4 - 1310, The ar1 translation
map (const ar1: TranslationMap / export default ar1) is too large; split it into
smaller modules by logical sections (e.g.,
nav/common/settings/onboarding/voice/memory) and export partial maps (e.g.,
export const nav = {...}, export const common = {...}) in separate files, then
create a small aggregator module that imports those partial maps and merges them
into the final TranslationMap before exporting the combined default (replacing
the single huge ar1). Ensure keys remain identical and reference
ar1/TranslationMap/export default ar1 when locating and replacing the original
big map.
app/src/lib/i18n/chunks/es-5.ts (1)

4-709: 🏗️ Heavy lift

Please split this file to comply with the TS module size guideline.

This chunk is over the ~500-line guidance and would benefit from further partitioning.

As per coding guidelines "**/*.{ts,tsx,rs}: File size should not exceed approximately 500 lines. When a module grows beyond this threshold, split it into smaller, more focused modules with clear responsibilities."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/es-5.ts` around lines 4 - 709, The es-5 translation
module (const es5 / export default es5) is too large and should be split into
multiple smaller modules: extract logical groups of keys (e.g., settings.* ,
skills.* , settings.localModel.* , composio.*) into separate files like
es-settings.ts, es-skills.ts, es-localModel.ts, etc., each exporting a partial
TranslationMap; then create a lightweight aggregator module that imports those
partial maps and merges them into the single exported const es5 (e.g., const es5
= { ...settings, ...skills, ...localModel } export default es5) so the runtime
shape stays the same while each file stays under the ~500-line guideline.
app/src/lib/i18n/chunks/fr-1.ts (1)

4-1340: 🏗️ Heavy lift

Split this module to stay within the repository file-size threshold.

This file is well beyond the ~500-line target, which makes localized review and maintenance harder. Please split this chunk into smaller focused modules.

As per coding guidelines "**/*.{ts,tsx,rs}: File size should not exceed approximately 500 lines. When a module grows beyond this threshold, split it into smaller, more focused modules with clear responsibilities."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/src/lib/i18n/chunks/fr-1.ts` around lines 4 - 1340, This file defines a
huge TranslationMap as const fr1 and default-exports it; split it into multiple
smaller modules (e.g., fr1_core, fr1_settings, fr1_onboarding, etc.) each
exporting a partial TranslationMap, then import and merge those parts back into
the single fr1 object (preserving the const fr1 symbol and the default export)
so consumers see the same shape; ensure each chunk imports the TranslationMap
type, keep keys grouped logically (navigation, settings, onboarding, voice, mcp,
etc.), update any aggregator that imports fr1 to use the merged export, and run
a build to confirm no missing keys.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@app/src/lib/i18n/chunks/bn-5.ts`:
- Around line 589-590: The two i18n entries are swapped and the spend string
uses mixed placeholder syntax; swap the values for
'settings.billing.autoRecharge.expires' and
'settings.billing.autoRecharge.spentThisWeek' so the expiry key contains the
expiry label and the spent key contains the spend-with-date text, and normalize
placeholders in the spend string by replacing the nonstandard $__PH1__ and the
duplicated "{date}" with the consistent interpolation tokens used elsewhere
(e.g. ${amount} and ${date}) in the value for
'settings.billing.autoRecharge.spentThisWeek'.

In `@app/src/lib/i18n/chunks/hi-4.ts`:
- Line 303: The translation for the key
'settings.ai.openAiCompat.authHeaderExample' should not localize the HTTP header
tokens; replace the current Hindi-translated string with the exact header
example using English tokens and an untranslated placeholder (e.g.
"Authorization: Bearer <your_key>") so users can copy/paste a valid header
format.

In `@app/src/lib/i18n/chunks/hi-5.ts`:
- Line 289: Revert localization of technical literals: for the i18n key
'skills.create.scopeProjectHint' and any other keys where
paths/filenames/commands were translated, restore the canonical English literals
(e.g. "/.openhuman/skills/", "SKILL.md", "cargo build --bin openhuman-core",
etc.) so users can copy valid paths/commands; locate the keys in
app/src/lib/i18n/chunks/hi-5.ts (including the similar keys flagged in the
review) and replace the translated strings with the original exact
command/path/filename literals.

In `@app/src/lib/i18n/chunks/it-4.ts`:
- Line 306: The translation for the key
'settings.ai.openAiCompat.authHeaderExample' incorrectly localizes the HTTP auth
header; change its value to the protocol-exact header string so users can copy
it verbatim, e.g. replace "Autorizzazione: Portatore <la tua chiave>" with
"Authorization: Bearer <la tua chiave>" (keeping the placeholder language
unchanged).

In `@app/src/lib/i18n/chunks/ko-5.ts`:
- Line 468: The localized string in ko-5.ts contains a translated version of the
CLI token "cargo build --bin openhuman-core"; restore that token to its exact
literal ASCII form and only translate the surrounding prose (keep surrounding
Korean text intact), so the final string reads something like: OpenHuman 바이너리를
찾을 수 없습니다. 소스에서 실행하는 경우 다음을 사용하여 빌드하세요: cargo build --bin openhuman-core —
ensure the command substring "cargo build --bin openhuman-core" is not modified.

---

Outside diff comments:
In `@app/src/lib/i18n/chunks/hi-5.ts`:
- Around line 1-697: This file (const hi5: TranslationMap / export default hi5)
is oversized; split the large translation map into multiple smaller modules
(e.g., hi-5-a.ts, hi-5-b.ts) each exporting a partial TranslationMap (named
exports or default), then create an index module that imports those partials and
merges them into the single hi5 TranslationMap (using object spread or
Object.assign) and re-exports the combined hi5 as the default; update any
imports that currently point to this file to import the new index so consumers
see the same default export.

---

Minor comments:
In `@app/src/lib/i18n/chunks/ar-1.ts`:
- Line 1226: The translation for the key
'notifications.routing.routeToOrchestrator' is currently a failure message ("فشل
التوجيه إلى المنسق"); update its value to an action/label form such as "توجيه
إلى المنسق" (or "التوجيه إلى المنسق") so the string conveys the action "Route to
orchestrator" instead of a failure state; locate the key
'notifications.routing.routeToOrchestrator' in ar-1.ts and replace the Arabic
text accordingly.

In `@app/src/lib/i18n/chunks/bn-3.ts`:
- Line 220: The value for the localization key welcome.localSessionDesc contains
corrupted token text ("skips__ BR__Ans"); update the string for
welcome.localSessionDesc to a clean, valid Bengali sentence (e.g., replace the
corrupted fragment with an appropriate Bengali phrase meaning "uses a local
offline profile") so the UI renders correctly while preserving the key name
welcome.localSessionDesc and surrounding punctuation/quotes.

In `@app/src/lib/i18n/chunks/bn-4.ts`:
- Line 303: The value for the i18n key
'settings.ai.openAiCompat.authHeaderLabel' contains a malformed string; replace
the existing value `'2th head]9'` with a readable label (use an English fallback
such as `'Authorization header'` or an appropriate Bengali translation) so the
key maps to a valid user-facing string; update the literal in the bn-4.ts chunk
where 'settings.ai.openAiCompat.authHeaderLabel' is defined.

In `@app/src/lib/i18n/chunks/bn-5.ts`:
- Around line 492-493: Remove the corrupted I18N separator artifacts from the
i18n values for the affected keys (e.g., 'settings.developerMenu.mcpServer.desc'
and the similar keys around the 688-689 region) so the rendered copy shows a
clean fallback string; replace values containing patterns like
'[[I18N_SEP_92731]] OpenHuman' with a plain human-readable fallback (e.g.,
'OpenHuman') or the proper translated text, ensuring no stray marker text or
malformed token tails remain.

In `@app/src/lib/i18n/chunks/de-1.ts`:
- Line 1290: The translation for the key 'vault.syncedTitle' wrongly reads as a
failure message; update the value for the symbol 'vault.syncedTitle' in de-1.ts
to a success-oriented string (e.g., replace "Synchronisierung „{name}“
fehlgeschlagen" with a phrase like "Synchronisierung „{name}“ erfolgreich" or
similar German success wording) so the title correctly reflects a successful
sync event.
- Around line 497-498: The translation for settings.search.parallelKeyLabel
currently contains an error message; update the value for
settings.search.parallelKeyLabel to be a proper input label (e.g., "Parallel API
Schlüssel" or similar) so the API key field is labelled correctly in the UI;
locate the string settings.search.parallelKeyLabel in de-1.ts and replace the
erroneous failure-text with the appropriate label text.

In `@app/src/lib/i18n/chunks/es-2.ts`:
- Line 100: Update the Spanish i18n entries for the technical mode/auth labels
so they use canonical technical terms: change the value for 'devOptions.local'
from 'locales' to 'Local' and change the value for 'devOptions.token' from
'ficha' to 'Token' in the es-2.ts chunk so the UI displays stable, technical
labels for these options.

In `@app/src/lib/i18n/chunks/es-3.ts`:
- Line 95: Replace the misleading non-technical Spanish strings with stable
technical terms: update the translation value for the key 'backend.local' from
"locales" to "Local"; update the scheduler/tick-related key(s) (e.g., the key
referencing scheduler ticks) to use "ticks" instead of "garrapatas"; and update
the bot token label key(s) (e.g., 'bot.token' or the token field labels) to use
"token" instead of "ficha"; keep casing consistent with surrounding translations
and run a quick grep for those keys to ensure all occurrences are normalized.

In `@app/src/lib/i18n/chunks/es-5.ts`:
- Line 482: The translation for settings.appearance.modeSystem is incorrect
("Sistema de partidos" is political); update the value for the key
settings.appearance.modeSystem to a correct Spanish UI string such as "Seguir la
configuración del sistema" or "Usar configuración del sistema" (or "Modo del
sistema" if shorter) so it correctly conveys the system theme option in
appearance settings.

In `@app/src/lib/i18n/chunks/fr-1.ts`:
- Line 965: The translation for the key voice.providers.sttProvider is incorrect
(it currently reads as TTS); update the value for voice.providers.sttProvider to
a correct French label for STT such as "Fournisseur de reconnaissance vocale"
(or "Fournisseur STT") so the UI selector correctly reflects speech-to-text
providers instead of text-to-speech; locate the mapping for
voice.providers.sttProvider in fr-1.ts and replace the existing string
accordingly.

In `@app/src/lib/i18n/chunks/fr-4.ts`:
- Line 191: The translation for the key pages.settings.ai.embeddings incorrectly
uses "Intégrations" which changes the meaning; update the value for
pages.settings.ai.embeddings in the fr-4.ts translations to a semantic
equivalent for vector embeddings such as "Embeddings" or the French
"Vectorisations" (matching capitalization/locale style used elsewhere in the
file) so the label reflects vector embeddings rather than integrations.

In `@app/src/lib/i18n/chunks/id-1.ts`:
- Line 767: The translation key 'iosMascot.typeMessage' contains a
mixed-language placeholder "Ketik a pesan..."; update this value to a fully
Indonesian phrase (for example "Ketik sebuah pesan..." or "Ketik pesan...") in
the id-1.ts chunk so the chat input UI shows a correct Indonesian placeholder;
locate the 'iosMascot.typeMessage' entry and replace the string accordingly.

In `@app/src/lib/i18n/chunks/id-5.ts`:
- Line 603: Typo in the translation value for the key
'settings.localModel.download.notAvailable' (and the duplicate occurrence) —
replace the incorrect 't/a' string with the intended 'n/a'. Locate the entries
for settings.localModel.download.notAvailable in the id-5.ts chunk (both
occurrences) and update their values from 't/a' to 'n/a' so status text is
consistent.
- Line 687: The i18n entry for 'skills.meetingBots.platformHints.teams' uses the
wrong domain; update the value string to use the correct Teams host by replacing
"team.microsoft.com/..." with "teams.microsoft.com/..." so the example URL is
accurate.

In `@app/src/lib/i18n/chunks/it-1.ts`:
- Line 933: The Italian translation for the key voice.providers.sttProvider is
incorrect (it uses TTS wording); update the value for
voice.providers.sttProvider to an STT-appropriate label such as "Provider di
riconoscimento vocale" (or "Provider di trascrizione vocale") so the key matches
its intent and users see the correct label in settings.

In `@app/src/lib/i18n/chunks/ko-1.ts`:
- Around line 1273-1276: The three i18n keys 'vault.syncSummaryFailed',
'vault.syncSummarySkipped', and 'vault.syncSummaryDuration' are mapped to the
wrong Korean fragments; update their values so they semantically match the keys
(i.e., 'vault.syncSummaryFailed' should contain the failure fragment with the
count, 'vault.syncSummarySkipped' should contain the skipped fragment with the
count, and 'vault.syncSummaryDuration' should contain the duration fragment with
seconds). Locate these keys in ko-1.ts and replace the incorrect strings so each
key's value correctly corresponds to failed/skipped/duration messaging
respectively.

In `@app/src/lib/i18n/chunks/ko-3.ts`:
- Line 218: The localized string key 'welcome.localSessionDesc' contains a
broken sentence ("...건너뜁니다. OAuth.")—replace the value with a single coherent
Korean sentence by removing the stray period and connecting the clauses (for
example: "오프라인 로컬 프로필을 사용하고 TinyHumans를 건너뛰며 OAuth를 사용합니다.") so the copy reads
naturally and includes OAuth as part of the sentence.

---

Nitpick comments:
In `@app/src/lib/i18n/chunks/ar-1.ts`:
- Around line 4-1310: The ar1 translation map (const ar1: TranslationMap /
export default ar1) is too large; split it into smaller modules by logical
sections (e.g., nav/common/settings/onboarding/voice/memory) and export partial
maps (e.g., export const nav = {...}, export const common = {...}) in separate
files, then create a small aggregator module that imports those partial maps and
merges them into the final TranslationMap before exporting the combined default
(replacing the single huge ar1). Ensure keys remain identical and reference
ar1/TranslationMap/export default ar1 when locating and replacing the original
big map.

In `@app/src/lib/i18n/chunks/ar-5.ts`:
- Around line 1-683: The ar5 TranslationMap export (const ar5 / export default
ar5) is ~683 lines and exceeds the ~500-line guideline; split the map into
smaller modules (e.g., ar-5-partA.ts, ar-5-partB.ts) that each export a partial
TranslationMap (named exports like ar5_partA, ar5_partB), then create a small
aggregator module that imports those parts and merges them (e.g., const ar5 = {
...ar5_partA, ...ar5_partB } and export default ar5) so the original symbol ar5
remains the single default export consumers use.

In `@app/src/lib/i18n/chunks/bn-5.ts`:
- Around line 1-696: The bn5 translation map constant is too large (~696 lines);
split the bn5 object into smaller modules (e.g., bn-5-part1.ts, bn-5-part2.ts)
each exporting a partial TranslationMap (unique symbols: the current bn5
constant and its default export), then create an index module that imports and
merges those partial maps into a single bn5 object and re-exports it as default;
ensure the merged object preserves key order and types (TranslationMap) so
existing imports that expect the default export remain unchanged.

In `@app/src/lib/i18n/chunks/es-5.ts`:
- Around line 4-709: The es-5 translation module (const es5 / export default
es5) is too large and should be split into multiple smaller modules: extract
logical groups of keys (e.g., settings.* , skills.* , settings.localModel.* ,
composio.*) into separate files like es-settings.ts, es-skills.ts,
es-localModel.ts, etc., each exporting a partial TranslationMap; then create a
lightweight aggregator module that imports those partial maps and merges them
into the single exported const es5 (e.g., const es5 = { ...settings, ...skills,
...localModel } export default es5) so the runtime shape stays the same while
each file stays under the ~500-line guideline.

In `@app/src/lib/i18n/chunks/fr-1.ts`:
- Around line 4-1340: This file defines a huge TranslationMap as const fr1 and
default-exports it; split it into multiple smaller modules (e.g., fr1_core,
fr1_settings, fr1_onboarding, etc.) each exporting a partial TranslationMap,
then import and merge those parts back into the single fr1 object (preserving
the const fr1 symbol and the default export) so consumers see the same shape;
ensure each chunk imports the TranslationMap type, keep keys grouped logically
(navigation, settings, onboarding, voice, mcp, etc.), update any aggregator that
imports fr1 to use the merged export, and run a build to confirm no missing
keys.

In `@app/src/lib/i18n/chunks/it-1.ts`:
- Around line 1-1329: This file defines a large TranslationMap constant it1 and
exports it (const it1 / export default it1); split it into multiple smaller
modules (e.g., multiple files each exporting a partial TranslationMap) so no
single .ts exceeds ~500 lines, keep each module importing type { TranslationMap
} and exporting its partial object, then add a small aggregator module that
imports the partial maps and merges them (Object.assign or spread) into the
final it1 constant and re-exports export default it1 so existing imports remain
unchanged; ensure keys remain unique and preserve the original export name it1
and the TranslationMap typing.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d4934d78-bb77-4308-8138-2a2d3ada5d78

📥 Commits

Reviewing files that changed from the base of the PR and between 41c6686 and a85ba7f.

📒 Files selected for processing (62)
  • app/src/lib/i18n/__tests__/coverage.test.ts
  • app/src/lib/i18n/chunks/ar-1.ts
  • app/src/lib/i18n/chunks/ar-2.ts
  • app/src/lib/i18n/chunks/ar-3.ts
  • app/src/lib/i18n/chunks/ar-4.ts
  • app/src/lib/i18n/chunks/ar-5.ts
  • app/src/lib/i18n/chunks/bn-1.ts
  • app/src/lib/i18n/chunks/bn-2.ts
  • app/src/lib/i18n/chunks/bn-3.ts
  • app/src/lib/i18n/chunks/bn-4.ts
  • app/src/lib/i18n/chunks/bn-5.ts
  • app/src/lib/i18n/chunks/de-1.ts
  • app/src/lib/i18n/chunks/de-2.ts
  • app/src/lib/i18n/chunks/de-3.ts
  • app/src/lib/i18n/chunks/de-4.ts
  • app/src/lib/i18n/chunks/de-5.ts
  • app/src/lib/i18n/chunks/es-1.ts
  • app/src/lib/i18n/chunks/es-2.ts
  • app/src/lib/i18n/chunks/es-3.ts
  • app/src/lib/i18n/chunks/es-4.ts
  • app/src/lib/i18n/chunks/es-5.ts
  • app/src/lib/i18n/chunks/fr-1.ts
  • app/src/lib/i18n/chunks/fr-2.ts
  • app/src/lib/i18n/chunks/fr-3.ts
  • app/src/lib/i18n/chunks/fr-4.ts
  • app/src/lib/i18n/chunks/fr-5.ts
  • app/src/lib/i18n/chunks/hi-1.ts
  • app/src/lib/i18n/chunks/hi-2.ts
  • app/src/lib/i18n/chunks/hi-3.ts
  • app/src/lib/i18n/chunks/hi-4.ts
  • app/src/lib/i18n/chunks/hi-5.ts
  • app/src/lib/i18n/chunks/id-1.ts
  • app/src/lib/i18n/chunks/id-2.ts
  • app/src/lib/i18n/chunks/id-3.ts
  • app/src/lib/i18n/chunks/id-4.ts
  • app/src/lib/i18n/chunks/id-5.ts
  • app/src/lib/i18n/chunks/it-1.ts
  • app/src/lib/i18n/chunks/it-2.ts
  • app/src/lib/i18n/chunks/it-3.ts
  • app/src/lib/i18n/chunks/it-4.ts
  • app/src/lib/i18n/chunks/it-5.ts
  • app/src/lib/i18n/chunks/ko-1.ts
  • app/src/lib/i18n/chunks/ko-2.ts
  • app/src/lib/i18n/chunks/ko-3.ts
  • app/src/lib/i18n/chunks/ko-4.ts
  • app/src/lib/i18n/chunks/ko-5.ts
  • app/src/lib/i18n/chunks/pt-1.ts
  • app/src/lib/i18n/chunks/pt-2.ts
  • app/src/lib/i18n/chunks/pt-3.ts
  • app/src/lib/i18n/chunks/pt-4.ts
  • app/src/lib/i18n/chunks/pt-5.ts
  • app/src/lib/i18n/chunks/ru-1.ts
  • app/src/lib/i18n/chunks/ru-2.ts
  • app/src/lib/i18n/chunks/ru-3.ts
  • app/src/lib/i18n/chunks/ru-4.ts
  • app/src/lib/i18n/chunks/ru-5.ts
  • app/src/lib/i18n/chunks/zh-CN-1.ts
  • app/src/lib/i18n/chunks/zh-CN-2.ts
  • app/src/lib/i18n/chunks/zh-CN-3.ts
  • app/src/lib/i18n/chunks/zh-CN-4.ts
  • app/src/lib/i18n/chunks/zh-CN-5.ts
  • app/src/lib/i18n/ko.ts

Comment thread app/src/lib/i18n/chunks/bn-5.ts Outdated
Comment thread app/src/lib/i18n/chunks/hi-4.ts Outdated
Comment thread app/src/lib/i18n/chunks/hi-5.ts Outdated
Comment thread app/src/lib/i18n/chunks/it-4.ts Outdated
Comment thread app/src/lib/i18n/chunks/ko-5.ts Outdated
@senamakel senamakel merged commit 29ac3ec into tinyhumansai:main May 25, 2026
27 of 28 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

working A PR that is being worked on by the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant