2014-03-13 2 views
5

Angenommen, diese Zeichenfolge es in Englisch und es ist eine Anforderung zu fett oder Farbe usw. zu einem bestimmten Teil einer Textzeichenfolge ist:Gibt es Ansätze für die Verwendung attributierter Strings in Kombination mit der Lokalisierung?

„word1 word2 WORD3 Word4“

, dass die durch Einstellung erreicht werden kann Attribut für den entsprechenden Bereich.

Der Bereich könnte auf (13,5) fest codiert sein, aber dann wäre das natürlich nicht lokalisierbar.

Also alternativ könnte der Bereich dynamisch bestimmt werden, indem man weiß, dass es das 3. Wort ist, auf das das Fett angewendet werden muss.

Aber auch das ist nicht lokalisierbar. Angenommen, dieser Satz wird in Sprache N übersetzt, enthält er nur 2 Wörter oder enthält 5 Wörter in Sprache M?

Also meine Frage ist, wie können Sie Attribute Strings in Kombination mit Lokalisierung ohne viel Hardcoding verwenden?

+0

Eine Lösung könnte etwas wie BBCode-Tags (ich arbeite derzeit an so etwas, aber Sie bekommen die Idee), Markdown-Tags oder etwas ähnliches. Ein Marker, den Sie in Ihren lokalisiertenString einfügen und mit Ihrem AttributedString interpretieren. – Larme

Antwort

2

Sie könnten eine Notation verwenden, um anzugeben, welche Wörter fett dargestellt werden sollen, und dann über einen Transformator verfügen, der Bereiche fett findet und entsprechende Attribute hinzufügt.

word •word• word word

מילה מילה •מילה• מילה מילה

In diesen beiden Sätzen benutze ich den Charakter um anzuzeigen, dass das Wort in zwischen fett sein sollte. Ich kann dann rangeOfString:options:range: verwenden, um zu iterieren und alle Bereiche zu finden, die fett gedruckt werden sollen, und ein Attribut entsprechend einzufügen.

7

Der Ansatz, den ich mit meinem neuesten Projekt nehme ist HTML zu verwenden, in der Localizable.strings-Datei, und dann so etwas wie diese verwenden die NSAttributedString zu generieren:

NSString *htmlString = NSLocalizedString(key, comment); 

[[NSAttributedString alloc] initWithData: 
    [htmlString dataUsingEncoding:NSUTF8StringEncoding] 
         options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, 
            NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} 
       documentAttributes:nil 
          error:nil]] 

(Als persönliche Präferenz, ich diese wickeln alles in eine #define LocalizedHTMLForKey(key), also hoffentlich habe ich keine Tippfehler in diese Antwort hinzugefügt, indem ich es lesbar gemacht habe ...)

2

Genommen von Bens Antwort, schuf ich eine Erweiterung, um mir dies in Swift zu tun.

extension NSAttributedString { 

    convenience init?(withLocalizedHTMLString: String) { 

     guard let stringData = withLocalizedHTMLString.data(using: String.Encoding.utf8) else { 
      return nil 
     } 

     let options: [String : Any] = [ 
      NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, 
      NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue 
     ] 

     try? self.init(data: stringData, options: options, documentAttributes: nil) 
    } 
} 

verwenden initialiser mit Ihrem HTML markiert Zeichenfolge z "By signing up, you agree to our <u><b>Terms & Privacy Policy</b></u>"; und es sollte die ganze Arbeit für Sie erledigen!

Verwandte Themen