SwiftUI App 支持多语种 All In One
SwiftUI App 支持多语种 All In One
zh-Hans & zh-Hant
Localizable Strings
Localizable.strings
Localizable Strings Dictionary
Localizable.stringsdict
steps
- 在 Info 的 Localizables 里添加上 英语、美式英语、
简体中文
、繁体中文
其实这个步骤可以省略,直接下一个步骤开始也可以,第三步的之后会自动添加的
-
新建 4 个Group/文件夹,en.lproj、en-US.lproj、
zh-Hans.lproj
、zh-Hant.lproj
分别表示英语、美式英语、简体中文
、繁体中文
本地化文件夹 -
在 4 个Group/文件夹下面都新建一个名为 Localizable.strings 的同名到字符串文件, 并且添加 要翻译的字符串
/*
Localizable.strings
TodoList
Created by xgqfrms on 2022/5/22.
*/
"TodoList" = "🇺🇸Todo List 📝";
/*
Localizable.strings
TodoList
Created by xgqfrms on 2022/5/22.
*/
"TodoList" = "🇨🇳待办清单 📝";
/*
Localizable.strings
TodoList
Created by xgqfrms on 2022/5/22.
*/
// validation failed: Couldn't parse property list because the input data was in an invalid format
// missing semi-colons bug ❌
// "TodoList" = "Todo List 📝"
"TodoList" = "Todo List 📝";
- View 中使用字符串,并在入口文件中指定环境(仅用于测试,实际上 app 会根据系统语言自动显示对应语言)
//
// CustomEditView.swift
// TodoList
//
// Created by xgqfrms on 2022/5/22.
//
import SwiftUI
struct CustomEditView: View {
@EnvironmentObject var listViewModel: ListViewModel;
@State private var editMode: EditMode = EditMode.inactive;
// @Environment(\.editMode) private var editMode;
var body: some View {
// 导航视图
NavigationView {
ZStack {
if (listViewModel.items.isEmpty) {
// EmptyView()
NoItemsView()
} else {
List {
ForEach(listViewModel.items) {item in
RowView(item)
}
.onDelete(perform: listViewModel.deleteItem)
.onMove(perform: listViewModel.moveItem)
}
}
}
.environment(\.editMode, $editMode)
.listStyle(PlainListStyle())
.navigationTitle(String(localized: "TodoList"))
// .navigationTitle(NSLocalizedString("TodoList", comment: "todo list comment!"))
// .navigationTitle("待办清单 📝")
// .navigationTitle("Todo List 📝")
// SwiftUI 国际化 ? language
// NSLocalizedString(<#T##key: String##String#>, comment: <#T##String#>)
// String(localized: <#T##String.LocalizationValue#>)
.navigationBarItems(
leading: Button(editMode.isEditing ? "完成": "编辑") {
switch editMode {
case .active:
self.editMode = .inactive
case .inactive:
self.editMode = .active
default:
break
}
},
trailing: NavigationLink("添加", destination: AddItemView())
// trailing: NavigationLink("Add", destination: AddItemView())
)
}
}
}
struct CustomEditView_Previews: PreviewProvider {
static var previews: some View {
CustomEditView()
}
}
import SwiftUI
@main
struct TodoListApp: App {
// 实例化 ViewModel
@StateObject var listViewModel: ListViewModel = ListViewModel();
var body: some Scene {
WindowGroup {
CustomEditView()
.environmentObject(listViewModel)
// .environment(\.locale, .init(identifier: "en"));
.environment(\.locale, .init(identifier: "en-US"));
// .environment(\.locale, .init(identifier: "zh-Hans"));
}
}
}
- 修改模拟器的语言,测试
default
OK, zh-Hans
OK, en-US
SwiftUI 国际化 & 本地化 All In One
https://www.cnblogs.com/xgqfrms/p/16297206.html
refs
©xgqfrms 2012-2025
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/16299316.html
未经授权禁止转载,违者必究!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
2021-05-22 uni-app charts All In One
2020-05-22 Azure & FaaS in Action
2020-05-22 css & focus-within & pseudo class
2020-05-22 HTML5 & canvas fingerprinting
2019-05-22 vue & npm & components & plugins
2019-05-22 CSS3 Animation & linear-gradient & css3 var & @keyframes
2019-05-22 iOS effect & swiper delete components