Я использую одиночную локализованную раскадровку для своего приложения. Приложение должно иметь возможность менять язык "на лету". До сих пор я выяснял, как изменить язык, который используется во время запуска приложения:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; //to make the change immediate
И удалось перезагрузить все мое приложение, удалив все подпрограммы в ключевом окне, перезагрузив исходный контроллер представлений из раскадровки и сделав его новым контроллером корневого представления. (У него есть некоторые проблемы, такие как управление открытыми ресурсами, но это можно сделать.)
Единственное, что я не мог понять, это как заставить iOS перезагрузить раскадровку на новом языке? Кажется, что раскадровки так или иначе кэшированы, а -UIStoryboad:stroyboardWithName:fromNib
не перезагружает его полностью, поэтому он появляется на последнем языке.
Я уже рассмотрел два других варианта:
-
с разными файлами раскадровки для каждого языка (это неприменимо, я не хочу этого делать)
-
используя прослушиватели событий во всех моих контроллерах представления, которые реагируют на изменение языка и устанавливают новые строки в пользовательском интерфейсе (который также должен вызываться каждый раз, когда какой-либо элемент интерфейса получает экземпляр из раскадровки). Это решение требует больше времени, чем мы хотели бы потратить на это, а также сильно увеличивает вероятность ошибок.
Есть ли еще более умный способ? Я не хочу сохранять текущее состояние своего приложения, поэтому перезапуск его, как будто он был убит, а реальная работа - разумное разрешение.