Подтвердить что ты не робот

Могу ли я загрузить файл localizable.strings в приложение iOS через эфир

Допустим, что мое приложение работает только на английском языке. Но я не хочу выпускать новую версию для каждого добавления нового языка. Мое предложение состоит в том, чтобы загрузить этот localizable.strings файл удаленно в мое приложение.

У моего приложения есть возможность загружать файлы с ftp-сайтов.

Вы, ребята, думаете, что так можно загружать языки? Или приложение должно скомпилировать языковой файл во время компиляции?

4b9b3361

Ответ 1

Все локализованные строковые ресурсы (плюс много других ресурсов) извлекаются из пакета. Обычно приложение использует "основной комплект", который создается XCode вместе с вашим приложением. Но вы можете создать отдельно любой другой пакет, если вы сделаете его с правильной структурой, затем вы можете загрузить его в своем приложении и, наконец, извлечь локализованную строку, используя функцию NSLocalizedStringFromTableInBundle().

Итак, скажем, вы извлекаете для ключа "KEY" перевод языка, тогда нормальный синтаксис будет выглядеть следующим образом:

NSString *translated = NSLocalizedStringFromTable(@"key",nil,nil);

но есть вариант этой опции, который позволяет указать пакет:

NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil);

В стандартном случае вы заменяете myBundle на [NSBundle mainBundle], но если вы хотите использовать другой комплект, вы можете указать его следующим образом:

NSString *myBundlePath = "the path to the downloaded bundle";
NSBundle *myBundle = [NSBundle bundleWithPath:myBundlePath];
NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil);

Полную структуру пакета можно увидеть в "Руководстве по программированию Bundle" в документах Apple, но в вашем случае вы можете просто создать таким образом:

  • на вашем Mac создайте каталог и назовите его "MyBundle"
  • внутри этого каталога перемещайте ваши локализованные строки (если у вас несколько языков в комплекте, тогда файл localizable.strings будет находиться в каталогах lproj: en.lproj, it.lproj, fr.lproj,... )
  • затем переименуйте каталог в "MyBundle.bundle"

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

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