Skip to content

feat(i18n): add Turkish translation for Web Dashboard UI & README - #1235

Draft
ardakrt wants to merge 11 commits into
lidge-jun:devfrom
ardakrt:docs/add-turkish-translation
Draft

feat(i18n): add Turkish translation for Web Dashboard UI & README#1235
ardakrt wants to merge 11 commits into
lidge-jun:devfrom
ardakrt:docs/add-turkish-translation

Conversation

@ardakrt

@ardakrt ardakrt commented Aug 7, 2026

Copy link
Copy Markdown

Description

This PR adds full Turkish language support for both the Web Dashboard UI (\gui/) and the README documentation.

opencodex Web Dashboard UI Turkish Translation

Verification & Checks Performed

  • TypeScript Typecheck: Passed \�un run typecheck\ with 0 errors (\ r.ts\ fully matches the \TKey\ catalog contract).
  • ESLint: Passed \�un run lint:gui\ with 0 errors/warnings.
  • Unit Tests: Passed \�un test ./gui/tests/i18n-tr-locale.test.ts\ (6/6 tests passed including placeholder parity).
  • Runtime Verification: Verified local rendering of the Web Dashboard UI with Turkish locale.
  • Codex & CodeRabbit Review Findings: Resolved all review suggestions (formatUptime locale map, QuotaBars bcp47 switch, OAuth warnings, placeholder parity, default effort hint).

Changes Included

  1. Web Dashboard UI (\gui/) i18n, Formatters & Tests:

    • Created \gui/src/i18n/tr.ts\ with full Turkish translations matching all \TKey\ catalog entries and interpolation placeholders.
    • Registered \ r\ (\Türkçe) in \gui/src/i18n/shared.ts, \gui/src/formatUptime.ts, and \gui/src/components/QuotaBars.tsx.
    • Created \gui/tests/i18n-tr-locale.test.ts\ regression unit test.
  2. Documentation & README:

    • Created
      eadme/README.tr.md\ (complete Turkish documentation).
    • Added \Türkçe\ navigation link across all language README files (\README.md, \README.ja.md, \README.ko.md, \README.ru.md, \README.zh-CN.md).

Review readiness checklist

This PR stays in draft until every box below is ticked. Tick all four boxes once the requirements are met:

  • All CI tests are green on my local testing.

  • I pushed my PR to the latest dev commit.

  • I resolved all correct Codex and CodeRabbit findings.

  • My PR is ready for review.

Summary by CodeRabbit

  • New Features

    • Added Turkish language support throughout the application.
    • Turkish is detected from browser settings and saved preferences.
    • Added Turkish translations for status messages, uptime labels, and locale formatting.
    • Added localized uptime labels across supported languages.
  • Documentation

    • Added a complete Turkish README covering setup, usage, features, and documentation.
    • Added Turkish language links to README navigation across supported translations.

@github-actions github-actions Bot added the enhancement New feature or request label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Deterministic PR hygiene checks passed.

@github-actions github-actions Bot added the intake: hygiene-blocked Deterministic PR hygiene checks failed label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

⏳ DRAFT

  • review readiness checklist open (0/4 boxes ticked).

What to do

  • Tick all four boxes in the PR description once you're done (currently 0/4).

Review readiness checklist

  • ⬜ All CI tests are green on my local testing.
  • ⬜ I pushed my PR to the latest dev commit.
  • ⬜ I resolved all correct Codex and CodeRabbit findings.
  • ⬜ My PR is ready for review.

0/4 boxes ticked.

This PR stays in draft until every box above is ticked.

@github-actions
github-actions Bot marked this pull request as draft August 7, 2026 18:43
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review 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
📝 Walkthrough

Walkthrough

The PR adds Turkish support to GUI locale registration, locale detection, status messages, uptime formatting, and validation tests. It also adds a Turkish README and links to it from existing README language selectors.

Changes

Turkish localization

Layer / File(s) Summary
GUI Turkish locale support
gui/src/i18n/shared.ts, gui/src/i18n/{en,de,ja,ko,ru,zh}.ts, gui/src/formatUptime.ts, gui/src/components/QuotaBars.tsx
Registers Turkish metadata and dictionary data, detects Turkish preferences, maps tr to tr-TR, and localizes uptime units with dictionary fallbacks.
Turkish status and message localization
gui/src/status-codes.ts
Adds Turkish status-code and generic client/server messages.
Locale validation
gui/tests/i18n-tr-locale.test.ts
Tests registration, dictionary coverage, interpolation placeholders, duplicate keys, uptime formatting, and locale detection.
Turkish README and navigation
readme/README.tr.md, README.md, readme/README.ja.md, readme/README.ko.md, readme/README.ru.md, readme/README.zh-CN.md
Adds the Turkish README and Turkish links to the README language selectors.

Estimated code review effort: 2 (Simple) | ~10 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Browser
  participant LocaleDetection
  participant TurkishDictionary
  participant StatusFormatting
  Browser->>LocaleDetection: provide `tr` language preference
  LocaleDetection->>TurkishDictionary: select Turkish dictionary
  LocaleDetection->>StatusFormatting: provide locale `tr`
  StatusFormatting->>StatusFormatting: format status messages and uptime units in Turkish
Loading

Possibly related PRs

Suggested labels: documentation

Suggested reviewers: ingwannu, lidge-jun, wibias

🚥 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 clearly and concisely describes the main changes: Turkish Web Dashboard UI localization and Turkish README documentation.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions github-actions Bot removed the intake: hygiene-blocked Deterministic PR hygiene checks failed label Aug 7, 2026

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 4

🤖 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 `@gui/src/i18n/shared.ts`:
- Line 22: Update the locale metadata entry in the shared i18n definitions so it
retains only the Turkish code and htmlLang metadata while replacing the
hardcoded name with a shared catalog key. Update the App.tsx LOCALES.map label
generation to translate that key through the existing i18n mechanism, and add
the Turkish language label to the shared locale catalogs.

In `@readme/README.tr.md`:
- Line 31: In the Turkish README text, update the phrase in the Claude Desktop
description from “Opus yanıtlar” to “Opus yanıt verir,” keeping the surrounding
wording unchanged.
- Line 127: In the Turkish service-versus-shim description, replace the
duplicated phrase “Arka plan arka plan işlemi” with “Arka plan işlemi,”
preserving the surrounding wording and meaning.
- Line 1: Update the document opening around the existing “make codex open!”
heading so the file begins with a Markdown H1 recognized by markdownlint,
preserving the title and adjusting or replacing the HTML heading as needed.
🪄 Autofix

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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 7efe48b3-134c-4e48-84a8-82611c3743fc

📥 Commits

Reviewing files that changed from the base of the PR and between 5609faf and e0d156f.

📒 Files selected for processing (8)
  • README.md
  • gui/src/i18n/shared.ts
  • gui/src/i18n/tr.ts
  • readme/README.ja.md
  • readme/README.ko.md
  • readme/README.ru.md
  • readme/README.tr.md
  • readme/README.zh-CN.md

Comment thread gui/src/i18n/shared.ts
{ code: "zh", name: "中文", htmlLang: "zh-CN" },
{ code: "ru", name: "Русский", htmlLang: "ru" },
{ code: "ja", name: "日本語", htmlLang: "ja" },
{ code: "tr", name: "Türkçe", htmlLang: "tr" },

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.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n -C 3 '\bLOCALES\b|\.name\b' gui/src --glob '*.ts' --glob '*.tsx'

Repository: lidge-jun/opencodex

Length of output: 50375


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '--- gui/src/i18n/shared.ts ---\n'
sed -n '1,60p' gui/src/i18n/shared.ts

printf '\n--- gui/src/App.tsx language picker ---\n'
sed -n '240,260p' gui/src/App.tsx

printf '\n--- focused LOCALES usages ---\n'
rg -n -C 2 'LOCALES\.map\(|LOCALES\.find\(|LOCALES\[' gui/src --glob '*.ts' --glob '*.tsx'

Repository: lidge-jun/opencodex

Length of output: 248


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- gui/src/i18n/shared.ts ---'
sed -n '1,60p' gui/src/i18n/shared.ts

echo
echo '--- gui/src/App.tsx language picker ---'
sed -n '240,260p' gui/src/App.tsx

echo
echo '--- focused LOCALES usages ---'
rg -n -C 2 'LOCALES\.map\(|LOCALES\.find\(|LOCALES\[' gui/src --glob '*.ts' --glob '*.tsx'

Repository: lidge-jun/opencodex

Length of output: 5726


Locate language labels in the shared locale catalogs.

gui/src/App.tsx:255 renders LOCALES.map(l => ({ value: l.code, label: l.name })), so name: "Türkçe" in gui/src/i18n/shared.ts:22 is user-visible text. Move the language label into the shared i18n catalogs and replace l.name with an i18n key, while keeping code and htmlLang as metadata.

🤖 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 `@gui/src/i18n/shared.ts` at line 22, Update the locale metadata entry in the
shared i18n definitions so it retains only the Turkish code and htmlLang
metadata while replacing the hardcoded name with a shared catalog key. Update
the App.tsx LOCALES.map label generation to translate that key through the
existing i18n mechanism, and add the Turkish language label to the shared locale
catalogs.

Source: Path instructions

Comment thread readme/README.tr.md
Comment thread readme/README.tr.md
<tr>
<td width="50%" align="center">
<img src="../assets/claude-desktop-subagent.gif" alt="Claude Desktop demosu" width="410"><br>
<sub><b>Claude Desktop, herhangi bir modeli çalıştırıyor.</b><br>Opus yanıtlar, ardından görevi GPT-5.6 Sol alt ajanına devreder.</sub>

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.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the Turkish verb form.

Opus yanıtlar uses a plural verb with the singular subject Opus. Replace it with Opus yanıt verir.

🤖 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 `@readme/README.tr.md` at line 31, In the Turkish README text, update the
phrase in the Claude Desktop description from “Opus yanıtlar” to “Opus yanıt
verir,” keeping the surrounding wording unchanged.

Comment thread readme/README.tr.md Outdated
@ardakrt
ardakrt marked this pull request as ready for review August 7, 2026 18:48
@github-actions
github-actions Bot marked this pull request as draft August 7, 2026 18:48
@ardakrt
ardakrt marked this pull request as ready for review August 7, 2026 18:50
@github-actions
github-actions Bot marked this pull request as draft August 7, 2026 18:50

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🤖 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 `@gui/tests/i18n-tr-locale.test.ts`:
- Around line 24-28: Update the test “detectInitial handles locale fallback
cleanly” to configure a Turkish browser locale or stored preference before
calling detectInitial(), then assert the result is exactly “tr”. Restore any
modified global or storage state after the test so it remains isolated.
🪄 Autofix

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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: c4b38291-bc43-47e9-827d-035033791cde

📥 Commits

Reviewing files that changed from the base of the PR and between e0d156f and 0df9f3a.

📒 Files selected for processing (3)
  • gui/src/i18n/shared.ts
  • gui/src/i18n/tr.ts
  • gui/tests/i18n-tr-locale.test.ts

Comment thread gui/tests/i18n-tr-locale.test.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7f38b58256

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread gui/src/i18n/shared.ts
import { tr } from "./tr";

export type Locale = "en" | "de" | "ko" | "zh" | "ru" | "ja";
export type Locale = "en" | "de" | "ko" | "zh" | "ru" | "ja" | "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.

P1 Badge Add Turkish uptime units before widening Locale

Adding "tr" to the exported Locale union makes every Record<Locale, ...> consumer require a Turkish entry; gui/src/formatUptime.ts still defines UPTIME_UNITS only for en/de/ko/zh/ru/ja, so the GUI TypeScript build fails once dependencies are present. Add a tr unit set there (or avoid using the widened union for that record) together with this registration.

AGENTS.md reference: AGENTS.md:L225-L227

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated

// api access page
"api.title": "API Erişimi",
"api.subtitle": "Dış uygulamalardan opencodex proxy'sine erişmek için üretilen API anahtarlarını kullanın.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve interpolation placeholders in Turkish copy

This Turkish string drops the {authHeader} placeholder that ApiKeys.tsx splits on before injecting the x-opencodex-api-key code chip, so the API page renders the header as a dangling suffix instead of explaining which header external clients must send; the same placeholder-loss pattern appears in other new Turkish entries such as {cmd}, {path}, and {threshold}. Please keep the same {...} variables as en.ts when translating so runtime interpolation remains meaningful.

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/shared.ts
import { tr } from "./tr";

export type Locale = "en" | "de" | "ko" | "zh" | "ru" | "ja";
export type Locale = "en" | "de" | "ko" | "zh" | "ru" | "ja" | "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.

P1 Badge Add Turkish to the quota date formatter

Widening Locale to include "tr" also makes the exhaustive bcp47(locale) switch in gui/src/components/QuotaBars.tsx incomplete: its default branch assigns locale to never, so bun run build/the GUI TypeScript build fails until a Turkish case such as "tr-TR" is added. Please update that formatter in the same change that registers the locale.

AGENTS.md reference: AGENTS.md:L225-L227

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
Comment on lines +372 to +373
"oauthTos.highBody": "OpenCodex {provider} bağlantısını üçüncü taraf bir OAuth yolu üzerinden sağlar.",
"oauthTos.elevatedBody": "OpenCodex {provider} bağlantısını resmi olmayan bir yoldan kurar.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve OAuth account-risk warnings

These Turkish OAuth consent bodies are shortened to only say the connection uses a third-party/unofficial path, dropping the English warning that unsupported OAuth use can lead to access limits or suspension and the guidance to prefer the official client when possible. In Turkish OAuth flows, users can acknowledge this modal without seeing the account-risk disclosure it is meant to gate, so the suspension/unsupported-use language should be carried over.

AGENTS.md reference: AGENTS.md:L218-L224

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
"cws.field.stickyLimitHint": "Seçilen hedefi bu kadar başarılı istek boyunca tutun.",
"cws.field.defaultEffort": "Varsayılan akıl yürütme",
"cws.field.defaultEffortNone": "Yok (hedef varsayılanı)",
"cws.field.defaultEffortHint": "İstemci çabayı belirttiğinde kullanılır.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Fix inverted default-effort help text

The Turkish hint says the default reasoning setting is used when the client specifies effort, but the English/source behavior is the opposite: it applies only when the client omits reasoning effort, and available choices are constrained by the selected targets. Turkish users configuring combos will be told the wrong condition for when this setting takes effect, so this string needs to preserve the “omits reasoning effort” semantics.

Useful? React with 👍 / 👎.

@ardakrt
ardakrt marked this pull request as ready for review August 7, 2026 19:06
@github-actions
github-actions Bot marked this pull request as draft August 7, 2026 19:06

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b27400a8d2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread gui/src/i18n/tr.ts Outdated
"pws.capacity.nextRecovery": "Sonraki kapasite yenilenmesi",
"pws.capacity.recoveryShare": "+%{percent} havuz kapasitesi",
"pws.capacity.incomplete": "Kısmi pencere kapsamı ({unknown} bilinmeyen, {excluded} hariç tutuldu)",
"pws.capacity.partial": "Kısmi ({total} hesap üzerinden {count} tanesi kota metriği bildiriyor)",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Remove the unused {total} placeholder

When a provider pool has partial quota-window coverage, ProviderCapacityQuota calls this key with only { count }, so the new Turkish copy leaves {total} rendered literally in the dashboard. Either remove {total} from this translation or pass a real total value wherever the key is used.

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/shared.ts
{ code: "zh", name: "中文", htmlLang: "zh-CN" },
{ code: "ru", name: "Русский", htmlLang: "ru" },
{ code: "ja", name: "日本語", htmlLang: "ja" },
{ code: "tr", name: "Türkçe", htmlLang: "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.

P2 Badge Add Turkish status-code descriptions

Selecting the new Turkish locale still leaves the Logs error-detail status text in English: Logs.tsx passes locale into statusCodeInfo, but status-codes.ts only normalizes de/ko/zh/ru/ja and maps every tr request back to en. Add Turkish entries there and include tr in the normalizer so HTTP error labels/descriptions stay localized.

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
"prov.defaultDisabled": "Varsayılan yapmadan önce bu sağlayıcıyı etkinleştirin.",
"prov.updateFail": "Sağlayıcı güncellenemedi.",
"prov.networkError": "Ağ hatası. Proxy'nin çalıştığını kontrol edin.",
"prov.added": "\"{name}\" eklendi. Proxy'yi başlatın: {cmd}",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Remove duplicate Turkish dictionary keys

With this second prov.added property (and the later duplicate integrations.dialog.grok.changes), the Turkish dictionary is no longer a valid TypeScript object under tsc: duplicate object literal properties produce TS1117, so bun run typecheck fails before the GUI can build. Collapse each duplicate into a single entry.

AGENTS.md reference: AGENTS.md:L225-L227

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
"api.endpointNote": "OpenAI uyumlu istemcilerle taban URL'yi kullanın.",
"api.endpointsTitle": "Uç noktalar",
"api.authTitle": "Kimlik Doğrulama",
"api.authLoopback": "Loopback bağlantıları (127.0.0.1) kimlik doğrulamasını atlar.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve remote-bind auth guidance

For Turkish users on the API page, this copy only says 127.0.0.1 loopback skips auth, omitting both ::1 and the rule that remote binds require an ocx_ key or OPENCODEX_API_AUTH_TOKEN; the integration refusal copy at integrations.error.nonLoopback similarly drops the localhost/header workaround guidance. In a remote-bind setup this tells users neither why their client is rejected nor which credential to configure, so keep the English source semantics in these Turkish strings.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
"anthropicPool.title": "Claude hesap havuzu (deneysel)",
"anthropicPool.enabledDesc": "Kullanım %{threshold} seviyesine ulaştığında sonraki anahtara geçin.",
"anthropicPool.disabledDesc": "Yalnızca aktif Claude hesabını kullanır.",
"anthropicPool.experimentalWarning": "Deneysel özelliktir.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Restore the Claude pool risk warning

When Turkish users configure the experimental Claude account pool, this warning now only says it is experimental, dropping the Anthropic account-restriction risk, the same-organization shared-quota caveat, and the instruction to leave it off unless the risk is understood. Because this is the visible guard before enabling OAuth-account rotation, Turkish users can enable a risky pool without seeing the account-safety and ineffectiveness caveats.

AGENTS.md reference: AGENTS.md:L218-L224

Useful? React with 👍 / 👎.

@ardakrt
ardakrt marked this pull request as ready for review August 7, 2026 19:17
@github-actions
github-actions Bot marked this pull request as draft August 7, 2026 19:17

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 4

🤖 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 `@gui/src/formatUptime.ts`:
- Line 10: Update the Turkish unit values in the formatUptime locale
configuration so each includes the required separator before the unit, making
outputs such as “1 saat” and “5 dk”. Add or update tests covering the seconds,
minutes, hours, and days branches to verify the spaced Turkish output.

In `@gui/src/status-codes.ts`:
- Around line 13-158: Centralize all Turkish user-visible text in the i18n
locale catalogs: in gui/src/status-codes.ts lines 13-158, replace Turkish status
label and description literals with locale keys and resolve them at render time;
in gui/src/status-codes.ts lines 169-180, do the same for generic client and
server messages; in gui/src/formatUptime.ts line 10, move Turkish uptime labels
into the locale catalog and pass the translated values into the formatter.
Update each affected status-code entry and formatter call without leaving
hardcoded Turkish strings in these locations.

In `@gui/tests/i18n-tr-locale.test.ts`:
- Around line 65-74: Update the “detectInitial detects tr from navigator
language” test to save the original localStorage, mock localStorage.getItem() to
return null before calling detectInitial(), and restore the original storage
object in the existing finally block alongside navigator.
- Around line 24-45: The placeholder parity test should compare complete
collections, including extra Turkish placeholders and duplicate occurrences.
Update the logic in the “tr dictionary preserves all interpolation placeholders
from en catalog” test to extract placeholders into arrays, sort them, and
compare the English and Turkish arrays for each string-valued key, reporting
mismatches through the existing mismatched collection.
🪄 Autofix

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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3c925bb8-7864-46a9-ad57-59c09dbbae97

📥 Commits

Reviewing files that changed from the base of the PR and between 0df9f3a and ea277d1.

📒 Files selected for processing (6)
  • gui/src/components/QuotaBars.tsx
  • gui/src/formatUptime.ts
  • gui/src/i18n/tr.ts
  • gui/src/status-codes.ts
  • gui/tests/i18n-tr-locale.test.ts
  • readme/README.tr.md

Comment thread gui/src/formatUptime.ts Outdated
zh: { day: "天", hour: "小时", minute: "分钟", second: "秒" },
ru: { day: "д", hour: "ч", minute: "мин", second: "с" },
ja: { day: "日", hour: "時間", minute: "分", second: "秒" },
tr: { day: "gün", hour: "saat", minute: "dk", second: "sn" },

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add separators before Turkish uptime units.

formatUptime concatenates the number and unit. For example, formatUptime(3600, "tr") returns 1saat, and the other branches return values such as 5dk. Use a separator before each Turkish unit and add tests for the seconds, minutes, hours, and days branches.

Proposed localized spacing fix
-  tr: { day: "gün", hour: "saat", minute: "dk", second: "sn" },
+  tr: { day: " gün", hour: " saat", minute: " dk", second: " sn" },
🤖 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 `@gui/src/formatUptime.ts` at line 10, Update the Turkish unit values in the
formatUptime locale configuration so each includes the required separator before
the unit, making outputs such as “1 saat” and “5 dk”. Add or update tests
covering the seconds, minutes, hours, and days branches to verify the spaced
Turkish output.

Comment thread gui/src/status-codes.ts
Comment on lines 13 to +158
ja: { label: "不正なリクエスト", description: "プロキシがリクエストを解釈できませんでした。再試行前にモデル、メッセージ形式、ヘッダー、JSON 本文を確認してください。" },
tr: { label: "Hatalı istek", description: "Proxy isteği anlayamadı. Yeniden denemeden önce modeli, mesaj yapısını, başlıkları ve JSON gövdesini kontrol edin." },
},
401: {
en: { label: "Unauthorized", description: "Credentials are missing, expired, or invalid. Re-login or refresh the account/provider credentials used by opencodex." },
ko: { label: "인증 필요", description: "자격 증명이 없거나 만료되었거나 유효하지 않습니다. opencodex에서 사용하는 계정 또는 제공자 자격 증명을 다시 로그인하거나 갱신해야 합니다." },
zh: { label: "未授权", description: "凭据缺失、已过期或无效。请重新登录,或刷新 opencodex 使用的账号/提供商凭据。" },
de: { label: "Nicht autorisiert", description: "Anmeldedaten fehlen, sind abgelaufen oder ungültig. Melde dich erneut an oder aktualisiere die von opencodex genutzten Konto-/Anbieter-Zugangsdaten." },
ru: { label: "Не авторизован", description: "Учётные данные отсутствуют, истекли или недействительны. Войдите заново или обновите учётные данные аккаунта или провайдера, которые использует opencodex." },

ja: { label: "認証が必要", description: "認証情報が不在・期限切れ・無効です。opencodex が使用するアカウントまたはプロバイダー認証情報を再ログインまたは更新してください。" },
tr: { label: "Yetkisiz erişim", description: "Kimlik bilgileri eksik, süresi dolmuş veya geçersiz. opencodex tarafından kullanılan hesap veya sağlayıcı kimlik bilgilerini yeniden doğrulayın." },
},
402: {
en: { label: "Payment required", description: "The upstream provider rejected the request because billing, credits, or plan access is not available. Add credits, update billing, or switch provider." },
ko: { label: "결제 필요", description: "청구, 크레딧, 플랜 접근 권한 문제로 업스트림 제공자가 요청을 거부했습니다. 크레딧 추가, 결제 정보 갱신, 제공자 전환이 필요합니다." },
zh: { label: "需要付款", description: "上游提供商因账单、额度或套餐权限不可用而拒绝了请求。请充值、更新账单信息或切换提供商。" },
de: { label: "Zahlung erforderlich", description: "Der Upstream-Anbieter hat die Anfrage abgelehnt, weil Abrechnung, Guthaben oder Planzugriff nicht verfügbar ist. Guthaben aufladen, Abrechnung aktualisieren oder Anbieter wechseln." },
ru: { label: "Требуется оплата", description: "Вышестоящий провайдер отклонил запрос из-за проблем с оплатой, кредитами или доступом по тарифному плану. Пополните баланс, обновите платёжные данные или переключитесь на другого провайдера." },

ja: { label: "支払いが必要", description: "課金、クレジット、プランアクセスが利用できないため上流プロバイダーがリクエストを拒否しました。クレジット追加、支払い情報更新、プロバイダー切替が必要です。" },
tr: { label: "Ödeme gerekli", description: "Yukarı akış sağlayıcısı faturalandırma, kredi veya plan erişimi bulunmadığından isteği reddetti. Kredi ekleyin, ödeme bilgilerini güncelleyin veya sağlayıcı değiştirin." },
},
403: {
en: { label: "Forbidden", description: "The account is authenticated but not allowed to use this model or operation. Often a plan/subscription gate (e.g. Ollama Cloud Pro), org policy, or model permission — not necessarily a bad API key." },
ko: { label: "권한 없음", description: "계정 인증은 되었지만 이 모델 또는 작업을 사용할 권한이 없습니다. 플랜/구독 제한(예: Ollama Cloud Pro), 조직 정책, 모델 권한 문제인 경우가 많으며 API 키가 잘못된 것은 아닐 수 있습니다." },
zh: { label: "禁止访问", description: "账号已认证,但无权使用此模型或操作。常见原因是套餐/订阅限制(例如 Ollama Cloud Pro)、组织策略或模型权限——不一定是 API 密钥无效。" },
de: { label: "Verboten", description: "Das Konto ist authentifiziert, darf dieses Modell oder diese Operation aber nicht nutzen. Oft Plan-/Abo-Sperre (z. B. Ollama Cloud Pro), Organisationsrichtlinie oder Modellrecht — nicht zwingend ein ungültiger API-Key." },
ru: { label: "Доступ запрещён", description: "Аккаунт аутентифицирован, но не имеет права использовать эту модель или операцию. Часто причина — ограничение тарифа или подписки (например, Ollama Cloud Pro), политика организации или права доступа к модели, а не обязательно неверный API-ключ." },

ja: { label: "アクセス禁止", description: "アカウントは認証済みですがこのモデルや操作の使用が許可されていません。多くはプラン/サブスクリプション制限(例: Ollama Cloud Pro)、組織ポリシー、モデル権限であり、API キーが不正とは限りません。" },
tr: { label: "Erişim yasaklandı", description: "Hesabın kimliği doğrulandı ancak bu modeli veya işlemi kullanma izni yok. Genellikle plan/abonelik sınırı (örn. Ollama Cloud Pro), organizasyon politikası veya model izni kaynaklıdır." },
},
404: {
en: { label: "Not found", description: "The requested route, model, account, or upstream resource was not found. Verify the model name and opencodex provider configuration." },
ko: { label: "찾을 수 없음", description: "요청한 경로, 모델, 계정 또는 업스트림 리소스를 찾을 수 없습니다. 모델 이름과 opencodex 제공자 설정을 확인해야 합니다." },
zh: { label: "未找到", description: "找不到请求的路由、模型、账号或上游资源。请确认模型名称和 opencodex 提供商配置。" },
de: { label: "Nicht gefunden", description: "Die angeforderte Route, das Modell, das Konto oder die Upstream-Ressource wurde nicht gefunden. Prüfe Modellname und opencodex-Anbieterkonfiguration." },
ru: { label: "Не найдено", description: "Запрошенный маршрут, модель, аккаунт или вышестоящий ресурс не найден. Проверьте имя модели и конфигурацию провайдера в opencodex." },

ja: { label: "見つかりません", description: "要求されたルート、モデル、アカウント、上流リソースが見つかりませんでした。モデル名と opencodex プロバイダー設定を確認してください。" },
tr: { label: "Bulunamadı", description: "İstenen rota, model, hesap veya yukarı akış kaynağı bulunamadı. Model adını ve opencodex sağlayıcı yapılandırmasını doğrulayın." },
},
408: {
en: { label: "Request timeout", description: "The request took too long before the proxy or upstream provider could complete it. Retry with a smaller request or a different provider." },
ko: { label: "요청 시간 초과", description: "프록시 또는 업스트림 제공자가 요청을 완료하기 전에 시간이 초과되었습니다. 더 작은 요청으로 재시도하거나 다른 제공자로 전환해야 합니다." },
zh: { label: "请求超时", description: "代理或上游提供商未能在限定时间内完成请求。请缩小请求后重试,或切换提供商。" },
de: { label: "Anfrage-Timeout", description: "Die Anfrage dauerte zu lange, bevor Proxy oder Upstream-Anbieter sie abschließen konnten. Mit kleinerer Anfrage oder anderem Anbieter erneut versuchen." },
ru: { label: "Тайм-аут запроса", description: "Обработка запроса заняла слишком много времени, и прокси или вышестоящий провайдер не успел её завершить. Повторите попытку с меньшим запросом или через другого провайдера." },

ja: { label: "リクエストタイムアウト", description: "プロキシまたは上流プロバイダーがリクエストを完了する前に時間切れになりました。より小さいリクエストで再試行するか、別のプロバイダーに切り替えてください。" },
tr: { label: "İstek zaman aşımı", description: "Proxy veya yukarı akış sağlayıcısı isteği tamamlayamadan zaman aşımına uğradı. Daha küçük bir istek veya farklı bir sağlayıcı ile tekrar deneyin." },
},
409: {
en: { label: "Conflict", description: "The request conflicts with the current account, session, or provider state. Refresh the session or retry after the active operation finishes." },
ko: { label: "상태 충돌", description: "요청이 현재 계정, 세션 또는 제공자 상태와 충돌합니다. 세션을 갱신하거나 진행 중인 작업이 끝난 뒤 재시도해야 합니다." },
zh: { label: "状态冲突", description: "请求与当前账号、会话或提供商状态冲突。请刷新会话,或等待当前操作完成后重试。" },
de: { label: "Konflikt", description: "Die Anfrage kollidiert mit dem aktuellen Konto-, Sitzungs- oder Anbieterstatus. Sitzung aktualisieren oder nach Abschluss der laufenden Operation erneut versuchen." },
ru: { label: "Конфликт", description: "Запрос конфликтует с текущим состоянием аккаунта, сессии или провайдера. Обновите сессию или повторите попытку после завершения текущей операции." },

ja: { label: "状態の衝突", description: "リクエストが現在のアカウント、セッション、プロバイダー状態と衝突しています。セッションを更新するか、進行中の操作が終わった後に再試行してください。" },
tr: { label: "Durum çakışması", description: "İstek mevcut hesap, oturum veya sağlayıcı durumuyla çakışıyor. Oturumu yenileyin veya aktif işlem bittikten sonra tekrar deneyin." },
},
413: {
en: { label: "Request too large", description: "The prompt, attachments, or generated payload exceeds a proxy or upstream limit. Reduce tokens, file size, or conversation history." },
ko: { label: "요청 과대", description: "프롬프트, 첨부 파일 또는 생성 페이로드가 프록시나 업스트림 한도를 초과했습니다. 토큰, 파일 크기, 대화 기록을 줄여야 합니다." },
zh: { label: "请求过大", description: "提示、附件或生成的负载超过了代理或上游限制。请减少 token、文件大小或对话历史。" },
de: { label: "Anfrage zu groß", description: "Prompt, Anhänge oder generierte Nutzlast überschreiten ein Proxy- oder Upstream-Limit. Tokens, Dateigröße oder Verlauf reduzieren." },
ru: { label: "Слишком большой запрос", description: "Промпт, вложения или сформированная полезная нагрузка превышают лимит прокси или вышестоящего провайдера. Сократите количество токенов, размер файлов или историю диалога." },

ja: { label: "リクエストが大きすぎます", description: "プロンプト、添付ファイル、生成ペイロードがプロキシまたは上流の制限を超えました。トークン、ファイルサイズ、会話履歴を減らしてください。" },
tr: { label: "İstek çok büyük", description: "İstemi, ekler veya oluşturulan veri proxy ya da yukarı akış sınırını aşıyor. Jeton sayısını, dosya boyutunu veya sohbet geçmişini azaltın." },
},
422: {
en: { label: "Invalid content", description: "The provider accepted the request format but rejected its contents. Check model options, tool definitions, message roles, and unsupported fields." },
ko: { label: "내용 검증 실패", description: "제공자가 요청 형식은 받았지만 내용을 거부했습니다. 모델 옵션, 도구 정의, 메시지 역할, 지원되지 않는 필드를 확인해야 합니다." },
zh: { label: "内容无效", description: "提供商接受了请求格式,但拒绝了其中的内容。请检查模型选项、工具定义、消息角色和不支持的字段。" },
de: { label: "Ungültiger Inhalt", description: "Der Anbieter akzeptierte das Anfrageformat, lehnte den Inhalt aber ab. Prüfe Modelloptionen, Tool-Definitionen, Nachrichtenrollen und nicht unterstützte Felder." },
ru: { label: "Недопустимое содержимое", description: "Провайдер принял формат запроса, но отклонил его содержимое. Проверьте параметры модели, определения инструментов, роли сообщений и неподдерживаемые поля." },

ja: { label: "内容の検証失敗", description: "プロバイダーはリクエスト形式を受け付けましたが内容を拒否しました。モデルオプション、ツール定義、メッセージロール、未サポートのフィールドを確認してください。" },
tr: { label: "Geçersiz içerik", description: "Sağlayıcı istek formatını kabul etti ancak içeriğini reddetti. Model seçeneklerini, araç tanımlarını, mesaj rollerini ve desteklenmeyen alanları kontrol edin." },
},
424: {
en: { label: "Provider dependency failed", description: "A required upstream dependency failed while opencodex was routing the request. Retry later or switch to another configured provider." },
ko: { label: "제공자 의존성 실패", description: "opencodex가 요청을 라우팅하는 동안 필요한 업스트림 의존성이 실패했습니다. 나중에 재시도하거나 다른 설정된 제공자로 전환해야 합니다." },
zh: { label: "提供商依赖失败", description: "opencodex 路由请求时,必需的上游依赖失败。请稍后重试,或切换到另一个已配置的提供商。" },
de: { label: "Anbieter-Abhängigkeit fehlgeschlagen", description: "Eine erforderliche Upstream-Abhängigkeit ist fehlgeschlagen, während opencodex die Anfrage geroutet hat. Später erneut versuchen oder zu einem anderen Anbieter wechseln." },
ru: { label: "Сбой зависимости провайдера", description: "Необходимая вышестоящая зависимость дала сбой, пока opencodex маршрутизировал запрос. Повторите попытку позже или переключитесь на другого настроенного провайдера." },

ja: { label: "プロバイダー依存の失敗", description: "opencodex がリクエストをルーティング中に必要な上流依存が失敗しました。後で再試行するか、別の設定済みプロバイダーに切り替えてください。" },
tr: { label: "Sağlayıcı bağımlılığı başarısız", description: "opencodex isteği yönlendirirken gerekli bir yukarı akış bağımlılığı başarısız oldu. Daha sonra tekrar deneyin veya başka bir sağlayıcıya geçin." },
},
429: {
en: { label: "Rate limited", description: "The upstream provider rate or quota limit has been reached. Wait for the quota window to reset or switch account/provider." },
ko: { label: "한도 초과", description: "업스트림 제공자의 속도 또는 할당량 한도에 도달했습니다. 한도 창이 초기화될 때까지 기다리거나 계정/제공자를 전환해야 합니다." },
zh: { label: "限流", description: "已达到上游提供商的速率或额度限制。请等待额度窗口重置,或切换账号/提供商。" },
de: { label: "Ratenlimit erreicht", description: "Das Raten- oder Kontingentlimit des Upstream-Anbieters ist erreicht. Auf Reset des Kontingentfensters warten oder Konto/Anbieter wechseln." },
ru: { label: "Превышен лимит запросов", description: "Достигнут лимит скорости или квота вышестоящего провайдера. Дождитесь сброса окна квоты или переключитесь на другой аккаунт или провайдера." },

ja: { label: "レート制限", description: "上流プロバイダーのレートまたはクォータ制限に達しました。クォータウィンドウがリセットされるまで待つか、アカウント/プロバイダーを切り替えてください。" },
tr: { label: "Oran sınırı aşıldı", description: "Yukarı akış sağlayıcısının hız veya kota sınırına ulaşıldı. Kota penceresinin sıfırlanmasını bekleyin ya da hesap/sağlayıcı değiştirin." },
},
499: {
en: { label: "Client closed request", description: "The client disconnected or canceled the request before opencodex finished routing it. Retry if the cancellation was accidental." },
ko: { label: "클라이언트 취소", description: "opencodex가 라우팅을 끝내기 전에 클라이언트 연결이 끊기거나 요청이 취소되었습니다. 의도한 취소가 아니면 다시 시도해야 합니다." },
zh: { label: "客户端已取消", description: "opencodex 完成路由前,客户端已断开连接或取消请求。如果不是有意取消,请重试。" },
de: { label: "Client hat Anfrage geschlossen", description: "Der Client hat die Verbindung getrennt oder die Anfrage abgebrochen, bevor opencodex das Routing abgeschlossen hat. Bei versehentlichem Abbruch erneut versuchen." },
ru: { label: "Запрос закрыт клиентом", description: "Клиент отключился или отменил запрос до того, как opencodex завершил его маршрутизацию. Если отмена была случайной, повторите попытку." },

ja: { label: "クライアントがリクエストをクローズ", description: "opencodex がルーティングを終える前にクライアントが切断またはキャンセルしました。意図しないキャンセルなら再試行してください。" },
tr: { label: "İstemci isteği kapattı", description: "opencodex yönlendirmeyi bitirmeden önce istemci bağlantıyı kesti veya isteği iptal etti. İptal kazara yapıldıysa tekrar deneyin." },
},
500: {
en: { label: "Proxy error", description: "opencodex hit an internal error while handling the request. Retry once, then check proxy logs if it repeats." },
ko: { label: "프록시 오류", description: "opencodex가 요청을 처리하는 동안 내부 오류가 발생했습니다. 한 번 재시도하고 반복되면 프록시 로그를 확인해야 합니다." },
zh: { label: "代理错误", description: "opencodex 处理请求时发生内部错误。请先重试一次;如果重复出现,请检查代理日志。" },
de: { label: "Proxy-Fehler", description: "opencodex ist bei der Anfragebearbeitung auf einen internen Fehler gestoßen. Einmal erneut versuchen, bei Wiederholung Proxy-Logs prüfen." },
ru: { label: "Ошибка прокси", description: "В opencodex произошла внутренняя ошибка при обработке запроса. Повторите попытку один раз; если ошибка повторяется, проверьте логи прокси." },

ja: { label: "プロキシエラー", description: "opencodex がリクエスト処理中に内部エラーに遭遇しました。1 回再試行し、繰り返す場合はプロキシログを確認してください。" },
tr: { label: "Proxy hatası", description: "opencodex isteği işlerken dahili bir hatayla karşılaştı. Bir kez tekrar deneyin, tekrarlarsa proxy günlüklerini kontrol edin." },
},
502: {
en: { label: "Bad upstream response", description: "The upstream provider returned an invalid or failed response through the proxy. Retry or route the request to another provider." },
ko: { label: "업스트림 응답 오류", description: "업스트림 제공자가 프록시를 통해 유효하지 않거나 실패한 응답을 반환했습니다. 재시도하거나 다른 제공자로 라우팅해야 합니다." },
zh: { label: "上游响应错误", description: "上游提供商通过代理返回了无效或失败的响应。请重试,或将请求路由到其他提供商。" },
de: { label: "Ungültige Upstream-Antwort", description: "Der Upstream-Anbieter lieferte über den Proxy eine ungültige oder fehlgeschlagene Antwort. Erneut versuchen oder zu einem anderen Anbieter routen." },
ru: { label: "Некорректный ответ провайдера", description: "Вышестоящий провайдер вернул через прокси недействительный или ошибочный ответ. Повторите попытку или направьте запрос другому провайдеру." },

ja: { label: "上流レスポンス不良", description: "上流プロバイダーがプロキシ経由で無効または失敗したレスポンスを返しました。再試行するか、リクエストを別のプロバイダーにルーティングしてください。" },
tr: { label: "Kötü yukarı akış yanıtı", description: "Yukarı akış sağlayıcısı proxy üzerinden geçersiz veya başarısız bir yanıt döndürdü. Tekrar deneyin veya isteği başka bir sağlayıcıya yönlendirin." },
},
503: {
en: { label: "Provider unavailable", description: "The proxy or upstream provider is temporarily unavailable or overloaded. Wait briefly, then retry or switch provider." },
ko: { label: "제공자 사용 불가", description: "프록시 또는 업스트림 제공자가 일시적으로 사용할 수 없거나 과부하 상태입니다. 잠시 기다린 뒤 재시도하거나 제공자를 전환해야 합니다." },
zh: { label: "提供商不可用", description: "代理或上游提供商暂时不可用或过载。请稍后重试,或切换提供商。" },
de: { label: "Anbieter nicht verfügbar", description: "Proxy oder Upstream-Anbieter ist vorübergehend nicht verfügbar oder überlastet. Kurz warten, dann erneut versuchen oder Anbieter wechseln." },
ru: { label: "Провайдер недоступен", description: "Прокси или вышестоящий провайдер временно недоступен или перегружен. Немного подождите, затем повторите попытку или смените провайдера." },

ja: { label: "プロバイダー利用不可", description: "プロキシまたは上流プロバイダーが一時的に利用不可または過負荷です。少し待ってから再試行するか、プロバイダーを切り替えてください。" },
tr: { label: "Sağlayıcı kullanılamıyor", description: "Proxy veya yukarı akış sağlayıcısı geçici olarak kullanılamıyor veya aşırı yüklü. Kısa bir süre bekleyip tekrar deneyin ya da sağlayıcı değiştirin." },
},
504: {
en: { label: "Upstream timeout", description: "The upstream provider did not respond before the proxy timeout. Retry with a smaller request or choose a faster provider." },
ko: { label: "업스트림 시간 초과", description: "프록시 시간 제한 전에 업스트림 제공자가 응답하지 않았습니다. 더 작은 요청으로 재시도하거나 더 빠른 제공자를 선택해야 합니다." },
zh: { label: "上游超时", description: "上游提供商未在代理超时前响应。请缩小请求后重试,或选择响应更快的提供商。" },
de: { label: "Upstream-Timeout", description: "Der Upstream-Anbieter antwortete nicht vor dem Proxy-Timeout. Mit kleinerer Anfrage erneut versuchen oder schnelleren Anbieter wählen." },
ru: { label: "Тайм-аут вышестоящего провайдера", description: "Вышестоящий провайдер не ответил до истечения тайм-аута прокси. Повторите попытку с меньшим запросом или выберите более быстрого провайдера." },

ja: { label: "上流タイムアウト", description: "上流プロバイダーがプロキシタイムアウト前に応答しませんでした。より小さいリクエストで再試行するか、より速いプロバイダーを選んでください。" },
tr: { label: "Yukarı akış zaman aşımı", description: "Yukarı akış sağlayıcısı proxy zaman aşımı süresinden önce yanıt vermedi. Daha küçük bir istekle tekrar deneyin veya daha hızlı bir sağlayıcı seçin." },
},
529: {
en: { label: "Provider overloaded", description: "The upstream provider is overloaded or capacity-limited. Wait and retry, or switch to another account/provider." },
ko: { label: "제공자 과부하", description: "업스트림 제공자가 과부하 상태이거나 처리 용량이 제한되었습니다. 기다렸다가 재시도하거나 다른 계정/제공자로 전환해야 합니다." },
zh: { label: "提供商过载", description: "上游提供商过载或容量受限。请等待后重试,或切换到其他账号/提供商。" },
de: { label: "Anbieter überlastet", description: "Der Upstream-Anbieter ist überlastet oder kapazitätsbegrenzt. Warten und erneut versuchen oder anderes Konto/Anbieter nutzen." },
ru: { label: "Провайдер перегружен", description: "Вышестоящий провайдер перегружен или ограничен по мощности. Подождите и повторите попытку либо переключитесь на другой аккаунт или провайдера." },

ja: { label: "プロバイダー過負荷", description: "上流プロバイダーが過負荷または容量制限されています。待ってから再試行するか、別のアカウント/プロバイダーに切り替えてください。" },
tr: { label: "Sağlayıcı aşırı yüklü", description: "Yukarı akış sağlayıcısı aşırı yüklü veya kapasitesi sınırlı. Bekleyip tekrar deneyin veya başka bir hesap/sağlayıcıya geçin." },

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.

📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift

Centralize GUI-localized text in the i18n catalog.

The Turkish additions create multiple translation sources. Keep user-visible Turkish text in the locale catalogs, and resolve translation keys at render time.

  • gui/src/status-codes.ts#L13-L158: replace Turkish status label and description literals with locale keys.
  • gui/src/status-codes.ts#L169-L180: replace Turkish generic client and server message literals with locale keys.
  • gui/src/formatUptime.ts#L10-L10: move Turkish uptime labels into the locale catalog and pass them into the formatter.

As per path instructions, user-visible strings must go through the i18n locale files rather than hardcoded text.

📍 Affects 2 files
  • gui/src/status-codes.ts#L13-L158 (this comment)
  • gui/src/status-codes.ts#L169-L180
  • gui/src/formatUptime.ts#L10-L10
🤖 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 `@gui/src/status-codes.ts` around lines 13 - 158, Centralize all Turkish
user-visible text in the i18n locale catalogs: in gui/src/status-codes.ts lines
13-158, replace Turkish status label and description literals with locale keys
and resolve them at render time; in gui/src/status-codes.ts lines 169-180, do
the same for generic client and server messages; in gui/src/formatUptime.ts line
10, move Turkish uptime labels into the locale catalog and pass the translated
values into the formatter. Update each affected status-code entry and formatter
call without leaving hardcoded Turkish strings in these locations.

Source: Path instructions

Comment thread gui/tests/i18n-tr-locale.test.ts
Comment thread gui/tests/i18n-tr-locale.test.ts Outdated
@ardakrt
ardakrt marked this pull request as ready for review August 7, 2026 19:23
@github-actions
github-actions Bot marked this pull request as draft August 7, 2026 19:23

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 92ffd95d5e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread gui/src/i18n/tr.ts
Comment on lines +368 to +369
"prov.loginOk": "{provider} hesabına giriş yapıldı. Proxy'yi başlatın: {cmd}",
"prov.added": "\"{name}\" eklendi. Proxy'yi başlatın: {cmd}",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve sync wording in provider success toasts

When Turkish is selected, these success toasts are rendered with cmd: "ocx sync" after provider add/login, but the copy says to start the proxy. ocx sync is not the startup command; the English source tells users to run it, or restart, so Codex's model picker refreshes. As written, Turkish users get a nonsensical recovery instruction after adding or logging in to a provider.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts
Comment on lines +1257 to +1259
"integrations.native.msg.nonLoopbackRemoved": "Grok Build otomatik olarak kaldırıldı.",
"integrations.native.msg.nonLoopbackRemovedNoop": "Kaldırılacak blok yoktu.",
"integrations.native.msg.nonLoopbackSuperseded": "Başka bir işlem yeni bir blok yazdı.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve loopback refusal reason in Grok messages

These Turkish Grok status messages drop the core reason from the English source: automatic registration is only possible while opencodex is bound to loopback. In the non-loopback path in IntegrationsOverview, users will just see that Grok was removed/no-op/superseded without learning that they need to run the proxy on loopback before re-enabling the integration, which makes the remediation unclear.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts
"claude.authSource.unknown": "algılanan bir kimlik bilgisi",
"claude.systemEnv": "Otomatik bağlan",
"claude.systemEnvDesc": "Açık olduğunda terminalde claude çalıştırmak proxy üzerinden geçer.",
"claude.systemEnvUnsupported": "{cmd} için sistem çevre değişkenleri desteklenmiyor.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve the Claude fallback command

On non-macOS systems, AutoConnectSetting shows this string while passing cmd="ocx claude"; the English source explains that auto-connect is macOS-only and that users should start Claude with that command. The Turkish text instead says system environment variables are unsupported for ocx claude, which implies the fallback itself is unsupported and leaves users without the intended way to launch Claude through the proxy.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts
"codexAuth.prepareForPool": "Havuz İçin Hazırla",
"codexAuth.poolPreparedToast": "{email} Havuz modu için hazırlandı",
"codexAuth.switchTitle": "Aktif hesap değiştirilsin mi?",
"codexAuth.switchDesc": "Anında yürürlüğe girer.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve account-switch affinity caveats

The account switch confirmation modal uses this copy before changing the active account, but the Turkish text drops the warning that existing account-affine threads and in-flight requests keep their captured account and that same-order accounts still rotate; switchBackDesc has the same truncation. Turkish users can approve the switch expecting every current conversation to move immediately, while the routing code intentionally only affects new or unbound requests.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts
Comment on lines +1431 to +1433
"accountPool.strategyHintRoundRobin": "Round-robin görevi olmayan hesapları döndürür.",
"accountPool.strategyHintFillFirst": "İlk doldurma eşiği boşaltma noktası olarak kullanır.",
"accountPool.unboundDefinition": "Bağlı olmayan yeni görev.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Restore round-robin task-binding guidance

For the account-pool strategy controls, this Turkish hint says round-robin rotates accounts without tasks, and the next line no longer defines what a new/unbound task is. The actual behavior rotates only requests without a live account binding and can leave visible tasks bound until affinity/proxy reset, so Turkish users configuring the pool get the wrong mental model for which requests the strategy can move.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts
"api.clientConfig.copyFailed": "Kopyalanamadı.",
"api.clientConfig.downloadedAnnounce": "{filename} indirildi. Henüz hiçbir şey değişmedi — kendiniz {destination} konumuna birleştirin.",
"api.clientConfig.whereDisclosure": "Bu dosya nereye gidiyor",
"api.clientConfig.whereBody": "Yukarıdaki hedef genel yoldur.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep generated config precedence guidance

This paragraph is the only explanation shown in the generated client-config dialog, but the Turkish copy reduces it to “the target above is global” and drops both caveats that project-local config files take precedence and that the client reads the key from the named environment variable, never from the generated file. Users exporting OpenCode/Pi-style configs can therefore edit the wrong file or look for the key in the JSON when a project-local config overrides it.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts
"dash.injectionEffortNone": "Model varsayılanı",
"dash.effortCapLabel": "V2 ultra çaba limiti",
"dash.subagentEffortCapLabel": "V2 alt ajan çaba limiti",
"dash.effortCapHelp": "V2 ultra modu için akıl yürütme çabasını sınırlar.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve V2 effort-cap semantics

The Turkish help modal for V2 effort caps now only says the setting limits reasoning effort, dropping that caps apply only to incoming max-effort ultra requests, the sub-agent cap only affects spawned child agents, caps never raise effort, and unsupported levels snap down. A Turkish user configuring the two selectors can easily expect broader or upward forcing behavior that the routing layer will never perform.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts
"cws.count.failover": "Failover",
"cws.count.roundRobin": "Round-robin",
"cws.howTitle": "Nasıl çalışır",
"cws.howBody": "Codex'ten kombonun genel model adını isteyin.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Restore combo fail-closed routing guidance

The combo workspace overview uses this sentence to explain how to call a combo and how routing behaves, but Turkish drops the default combo/<id> name, that hops happen only on retryable upstream failures, and that exhausted combos fail closed instead of falling back to the global default provider. Turkish users creating a combo lose the guardrails that prevent them from expecting non-retryable errors or exhausted pools to route elsewhere.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts
"claude.smallFastModelHint": "Claude Code'un sohbet özetleri için kullandığı model.",
"claude.smallFastModelAccurateHint": "Claude Code'un arka plan işleri için kullandığı model.",
"claude.smallFastModelUnsetOption": "Claude Code seçsin (yerel model)",
"claude.smallFastModelNativeWarning": "Ayarlanmadığında yerel model kullanılabilir.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep the native Sonnet cost warning

When the Claude background helper model is left unset, this warning is shown in the settings panel; the Turkish copy only says a local/native model may be used and drops that OpenCodex leaves helper-model overrides unset and that Claude Code may use native Sonnet, potentially incurring charges from the native provider. Turkish users can dismiss the unset state without seeing the cost implication.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts
"integrations.dialog.grok.undo": "Tekrar açmak yeni bir blok yazar.",
"integrations.dialog.grok.confirm": "Devre Dışı Bırak",
"integrations.dialog.desktop.title": "Claude Desktop entegrasyonu devre dışı bırakılsın mı?",
"integrations.dialog.desktop.changes": "Yapılandırma dosyası: {path}",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve Desktop disable consequences

The Claude Desktop disable confirmation uses this line, but the Turkish text only shows the config path and omits that Desktop first switches to a new credential-free standard profile before the old opencodex profile and backup are removed. Turkish users are asked to confirm a profile rewrite/removal without the key consequence that the English modal discloses.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🤖 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 `@gui/src/formatUptime.ts`:
- Line 10: Move the Turkish labels from UPTIME_UNITS in formatUptime into the
shared i18n catalog by adding uptime-unit keys to TKey and defining their
Turkish values in gui/src/i18n/tr.ts. Update formatUptime to retrieve and use
those translated keys, removing the hardcoded Turkish literals while preserving
existing formatting behavior.
🪄 Autofix

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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1d07c325-eb67-40b1-b4f9-bd14f3dcd4d4

📥 Commits

Reviewing files that changed from the base of the PR and between ea277d1 and 92ffd95.

📒 Files selected for processing (2)
  • gui/src/formatUptime.ts
  • gui/tests/i18n-tr-locale.test.ts

Comment thread gui/src/formatUptime.ts
@ardakrt
ardakrt marked this pull request as ready for review August 7, 2026 19:37
@github-actions
github-actions Bot marked this pull request as draft August 7, 2026 19:38

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d705d48323

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread gui/src/i18n/tr.ts Outdated
"api.key.renaming": "Kaydediliyor…",
"api.key.renameFailed": "Yeniden adlandırılamadı.",
"api.key.deleting": "Siliniyor…",
"api.key.copyFailed": "Kopyalanamadı.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Restore manual-copy guidance for one-time keys

When navigator.clipboard.writeText(newKey) throws, ApiKeys.tsx keeps the one-time key on screen and shows this message; the English source warns users to select and copy it manually before dismissing because there is no second chance. The Turkish copy only says the copy failed, so users who hit a clipboard-denied browser can close the panel and lose the generated key. Please keep the manual-copy-before-dismissal instruction in this locale.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
"modal.forwardHintPrefix": "Anahtar gerekmez — proxy kimlik bilgilerinizi iletir",
"modal.forwardCredentials": "codex girişi",
"modal.forwardHintSuffix": "kimlik bilgilerini bu sağlayıcıya iletir.",
"modal.localHint": "API anahtarı saklanmaz.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve Cursor local-provider limitations

When form.authMode === "local", the add-provider modal renders this amber warning; the English copy says the provider only adds Cursor's static public model catalog and that live Cursor transport plus native file/shell execution remain disabled until audited. The Turkish copy only says no API key is stored, so Turkish users can enable the provider expecting live/native Cursor behavior that the product intentionally does not provide. Please carry over those limitations.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
"pws.settingsSaved": "Ayarlar kaydedildi.",
"pws.accountModeSaved": "Hesap modu kaydedildi.",
"pws.accountModeFailed": "Hesap modu değiştirilemedi.",
"pws.accountModeConfirm": "OpenAI hesap modunu değiştirmek istediğinize emin misiniz?",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve OpenAI mode-switch consequences

When Turkish users change the OpenAI account mode, this is the confirmation text shown immediately before applyAccountMode runs; the source warning says running conversations are reassigned to the other mode's account set and quota usage is tracked against the new mode. The Turkish copy reduces that to a generic confirmation, so users can approve a mode switch without seeing the conversation-routing and quota-accounting consequences.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
"api.workspace.keyDetails": "Anahtar detayları",
"api.workspace.keyPrefix": "Anahtar ön eki",
"api.workspace.deleteKey": "Anahtarı sil",
"api.workspace.deleteConfirm": "Bu anahtarı silmek istediğinize emin misiniz?",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Restore irreversible-delete warning

This sentence is the confirmation shown before deleting a generated API key, but the Turkish copy drops the English warning that the deletion cannot be undone. In Turkish, a user can confirm removal without being told this key is permanently deleted from the proxy, so keep the irreversible-action warning in the translation.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
Comment on lines +478 to +481
"models.v2Help": "Tüm modeller için çoklu ajan yüzeyini kontrol eder.",
"dash.multiAgent": "Alt Ajan",
"models.v2Conflict": "[agents] max_threads ayarlanmış — config.toml dosyasından kaldırın",
"models.v2Applied": "Alt ajan modu güncellendi",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Restore multi-agent mode semantics

The multi-agent help modal and success toast use these strings when switching v1/base/v2 behavior, but Turkish drops the explanations of what each mode does and that changes only apply to new sessions/require restarting the Codex app to refresh the picker. Turkish users can choose base or v2 expecting an immediate or differently scoped change, so the mode definitions and delayed-application guidance should be carried over.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/formatUptime.ts Outdated
@@ -1,17 +1,24 @@
import type { Locale } from "./i18n/shared";
import { DICTS, type Locale } from "./i18n/shared";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Avoid pulling React into root uptime tests

Because formatUptime is imported by root tests such as tests/dashboard-uptime.test.ts after only the root dependencies are installed, this new value import loads shared.ts, which imports React from the GUI package; the root package does not depend on React, so bun run test now fails in a clean root install with Cannot find package 'react'. Keep the uptime unit data local or move shared locale data into a React-free module.

AGENTS.md reference: AGENTS.md:L225-L227

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
"dash.stopFailed": "Proxy durdurulamadı (HTTP {status}).",
"dash.stopping": "Durduruluyor…",
"dash.codexAutoStart": "opencodex'i Codex ile başlat",
"dash.codexAutoStartHint": "Yüklü bir shim'in ocx ensure çalıştırmasına izin verir.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve auto-start restart-protection caveat

The dashboard shows this hint next to the Start opencodex with Codex toggle, but the Turkish copy drops the source caveat that the toggle does not install restart protection and that Startup safety is the effective-state check. Turkish users can turn on only this preference and believe restart recovery is configured when no service or viable shim may be protecting Codex after reboot.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

Comment thread gui/src/i18n/tr.ts Outdated
"storage.cleanup.err.referenced_history": "Seçilen arşivler hâlâ geçmiş tarafından referans gösteriliyor.",
"storage.cleanup.err.invalid_digest": "Önizleme özeti eksik veya geçersiz.",
"storage.cleanup.err.invalid_mode": "Temizleme modu karantina veya kalıcı olmalıdır.",
"storage.cleanup.err.fs_failed": "Dosya sistemi temizliği başarısız oldu.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Restore partial-cleanup recovery guidance

When archive cleanup fails with fs_failed, the English error warns that some filesystem changes may already have been applied and tells users to inspect CODEX_HOME/.trash or the shown recovery path. The Turkish copy only says cleanup failed, so users can miss a partially applied cleanup and the recovery location after a storage operation fails.

AGENTS.md reference: gui/AGENTS.md:L15-L17

Useful? React with 👍 / 👎.

@ardakrt
ardakrt marked this pull request as ready for review August 8, 2026 10:39
@github-actions
github-actions Bot marked this pull request as draft August 8, 2026 10:39
@ardakrt
ardakrt marked this pull request as ready for review August 8, 2026 10:40
@github-actions
github-actions Bot marked this pull request as draft August 8, 2026 10:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant