NSLocalizedString с быстрой переменной

Я пытаюсь локализовать свое приложение с помощью NSLocalizedString. Когда я импортирую файл XLIFF, большинство из них работает как шарм, но что-то не работает, а некоторые строки не локализованы. Я заметил, что проблема связана с NSLocalizedString, содержащим внутри что-то переменное, например:

NSLocalizedString(" - \(count) Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare")

or

NSLocalizedString("Notifica per \(medicina!) della prescrizione \(prescription!)\nMemo: \(memoTextView.text)", comment: "Messaggio della Local Notification")

Возможно, это неправильный синтаксис для подобных вещей. Кто-нибудь может объяснить мне, как это сделать быстро? Большое тебе спасибо.


person Andorath    schedule 09.10.2014    source источник
comment
Это очень хорошая статья о локализации в Swift для надежной архитектуры   -  person Mendy    schedule 07.04.2019


Ответы (7)


Вы можете использовать параметры формата sprintf в NSLocalizedString, поэтому ваш пример может выглядеть следующим образом:

let myString = String(format: NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)
person zisoft    schedule 09.10.2014
comment
Как это выглядит в Localizable.string - person Van Du Tran; 17.11.2015
comment
то же, что и в Obj-C: " - %d Notifica"=" - %d Notifica"; - person ReDetection; 18.04.2016
comment
Как заменить строку? Я пробовал использовать модификатор %s, который не сработал = \ - person igrek; 22.12.2016
comment
@igrek Используйте %@ для замены строки. - person Yeehaw; 14.02.2017
comment
Ссылка для этих параметров форматирования: developer.apple. .com / library / content / documentation / Cocoa /. - person Shaun Dychko; 30.08.2017
comment
Можете ли вы рассказать мне об использовании параметров комментария внутри NSLocalizedString () ?? - person lpd; 20.06.2018

В Сессии № 412 WWDC2014 «Локализация с помощью Xcode 6» правильный способ сделать это в Swift следующий:

String.localizedStringWithFormat(
    NSLocalizedString(" - %d Notifica",
    comment: "sottotitolo prescrizione per le notifiche al singolare"),
    count)
person Mark    schedule 28.06.2015
comment
Зачем вам нужно использовать NSLocalizedString (...)? разве это не происходит в реализации String.localizedStringWithFormat (...)? - person Yitzchak; 27.09.2016
comment
Проверьте (stackoverflow.com/questions/26237549/) - person Mark; 27.09.2016
comment
Спасибо, я уже видел это после того, как спросил. Это будет очень полезно для других, поэтому спасибо - person Yitzchak; 27.09.2016

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

extension String {
    var localized: String {
        return NSLocalizedString(self, comment:"")
    }
}

Чтобы использовать его для локализации в коде, выполните:

self.descriptionView.text = "Description".localized

Для строк с динамическими переменными выполните следующие действия:

self.entryTimeLabel.text = "\("Doors-open-at".localized) \(event.eventStartTime)"

Объявите строки в файлах String для разных языков (пример: арабский и английский)

введите здесь описание изображения  введите описание изображения здесь

Надеюсь поможет!

person JaspreetKour    schedule 28.06.2017
comment
Но мне кажется, вы просто привязываете время к веревочке. Что, если бы ваша локализованная строка была похожа на The doors open at %@ o'clock. Будет ли ваше решение работать? - person Houman; 04.06.2018
comment
Да, он работает отлично, так как я получаю время как String сзади. - person JaspreetKour; 05.06.2018
comment
Спасибо за ссылку на Localizable.strings. Однако я думаю, что у @Houman есть серьезные опасения. - person Matt; 14.11.2018
comment
Я не знаю, почему люди хотят отказаться от комментариев. Он дает инженерам по локализации описание текста и его назначение, без которого они не смогут понять намерение использовать этот текст на кнопке или в качестве метки и т. Д. - person Satyam; 19.07.2020
comment
Это не нормально, как сказал Хоуман, но это общий способ объединения строк. - person Alex Bartiş; 02.06.2021

Вот расширение, которое я использую в String, оно добавляет функцию localizeWithFormat с переменными аргументами,

extension String:{

     func localizeWithFormat(arguments: CVarArg...) -> String{
        return String(format: self.localized, arguments: arguments)        
     }

     var localized: String{
         return Bundle.main.localizedString(forKey: self, value: nil, table: "StandardLocalizations")
     }
}

Использование:

let siriCalendarText = "AnyCalendar"
let localizedText = "LTo use Siri with my app, please set %@ as the default list on your device reminders settings".localizeWithFormat(arguments: siriCalendarTitle)

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

person the Reverend    schedule 12.10.2018

Я пробовал вышеуказанные решения, но приведенный ниже код работал у меня.

SWIFT 4

extension String {

    /// Fetches a localized String
    ///
    /// - Returns: return value(String) for key
    public func localized() -> String {
        let path = Bundle.main.path(forResource: "en", ofType: "lproj")
        let bundle = Bundle(path: path!)
        return (bundle?.localizedString(forKey: self, value: nil, table: nil))!
    }


    /// Fetches a localised String Arguments
    ///
    /// - Parameter arguments: parameters to be added in a string
    /// - Returns: localized string
    public func localized(with arguments: [CVarArg]) -> String {
        return String(format: self.localized(), locale: nil, arguments: arguments)
    }

}

// variable in a class
 let tcAndPPMessage = "By_signing_up_or_logging_in,_you_agree_to_our"
                                     .localized(with: [tAndc, pp, signin])

// Localization File String
"By_signing_up_or_logging_in,_you_agree_to_our" = "By signing up or logging in, you agree to our \"%@\" and \"%@\" \nAlready have an Account? \"%@\"";
person Pratik    schedule 04.06.2019

Я написал те же функции для UILabel

extension UILabel {
    
    func setLocalizedText(key: String) {
        self.text = key.localized
    }
    
    func setLocalizedText(key: String, arguments: [CVarArg]) {
        self.text = String(format: key.localized, arguments: arguments)
    }
}

Если вы хотите, вы также можете переместить это свойство localized в UILabel

extension String {
        
    var localized: String{
        return Bundle.main.localizedString(forKey: self, value: nil, table: nil)
    }
}

Моя локализуемая

"hi_n" = "Hi, %@!";

Использовал их так:

self.greetingLabel.setLocalizedText(key: "hi_n", arguments: [self.viewModel.account!.firstName])
// Shows this on the screen -> Hi, StackOverflow!
person OhhhThatVarun    schedule 27.02.2021
comment
Как swift узнает, какой setLocalizedText выбрать, поскольку в вашем строковом расширении их 2? - person Robert Brax; 11.05.2021

Я создал extension на String, так как у меня было много strings, чтобы быть localized.

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

Например:

let myValue = 10
let anotherValue = "another value"

let localizedStr = "This string is localized: \(myValue) \(anotherValue)".localized
print(localizedStr)
person Santosh    schedule 20.12.2016
comment
Большим недостатком этого подхода является то, что вам нужно вручную извлекать строки для отправки переводчику, поскольку Editor > Export for Localization... их не заберет. - person Jason Moore; 23.01.2017
comment
Учитывая то, что предложил @JasonMoore, я не думаю, что это правильный подход. - person Yuchen; 13.02.2017
comment
@JasonMoore полностью с вами согласен. Кто-нибудь из вас нашел для этого решение? - person gasparuff; 12.04.2017
comment
я не знал, почему это решение занижено :(. и почти нижнее гнездо ниже решение такое же, но оно имеет повышенную скорость - person Amr Angry; 21.08.2017