모든 로컬 리 제이션을 처리하는 싱글 톤 클래스 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
}
이 접근법에 대해 두 번 생각하면 몇 가지 위험이 있습니다. 예를 들어 앱 내에서지도보기를 표시하려는 경우 언어가 현재 설정과 일치하지 않을 수 있습니다. – Andrea
@ 안드레아 그래서 더 나은 접근 방법은 무엇입니까? –