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

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

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

или же

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

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

8 ответов

Решение

Вы можете использовать sprintf параметры формата внутри NSLocalizedStringтак что ваш пример может выглядеть так:

let myString = String(format: NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)

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

String.localizedStringWithFormat(
    NSLocalizedString(" - %d Notifica",
    comment: "sottotitolo prescrizione per le notifiche al singolare"),
    count)

Я следовал подходу создания расширения для 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 для разных языков (например, арабский и английский)

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

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

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? \"%@\"";

Вот расширение, которое я использую в 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. Я обычно использую трехбуквенный префикс для всех моих функций фреймворка.

Я написал те же функции для 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!

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

      func NSLocalizedString(_ key: String, tableName: String? = nil, bundle: Bundle = Bundle.main, value: String = "", comment: String, with arguments: CVarArg...) -> String {
    let localizedString = Foundation.NSLocalizedString(key, tableName: tableName, bundle: bundle, value: value, comment: comment)
    return String.localizedStringWithFormat(localizedString, arguments)
}

Я создал 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)
Другие вопросы по тегам