Just My Life & My Work

沒想到簡單的多國語言檔案,也能造成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檔案中有無非正常字元。

檢查看不見字元1

 

我把有問題的字串放到可讓看不見字元現形的網站上去,才知道是個倒退鍵!?據聞資深同事,說後台有時候會收到用戶的作品包含這個字元,實在不曉得他們如何打出來?

Unicode Character ‘NO-BREAK SPACE’ (U+00A0)

哎呀呀~因為這個莫名狀況,影響20+人,產生300+崩潰⋯⋯

參考:Reading Localized StringHow to force NSLocalizedString to use a specific language

Comments on: "[iOS] 檢查多國語言檔案 (Check Localization File)" (3)

  1. 未知 的大頭貼

    好有趣的 bug
    之前翻譯表上漏了分號
    也是前面正常 後面出錯

    也是補上類似的 test case

  2. 未知 的大頭貼

    好有趣的 bug
    分享之前遇到忘了打分號

    也是前面正常。後面才出錯
    之後就補上類似的 test case

回覆給匿名 取消回覆

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲