带有快速变量的NSLocalizedString


85

我正在尝试使用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中本地化以实现健壮体系结构的非常不错的文章
Mendy

Answers:


133

您可以在中使用sprintfformat参数NSLocalizedString,因此您的示例如下所示:

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

6
在Localizable.string中看起来如何
Van Du Tran 2015年

与Obj-C中相同:" - %d Notifica"=" - %d Notifica";
重新检测

3
如何替换字符串?我尝试使用%s无效的修饰符= \
igrek

12
@igrek%@用于替换字符串。
Yeehaw '17


94

在WWDC2014“使用Xcode 6进行本地化”的会话#412中,在Swift中实现此目标的正确方法如下:

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

为什么需要使用NSLocalizedString(...)?在String.localizedStringWithFormat(...)的实现中不会发生吗?
Yitzchak


1
谢谢,我问了之后就已经看到了。这对其他人将非常有帮助,所以谢谢
Yitzchak

25

我遵循了创建String扩展的方法,因为我有许多要本地化的字符串。

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

要将其用于代码中的本地化,请执行以下操作:

self.descriptionView.text = "Description".localized

对于具有动态变量的字符串,请遵循:

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

在字符串文件中声明不同语言的字符串(例如:阿拉伯语和英语)

在此处输入图片说明 在此处输入图片说明

希望会有所帮助!


2
但是在我看来,您只是在把时间附加到字符串上。如果您的本地化字符串是什么样呢The doors open at %@ o'clock?您的解决方案仍然有效吗?
侯曼

是的,当我从后面获得String的时间时,它工作得很好。
JaspreetKour

1
感谢您提供对的引用Localizable.strings。但是,我认为@Houman确实值得关注。
马特

我不知道为什么人们要放弃“评论”价值。它赋予文字的描述,其目的本地化工程师没有,他们根本看不出来打算使用该文本上的按钮或标签等
萨蒂扬

7

我尝试了上述解决方案,但是下面的代码对我有用

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

这是我在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相同的函数和属性名称。我通常对所有框架功能使用3个字母的前缀。


-5

我创建了一个extensionto,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)

6
这种方法的最大缺点是,您必须手动提取字符串以发送给翻译器,因为Editor > Export for Localization...它们不会被提取。
杰森·摩尔

鉴于@JasonMoore的建议,我认为这不是正确的方法。
Yuchen Zhong

@JasonMoore完全同意您的看法。你们有没有找到解决方案的?
gasparuff

我不知道为什么此解决方案被降级:(。和几乎低于解决方案的下面的嵌套是相同的,但是它具有更高的升级率
Amr Angry
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.