Локализация приложения iPhone для региона

У меня есть приложение, в котором весь контент независимо от языка отображается на английском языке. В разделе продуктов приложения содержимое продукта отображается на основе plist. Продукты, доступные для покупки, зависят от местоположения, не все продукты доступны на каждом рынке.

В настройках моего симулятора мой язык установлен на английский, а формат региона установлен на Сингапур.

Перед загрузкой локализованного plist я сначала веду журнал, чтобы убедиться, что я действительно вижу SG (Сингапур) как свой регион.

NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode];
NSLog(@"LOCALE: %@", locale);
if([locale isEqualToString:@"SG"]){
    NSLog(@"singapore do something?");
    productCategory = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] 
                                    pathForResource:@"Products" ofType:@"plist"]];  
}

Текущий результат показывает, что моя запись в журнале регистрируется LOCALE: SG, что ожидается, однако мой контент, специфичный для Сингапура, не загружается.

Я пробовал как очистить проект, так и удалить приложение из симулятора.

Вот как мои файлы plist отображаются в моем навигаторе проектов Products.plist image

Что я делаю неправильно, что препятствует отображению моего локализованного plist?


person propstm    schedule 26.06.2012    source источник
comment
В моем файле InfoPlist.strings указано только /* Локализованные версии ключей Info.plist */. Следует отметить, что мои файлы локализации для английского и английского языков работают нормально, однако я заметил, что это различия в языковых настройках. не региональные настройки.   -  person propstm    schedule 26.06.2012


Ответы (2)


Локализация (процесс загрузки переведенных ресурсов из соответствующих языковых папок в комплекте вашего приложения) основана исключительно на настройке языка. Таким образом, pathForResource заботится только о настройке языка и игнорирует настройку формата региона.

Настройка формата региона влияет на преобразование между строками и типами данных, зависящими от локали (в обоих направлениях: синтаксический анализ ввода и форматирование вывода). Например, если вы преобразуете NSDate в строку для отображения, в зависимости от настройки формата региона вы можете получить месяц перед днем ​​(как в США) или наоборот (как в Великобритании).

[NSLocale currentLocale] относится к формату региона, поэтому вы просто смотрели не на то, что нужно при отладке.

Здесь есть много дополнительной информации: https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPInternational/BPInternational.html#//apple_ref/doc/uid/10000171i

Изменить См. комментарии ниже, это кажется более сложным. Похоже, что регион влияет на локализацию, когда язык установлен на нейтральный язык (например, «en», но не «en-US»).

person Clafou    schedule 26.06.2012
comment
Локализация... основана исключительно на языковых настройках. Верно ли это утверждение? Если я локализую строковый ресурс в файлы es и es-PY и установлю язык es, а регион — PY, мое приложение для iPad выберет PY, а не общую языковую локализацию es. Если я установлю регион на что-то другое, например, Перу, приложение будет корректно возвращаться к языковой строке es. - person stonedauwg; 11.10.2016
comment
es-PY означает испанский язык, на котором говорят в Парагвае. Вы можете запустить приложение с языком es-PY и установить другой формат региона. Язык влияет на локализованные строки, которые вы получите (как вы описываете), но формат региона не будет (вместо этого это влияет на то, как вы читаете и записываете даты, числа, денежные числа). - person Clafou; 11.10.2016
comment
Я тестировал это на iOS10 — если у меня есть es-PY и общая локализация es в комплекте, измените настройку языка iPad на испанский (общий, не зависящий от региона = es), а регион — на es-PY (Espanol). -Парагвай), он подберет строки региона es-PY вместо общей строки es, доказывая, что регион ДЕЙСТВИТЕЛЬНО влияет на строки (если у вас есть эта локаль в комплекте). Если я затем переключаю регион на что-то другое, например, на Перу, поскольку у меня НЕТ локализации строки этого региона, он возвращается к общей строке es из пакета. См. раздел AppleBundleGuide-›Search Order. - person stonedauwg; 12.10.2016

У меня когда-то была такая же проблема, как-то нашелся не локализованный файл. Что сработало для меня, так это использовать:

[[NSBundle mainBundle] pathForResource:@"Products" ofType:@"plist" inDirectory:nil]

Это всегда будет искать все локализованные файлы и возвращать правильный на основе настроек пользователя.

person iTukker    schedule 26.06.2012