Skip to content

Add native Vietnamese localization support - #1247

Merged
steipete merged 2 commits into
steipete:mainfrom
Yuxin-Qiao:feat/vietnamese-native-support
Jun 7, 2026
Merged

Add native Vietnamese localization support#1247
steipete merged 2 commits into
steipete:mainfrom
Yuxin-Qiao:feat/vietnamese-native-support

Conversation

@Yuxin-Qiao

Copy link
Copy Markdown
Contributor

Summary:

  • Add Vietnamese (vi) as a native app language option.
  • Add a complete vi.lproj/Localizable.strings resource file.
  • Add language_vietnamese labels to the existing language packs so the language picker can display Vietnamese consistently.

Validation:

  • swift test --filter PreferencesPaneSmokeTests
  • Verified vi.lproj key parity with en.lproj.
  • Verified placeholder and newline consistency between English and Vietnamese localization files.

@clawsweeper

clawsweeper Bot commented May 31, 2026

Copy link
Copy Markdown

Codex review: needs maintainer review before merge. Reviewed June 7, 2026, 6:34 AM ET / 10:34 UTC.

Summary
The PR adds Vietnamese as a selectable app language, adds a full vi.lproj/Localizable.strings catalog, adds Vietnamese labels to existing catalogs, and extends localization language-label coverage.

Reproducibility: not applicable. this is a feature PR rather than a bug report. The diff and screenshots provide a high-confidence verification path for the new visible Vietnamese UI behavior.

Review metrics: 3 noteworthy metrics.

  • Diff scope: 14 files, 1,133 additions, 0 deletions. The change is broad in line count because it adds a full localization catalog, but the touched surface stays within localization resources, one language enum, one test, and release notes.
  • Localization catalogs: 1 catalog added, 10 existing catalogs updated. Every existing language catalog receives the Vietnamese language-picker label so the picker does not fall back inconsistently.
  • Test coverage: 1 parity test added. The new test checks all .lproj catalogs for every selectable app-language label, covering the prior label-sync class of regression.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

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

Rank-up moves:

  • none.

Risk before merge

  • [P1] This static review did not independently validate every Vietnamese translation with a native-speaker pass; screenshots prove the UI loads in Vietnamese, not full translation quality.

Maintainer options:

  1. Decide the mitigation before merge
    Land the focused Vietnamese localization after normal checks and maintainer acceptance, keeping the new catalog and parity test while letting release-owned notes be adjusted by the release flow if needed.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Next step before merge

  • No narrow ClawSweeper repair is indicated; the PR is ready for normal maintainer review and check gating.

Security
Cleared: The diff is limited to Swift localization selection, string resources, a localization test, and release notes, with no dependency, script, secret, or code-execution changes found.

Review details

Best possible solution:

Land the focused Vietnamese localization after normal checks and maintainer acceptance, keeping the new catalog and parity test while letting release-owned notes be adjusted by the release flow if needed.

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

Not applicable; this is a feature PR rather than a bug report. The diff and screenshots provide a high-confidence verification path for the new visible Vietnamese UI behavior.

Is this the best way to solve the issue?

Yes; the PR follows the existing localization pattern by adding an AppLanguage case, a vi.lproj catalog, cross-catalog language labels, and focused parity coverage. The remaining decision is normal maintainer acceptance of a new native language.

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 1583d6cc1005.

Label changes

Label changes:

  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (screenshot): The contributor posted after-change screenshots showing the localized menu and settings language picker, which is appropriate proof for this visible app-language feature.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.
  • remove status: ⏳ waiting on author: Current PR status label is status: 👀 ready for maintainer look.

Label justifications:

  • P2: This is a normal user-facing localization feature with bounded app-language-picker scope and no urgent runtime breakage.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (screenshot): The contributor posted after-change screenshots showing the localized menu and settings language picker, which is appropriate proof for this visible app-language feature.
  • proof: sufficient: Contributor real behavior proof is sufficient. The contributor posted after-change screenshots showing the localized menu and settings language picker, which is appropriate proof for this visible app-language feature.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. The contributor posted after-change screenshots showing the localized menu and settings language picker, which is appropriate proof for this visible app-language feature.
Evidence reviewed

What I checked:

Likely related people:

  • Yuxin-Qiao: Recent merged main commits added French, Ukrainian, and Dutch through the same AppLanguage and .lproj resource path, and the Ukrainian commit introduced the localization language catalog test file. (role: recent localization contributor; confidence: high; commits: d3151b719e32, ae63897f3ee5, 1583d6cc1005; files: Sources/CodexBar/PreferencesGeneralPane.swift, Sources/CodexBar/Resources/fr.lproj/Localizable.strings, Sources/CodexBar/Resources/uk.lproj/Localizable.strings)
  • steipete: The base AppLanguage and English resource setup are blamed to commit 723734e, and the current PR head includes a fix: complete Vietnamese localization catalog commit authored by Peter Steinberger. (role: base localization/settings owner and recent branch maintainer; confidence: medium; commits: 723734ef3422, 7a8ced8adb9a; files: Sources/CodexBar/PreferencesGeneralPane.swift, Sources/CodexBar/Resources/en.lproj/Localizable.strings, Sources/CodexBar/Resources/vi.lproj/Localizable.strings)
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.

@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: 80b5a37a91

ℹ️ 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".

"30d spend" = "chi tiêu 30 ngày";
"Cache read" = "Đọc bộ nhớ đệm";
"Claude Admin API 30 day spend trend" = "Claude Quản trị viên API Xu hướng chi tiêu 30 ngày";
"OpenRouter API key spend trend" = "OpenRouter <span> class="w0"></span> xu hướng chi tiêu chính";

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 Escape embedded quotes in the Vietnamese strings file

When the app language is set to Vietnamese, this unescaped class="w0" attribute makes vi.lproj/Localizable.strings invalid; plutil -lint reports a missing semicolon on this line, so Foundation cannot load the table and Vietnamese lookups fall back instead of using the new translations. Escape the embedded quotes or remove the generated HTML fragment so the .strings file parses.

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 Yuxin-Qiao changed the title Localization: add native Vietnamese app language support Add native Vietnamese localization support May 31, 2026
@clawsweeper clawsweeper Bot added the P2 Normal priority bug or improvement with limited blast radius. label May 31, 2026
@Yuxin-Qiao

Copy link
Copy Markdown
Contributor Author

Implemented and polished native Vietnamese localization based on the review feedback.

Updated UI screenshots:

0DE1D9B8-6EAF-4720-90F5-810552565919 061AC548-DD11-4015-8EB0-B720A8CB6DB9 6E18FFFF-F5F1-4C00-AF80-50F36E03ECAD 93195FB5-9CC4-468B-BD06-50EA22A93B87 6B427C1E-EDBC-4CC4-A236-869C887E3127

@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 rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. 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 force-pushed the feat/vietnamese-native-support branch from 80b5a37 to eef4385 Compare June 7, 2026 08:02
@Yuxin-Qiao Yuxin-Qiao closed this Jun 7, 2026
@Yuxin-Qiao
Yuxin-Qiao deleted the feat/vietnamese-native-support branch June 7, 2026 08:02
@Yuxin-Qiao Yuxin-Qiao reopened this Jun 7, 2026
@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 7, 2026
@steipete
steipete force-pushed the feat/vietnamese-native-support branch from eef4385 to 7a8ced8 Compare June 7, 2026 10:28
@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: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 7, 2026
@steipete
steipete merged commit b442183 into steipete:main Jun 7, 2026
4 checks passed
@steipete

steipete commented Jun 7, 2026

Copy link
Copy Markdown
Owner

Merged as b442183.

Tested:

  • plutil -lint Sources/CodexBar/Resources/*.lproj/Localizable.strings
  • Language catalog parity scan for all AppLanguage labels in every localized catalog
  • swift test --filter LocalizationLanguageCatalogTests
  • swift test --filter LocalizationBundleTests
  • git diff --check
  • make check
  • env CODEX_HOME=/tmp/codexbar-empty-codexhome-1247 swift test - full suite passed: 3334 tests in 389 suites
  • /Users/steipete/Projects/agent-skills/skills/autoreview/scripts/autoreview --mode local - clean, no accepted/actionable findings

CI for exact head 7a8ced8adb9a2b1a061b392d26d292362ab70c2c:

  • GitGuardian Security Checks - success
  • CI / build-linux-cli (linux-arm64, ubuntu-24.04-arm) - success
  • CI / build-linux-cli (linux-x64, ubuntu-24.04) - success
  • CI / lint-build-test - success

Verification images: not applicable; no UI visual change in the maintainer fixup.

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

Labels

P2 Normal priority bug or improvement with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient Contributor real behavior proof is sufficient. 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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants