Skip to content

Localize package display strings missing from app catalogs - #5829

Merged
azooz2003-bit merged 1 commit into
mainfrom
feat-loc-backfill-packages
Jun 10, 2026
Merged

azooz2003-bit merged 1 commit into
mainfrom
feat-loc-backfill-packages

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Jun 10, 2026 •

Copy link
Copy Markdown
Collaborator

What

SPM package sources are not scanned by Xcode's string-catalog extraction, so display strings that live only in packages never got backfilled into the host app catalogs. They resolve via Bundle.main against the linking app's catalog, and with the key absent they rendered the English defaultValue even in Japanese.

This backfills the 40 missing keys with en+ja into the two app catalogs (additions only, no English-visible change):

  • iOS (ios/cmux/Resources/Localizable.xcstrings): 22 CmuxMobileTerminal keys — shortcut settings-editor names (terminal.shortcut.name.*) and the PgUp/PgDn keycap titles.
  • macOS (Resources/Localizable.xcstrings): 18 CmuxSettingsUI keys — workspace selection/badge colors, preferred editor, desktop notifications, active team, socket-password-empty, browser import hints.

Keys are marked extractionState: "manual" since they are package-owned and cannot be auto-extracted into the app target catalog.

Audit context

All other localizing packages are fully covered: CmuxSettings, CmuxUpdater, CmuxUpdaterUI, CmuxMobileSupport, and CmuxSwiftRenderUI (which owns its own .module catalog). No package that emits display strings is shared between the macOS and iOS app targets today, so there is no cross-catalog duplication gap.

Verification

Only difference is visible in Japanese locale; English is unchanged. JSON validated; every package String(localized:) key now resolves in the correct catalog.

🤖 Generated with Claude Code


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Summary by cubic

Backfilled package-owned display strings into the iOS and macOS app catalogs so Japanese translations render correctly instead of falling back to English. Adds 40 en+ja keys; English UI is unchanged.

  • Bug Fixes
    • iOS ios/cmux/Resources/Localizable.xcstrings: 22 CmuxMobileTerminal keys (terminal shortcut names; PgUp/PgDn).
    • macOS Resources/Localizable.xcstrings: 18 CmuxSettingsUI keys (workspace colors, preferred editor, desktop notifications, active team, socket-password-empty, browser import hints).
    • Marked all new entries extractionState: "manual" since they live in SPM packages.

Written for commit a0a82bd. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Localization
    • Added comprehensive Japanese and English translations for desktop notification settings, terminal keyboard shortcuts, workspace color options, and browser import features.
    • Expanded localization support for accessibility features and editor preferences.

SPM package sources are not scanned by Xcode's string-catalog extraction,
so display strings that live only in packages never got backfilled into the
host app catalogs and rendered English-only in Japanese.

Add the 40 missing keys with en+ja:
- iOS (ios/cmux/Resources/Localizable.xcstrings): 22 CmuxMobileTerminal keys
  (shortcut settings-editor names + PgUp/PgDn keycap titles).
- macOS (Resources/Localizable.xcstrings): 18 CmuxSettingsUI keys
  (workspace selection/badge colors, preferred editor, desktop notifications,
  active team, socket-password-empty, browser import hints).

Keys are marked extractionState "manual" since they are package-owned and
cannot be auto-extracted into the app target catalog.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Building Building Preview, Comment Jun 10, 2026 9:25pm
cmux-staging Building Building Preview, Comment Jun 10, 2026 9:25pm

@coderabbitai

coderabbitai Bot commented Jun 10, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 31c914e2-8c6a-425e-9f51-9b11178f4f98

📥 Commits

Reviewing files that changed from the base of the PR and between 65b16e1 and a0a82bd.

📒 Files selected for processing (2)
  • Resources/Localizable.xcstrings
  • ios/cmux/Resources/Localizable.xcstrings

📝 Walkthrough

Walkthrough

Added 680 lines of localized string entries across two xcstrings resource files: general app settings, browser import, account team, notification settings, and workspace color labels in the root Resources file; terminal keyboard input accessory and shortcut name labels in the iOS cmux Resources file. All entries include English and Japanese translations with extractionState: "manual".

Changes

Localization String Additions

Layer / File(s) Summary
Settings and workspace UI localization
Resources/Localizable.xcstrings
Added localization entries for browser import hints, account team selection, preferred editor configuration, automation socket password prompt, desktop notification settings (enable, send test, permission states, custom sound panel), and workspace color notification badge/selection highlight labels with English and Japanese translations.
iOS terminal keyboard UI localization
ios/cmux/Resources/Localizable.xcstrings
Added localization entries for terminal input accessory page up/down titles and terminal keyboard shortcut names (escape, tab, arrow keys, function keys, symbols, control modifiers, home/end, page navigation) with English and Japanese translations.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Possibly related PRs

  • manaflow-ai/cmux#5579: Adds related terminal shortcut display names and accessory bar UI localization entries that complement the keyboard shortcut labels added in this PR.
  • manaflow-ai/cmux#5519: Contains overlapping iOS notification settings localization strings (mobile.notifications.enable/disable) related to the desktop notification entries added here.
  • manaflow-ai/cmux#5532: Introduces localized control-key shortcut labels for the terminal toolbar that align with the keyboard shortcut names added in this PR.

Poem

🐰 A string in every tongue, a label bright,
From browser hints to terminals that type,
In English, then in Japanese so right,
The UI blooms with localized delight!
✨

🚥 Pre-merge checks | ✅ 21
✅ Passed checks (21 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately reflects the main change: backfilling missing localization keys from packages into app catalogs.
Description check ✅ Passed The description covers the 'What' and 'Why' sections well with detailed context, but the Testing, Demo Video, and Checklist sections from the template are missing.
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.
Cmux Swift Actor Isolation ✅ Passed PR modifies only localization resource files (.xcstrings), not Swift source code; check not applicable to non-code resource changes.
Cmux Swift Blocking Runtime ✅ Passed PR contains only localization data (.xcstrings JSON files) with no Swift code changes, therefore no blocking runtime patterns can be introduced.
Cmux Expensive Synchronous Load ✅ Passed PR contains only localization (.xcstrings) files, no Swift code changes. Check applies to "production Swift changes" and is not applicable here.
Cmux Cache Substitution Correctness ✅ Passed PR consists primarily of localization data (XCStrings JSON) and initial repository setup. The XCStrings files are resource data, not executable code. The check applies to production code with cache...
Cmux No Hacky Sleeps ✅ Passed PR modifies only .xcstrings localization resource files (iOS and macOS), not TypeScript/JavaScript/shell/build-runtime code. The custom check applies exclusively to executable runtime code, not dat...
Cmux Algorithmic Complexity ✅ Passed PR adds only localization data to .xcstrings JSON files, not production code. Algorithmic complexity rules apply to executable code, not static resource data files.
Cmux Swift Concurrency ✅ Passed PR only modifies localization resource files (.xcstrings), not Swift code; no async patterns or concurrency changes present.
Cmux Swift @Concurrent ✅ Passed PR only modifies localization resource files (.xcstrings JSON), not Swift code; no @concurrent or nonisolated async changes present.
Cmux Swift File And Package Boundaries ✅ Passed PR only modifies .xcstrings (JSON localization resource files), not Swift source code; the Swift file/package boundaries rule explicitly applies to .swift files, which are excluded from scope.
Cmux Swift Logging ✅ Passed PR only adds localization data in .xcstrings JSON files (no Swift code changes), so swift-logging rules do not apply.
Cmux User-Facing Error Privacy ✅ Passed All newly added localization strings comply with privacy rules: socket password UI labels don't expose credentials, preferred editor mentions public CLI tools users choose, browser import reference...
Cmux Full Internationalization ✅ Passed PR adds 40 localization keys (18 macOS, 22 iOS) to string catalogs supporting en/ja. All entries have complete en+ja translations, extractionState:manual, and no other files modified.
Cmux Swiftui State Layout ✅ Passed PR contains only localization file changes (.xcstrings JSON files). No Swift/SwiftUI code modifications present, so SwiftUI state layout rules do not apply.
Cmux Architecture Rethink ✅ Passed PR modifies only localization data (.xcstrings JSON files) with no Swift code changes. Zero architectural anti-patterns detected (no DispatchQueue, asyncAfter, Task.sleep, locks, observers, or life...
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR only adds localization strings to .xcstrings files; no Swift code changes that add/materially change standalone windows (NSWindow/NSPanel/NSWindowController/Window/WindowGroup).
Cmux Source Artifacts ✅ Passed All 11 changed files are valid .xcstrings localization catalogs (hand-written, multi-language string resources), explicitly approved by policy's PASS clause as "localization catalogs...intentionall...

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-loc-backfill-packages

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 and usage tips.

@greptile-apps

greptile-apps Bot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR backfills 40 string-catalog keys that SPM packages expose via String(localized:) but that Xcode's extraction never copies into the host app catalogs, causing Japanese users to see English text. The iOS catalog additions (22 keys) are complete — that catalog only supports en and ja. The macOS catalog additions (18 keys) cover en and ja but omit the 18 other locales the macOS catalog already carries.

  • iOS (ios/cmux/Resources/Localizable.xcstrings): 22 CmuxMobileTerminal keys added with en + ja; locale coverage is complete for the iOS catalog.
  • macOS (Resources/Localizable.xcstrings): 18 CmuxSettingsUI keys added covering workspace colors, preferred editor, notifications, active team, socket-password-empty, and browser import hints — all marked extractionState: manual — but only en and ja entries are present despite the catalog supporting 20 locales.

Confidence Score: 3/5

The iOS changes are safe to merge as-is. The macOS changes fix Japanese but leave 18 other supported locales falling back to English for all 18 newly added settings strings.

The macOS catalog already ships translations for Arabic, German, Spanish, French, Korean, and 13 other locales across thousands of strings, so the 18 new settings keys introducing an en/ja-only gap will render English copy to users in those locales — the same regression this PR is correcting for Japanese.

Resources/Localizable.xcstrings needs translations for the 18 missing locales on every newly added key.

Important Files Changed

Filename Overview
Resources/Localizable.xcstrings Adds 18 manual CmuxSettingsUI keys with en+ja only; macOS catalog supports 20 locales so ar/bs/da/de/es/fr/it/km/ko/nb/pl/pt-BR/ru/th/tr/uk/zh-Hans/zh-Hant entries are missing for every new key.
ios/cmux/Resources/Localizable.xcstrings Adds 22 manual CmuxMobileTerminal keys (terminal shortcuts and PgUp/PgDn keycaps) with en+ja; iOS catalog only supports en and ja so coverage is complete.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["String(localized: key, bundle: .main)"] --> B{Key in host app catalog?}
    B -->|Yes - locale match| C["✅ Localized string rendered"]
    B -->|Yes - en only| D["⚠️ English fallback rendered"]
    B -->|No| E["⚠️ defaultValue rendered (English)"]

    subgraph iOS["iOS catalog (en + ja only)"]
        F["22 new keys\nterminal.shortcut.name.*"]
        F --> G["✅ en ✅ ja — fully covered"]
    end

    subgraph macOS["macOS catalog (20 locales)"]
        H["18 new keys\nsettings.* + browser.import.*"]
        H --> I["✅ en ✅ ja"]
        H --> J["❌ ar ❌ bs ❌ da ❌ de ❌ es ❌ fr\n❌ it ❌ km ❌ ko ❌ nb ❌ pl ❌ pt-BR\n❌ ru ❌ th ❌ tr ❌ uk ❌ zh-Hans ❌ zh-Hant"]
    end

    A --> iOS
    A --> macOS
Loading

Reviews (1): Last reviewed commit: "Localize package display strings missing..." | Re-trigger Greptile

Comment on lines 190930 to 191240
}
}
},
"browser.import.hint.subtitle": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Import bookmarks, history, and cookies from Safari, Chrome, Firefox, Brave, Edge, or Arc. Already-imported entries are deduped automatically."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "Safari、Chrome、Firefox、Brave、Edge、Arc からブックマーク、履歴、Cookie をインポートします。インポート済みの項目は自動的に重複排除されます。"
}
}
}
},
"settings.account.activeTeam": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Active Team"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "アクティブなチーム"
}
}
}
},
"settings.account.activeTeam.none": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "None"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "なし"
}
}
}
},
"settings.app.preferredEditor": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Open Files With"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "ファイルを開くアプリ"
}
}
}
},
"settings.app.preferredEditor.placeholder": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "e.g. code, zed, subl"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "例: code、zed、subl"
}
}
}
},
"settings.automation.socketPassword.empty": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Enter a password first."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "先にパスワードを入力してください。"
}
}
}
},
"settings.browser.import.hint.settingsNote": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Shown until you import or dismiss it on a blank tab."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "空のタブでインポートするか閉じるまで表示されます。"
}
}
}
},
"settings.notifications.desktop.action.enable": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Enable"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "有効にする"
}
}
}
},
"settings.notifications.desktop.sendTest": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Send Test"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "テストを送信"
}
}
}
},
"settings.notifications.desktop.status.unknown": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Permission unknown"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "権限が不明です"
}
}
}
},
"settings.notifications.desktop.subtitle.notDetermined": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Desktop notifications are not enabled yet."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "デスクトップ通知はまだ有効になっていません。"
}
}
}
},
"settings.notifications.sound.custom.panelTitle": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Choose Notification Sound"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "通知音を選択"
}
}
}
},
"settings.workspaceColors.notificationBadgeColor": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Notification Badge"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "通知バッジ"
}
}
}
},
"settings.workspaceColors.notificationBadgeColor.reset": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Reset"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "リセット"
}
}
}
},
"settings.workspaceColors.notificationBadgeColor.subtitle": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Color of the unread notification badge on workspace tabs."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "ワークスペースタブの未読通知バッジの色。"
}
}
}
},
"settings.workspaceColors.selectionColor": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Selection Highlight"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "選択ハイライト"
}
}
}
},
"settings.workspaceColors.selectionColor.reset": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Reset"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "リセット"
}
}
}
},
"settings.workspaceColors.selectionColor.subtitle": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Background color of the selected workspace in the sidebar."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サイドバーで選択中のワークスペースの背景色。"
}
}
}
}
}
}

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.

P1 macOS catalog: 18 new keys missing translations for 18 of 20 supported locales

The macOS Localizable.xcstrings already carries full coverage for ar, bs, da, de, es, fr, it, km, ko, nb, pl, pt-BR, ru, th, tr, uk, zh-Hans, and zh-Hant across a large portion of its existing strings (e.g. ko covers ~1715 strings, de/es/fr cover ~1321 each). Every one of the 18 new keys adds only en and ja entries, so users in those 18 locales will fall back to the English defaultValue for all the newly backfilled settings strings — the same class of bug this PR is fixing for Japanese.

Rule Used: Flag production user-facing text that is not fully... (source)

This branch was successfully deployed

1 active deployment
Preview – cmux — a0a82bdd Deployed Jun 10, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant