Как программно изменить язык и обновить контент внутри приложения, а не с телефона? IOS быстрый 4 - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь создать приложение, в котором пользователь может выбрать язык, и я хочу изменить содержимое всего приложения. Например, у меня есть две метки и два языка: английский sh и немецкий. два файла Localizable (en, de). на моем экране пользователь нажимает поворот на немецкий, и я хочу изменить язык приложения и обновить пользовательский интерфейс, но я не хочу, чтобы пользователь закрыл приложение. Я нашел здесь какое-то решение, но это не сработало, например аналогичный вопрос

extension Bundle {
private static var bundle: Bundle!

public static func localizedBundle() -> Bundle! {
    if bundle == nil {
        let appLang = UserDefaults.standard.string(forKey: "app_lang") ?? "ru"
        let path = Bundle.main.path(forResource: appLang, ofType: "lproj")
        bundle = Bundle(path: path!)
    }

    return bundle;
}

public static func setLanguage(lang: String) {
    UserDefaults.standard.set(lang, forKey: "app_lang")
    let path = Bundle.main.path(forResource: lang, ofType: "lproj")
    bundle = Bundle(path: path!)
}}

и этот

extension String {
func localized() -> String {
    return NSLocalizedString(self, tableName: nil, bundle: Bundle.localizedBundle(), value: "", comment: "")
}

func localizeWithFormat(arguments: CVarArg...) -> String{
    return String(format: self.localized(), arguments: arguments)
}}

и используя его как

@IBAction func englishAction(_ sender: Any) {
    let  localisedSt = "en".localized()
    Bundle.setLanguage(lang: "en")
}

после этого я попытался перезагрузить приложение, перезагрузить вид, но ничего не изменилось.

1 Ответ

0 голосов
/ 05 мая 2020

NSLocalizedString будет искать внутри таблицы локализации, подходящей для приложения, которое определяется устройством или UserDefaults. Существует специальный ключ, который вы можете установить внутри UserDefaults и определить, какой язык вы хотите использовать, тогда при следующем запуске приложения он загрузит соответствующий пакет.

Если вы хотите изменить локализация внутри приложения (на лету), вам нужно вручную искать таблицу из Bundle, представляющую этот Locale. Просто найдите файл с расширением .lproj и воссоздайте другой Bundle с полученным путем, а запрос сгенерирован Bundle для локализованной строки.

let locale = Locale(identifier: "en");
guard let path = Bundle.main.path(forResource: locale.identifier, ofType: "lproj") 
else { return };
let localizedBundle = Bundle(path: path)
localizedBundle.localizedString(forKey:_, value:_, table:_) // you can pass NULL in table to look into "Localizable.strings"

Но, конечно, после изменения языкового стандарта вы также необходимо обновить все настроенные на данный момент тексты.

Я написал библиотеку под названием Styled , которая может помочь вам с этой частью (а также с интерполяцией, синхронизацией цвета / шрифта с системой шрифтов устройства)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...