Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的iOS应用程序只在第一次运行时正确检测当前语言?_Ios_Xcode4_Localization - Fatal编程技术网

为什么我的iOS应用程序只在第一次运行时正确检测当前语言?

为什么我的iOS应用程序只在第一次运行时正确检测当前语言?,ios,xcode4,localization,Ios,Xcode4,Localization,我正在本地化我的iOS应用程序,在模拟器中,它每次都以我选择的语言正确运行 在我的iPhone 5上进行测试时,它只在应用程序第一次运行时正确检测语言。每隔一次,当我在设备上重新编译和运行我的应用程序时,它会检测到“en”作为语言,即使我在测试时选择了Español(“es”) 我使用以下方法检测语言: [[NSBundle mainBundle]首选本地化]对象索引:0] 我还使用了: [[NSLocale preferredLanguages]对象索引:0] 同样的结果 如果我在第一次运行后

我正在本地化我的iOS应用程序,在模拟器中,它每次都以我选择的语言正确运行

在我的iPhone 5上进行测试时,它只在应用程序第一次运行时正确检测语言。每隔一次,当我在设备上重新编译和运行我的应用程序时,它会检测到“en”作为语言,即使我在测试时选择了Español(“es”)

我使用以下方法检测语言:

[[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

    发生的事情是这样的:

  • 第一次启动应用程序。Fresh
    standardUserDefaults
    已就位,根据当前设备选择,存储语言首选项有序列表的内部“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