Обнаружил, что не так: мне пришлось использовать полную (расширенную) версию NSLocalizedString (), чтобы заставить вызов функции получить перевод из моих файлов Localizable.strings
(вместо клиентского приложения) фреймворка следующим образом:
NSLocalizedString("Continue", tableName: tableName, bundle: bundle, comment: "Continue in the button title of UIAladdinOnboardingViewController")
Где:
tableName
: глобальный объект let, содержащий имя моего локализуемого строкового файла (в моем случае "Aladdin.Localizable"
). Я сделал это, чтобы избежать возможного столкновения файлов .strings (так как мое имя фреймворка Aladdin
);
bundle
: глобальная переменная let в моем пространстве имен Framework для обозначения пакета модели Framework, из которого нужно выбрать строку. Я определил это так: let bundle = Bundle(for: ExtendedAppDelegate.self)
где ExtendedAppDelegate - один из моих пользовательских классов фреймворка.
Важное примечание:
Кстати, не помещайте вашу интерполяционную строку в качестве ключевого параметра вызова NSLocalizedString
, иначе она будет интерполирована во время выполнения, что приведет к интерполированной строке, которая не будет существовать в вашем строковом файле.
Не делайте этого:
let s = NSLocalizedString("{Start your \(introductoryPeriod) free trial.}", tableName: tableName, bundle: bundle, comment: "in price display")
Сделайте это:
let s = String(format: NSLocalizedString("{Start your %@ free trial.}", tableName: tableName, bundle: bundle, comment: "{Start your \\(introductoryPeriod) free trial.}"), introductoryPeriod)
С соответствующими строками Aladdin.Localizable.strings (en):
/* {Start your \(introductoryPeriod) free trial.} (in price display) */
"{Start your %@ free trial.}" = "{Start your %@ free trial.}";
Для генерации строк:
Я использовал жесты из терминала следующим образом:
$genstrings -o en.lproj/ *.swift
$genstrings -o fr.lproj/ *.swift
И так далее для всех ваших целевых языков.
Наконец, сделайте перевод прямо в строковых файлах.