Переключение языка приложения без перезапуска приложения swift

Я хочу, чтобы язык моего приложения менялся при нажатии кнопки ..

Мой код:

@IBAction func convertlang(_ sender: Any) {
   if L102Language.currentAppleLanguage() == "en" {
        L102Language.setAppleLAnguageTo(lang: "ar")
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        L102Language.setAppleLAnguageTo(lang: "en")
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}

let APPLE_LANGUAGE_KEY = "AppleLanguages"
class L102Language {
    class func currentAppleLanguage() -> String{
         let userdef = UserDefaults.standard
         let langArray = userdef.object(forKey: APPLE_LANGUAGE_KEY) as! NSArray
         let current = langArray.firstObject as! String
    return current
}

class func setAppleLAnguageTo(lang: String) {
    let userdef = UserDefaults.standard
    userdef.set([lang,currentAppleLanguage()], forKey: APPLE_LANGUAGE_KEY)
    userdef.synchronize()
}}

и это отлично работает и конвертирует язык, когда я нажимаю на кнопку ..

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

Я искал это, но большинство из них были для objective-c и пробовали некоторые для быстрого, но не сработали ..

как это сделать?

Итак, у вас есть класс, который устанавливает значения UserDefaults относительно текущих языковых настроек. Где / как / когда их читают? что на самом деле сообщает системе или вашему приложению, что язык изменил его и что его следует обновить?

Scriptable 11.04.2018 13:43

@Scriptable при нажатии кнопки будет изменен язык

Lama 11.04.2018 14:31

как это сделать при нажатии кнопки? у вас сложная проблема, и вы показываете только часть кода, поэтому вы не можете ожидать хорошего ответа

Scriptable 11.04.2018 14:35

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

Lama 11.04.2018 14:51
3
4
6 052
3

Ответы 3

Возможно, это не самый типичный для iOS способ работы, но я обычно отношусь к статическому контенту, как и к любым другим данным в приложении, особенно когда я использую VIPER (хотя другие шаблоны будут работать) и однонаправленный поток данных.

Имея это в виду, для этого у меня была бы служба доступа к хранилищу статического контента с ключом языковых предпочтений пользователя. Когда это изменится, я буду запускать обновление содержимого.

Это хорошо работает для проектов, когда у меня также есть данные сервера, а также локальные данные, которые необходимо локализовать.

Честно говоря, я никогда особо не пользовался стандартными инструментами. И я подозреваю, что это может быть не идеально для языков с написанием справа налево.

Вы не можете изменить язык во время выполнения обычным нажатием кнопки. Если вам это действительно нужно, вам нужно вместо этого использовать собственную систему локализации.

Чтобы изменить язык приложения во время выполнения, я сделал это вручную, создав две разные раскадровки. Я сохранил языковые предпочтения в NSUserDefaults, но НЕ с помощью ключа AppleLanguages, а затем вызвал метод AppDelegate didFinishLaunchingWithOptions для выбора раскадровки.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainEnglish" bundle:nil];
UINavigationController *navigationcontroller=[[UINavigationController alloc]init];
RegistorViewController *registor=[storyboard instantiateViewControllerWithIdentifier:@"Registor"];
[self.window setRootViewController:navigationcontroller];
[self.window makeKeyAndVisible];
[navigationvontroller pushViewController:registor animated:NO];

Хотя это не то, что Apple хочет, чтобы разработчик делал во время выполнения.

Кто-то даже спросил инженера Apple, и это ответ:

In general, you should not change the iOS system language (via use of the AppleLanguages pref key) from within your application. This goes against the basic iOS user model for switching languages in the Settings app, and also uses a preference key that is not documented, meaning that at some point in the future, the key name could change, which would break your application.

If you want to switch languages in your application, you can do so via manually loading resource files in your bundle. You can use NSBundle:pathForResource:ofType:inDirectory:forLocalization: for this purpose, but keep in mind that your application would be responsible for all loading of localized data.

Недавно я столкнулся с той же проблемой в своем проекте. Вы используете правильный код для изменения языка приложения, но он изменяет только данные строкового файла, а не раскадровку. Для полной локализации вам придется снова перезапустить приложение, потому что другого способа сделать это нет. Вы можете показать всплывающее окно пользователю "Please restart your app to change language completely". Потому что мы можем убить приложение программно, но после этого нет возможности снова перезапустить приложение.

Другие вопросы по теме