2012-07-05 30 views

Trả lời

28

Trong iOS 9, người dùng có thể xác định hướng hiện tại cho từng chế độ xem riêng lẻ.

if #available(iOS 9.0, *) { 
    if UIView.userInterfaceLayoutDirection(
    for: myView.semanticContentAttribute) == .rightToLeft { 

     // The view is shown in right-to-left mode right now. 
    } 
} else { 
    // Use the previous technique 
    if UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft { 

     // The app is in right-to-left mode 
    } 
} 

Đây là cách đề nghị xác định hướng bố trí trong iOS 9.

WWDC 2015 Video New UIKit Support for International User Interfaces. Sau phút 31:20.

+1

Có cách nào để đánh dấu câu trả lời là "đúng bây giờ" không? Đối với hậu thế, câu trả lời tôi đã chọn ba năm trước là chính xác vào thời điểm đó, nhưng điều này có lẽ nên cao hơn. – BarrettJ

+0

@BarrettJ bạn luôn có thể không chấp nhận và chấp nhận một câu trả lời khác. – SmokeDispenser

+1

Bây giờ là 'UIView.userInterfaceLayoutDirectionForSemanticContentAttribute (semanticContentAttribute) == .RightToLeft'. – ChrisB

17

NSLocale có hai phương pháp +characterDirectionForLanguage:+lineDirectionForLanguage:. Điều đầu tiên có lẽ là Trái sang phải và Từ phải sang trái và thứ hai là từ trên xuống dưới so với từ dưới lên trên. Bạn có thể vượt qua kết quả của [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode].

Cập nhật:

Các câu hỏi ban đầu hỏi là làm thế nào để xác định xem ngôn ngữ điện thoại là RTL. Sử dụng +[NSLocale characterDirectionForLanguage:]+[NSLocale lineDirectionForLanguage:] là chính xác một cách rõ ràng cho điều đó; bạn có thể vượt qua [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode] hoặc [NSLocale preferredLanguages][0] để biết thông tin có liên quan (Tôi không chắc chắn liệu có phải NSLocaleLanguageCode sử dụng ngôn ngữ ưa thích hay vùng đã đặt) hay không.

Tuy nhiên, rất có khả năng những gì mà áp phích ban đầu thực sự muốn biết là liệu giao diện của ứng dụng có nên được trình bày trong RTL hoặc LTR hay không. Điều này rất giống với việc hỏi hướng của ngôn ngữ là gì, ngoại trừ việc tính toán nội địa hóa sẵn có của ứng dụng. Nếu ứng dụng không được bản địa hóa sang ngôn ngữ ưa thích của người dùng, nó sẽ sử dụng ngôn ngữ không ưa thích thay thế. Và câu trả lời cho câu hỏi này là sử dụng [UIApplication sharedApplication].userInterfaceLayoutDirection.

+4

Thật không may điều này là không chính xác; cách tốt nhất để làm điều đó là thông qua '' '[UIApplication sharedApplication] .userInterfaceLayoutDirection''', như đã đề cập trong [answer below] (http://stackoverflow.com/a/25500099/242849). – wakachamo

+1

Bỏ phiếu bầu cho câu trả lời này. Vui lòng xem nhận xét của 'wakachamo' để biết cách xác định hướng bố cục giao diện tốt nhất. – Sean

+4

@wakachamo: Câu hỏi được hỏi là xác định ngôn ngữ là RTL hay không. '[UIApplication sharedApplication] .userInterfaceLayoutDirection' khai báo xem hướng giao diện có nên được đặt ra LTR hay RTL hay không. Đây không phải là điều tương tự mà câu hỏi đang hỏi. Mặc dù trên thực tế nó có thể là những gì mà poster gốc muốn. –

4

Nhờ câu trả lời Kevin Ballard của tôi đã có thể để tạo ra các chức năng hữu ích sau đây để làm điều này:

+ (BOOL)isDeviceLanguageRTL { 
    return [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]==NSLocaleLanguageDirectionRightToLeft; 
} 
+0

Mặc dù câu trả lời của @ Accatyyc là đúng về mặt kỹ thuật, nhưng nó không trả lại giá trị chính xác trong trường hợp của tôi. Tôi thử nghiệm trên iOS8, thay đổi ngôn ngữ thành arabic nhưng phương thức 'userInterfaceLayoutDirection' trả về LTR. Vì vậy, tôi đã thử câu trả lời này và nó đã giải quyết được vấn đề của tôi. – FormigaNinja

10

Hãy chắc chắn rằng bạn quay trở lại ngôn ngữ hiện đang được chọn, không phải là khu vực hiện tại của thiết bị. Khu vực và ngôn ngữ thường giống nhau. Tuy nhiên, nếu tôi ở Bắc Mỹ và tôi đặt ngôn ngữ của tôi sang tiếng Nhật, khu vực của tôi sẽ vẫn là tiếng Anh (Hoa Kỳ). Để kiểm tra sự chỉ đạo đặc trưng của ngôn ngữ hiện đang được chọn, bạn có thể làm:

+ (BOOL)isDeviceLanguageRTL { 
    return ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]] == NSLocaleLanguageDirectionRightToLeft); 
} 

Bạn có thể muốn để cache kết quả, sử dụng dispatch_once.

Hãy nhớ rằng đây là hướng ngôn ngữ ưa thích của người dùng và không nhất thiết phải là hướng ngôn ngữ của văn bản. Đối với điều đó, hãy sử dụng hàm C dựa trên u_charDirection.

+0

Câu trả lời này cũng không đúng - xem câu trả lời của tôi. – Accatyyc

0

Rose Perrone hoàn toàn chính xác. Tuy nhiên việc sử dụng dispatch_once trong một getter cho một giá trị boolean đơn giản - thực sự là quá nhiều chi phí. Sử dụng không cần thiết của công văn một lần. Bởi vì bạn có thể muốn sử dụng nhiều lần trong một bố cục hoặc chức năng vẽ.

Vì vậy, bạn có hai lựa chọn nhanh hơn:

+ (BOOL)isRtl 
{ 
    static BOOL isRtl = NO; 
    static BOOL isRtlFound = NO; 
    if (!isRtlFound) 
    { // This is "safe enough". Worst case is this code will be called twice in the app's lifecycle... 
     isRtl = [NSLocale characterDirectionForLanguage:[NSBundle mainBundle].preferredLocalizations[0]] == NSLocaleLanguageDirectionRightToLeft; 
     isRtlFound = YES; 
    } 
    return isRtl; 
} 

Hoặc chỉ cần bộ nhớ cache nó trong một biến tĩnh, sử dụng constructor tĩnh:

static BOOL s_isRtl = NO; 
+ initialize 
{ 
    s_isRtl = [NSLocale characterDirectionForLanguage:[NSBundle mainBundle].preferredLocalizations[0]] == NSLocaleLanguageDirectionRightToLeft; 
} 

Lưu ý rằng điều này thực sự sẽ chia sẻ các biến tĩnh giữa bất kỳ lớp sử dụng mã này.

+0

dispatch_once refresher: "Chức năng này rất hữu ích cho việc khởi tạo dữ liệu toàn cầu (đơn) trong một ứng dụng. Luôn gọi hàm này trước khi sử dụng hoặc kiểm tra bất kỳ biến nào được khởi tạo bởi khối. Nếu được gọi đồng thời từ nhiều chủ đề, chức năng này chờ đồng bộ cho đến khi khối hoàn thành. Vị từ phải trỏ đến một biến được lưu trữ trong phạm vi toàn cục hoặc tĩnh. " – SK9

1

Dưới đây là làm thế nào tôi sử dụng nó:

+(NSTextAlignment) alignmentOfLanguage { 
if ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]]==NSLocaleLanguageDirectionRightToLeft){ 
     return NSTextAlignmentRight; 
    } 
    return NSTextAlignmentLeft; 
} 

Ví dụ cuối không làm việc cho tôi, nhưng với một biến thể nhỏ, tôi đã nhận nó rightX2.

mọi nhận xét?

36

Có một cách chính thức để làm điều đó:

if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) { 
} 

tôi muốn giới thiệu với sử dụng một số giải pháp khác, vì họ sẽ không luôn luôn trả về địa phương chính xác. Chỉ vì nó ở trên cùng của các ngôn ngữ ưa thích không có nghĩa là ứng dụng hỗ trợ nó.

Nguồn: https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/SupportingRight-To-LeftLanguages/SupportingRight-To-LeftLanguages.html

+0

Đây là (do không rõ ràng ý nghĩa của câu hỏi của OP) rất có thể những gì OP muốn. – Sean

+0

Xin lưu ý rằng Apple đã cập nhật tài liệu của họ và giờ đây, nó chỉ đề xuất một phương pháp khác là iOS 9. Xem: http://stackoverflow.com/a/31759275/785716 – Keab42

+0

Tôi sử dụng điều này trong một số trường hợp, ngay cả trên iOS 9, vì đôi khi bạn chỉ đơn giản là không có một thể hiện của UIView để kiểm tra ngữ nghĩaContentAttribute chống lại. – Mike

1

Ok, mặc dù nó là một câu hỏi cũ với một câu trả lời được chấp nhận, tôi sẽ trả lời nó anyway.

Đối với những người muốn kiểm tra xem ngôn ngữ điện thoại là RTL, độc lập nếu ứng dụng của bạn có hỗ trợ hay không bằng ngôn ngữ này, bạn nên sử dụng [NSLocale characterDirectionForLanguage:] như thế này:

+ (BOOL)isDeviceLanguageRightToLeft { 

    NSLocale *currentLocale = [NSLocale currentLocale]; 
    NSLocaleLanguageDirection direction = [NSLocale characterDirectionForLanguage:[currentLocale objectForKey:NSLocaleLanguageCode]]; 
    return (direction == NSLocaleLanguageDirectionRightToLeft); 
} 

Đoạn mã trên sẽ trở YES nếu ứng dụng của bạn chỉ hỗ trợ tiếng Anh, nhưng thiết bị của bạn được đặt thành tiếng Ả Rập chẳng hạn.

Apple khuyên bạn nên sử dụng [UIApplication sharedApplication].userInterfaceLayoutDirection, chỉ vì nó trả về hướng dựa trên ngôn ngữ mà ứng dụng của bạn đang sử dụng (có hỗ trợ). Dưới đây là đoạn mã:

+ (BOOL)isAppLanguageRightToLeft { 

    NSLocaleLanguageDirection direction = [UIApplication sharedApplication].userInterfaceLayoutDirection; 
    return (direction == UIUserInterfaceLayoutDirectionRightToLeft); 
} 

Đoạn mã trên sẽ trở NO khi ứng dụng của bạn chỉ hỗ trợ tiếng Anh, nhưng thiết bị của bạn được đặt sang tiếng Ả Rập ví dụ.

0
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) { 
    if ([UIView userInterfaceLayoutDirectionForSemanticContentAttribute:self.view.semanticContentAttribute] == UIUserInterfaceLayoutDirectionRightToLeft) { 
     NSLog(@"Right to left"); 
    } 
    else{ 
     NSLog(@"left to Right"); 
    } 
} else { 
    /* Use the previous technique */ 
    //Work for earlier ios 6 to ios 10 
    if ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]] == NSLocaleLanguageDirectionRightToLeft) { 
     NSLog(@"Right to left"); 
    } 
    else{ 
     NSLog(@"left to Right"); 
    } 
} 

phải xem Advanced Topics in Internationalization wwdc2014

3

Đây là 3 phiên bản nhanh chóng:

import UIKit 

extension UIView 
{ 
    /// Returns text and UI direction based on current view settings 
    var userInterfaceLayoutDirection: UIUserInterfaceLayoutDirection 
    { 
     if #available(iOS 9.0, *) { 
      return UIView.userInterfaceLayoutDirection(for: self.semanticContentAttribute) 
     } else { 
      return UIApplication.shared.userInterfaceLayoutDirection 
     } 
    } 
} 
0

nếu bạn muốn kiểm tra xem thiết bị đang chạy trong RTL hoặc LTR trong nhanh chóng 3

if(UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft) { 
    //RTL 
} else { 
    //LTR 
} 
Các vấn đề liên quan