iOS國際化方案 & XLIFF

XILLF 是什么 ?

xliff 文件其實就是 針對 string - translation - comment 的一個文件
內容格式如下

String        Translation        Comment
登錄           Log In             login
... 

為什么用XILLF

對于成熟的團隊而言,項目代碼量大,統(tǒng)計漢字是十分頭疼的事情,蘋果給我們開發(fā)者提供的這個工具 - xliff ,就可以把項目代碼中的中文字符串 export 到 xliff文件中,給翻譯團隊進行翻譯,翻譯團隊翻譯成功再 import 回項目中

Export -> translation -> Import

Export

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 滿滿的坑
  1. #define Export 只識別.m 中的`NSLocalizedStringFromTableInBundle
  2. static Static NSString *str = NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)
    使用 #define代替或者 直接寫成員變量 在 init中初始化
  3. NSStringFormat 使用
    var str = [NSStringFormat]
    NSLocalizedStringFromTableInBundle(str, tbl, bundle, comment)`
    export 就會識別了
  4. 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ù)的硬編碼。
摒棄之

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容