Локализация приложения не меняет язык кокоапод, используемых в приложении - PullRequest
0 голосов
/ 09 апреля 2019

Я делаю локализацию в своем приложении. Когда я меняю язык, он обновляется везде в моем приложении, за исключением используемых мной стручков. Если я перезапущу приложение, язык модуля обновится. Можно ли каким-либо образом изменить язык модулей при изменении языка приложения.

1 Ответ

0 голосов
/ 09 апреля 2019

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

Идея состоит в том, чтобы иметь собственный Bundle и расширение:

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, &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, &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()
}

Несколько ссылок о том, как этого добиться, уже есть в некоторых статьях / страницах github, таких как эти две:

...