7
votes

iOS application, we're to display news, coming from server. UIlabel is used

  • Everything is perfect when he sentence is in a single language only with no regard to layout (we're switching layout RTL to LTR for different languages, including Arabic, Hebrew)
  • When inside LTR language we have RTL words, they break the sentence structure (see the picture, BTN must be in the beginning of the line, but it jumped to the end) English words inside RTL language Any idea how to solve this? Thanks in advance :)
5

5 Answers

12
votes

Apple are using "Unicode Bidirectional Algorithm" to present text. If the first character in a string is LTR the algorithm treat the presentation of the rest of the string as LTR. If you know in advance the language of the string RTL you can use the unicode \u200F and \u202c to force the RTL alignment.

Objective-C

[NSString stringWithFormat:@"\u200F%@\u202c", @"your string with RTL content"]

[NSString stringWithFormat:@"\u200E%@\u202c", @"your string with LTR content"]

Swift

String(format: "\u200F%@\u202c", "your string with RTL content")

String(format: "\u200E%@\u202c", "your string with LTR content")
4
votes

Here is @Pichirichi solution for swift 5.2 :

"\u{200F}\("your string with RTL content")\u{202c}"

"u200E\("your string with LTR content")\u{202c}"
2
votes
  "arabic text \u200E english text \u200F arabic text \u200E english text"

Solved the issue

1
votes

Swift 5:

extension String {
    
    func forceUnicodeRTL() -> String {
        return "\u{200F}\(self)\u{200E}"
    }
}
0
votes

Some info from here is helpful:

[[self label] setTextAlignment:NSTextAlignmentNatural];

AutoLayout + RTL + UILabel text alignment

But sometimes it still not working as expected