iOS App 默认语言“en”未应用

Posted

技术标签:

【中文标题】iOS App 默认语言“en”未应用【英文标题】:iOS App default Language "en" is not applied 【发布时间】:2013-11-27 11:29:26 【问题描述】:

在 Xcode 4.6.3 中,我设置了“本地化原生开发区域”=en。

我为我的应用提供西班牙语、英语和俄语语言环境。

不幸的是,当我将 Iphone 模拟器的语言设置为例如“德语”时 我的应用程序使用西班牙语言环境。

我怀疑是因为我有一台“西班牙电脑”。

但是,如果我的应用程序不提供他们的语言环境,我希望我的应用程序的客户能够使用英语。

我怎样才能确保这一点?

我注意到一件事。在“复制捆绑资源”选项卡中,我看到我的其他 Localizable.strings 文件显示为红色。但我知道,尽管部署了红色,但他们仍在……

【问题讨论】:

我认为值应该是“English”而不是“en” 感谢您的评论。你说得对,我用“英语”更新了应用程序,但仍然没有运气! 【参考方案1】:

应用程序的实际语言具有动态特性,因为它依赖于设备设置中的动态列表。 ios 将失败并选择第一种支持的语言。

让我们考虑一些应用程序支持“en”和“ru”。尽管“en”是葡萄牙语区域​​设置更可取的语言,但仍将选择“ru”,因为它在设备设置中的位置高于下面屏幕截图中的“en”。

【讨论】:

感谢@Pavel Osipov,你为我节省了很多时间【参考方案2】:

我的一个应用也遇到了同样的问题。我所做的是强制 en 作为 AppleLanguages 中的第二语言,它现在正在工作。您必须在应用程序启动之前执行此操作(主要)。这有点丑陋,但现在可以使用(NSLocalizedString 正在查看该列表以确定语言)......但你必须小心,因为在你这样做之后你可能会从 NSLocale 得到一些奇怪的东西。例如,如果您想使用 -displayNameForKey:value: 它不会同步,您必须重新启动应用程序才能获得正确的结果。所以你可以做的是用 [NSLocale preferredLanguages] (NSLocale *currentLocale = [[NSLocale alloc] initWithLocaleIdentifier:[NSLocale preferredLanguages][0]];) 中的第一个元素初始化 NSLocale,然后它会返回预期的结果。

您必须执行以下操作来交换语言:

// remove what was previously stored in NSUserDefaults (otherwise the previously selected language will be still the first one in the list and your app won't be localized in the language selected in settings)
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; // make the change immediate

// reorder the languages so English is always the default fallback
NSMutableArray *mutableLanguages = [[NSLocale preferredLanguages] mutableCopy];
NSInteger enIndex = NSNotFound;
for (NSString *lang in mutableLanguages)  if ([lang isEqualToString:@"en"])  enIndex = [mutableLanguages indexOfObject:lang]; break;  
@try 
    if ((enIndex != 0) && (enIndex != 1))  [mutableLanguages exchangeObjectAtIndex:1 withObjectAtIndex:enIndex]; 
 @catch (NSException *exception) 


// save the changes
[[NSUserDefaults standardUserDefaults] setObject:mutableLanguages forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; // to make the change immediate

return UIApplicationMain(argc, argv, nil, NSStringFromClass([YourAppDelegate class]));

【讨论】:

好吧,我有点害怕使用这个 hack。您是否解释了为什么 IOS 没有选择“本地化本地开发区域”中给出的正确语言环境。我使用“en”的值,因为该文件夹称为 en.lproj 我不知道为什么它不使用默认的后备...从某些时候(不知道他们何时开始使用)后备语言只是“首选语言”中的第二种语言数组...这就是为什么我首先开始使用这个 hack。 根据文档 (developer.apple.com/library/ios/documentation/MacOSX/Conceptual/…) 这实际上是默认行为 - 如果您的列表有“de”和“es”作为后备,如果您不这样做,应用程序将显示在“es”中t 支持“es”,那么它将在“en”中,即“软件开发过程中使用的本地化”。 不,我的意思是您从 [NSLocale preferredLanguages] 获得的数组的顺序。顺序在手机的设置应用程序中是一样的。这就是为什么如果您选择德语,然后选择波兰语,则翻译为德语。如果您选择英语,更改手机的语言,然后将其更改为波兰语并假设您有 en.lproj,您的应用程序将被翻译成英语而不是德语,但如果您选择德语并在波兰语之后,那么您的应用程序将被翻译成德语而不是英语。 我已经在我的 main.m 文件上尝试过,但没有工作..第一次我 lanuch 然后它在第二次启动后没有转换它正在工作

以上是关于iOS App 默认语言“en”未应用的主要内容,如果未能解决你的问题,请参考以下文章

iOS8开始默认语言有变化

iOS8開始默认语言有变化

如何为 iOS 应用设置默认本地化

Xamarin.Forms:UWP 应用的本地化

iOS App图标未出现在屏幕上

iOS:复数和自定义语言环境