XILLF 是什么 ?
xliff 文件其實就是 針對 string - translation - comment 的一個文件
內容格式如下
String Translation Comment
登錄 Log In login
...
為什么用XILLF
對于成熟的團隊而言,項目代碼量大,統(tǒng)計漢字是十分頭疼的事情,蘋果給我們開發(fā)者提供的這個工具 - xliff ,就可以把項目代碼中的中文字符串 export 到 xliff文件中,給翻譯團隊進行翻譯,翻譯團隊翻譯成功再 import 回項目中
Export -> translation -> Import
Export

export 是統(tǒng)計項目 字符串 的關鍵
Objective - C 和 Swift , Xcode只識別 NSLocalizedString 開頭的宏命中包含的Key值
Objective - C
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
推薦使用第二個,可以項目內語言切換
#define NSLocalizedStringFromTable(key, tbl, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
[bundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
[bundle localizedStringForKey:(key) value:(val) table:(tbl)]
Swift
public func NSLocalizedString(key: String, tableName: String? = default, bundle: NSBundle = default, value: String = default, comment: String) -> String
如何匹配字符串 并 匹配/替換 也是一件令人頭疼的事情
Xcode中匹配中文需要用到 正則匹配
Objective - C 中的中文
@“[^”]*[\u4E00-\u9FA5]+[^”\n]*?”
Swift 中的中文
“[^”]*[\u4E00-\u9FA5]+[^”\n]*?”
比如我現在的項目

4800+ 的中文字符串 OMG ! 看到這么多的字符串不要崩潰,我們有便捷的替換方式
Objective - C 替換
NSLocalizedStringFromTableInBundle($0, tbl, bundle, comment)
Swift 替換
NSLocalizedString($0, tbl, bundle, value, comment)
就會把匹配到的中文替換了。
國際化的項目以后編碼中有中文必須要用 以上宏 來寫中文字符串,保證國際化項目的持續(xù)維護。
下面我們來踩坑 Xcode 滿滿的坑
#defineExport 只識別.m中的`NSLocalizedStringFromTableInBundlestaticStatic NSString *str = NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)
使用#define代替或者 直接寫成員變量 在init中初始化NSStringFormat使用
var str = [NSStringFormat]
NSLocalizedStringFromTableInBundle(str, tbl, bundle, comment)`
export 就會識別了Extern就不要使用了,想要使用的話遷移代碼到swift吧
Export相關的方法和坑差不多就這樣了,導出.xliff 去給翻譯團隊翻譯吧。
翻譯結束以后再Import 回來,Localizable.strings 文件 Xcode會自動創(chuàng)建到相應的 .lproj 中,不需要手動管理/添加引用到項目中
如何項目內修改語言
國際化的app是必然要支持項目內切換Language。單純的使用系統(tǒng)語言設置來變更app內Language 是很不友好(愚昧)的方法
看回上邊的系統(tǒng)宏
NSLocalizedStringFromTableInBundle($0, tbl, bundle, comment)
bundle
我們修改項目內語言就是依靠bundle的修改,直接上代碼
獲取當前的Language 和 Bundle
class Localized: NSObject {
// MARK: 文件目錄
static let CHINESE = "zh-Hans"
static let ENGLISH = "en"
// MARK: FUNC
class func language() -> String {
let languages : [String] = NSUserDefaults.standardUserDefaults().objectForKey("AppleLanguages") as! Array
let language : String = languages[0]
if language.hasPrefix(CHINESE) {
return CHINESE
}
return ENGLISH
}
class func bundle() -> NSBundle {
guard let path = NSBundle.mainBundle().pathForResource(self.language(), ofType: "lproj"),
let bundle = NSBundle(path :path)
else { return NSBundle.mainBundle() }
return bundle
}
}
iOS的app中
NSUserDefaults.standardUserDefaults().objectForKey("AppleLanguages")
存放著app支持的所有語言, 第一個 就是當前的語言,Language.lproj 就是當前LocalizedString文件
我們只需要把這個bundle 指向的
lproj文件 指向到我們需要修改的語言
也就是說 我們把NSUserDefaults.standardUserDefaults().objectForKey("AppleLanguages”)的第一個語言修改為我們需要修改的語言就OK了!
比如:
let currentLanguage = Localized.language() // en
NSUserDefaults.standardUserDefaults().setObject("zh-Hans", forKey: "AppleLanguages")
這樣語言就從中文設置到英文了
再重新設置一下RootVC 就搞定了
這樣就可以項目內切換語言了, 希望可以幫到你
這里有一個切換語言的小demo
其他方案
在做國際化方案的時候,一頭霧水的去網上找了一些方案
自己創(chuàng)建本地化文件
InfoPlist.string
Localizable.strings
這種方案 簡直是對編碼的摧殘,把項目中的中文手動添加到
.string文件中,全部 硬編碼。
后續(xù)的更新和維護還要繼續(xù)的硬編碼。
摒棄之