Я пытаюсь изменить настройку языка приложения "AppleLanguages". Все изменилось, кроме одного из них. Пункты меню UITextField не меняются. Он всегда содержит язык запуска приложения впервые.
Я уже следовал примеру ссылки: Настройка «AppleLanguages» не меняет язык приложения
Здесь я использовал этот код:
UserDefaults.standard.set(appleLanguages, forKey: "AppleLanguages")
UserDefaults.standard.synchronize()
if let languageDirectoryPath = Bundle.main.path(forResource: languageCode, ofType: "lproj"){
bundle = Bundle.init(path: languageDirectoryPath)
}
Хотя я изменил текст кнопки отмены UIsearchbar в Engli sh, другие элементы не могут.
if let searchBtn = searchBar.value(forKey: "cancelButton") as? UIButton{
searchBtn.setTitle(Messages.shared.CANCEL, for: .normal)
}
![enter image description here](https://i.stack.imgur.com/xlYTF.png)
Но когда я реализовал этот код Например, язык текста меню всегда Engli sh
Шаг 1. Создайте расширение Bundle
import Foundation
class L012Localizer: NSObject {
class func DoTheSwizzling() {
MethodSwizzleGivenClassName(cls: Bundle.self, originalSelector: #selector(Bundle.localizedString(forKey:value:table:)), overrideSelector:
#selector(Bundle.specialLocalizedString(key:value:table:)))
}
}
extension Bundle {
@objc func specialLocalizedString(key: String, value: String?, table tableName: String?) -> String {
let currentLanguage = Utils.currentLanguage().rawValue
var bundle = Bundle();
if currentLanguage != "" , let _path = Bundle.main.path(forResource: currentLanguage, ofType: "lproj") {
bundle = Bundle(path: _path)!
} else {
let _path = Bundle.main.path(forResource: "Base", ofType: "lproj")!
bundle = Bundle(path: _path)!
}
return (bundle.specialLocalizedString(key: key, value: value, table: tableName))
}
}
func MethodSwizzleGivenClassName(cls: AnyClass, originalSelector: Selector, overrideSelector: Selector){
let origMethod: Method = class_getInstanceMethod(cls, originalSelector)!;
let overrideMethod: Method = class_getInstanceMethod(cls, overrideSelector)!;
if (class_addMethod(cls, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
class_replaceMethod(cls, overrideSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
} else {
method_exchangeImplementations(origMethod, overrideMethod);
}
}
Вызов DoTheSwizzling в AppDelegate
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
L012Localizer.DoTheSwizzling()
return true
}
Создание языковых утилит
class Utils: NSObject {
class func setLanguage(_ lang: LanguageType) {
UserDefaults.standard.set([lang.rawValue], forKey: "AppleLanguages")
}
class func currentLanguage() -> LanguageType {
if let langs = UserDefaults.standard.object(forKey: "AppleLanguages") as? [String], let currentLang = langs.first {
return LanguageType(rawValue: currentLang) ?? .english
}
return .english
}
}
Создать тип языка
enum LanguageType: String {
case english = "en"
case korea = "ko"
case vietnamese = "vi-VN"
func toString() -> String {
switch self {
case .korea:
return "Korea".localized
case .vietnamese:
return "Vietnamese".localized
default:
return "English".localized
}
}
}
Помните, что вы должны настроить язык приложения в Scheme на SystemLanguage
Затем Каждый раз, когда вам нужно локализовать ваше приложение, вам нужно только позвонить.
Utils.setLanguage({LanguageType})
![enter image description here](https://i.stack.imgur.com/GdMDr.png)
Вот мой info.plist
![enter image description here](https://i.stack.imgur.com/vpxZO.png)