2012-05-28 60 views
2

我在兩個UILabels中顯示用戶註釋 - 一個用於用戶名,一個用於消息。兩個標籤都具有相同的X,Y座標,但是消息標籤前面的空格等於用戶名的寬度。這項技術可以幫助我輕鬆支持多行消息。如何檢測UILabel在Cocoa Touch中是否包含從右到左的語言?

用戶編寫阿拉伯語信息時出現問題。阿拉伯語是一種左派語言的權利。這意味着,我必須添加空格到端的阿拉伯字符串,而不是開始。正如你在下面的屏幕截圖中看到的,我沒有做出這種區分,並且阿拉伯消息被輸入了用戶名。那麼如何檢測UILabel的文本屬性(NSString)是以從右到左的語言編寫的?

arabic

失敗的嘗試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 

回答

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:meth od來確定語言的行方向。

+0

該API需要你的語言代碼通過。我不知道如何檢測字符串的語言。 – JoJo

+0

我添加了一段代碼,可以讓你確定用戶的語言偏好。 – dman

+0

這告訴我評論者的首選語言,而不是評論的作者。我需要後者,因爲評論的作者用不同的語言編寫。 – JoJo

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 
     } 
} 
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; 
} 
相關問題