iOS本地化、模拟器和设备始终使用Base.lproj,而不是用户首选的语言环境
我正在创建一个应用程序,目前我想用英语和德语提供。我检查了项目配置中的基本本地化标记,并添加了iOS本地化、模拟器和设备始终使用Base.lproj,而不是用户首选的语言环境,ios,swift,xcode,dictionary,localization,Ios,Swift,Xcode,Dictionary,Localization,我正在创建一个应用程序,目前我想用英语和德语提供。我检查了项目配置中的基本本地化标记,并添加了德语。我把英语作为发展语言 然后我创建了一个文件Translation.plist,它基本上由我称之为类别的字典组成,例如,我有一个按钮文本、标签文本等的字典。每个类别字典同样由包含两个字符串的字典组成:值和注释。Translation.plist通过XCode进行本地化。文件夹Base.lproj、en.lproj和de.lproj存在,并按预期包含plist文件的副本 然后我创建了一个类Transl
德语
。我把英语作为发展语言
然后我创建了一个文件Translation.plist
,它基本上由我称之为类别的字典组成,例如,我有一个按钮文本、标签文本等的字典。每个类别字典同样由包含两个字符串的字典组成:值和注释。Translation.plist通过XCode
进行本地化。文件夹Base.lproj
、en.lproj
和de.lproj
存在,并按预期包含plist文件的副本
然后我创建了一个类Translator.swift
,该类根据用户的首选语言环境将Translation.plist
文件作为NSDictionary
加载。代码如下所示:
func relevantDictionary(category: String) -> NSDictionary {
let preferredLocale = Bundle.main.preferredLocalizations.first ?? "Base"
NSLog("User's preferred locale is \(preferredLocale)")
guard let url = Bundle.main.url(forResource: "Translation", withExtension: "plist") else {
fatalError("Could not find Translation.plist")
}
NSLog("Using \(url.absoluteURL) for translation")
guard let root = NSDictionary(contentsOf: url) else {
fatalError("Could not find dictionary for category (locale=\(preferredLocale)")
}
guard let relevant = root.value(forKey: category) as? NSDictionary else {
fatalError("Could not create dictionary from Translation.plist")
}
return relevant
}
然后,我创建了一个使用转换器的字符串扩展,如下所示:
func localize(category: String) -> String {
return Translator.instance.translate(category: category, string: self)
}
有了这个,我用“是”来称呼翻译人员。本地化(“按钮”)。在英语中我期望“是”,在德语中我期望“是”。日志上说:
2017-07-05 08:45:24.728 myApp[13598:35048360]用户首选的语言环境是Deu de
2017-07-05 08:45:24.728 myApp[13598:35048360]使用file:///Users/me/Library/Developer/CoreSimulator/Devices/A39D3318-943D-4EFE-BB97-5C2218279132/data/Containers/Bundle/Application/4614E696-B52E-4C30-BBE8-3C76F6392413/myApp.app/Base.lproj/Translation.plist 翻译
我想知道为什么会这样,我错过了什么。我本以为加载的是de.lproj/Translation.plist
,而不是Base.lproj/Translation.plist
非常感谢您的帮助。您可以使用单个.plist文件来完成此操作。您不需要为它创建不同的.plist文件
Firstly, Add English and German countries with locale in Project -> info
https://i.stack.imgur.com/M4QIY.png
Once, you added countries with locale in Project -> info then add localizable.strings file in your bundle.
https://i.stack.imgur.com/lnjgL.png
At the end, just add country's locale in your language support class.
NSArray* languages = @[@"en", @"de"];`enter code here`
NSString *current = [languages objectAtIndex:0];
[self setLanguage:current];
希望它能对您有所帮助。您首先为什么要创建自己的plist文件?你应该使用
.strings
文件,不是吗?当我使用plist文件时,我感觉更舒服、更灵活。在如何组织本地化方面,它们更强大。这意味着,即使只需要一种语言,我也必须加载所有语言。对我来说,这似乎是昂贵的内存使用,对吗?无论如何,是否可以加载本地化的plist文件?如果是,怎么做?@Martin,这在内存使用方面并不昂贵。我可以用包含区域设置的文件名为每种语言创建一个文件,并根据用户首选的区域设置加载正确的文件。这样,我只需加载所需的内容。无论如何,谢谢你的提示。:)