【问题标题】:iOS app is not being localized as per selected languageiOS 应用程序未根据所选语言进行本地化
【发布时间】:2014-04-11 11:30:52
【问题描述】:

我已经使用 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
) 

然后过了一会儿(即使我已经成功切换了语言)当再次切换应用程序以西班牙语时,NSUserDefaults 中的 AppleLanguages 数组只有一种语言,在这种情况下为英语(en)。

Preferred Language : en
Locale Identifier : en_US
NSUserDefaults AppleLanguages : (
en
)

这会导致应用程序按照唯一的首选语言显示,这是AppleLanguages 数组中的第一个元素。 到目前为止,我没有在代码中的任何位置更改或修改 NSUserDefaults 中的 AppleLanguages 数组。我唯一强迫的是使用以下代码为Localizable.string 文件加载英文bundle

NSBundle *englishBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]]; 
NSString *localizedString = NSLocalizedStringFromTableInBundle(@"Key to localize", nil, englishBundle, @"");

我评论了这段代码,认为这可能会弄乱NSUserDefaults AppleLanguages 数组,但问题仍然存在。我想知道究竟是什么导致了这个问题,或者我是否在项目配置中遗漏了一些东西。

编辑(1)

到目前为止,我发现存储应用程序 NSUserDefaults 属性的 Info.plist 文件出于某种原因仅使用一种语言项保存 AppleLanguages,而不管在整个代码中我没有覆盖AppleLanguages 数组。

我暂时在applicationDidEnterBackground中添加了以下代码

[[NSUserDefaults standardDefaults] setObject:nil forKey:@"AppleLanguages"];
[[NSUserDefaults standardDefaults] synchronize];

通过执行上述解决方法,我已强制应用程序始终从 Info.plist 文件中删除 AppleLanguages,到目前为止,我发现此问题仅发生在 iOS 7.0iOS 7.02 中,我仍在测试不同的 iOS 版本,我不想假设这是一个 iOS 错误,但可能是我的项目中的错误配置,到目前为止我还无法识别或重现。

【问题讨论】:

标签: ios objective-c localization nsuserdefaults


【解决方案1】:

可能在将语言更改为西班牙语后,您需要重新启动应用程序。

【讨论】:

  • 更改语言时应用正在自动重启。
【解决方案2】:

我的一个项目中有这段代码:

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;
}

【讨论】:

  • 谢谢,但注意到您的解决方案是使用 currentLocale 而不是 preferredLanguages 我认为正确的方法是使用用户首选语言本地化应用程序,对于数字格式使用区域/语言环境。
【解决方案3】:

在 iOS 13 或更高版本中,可以通过“设置”应用在“每个应用”上进行语言选择。

New features available with iOS 13:

每个应用程序的语言选择

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多