沒想到簡單的多國語言檔案,也能造成App邏輯出現問題呢⋯⋯
這次由於檔案中莫名多了個「看不見的字元」,編譯能過,但卻讓NSLocalizedString(key, comment)出現問題!原本傳key會回value,出了問題後傳key會依然回key⋯⋯
問題的關鍵在於看不見的字元阻止NSLocalizedString繼續往下找,在看不見的字元之上還是正常,在看不見的字元之下就遺失⋯⋯
於是乎,想出預防的方法,將標記字串放到多國語言檔案(繁中、簡中、英文)最後面,假如傳key回key的話,就表示檔案有問題!
“Reading_File_Successfully" = “成功讀取文件";
寫個跑三個檔案檢查的程式碼~
/** Theme: 檢查多國語言字串檔案 IDE: Xcode 11 Language: Objective C Date: 108/05/18 Author: HappyMan Blog: https://cg2010studio.wordpress.com/ */ // 檢查多國語言字串檔案 -(void)checkLocalizationFile { NSString *language; for (int i = 0; i < 3; i++) { if (i == 0) {// 繁中 language = @"zh-Hant"; } if (i == 1) {// 簡中 language = @"zh-Hans"; } if (i == 2) {// 英文 language = @"en"; } NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]; NSBundle *bundle = [NSBundle bundleWithPath:path]; NSString *markStr = NSLocalizedStringFromTableInBundle(@"Reading_File_Successfully", nil, bundle, nil); NSLog(@"markStr: %@", markStr); if ([markStr isEqualToString:@"Reading_File_Successfully"]) { SIAlertView *alertView = [[SIAlertView alloc] initWithTitle:@"語系字串檔毀損!" andMessage:language]; alertView.transitionStyle = ; [alertView addButtonWithTitle:NSLocalizedString(@"confirm", nil) type:SIAlertViewButtonTypeDefault handler:nil]; [alertView show]; } } }
這種看不見字元真的很難提防,一來不知名原因被打出來,二來編譯器沒有判斷這個key/value檔案中有無非正常字元。
我把有問題的字串放到可讓看不見字元現形的網站上去,才知道是個倒退鍵!?據聞資深同事,說後台有時候會收到用戶的作品包含這個字元,實在不曉得他們如何打出來?
Unicode Character ‘NO-BREAK SPACE’ (U+00A0)
哎呀呀~因為這個莫名狀況,影響20+人,產生300+崩潰⋯⋯
參考:Reading Localized String、How to force NSLocalizedString to use a specific language。
Comments on: "[iOS] 檢查多國語言檔案 (Check Localization File)" (3)
好有趣的 bug
之前翻譯表上漏了分號
也是前面正常 後面出錯
也是補上類似的 test case
讚讚
好有趣的 bug
分享之前遇到忘了打分號
也是前面正常。後面才出錯
之後就補上類似的 test case
讚讚
哈~漏了分號應該會有編譯不過
讚讚