我已使用iOS中的本地化功能对我的应用进行了本地化,我在项目中添加了Localizable.strings文件(英语和西班牙语)。
到目前为止应用程序运行良好,发现了以下问题
一段时间后,将设备/模拟器切换为西班牙语,应用程序仍为英文版,反之亦然。我一直在记录以下
NSLog(@"Preferred Language : %@", [[NSLocale preferredLanguages] objectAtIndex:0]);
NSLog(@"Locale Identifier : %@", [[NSLocale currentLocale] localeIdentifier]);
NSLog(@"NSUserDefaults AppleLanguages : %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]);
在应用程序到达此问题之前,有以下输出
Preferred Language : en
Locale Identifier : en_US
NSUserDefaults AppleLanguages : (
en,
es,
de,
fr,
ja,
nl,
it,
pt,
"pt-PT",
da,
fi,
nb,
sv,
ko,
"zh-Hans",
"zh-Hant",
ru,
pl,
tr,
uk,
ar,
hr,
cs,
el,
he,
ro,
sk,
th,
id,
ms,
"en-GB",
ca,
hu,
vi
)
然后过了一会儿(即使我已成功切换语言)再次切换应用程序以使AppleLanguages
中的NSUserDefaults
数组只有一种语言,在这种情况下是英语(en)。
Preferred Language : en
Locale Identifier : en_US
NSUserDefaults AppleLanguages : (
en
)
这导致应用程序按唯一首选语言显示,这是AppleLanguages
数组中的第一个元素。
到目前为止,我没有在代码中的任何位置更改或修改AppleLanguages
中的NSUserDefaults
数组。我唯一要强制的是使用以下代码为bundle
文件加载英语Localizable.string
NSBundle *englishBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]];
NSString *localizedString = NSLocalizedStringFromTableInBundle(@"Key to localize", nil, englishBundle, @"");
我评论这段代码认为可能会弄乱NSUserDefaults AppleLanguages
数组,但问题仍然存在。我想知道究竟是什么导致了这个问题,或者我可能在项目配置中遗漏了什么。
编辑(1)
到目前为止,我发现存储应用的Info.plist
属性的NSUserDefaults
文件由于某种原因仅使用一种语言项保存AppleLanguages
,而不管整个代码我没有覆盖AppleLanguages
数组。
暂时我在applicationDidEnterBackground
[[NSUserDefaults standardDefaults] setObject:nil forKey:@"AppleLanguages"];
[[NSUserDefaults standardDefaults] synchronize];
通过执行上述解决方法,我强制该应用始终从AppleLanguages
文件中删除Info.plist
,到目前为止,我发现此问题仅发生在iOS 7.0
到iOS 7.02
{1}},我还在测试不同的iOS版本,我不想假设这是一个iOS错误,但可能是我的项目中的错误配置,到目前为止我还无法识别或重现。
答案 0 :(得分:0)
也许在将语言更改为西班牙语后,您需要重新启动应用程序。
答案 1 :(得分:0)
我在我的一个项目中有这个代码:
NSString* localizedStringFromBundle(NSString *key)
{
NSBundle *bundle = [NSBundle mainBundle];
NSString *localeCode = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSString *languageCode = [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode];
NSString *localizedString = key;
BOOL found = NO;
if ([[bundle localizations] indexOfObject:languageCode] == NSNotFound &&
[[bundle localizations] indexOfObject:localeCode] == NSNotFound)
{
return [bundle localizedStringForKey:key value:nil table:@"en.lproj/Localizable"];
}
if ([[bundle localizations] indexOfObject:localeCode] != NSNotFound)
{
NSString *translationTableName = [localeCode stringByAppendingString:@".lproj/Localizable"];
localizedString = [bundle localizedStringForKey:key value:nil table:translationTableName];
found = ![localizedString isEqualToString:key];
}
if (!found)
{
NSString *translationTableName = [languageCode stringByAppendingString:@".lproj/Localizable"];
localizedString = [bundle localizedStringForKey:key value:nil table:translationTableName];
if ([localizedString isEqualToString:key])
{
localizedString = [bundle localizedStringForKey:key value:nil table:@"en.lproj/Localizable"];
}
else
NSLog(@"Missing string for key: %@, returning string: %@", key, localizedString);
}
return localizedString;
}
答案 2 :(得分:0)
在 iOS 13 或更高版本中,可以通过“设置”应用在“每个应用”上进行语言选择。
New features available with iOS 13:
<块引用>每个应用的语言选择
使用与您的系统语言不同的语言的第三方应用。