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

隨意留個言吧:)~

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

標籤雲

%d 位部落客按了讚: