Спасибо, Димитрис. Так что изменить язык во время выполнения не так просто.
Я нашел решение, которое работает в моем случае:
Когда пользователь меняет язык, я использую решение, описанное Мауро Делрио в «Как заставить 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()
};
}
}
Так что все, что мне нужно сделать, это вызвать Сброс, как:
((AppDelegate)UIApplication.SharedApplication.Delegate).MainTabBarController.Reset();
Все текущие представления располагаются и воссоздаются на правильном языке. Похоже на хитрость, но это совершенно законно и задокументировано, см. Документация Apple для свойства MainTabBarController viewControllers . Он даже активирует тот же индекс вкладки, что и тот, который был активен, поэтому пользователю кажется, что ничего, кроме языка, не изменилось.
Конечно, все несохраненные данные во всех представлениях теряются, поэтому, если это проблема, вы должны найти способ сохранить ее перед сбросом.