2

ユーザー コメントを 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
4

3 に答える 3

7

この回答は、ARCを使用していることを前提としています。

NSString *stringToTest = @"Some Foreign Language";

NSString *isoLangCode = (__bridge_transfer NSString*)CFStringTokenizerCopyBestStringLanguage((__bridge CFStringRef)stringToTest, CFRangeMake(0, stringToTest.length));

NSLocaleLanguageDirection direction = [NSLocale characterDirectionForLangauge:isoLangCode];

次に、NSLocale APIのlineDirectionForLanguage:メソッドを使用して、言語の行方向を決定できます。

于 2012-05-28T04:20:54.640 に答える
1

次の関数で、次のコードを追加します

- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
      NSString *isoLangCode = (__bridge_transfer NSString*)CFStringTokenizerCopyBestStringLanguage((__bridge CFStringRef)text, CFRangeMake(0, text.length));

      if([isoLangCode isEqualToString:@"ar"])
      {
         //Arabic
      }
      else
      {
         //Other language
      }
}
于 2014-01-01T11:51:25.190 に答える