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
refs
?xgqfrms 2012-2020
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有??xgqfrms, 禁止转载 ???,侵权必究??!