2016-07-27 60 views
4

我有設置一個NSAttributedString大膽的方法:NSLocalizedString集子大膽

func setBold(text: String) -> NSMutableAttributedString { 

    guard let font = UIFont.CustomNormalBoldItalic() else { 
     fatalError("font not found") 
    } 

    let string = NSMutableAttributedString(string:"\(text)", attributes: [NSFontAttributeName : font]) 

    self.setAttributedString(string) 
    return self 
} 

,這是它是如何調用,它正常工作:

let formattedString = NSMutableAttributedString() 
formattedString.setBold("Your text here") 

然而我正在嘗試將一個NSLocalizedString的子字符串的文本設置爲粗體。所以我想嘗試它像這樣:

let formattedString = NSMutableAttributedString() 

return NSAttributedString(string: String.localizedStringWithFormat(
    NSLocalizedString("message", comment: ""), 
    formattedString.setBold(NSLocalizedString("message.day", comment: "")), 
    NSLocalizedString("message.time", comment: "") 
)) 

取而代之的是「今天開始在晚上10點」,它提供了以下的輸出:

Today{ 
NSFont = "<UICTFont: 0x7fb75d4f1330> font-family: \"CustomText-MediumItalic\"; font-weight: normal; font-style: italic; font-size: 14.00pt"; 
} starting at 10pm { 
} 

誰能告訴我在哪裏,我錯了或我如何解決這個問題?我有另一種方法的原因是因爲我有很多LocalizedStrings來設置粗體,並認爲這可能是一個簡單的解決方案。開放給不涉及大量重複/代碼行的其他想法/解決方案。

+0

我會去創建3個NSAttributedString(每個翻譯一個),並附加(第一個必須是NSMutableAttributedString)它們都在最後。你可以選擇你想要設置爲粗體的那一個。 – Larme

+3

並非所有的語言都會將這3個部分放在相同的順序中,或者使用相同的標點符號... – Wain

+0

@Wain在這種情況下,它是兩個部分或子字符串,即%@始於%@。這是一個相當簡單的短語,我在其他語言的匹配英語,並具有相同的標點符號 – coderdojo

回答

1

我只是讓外部字符串html,並讓AttributedString處理繁重的工作。這是迅速的3,但快速2.3應該是直截了當的。還有一些可選的處理方式可以添加,但您可以獲得它的要點。

// samples so I don't have to put a string resource in my playground, you 
// could just as easily pull these from NSLocalizedString 
let format = "<b>%[email protected]</b> starting at <b>%[email protected]</b>" 
let day = "Today" 
let time = "10 PM" 
let raw = String(format:format, day, time) 

let attr = AttributedString(
    html: raw.data(using: .utf8)!, 
    options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType], 
    documentAttributes:nil 
)!