Есть ли в Swift эквивалент NSLocalizedString(...)
? В Objective-C
, мы обычно используем:
NSString *string = NSLocalizedString(@"key", @"comment");
Как я могу добиться того же в Swift? Я нашел функцию:
func NSLocalizedString(
key: String,
tableName: String? = default,
bundle: NSBundle = default,
value: String = default,
#comment: String) -> String
Однако это очень долго и совсем не удобно.
NSLocalizedString("Cancel", comment: "Cancel button title")
преимущества значений по умолчанию. Это удобно, я думаю.Ответы:
Я использую следующее решение:
1) создать расширение:
2) в файле Localizable.strings :
3) пример использования:
наслаждаться! ;)
--upd: -
для случая с комментариями вы можете использовать это решение:
1) Расширение:
2) в файле .strings:
3) используя:
источник
genstrings
утилиту для генерации файлов .strings.func localized(comment: String = "") -> String
чтобы он стал меньше и с дополнительными комментариями :)genstrings
это?genstrings
работает только с литеральными строками, переданными в NSLocalizedString. С этим умным обходным путем вы теряете возможность обновлять ваши файлы .strings с помощьюgenstrings
инструмента, и по крайней мере для меня это означает, что я не смогу использовать этот упрощенный подход.NSLocalizedString
Существует и в мире Свифта.Параметры
tableName
,bundle
иvalue
помеченыdefault
ключевым словом, которое означает, что мы можем опустить эти параметры при вызове функции. В этом случае будут использоваться их значения по умолчанию.Это приводит к выводу, что вызов метода может быть упрощен до:
Swift 5 - без изменений, все так же работает.
источник
Wrap in NSLocalizedString
опция, которая действительно упрощает задачу, просто выделяя текст, щелкая правой кнопкой мыши и выбирая пункт меню.Вариант существующих ответов:
Swift 5.1:
Затем вы можете просто использовать его с комментариями или без них:
Обратите внимание, что
genstrings
не будет работать с этим решением.источник
Используя этот способ, можно создать другую реализацию для разных типов (например, Int или пользовательские классы, такие как CurrencyUnit, ...). Также возможно выполнить поиск этого метода, используя утилиту genstrings. Просто добавьте флаг подпрограммы в команду
расширение:
использование:
источник
Swift 3 версия:) ...
источник
На самом деле, вы можете использовать две фазы для перевода ваших текстов в проекты Swift:
1) На первом этапе используется старый способ создания всех ваших переводимых строк:
1.1) Затем вы должны использовать genstrings для генерации Localizable.strings:
2) После этого вы должны использовать этот ответ .
2.1) Используйте параметр XCode «Найти и заменить» на основе регулярного выражения. Что касается данного примера (если у вас нет комментариев), регулярное выражение будет:
и заменить его на
или (если у вас есть комментарии)
и заменить его на
Вы можете играть с регулярными выражениями и различными комбинациями расширений по своему желанию. Общий способ - разделить весь процесс на две фазы. Надеюсь, это поможет.
источник
NSLocalizedString("Cancel", comment: "Cancel button title")
?NSLocalizedString
выглядит менее быстрым, чем должно выглядеть.String.localized
с другой стороны, выглядит более Swifty, но вы не можете использоватьgesntrings
утилиту, которая обычно используется для облегчения вашей работы с интернационализацией. Я хочу сказать, что оба подхода довольно легко смешать. Так что в основном это вопрос читабельности.genstrings
? Есть ли заменить обратно все.localized
наNSLocalizedString
?Создан небольшой вспомогательный метод для случаев, когда «комментарий» всегда игнорируется. Меньше кода легче читать:
Просто поместите его где угодно (вне класса), и Xcode найдет этот глобальный метод.
источник
Наверное, лучший способ это здесь .
и
Вы можете использовать это так
для меня это лучшее, потому что
источник
static var Hello: String = { return NSLocalizedString("Hello") }
Когда вы разрабатываете SDK. Вам нужна дополнительная операция.
1) создайте Localizable.strings как обычно в YourLocalizeDemoSDK.
2) создайте те же Localizable.strings в YourLocalizeDemo.
3) найдите свой путь к пакету YourLocalizeDemoSDK.
Swift4 :
Bundle(for: type(of: self))
поможет вам найти комплект в YourLocalizeDemoSDK. Если вы используетеBundle.main
вместо этого, вы получите неправильное значение (на самом деле это будет та же строка с ключом).Но если вы хотите использовать расширение String, упомянутое доктором OX . Вам нужно сделать еще немного. Исходное расширение выглядит следующим образом.
Как мы знаем, мы разрабатываем SDK,
Bundle.main
получим комплект поставки YourLocalizeDemo. Это не то, что мы хотим. Нам нужен пакет в YourLocalizeDemoSDK. Это трюк, чтобы быстро его найти.Запустите приведенный ниже код в экземпляре NSObject в YourLocalizeDemoSDK. И вы получите URL-адрес YourLocalizeDemoSDK.
Распечатав оба этих URL, вы обнаружите, что мы можем построить базу bundleURLofSDK на mainBundleURL. В этом случае это будет:
И расширение String будет:
Надеюсь, поможет.
источник
Я создал свой собственный инструмент genstrings для извлечения строк с помощью пользовательской функции перевода
https://gist.github.com/Maxdw/e9e89af731ae6c6b8d85f5fa60ba848c
Он проанализирует все ваши swift-файлы и экспортирует строки и комментарии в вашем коде в файл .strings.
Вероятно, не самый простой способ сделать это, но это возможно.
источник
Хотя это не отвечает на проблему сокращения, но это помогло мне организовать сообщения, я создал структуру для сообщений об ошибках, как показано ниже
Таким образом, вы можете упорядочить сообщения и заставить генстрины работать.
И это команда genstrings, используемая
источник
Полезно для использования в модульных тестах:
Это простая версия, которая может быть расширена на различные варианты использования (например, с использованием tableNames).
Используйте это так:
Или так с комментарием:
источник
Это улучшение подхода ".localized". Начните с добавления расширения класса, поскольку это поможет с любыми строками, которые вы устанавливали программно:
Пример использования для строк, которые вы устанавливаете программно:
Теперь файлы перевода раскадровки XCode делают файловый менеджер грязным и плохо обрабатывают обновления раскадровки. Лучше всего создать новый базовый класс меток и назначить его всем меткам раскадровки:
Теперь каждый ярлык, который вы добавляете и задаете по умолчанию в раскадровке, будет автоматически переведен, если вы предоставите для него перевод.
Вы можете сделать то же самое для UIButton:
источник
Когда вы переводите, скажем, с английского языка, где фраза такая же, на другой язык, где она отличается (из-за пола, спряжения глаголов или склонения), самая простая форма NSString в Swift, которая работает во всех случаях, - это три аргумента: , Например, английская фраза «предыдущий был» переводится по-разному на русский для случая «вес» («предыдущий ий был») и для «талии» («предыдущее ая был а »).
В этом случае вам нужны два разных перевода для одного источника (в соответствии с инструментом XLIFF, рекомендованным в WWDC 2018). Вы не можете достичь этого с двумя аргументами NSLocalizedString, где «предыдущий был» будет одинаковым как для «ключа», так и для перевода на английский язык (т.е. для значения). Единственный способ - использовать форму с тремя аргументами.
где ключи («previousWasFeminine» и «previousWasMasculine») разные.
Я знаю, что общий совет - переводить фразу целиком, однако иногда она слишком трудоемка и неудобна.
источник
Локализация с языком по умолчанию:
источник