プログラムでローカライズ可能な文字列ファイルを作成しています。サーバーからファイルをダウンロードし、そのファイルのローカライズを表示しています。
しかし、ファイルにエラーがある場合、ローカリゼーションは機能しません。キーが表示されます。サーバー上でローカライズファイルを編集し、文字列を次のように追加した場合
"HELLO_WORLD" =こんにちは
ここでは、キーは正しいが、値は正しい形式ではありません。形式は
"HELLO_WORLD" = "こんにちは";
Localizable.stringsファイルにエラーがなく、有効かどうかを実行時にプログラムで確認するにはどうすればよいですか。
助けてください
ターミナルからplutil
を使用します。
plutil -lint Localizable.strings
@Aderstedtの答えに加えて:
plutil -lint Localizable.strings
は機能しますが、ファイルのバージョンごとに実行する必要があります。例えば
cd
をプロジェクトルートにcd en.lproj
-これは、使用しているローカリゼーションに置き換えることができます。plutil -lint Localizable.strings
ステップ3を実行すると、ファイルの何が問題なのかを示すエラーが表示されます。または、ファイルに問題がないことが通知されます
上記のように、plutil
(プロパティリストユーティリティ)は、.plist
および.strings
ファイルを手動で編集した場合にそれらを検証するための優れたツールです。 find
と組み合わせることにより、すべての.strings
ファイルに適用できます。プロジェクトディレクトリで実行
find . -name *.strings -exec plutil -lint {} \;
または使用する
find . -path ./DerivedData -Prune -o -name *.strings -exec plutil -lint {} \;
DerivedData
ディレクトリを除外したい場合(通常のように)。
私は同じ問題を抱えていて、複数形では「詳細」ではないことがわかりました。ファイルを編集している人々は、何が間違っているかをより正確に伝えるものを望んでいた
plutilは広すぎます。
そこで、文字列ファイルをテストするためのquick&dirty Javaツールを作成しました。
https://github.com/Daij-Djan/parseAndValidateAppleStringsFile
免責事項:私のコード
多くの答えがありますが、主なポイントに焦点を当てていなかったのは、「プログラムでチェック実行時」です。私の提案は次のとおりです。
ダウンロードしたファイルプログラムのパスをプログラムで見つけます(.../Documents/YourApp.bundle/fr-FR.lproj/Localizable.stringsのように)
NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:@"ja"];
文字列の配列に変換します
NSString *fileContents = [NSString stringWithContentsOfFile:localizablePath encoding:NSUTF8StringEncoding error:nil];
NSArray *allLinedStrings = [fileContents componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]];
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");
}
}