2

我在两个UILabel中显示用户评论- 一个用于用户名,一个用于消息。两个标签具有相同的 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 回答
1
- (BOOL)Direction:(NSString *)text
{
    NSString *isoLangCode = (__bridge_transfer NSString*)CFStringTokenizerCopyBestStringLanguage((__bridge CFStringRef)text, CFRangeMake(0, text.length));

    if([isoLangCode isEqualToString:@"ar"])
    {
        return YES;
    }
    return NO;
}
于 2014-08-11T06:43:26.770 回答