Add English localization (device-language based)

Add English as an overlay localization following the device language,
keeping Simplified Chinese as the base/development language. Untranslated
strings fall back to Chinese automatically.

- project.yml: set developmentLanguage zh-Hans and knownRegions (zh-Hans/en/Base)
- Resources/en.lproj/{Localizable,InfoPlist}.strings: ~230 English strings
- Resources/zh-Hans.lproj/InfoPlist.strings: Chinese permission prompts
- Restructure ternary Text/Label and String-typed UI messages so they
  localize (String(localized:), LocalizedStringKey helper params); replace
  a .contains("通过") success check with a dedicated flag
- Localize user-facing model/coordinator/error messages across App and Shared

Internal RuntimeLogger logs and diagnostic/report bodies remain in Chinese.
This commit is contained in:
Syntax-Error-1337
2026-09-10 01:05:45 +08:00
parent eadeca636d
commit 908ac8f734
17 changed files with 493 additions and 121 deletions
+16 -16
View File
@@ -301,7 +301,7 @@ struct MapHomeView: View {
}
} message: {
Text(
"你正在使用 \(communityContributionClient?.name ?? "第三方客户端")。点击“去提交”会先复制投稿模板,并在 App 内打开社区页面。采纳后将收录到 README,可选择是否匿名署名。"
"你正在使用 \(communityContributionClient?.name ?? String(localized: "第三方客户端"))。点击“去提交”会先复制投稿模板,并在 App 内打开社区页面。采纳后将收录到 README,可选择是否匿名署名。"
)
}
.alert("已复制投稿模板", isPresented: $showCommunityTemplateCopied) {
@@ -483,7 +483,7 @@ struct MapHomeView: View {
// 当前选点
HStack {
VStack(alignment: .leading, spacing: 3) {
Text(mapState.displayName ?? "当前选点").font(.subheadline.weight(.semibold)).lineLimit(1)
Text(mapState.displayName ?? String(localized: "当前选点")).font(.subheadline.weight(.semibold)).lineLimit(1)
coordinateRow(label: "GCJ-02(国内)", system: .gcj02)
coordinateRow(label: "WGS-84(国际)", system: .wgs84)
}
@@ -496,7 +496,7 @@ struct MapHomeView: View {
activeTip = .deactivation
}
} label: {
Text(spoofState == .active ? "无法生效?" : "无法取消?")
(spoofState == .active ? Text("无法生效?") : Text("无法取消?"))
.font(.system(size: 10, weight: .medium))
.foregroundStyle(.secondary)
.padding(.horizontal, 8)
@@ -520,7 +520,7 @@ struct MapHomeView: View {
.buttonStyle(.plain)
.foregroundStyle(favorites.selectedFavoriteID != nil ? .orange : .gray)
.disabled(favoriteSaveTask != nil)
.accessibilityLabel(favorites.selectedFavoriteID != nil ? "已收藏,点击取消收藏" : "收藏当前选点")
.accessibilityLabel(favorites.selectedFavoriteID != nil ? Text("已收藏,点击取消收藏") : Text("收藏当前选点"))
}
// 收藏
if favorites.favorites.isEmpty {
@@ -537,7 +537,7 @@ struct MapHomeView: View {
if spoofState == .verifying {
ProgressView().tint(.white)
}
Text(spoofState == .active && needsSwitchButton ? "关闭" : buttonTitle)
(spoofState == .active && needsSwitchButton ? Text("关闭") : Text(buttonTitle))
.font(.headline).lineLimit(1)
}
.frame(maxWidth: needsSwitchButton ? nil : .infinity)
@@ -585,15 +585,15 @@ struct MapHomeView: View {
private var buttonTitle: String {
if runtimeMode.mode == .thirdParty {
switch spoofState {
case .idle: return "同步到第三方代理"
case .verifying: return "检测并同步中…"
case .active: return "停止第三方虚拟定位"
case .idle: return String(localized: "同步到第三方代理")
case .verifying: return String(localized: "检测并同步中…")
case .active: return String(localized: "停止第三方虚拟定位")
}
}
switch spoofState {
case .idle: return "开始虚拟定位"
case .verifying: return "验证环境中…"
case .active: return "停止虚拟定位"
case .idle: return String(localized: "开始虚拟定位")
case .verifying: return String(localized: "验证环境中…")
case .active: return String(localized: "停止虚拟定位")
}
}
@@ -856,7 +856,7 @@ struct MapHomeView: View {
}
private func coordinateRow(
label: String,
label: LocalizedStringKey,
system: CoordinateConverter.MapCoordinateSystem
) -> some View {
let coordinate = currentSelectionPair.coordinate(for: system)
@@ -1091,7 +1091,7 @@ struct MapHomeView: View {
"请求动作": "WLOC query",
"错误": response.error ?? "未知错误"
])
setup.requestThirdPartySetup(message: response.error ?? "第三方代理查询失败")
setup.requestThirdPartySetup(message: response.error ?? String(localized: "第三方代理查询失败"))
}
} catch {
spoofState = .idle
@@ -1144,7 +1144,7 @@ struct MapHomeView: View {
"Wi-Fi接口": String(net.isWiFiEnabled)
])
activeTip = nil
setup.requestSetup(message: "当前未连接可用的 Wi-Fi,请连接 Wi-Fi 后配置 127.0.0.1:8888 手动代理。")
setup.requestSetup(message: String(localized: "当前未连接可用的 Wi-Fi,请连接 Wi-Fi 后配置 127.0.0.1:8888 手动代理。"))
return
}
@@ -1517,7 +1517,7 @@ struct MapHomeView: View {
}
searchResults = (response?.mapItems ?? []).prefix(6).map { item in
let r = SearchLocationResult(
name: item.name ?? "未命名",
name: item.name ?? String(localized: "未命名"),
subtitle: [item.placemark.locality, item.placemark.subLocality, item.placemark.thoroughfare]
.compactMap { $0 }
.filter { !$0.isEmpty }
@@ -1529,7 +1529,7 @@ struct MapHomeView: View {
])
return r
}
if searchResults.isEmpty { searchError = "没有找到相关地点" }
if searchResults.isEmpty { searchError = String(localized: "没有找到相关地点") }
}
}
}