iOS本地化 - 无法识别es-US vs es-MX

时间:2013-07-31 03:40:09

标签: ios localization localizable.strings

我正在尝试为墨西哥西班牙语显示与美国西班牙语不同的字符串。该应用程序始终显示美国西班牙语短语。仅供参考 - 英语,法语和葡萄牙语工作正常 - 但他们没有指定语言环境。

我在Build Settings-> Localizations中创建了本地化文件夹,方法是单击+按钮,然后从“其他”菜单中选择西班牙语(墨西哥)(es-MX)和西班牙语(美国)(es-US)。然后我适当地更新了这些短语。在该项目中,我看到5个Localizable.strings文件,包括(西班牙语 - 墨西哥语)和(西班牙语 - 美国语)。同样地,我在Finder中看到了预期的文件夹,包括es-MX和es-US。

我在应用程序didFinishLaunchingWithOptions:

中放了一些NSLog消息
    NSLog(@"preferredLocalizations=%@", [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]);
    NSLog(@"localization array=%@, count=%d", [[NSBundle mainBundle] preferredLocalizations], [[[NSBundle mainBundle] preferredLocalizations] count]);
    NSLog(@"preferredLanguage = %@", [[NSLocale preferredLanguages] objectAtIndex:0]);
    NSLog(@"language array=%@, count=%d", [NSLocale preferredLanguages], [[NSLocale preferredLanguages] count]);
    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
    NSArray* languages = [defs objectForKey:@"AppleLanguages"];
    NSString *current = [languages objectAtIndex:0];
    NSLog(@"user default language=%@", current);

输出结果为:

2013-07-30 22:21:24.911 ecatalog[33497:907] application:didFinishLaunchingWithOptions
2013-07-30 22:21:24.918 ecatalog[33497:907] preferredLocalizations=es
2013-07-30 22:21:24.920 ecatalog[33497:907] localization array=(
    es
), count=1
2013-07-30 22:21:24.922 ecatalog[33497:907] preferredLanguage = es
2013-07-30 22:21:24.924 ecatalog[33497:907] language array=(
es,
en,
fr, <snipped a bunch for brevity>
ms,
"en-GB",
ca,
hu,
vi
), count=34
2013-07-30 22:21:24.926 ecatalog[33497:907] user default language=es

语言数组似乎在手机上的可用语言列表中,按我的首选顺序排列 - 即,如果我将手机设置为法语,fr将位于列表的顶部。

我不知道它是否相关,但我的项目包括两个支持西班牙语的第三方框架,但仅包括es.lproj变体 - 而不是es-MX.lproj或es-US.lproj。

另一个“症状” - 在模拟器中运行应用程序会在英语和我设置模拟器的任何语言之间交替显示。

谢谢!

1 个答案:

答案 0 :(得分:0)

在我的情况下,我只有一个字符串需要在墨西哥和美国西班牙语之间有所不同,它只在一个地方使用。所以我的解决方法是手动检查语言环境并硬编码墨西哥西班牙语字符串:

    NSString *startString;
    // HACK - to diferentiate between Mexican Spanish and all others
    NSLocale* curentLocale = [NSLocale currentLocale];
    NSString *localId = [curentLocale localeIdentifier];
    if ([localId isEqualToString: @"es_MX"]) {
        // hard code a string
        startString = @"Para seleccionar un folleto da clic +";
    } else {
        startString = NSLocalizedString(@"Click + to start!", nil);
    }

感觉不对,所以如果有人有“正确的方法”,我会很感激。