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

Posted

技术标签:

【中文标题】iOS 本地化 - 无法识别 es-US 与 es-MX【英文标题】:iOS localization - won't recognize es-US vs es-MX 【发布时间】:2013-07-31 03:40:08 【问题描述】:

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

我在 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 将位于列表顶部。

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

    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);
    

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

【讨论】:

以上是关于iOS 本地化 - 无法识别 es-US 与 es-MX的主要内容,如果未能解决你的问题,请参考以下文章

es安装的时候遇到的所有的坑

在 Windows XP 上使用 CultureAndRegionInfoBuilder 从 XML 加载文化的问题

关于安卓浏览器无法识别es6语法

iOS开发之0行代码加载NSBundle中的@2x与@3x图片

iOS 是不是依赖另一个区域本地化字符串?

我的OpenGL学习进阶之旅解决Android OpenGL ES 调试工具 GAPID 无法识别Android设备的问题