web-dev-qa-db-ja.com

Localizable.stringsファイルが有効かどうかを確認します

プログラムでローカライズ可能な文字列ファイルを作成しています。サーバーからファイルをダウンロードし、そのファイルのローカライズを表示しています。

しかし、ファイルにエラーがある場合、ローカリゼーションは機能しません。キーが表示されます。サーバー上でローカライズファイルを編集し、文字列を次のように追加した場合

"HELLO_WORLD" =こんにちは

ここでは、キーは正しいが、値は正しい形式ではありません。形式は

"HELLO_WORLD" = "こんにちは";

Localizable.stringsファイルにエラーがなく、有効かどうかを実行時にプログラムで確認するにはどうすればよいですか。

助けてください

36
Chetan

ターミナルからplutilを使用します。

plutil -lint Localizable.strings
77
Aderstedt

@Aderstedtの答えに加えて:

plutil -lint Localizable.stringsは機能しますが、ファイルのバージョンごとに実行する必要があります。例えば

  1. cdをプロジェクトルートに
  2. cd en.lproj-これは、使用しているローカリゼーションに置き換えることができます。
  3. plutil -lint Localizable.strings

ステップ3を実行すると、ファイルの何が問題なのかを示すエラーが表示されます。または、ファイルに問題がないことが通知されます

28
JackColley

上記のように、plutil(プロパティリストユーティリティ)は、.plistおよび.stringsファイルを手動で編集した場合にそれらを検証するための優れたツールです。 findと組み合わせることにより、すべての.stringsファイルに適用できます。プロジェクトディレクトリで実行

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

または使用する

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

DerivedDataディレクトリを除外したい場合(通常のように)。

9
Patru

私は同じ問題を抱えていて、複数形では「詳細」ではないことがわかりました。ファイルを編集している人々は、何が間違っているかをより正確に伝えるものを望んでいた

plutilは広すぎます。

そこで、文字列ファイルをテストするためのquick&dirty Javaツールを作成しました。

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

免責事項:私のコード

1
Daij-Djan

多くの答えがありますが、主なポイントに焦点を当てていなかったのは、「プログラムでチェック実行時」です。私の提案は次のとおりです。

  1. ダウンロードしたファイルプログラムのパスをプログラムで見つけます(.../Documents/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");
        }
    }
    
0
Tony TRAN