私はLanguageManager
シングルトンクラスでこれを処理しました。シングルトンクラスはすべてのローカライゼーションを処理します。ここには、通常はかなり大きなクラスとして、いくつかの擬似コードがあります。
それは例えば、サポートされているすべてのロケールのリストを持っています
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ファイルのうち、文字列を引き出すためには、あなたが使用することはできません標準的なアップルの方法 - 自分で提供する必要があります。 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
}
このアプローチについて2回考えてみると、いくつかのリスクがあります。たとえば、アプリ内にマップビューを表示しようとすると、言語が現在の設定と一致しない可能性があります。 – Andrea
@アンドレアそれでは、より良いアプローチは何ですか? –