Изменить язык в приложении - как перезапустить?

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

Способ сделать это описан здесь в моносенсорном коде, чтобы установить предпочтительный язык на голландский и альтернативный язык на английский:

  NSUserDefaults.StandardUserDefaults.SetValueForKey
                (NSArray.FromStrings("nl", "en"), new NSString("AppleLanguages"));

Вы должны перезапустить приложение, прежде чем это вступит в силу. Но на iPhone 4 приложение не перезапускается при закрытии, оно просто скрыто. Есть ли способ заставить приложение перезапуститься после закрытия?


person Marcel W    schedule 20.01.2011    source источник


Ответы (4)


Спасибо Димитрис. Так что изменить язык во время выполнения не так просто.

Я нашел решение, которое работает в моем случае:

Когда пользователь меняет язык, я использую решение, описанное Мауро Дельрио в "Как заставить 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

Нет, нет возможности перезапустить приложение. Вы можете принудительно завершить его, только когда пользователи нажимают кнопку «Домой», установив для свойства «UIApplicationExitsOnSuspend» в файле Info.plist значение true.

person Dimitris Tavlikos    schedule 20.01.2011

Хитрость использования определенного языка путем выбора его из приложения заключается в том, чтобы заставить NSLocalizedString использовать определенный пакет в зависимости от выбранного языка,

вот сообщение, которое я написал для этого http://learning-ios.blogspot.com/2011/04/advance-localization-in-ios-apps.html

а вот код одного примера приложения https://github.com/object2dot0/Advance-Localization-in-ios-apps

person object2.0    schedule 01.05.2011

В качестве дополнительного примечания, чтобы заставить UIBarButtonSystemItem изменить свою локаль, вы должны добавить

<key>CFBundleDevelopmentRegion</key> 
 <string>nl</string> 

на ваш info.plist. Просто запустите TextEdit и поместите его куда-нибудь. Надеюсь это поможет!

person Rogier    schedule 26.09.2012