Создание локализованного приложения для iPhone, но позволяющее пользователю изменять язык приложения
Я работаю над локализованным приложением, и все работает нормально. Проблема в том, что я хочу разрешить пользователю специально выбирать lenguage для конкретного приложения в папке настроек приложения. Это должно привести к тому, что их телефон настроен на один язык (например, французский), чтобы приложение работало на английском языке.
В настоящее время я использую NSLocalizedString, чтобы получить локализованную строку, но просматривая все варианты макроса, я не могу найти тот, который позволит мне указать язык.
Любые идеи о том, как это сделать?
Ответы
Ответ 1
Есть лучший способ сделать это. Вы можете заставить такой язык:
[[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];
И отмените этот параметр на:
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"];
NB. вам обычно нужно перезапустить приложение, чтобы это повлияло.
Рассмотрим, нужно ли вам позвонить [[NSUserDefaults standardUserDefaults] synchronize];
Я согласен, что пользователю не нужно указывать язык. Однако единственным исключением является возможность переопределить язык и установить его на родной язык разработчика. Если пользователь может говорить на языке разработчика (например, английский для меня), они могут захотеть использовать приложение на этом языке, если переводы неверны.
Я ссылаюсь на этот ответ: Как заставить NSLocalizedString использовать определенный язык (ответ на самом деле не работает для меня, но, следуя идеям в комментариях, Я отработал этот материал.
Ответ 2
Здесь есть три вопроса:
- Строки
- Другие ресурсы (включая NIB)
- Системные сообщения
Последнее почти наверняка не фиксируется, поэтому мы оставим его. Они появятся на языке устройства.
Остальные два разрешимы, но вам нужно будет делать больше вещей вручную. Для строк вместо создания одного Localizable.strings, а затем локализации, создайте полностью отдельные таблицы (English.strings, French.strings и т.д.). Затем используйте NSLocalizedStringFromTable()
, передавая язык в виде таблицы.
Для NIB существует два подхода. Вы можете поместить каждый набор локализованных NIB в свой собственный Bundle, а затем передать этот Bundle, а не nil
в -initWithNibName:bundle:
. Кроме того, вы можете вручную загрузить NIB после поиска с помощью [NSBundle -pathForResource:ofType:inDirectory:forLocalization:]
.
Ответ 3
Трюк для использования определенного языка, выбрав его из приложения, - заставить NSLocalizedString использовать конкретный пакет в зависимости от выбранного языка,
вот сообщение, которое я написал для этого http://learning-ios.blogspot.com/2011/04/advance-localization-in-ios-apps.html
и вот код одного примера приложения https://github.com/object2dot0/Advance-Localization-in-ios-apps
Ответ 4
Правильный "пользовательский опыт" предназначен для того, чтобы пользователь мог выбрать свой язык с помощью панели предпочтений системы; не ваше приложение (или панель настроек приложения и т.д.). Невозможно переопределить это приложение, и мы не хотим, чтобы какое-либо приложение меняло настройки системы.