mirror of
https://github.com/wu736139669/hapi.git
synced 2026-10-14 20:26:05 +00:00
Part 1 — Simplified Chinese localization of the iOS app layer: - ios/Hapi/Resources/Localizable.xcstrings: hand-authored String Catalog (395 keys, zh-Hans; en implicit as source). Terminology mined from web/src/lib/locales/zh-CN.ts (会话/新建会话/权限模式/允许/拒绝/工作树/ 机器/语音输入/用量/草稿夹 …). - Mechanical edits only: merged multi-part string concatenations into single LocalizedStringKey literals, converted ternary/plain-String user copy to String(localized:), switched helper params (detailRow, DashboardCard, optionPicker, notice) to LocalizedStringKey. - LocalizedNoticeMapper (app layer): display-point translation of the 27 known HapiKit-emitted strings (ChatInteractor notices, dictation errors, window-sync warnings, files fallbacks, worktree-name validation) with verbatim passthrough for server-originated text; package stays language-free. - Deliberately untranslated (web parity / non-copy): event rows (EventPresentation — web renders presentation.ts verbatim), catalog option labels (Default/Auto/Sonnet/permission modes — web shows them verbatim), tool names, code-like titles (grep(pattern:), MCP:, Skill, Task), unit suffixes (B/KB/MB, m/h/d/w), decorative separators. - Language row wired: AppLanguage gains .system (follow system, new default); explicit picks write the AppleLanguages override, Follow system removes it; footer notes a relaunch applies it (no supported in-place SwiftUI locale swap). - project.pbxproj: zh-Hans added to knownRegions. Part 2 — #39 catalog dedupe (HapiProtocol): - NewSessionCatalogs.claudeModels/claudeEfforts now derive from ClaudeModels/ClaudeEfforts (single source shared with ModelCatalog); codexReasoningEfforts stays own data (web CODEX_REASONING_EFFORT_OPTIONS minus max); effortLabel delegates to ModelCatalog.capitalizedFirst. - New CatalogTests lock test for the derived option lists. Gate: bash ios/scripts/linux-test.sh — 459 tests green.
40 lines
1.3 KiB
Swift
40 lines
1.3 KiB
Swift
import HapiClient
|
|
import HapiUI
|
|
import SwiftUI
|
|
|
|
/// App-side mapping of the persisted `ThemeMode` (HapiClient, SwiftUI-free)
|
|
/// onto SwiftUI: the HapiUI palette RootView injects and the
|
|
/// `preferredColorScheme` override that keeps system chrome (bars, sheets,
|
|
/// system-colored surfaces) in step with an explicit choice.
|
|
extension ThemeMode {
|
|
/// `nil` = follow the system; explicit modes force the matching scheme
|
|
/// (OLED is a dark variant).
|
|
var preferredColorScheme: ColorScheme? {
|
|
switch self {
|
|
case .system: return nil
|
|
case .light: return .light
|
|
case .dark, .oled: return .dark
|
|
}
|
|
}
|
|
|
|
/// The HapiUI palette for this mode under the current system scheme:
|
|
/// `.system` follows it, explicit modes override, OLED = dark palette on
|
|
/// pure black.
|
|
func hapiTheme(systemColorScheme: ColorScheme) -> HapiTheme {
|
|
switch resolvedAppearance(systemIsDark: systemColorScheme == .dark) {
|
|
case .light: return .light
|
|
case .dark: return .dark
|
|
case .oled: return .oled
|
|
}
|
|
}
|
|
|
|
var label: String {
|
|
switch self {
|
|
case .system: return String(localized: "Follow system")
|
|
case .light: return String(localized: "Light")
|
|
case .dark: return String(localized: "Dark")
|
|
case .oled: return String(localized: "OLED black")
|
|
}
|
|
}
|
|
}
|