Локализуемый.строки не загружают каждую другую сборку?
у меня была странная проблема с системой локализации, встроенной в 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>
вот скриншот того, что происходит с каждой другой сборкой приложения:
исправить:
неправильные:
я озадачен, почему это происходит. Я ничего не делаю вручную с 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?";