Ios 如何动态更改本地化SwiftUI
如何在SwiftUI中动态更改应用程序的本地化 我认为我们可以使用下面的代码,但我们应该找到快捷的方法Ios 如何动态更改本地化SwiftUI,ios,swift,swiftui,Ios,Swift,Swiftui,如何在SwiftUI中动态更改应用程序的本地化 我认为我们可以使用下面的代码,但我们应该找到快捷的方法 func localized(_ lang:String) -> String { let path = Bundle.main.path(forResource: lang, ofType: "lproj") let bundle = Bundle(path: path!) return NSLocalizedString(self, tableName:
func localized(_ lang:String) -> String {
let path = Bundle.main.path(forResource: lang, ofType: "lproj")
let bundle = Bundle(path: path!)
return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "")
}}
首先,我们应该创建2个
Localizable.strings
文件,在我的例子中是en和ru
我们应该存储当前的语言对象,我在UserSettings
中选择storeit属性,就像observeObject
class UserSettings: ObservableObject {
@Published var lang: String = "ru"
var bundle: Bundle? {
let b = Bundle.main.path(forResource: lang, ofType: "lproj")!
return Bundle(path: b)
}
}
我们可以在SceneDelegate.swift
中使用类似.environmentObject()
的设置对象,这样层次结构中的每个视图都将更新
var settings = UserSettings()
// ...
= UIHostingController(rootView: contentView.environmentObject(settings))
在视图中
我们可以获得理想的行为,注意我们应该在文本
初始化中指定捆绑
struct ContentView: View {
@EnvironmentObject var settings: UserSettings
var body: some View {
VStack {
Text("App", bundle: settings.bundle)
}
}
}
现在我可以在应用程序中的某个地方更改语言,下面是一个示例循环示例,您可以在场景中调用此函数changeLanguage()
(\uscene:,willConnectTo:,options connectionOptions:)
,并且每3秒更改一次语言
func changeLanguage() {
print(#function)
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.settings.lang = self.settings.lang == "ru" ? "en" : "ru"
self.changeLanguage()
}
}
@Tikhonov Alexander这是否意味着必须在每个文本元素中指定包标识符?是否有一种简单的方法可以为所有文本元素设置此值,或者是否有另一种方法可以动态更改区域设置标识符?目前,我正在通过更改区域设置,使用预览测试其他语言
static var previews: some View {
TestView()
.environment(\.locale, Locale(identifier: "ru"))
}
我无法在Text()视图中使用“bundle:”命令,我get=>无法将“String”类型的值转换为我需要的参数类型“LocalizedStringKey”。最终在SwiftUI上下文中找到了解决方案。