如何在localizable.string不存在时设置默认语言?

时间:2014-06-24 01:24:44

标签: ios objective-c localizable.strings

我知道这篇文章似乎有重复......但我已经研究过了,我找不到答案......请帮助我。

我有一个应用程序翻译为两种语言(葡萄牙语和英语),我的字符串和故事板是葡萄牙语,例如:

[[self labelTest] setText:NSLocalizedString(@"Essa é uma label", nil)];

我的资源中包含en.lproj/Localizable.stringspt.lproj/Localizable.strings

文件

本地化本机开发区域设置为" en"。

我在这里理解的是,如果用户语言是英语en.lproj被加载,何时加载葡萄牙语pt.lproj,何时是法语或任何其他语言。应该加载en.lproj,但事实并非如此。如果我将我的设备设置为西班牙语,法语或任何其他语言,我会看到葡萄牙语,我想要显示英语。

以下是我看过的帖子但仍然失败:

iOS App default Language "en" is not applied

AppStore language description and "Localization native development region"

What is the meaning of "Localization native development region" entry in info.plist?

http://useyourloaf.com/blog/2010/05/10/fixing-xcode-default-development-region.html

How can I load a default language plist if the localized version does not exist for the current language?

当找不到用户设备语言的Localizable.strings时,我总是要用英语加载语言?

3 个答案:

答案 0 :(得分:0)

我已经检查了你的链接,其中一个已经报道了,但我确定要提一下。

根据Apples Property List Key Reference,您可以通过 CFBundleDevelopmentRegion 设置默认语言:

  

CFBundleDevelopmentRegion(String - iOS,OS X)

     

指定捆绑包的本机区域。该键包含一个字符串   通常对应于人的母语的价值   是谁写的。此值指定的语言用作   如果无法为用户找到资源,则为默认语言   首选地区或语言。

这当然只有在您的语言项目设置正确的情况下才有效。因此,请检查信息projects settings中的tab是否列出了这两种语言,并且您的资源是否已正确复制(Copy Bundle Resources

答案 1 :(得分:0)

打破头后,我终于找到了答案。我不知道这个答案是否最好,但这对我有用。见下文:

#import "UtilHelp.h"

@implementation UtilHelp

//https://developer.apple.com/library/mac/qa/qa1391/_index.html
+ (NSString*)preferredUserLanguage {

    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    NSDictionary * globalDomain = [defaults persistentDomainForName:@"NSGlobalDomain"];
    NSArray * languages = [globalDomain objectForKey:@"AppleLanguages"];

    NSString* preferredLang = [languages objectAtIndex:0];

    return preferredLang;
}

@end


int main(int argc, char * argv[])
{
    NSString * preferredUserLanguage = [UtilHelp preferredUserLanguage];

    // Save the user's preferred order
    NSArray * defaultAppleLanguages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];

    // When your app loaded, use this object for back AppleLanguages to default
    [[NSUserDefaults standardUserDefaults] setObject:defaultAppleLanguages forKey:@"DefaultAppleLanguages"];

    //
    // Check if language of the device contains between your files Localizable.string
    // YES: Good!
    // NO: Defines developmentLocalization as the preferred language
    //
    if(![[[NSBundle mainBundle] localizations] containsObject:preferredUserLanguage])
    {
        // Don't forget the configure CFBundleDevelopmentRegion with your preferred region
        NSString * developmentLocalization = [[NSBundle mainBundle] developmentLocalization];

        // Apple Guide:
        // ------------------------------------------------------------------------------------------
        // The returned array contains the
        // languages associated with the AppleLanguages key in the user's preferred order.
        // Thus, in most cases, you would simply want to get the first object in the array.
        //
        preferredUserLanguage = developmentLocalization;
    }

    // set the preferred User Language
    [[NSUserDefaults standardUserDefaults] setObject:@[preferredUserLanguage] forKey:@"AppleLanguages"];

    @autoreleasepool{
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}



@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // default AppleLanguages
    NSArray * defaultAppleLanguages = [[NSUserDefaults standardUserDefaults] objectForKey:@"DefaultAppleLanguages"];

    [[NSUserDefaults standardUserDefaults] setObject:defaultAppleLanguages forKey:@"AppleLanguages"];

    return YES;
}

希望这有助于某人。 Thakn你。

答案 2 :(得分:0)

如果您仍在寻找解决方案,我遇到了类似的问题,如果当前所选语言没有本地化文件,我希望从特定的本地化文件中获取字符串。

iOS Localizable.strings not being retrieved from BASE file

包含上述问题的链接和下方解决方案的文字(除非您真的想要,否则无需关注链接)。


NSString *path = [[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"];
if (path == nil)
{
    path = [[NSBundle mainBundle] pathForResource:@"Base" ofType:@"lproj"];
}

NSLocalizedStringFromTableInBundle(@"TAB_TITLE_Camera", @"Localizable", [NSBundle bundleWithPath:path], @"");

简单的解决方案,可以完成我需要的一切。

适用于 iOS 6.1 iOS 7.1


我认为您需要做的就是改变

pathForResource:@"Base"

pathForResource:@"en"

或您想要的任何语言。

希望这可以提供帮助。非常高兴我在寻找答案长期失败后想出了这个解决方案。