2017-03-08 1 views
1

나는 이것에 대해 많은 답변을 읽었지만, 대부분은 오래되었고 나에게는 최신 정보가 무엇인지 알지 못합니다.사용자 선택에 따라 앱 현지화 변경

처음 출시 될 때, 내 앱은 OS 기본 언어를 사용하는 것보다는 사용자가 선호하는 언어를 사용자에게 묻습니다.

  1. 어떻게 응용 프로그램의 현지화 나머지를 선택한 언어로 설정할 수 있습니까?
  2. 다른보기에서 사용자가 선택한 언어를 어떻게 얻을 수 있습니까?

나는 다음과 같은 코드가 언어를 설정 것이라고 생각하지만, 일하지 않았다 : 기본적으로

UserDefaults.standard.set("AR", forKey: "AppleLanguages") 
UserDefaults.standard.synchronize() 
+0

이 접근법에 대해 두 번 생각하면 몇 가지 위험이 있습니다. 예를 들어 앱 내에서지도보기를 표시하려는 경우 언어가 현재 설정과 일치하지 않을 수 있습니다. – Andrea

+0

@ 안드레아 그래서 더 나은 접근 방법은 무엇입니까? –

답변

0

당신은

UserDefaults.standard.set("en", forKey: "Apple") 
    UserDefaults.standard.synchronize() 
당신에게 따라 언어를 설정할 수 있습니다 // 영어 언어를

당신이 사용하는 코드보다 현재 시스템 언어하려면

let langStr = Locale.current.languageCode //and set in UserDeafaults 
UserDefaults.standard.set(langStr, forKey: "Apple") 

var currentlanguage: String? 
self.currentlanguage = UserDefaults.standard.object(forKey: "Apple") as! String? 
print("current language ---%@",self.currentlanguage) 
+0

다른 로케일에 대한 문자열을 설정하고 스키마에서 언어를 변경하여 테스트 했더라도 UI에는 아무런 변화가 없었습니다. –

2

모든 로컬 리 제이션을 처리하는 싱글 톤 클래스 LanguageManager으로 처리했습니다. 일반적으로 상당히 큰 클래스 인 일부 psuedo 코드가 있습니다.

let supportedLocales = ['en-US', 'en-CA', 'fr', 'es-ES', 'es-MX'] 

그것도 UserDefaults에서 선택된 언어를 기억 :

그것은 예를 들어, 지원되는 모든 로케일의리스트를 갖는다. selectedLocale 변경, 그것은 알림을 보낼 때, 경우에 당신이 당신의 뷰 또는 다른 어떤 통지 할 :

var selectedLocale: String? { 
    get { 
     return UserDefaults.standard.object(forKey: UserDefaultsKeys.selectedLocale) as? String 
    } 
    set (newLocale) { 
     let didChange = self.selectedLocale != newLocale 
     UserDefaults.standard.set(newLocale, forKey: UserDefaultsKeys.selectedLocale) 
     UserDefaults.standard.synchronize() 
     if didChange { 
      NotificationCenter.default.post(name: Notification.Name.localeDidChange, object: nil) 
     } 
    } 
} 

이제 당신의 localized.strings 파일에서 문자열을 끌어하기 위해, 당신은 사용할 수 없습니다 표준 Apple 방법 - 직접 제공해야합니다. LanguageManager.shared.getString(for key:String, alt:String)을 사용하여 .strings 파일의 키를 참조하여 현지화 된 문자열을 꺼냅니다.

var selectedLanguage:String? { 
    //returns just the language portion of the locale - eg: 'en' from 'en-US' 
    if let selectedLocale = selectedLocale { 
     return selectedLocale.components(separatedBy: "-")[0] 
    } 
    return nil 
} 

func getString(for key:String, alt:String) -> String 
{ 
    var val:String? = getString(for:key, language: selectedLocale) 
    if val == nil { 
     val = getString(for:key, language: selectedLanguage) 
    } 
    if val == nil { 
     val = getString(for:key, language: "en") //default to English 
    } 
    if let val = val { 
     return val 
    } 

    return alternate //use fallback 
} 


func getString(for key:String, language:String) -> String? 
{ 
    let path = Bundle.main.path(forResource:language, ofType:"lproj") 
    if let languageBundle = Bundle(path:path) { 
     return languageBundle.localizedString(for: key) 
    } 
    return nil 
} 
관련 문제