Локализуемый.строки не загружают каждую другую сборку?

у меня была странная проблема с системой локализации, встроенной в Cocoa. Я использовал genstrings для создания локализуемого.файл строк для моего проекта, и файл загружает и заменяет строки, как ожидалось в моем приложении.

однако, похоже, работает только каждая другая сборка. Я построю код с помощью XCode, протестирую его на своем устройстве, и он будет отображать правильные строки без проблем. Однако следующая сборка не сможет загрузить файл strings (по крайней мере, это то, что я самонадеянный.) Это не случайно, но предсказуемо каждый другой сборки. Я не делаю ничего необычного с Локализуемым.файл строк.

Я понятия не имею, с чего начать диагностику этой проблемы, и мне было интересно, есть ли у кого-нибудь опыт выполнения локализации на какао.

Я использую NSLocalizedString во всей моей базе кода, например:

NSLocalizedString(@"ReallyNewGame", @"Are you sure you want to start a new game?")

соответствующая запись в my Localizable.файл строк:

/* Are you sure you want to start a new game? */
"ReallyNewGame" = "Do you really want to start a new game?";

вот в части моего Инфо.файл plist:

<key>CFBundleDevelopmentRegion</key>
<string>English</string>

вот скриншот того, что происходит с каждой другой сборкой приложения:

исправить: How it looks when correct

неправильные: How it looks when incorrect

я озадачен, почему это происходит. Я ничего не делаю вручную с Localizable.strings file и я несколько раз очищали свой проект на XCode. Любые указатели в правильном направлении были бы весьма признательны. Если вам нужна дополнительная информация, я постараюсь обеспечить он.

спасибо!

6 ответов


в случае, если это поможет кому-либо еще:

Я столкнулся с точно такой же проблемой: каждая другая сборка локализации не будет работать. Я обнаружил, когда осмотрел содержимое пакета, что Локализуемое.струны в ванной.lproj были повреждены-файл был только 76 байт длиной, когда он должен был быть 4k. В следующей постройке коррупция исчезла, затем снова вернулась, затем исчезла...

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


Я не могу дать вам прямой ответ, но могу предложить несколько способов, чтобы продолжить. На самом деле у меня сейчас нет многоязычного приложения, поэтому большая часть этого-то, что я собрал, прочитав (у меня может быть скоро, поэтому ваша проблема меня интересует):

1) Apple устарела пользователя английского языка.lproj в пользу en.lproj все. В любом случае, важно, чтобы при использовании "English" в качестве значения CFBundleDevelopmentRegion папка называлась "English", а не "en".

2) Ваш файл строк должен быть UTF16 и отмечаться как таковой в инспекторе файлов (это самая правая панель в Xcode)

3) есть хороший предыдущий вопрос это имеет некоторые графические указатели на обеспечение того, что ваши файлы локализации правильно введены в Xcode (так что Xcode знает о том, и знает, что он должен их обрабатывать).

4) возможно, ваш файл поврежден, в руководстве по ресурсам говорится, что вы можете запустить "plutil-lint Localizable.строки " на нем для проверки правильность

5) в качестве примечания, ряд людей указали на Mac App Store App как хорошая утилита для слияния (не перезаписи) строковых файлов (при внесении дополнений).

6) Если все еще выглядит хорошо, добавьте следующее в свой AppDelegate "didFinishLaunchingWithOptions" (вверху) при первом запуске приложения:

NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSLog(@"Strings file: %@", [bundel pathForResource:@"Localizable" ofType:@".strings"]);
NSLog(@"Localizations: %@" [bundle localizations]);
NSLog(@"Local Dict: %@", [bundle localizedInfoDictionary]];
NSLog(@"localizedStringForKey: %@", [bundle localizedStringForKey:@"ReallyNewGame"value:@"WTF???" table:nil];
NSLog(@"Localized String: %@", NSLocalizedString(@"ReallyNewGame", @"Are you sure you want to start a new game?"));
exit(0); // just testing the above for now

выполнить приложение несколько раз. Результат должен быть одинаковым. Если его не добавить комментарий к этому ответу и мы можно сверлить дальше. Если это то же самое, ну, тогда что-то вызывает коррупцию в вашем приложении.


эта проблема возникает, когда:

  • у вас есть по крайней мере два файла */<locale>.lproj/<table_name>.strings, например, два файла */en.lproj/Localizable.strings
  • вы поддерживаете более одного языка с вашим *.strings файлы

вы, вероятно, не создали бы два+ .strings файлы с тем же именем. Эта проблема обычно возникает при использовании внешняя библиотека и Localizable.strings file(s) в своих ресурсах. Вы, вероятно, (s) в код ресурсы-и это конфликт, который XCode не удается разрешить.

TL; DR; общий совет: если вы создаете библиотеку для использования в качестве стороннего кода другими разработчиками, вместо создания и с помощью NSLocalizedString() в нем создайте пользовательскую таблицу локализуемых строк (например,MyLibName.strings) и использовать NSLocalizedStringFromTable.

пример проблемы и вся описание:

я создал репозиторий "проблема-демо":https://github.com/kajot/LocalizedStringsMergingFailure

конкретно с тестом, что не каждый второй запуск: https://github.com/kajot/LocalizedStringsMergingFailure/blob/master/LocalizedStringsMergingFailureTests/LocalizedStringsMergingFailureTests.m

│  ├── KJAppDelegate.h
│   ├── KJAppDelegate.m
│   ├── Localizations1
│   │   ├── de.lproj
│   │   │   └── Localizable.strings
│   │   └── en.lproj
│   │       └── Localizable.strings
│   ├── Localizations2
│   │   ├── de.lproj
│   │   │   └── Localizable.strings
│   │   └── en.lproj
│   │       └── Localizable.strings

каждый другое build, XCode создаст поврежденный в комплекте. Решение: не создавайте/не добавляйте более одного LocalizedString таблица с тем же именем для той же цели.

LocalizedString таблица-это набор */<locale>.lproj/<tableName>.strings файлы. В приведенном выше примере есть две таблицы, каждая с именем Localizable (имя таблицы по умолчанию).

если таблица называется Localizable, вы получаете локализованные строки из таблицы с помощью

`NSLocalizedString(key, optionalComment)`.

устранение:

вы можете либо объединить эти две таблицы (конкатенация соответствующие файлы с переводами с тех же языков) или изменить название одной из таблиц.

Пример второго подхода (изменено название одной из таблиц):

│  ├── KJAppDelegate.h
│   ├── KJAppDelegate.m
│   ├── Localizations1
│   │   ├── de.lproj
│   │   │   └── Localizable.strings
│   │   └── en.lproj
│   │       └── Localizable.strings
│   ├── Localizations2
│   │   ├── de.lproj
│   │   │   └── NewTableName.strings
│   │   └── en.lproj
│   │       └── NewTableName.strings

теперь вы можете получить перевод из новой таблицы (NewTableName) С помощью NSLocalizedStringFromTable(key, @"NewTableName", optionalComment) и из "оригинальной" таблицы (Localizable) через NSLocalizedString(key, optionalComment).


другой поток может поможет... Множественные Локализации.строковые файлы в одном приложении iOS

опять же, возможно, вы можете очистить, а затем построить приложение из xcode...


У меня была аналогичная проблема с моим app-icon. У меня было несколько целей в моем приложении и все с разными значками приложений. По какой-то причине один из значков приложения был поврежден, и поэтому все мои цели переключились через значки приложений других целей. что довольно странно, потому что одна цель не должна знать о других целях app-icon, если она не используется для обеих целей и отмечена для обеих целей в xcode.

Я решил эту проблему, удалив поврежденный png и добавив его новому проекту. Если вы сделаете это с вашим файлом i18n, это тоже может помочь. Но обязательно удалите не только ссылку из xcode, но и весь файл. Лучше всего было бы открыть файл в каком-то внешнем редакторе, таком как textwrangler, и скопировать текст в новый файл, а затем использовать это.

Удачи.


поведение, что вы испытали, - это совершенно нормально. почему?


если вы проверите эти строки, соответствующая часть исходного определения макроса на NSLocalizedString:

#define NSLocalizedString(key, comment) \
        [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

вы могли видеть :

@"Are you sure you want to start a new game?" = "Do you really want to start a new game?";