import SwiftUI /// 全 App 统一的 AI 免责声明(上架合规:医疗类内容必须声明不做诊断)。 /// 任何展示 AI 生成的归纳/解读/建议文本的地方,都应在结果末尾附上 `AIDisclaimerFooter`; /// 离开 App 的文本(复制/分享)用 `AIDisclaimer.appended(to:)` 把声明带上。 enum AIDisclaimer { /// 面向用户展示的完整声明文本(随「我的 · 语言」本地化)。 /// 注意:必须是**单个** `String(appLoc:)` key(勿再用字符串拼接),否则无法整句进 String Catalog 翻译; /// 且展示处用 `Text(AIDisclaimer.text)`(传 String 变量),SwiftUI 不会再做本地化 —— 这里先本地化好。 static var text: String { String(appLoc: "本内容由本机本地 AI 依据你录入的健康记录自动归纳整理,仅供个人健康管理与就医沟通参考,不构成医学诊断、治疗建议或专业医疗意见;具体健康问题请咨询执业医师。") } /// 复制/分享时把声明追加到正文末尾(分隔线 + 声明),让文本离开 App 也带着免责。 static func appended(to body: String) -> String { let trimmed = body.trimmingCharacters(in: .whitespacesAndNewlines) return "\(trimmed)\n\n———\n\(text)" } } /// AI 结果下方的免责声明脚注:小字、弱色、信息图标。放在任何 AI 生成文本块末尾。 struct AIDisclaimerFooter: View { var body: some View { HStack(alignment: .top, spacing: 6) { Image(systemName: "info.circle") .font(.tjScaled( 10)) .foregroundStyle(Tj.Palette.text3) Text(AIDisclaimer.text) .font(.tjScaled( 10)) .lineSpacing(2) .foregroundStyle(Tj.Palette.text3) .fixedSize(horizontal: false, vertical: true) } .frame(maxWidth: .infinity, alignment: .leading) } }