1.基本配置国际化步骤网上已经有非常详细的教程了:https://www.jianshu.com/p/99768bb6051e
2.启动图国际化:
-
利用启动图来做:(缺点是启动图很多或导致包变大) 参考:http://www.hudongdong.com/ios/559.html#menu_index_3
-
利用LaunchScreen.Storyboard:其原理和Storyboard国际化一样
注意:
启动页只会保留一份, 也就是说, 你第一次加载完以后, 切换了语言, 再重新打开App, 它的启动页不会跟着更新的。 这也符合苹果的用户交互指引。
如果你想要动态修改启动页面图LaunchImage, 抱歉!根据苹果的用户交互指引,该页面是在程序加载时显示的,不建议动态修改.
正确的做法一般都是用固定的图片做启动页面图,在启动页面结束之后做任何你想做的事.
如果真想动态修改启动页面,启动页面是固定的名字,可以在程序执行之后强制把页面替换掉,不过这样APP可能会被拒.'
当我们做项目时,产品要求启动页也跟着变,我们只能在启动页完成后设置window的rootViewController为一张和启动页一样的图片的controller 然后利用图片的国际化,来实现app内部切换语言启动图也改变,如果系统语言为英语,系统第一次启动页就是英文界面,第二张启动图也是英文界面,然后App内部切换语言为中文,杀掉程序再进入,第一张系统启动图还是英文的,第二张就变成英文的了
3.APP内部切换语言:
直接上代码:
Localized:
import UIKit
let kSetLanguage ="setLanguage"
let kNotificationLanguageChanged ="languageChanged"
class Localized:NSObject{
staticletshared =Localized()
staticletenglish = ["en","en-CN"]
staticletchineseHans = ["zh-Hans","zh-Hans-CN"]
staticletchineseHant = ["zh-Hant","zh-Hant-CN"]
static var userLanguage:String{
get{
var language:String=""
let localLanguage =UserDefaults.standard.value(forKey:kSetLanguage)as?String
guard localLanguage !=nil && localLanguage?.count!=0 else{
let systemLanguages = Bundle.main.preferredLocalizations
language = systemLanguages.first!
return language
}
return localLanguage!
}
}
static func getLanguage() -> String{
varlanguage =userLanguage
ifchineseHans.contains(language) {
language =chineseHans.first!
}elseifchineseHant.contains(language){
language =chineseHant.first!
}else{
language =english.first!
}
returnlanguage
}
static func initUserLanguage() {
let language = getLanguage()
Bundle.setLanguage(language)
NotificationCenter.default.post(name: NSNotification.Name(kNotificationLanguageChanged), object: nil)
}
static func setUserlanguage(_ language:String) {
guard Localized.userLanguage != language else{ return }
setLanguage(language)
}
fileprivate static func setLanguage(_ language:String){
UserDefaults.standard.set(language, forKey: kSetLanguage)
UserDefaults.standard.synchronize()
Bundle.setLanguage(language)
NotificationCenter.default.post(name: NSNotification.Name(kNotificationLanguageChanged), object: nil)
}
}
BundleEx:
import UIKit
class BundleEx: Bundle {
override func localizedString(forKey key: String, value: String?, table tableName: String?) -> String {
if let bundle = Bundle.getLanguageBundel() {
return bundle.localizedString(forKey: key, value: value, table: tableName)
}else {
return super.localizedString(forKey: key, value: value, table: tableName)
}
}
}
extension Bundle{
static func setLanguage(_ language :String){
object_setClass(Bundle.main, BundleEx.self)
let bundle = getLanguageBundel() ?? nil
objc_setAssociatedObject(Bundle.main, kSetLanguage, bundle, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
private static var onLanguageDispatchOnce: ()->Void = {
//替换Bundle.main为自定义的BundleEx
object_setClass(Bundle.main, BundleEx.self)
}
func onLanguage(){
Bundle.onLanguageDispatchOnce()
}
class func getLanguageBundel() -> Bundle? {
let languageBundlePath = Bundle.main.path(forResource: Localized.getLanguage(), ofType: "lproj")
guard let bundlePath = languageBundlePath else { return nil }
guard let languageBundle = Bundle.init(path: bundlePath) else { return nil }
return languageBundle
}
}
后面就简单了,直接在app加载完成后调用
Localized.initUserLanguage()
在内部切换语言时调用
Localized.setUserlanguage(languange)
基于[XLIFF]的本地化:
对于成熟的团队而言,项目代码量大,统计汉字是十分头疼的事情,苹果给我们开发者提供的这个工具 - xliff ,就可以把项目代码中的中文字符串 export 到 xliff文件中,给翻译团队进行翻译,翻译团队翻译成功再 import 回项目中
Export -> translation -> Import
xliff是兼容Storyboard的这点很重要
具体就不多介绍了,网上一大堆https://www.jianshu.com/p/0a345752f87a
网友评论