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")
Возможно, это не правильный синтаксис для такого рода вещей. Кто-то может объяснить мне, как это сделать быстро? Большое вам спасибо.
Ответы
Ответ 1
Вы можете использовать параметры формата sprintf
в NSLocalizedString
, поэтому ваш пример может выглядеть следующим образом:
let myString = String(format: NSLocalizedString(" - %d Notifica", comment: "sottotitolo prescrizione per le notifiche al singolare"), count)
Ответ 2
В сеансе № 412 WWDC2014 "Локализация с помощью Xcode 6" правильным способом для этого в Swift является следующее:
String.localizedStringWithFormat(
NSLocalizedString(" - %d Notifica",
comment: "sottotitolo prescrizione per le notifiche al singolare"),
count)
Ответ 3
Я следил за подходом создания расширения к 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 для разных языков (пример: арабский и английский)
![введите описание изображения здесь]()
Надеюсь, что это поможет!
Ответ 4
Вот расширение, которое я использую в 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. Я обычно использую трехбуквенный префикс для всех моих функций фреймворка.
Ответ 5
Я попробовал вышеуказанные решения, однако код ниже работал для меня
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? \"%@\"";
Ответ 6
Я создал 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)