XILLF 是什么 实束?
xliff 文件其實(shí)就是 針對(duì) string - translation - comment 的一個(gè)文件
內(nèi)容格式如下
String Translation Comment
登錄 Log In login
...
為什么用XILLF
對(duì)于成熟的團(tuán)隊(duì)而言赎婚,項(xiàng)目代碼量大康辑,統(tǒng)計(jì)漢字是十分頭疼的事情,蘋(píng)果給我們開(kāi)發(fā)者提供的這個(gè)工具 - xliff 郑趁,就可以把項(xiàng)目代碼中的中文字符串 export 到 xliff文件中刊驴,給翻譯團(tuán)隊(duì)進(jìn)行翻譯,翻譯團(tuán)隊(duì)翻譯成功再 import 回項(xiàng)目中
Export -> translation -> Import
Export
export 是統(tǒng)計(jì)項(xiàng)目 字符串
的關(guān)鍵
Objective - C 和 Swift , Xcode只識(shí)別 NSLocalizedString
開(kāi)頭的宏命中包含的Key值
Objective - C
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
推薦使用第二個(gè)寡润,可以項(xiàng)目?jī)?nèi)語(yǔ)言切換
#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]*?”
比如我現(xiàn)在的項(xiàng)目
4800+ 的中文字符串 OMG 捆憎! 看到這么多的字符串不要崩潰,我們有便捷的替換方式
Objective - C 替換
NSLocalizedStringFromTableInBundle($0, tbl, bundle, comment)
Swift 替換
NSLocalizedString($0, tbl, bundle, value, comment)
就會(huì)把匹配到的中文替換了梭纹。
國(guó)際化的項(xiàng)目以后編碼中有中文必須要用 以上宏
來(lái)寫(xiě)中文字符串躲惰,保證國(guó)際化項(xiàng)目的持續(xù)維護(hù)。
下面我們來(lái)踩坑 Xcode 滿滿的坑
#define
Export 只識(shí)別.m
中的`NSLocalizedStringFromTableInBundlestatic
Static NSString *str = NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)
使用#define
代替或者 直接寫(xiě)成員變量 在init
中初始化NSStringFormat
使用
var str = [NSStringFormat]
NSLocalizedStringFromTableInBundle(str, tbl, bundle, comment)`
export 就會(huì)識(shí)別了Extern
就不要使用了变抽,想要使用的話遷移代碼到swift
吧
Export相關(guān)的方法和坑差不多就這樣了础拨,導(dǎo)出.xliff 去給翻譯團(tuán)隊(duì)翻譯吧氮块。
翻譯結(jié)束以后再I(mǎi)mport 回來(lái),Localizable.strings
文件 Xcode會(huì)自動(dòng)創(chuàng)建到相應(yīng)的 .lproj 中诡宗,不需要手動(dòng)管理/添加引用到項(xiàng)目中
如何項(xiàng)目?jī)?nèi)修改語(yǔ)言
國(guó)際化的app是必然要支持項(xiàng)目?jī)?nèi)切換Language滔蝉。單純的使用系統(tǒng)語(yǔ)言設(shè)置來(lái)變更app內(nèi)Language 是很不友好(愚昧)
的方法
看回上邊的系統(tǒng)宏
NSLocalizedStringFromTableInBundle($0, tbl, bundle, comment)
bundle
我們修改項(xiàng)目?jī)?nèi)語(yǔ)言就是依靠bundle的修改,直接上代碼
獲取當(dāng)前的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支持的所有
語(yǔ)言塔沃, 第一個(gè)
就是當(dāng)前
的語(yǔ)言蝠引,Language.lproj
就是當(dāng)前
LocalizedString文件
我們只需要把這個(gè)bundle 指向的
lproj
文件 指向到我們需要修改的語(yǔ)言
也就是說(shuō) 我們把NSUserDefaults.standardUserDefaults().objectForKey("AppleLanguages”)
的第一個(gè)語(yǔ)言修改為我們需要修改的語(yǔ)言就OK了!
比如:
let currentLanguage = Localized.language() // en
NSUserDefaults.standardUserDefaults().setObject("zh-Hans", forKey: "AppleLanguages")
這樣語(yǔ)言就從中文設(shè)置到英文了
再重新設(shè)置一下RootVC 就搞定了
這樣就可以項(xiàng)目?jī)?nèi)切換語(yǔ)言了, 希望可以幫到你
這里有一個(gè)切換語(yǔ)言的小demo
其他方案
在做國(guó)際化方案的時(shí)候芳悲,一頭霧水的去網(wǎng)上找了一些方案
自己創(chuàng)建本地化文件
InfoPlist.string
Localizable.strings
這種方案 簡(jiǎn)直是對(duì)編碼的摧殘立肘,把項(xiàng)目中的中文手動(dòng)添加到
.string
文件中,全部 硬編碼
名扛。
后續(xù)的更新和維護(hù)還要繼續(xù)的硬編碼。
摒棄之