基本上,您必须教您捆绑软件如何通过加载不同的捆绑软件文件来切换语言。
我将我的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);}@endAppDelegate.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



