#ios #swift #localization #cocoapods
#iOS #swift #локализация #cocoapods
Вопрос:
Я делаю локализацию в своем приложении. Когда я меняю язык, он обновляется везде в моем приложении, за исключением модулей, которые я использовал. Если я перезапущу приложение, язык модуля будет обновлен. Есть ли какой-либо способ изменить язык модулей, когда я меняю язык приложения.
Ответ №1:
Вам нужно будет поменять mainBundle
местами ваше приложение, как только пользователь изменит свои языковые предпочтения внутри приложения.
Идея состоит в том, чтобы иметь пользовательский пакет и расширение:
var bundleKey: UInt8 = 0
class AnyLanguageBundle: Bundle {
override func localizedString(forKey key: String,
value: String?,
table tableName: String?) -> String {
guard let path = objc_getAssociatedObject(self, amp;bundleKey) as? String,
let bundle = Bundle(path: path) else {
return super.localizedString(forKey: key, value: value, table: tableName)
}
return bundle.localizedString(forKey: key, value: value, table: tableName)
}
}
extension Bundle {
class func setLanguage(_ language: String) {
defer {
object_setClass(Bundle.main, AnyLanguageBundle.self)
}
objc_setAssociatedObject(Bundle.main, amp;bundleKey, Bundle.main.path(forResource: language, ofType: "lproj"), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
И когда вы хотите обновить язык своего приложения:
func updateAppLanguageToIT() {
UserDefaults.standard.set("it", forKey: "AppleLanguages")
UserDefaults.standard.synchronize()
// Update the language by swaping bundle
Bundle.setLanguage("it")
// Done to reintantiate the storyboards instantly
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
UIApplication.shared.keyWindow?.rootViewController = storyboard.instantiateInitialViewController()
}
Несколько ссылок о том, как этого добиться, уже доступны на некоторых страницах posts / github, подобных этим двум:
Комментарии:
1. Я делаю то же самое, меняя основной пакет. Язык моего приложения меняется без перезапуска. Проблема с модулями, они не обновляются, пока я не перезапущу свое приложение.