【问题标题】:Which NSLocale to use with uppercaseStringWithLocale:?哪个 NSLocale 与 uppercaseStringWithLocale: 一起使用?
【发布时间】:2015-12-31 09:04:50
【问题描述】:

当我有一个带有大写字母的 UI 字符串时,我习惯于将它们定义为小写字母,然后使用uppercaseStringWithLocale:[NSLocale currentLocale]

但最近我碰巧注意到[NSLocale currentLocale] 可能不是您的应用中使用的那个。例如,如果您的设备使用土耳其语,但您的应用仅支持英语,则 currentLocale 将是土耳其语区域设置,而您的应用本地化为英语。

使用这些设置,使用[NSLocale currentLocale] 的直接效果是我的大写字符串将是“İ LİKE İOS”而不是“I LIKE IOS”。

到目前为止,我看到的唯一解决方法是创建一个 NSLocale 类别来添加 +(NSLocale*) applicationLocale; 并在所有 uppercaseStringWithLocale: 中使用它。

+ (NSLocale*) applicationLocale
{
    NSMutableDictionary<NSString*,NSString*>* localeComponents = [[NSLocale componentsFromLocaleIdentifier:[NSLocale currentLocale].localeIdentifier] mutableCopy];
    localeComponents[NSLocaleLanguageCode] = NSBundle.mainBundle.preferredLocalizations.firstObject;
    return [NSLocale localeWithLocaleIdentifier:[NSLocale localeIdentifierFromComponents:localeComponents]];
}

我的问题很简单:我这样做是对的还是我错过了什么?我确实想知道为什么 Apple 会链接到 currentLocale,而在很多情况下它不会按预期工作。

【问题讨论】:

    标签: ios localization uppercase nslocale


    【解决方案1】:

    获取应用程序语言环境的最可靠方法是编辑您的 Localizable.strings 文件。在英文本地化文件中添加一个条目

    "lang"="en";
    

    在德语本地化文件中添加一个条目

    "lang"="de";
    

    在法语本地化文件中添加一个条目

    "lang"="fr";
    

    等等...你可以通过NSLocalizedString(@"lang")获取本地化代码。

    【讨论】:

    • 为什么 NSBundle.mainBundle.preferredLocalizations.firstObject 不够健壮?
    • @Imotep:如果您的应用程序中有英语、德语和法语,但只有英语和法语本地化文件会怎样? (例如,您仅对某些 XIB 使用德语本地化,因此这不是一个完全人为的示例。) - 如果 preferredLocalizations 足够健壮取决于您的特定情况。它还取决于您使用的语言。例如。如果您只使用英语、德语、法语和西班牙语,则可以只使用 -uppercaseString,因为它在许多语言环境中的行为与 -uppercaseStringWithLocale: 相同。
    • @Imotep:您甚至可以在NSString 上创建一个类别并调用方法-localizedUppercaseString,默认为-uppercaseString,并在添加土耳其语后立即更新该方法(如果发生这种情况)...
    • 在我看来,仅在特定的 xib 中使用一种语言要么是开发错误,要么是非常特殊的需求,这显然没有包含在“applicationLocale”中。我想到的唯一合法案例是当您制作某种翻译应用程序时。在这种情况下,您将不想使用 currentLocale、applicationLocale 甚至“lang”localizedString。您将根据要翻译的语言使用临时语言环境。关于创建 NSString 类别,我怀疑它是否足够强大,因为它意味着处理所有现有语言,而“applicationLocale”已经适用于所有语言
    • @Imotep:你确定你不只是在浪费时间吗?您是否找到了一个实例,其中只有 -uppercaseString 的行为与您希望的行为不符?您肯定已经找到了一个案例,-uppercaseString 表现良好,但 -uppercaseStringWithLocale: 没有。如果您正在创建库或可重用组件,则处理所有可能的情况都很好,但如果您的客户不是开发人员,它不会给您带来任何额外的客户满意度。
    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2013-04-29
    • 2013-08-30
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多