cmux/Sources
atani 2c330efb8a
feat: add Japanese localization with String Catalog (#819)
* Add i18n infrastructure with String Catalog and Japanese translations

Introduce String Catalog (.xcstrings) for localization support:
- Localizable.xcstrings: 195 UI string entries with en and ja translations
- InfoPlist.xcstrings: Info.plist strings (microphone usage, Finder menu items)
- project.pbxproj: add xcstrings to build phase and ja to knownRegions

* Replace hardcoded UI strings with String(localized:defaultValue:)

Migrate all user-facing strings across 11 source files to use
String(localized:defaultValue:) API (macOS 13+). Each string references
a key in Localizable.xcstrings, with the English text preserved as
defaultValue for fallback.

Files modified:
- KeyboardShortcutSettings: 28 shortcut labels
- SocketControlSettings: mode names and descriptions
- TabManager: placement labels, color names, close dialogs
- BrowserPanel/BrowserPanelView: error pages, context menus, tooltips
- UpdateViewModel/UpdatePopoverView/UpdatePill: update UI states
- NotificationsPage: notification panel labels
- SurfaceSearchOverlay: search bar placeholder and tooltips
- AppDelegate: menus, dialogs, command palette items

* Fix localization gaps from review feedback

Address review comments from CodeRabbit, Greptile, and Cubic Dev AI:
- Use interpolated String(localized:) instead of concatenation for
  version/progress strings in UpdateViewModel
- Localize remaining hardcoded strings in AppDelegate: window labels,
  rename dialog, status menu items, unread notification count
- Localize insecure HTTP alert body in BrowserPanel
- Add 12 new entries to Localizable.xcstrings with Japanese translations

* Fix String(localized:defaultValue:) keys to use StaticString

The localized: parameter requires StaticString when defaultValue: is
used. Move string interpolation from the key to defaultValue only,
and revert maxWidthText to plain strings since they are only used for
layout width calculation.

* Localize remaining UI strings across all source files

Add String(localized:defaultValue:) to all user-facing strings in:
- cmuxApp.swift: settings screen, menus, about panel, dialogs (~180 strings)
- ContentView.swift: command palette, sidebar context menu, dialogs (~200 strings)
- Workspace.swift: rename/move/close tab dialogs, tooltips (~20 strings)
- UpdateTitlebarAccessory.swift: titlebar tooltips, notifications popover (~10 strings)
- TerminalNotificationStore.swift: notification permission dialog (4 strings)
- CmuxWebView.swift: browser context menu items (2 strings)
- AppDelegate.swift: CLI install/uninstall alerts (6 strings)

Add 418 new entries to Localizable.xcstrings with Japanese translations.
Extract sidebar context menu into separate @ViewBuilder to fix Swift
type-checker timeout in large body.
Fix xcstrings format specifiers for interpolated strings (%lld, %@).

Total: 624 localization entries covering the full UI.

* Address review feedback: fix missing localizations and terminology

- Localize javaScriptDialogTitle URL branch in BrowserPanel
- Localize cantReach error message in BrowserPanel
- Localize close other tabs dialog message in TabManager
- Localize workspace accessibility label in ContentView
- Fix unread notification singular/plural (split into two keys)
- Fix insecure connection apostrophe inconsistency (unify to U+2019)
- Rename socketControl.fullOpen.description to socketControl.allowAll.description
- Remove dead code: renameTargetNoun function
- Fix terminology inconsistencies in xcstrings:
  - Unify "Developer Tools" to デベロッパツール
  - Unify "Jump to Latest Unread" phrasing
  - Unify "Flash Focused Panel" terminology
  - Fix dialog.enableNotifications.notNow translation

* fix: address remaining PR 819 review feedback

* fix: use a single localized key for close-other-tabs

* fix: avoid inflection markup in close-other-tabs message

* Address review feedback: localize tooltip, fix subtitle concat, unify keys

- Localize menubar tooltip unread count (hardcoded English -> localized)
- Replace subtitle string concatenation anti-pattern with single localized
  keys containing interpolation placeholders
- Unify workspace fallback key to workspace.displayName.fallback
- Remove unused workspace.defaultName key from xcstrings
- Add Japanese translations for new tooltip and subtitle keys
2026-03-04 14:58:28 -08:00
..
Find feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
Panels feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
Update feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
AppDelegate.swift feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
Backport.swift Polish browser suggestions, focus, and tagged reload flow 2026-02-14 21:33:28 -08:00
BrowserWindowPortal.swift Fix double-click titlebar zoom not working on browser panel side 2026-02-24 14:35:10 -08:00
cmuxApp.swift feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
ContentView.swift feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
GhosttyConfig.swift Honor Ghostty background-opacity across all cmux chrome (#667) 2026-03-01 03:48:46 -08:00
GhosttyTerminalView.swift Fix cross-window theme background gating after jump-to-unread (#861) 2026-03-04 02:48:06 -08:00
KeyboardLayout.swift Fix Cmd+plus zoom handling on non-US layouts (#680) 2026-02-28 00:16:03 -08:00
KeyboardShortcutSettings.swift feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
NotificationsPage.swift feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
PortScanner.swift Avoid main-thread hops for explicit socket scope 2026-02-20 23:58:47 -08:00
PostHogAnalytics.swift Add telemetry opt-out setting (#610) 2026-02-26 22:02:29 -08:00
SentryHelper.swift Auto-heal missing CLI listener socket (#679) 2026-02-28 01:19:38 -08:00
SessionPersistence.swift Fix session restore routing and browser history persistence 2026-02-24 14:34:55 -08:00
SidebarSelectionState.swift Implement session persistence pass 1 with multi-window restore 2026-02-22 15:39:59 -08:00
SocketControlSettings.swift feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
TabManager.swift feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
TerminalController.swift Clear sidebar notification when user submits prompt (#821) 2026-03-03 18:48:32 -08:00
TerminalNotificationStore.swift feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
TerminalView.swift Add sidebar blur effect with withinWindow blending (#9) 2026-02-04 03:04:45 -08:00
TerminalWindowPortal.swift Fix ghost terminal surface rebind after close (#808) 2026-03-03 15:20:42 -08:00
UITestRecorder.swift Fix frozen terminals after split churn (#12) 2026-02-13 16:45:31 -08:00
WindowAccessor.swift Polish browser suggestions, focus, and tagged reload flow 2026-02-14 21:33:28 -08:00
WindowDecorationsController.swift Refine settings/about titlebar styling and controls alignment 2026-02-14 02:11:35 -08:00
WindowDragHandleView.swift Fix re-entrant exclusive-access crash in drag handle hit test (#771) 2026-03-02 19:20:14 -08:00
WindowToolbarController.swift Coalesce title notification updates to reduce main-thread hangs 2026-02-20 20:14:19 -08:00
Workspace.swift feat: add Japanese localization with String Catalog (#819) 2026-03-04 14:58:28 -08:00
WorkspaceContentView.swift Honor Ghostty background-opacity across all cmux chrome (#667) 2026-03-01 03:48:46 -08:00