Ios 要与uppercaseStringWithLocale一起使用的NSLocale:?

Ios 要与uppercaseStringWithLocale一起使用的NSLocale:?,ios,localization,uppercase,nslocale,Ios,Localization,Uppercase,Nslocale,当我有一个带有大写字母的UI字符串时,我习惯于用小写字母定义它们,然后使用uppercaseStringWithLocale:[NSLocale currentLocale] 但最近我碰巧注意到,[NSLocale currentLocale]可能不是应用程序中使用的。例如,如果您的设备是土耳其语,但您的应用程序仅支持英语,则当前语言环境将是土耳其语语言环境,而您的应用程序则本地化为英语 有了这些设置,使用[NSLocale currentLocale]的直接效果是,我的大写字符串将是“İLİK

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

但最近我碰巧注意到,
[NSLocale currentLocale]
可能不是应用程序中使用的。例如,如果您的设备是土耳其语,但您的应用程序仅支持英语,则当前语言环境将是土耳其语语言环境,而您的应用程序则本地化为英语

有了这些设置,使用
[NSLocale currentLocale]
的直接效果是,我的大写字符串将是“İLİKEİOS”,而不是“我喜欢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]];
}
+(NSLocale*)应用程序本地
{
NSMutableDictionary*localeComponents=[[NSLocale Components fromLocaleIdentifier:[NSLocale currentLocale].localeIdentifier]mutableCopy];
localeComponents[NSLocaleLanguageCode]=NSBundle.mainBundle.preferredLocalizations.firstObject;
返回[NSLocale localeWithLocaleIdentifier:[NSLocale localeIdentifierFromComponents:localeComponents]];
}

我的问题很简单:我这样做是正确的还是遗漏了什么?我确实想知道为什么苹果会链接到
currentLocale
,而它在很多情况下都不会像预期的那样工作。

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

"lang"="en";
"lang"="de";
"lang"="fr";
在德语本地化文件中添加一个条目

"lang"="en";
"lang"="de";
"lang"="fr";
在法语本地化文件中添加一个条目

"lang"="en";
"lang"="de";
"lang"="fr";

等等。。。您可以使用
NSLocalizedString(@“lang”)

获取本地化代码,为什么NSBundle.mainbndle.preferredLocalizations.firstObject不够健壮?@Imotep:如果应用程序中有英语、德语和法语,但只有英语和法语本地化文件,会发生什么?(例如,您仅对某些XIB使用德语本地化,因此这不是一个完全人为的示例。)-首选本地化是否足够可靠取决于您的具体情况。这也取决于你使用的语言。例如,如果您只使用英语、德语、法语和西班牙语,您可以只使用
-uppercaseString
,因为对于许多语言环境,它的行为与
-uppercaseStringWithLocale:
相同。@Imotep:您甚至可以在
NSString
上创建一个类别,并调用方法
-localizedUppercaseString
,默认设置为
-uppercaseString
,并在添加土耳其语后立即更新该方法(如果发生这种情况)…在我看来,仅在特定的XIB中使用语言要么是开发错误,要么是非常特殊的需要,这显然不在“applicationLocale”中涵盖。在我脑海中出现的唯一合法案例是当你制作某种翻译应用程序时。在这种情况下,您不想使用currentLocale、applicationLocale甚至“lang”localizedString。您将根据要翻译的语言使用临时区域设置。关于创建NSString类别,我怀疑它是否足够健壮,因为它意味着在“applicationLocale”已经可以使用的情况下处理所有现有语言all@Imotep:你确定你不是在浪费时间吗?您是否发现了一个实例,其中的
-uppercaseString
没有按照您希望的方式运行?您确实发现了一个case-wer
-uppercaseString
表现良好,但
-uppercaseStringWithLocale:
没有。如果您正在创建一个库或可重用组件,那么处理每一种可能的情况都是很好的,但是如果您的客户不是开发人员,那么它不会给您带来任何额外的客户满意度。