如何在 Swift 中将 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")

也许这不是这类东西的正确语法。有人能在 Swift 里给我解释一下吗?

66225 次浏览

You can use the sprintf format parameters within NSLocalizedString, so your example can look like this:

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

In Session #412 of the WWDC2014 "Localizing with Xcode 6" the proper way to this in Swift is the following:

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

Note that localizedStringWithFormat sets the returned String's local based on given first argument:

  • No, it does not translate anything.
  • This confusion comes from wrong naming of NSLocalizedString.
  • It should have been named NSTranslatedString, or NSTranslatable (instead of NSLocalizedString).

I created an extension to String since I had many strings to be localized.

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

For example:

let myValue = 10
let anotherValue = "another value"


let localizedStr = "This string is localized: \(myValue) \(anotherValue)".localized
print(localizedStr)

I have followed the approach of creating extension to String as i have many strings to localize.

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

To use it for localization in code do:

self.descriptionView.text = "Description".localized

For strings with dynamic variables follow :

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

Declare the strings in String files for different languages (example : Arabic and English)

enter image description here enter image description here

Hope will be helping!

Here is an extension I use in String, it adds a localizeWithFormat function with variable arguments,

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")
}
}

Usage:

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)

Just be careful not to use the same function and property names that String has. I normally use a 3 letter prefix for all my framework functions.

I tried the above solutions however the code below worked for me

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

I wrote the same functions for 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)
}
}

If you want you can move this localized property to UILabel as well

extension String {
        

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

My localizable

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

Used them like this:

self.greetingLabel.setLocalizedText(key: "hi_n", arguments: [self.viewModel.account!.firstName])
// Shows this on the screen -> Hi, StackOverflow!