2012-07-05 23 views

उत्तर

28

आईओएस 9 में प्रत्येक व्यक्ति प्रत्येक व्यक्ति के लिए वर्तमान दिशा निर्धारित कर सकता है।

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 
    } 
} 

यह 2015 वीडियो New UIKit Support for International User Interfaces आईओएस 9. में लेआउट दिशा का निर्धारण करने

WWDC का सुझाया गया तरीका। मिनट 31:20 के बाद।

+1

क्या उत्तर को अभी "सही" के रूप में चिह्नित करने के लिए वैसे भी है? वंशावली के लिए, तीन साल पहले मैंने जो उत्तर चुना वह उस समय सही था, लेकिन यह शायद अधिक होना चाहिए। – BarrettJ

+0

@ बरेटेटजे आप हमेशा अस्वीकार कर सकते हैं और एक और जवाब स्वीकार कर सकते हैं। – SmokeDispenser

+1

अब यह 'UIView.userInterfaceLayoutDirectionForSemanticContentAttribute (semanticContentAttribute) ==RightToLeft' है। – ChrisB

17

NSLocale में दो विधियां +characterDirectionForLanguage: और +lineDirectionForLanguage: हैं। पहला संभवतः बाएं से दाएं बनाम दाएं से बाएं बनाम है और दूसरा टॉप-टू-बोटम बनाम नीचे-से-ऊपर है। आप इसे [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode] का परिणाम पास कर सकते हैं।

अद्यतन:

मूल प्रश्न पूछा था कि कैसे निर्धारित करने के लिए डिवाइस भाषा RTL है। +[NSLocale characterDirectionForLanguage:] और +[NSLocale lineDirectionForLanguage:] का उपयोग करना इसके लिए स्पष्ट रूप से सही है; प्रासंगिक जानकारी प्राप्त करने के लिए आप [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode] या [NSLocale preferredLanguages][0] पास कर सकते हैं (मुझे यकीन नहीं है कि NSLocaleLanguageCode पसंदीदा भाषा या सेट क्षेत्र का उपयोग करता है)।

हालांकि, यह संभव है कि मूल पोस्टर वास्तव में जानना चाहता था कि आरटीएल या एलटीआर में एप्लिकेशन का इंटरफ़ेस निर्धारित किया जाना चाहिए या नहीं। यह पूछने के समान ही है कि भाषा की दिशा क्या है, सिवाय इसके कि यह एप्लिकेशन के उपलब्ध स्थानीयकरण को ध्यान में रखे। यदि एप्लिकेशन उपयोगकर्ता की पसंदीदा भाषा में स्थानीयकृत नहीं है, तो यह इसके बजाय एक गैर-पसंदीदा भाषा का उपयोग करेगा। और इस प्रश्न का उत्तर [UIApplication sharedApplication].userInterfaceLayoutDirection का उपयोग करना है।

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

दुर्भाग्यवश यह गलत है; ऐसा करने का सबसे अच्छा तरीका '' '[यूआईपीप्लिकेशन साझा अनुप्रयोग] .userInterfaceLayoutDirection'' के माध्यम से है, जैसा कि नीचे दिया गया है [http://stackoverflow.com/a/25500099/242849)। – wakachamo

+1

इस उत्तर को नीचे-वोट दें। इंटरफेस लेआउट दिशा निर्धारित करने के सर्वोत्तम तरीके के लिए कृपया 'वाकाचमो' की टिप्पणी देखें। – Sean

+4

@ वाकाचमो: पूछा गया सवाल यह निर्धारित कर रहा था कि भाषा आरटीएल है या नहीं। '[यूआईएप्लिकेशंस साझा अनुप्रयोग] .userInterfaceLayoutDirection' घोषित करता है कि क्या अंतरफलक दिशा एलटीआर या आरटीएल निर्धारित की जानी चाहिए। यह वही बात नहीं है जो सवाल पूछ रहा था। यद्यपि यह वास्तव में मूल पोस्टर चाहता था। –

4

केविन बेलार्ड के जवाब के लिए धन्यवाद मैं यह करने के लिए निम्न उपयोगिता समारोह बनाने के लिए कर रहा था। क्षेत्र और भाषा अक्सर वही होती है। हालांकि, अगर मैं उत्तरी अमेरिका में हूं और मैंने अपनी भाषा जापानी में निर्धारित की है, तो मेरा क्षेत्र अभी भी अंग्रेजी (संयुक्त राज्य) होगा। आदेश वर्तमान में चयनित भाषा के चरित्र दिशा की जाँच करने के लिए, आप कर सकते हैं:

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

आप संभावना परिणाम कैश करने के लिए, dispatch_once का उपयोग कर सकते हैं।

ध्यान रखें कि यह उपयोगकर्ता की पसंदीदा भाषा दिशा है, और आवश्यक रूप से पाठ की भाषा दिशा नहीं है। इसके लिए, u_charDirection पर आधारित एक सी फ़ंक्शन का उपयोग करें।

+0

हालांकि @ Accatyyc का जवाब तकनीकी रूप से सही है, लेकिन यह मेरे मामले में सही मूल्य नहीं लौटाया। मैं आईओएस 8 पर परीक्षण करता हूं, अरबी भाषा बदलता हूं लेकिन विधि 'userInterfaceLayoutDirection' ने एलटीआर वापस कर दिया। तो मैंने इस जवाब की कोशिश की और यह मेरी समस्या का समाधान किया। – FormigaNinja

10

आप वर्तमान में चयनित भाषा, नहीं डिवाइस के वर्तमान क्षेत्र वापसी सुनिश्चित करें:

+0

यह उत्तर भी गलत है - मेरा जवाब देखें। – Accatyyc

0

गुलाब पेरोन पूरी तरह से सही है। हालांकि एक साधारण बूलियन मूल्य के लिए गेटटर में dispatch_once का उपयोग - वास्तव में बहुत अधिक उपरि है। एक बार प्रेषण का अनावश्यक उपयोग। क्योंकि आप शायद लेआउट या ड्राइंग फ़ंक्शन के अंदर कई बार उपयोग करना चाहते हैं।

+ (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; 
} 

या सिर्फ एक स्थिर चर में यह कैश, स्थिर निर्माता का उपयोग कर: यह वास्तव में किसी भी के बीच स्थिर चर साझा करेंगे

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

ध्यान दें कि

तो तुम दो तेजी से विकल्प हैं कक्षा जो इस कोड का उपयोग करती है।

+0

dispatch_once रीफ्रेशर: "यह फ़ंक्शन किसी एप्लिकेशन में वैश्विक डेटा (सिंगलेट्स) के प्रारंभ के लिए उपयोगी है। ब्लॉक द्वारा प्रारंभ किए गए किसी भी चर का उपयोग करने या परीक्षण करने से पहले इस फ़ंक्शन को हमेशा कॉल करें। यदि एकाधिक थ्रेड से एक साथ कहा जाता है, तो यह फ़ंक्शन प्रतीक्षा करता है ब्लॉक पूरा होने तक समकालिक रूप से। भविष्यवाणी को वैश्विक या स्थिर दायरे में संग्रहीत चर को इंगित करना चाहिए। " – SK9

1

यहाँ कैसे मैं इसे किया जाता है:

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

अंतिम उदाहरण मेरे लिए काम नहीं किया था, लेकिन एक छोटे से संस्करण के साथ, मैं इसे rightX2 मिला है।

कोई टिप्पणी?

36

यह करने के लिए एक अधिकारी तरीका नहीं है:

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

मैं अन्य समाधानों में से कुछ का उपयोग कर के खिलाफ की सिफारिश करेंगे क्योंकि वे हमेशा सही स्थान नहीं लौटेगा। सिर्फ इसलिए कि यह पसंदीदा भाषाओं के शीर्ष पर है इसका मतलब यह नहीं है कि एप्लिकेशन इसका समर्थन करता है।

स्रोत: https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/SupportingRight-To-LeftLanguages/SupportingRight-To-LeftLanguages.html

+0

यह (ओपी के प्रश्न की अस्पष्ट भावना को देखते हुए) ओपी चाहता था कि सबसे अधिक संभावना है। – Sean

+0

कृपया ध्यान दें कि ऐप्पल ने अपने दस्तावेज़ अपडेट किए हैं, और अब यह केवल एक अलग विधि की सिफारिश करता है जो आईओएस 9 है। देखें: http://stackoverflow.com/a/31759275/785716 – Keab42

+0

मैं आईओएस 9 पर भी कुछ मामलों में इसका उपयोग करता हूं, क्योंकि कभी-कभी आपके पास अर्थात् कॉन्टेंट एट्रिब्यूट की जांच करने के लिए यूआईवी व्यू का उदाहरण नहीं होता है। – Mike

1

ठीक है, हालांकि यह एक स्वीकार किए जाते हैं जवाब के साथ एक पुराने सवाल है, मैं इसे किसी भी तरह का जवाब देंगे।

+ (BOOL)isDeviceLanguageRightToLeft { 

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

कोड ऊपर YES अगर वापस आ जाएगी:

जो लोग चाहे उपकरण भाषा जाँच करने के लिए चाहता है के लिए RTL, स्वतंत्र अपने आवेदन का समर्थन करता है या नहीं इस भाषा, आप [NSLocale characterDirectionForLanguage:] इस तरह का उपयोग करना चाहिए अगर है आपका ऐप केवल अंग्रेजी का समर्थन करता है, लेकिन उदाहरण के लिए आपका डिवाइस अरबी पर सेट है।

ऐप्पल अनुशंसा करता है कि आप [UIApplication sharedApplication].userInterfaceLayoutDirection का उपयोग करें, क्योंकि यह उस भाषा के आधार पर दिशा लौटाता है जिस पर आपका ऐप उपयोग कर रहा है (इसका समर्थन है)। यहाँ कोड का टुकड़ा है:

+ (BOOL)isAppLanguageRightToLeft { 

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

कोड ऊपर NO वापस आ जाएगी जब आपका ऐप्लिकेशन केवल अंग्रेज़ी का समर्थन करता है, लेकिन अपने डिवाइस उदाहरण के लिए अरबी को तैयार है।

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"); 
    } 
} 

यहाँ Advanced Topics in Internationalization wwdc2014

3

देखना चाहिए एक तेज 3 संस्करण है:

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

आप डिवाइस तेजी से 3

if(UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft) { 
    //RTL 
} else { 
    //LTR 
} 
में RTL या लीटर में चल रहा है, तो जाँच करने के लिए चाहते हैं, तो
संबंधित मुद्दे