iOS应用未根据所选语言进行本地化

时间:2014-03-08 04:21:55

标签: ios objective-c localization nsuserdefaults

我已使用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.0iOS 7.02 {1}},我还在测试不同的iOS版本,我不想假设这是一个iOS错误,但可能是我的项目中的错误配置,到目前为止我还无法识别或重现。

3 个答案:

答案 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:

<块引用>

每个应用的语言选择

使用与您的系统语言不同的语言的第三方应用。