看完這篇文章你能夠解決國際化的絕大部分問題,而且本人重寫了前人的腳本;能夠實現代碼,xib,storyboard的自動國際化。自動新增,刪除文字,項目中的全部內容,不須要再手動維護,新項目簡單國際化,老項目輕鬆國際化。項目地址前端
我試圖用XCodeEditor來實現一個mac應用,讓咱們的國際化徹底不用在項目中操做,單個語言文件沒問題,可是由於多個國際化語言的文件引用關係始終不能正確設置,因此沒有成功,若是有mac開發的大佬或者對project.pbxproj 這個文件工程核心文件結構有了解的同窗;能夠聯繫我一塊兒實現這個項目python
若是有不清楚的地方,歡迎聯繫我補充。git
一個項目要國際化,首先要在project 的 build settings 中添加須要的語言:github
這裏是選擇整個項目要支持的語言,點+號選擇你須要的就行了。若是是新項目,我強烈建議你勁量多的使用 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 目錄中去。
個人腳本已經處理了細節問題,再也不須要手動維護。國際化只須要填空就行了。
這部分國際化很簡單:
圖片,視頻,音頻沒有區別。
系統權限部分生成多語言文件部分和其餘的沒有區別,你只須要在生成的文件中:
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);
複製代碼