沒想到簡單的多國語言檔案,也能造成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
讚讚
哈~漏了分號應該會有編譯不過
讚讚