ユーザー コメントを 2 つのUILabelで表示しています。1 つはユーザー名用で、もう 1 つはメッセージ用です。両方のラベルの X、Y 座標は同じですが、メッセージ ラベルの先頭にはユーザー名の幅と同じスペースが追加されます。この手法は、複数行のメッセージを簡単にサポートするのに役立ちます。
ユーザーがアラビア語のメッセージを書くときに問題が発生します。アラビア語は右から左への言語です。つまり、アラビア文字列の先頭ではなく末尾にスペースを追加する必要があります。下のスクリーンショットでわかるように、私はその区別をしておらず、アラビア語のメッセージがユーザー名に出くわしました. では、UILabelのテキスト プロパティ ( NSString ) が右から左へ記述する言語で記述されていることを検出するにはどうすればよいでしょうか?
試行失敗 1: 正規表現
regexesを使用してみましたが、次の関数は、アラビア語を含むすべての文字列に対して常に false を返します。
@implementation UILabel (position)
- (BOOL) containsArabic
{
NSError* error;
NSRegularExpression* regex = [NSRegularExpression
regularExpressionWithPattern:@"\p{Arabic}"
options:0
error:&error
];
return error == nil
&& [regex
numberOfMatchesInString:self.text
options:0
range:NSMakeRange(0, self.text.length)] > 0;
}
@end
試行 2 の失敗: NSLocale
- (BOOL) containsArabic
{
NSString *isoLangCode = (NSString*)CFStringTokenizerCopyBestStringLanguage(
(CFStringRef)self.text,
CFRangeMake(
0,
self.text.length
)
);
NSLocaleLanguageDirection direction = [NSLocale lineDirectionForLanguage:isoLangCode];
NSLog(@"++++++");
NSLog(@"%@", self.text);
NSLog(@"%d", direction);
return direction == NSLocaleLanguageDirectionRightToLeft;
}
出力は役に立たない:
2012-05-28 10:59:11.454 [2110:707] MANCHESTER CITY VS MANCHESTER UNITED LIVE HD
2012-05-28 10:59:11.461 [2110:707] 0
2012-05-28 10:59:11.474 [2110:707] ++++++
2012-05-28 10:59:11.477 [2110:707] tak
2012-05-28 10:59:11.484 [2110:707] 0
2012-05-28 10:59:11.511 [2110:707] ++++++
2012-05-28 10:59:11.513 [2110:707] ونهارك سعيد
2012-05-28 10:59:11.520 [2110:707] 3
2012-05-28 10:59:11.704 [2110:707] ++++++
2012-05-28 10:59:11.712 [2110:707] نهارك سعيد
2012-05-28 10:59:11.740 [2110:707] 3
2012-05-28 10:59:11.763 [2110:707] ++++++
2012-05-28 10:59:11.767 [2110:707] i think i am close
2012-05-28 10:59:11.772 [2110:707] 3