栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

快速更改语言

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

快速更改语言

基本上,您必须教您捆绑软件如何通过加载不同的捆绑软件文件来切换语言。

我将我的Objective-C代码翻译为Swift-保持了NSBundle类别不变。

结果是提供了

languageDidChange()
一种覆盖方法的视图控制器类。


NSBundle + Language.h

#import <Foundation/Foundation.h>@interface NSBundle (Language)+(void)setLanguage:(NSString*)language;@end

NSBundle + Language.m

#import "NSBundle+Language.h"#import <objc/runtime.h>static const char associatedLanguageBundle=0;@interface PrivateBundle : NSBundle@end@implementation PrivateBundle-(NSString*)localizedStringForKey:(NSString *)key      value:(NSString *)value      table:(NSString *)tableName{    NSBundle* bundle=objc_getAssociatedObject(self, &associatedLanguageBundle);    return bundle ? [bundle localizedStringForKey:keyvalue:valuetable:tableName] : [super localizedStringForKey:key         value:value         table:tableName];}@end@implementation NSBundle (Language)+(void)setLanguage:(NSString*)language{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        object_setClass([NSBundle mainBundle],[PrivateBundle class]);    });    objc_setAssociatedObject([NSBundle mainBundle], &associatedLanguageBundle, language ?       [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}@end

AppDelegate.swift

import UIKit@UIApplicationMainclass AppDelegate: UIResponder, UIApplicationDelegate {    var window: UIWindow?    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {        NSNotificationCenter.defaultCenter().addObserver(self, selector: "languageWillChange:", name: "LANGUAGE_WILL_CHANGE", object: nil)        let targetLang = NSUserDefaults.standardUserDefaults().objectForKey("selectedLanguage") as? String        NSBundle.setLanguage((targetLang != nil) ? targetLang : "en")        return true    }    func languageWillChange(notification:NSNotification){        let targetLang = notification.object as! String        NSUserDefaults.standardUserDefaults().setObject(targetLang, forKey: "selectedLanguage")        NSBundle.setLanguage(targetLang)        NSNotificationCenter.defaultCenter().postNotificationName("LANGUAGE_DID_CHANGE", object: targetLang)    }    }

baseViewController.swift

import UIKitclass baseViewController: UIViewController {    @IBOutlet weak var englishButton: UIButton!    @IBOutlet weak var spanishButton: UIButton!    deinit{        NSNotificationCenter.defaultCenter().removeObserver(self)    }    override func viewDidLoad() {        super.viewDidLoad()        NSNotificationCenter.defaultCenter().addObserver(self, selector: "languageDidChangeNotification:", name: "LANGUAGE_DID_CHANGE", object: nil)        languageDidChange()    }    override func didReceiveMemoryWarning() {        super.didReceiveMemoryWarning()        // Dispose of any resources that can be recreated.    }    @IBAction func switchLanguage(sender: UIButton) {        var localeString:String?        switch sender {        case englishButton: localeString = "en"        case spanishButton: localeString = "es"        default: localeString = nil        }        if localeString != nil { NSNotificationCenter.defaultCenter().postNotificationName("LANGUAGE_WILL_CHANGE", object: localeString)        }    }    func languageDidChangeNotification(notification:NSNotification){        languageDidChange()    }    func languageDidChange(){    }}

ViewController.swift

import UIKitclass ViewController: baseViewController {    @IBOutlet weak var helloLabel: UILabel!    override func viewDidLoad() {        super.viewDidLoad()    }    override func languageDidChange() {        super.languageDidChange()        self.helloLabel.text = NSLocalizedString("Hello", comment: "")    }}

除了使用baseViewController的子类,您的视图控制器还可以发布“ LANGUAGE_WILL_CHANGE”并侦听“
LANGUAGE_DID_CHANGE”

我将整个项目推到了这里:InstantLanguageSwitchSwift



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/426989.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号