Files
kangkang/康康/Models/HealthExport.swift
link2026 d2c77d5c51 feat: 国际化(i18n) en/ja/ko + App 内语言切换
主体:多语言支持(简体中文源 + 英/日/韩)
- 基础设施:Localizable.xcstrings(String Catalog,sourceLanguage=zh-Hans)
  + pbxproj developmentRegion/knownRegions 注册 en/ja/ko
- 全部硬编码 Locale("zh_CN") → Locale.current;中文 dateFormat → Date.FormatStyle(跟随系统)
- UI 中文字面量统一为 String(appLoc:)(显式绑定所选语言 bundle+locale,即时切换)
  Text 字面量走环境 \.locale + Bundle 重定向
- 549 个 catalog key 全部 en/ja/ko 翻译完成(0 未翻译)
- App 内语言切换:我的 → 语言(LanguageManager + 即时生效,无需重启)
- 双用预设(症状/监测指标/慢病)本地化:static→computed 避免缓存

注:本提交为 WIP,一并打包了并行进行的功能模块
(HealthExport 健康导出、Security/Face ID 锁、DiaryAssist 日记 AI 辅助)
及 App 图标、CLAUDE.md、docs/scripts。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 10:28:24 +08:00

69 lines
2.4 KiB
Swift

import Foundation
import SwiftData
/// = HealthExport
///
/// Indicator/Report `[String]` ( SwiftData
/// ),,
///
/// @Model(Indicator/ChatTurn ):
/// default, `init`
@Model
final class HealthExport {
var prompt: String
var content: String
var createdAt: Date
// (§3.3 RAG ,W3 )
var referencedIndicatorIDs: [String]
var referencedReportIDs: [String]
var referencedSymptomIDs: [String]
var referencedDiaryIDs: [String]
// ,,
var inferredTimeFromDate: Date?
var inferredTimeToDate: Date?
var inferredIntent: String?
// demo
/// tag, "Qwen3-1.7B-4bit"
var modelTag: String
/// tok/s, demo #6 Live Activity
var decodeRate: Double
init(prompt: String = "",
content: String = "",
createdAt: Date = .now,
referencedIndicatorIDs: [String] = [],
referencedReportIDs: [String] = [],
referencedSymptomIDs: [String] = [],
referencedDiaryIDs: [String] = [],
inferredTimeFromDate: Date? = nil,
inferredTimeToDate: Date? = nil,
inferredIntent: String? = nil,
modelTag: String = "Qwen3-1.7B-4bit",
decodeRate: Double = 0) {
self.prompt = prompt
self.content = content
self.createdAt = createdAt
self.referencedIndicatorIDs = referencedIndicatorIDs
self.referencedReportIDs = referencedReportIDs
self.referencedSymptomIDs = referencedSymptomIDs
self.referencedDiaryIDs = referencedDiaryIDs
self.inferredTimeFromDate = inferredTimeFromDate
self.inferredTimeToDate = inferredTimeToDate
self.inferredIntent = inferredIntent
self.modelTag = modelTag
self.decodeRate = decodeRate
}
}
extension HealthExport {
/// / strip prompt ( 30 + ...)
var promptPreview: String {
let trimmed = prompt.trimmingCharacters(in: .whitespacesAndNewlines)
if trimmed.count <= 30 { return trimmed }
return trimmed.prefix(30) + ""
}
}