Можно ли добавлять файлы ресурсов .strings во время выполнения? - PullRequest
11 голосов
/ 20 мая 2011

Я знаю, что в приложениях Mac можно добавлять файлы .strings в папку проекта для добавления локализаций.

Есть ли способ добавить дополнительные локализации в приложение (iOS или Mac OS), не загружая их из пакета ресурсов во время компиляции. Скажем, загрузить дополнительную локализацию и сохранить ее в / Documents for iOS?

Ответы [ 3 ]

19 голосов
/ 20 мая 2011

Да, но это не то, что вы думаете.

Вы можете взять файл строк и загрузить его в NSString, а затем преобразовать его в словарь, используя -[NSString propertyListFromStringsFileFormat].

Это даст вам возможность хранить ваши строки в пользовательском переводе в памяти.

Что касается фактического использования, вам придется определить пользовательские функции перевода.То есть вы больше не можете использовать NSLocalizedString() и друзей.К счастью, genstrings (утилита, используемая для генерации файлов строк) позволяет указывать имена пользовательских функций :

genstrings -s "JPLocalizedString" ...

Это означает, что в коде вы можете определить:

NSString* JPLocalizedString(NSString *key, NSString *comment) {
  return [myLoadedStrings objectForKey:key];
}

, а также JPLocalizedStringFromTable(), JPLocalizedStringFromTableInBundle(), JPLocalizedStringWithDefaultValue().genstrings подберет все это.(Другими словами, то, что NSLocalizedString - это макрос, не означает, что ваша версия должна быть такой)

Если вы сделаете это и будете использовать эти JPLocalizedString варианты, то genstrings все равно будет генерировать ваши строкифайлы для вас (при условии, что вы используете флаг -s).

После вызова этих функций вы можете использовать любой механизм поиска, который вам нужен, по умолчанию вернуться к версиям NSLocalizedString, если вы ничего не можете найти.

1 голос
/ 15 января 2014

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

Предупреждение: для push-уведомлений iOS, использующих локализованные строки, не существует легального метода времени выполнения, позволяющего модифицировать ресурсы встроенных строк, которые используются для перевода локализованных строк.аргументы, отправленные с вашего сервера на родной язык устройства.

Поэтому, если вы хотите использовать локализованные строки как часть push-уведомлений, вы должны отправить их в приложение при отправке в магазин.Они не могут быть изменены позже путем загрузки чего-либо с сервера.

0 голосов
/ 20 мая 2011

Этого можно добиться, переопределив NSBundle различные pathForResource:… методы в категории.(Я бы предположил, что все они проходят через -pathForResource:ofType:inDirectory:forLocalization:, но это не задокументировано, поэтому вы не можете полагаться на это, даже если сейчас это так, поэтому вам следует переопределить их все.)

Я также предлагаю подать запрос на улучшение для чистого способа переопределения механизма поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...