为什么我的iOS应用程序只在第一次运行时正确检测当前语言?
我正在本地化我的iOS应用程序,在模拟器中,它每次都以我选择的语言正确运行 在我的iPhone 5上进行测试时,它只在应用程序第一次运行时正确检测语言。每隔一次,当我在设备上重新编译和运行我的应用程序时,它会检测到“en”作为语言,即使我在测试时选择了Español(“es”) 我使用以下方法检测语言:为什么我的iOS应用程序只在第一次运行时正确检测当前语言?,ios,xcode4,localization,Ios,Xcode4,Localization,我正在本地化我的iOS应用程序,在模拟器中,它每次都以我选择的语言正确运行 在我的iPhone 5上进行测试时,它只在应用程序第一次运行时正确检测语言。每隔一次,当我在设备上重新编译和运行我的应用程序时,它会检测到“en”作为语言,即使我在测试时选择了Español(“es”) 我使用以下方法检测语言: [[NSBundle mainBundle]首选本地化]对象索引:0] 我还使用了: [[NSLocale preferredLanguages]对象索引:0] 同样的结果 如果我在第一次运行后
[[NSBundle mainBundle]首选本地化]对象索引:0]
我还使用了:
[[NSLocale preferredLanguages]对象索引:0]
同样的结果
如果我在第一次运行后关闭应用程序,并在设备上重新启动它,它将继续正确检测语言
但是,如果我在初次运行后关闭应用程序,然后通过Xcode重新编译/重新启动,它将加载检测到的“en”(英语)
之后,除非我完全删除该应用程序,并通过Xcode重新编译/重新安装/运行该应用程序,否则停止并重新启动该应用程序将持续检测为英语。然后循环重复。。。未首先从设备中删除应用程序的情况下进行后续重建/重新启动会导致错误检测
我设备上的所有其他应用程序始终以西班牙语显示。整个UI以西班牙语显示
更新:我现在已经在同样运行iOS 6的iPad(第三代)上进行了测试,我也经历了同样的行为
更新2:
在didFinishLaunchingWithOptions中,我有以下代码来检测语言:(语言是NSString*):
language=[[NSLocale preferredLanguages]对象索引:0]代码>
接下来是这个调试语句,为了比较我得到的值,以及一种稍微不同的检测方法,只是为了调试:
NSLog(@“检测到的语言:%@/%@”,语言:[[NSBundle mainBundle]preferredLocalizations]objectAtIndex:0])代码>
当应用程序在西班牙语模式下正常工作时,输出显示为“检测到的语言:es/es”,当应用程序无法正常工作时,输出显示为“检测到的语言:en/en”。仍然不知道为什么它决定加载为英语有时
更新4:我感谢大家的回答,我尝试了各种建议。不幸的是,我无法授予+100赏金,因为这些建议似乎都无法解决问题。如果有人最终找到了一个适合我的解决方案,我会在那个时候再奖励他们+50奖金
更新5:我已经从Xcode 4.5更新到了4.5.2,并且遇到了同样的问题
更新6:我现在从头创建了一个新的测试项目,它工作得非常好!显然,我的项目的布局方式,或者其中一个数据文件中肯定有问题。我想我的下一个旅程将是从头开始重新创建项目,一个接一个地复制文件数据
更新7(几个月后):遗憾的是,在通过艰苦地重新创建我的项目暂时解决了这个问题(似乎)之后,我再次面临这个问题。在第一次加载时,语言会正确呈现,但在后续加载时,语言会恢复为英语
已解决查看我的最终解决方案。谢谢大家的帮助。我可能会分发一些奖金,因为它无论如何都会白白浪费。我在我的iPhone 5上测试了你的步骤,没有任何问题。这让我觉得这里还有其他因素在起作用:很可能是有东西干扰了您读取区域设置值的方式
我建议您采取以下步骤来帮助调试此问题:
发布获取首选语言值的方法的完整代码。确保每次运行应用程序时都执行该方法
确保您发布的代码包含用于测试语言设置的NSLog指令的位置
第一次运行后,您是否将首选语言存储在其他地方
您是否偶然使用NSUserDefaults保存与语言相关的内容
查看您的模拟器应用程序目录->库->首选项->.plist
有关设置语言的NSUserDefaults方法的说明,请参见
也许您只是保存了您的语言,因此检测只返回保存的值。请尝试以下代码:
定位系统===
#import <Foundation/Foundation.h>
#define AMLocalizedString(key, comment) \
[[LocalizationSystem sharedLocalSystem] localizedStringForKey:(key) value:(comment)]
#define LocalizationSetLanguage(language) \
[[LocalizationSystem sharedLocalSystem] setLanguage:(language)]
#define LocalizationGetLanguage \
[[LocalizationSystem sharedLocalSystem] getLanguage]
#define LocalizationReset \
[[LocalizationSystem sharedLocalSystem] resetLocalization]
@interface LocalizationSystem : NSObject {
NSString *language;
}
+ (LocalizationSystem *)sharedLocalSystem;
//gets the string localized
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment;
//sets the language
- (void) setLanguage:(NSString*) language;
//gets the current language
- (NSString*) getLanguage;
//resets this system.
- (void) resetLocalization;
@end
正如您所提到的,这段代码工作得非常完美。
它对我有效,如果你想查看(HueShapes),游戏现在是live app store。在设置->常规->国际中,有一个设置位置语言等的选项。如果你将它设置为你试图测试的语言,如果你的代码正确,它将工作。我在几个月后终于解决了这个问题!感谢所有人的帮助(我还通过开发频道与一位苹果开发人员进行了多次交流)。
TL;DR:我使用我的应用程序的iCloud键值存储(通过MKiCloudSync)在设备之间意外地同步了语言首选项(以及许多其他意想不到的事情)!继续读
我正在使用名为MKiCloudSync的第三方类,它有助于将[NSUserDefaults standardUserDefaults]
同步到我的应用程序的iCloud键值存储。当我开始使用它时,我的意图是让它在后台处理一些用户收藏夹的同步
然而,由于不了解standardUserDefaults
的工作原理,我没有意识到除了我自己的自定义应用程序设置之外,还有很多其他东西正在写入standardUserDefaults
发生的事情是这样的:
第一次启动应用程序。FreshstandardUserDefaults
已就位,根据当前设备选择,存储语言首选项有序列表的内部“AppleLanguages”键是正确的
美联社
#import "LocalizationSystem.h"
@implementation LocalizationSystem
//Singleton instance
static LocalizationSystem *_sharedLocalSystem = nil;
//Current application bundle to get the languages.
static NSBundle *bundle = nil;
+ (LocalizationSystem *)sharedLocalSystem{
@synchronized([LocalizationSystem class])
{
if (!_sharedLocalSystem){
[[self alloc] init];
}
return _sharedLocalSystem;
}
// to avoid compiler warning
return nil;
}
+(id)alloc{
@synchronized([LocalizationSystem class])
{
NSAssert(_sharedLocalSystem == nil, @"Attempted to allocate a second instance of a singleton.");
_sharedLocalSystem = [super alloc];
return _sharedLocalSystem;
}
// to avoid compiler warning
return nil;
}
- (id)init{
if ((self = [super init]))
{
//empty.
bundle = [NSBundle mainBundle];
}
return self;
}
// Gets the current localized string as in NSLocalizedString.
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment{
return [bundle localizedStringForKey:key value:comment table:nil];
}
// If this function is not called it will use the default OS language.
// If the language does not exists y returns the default OS language.
- (void) setLanguage:(NSString*) l{
NSLog(@"preferredLang: %@", l);
NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ];
if (path == nil)
//in case the language does not exists
[self resetLocalization];
else
bundle = [[NSBundle bundleWithPath:path] retain];
[[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:l, nil] forKey:@"AppleLanguages"];
}
// Just gets the current setted up language.
// returns "es","fr",...
//
// example call:
// NSString * currentL = LocalizationGetLanguage;
- (NSString*) getLanguage{
NSArray* languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
NSString *preferredLang = [languages objectAtIndex:0];
return preferredLang;
}
// Resets the localization system, so it uses the OS default language.
//
// example call:
// LocalizationReset;
- (void) resetLocalization{
bundle = [NSBundle mainBundle];
}
@end