iOS 代碼,xib,storyboard全自動國際化

iOS國際化徹底指南

看完這篇文章你能夠解決國際化的絕大部分問題,而且本人重寫了前人的腳本;能夠實現代碼,xib,storyboard的自動國際化。自動新增,刪除文字,項目中的全部內容,不須要再手動維護,新項目簡單國際化,老項目輕鬆國際化。項目地址前端

我試圖用XCodeEditor來實現一個mac應用,讓咱們的國際化徹底不用在項目中操做,單個語言文件沒問題,可是由於多個國際化語言的文件引用關係始終不能正確設置,因此沒有成功,若是有mac開發的大佬或者對project.pbxproj 這個文件工程核心文件結構有了解的同窗;能夠聯繫我一塊兒實現這個項目python

若是有不清楚的地方,歡迎聯繫我補充。git

國際化的基本姿式

一個項目要國際化,首先要在project 的 build settings 中添加須要的語言:github

這裏是選擇整個項目要支持的語言,點+號選擇你須要的就行了。

Xib和stroyboard國際化

若是是新項目,我強烈建議你勁量多的使用 xib 和 stroyboard 來構建項目,由於若是你遇到了要支持阿拉伯地區的語言,他們的習慣是從右到左的,也就是系統的RTL(rignt to left)。整個界面都須要鏡像翻轉,那時候系統提供的方法只支持xib 和stroyboard 。你若是用的純代碼寫死,那麼會麻煩不少。後端

xib和SB要國際化,其實很簡單;只須要在相應的文件中選擇。bash

點擊Localization,選擇相應的語言,系統就會自動修改項目的實際文件結構:

會出現如下的項目樣子:服務器

這裏要注意下,系統自動生成的文件中會出現已經在xib或者SB 中使用的字符;可是隻會生成在你點擊Localization那一個時刻已經有了的字符,若是你持續開發。又添加刪除了控件,那麼不會自動生成。只有取消該部分國際化,而後再把這種語言打鉤,選擇上以後纔會生成新的文件,而且會覆蓋掉你以前已經寫好的國際化文件。本腳本已經解決這個問題,再也不須要手動維護。解決原理是:微信

ibtool --generate-stringsfile MyNib.strings MyNib.nib
複製代碼

ibtool這個小工具,系統自帶。能夠自動把xib或者sb 生成一個.stings文件。python2.7

代碼國際化

代碼部分的國際化,只有一個辦法就是使用系統的國際化宏:工具

NSLocalizedString("這裏是須要國際化的字符",comment: "這裏是註釋")

#define NSLocalizedString(key, comment) \
	    [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]

...
/* Method for retrieving localized strings. */
- (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1);


#define NSLocalizedStringFromTable(key, tbl, comment) \
	    [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
	    [bundle localizedStringForKey:(key) value:@"" table:(tbl)]

複製代碼

NSLocalizedStringFromTable(key, tbl, comment) 這種方式比較少用,由於這個tbl就是tbl.strings的名字,在代碼部分使用了宏以後。你還須要生成資源文件.strings:

你生成這個文件的時候,輸入的文件名若是是 Localizable 那麼你就使用第一個宏,若是你輸入了別的名字,那麼你就應該使用 NSLocalizedStringFromTable(key, tbl, comment)。其中的tbl就是你輸入的文件名稱。 提示:你能夠在每個.m文件須要國際化的字符裏這樣寫:

button.titleLabel.text = NSLocalizedString(@"可能性測試", 「xxxxx.m」);
複製代碼

以後在生成的國際化語言中,你會發現這個國際化的註釋會生成。當須要翻譯的文字太多時,方便查找是哪一個頁面的字符。

這裏有一個小技巧,無論你是新老項目;你均可以使用正則匹配來查找項目中全部沒有國際化的字符:

如圖:修改項目搜索爲替換,選擇正則匹配,而後添加

@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?"
NSLocalizedString($0, nil)
複製代碼

這樣就能夠快速查找項目中使用了@「中文」這樣格式的字符,替換爲系統的宏。一鍵替換所有,而後使用個人腳本就能夠全自動管理代碼部分的國際化字符。

個人python腳本只支持第一種方式的宏,只要你實現了這個宏。那麼個人腳本就支持全自動導入,自動添加,刪除。建議在comment部分寫上文件名,若是你有了上千個須要翻譯的文字,那麼文件很大的時候。方便你定位具體的字符。 個人實現原理是藉助了:

genstrings -o .m en.lproj
複製代碼

genstrings 系統自帶,能夠把一個文件使用了宏的字符,生成對應的文件到 en.lproj 目錄中去。

個人腳本已經處理了細節問題,再也不須要手動維護。國際化只須要填空就行了。

圖片,影視頻國際化

這部分國際化很簡單:

  1. 代碼部分 和在代碼的文字部分同樣,只要取好key,而後在不一樣的語言中寫好相應的名字就能夠。
  2. xib和SB部分 在項目中專門創建一個文件目錄放置圖片。而後和xib,sb同樣。在右側文件資源監控器中點Localization,而後在項目實際目錄中修改就行了。

圖片,視頻,音頻沒有區別。

系統權限國際化---InfoPlist

系統權限部分生成多語言文件部分和其餘的沒有區別,你只須要在生成的文件中:

NSLocationAlwaysAndWhenInUseUsageDescription = 「使用定位的描述」
複製代碼

查找對應的權限名稱,只須要選擇showRaw就會出現:

系統資源國際化

好比進入調取相冊頁面,通信錄頁面,還有複製粘貼的系統提示等,這部分是跟着 CFBundleDevelopmentRegion 這個權限,系統開發語言走的。這個是系統默認語言。當什麼都沒有的時候,它就會是英文。若是你修改了。系統資源頁面會根據你的修改生效。這裏頗有意思,有兩種選擇方式:一種是選擇國家,一種是選擇具體的語言範圍。這是兩個概念!!若是你要修改默認開發語言,選擇國際。若是你要修改系統資源頁面,你要選擇語言範圍。好比:zh_CN

服務器端國際化

這部分沒有什麼特別的好辦法,純粹是兩端協商實現。通常就兩種:

1.後端徹底實現相應的語言提示返回給前端。 2.後端無論語言,返回一套本身規定的提示語言編號集合。前端根據這個編號提示相應的內容。

應用內語言選擇

其實在iOS中國際化,就是切換不一樣的語言資源,顯示不一樣的文件信息。而後系統用了一個Localizable的系統宏,來維護key/value的關係。系統中每一種語言對應一種bundle資源文件。當你在切換不一樣語言的時候,就去找對應的語言包中的資源。因此咱們能夠利用runtime動態加載不一樣的bundle來實現語言的切換。在demo中有具體的使用例子。

這個部分通常只有兩種實現方式:

1.微信的方式:切換bundle。

2.微博的方式:發送語言切換通知。

這部分討論的文章已經很是多,而且很成熟了;我就不過多贅述。

疑難問題解決

1.阿拉伯地區支持RTL 通過實踐,xib,sb系統提供了很好的方法。只須要用masony來修改代碼部分寫死的佈局,就行了。

2.textView系統不支持 給textview寫一個分類,不難。

3.AttributedString富文本國際化 這一部分有一點定製化的味道,仍是隻有本身寫分類。

腳本使用疑問解答:

  • 若是沒有生效?

    • 請檢查你是否使用了系統的國際化宏,代碼部分,只會生成使用了國際化宏的對應字符。 如:
    button.titleLabel.text = NSLocalizedString(@"可能性測試", nil);
    複製代碼
    • 請檢查你是否有python3環境,mac系統自帶python2.7環境;我使用的是python3.7。
    • 不要使用壓縮包,直接clone項目,而後取項目中的ZPPScript文件。 太晚了,以後慢慢更新。
相關文章
相關標籤/搜索