我知道苹果建议使用首选语言设置中的本地化,但我有一个重要的原因不遵循此建议。
如何将俄语本地化设置为默认值?
Localization native development region
关键字。请参考这里的文档。CFBundleDevelopmentRegion
的值。
CFBundleDevelopmentRegion(字符串 - iOS,OS X)指定了包的本地区域。该键包含一个字符串值,通常对应于编写包的人的本地语言。如果无法为用户优选的区域或语言找到资源,则使用此值指定的语言作为默认语言。
如果你真的想要和需要覆盖操作系统的语言优先级,你可以使用 AppleLanguages
用户默认键(尽管,如你所知,这不被推荐):
[[NSUserDefaults standardUserDefaults] setObject:@[@“ru”, @“en”] forKey:@“AppleLanguages”];
AppleLanguages
键可能会出现问题。您可能需要非常早地设置它,例如在main()函数中。 - eofster NSBundle.mainBundle.preferredLanguages 为 [ "en"] 。 在我使用 CFBundleLocalizations
键指定应用程序本地化语言之后,它们变成了俄语。
CFBundleLocalizations(数组 - iOS、OS X)标识了您的应用程序手动处理的本地化。如果您的可执行文件未捆绑或不使用现有的包本地化机制,则可以包含此键以指定您的应用程序处理的本地化。该属性数组中的每个条目都是一个字符串,用于标识受支持的本地化的语言名称或 ISO 语言代码。有关如何指定语言代码的信息,请参阅国际化和本地化指南中的“语言和区域设置指定”部分的国际化文档。
Make subclass of UIApplication as described here: Subclass UIApplication with Swift
Second override init
method of you UIApplication
subclass to substitute list of preferred languages on your own.
override init() {
if let languages = NSUserDefaults.standardUserDefaults().objectForKey("AppleLanguages") as? [String],
let language = languages.first where !language.hasPrefix("en")
{
NSUserDefaults.standardUserDefaults().setObject(["ru", "en"], forKey: "AppleLanguages")
}
super.init()
}
Swift 4:
override init() {
if let languages = UserDefaults.standard.object(forKey: "AppleLanguages") as? [String],
let language = languages.first(where:{!$0.hasPrefix("en")})
{
UserDefaults.standard.set(["ru", "en"], forKey: "AppleLanguages")
}
super.init()
}
That's all. If first preferred language is not English you'll substitute list with Russian as first language.
顺便提一句,如果你不仅仅是进行本地化工作,还要进行国际化,请注意检查所使用的日期选取器、日期格式化程序、数字格式化程序等所使用的语言环境。
我还没有找到合适的解决方案。唯一适用于我的问题的方法是使用NSLocalizedStringFromTableInBundle
替代NSLocalizedString
。虽然这种方法不允许本地化图像或nibs文件,但对于字符串来说效果非常好。
首先,您需要定义当前设备语言:
NSString *lang = (NSString *)[[NSLocale preferredLanguages] objectAtIndex:0];
接下来找到该语言的包:
NSBundle *myLangBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:lang ofType:@"lproj"]];
NSLocalizedStringFromTableInBundle
中使用它:_label.text = NSLocalizedStringFromTableInBundle(@"LabelText",nil,myLangBundle,nil);
preferredLanguages有时会返回"ru_RU",但我的lproj文件是ru.lproj。所以我决定采用其他解决方案。 我在所有的本地化字符串文件中添加了"test.lang.phrase = "YES";"。如果找不到本地化,我会加载默认的本地化。
NSString *result = nil;
NSString *testLang = NSLocalizedString(@"test.lang.phrase", nil);
if ([testLang isEqualToString:@"YES"]) {
result = NSLocalizedString(str, nil);
}
if (!result) {
NSBundle *myLangBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]];
result = NSLocalizedStringFromTableInBundle(str, nil, myLangBundle,nil);
}