Skip to content

Add native German localization support#1245

Open
Yuxin-Qiao wants to merge 7 commits into
steipete:mainfrom
Yuxin-Qiao:feat/native-german-localization-public
Open

Add native German localization support#1245
Yuxin-Qiao wants to merge 7 commits into
steipete:mainfrom
Yuxin-Qiao:feat/native-german-localization-public

Conversation

@Yuxin-Qiao

Copy link
Copy Markdown
Contributor

Summary

This PR adds first-class German (de) app language support and significantly improves German translation quality/coverage across CodexBar’s user-facing UI.

What’s included

  1. Adds German as a selectable app language in Preferences.
  2. Adds a dedicated German localization bundle: de.lproj/Localizable.strings.
  3. Adds language_german language-label key across localization files so German appears correctly in the language picker.
  4. Expands German translations across:
    • General/Display/Advanced/About/Debug preferences copy
    • Provider settings/help/guidance copy
    • Runtime status/notification/chart phrases
    • API-key/cookie/session setup instructions
    • Menu actions and high-visibility labels
  5. Adds smoke coverage to verify appLanguage = "de" resolves German strings.

Validation

  • plutil -lint Sources/CodexBar/Resources/de.lproj/Localizable.strings
  • swift test --filter PreferencesPaneSmokeTests

Notes

  • Brand/product names and technical tokens are preserved where appropriate.
  • Placeholder formatting (%@, %d, interpolation tokens, escaped sequences) remains intact.

@clawsweeper

clawsweeper Bot commented May 31, 2026

Copy link
Copy Markdown

Codex review: needs real behavior proof before merge. Reviewed June 11, 2026, 1:32 PM ET / 17:32 UTC.

Summary
Review failed before ClawSweeper could summarize the requested change.

Reproducibility: unclear. The review failed before ClawSweeper could establish a reproduction path.

Review metrics: none identified.

Merge readiness
Overall: 🌊 off-meta tidepool
Proof: 🌊 off-meta tidepool
Patch quality: 🌊 off-meta tidepool
Result: rating does not apply to this item.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Risk before merge

  • [P1] No close action taken because the review did not complete.

Maintainer options:

  1. Decide the mitigation before merge
    Retry the Codex review after fixing the execution failure.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Next step before merge

  • [P1] Review did not complete, so no work-lane recommendation was made.
Review details

Best possible solution:

Retry the Codex review after fixing the execution failure.

Do we have a high-confidence way to reproduce the issue?

Unclear. The review failed before ClawSweeper could establish a reproduction path.

Is this the best way to solve the issue?

Unclear. Retry the review first so ClawSweeper can evaluate the actual issue and fix direction.

AGENTS.md: unclear because the file could not be read completely.

Codex review notes: model internal, reasoning high; reviewed against 3c2d23d1739a.

Label changes

Label changes:

  • remove P2: Current review triage priority is none.
  • remove merge-risk: 🚨 auth-provider: Current PR review selected no merge-risk labels.

Label justifications:

  • rating: 🌊 off-meta tidepool: Overall readiness is 🌊 off-meta tidepool; proof is 🌊 off-meta tidepool and patch quality is 🌊 off-meta tidepool.
Evidence reviewed

What I checked:

  • failure reason: retryable codex transport failure.
  • codex failure detail: Codex review failed for this PR with exit 1.
  • codex stderr: esPaneSmokeTests {\n #expect(L("quit_app") == "CodexBar を終了")\n }\n \n+ @test\n+ func german app language resolves localized labels() {\n+ let previousLanguage = UserDefaults.standard.object(forKey: "appLanguage")\n+ let previousAppleLanguages = UserDefaults.standard.object(forKey: "AppleLanguages")\n+ defer {\n+ if let previousLanguage {\n+ UserDefaults.standard.set(previousLanguage, forKey: "appLanguage")\n+ } else {\n+ UserDefaults.standard.removeObject(forKey: "appLanguage")\n+ }\n+ if let previousAppleLanguages {\n+ UserDefaults.standard.set(previousAppleLanguages, forKey: "AppleLanguages")\n+ } else {\n+ UserDefaults.standard.removeObject(forKey: "AppleLanguages")\n+ }\n+ }\n+\n+ let settings = Self.makeSettingsStore(suite: "PreferencesPaneSmokeTests-language-de")\n+ settings.appLanguage = "de"\n+\n+ #expect(UserDefaults.standard.string(forKey: "appLanguage") == "de")\n+ #expect(L("tab_general") == "Allgemein")\n+ #expect(L("language_title") == "Sprache")\n+ #expect(L("quit_app") == "CodexBar beenden")\n+ #expect(L("vertex_ai_login_instructions").contains("\n\n1. Öffnen Sie Terminal"))\n+ #expect(!L("vertex_ai_login_instructions").contains(".
  • codex stdout: No stdout captured.

Likely related people:

  • unknown: Codex failed before it could trace repository history. (role: review did not complete; confidence: low)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@Yuxin-Qiao Yuxin-Qiao force-pushed the feat/native-german-localization-public branch from d2dd731 to de4da39 Compare May 31, 2026 13:48

@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: d2dd731527

ℹ️ 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 on lines +90 to +92
"Cookie: \\u{2026}\\\n\\\nor paste a cURL capture from the Abacus AI dashboard" = "Cookie: \\\\u{2026}\\\\\\n\\\\\\noder fügen Sie eine cURL-Erfassung aus dem Abacus AI-Dashboard ein";
"Cookie: \\u{2026}\\\n\\\nor paste the __Secure-next-auth.session-token value" = "Cookie: \\\\u{2026}\\\\\\n\\\\\\noder fügen Sie den __Secure-next-auth.session-token-Wert ein";
"Cookie: \\u{2026}\\\n\\\nor paste the kimi-auth token value" = "Cookie: \\\\u{2026}\\\\\\n\\\\\\noder fügen Sie den Kimi-Auth-Token-Wert ein";

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 Use runtime placeholder keys for cookie prompts

When German is selected and a user opens the Abacus, Perplexity, or Kimi provider settings, these placeholders are looked up via L(self.field.placeholder ?? "") using the runtime strings from the provider descriptors, which contain an actual ellipsis and newline characters. These new German keys instead encode the Swift source escapes (\u{2026}/\n), and the values double-escape them too, so the lookup misses and falls back to the English placeholder (or would display literal escape sequences if matched).

Useful? React with 👍 / 👎.

Comment on lines +84 to +85
let previousLanguage = UserDefaults.standard.object(forKey: "appLanguage")
defer {

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 AppleLanguages after the German test

This test saves only appLanguage, but settings.appLanguage = "de" below also writes UserDefaults.standard["AppleLanguages"]. After this test runs in the same test process, later tests that exercise system-language localization can inherit de even though appLanguage was restored, making the suite order-dependent; save and restore AppleLanguages as the existing language preference test does.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels May 31, 2026
@Yuxin-Qiao

Copy link
Copy Markdown
Contributor Author

Thanks for the review. I’ve now added real behavior proof from a running build with German selected (Deutsch), per the merge-readiness guidance.

Real behavior proof (packaged/running app UI)

  1. Main menu runtime view in German
Main menu (German)
  1. Preferences → General
Preferences - General
  1. Preferences → Providers
Preferences - Providers
  1. Preferences → Display
Preferences - Display
  1. Preferences → Advanced / About
Preferences - Advanced/About

Validation rerun

  • plutil -lint Sources/CodexBar/Resources/de.lproj/Localizable.strings
  • swift test --filter PreferencesPaneSmokeTests

I’ve addressed the proof gap raised by ClawSweeper and attached redacted real-UI evidence as requested.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 1, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 auth-provider 🚨 Merging this PR could break OAuth, tokens, provider routing, model choice, or credentials. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 1, 2026
@Yuxin-Qiao Yuxin-Qiao changed the title Add native German localization support and polish translation coverage Add native German localization support Jun 1, 2026
@Yuxin-Qiao Yuxin-Qiao force-pushed the feat/native-german-localization-public branch from de4da39 to c4a3510 Compare June 7, 2026 07:51
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 7, 2026
@Yuxin-Qiao Yuxin-Qiao force-pushed the feat/native-german-localization-public branch from c4a3510 to a7e328f Compare June 7, 2026 13:33
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jun 7, 2026
@steipete steipete force-pushed the feat/native-german-localization-public branch from 4bfbbe5 to d545248 Compare June 11, 2026 15:21
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 11, 2026
@steipete

Copy link
Copy Markdown
Owner

Maintainer update: rebased onto current main and completed the German catalog against the current 1,038-key English source.

Proof on exact head d5452488bed3475b2239021470569c6c4267680c:

  • German/English key parity: 1,038 / 1,038; 986 German translations, 52 intentional product/technical carryovers.
  • Fixed stale provider guidance, multiline escape decoding, and AppleLanguages test-state restoration.
  • swift test --filter 'PreferencesPaneSmokeTests|LocalizationLanguageCatalogTests|UserFacingLocalizationCoverageTests': 10 tests passed.
  • make check: SwiftFormat and strict SwiftLint clean.
  • Structured Codex autoreview: clean, no accepted/actionable findings.
  • Built/package/relaunch proof: ./Scripts/compile_and_run.sh succeeded.
  • Peekaboo E2E: selected Deutsch in Settings, restarted the packaged app, and verified German persisted in both Settings and the status menu (Überblick, Aktualisieren, Einstellungen…, Aufhören). Restored the original System language afterward. Local proof image: /tmp/codexbar-german-menu-proof.png; gh image is unavailable in this environment.
  • Linux x64, Linux arm64, and GitGuardian are green; macOS lint-build-test is still queued and remains the merge gate.

Yuxin-Qiao and others added 6 commits June 12, 2026 00:33
Add language_dutch/french/ukrainian/vietnamese labels to de.lproj and
register language_german in LocalizationLanguageCatalogTests so the
invariant test count matches AppLanguage.allCases.

Main grew AppLanguage cases (dutch, ukrainian, vietnamese) and
Localizable.strings catalogs after this PR was opened, so the rebase
needed these parity fixes for the new invariant test.
Co-authored-by: Cursor <cursoragent@cursor.com>
@Yuxin-Qiao Yuxin-Qiao force-pushed the feat/native-german-localization-public branch from d545248 to 2a852ce Compare June 11, 2026 16:34
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 auth-provider 🚨 Merging this PR could break OAuth, tokens, provider routing, model choice, or credentials. P2 Normal priority bug or improvement with limited blast radius. rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants