it-swarm.com.ru

Проверьте, является ли файл Localizable.strings действительным

Я создаю Localizable, файл строки программно. Я загружаю файл с сервера и показываю локализацию из этого файла.

Но если в файле есть какая-то ошибка, моя локализация не работает. Это показывает мне ключи. Если на сервере я редактирую файл локализации и добавляю строку как 

"HELLO_WORLD" = Привет

Здесь ключ правильный, но значение не в правильном формате. Формат должен быть как 

"HELLO_WORLD" = "Привет";

Как я могу программно проверить во время выполнения, если мой файл Localizable.strings не содержит ошибок и является допустимым.

Пожалуйста помоги

30
Chetan

Используйте plutil из терминала:

plutil -lint Localizable.strings
67
Aderstedt

В дополнение к ответу @ Aderstedt:

plutil -lint Localizable.strings работает, но вы должны запускать его для каждой версии файла. Например

  1. cd в корень вашего проекта
  2. cd en.lproj - вы можете заменить его любой локализацией, с которой вы работаете.
  3. plutil -lint Localizable.strings

При выполнении шага 3 вам будет показана ошибка, сообщающая, что не так с вашим файлом. Или вам скажут, что файл в порядке

26
JackColley

Как упоминалось выше, plutil (утилита списка свойств) - отличный инструмент для проверки ваших файлов .plist и .strings, если вы редактируете их вручную. Вы можете применить его ко всем вашим файлам .strings, комбинируя его с find. В каталоге вашего проекта запустите

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

или использовать

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

если вы хотите исключить каталог DerivedData (как я обычно это делаю).

9
Patru

У меня была та же проблема, и я обнаружил, что множественное число недостаточно детализировано. Люди, редактирующие файлы, хотели чего-то, что могло бы сказать им более точно, что не так

plutil слишком широк.

поэтому я написал быстрый и грязный инструмент Java для тестирования файла строк:

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

отказ от ответственности: мой код

1
Daij-Djan

Есть много ответов, но они не фокусировались на основных моментах: " программно check во время выполнения " . Мое предложение:

  1. Программно найти путь к загруженной вами файловой программе (Like .../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