Какой NSLocale использовать с uppercaseStringWithLocale:?

Когда у меня есть строка пользовательского интерфейса с заглавными буквами, я обычно определяю их строчными буквами, как и все остальные, а затем использую uppercaseStringWithLocale:[NSLocale currentLocale].

Но недавно я случайно заметил, что [NSLocale currentLocale] может быть не тем, что используется в вашем приложении. Например, если ваше устройство на турецком языке, но ваше приложение поддерживает только английский язык, currentLocale будет турецким языковым стандартом, а ваше приложение локализовано на английском языке.

С этими настройками прямое влияние использования [NSLocale currentLocale] заключается в том, что моя строка верхнего регистра будет выглядеть как «Я НРАВИТСЯ IOS» вместо «МНЕ НРАВИТСЯ 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, хотя во многих случаях это не работает должным образом.


person Imotep    schedule 31.12.2015    source источник


Ответы (1)


Самый надежный способ получить языковой стандарт приложения — отредактировать файлы Localizable.strings. В файле английской локализации добавить запись

"lang"="en";

в немецком файле локализации добавить запись

"lang"="de";

в файле французской локализации добавить запись

"lang"="fr";

и так далее... Вы можете получить код локализации с помощью NSLocalizedString(@"lang").

person Michael    schedule 31.12.2015
comment
Почему NSBundle.mainBundle.preferredLocalizations.firstObject недостаточно надежен? - person Imotep; 31.12.2015
comment
@Imotep: что произойдет, если в вашем приложении есть английский, немецкий и французский языки, но только файлы локализации на английском и французском языках? (Например, вы используете немецкую локализацию только для некоторых XIB, так что это не полностью надуманный пример.) - достаточно ли надежны предпочтительные локализации, зависит от вашей конкретной ситуации. это также зависит от языков, которые вы используете. Например. если вы используете только английский, немецкий, французский и испанский языки, вы можете использовать только -uppercaseString, потому что он ведет себя так же, как -uppercaseStringWithLocale: для многих локалей. - person Michael; 31.12.2015
comment
@Imotep: Вы даже можете создать категорию на NSString и вызвать метод -localizedUppercaseString, по умолчанию -uppercaseString, и обновить этот метод, как только добавите турецкий язык (если это когда-либо произойдет)... - person Michael; 31.12.2015
comment
Использование языка только в определенных xibs для меня является либо ошибкой разработчика, либо очень конкретной потребностью, которая явно не покрывается «applicationLocale». Единственный законный случай, который приходит мне на ум, — это когда вы делаете какое-то приложение-переводчик. В этом случае вы не захотите использовать currentLocale, applicationLocale или даже lang localizedString. Вы будете использовать временную локаль в зависимости от того, на какой язык вы хотите перевести. Что касается создания категории NSString, я сомневаюсь, что она будет достаточно надежной, поскольку подразумевает обработку всех существующих языков, в то время как «applicationLocale» уже работает со всеми. - person Imotep; 31.12.2015
comment
@Imotep: ты уверен, что не просто тратишь время? Вы нашли хоть один случай, когда просто -uppercaseString вел себя не так, как вы хотели? Вы наверняка нашли случай, когда -uppercaseString вел себя хорошо, а -uppercaseStringWithLocale: — нет. Обработка всех возможных случаев хороша, если вы создаете библиотеку или повторно используемый компонент, но это просто не дает вам дополнительного удовлетворения клиентов, если ваши клиенты не являются разработчиками. - person Michael; 31.12.2015