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

Можно ли добавлять файлы ресурсов .strings во время выполнения?

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

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

4b9b3361

Ответ 1

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

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

Это предоставит вам способ хранения ваших встроенных в строку строк.

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

genstrings -s "JPLocalizedString" ...

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Итак, если вы хотите использовать локализованные строки как часть Push Notifications, вы должны отправить их в приложение, когда отправляете в магазин. Они не могут быть изменены позже, загрузив что-то с сервера.