Skip to content

feat(i18n): add Turkish (tr) UI locale and README - #7039

Merged
senamakel merged 9 commits into
tinyhumansai:mainfrom
moersoy:feat/i18n-turkish
Oct 7, 2026
Merged

senamakel merged 9 commits into
tinyhumansai:mainfrom
moersoy:feat/i18n-turkish

Conversation

@moersoy

@moersoy moersoy commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Add 🇹🇷 Türkçe to the shared language picker, with Turkish browser-language detection (tr, tr-TR).
  • Add app/src/lib/i18n/tr.ts: all 4,592 current English keys translated, formal address ("siz"), placeholders preserved exactly.
  • Register tr in the i18n tooling: i18n-coverage.ts, i18n-find-english.ts (as a Latin-script locale), and apply-i18n-translations.ts.
  • Add docs/README.tr.md, translated from the current root README, and link it from the language bar of the root README and every translated README (including the new Arabic one).

Problem

  • Turkish was not available in the UI or the README set. The core already maps tr → Turkish for output_language (config/schema/types/output_language.rs), so only the frontend locale and docs were missing.

Solution

  • The locale uses the existing frontend translation system: the Locale union, the I18nContext translation map, the localeSlice prefix table and LanguageSelect. It is LTR, so there is no RTL work. No Rust changes.
  • tr.ts was generated with scripts/apply-i18n-translations.ts, so keys follow en.ts order and apostrophes (e.g. OpenHuman'a) are escaped by the script.
  • Turkish-specific choices:
    • Case suffixes are never attached to a placeholder, because vowel harmony depends on the runtime value ({name} için, Sil: {name} instead of {name}'e).
    • Nouns stay singular after numbers ({count} dosya).
    • Percent signs come first (%{percent}).
  • Strings that the UI concatenates as fragments (e.g. the Composio connect copy, the recovery-phrase instruction and the boot-check bearer note) were phrased to read correctly in Turkish word order.
  • This PR is limited to i18n and docs files. Unlike feat(i18n): add Japanese UI locale (日本語) #6986, it carries no unrelated CI or runtime changes.

Submission Checklist

  • Tests added or updated:
    • LanguageSelect.test.tsx (new): Turkish option is offered, it applies immediately, and switching back to English works.
    • I18nContext.test.tsx: Turkish strings, the unknown-key fallback, and lang="tr" / dir="ltr".
    • localeSlice.test.ts: detects tr, tr-TR and TR-tr.
    • coverage.test.ts: tr is in the parity set, plus an exact placeholder-parity check against English.
  • Diff coverage ≥ 80%: the changed runtime lines (picker option, provider map entry, prefix table entry, type) are exercised by the tests above.
  • Coverage matrix updated: N/A. docs/TEST-COVERAGE-MATRIX.md has no per-locale feature rows.
  • Affected feature IDs listed under Related: N/A, no matrix rows.
  • No new external network dependencies introduced.
  • Manual smoke checklist updated: N/A, this does not touch release-cut surfaces.
  • Linked issue: N/A, direct contribution.

Impact

  • Desktop and web UI gain a Turkish locale. Existing locales, saved locale choices, fallback to English, interpolation and RTL handling are unchanged.
  • No runtime, performance, security or migration impact. No Rust changes.
  • Known cosmetic caveat: with <html lang="tr">, CSS text-transform: uppercase maps i → İ, which is correct for Turkish text but can affect untranslated brand names in uppercase labels. Left for a follow-up if reviewers see it in practice.

Related


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

Linear Issue

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

Commit & Branch

  • Branch: moersoy:feat/i18n-turkish
  • Commit SHA: 16f31ea

Validation Run

  • pnpm --filter openhuman-app format:check: changed files are clean.
  • pnpm typecheck
  • Focused tests: vitest run src/lib/i18n src/store/localeSlice.test.ts src/components/LanguageSelect.test.tsx passed 99/99.
  • Full frontend suite: pnpm test passed 8,696, with 1 existing skip. The rpcMethods drift guard needs the vendor/ submodules initialised; with them it passes 20/20.
  • pnpm i18n:check: tr has 0 missing and 0 extra keys. 126 values are identical to English (brand and technical literals), the lowest count of any locale.
  • pnpm i18n:english:check: 0 unexpected English values across all locales.
  • Rust fmt/check: N/A, no Rust changes.
  • Tauri fmt/check: N/A.

Validation Blocked

  • command: N/A
  • error: N/A
  • impact: N/A

Behavior Changes

  • Intended behavior change: Turkish is selectable and auto-detected from the browser or OS language.
  • User-visible effect: The whole UI renders in Turkish when it is selected.

Parity Contract

  • Legacy behavior preserved: The locale list order, the en fallback, the id/in detection order and RTL for ar are unchanged.
  • Guard/fallback/dispatch parity checks: The coverage test enforces key parity and no em dashes for tr, plus exact placeholder parity.

Duplicate / Superseded PR Handling

  • Duplicate PR(s): None for Turkish.
  • Canonical PR: This PR.
  • Resolution (closed/superseded/updated): N/A

Summary by CodeRabbit

  • New Features
    • Added Turkish as a supported interface language, with translated text across the app.
    • Turkish can be selected in Settings or detected from your browser’s language preferences, and your selection persists after reload.
    • Added a Turkish version of the README and links to it in the language selectors across project documentation.

Copilot AI balanced review requested due to automatic review settings October 6, 2026 19:01

Copilot AI left a comment

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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@tinysweeper

tinysweeper Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Tiny Sweeper review

Tiny Sweeper completed its review; deterministic results follow.

State: Incomplete
Priority: high
Reviewed head: 59164094df0b
Updated: 1791353482 (Unix time)

Review snapshot

Change surface Files Review signal Count
Production 8 Active findings 7
Tests 7 Noted findings 0
Documentation 8 Resolved findings 93
Configuration 0 Pending checks/questions 5

Completeness: Incomplete
Test assessment: Test coverage is assessed from changed tests and lane evidence; execution is not claimed without trusted check data.

What changed

No supported behavioral explanation was produced.

Features

  • Added — Turkish UI locale: Users can select Turkish in the language picker, browser locales 'tr', 'tr-TR', 'TR-tr' map to the Turkish locale, and Turkish renders left-to-right with the unknown-key fallback; Turkish is registered in the translations map. The tests lane flags that app/src/lib/i18n/tr.ts was not found in the tree while it is imported and enumerated by other modules. (app/src/lib/i18n/types.ts#export type Locale =, app/src/lib/i18n/I18nContext.tsx#const translations: Record<Locale, Record<string, string>> = {, app/src/components/LanguageSelect.tsx#const LOCALE_OPTIONS: LocaleOption[] = [, app/src/store/localeSlice.ts#const PREFIX_TO_LOCALE: Array<[string, Locale]> = [, app/src/lib/i18n/tr.ts)
  • Added — Turkish product README and language-bar links: Adds docs/README.tr.md and adds a Türkçe link to the README language bars across the root README and existing translated READMEs; docs/README.md lists README.tr.md among translated product READMEs. (docs/README.tr.md, README.md, docs/README.md#behind the `rss-bench` feature)., docs/README.ar.md, docs/README.de.md, docs/README.ja-JP.md, docs/README.ko.md, docs/README.ur-pk.md, docs/README.zh-CN.md)

Tests

  • component — LanguageSelect: selecting '🇹🇷 Türkçe' sets store locale to 'tr', the combobox value, renders 'Dil', and sets document lang to 'tr' with dir 'ltr'; switching back to 'en' restores the English label and lang.: Pins both the addition of Turkish to the picker and the switch-back path; assertions cover store state, DOM, and document attributes. (app/src/components/LanguageSelect.test.tsx#function renderPicker() {, app/src/components/LanguageSelect.tsx#const LOCALE_OPTIONS: LocaleOption[] = [)
  • unit — I18nContext: rendering with 'tr' serves Turkish strings ('Dil', 'Uygulama verilerini temizle', 'Çık'), reports locale 'tr', falls back for an unknown key, and sets lang 'tr' / dir 'ltr'.: Covers translation serving, unknown-key fallback, and directionality for the new locale; per the tests lane finding, these tests depend on the tr module it reports as absent from the tree. (app/src/lib/i18n/__tests__/I18nContext.test.tsx#describe('I18nProvider', () => {, app/src/lib/i18n/I18nContext.tsx#const translations: Record<Locale, Record<string, string>> = {, app/src/lib/i18n/tr.ts)
  • unit — localeSlice: 'tr', 'tr-TR', and 'TR-tr' browser locales each resolve the initial locale state to 'tr'.: Exercises the Turkish prefix mapping across case/region variants. (app/src/store/localeSlice.test.ts#describe('localeSlice', () => {, app/src/store/localeSlice.ts#const PREFIX_TO_LOCALE: Array<[string, Locale]> = [)
  • script — scripts/__tests__/i18n-find-english.test.mjs: looksEnglish flags two English-only function words (including for 'de'), ignores English-list words that are ordinary Turkish words ('Not: can sıkıcı olabilir', 'may', 'Has üzüm must', 'Had…don'), still flags real English left in Turkish values, and confirms Turkish-only exclusions do not leak into other locales ('de' still flags the same string).: Genuinely pins the new locale-aware exclusion behavior and its non-leakage into other locales. (scripts/__tests__/i18n-find-english.test.mjs, scripts/i18n-find-english.ts#async function main() {, scripts/i18n-find-english.ts#function isTechnical(value: string): boolean {)

Findings

  • high · critique · Add the Turkish locale module before enumerating it — This makes `tr` a selectable locale, while the current i18n context imports `./tr` and no `app/src/lib/i18n/tr.ts` module exists in the reviewed tree. The frontend therefore cannot (app/src/components/LanguageSelect\.tsx:29)
  • medium · critique · Do not discard Turkish homographs as English signals — Removing these words unconditionally creates false negatives for English values in the Turkish locale. For example, `looksEnglish("May not be available", "tr")` produces no distinc (scripts/i18n\-find\-english\.ts:127)
  • medium · critique · Drive the language picker to Turkish in an E2E spec — This only verifies the initial locale inferred from `navigator.language`; it does not exercise the user-facing language picker, dispatching the locale change, or the resulting UI b (app/src/store/localeSlice\.test\.ts:35)
  • medium · critique · Drive the language picker to Turkish in an E2E spec — This adds a new user-facing language-selection path, but the reviewed change adds no mocked browser/desktop E2E coverage that selects `tr` and verifies the resulting locale behavio (app/src/components/LanguageSelect\.tsx:29)
  • high · security · Add the Turkish locale module before enumerating it — Adding `tr` to the supported-locale detection makes Turkish a reachable locale, but `I18nContext.tsx` imports `./tr` and no `app/src/lib/i18n/tr.ts` module exists at this revision. (app/src/store/localeSlice\.ts:23)
  • medium · security · Drive the language picker to Turkish in an E2E spec — This test dispatches `setLocale('tr')` directly, so it verifies provider rendering but not the user-facing language-picker flow. A registration or wiring mistake in the picker coul (app/src/lib/i18n/\_\_tests\_\_/I18nContext\.test\.tsx:71)
  • medium · security · Drive the language picker to Turkish in an E2E spec — Adding `tr` as a supported locale requires coverage of the actual browser/desktop language-picker flow, not only locale-loader and reducer tests. Add a mocked frontend/desktop E2E (app/src/lib/i18n/types\.ts:16)

Resolved this pass

  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Drive the language picker to Turkish in an E2E spec
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Drive the language picker to Turkish in an E2E spec
  • Add the Turkish locale module before importing it
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Drive the language picker to Turkish in an E2E spec
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Use a Turkish-safe English-word list
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Use a Turkish-safe English-word list
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Drive the language picker to Turkish in an E2E spec
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Drive the language picker to Turkish in an E2E spec
  • Add the Turkish locale module before importing it
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Drive the language picker to Turkish in an E2E spec
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Drive the language picker to Turkish in an E2E spec
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Drive the language picker to Turkish in an E2E spec
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Drive the language picker to Turkish in an E2E spec
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Use a Turkish-safe English-word list
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Drive the language picker to Turkish in an E2E spec
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Use a Turkish-safe English-word list
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Drive the language picker to Turkish in an E2E spec
  • medium — Use a Turkish-safe English-word list
  • Use a Turkish-safe English-word list
  • Add the Turkish locale module before enumerating it
  • Add the Turkish locale module before importing it
  • Drive the language picker to Turkish in an E2E spec
  • Add the Turkish locale module before importing it
  • Add the Turkish locale module before enumerating it
  • Use a Turkish-safe English-word list
  • Drive the language picker to Turkish in an E2E spec
  • Add the Turkish locale module before importing it
  • Add the Turkish locale module before importing it
  • Add the Turkish locale module before enumerating it
  • Use a Turkish-safe English-word list
  • Drive the language picker to Turkish in an E2E spec
  • Drive the language picker to Turkish in an E2E spec
  • Add the Turkish locale module before importing it
  • Add the Turkish locale module before enumerating it
  • Use a Turkish-safe English-word list

Pending checks: Rust E2E (mock backend), Build Playwright E2E Artifact, E2E (Playwright / web lane), Desktop E2E (full suite, 3 OS)

Could not review: app/src/lib/i18n/tr.ts

Before merge

  • Address Add the Turkish locale module before enumerating it (app/src/components/LanguageSelect\.tsx).
  • Address Add the Turkish locale module before enumerating it (app/src/store/localeSlice\.ts).
  • Wait for Rust E2E (mock backend), Build Playwright E2E Artifact, E2E (Playwright / web lane), Desktop E2E (full suite, 3 OS).
  • Review unavailable diffs: app/src/lib/i18n/tr.ts.

How this fits together

flowchart LR
  n0["LocaleOption<br/>changed<br/>2 findings"]:::blocking
  n1["Locale<br/>changed<br/>1 finding"]:::flagged
  n2["exit"]:::impacted
  n3["parseArgs"]:::impacted
  n4["parseArgs"]:::impacted
  n0 -->|uses| n1
  n3 -->|calls| n2
  n4 -->|calls| n2
  classDef changed fill:#0d4429,stroke:#238636,color:#e6edf3
  classDef impacted fill:#161b22,stroke:#6e7681,color:#c9d1d9
  classDef flagged fill:#5a1e02,stroke:#d93f0b,color:#ffffff
  classDef blocking fill:#67060c,stroke:#f85149,color:#ffffff
Loading
Agent review details

critique

  • Conclusion: Failure
  • Scope reviewed: all assigned evidence
  • Lane summary: Reviewed 19 files; 5 findings. _Code retrieval was unavailable (model: ladder embeddings returned 400 Bad Request: {"error":{"message":"unknown ladder vectors; known ladders are flash (also chat-v1, flash-v1), instant (also no-think, instant-v1), reasoning (also deepseek), max-reasoning (also max-reasoning-v1), deepseek-flash (also reasoning-v1, agentic-v1), deep (also luna), scribe, uncensored, vectors-oai3 (also embeddings-oai3-v1), vision (also vision-v1, multimodal-v1), image (also images-v1, image-v1), vi), so this review saw the diff alone._ _Memory was unavailable (model: cortex: v1/recall: error sending request for url (http://cortexdb:3141/v1/recall\)\), so this review ran without it._ _The forge supplied no diff for `app/src/lib/i18n/tr.ts`; it was not reviewed._
  • Evidence: app/src/components/LanguageSelect\.tsx — Add the Turkish locale module before enumerating it
  • Evidence: scripts/i18n\-find\-english\.ts — Do not discard Turkish homographs as English signals
  • Evidence: app/src/store/localeSlice\.test\.ts — Drive the language picker to Turkish in an E2E spec
  • Evidence: app/src/components/LanguageSelect\.tsx — Drive the language picker to Turkish in an E2E spec

security

  • Conclusion: Failure
  • Scope reviewed: all assigned evidence
  • Lane summary: Reviewed 11 files; 4 findings. 8 files were not security-reviewed: README.md (prose or tabular data), docs/README.de.md (prose or tabular data), docs/README.ja-JP.md (prose or tabular data), docs/README.ko.md (prose or tabular data), docs/README.md (prose or tabular data), and 3 more. (1 already reported on an earlier push) _Code retrieval was unavailable (model: ladder embeddings returned 400 Bad Request: {"error":{"message":"unknown ladder vectors; known ladders are flash (also chat-v1, flash-v1), instant (also no-think, instant-v1), reasoning (also deepseek), max-reasoning (also max-reasoning-v1), deepseek-flash (also reasoning-v1, agentic-v1), deep (also luna), scribe, uncensored, vectors-oai3 (also embeddings-oai3-v1), vision (also vision-v1, multimodal-v1), image (also images-v1, image-v1), vi), so this review saw the diff alone._ _Memory was unavailable (model: cortex: v1/recall: error sending request for url (http://cortexdb:3141/v1/recall\)\), so this review ran without it._ _The forge supplied no diff for `app/src/lib/i18n/tr.ts`; it was not reviewed._
  • Evidence: app/src/store/localeSlice\.ts — Add the Turkish locale module before enumerating it
  • Evidence: app/src/lib/i18n/\_\_tests\_\_/I18nContext\.test\.tsx — Drive the language picker to Turkish in an E2E spec
  • Evidence: app/src/lib/i18n/types\.ts — Drive the language picker to Turkish in an E2E spec

tests

  • Conclusion: Success
  • Scope reviewed: all assigned evidence
  • Lane summary: The Turkish locale change is now properly wired and tested: the tr module is imported and enumerated, the language picker offers Turkish, and both unit and browser E2E tests exercise the switch-and-restore behaviour with real assertions. The Turkish-safe English-word exclusion is implemented in looksEnglish and pinned by tests. All previously raised findings are resolved; no new problems found. _Code retrieval was unavailable (model: ladder embeddings returned 400 Bad Request: {"error":{"message":"unknown ladder vectors; known ladders are flash (also chat-v1, flash-v1), instant (also no-think, instant-v1), reasoning (also deepseek), max-reasoning (also max-reasoning-v1), deepseek-flash (also reasoning-v1, agentic-v1), deep (also luna), scribe, uncensored, vectors-oai3 (also embeddings-oai3-v1), vision (also vision-v1, multimodal-v1), image (also images-v1, image-v1), vi), so this review saw the diff alone._ _Memory was unavailable (model: cortex: v1/recall: error sending request for url (http://cortexdb:3141/v1/recall\)\), so this review ran without it._ _The forge supplied no diff for `app/src/lib/i18n/tr.ts`; it was not reviewed._

commits

  • Conclusion: Neutral
  • Scope reviewed: all assigned evidence
  • Lane summary: Nothing sensitive found in what this pull request commits.

description

  • Conclusion: Success
  • Scope reviewed: all assigned evidence
  • Lane summary: This revision resolves all previously raised findings: tr.ts is now imported and registered, the English-word check has Turkish-safe exclusions with tests, and a browser E2E spec drives the picker to Turkish. The Turkish locale addition, tests, and README links look consistent with the description. One residual risk: the new CLI-entry guard in i18n-find-english.ts uses pathToFileURL, whose import is not visible in any part of this pull request, which would break the CLI if it was never imported. _Code retrieval was unavailable (model: ladder embeddings returned 400 Bad Request: {"error":{"message":"unknown ladder vectors; known ladders are flash (also chat-v1, flash-v1), instant (also no-think, instant-v1), reasoning (also deepseek), max-reasoning (also max-reasoning-v1), deepseek-flash (also reasoning-v1, agentic-v1), deep (also luna), scribe, uncensored, vectors-oai3 (also embeddings-oai3-v1), vision (also vision-v1, multimodal-v1), image (also images-v1, image-v1), vi), so this review saw the diff alone._ _Memory was unavailable (model: cortex: v1/recall: error sending request for url (http://cortexdb:3141/v1/recall\)\), so this review ran without it._ _The forge supplied no diff for `app/src/lib/i18n/tr.ts`; it was not reviewed._

e2e

  • Conclusion: Neutral
  • Scope reviewed: all assigned evidence
  • Lane summary: The Turkish locale change now ships an end-to-end Playwright spec that selects Turkish through the Settings picker, asserts the persisted locale and UI strings across a reload, and switches back to English — closing the earlier coverage gap. The Turkish-safe English-word list in scripts/i18n-find-english.ts is also in place with tests. The prior findings are resolved; the change looks sound from an end-to-end standpoint (CI lanes are still pending but that is not a finding). Waiting on end-to-end jobs: `Rust E2E (mock backend)`, `Build Playwright E2E Artifact`, `E2E (Playwright / web lane)`, `Desktop E2E (full suite, 3 OS)`.
  • Unresolved questions/checks: Rust E2E (mock backend), Build Playwright E2E Artifact, E2E (Playwright / web lane), Desktop E2E (full suite, 3 OS)
Evidence and run details
  • Models: gpt-5.6-luna, glm-5.3-flash
  • Spend: $0.036459
  • Tokens: 684638 input · 48482 output · 64039 cached · 0 embedding
  • Continuity: summary cache chain restarted at the storage ceiling.
Head State Pass summary
e65516265670 changes requested 4 active finding(s), 10 resolved finding(s) (at 1791314302)
407126b590e9 changes requested 0 active finding(s), 12 resolved finding(s) (at 1791314747)
29bb8f18683f changes requested 10 active finding(s), 33 resolved finding(s) (at 1791348941)
e2687d3c438d changes requested 1 active finding(s), 26 resolved finding(s) (at 1791351122)
59164094df0b changes requested 7 active finding(s), 93 resolved finding(s) (at 1791353482)

tinysweeper 0.1.0

@coderabbitai

coderabbitai Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: bd7ddf9f-559f-400d-8183-502257e7d769
📥 Commits

Reviewing files that changed from the base of the PR and between b1cddcf and 5916409.

📒 Files selected for processing (2)
  • docs/README.md
  • docs/README.tr.md
🚧 Files skipped from review as they are similar to previous changes (2)
  • docs/README.md
  • docs/README.tr.md

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 1 remain after this review.


📝 Walkthrough

Walkthrough

The application now supports Turkish translations and locale selection. Translation scripts process Turkish, and README files include a Turkish translation and updated language links. Three vendor subproject references also changed.

Changes

Turkish Locale Support

Layer / File(s) Summary
Translation contract and registration
app/src/lib/i18n/types.ts, app/src/lib/i18n/tr.ts, app/src/lib/i18n/I18nContext.tsx, app/src/lib/i18n/__tests__/*
The locale type and translation map include Turkish. The context registers the translation map. Tests check translated strings, fallback behavior, document attributes, key coverage, and interpolation placeholders.
Application locale selection
app/src/components/LanguageSelect.tsx, app/src/components/LanguageSelect.test.tsx, app/src/store/localeSlice.ts, app/src/store/localeSlice.test.ts, app/test/e2e/specs/turkish-locale.browser.ts, app/test/playwright/specs/turkish-locale.spec.ts
The language selector and browser locale detection include Turkish. Tests cover switching between Turkish and English, document language and direction, and locale persistence across reloads.
Translation tooling and detection
scripts/apply-i18n-translations.ts, scripts/i18n-coverage.ts, scripts/i18n-find-english.ts, scripts/__tests__/i18n-find-english.test.mjs
Translation scripts include Turkish in locale processing and display labels. The English detector applies Turkish-specific word exclusions, accepts a locale argument, and runs only when invoked directly. Tests cover detection behavior.
Turkish README and navigation
README.md, docs/README.tr.md, docs/README.md, docs/README.de.md, docs/README.ja-JP.md, docs/README.ko.md, docs/README.ur-pk.md, docs/README.zh-CN.md
A Turkish README is added, and README language selectors add Turkish links. The Simplified Chinese selector removes Urdu.

Vendor Subproject References

Layer / File(s) Summary
Updated subproject references
vendor/tinyagents, vendor/tinybus, vendor/tinymemory
The three vendor subproject references point to updated commits.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant LanguageSelect
  participant localeSlice
  participant I18nContext
  participant Document
  LanguageSelect->>localeSlice: Select Turkish locale
  localeSlice->>I18nContext: Provide current locale
  I18nContext->>Document: Set language and direction
Loading

Suggested reviewers: senamakel

Merge Risk: ⚪ Minimal · up to 59164

The Turkish README links work, and no issue identified in the reviewed changes needs to be fixed before merging.

Security Architecture Review

Security architecture risk: 🔵 Low · up to b1cdd

The Turkish locale follows the existing presentation and language-selection design, with no identified new authorization or execution path. However, three bundled dependency updates remain unresolved, so the PR cannot be assessed as localization-only or minimal risk.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The unresolved dependency exposure can extend beyond frontend presentation: workspace patches resolve tool and inference packages from beneath tinyagents. Without the named dependency comparisons, changes to downstream authority, failure containment, or stored-data behavior cannot be bounded. No such adverse change has been established.

Trust Boundaries and Controls

  • observed — The Turkish map is statically imported. Runtime lookup selects a preloaded string map rather than loading code from the browser language, and the translator itself performs no interpolation. Inspected keyring-consent and plan-review consumers retain fixed action callbacks or decision values independently of translated labels.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 5 functions across 15 files. (2 skipped: 2… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding Turkish as a UI locale and adding its README translation.
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.
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 5 functions across 15 files. (2 skipped: 2 unsupported.)

  • Fix all pre-merge checks with AI
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

A rabbit taps “Türkçe” with care,
New Turkish words bloom everywhere.
Switch to English, then back again,
The chosen tongue stays after reloads, my friend.
README links hop into view,
A rabbit chews a carrot, too.

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

Add a full Turkish translation of all 4,592 English keys using formal
address, register it in the locale type, provider, picker and browser
language detection, and include tr in the i18n coverage, English-leftover
and apply scripts.

Tests cover picker selection, Turkish detection for tr/tr-TR, provider
lang/dir, and exact placeholder parity against English.
Translate the current root README into docs/README.tr.md and link it
from the language bar of the root README and every translated README.

@tinysweeper tinysweeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Requesting changes: 1 lane(s) blocking, worst finding is high.

Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.

             $0.0058 · 490,103 in / 22,961 out · 50,769 cached (10%) · gpt-5.6-luna, glm-5.3-flash
critique:    $0.0036 · 291,899 in / 15,426 out · 36,491 cached (13%) · gpt-5.6-luna, glm-5.3-flash
security:    $0.0013 · 108,564 in / 4,295 out  · 14,278 cached (13%) · gpt-5.6-luna
tests:       $0.0001 · 16,177 in  / 138 out    · 0 cached (0%)       · glm-5.3-flash
description: $0.0002 · 16,740 in  / 114 out    · 0 cached (0%)       · glm-5.3-flash
e2e:         $0.0004 · 41,025 in  / 430 out    · 0 cached (0%)       · glm-5.3-flash

Comment thread scripts/i18n-find-english.ts Outdated
Comment thread scripts/i18n-coverage.ts
@tinysweeper tinysweeper Bot added the priority: p1 Next. Wrong behaviour a user will hit, or a security weakness behind a condition. label Oct 6, 2026
@moersoy
moersoy force-pushed the feat/i18n-turkish branch from 899d242 to 16f31ea Compare October 6, 2026 19:08
@tinysweeper tinysweeper Bot added priority: p3 Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect. and removed priority: p1 Next. Wrong behaviour a user will hit, or a security weakness behind a condition. labels Oct 6, 2026
can, not and may are in the shared English function-word list but are
also ordinary Turkish words ("Not: ..." is a common note prefix), so a
Turkish value carrying two of them was reported as English and failed
i18n:english:check. Ignore per-locale shared words for tr, and run main()
only when invoked as a CLI so looksEnglish can be unit tested.

@tinysweeper tinysweeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Requesting changes: 2 lane(s) blocking, worst finding is high.

Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.

             $0.0020 · 190,172 in / 10,115 out · 24,880 cached (13%) · gpt-5.6-luna, glm-5.3-flash
critique:    $0.0006 · 52,877 in  / 4,172 out  · 6,086 cached (12%)  · gpt-5.6-luna, glm-5.3-flash
security:    $0.0005 · 38,854 in  / 2,902 out  · 5,354 cached (14%)  · gpt-5.6-luna
tests:       $0.0002 · 18,007 in  / 140 out    · 0 cached (0%)       · glm-5.3-flash
description: $0.0002 · 18,555 in  / 115 out    · 0 cached (0%)       · glm-5.3-flash
e2e:         $0.0003 · 43,678 in  / 426 out    · 13,440 cached (31%) · glm-5.3-flash

Comment thread scripts/__tests__/i18n-find-english.test.mjs
Comment thread scripts/i18n-find-english.ts
Comment thread scripts/i18n-find-english.ts
@tinysweeper tinysweeper Bot added priority: p1 Next. Wrong behaviour a user will hit, or a security weakness behind a condition. and removed priority: p3 Whenever. Cosmetic, a nicety, or a cleanup with no user visible effect. labels Oct 6, 2026
Checking the whole ENGLISH_FN list against Turkish also finds must
(grape must), has (pure), had (limit) and don (frost), so add them to
the tr shared-word set alongside can, not and may. Keep "and" (oath):
it is archaic in UI copy and the strongest English signal.

@tinysweeper tinysweeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Requesting changes: 1 lane(s) blocking, worst finding is low.

Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.

             $0.0021 · 197,883 in / 9,569 out · 32,321 cached (16%) · gpt-5.6-luna, glm-5.3-flash
critique:    $0.0007 · 64,043 in  / 2,934 out · 11,739 cached (18%) · gpt-5.6-luna, glm-5.3-flash
security:    $0.0005 · 35,525 in  / 2,701 out · 7,142 cached (20%)  · gpt-5.6-luna
tests:       $0.0003 · 37,297 in  / 1,019 out · 13,440 cached (36%) · glm-5.3-flash
description: $0.0002 · 18,714 in  / 152 out   · 0 cached (0%)       · glm-5.3-flash
e2e:         $0.0002 · 21,692 in  / 190 out   · 0 cached (0%)       · glm-5.3-flash

coderabbitai[bot]
coderabbitai Bot previously approved these changes Oct 6, 2026
@senamakel senamakel self-assigned this Oct 7, 2026
Co-authored-by: Medulla <medulla@tinyhumans.ai>

@tinysweeper tinysweeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Requesting changes: 2 lane(s) blocking, worst finding is high.

Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.

             $0.0226 · 498,859 in / 28,191 out · 46,824 cached (9%)  · gpt-5.6-luna, glm-5.3-flash
critique:    $0.0136 · 266,693 in / 12,801 out · 24,361 cached (9%)  · gpt-5.6-luna, glm-5.3-flash
security:    $0.0082 · 131,064 in / 11,139 out · 16,063 cached (12%) · gpt-5.6-luna
tests:       $0.0001 · 18,000 in  / 373 out    · 1,536 cached (9%)   · glm-5.3-flash
description: $0.0001 · 18,650 in  / 449 out    · 1,408 cached (8%)   · glm-5.3-flash
e2e:         $0.0004 · 46,790 in  / 1,097 out  · 3,456 cached (7%)   · glm-5.3-flash

Comment thread scripts/i18n-find-english.ts
Comment thread app/src/store/localeSlice.ts
Comment thread app/src/components/LanguageSelect.test.tsx
Comment thread app/src/store/localeSlice.ts
Comment thread app/src/lib/i18n/I18nContext.tsx
Comment thread app/src/lib/i18n/types.ts
Comment thread scripts/apply-i18n-translations.ts
Comment thread scripts/i18n-coverage.ts
Comment thread app/src/components/LanguageSelect.tsx
coderabbitai[bot]
coderabbitai Bot previously approved these changes Oct 7, 2026
Co-authored-by: Medulla <medulla@tinyhumans.ai>
coderabbitai[bot]
coderabbitai Bot previously approved these changes Oct 7, 2026
Co-authored-by: Medulla <medulla@tinyhumans.ai>

@tinysweeper tinysweeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Requesting changes: 1 lane(s) blocking, worst finding is high.

Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.

             $0.0020 · 206,495 in / 8,893 out · 15,386 cached (7%) · gpt-5.6-luna, glm-5.3-flash
critique:    $0.0006 · 33,547 in  / 2,024 out · 4,065 cached (12%) · gpt-5.6-luna
security:    $0.0006 · 33,797 in  / 1,830 out · 3,577 cached (11%) · gpt-5.6-luna
tests:       $0.0005 · 59,471 in  / 2,018 out · 4,608 cached (8%)  · glm-5.3-flash
description: $0.0001 · 19,373 in  / 264 out   · 1,408 cached (7%)  · glm-5.3-flash
e2e:         $0.0002 · 22,436 in  / 295 out   · 1,728 cached (8%)  · glm-5.3-flash

Comment thread app/src/lib/i18n/I18nContext.tsx
Co-authored-by: Medulla <medulla@tinyhumans.ai>
coderabbitai[bot]
coderabbitai Bot previously approved these changes Oct 7, 2026
Co-authored-by: Medulla <medulla@tinyhumans.ai>
@senamakel
senamakel merged commit adf4e16 into tinyhumansai:main Oct 7, 2026
11 of 16 checks passed

@tinysweeper tinysweeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Requesting changes: 2 lane(s) blocking, worst finding is high.

Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.

             $0.0365 · 684,638 in / 48,482 out · 64,039 cached (9%)  · gpt-5.6-luna, glm-5.3-flash
critique:    $0.0233 · 412,652 in / 28,155 out · 42,561 cached (10%) · gpt-5.6-luna, glm-5.3-flash
security:    $0.0125 · 193,824 in / 17,139 out · 21,414 cached (11%) · gpt-5.6-luna
tests:       $0.0001 · 18,314 in  / 297 out    · 0 cached (0%)       · glm-5.3-flash
description: $0.0002 · 18,942 in  / 634 out    · 0 cached (0%)       · glm-5.3-flash
e2e:         $0.0002 · 21,991 in  / 266 out    · 0 cached (0%)       · glm-5.3-flash

{ value: 'id', flag: '🇮🇩', label: 'Bahasa Indonesia' },
{ value: 'it', flag: '🇮🇹', label: 'Italiano' },
{ value: 'pl', flag: '🇵🇱', label: 'Polski' },
{ value: 'tr', flag: '🇹🇷', label: 'Türkçe' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority high critique confident

Add the Turkish locale module before enumerating it

This makes tr a selectable locale, while the current i18n context imports ./tr and no app/src/lib/i18n/tr.ts module exists in the reviewed tree. The frontend therefore cannot build with the current imports, and selecting this option cannot provide translations. Add the complete Turkish translation module before exposing this option.

[RULE] missing-locale-module ·

// about English there. Turkish (checked against the whole list): "can" (life/soul), "not"
// (note, as in "Not: …"), "may" (yeast), "must" (grape must), "has" (pure), "had" (limit),
// "don" (frost). "and" (oath) stays: it is archaic in UI copy and English's strongest signal.
const LOCALE_SHARED_WORDS: Readonly<Record<string, ReadonlySet<string>>> = {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority medium critique confident

Do not discard Turkish homographs as English signals

Removing these words unconditionally creates false negatives for English values in the Turkish locale. For example, looksEnglish("May not be available", "tr") produces no distinct English function words because both may and not are discarded, even though the entire value is English and should be reported. Use context-aware handling or retain enough signals to detect English phrases containing these homographs.

[RULE] false-negative-detection ·

expect(reducer(undefined, { type: '@@INIT' }).current).toBe('id');
});

it.each(['tr', 'tr-TR', 'TR-tr'])('detects the Turkish browser locale %s', async language => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority medium critique confident

Drive the language picker to Turkish in an E2E spec

This only verifies the initial locale inferred from navigator.language; it does not exercise the user-facing language picker, dispatching the locale change, or the resulting UI behavior. The repository rules require frontend flows to have mocked browser/desktop E2E coverage, so add an E2E case that selects Turkish through the picker and verifies the visible outcome.

[RULE] missing-e2e-coverage ·

{ value: 'id', flag: '🇮🇩', label: 'Bahasa Indonesia' },
{ value: 'it', flag: '🇮🇹', label: 'Italiano' },
{ value: 'pl', flag: '🇵🇱', label: 'Polski' },
{ value: 'tr', flag: '🇹🇷', label: 'Türkçe' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority medium critique confident

Drive the language picker to Turkish in an E2E spec

This adds a new user-facing language-selection path, but the reviewed change adds no mocked browser/desktop E2E coverage that selects tr and verifies the resulting locale behavior. Without that coverage, the missing wiring or translation failures above can regress unnoticed. Add the required E2E scenario using the repository's element helpers.

[RULE] missing-e2e-coverage ·

['in', 'id'],
['it', 'it'],
['pl', 'pl'],
['tr', 'tr'],

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority high security confident

Add the Turkish locale module before enumerating it

Adding tr to the supported-locale detection makes Turkish a reachable locale, but I18nContext.tsx imports ./tr and no app/src/lib/i18n/tr.ts module exists at this revision. A Turkish browser can now select a locale whose translation module cannot be resolved, causing the frontend build or runtime to fail. Add the complete Turkish locale module before exposing this mapping.

[RULE] missing-locale-module ·

expect(screen.getByText('Beenden')).toBeInTheDocument();
});

it('serves Turkish translations left-to-right with the unknown-key fallback', () => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority medium security confident

Drive the language picker to Turkish in an E2E spec

This test dispatches setLocale('tr') directly, so it verifies provider rendering but not the user-facing language-picker flow. A registration or wiring mistake in the picker could still ship while this test passes. Add mocked browser/desktop E2E coverage that opens the picker, selects Turkish, and verifies the resulting UI and document language/direction.

[RULE] missing-e2e-coverage ·

Comment thread app/src/lib/i18n/types.ts
| 'ko'
| 'pl';
| 'pl'
| 'tr';

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

priority medium security likely

Drive the language picker to Turkish in an E2E spec

Adding tr as a supported locale requires coverage of the actual browser/desktop language-picker flow, not only locale-loader and reducer tests. Add a mocked frontend/desktop E2E spec that selects Turkish and verifies the resulting UI locale, using the repository's E2E element helpers.

[RULE] missing-e2e-coverage ·

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

Labels

priority: p1 Next. Wrong behaviour a user will hit, or a security weakness behind a condition.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants