Спасибо Димитрис. Так что изменить язык во время выполнения не так просто.
Я нашел решение, которое работает в моем случае:
Когда пользователь меняет язык, я использую решение, описанное Мауро Дельрио в "Как заставить NSLocalizedString использовать определенный язык". В моносенсорном режиме:
string newLanguage = "nl";
myBundle = NSBundle.FromPath(NSBundle.MainBundle.PathForResource(newLanguage, "lproj"));
Теперь все строки будут загружены на выбранном языке с помощью myBundle.LocalizedString(...). Конечно, все, что уже напечатано на просмотре, еще не переведено. Но я нашел простой способ сбросить все представления. В моем приложении я использую MainTabController, который выглядит так:
public class MainTabBarController : UITabBarController
{
public override void ViewDidLoad()
{
Reset();
SelectedIndex = 2;
}
public void Reset()
{
ViewControllers = new UIViewController[]
{
new ViewControllerTab1(),
new ViewControllerTab2(),
new ViewControllerTab3(),
new ViewControllerTab4(),
new ViewControllerTab5()
};
}
}
Так что все, что мне нужно сделать, это вызвать Reset, например:
((AppDelegate)UIApplication.SharedApplication.Delegate).MainTabBarController.Reset();
Все текущие представления удаляются и воссоздаются на правильном языке. Похоже на трюк, но он совершенно законен и задокументирован, см. Документация Apple для свойства ViewControllers MainTabBarController. Он даже активирует тот же индекс вкладок, что и тот, который был активен, поэтому пользователю кажется, что ничего, кроме языка, не меняется.
Конечно, любые несохраненные данные во всех представлениях будут потеряны, поэтому, если это проблема, вам нужно найти способ сохранить их перед сбросом.
person
Marcel W
schedule
20.01.2011