2015-08-21 164 views
16

我正在以編程方式創建Localizable,字符串文件。我正在從服務器下載文件並顯示該文件的本地化。檢查Localizable.strings文件是否有效

但是,如果在文件中有一些錯誤,那麼我的本地化不起作用。它顯示了我的鑰匙。如果服務器我編輯的本地化文件,我添加字符串作爲

「參考hello world」 =你好

這裏,關鍵是正確的,但值的格式不正確。格式應爲

「HELLO_WORLD」=「你好」;

如何以編程方式在運行時檢查Localizable.strings文件是否不包含任何錯誤並且是有效的。

請從終端幫助

回答

42

使用plutil

plutil -lint Localizable.strings 
+0

十分感謝。 Xcode 9和終端被使用並仍然在幫助調試 –

1

我有同樣的問題,並發現多是不是「詳細」就夠了。編輯文件的人們想要的東西會告訴他們更確切地說出了什麼問題

plutil太寬了。

,所以我寫了一個快速&骯髒的Java工具來測試一個字符串文件:

https://github.com/Daij-Djan/parseAndValidateAppleStringsFile

免責聲明:我的代碼

13

除了@ Aderstedt的回答是:

plutil -lint Localizable.strings做工作,但是你必須爲每個版本的文件運行它。 E.g

  1. cd到項目根
  2. cd en.lproj - 你可以與你正在使用的任何本地化替換此。
  3. plutil -lint Localizable.strings

當您運行第3步,你要麼顯示一個錯誤,告訴你什麼是錯的文件。或者你會被告知該文件是OK

4

如上plutil(屬性列表實用程序)提到的是驗證.plist.strings文件,如果你手工編輯一個偉大的工具。您可以將它與find相結合,將它應用到您的所有文件.strings。在項目目錄中運行

find . -name *.strings -exec plutil -lint {} \; 

或使用

find . -path ./DerivedData -prune -o -name *.strings -exec plutil -lint {} \; 

如果你想排除您DerivedData目錄(因爲我通常做)。

0

有很多答案,但他們並沒有注重的要點是「編程檢查在運行時」。 我的建議是:

  1. 編程方式找到你下載的文件程序的路徑(比如... /文件/ YourApp.bundle/FR-FR.lproj/Localizable.strings)

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:@"ja"]; 
    
  2. 它轉換爲串

    NSString *fileContents = [NSString stringWithContentsOfFile:localizablePath encoding:NSUTF8StringEncoding error:nil]; 
    NSArray *allLinedStrings = [fileContents componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]]; 
    
  3. 檢查從手動或使用正則表達式allLinedStrings所有線的陣列。下面的代碼是手動的例子有一些簡單的規則檢查:

    for (NSString *line in allLinedStrings) { 
        if (line.length >= 2) { 
         NSString *firstTwoCharacters = [line substringToIndex:2]; 
    
         if (![firstTwoCharacters isEqualToString:@"//"]){ 
          if (![line containsString:@"\";"]) { 
           NSLog(@"Invalid line"); 
          } 
    
          NSUInteger numberOfOccurrences = [[line componentsSeparatedByString:@"\""] count]; 
          if (numberOfOccurrences < 4) { 
           NSLog(@"Invalid line"); 
          } 
         } 
        } 
        else if (line.length > 0) { 
         NSLog(@"Invalid line"); 
        } 
    }