Подтвердить что ты не робот

Изменить язык в приложении программно в iOS

Как изменить язык в Xcode 5

У меня есть 3 кнопки на ChangeLanguageViewController

Это:

  • английский
  • Китайский упрощенный
  • Bahasa Malaysia

Вот код:

#import <UIKit/UIKit.h>
@interface ChangeLanguageViewController :UIViewController
-(IBAction)changeEnglish:(id)sender;
-(IBAction)changeChinesesimplified:(id)sender;
-(IBAction)changeBahasaMalaysia:(id)sender;

-(IBAction)changeEnglish:(id)sender{

[[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"en", @"zh-Hans", @"ms", nil] forKey:@"AppleLanguage"];
}
-(IBAction)changeChinesesimplified:(id)sender{
[[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", @"ms", @"en", nil] forKey:@"AppleLanguage"];
}
-(IBAction)changeBahasaMalaysia:(id)sender{
[[NSUSerDefaults standardUSerDefaults] setObject:[NSArray arrayWithObjects:@"ms",@"en",@"zh-Hans", nil] forKey:@"AppleLanguage"];
}

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

4b9b3361

Ответ 1

Обычно, когда вы поддерживаете официальные языки, поддерживаемые Apple в iOS, нет причин для переключения языков в приложении, просто правильно настройте переводы в своем проекте, и язык интерфейса автоматически переключится с помощью системы. Но так как вы хотите этого в приложении, есть несколько способов сделать это:

1) Вы можете заставить конкретный язык только для своего приложения со следующим кодом:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hans", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];

Я бы предложил поместить этот код в файл main.m в функцию "int main" непосредственно перед "return UIApplicationMain". Но этот метод требует, чтобы вы убили приложение или сказали пользователю перезапустить приложение, чтобы оно вступило в силу.

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

2) Альтернатива реализует вашу собственную логику локализации, где вы просто берете переводы из своего языкового файла. Один из способов - это пример, который принимает переводы из официальных файлов lproj. Таким образом, вы можете изменить язык "на лету" без перезагрузки, но вы должны вручную загрузить все тексты ярлыков из кода. Когда вы меняете перевод, вам нужно повторно заполнить текст на экране.

Ответ 2

Вы не можете сделать это без перезапуска приложения. Поэтому вам нужно сохранить выбранный язык в NSUserDefaults и перезапустить приложение после размещения ниже строк в main.h.

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects: your_lang, nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];

Ответ 3

EDIT: SWIFT 3.

Используйте этот вспомогательный класс для вашего требования.

    class LanguageManager: NSObject {


    var availableLocales = [CustomLocale]()
    static let sharedInstance = LanguageManager()
    var lprojBasePath = String()

    override fileprivate init() {

        super.init()
        let english = CustomLocale(languageCode: GlobalConstants.englishCode, countryCode: "gb", name: "United Kingdom")
        let finnish  = CustomLocale(languageCode: GlobalConstants.finnishLangCode, countryCode: "fi", name: "Finland")
        self.availableLocales = [english,finnish]
        self.lprojBasePath =  getSelectedLocale()
    }


    fileprivate func getSelectedLocale()->String{

        let lang = Locale.preferredLanguages//returns array of preferred languages
        let languageComponents: [String : String] = Locale.components(fromIdentifier: lang[0])
        if let languageCode: String = languageComponents["kCFLocaleLanguageCodeKey"]{

            for customlocale in availableLocales {

                if(customlocale.languageCode == languageCode){

                    return customlocale.languageCode!
                }
            }
        }
        return "en"
    }

    func getCurrentBundle()->Bundle{

        if let bundle = Bundle.main.path(forResource: lprojBasePath, ofType: "lproj"){

            return Bundle(path: bundle)!

        }else{

            fatalError("lproj files not found on project directory. /n Hint:Localize your strings file")
        }
    }

    func setLocale(_ langCode:String){

        UserDefaults.standard.set([langCode], forKey: "AppleLanguages")//replaces Locale.preferredLanguages
        UserDefaults.standard.synchronize()
        self.lprojBasePath =  getSelectedLocale()
    }
}


 class CustomLocale: NSObject {
    var name:String?
    var languageCode:String?
    var countryCode:String?

    init(languageCode: String,countryCode:String,name: String) {

        self.name = name
        self.languageCode = languageCode
        self.countryCode = countryCode

    }

}

Я сделал демонстрационный проект в github.