63

デバイスに設定されている言語が右から左 (RTL) かどうかを簡単に判断する方法はありますか?

4

15 に答える 15

87

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

これは、iOS 9 でレイアウトの方向を決定するための推奨される方法です。

WWDC 2015 ビデオインターナショナル ユーザー インターフェイスの新しい UIKit サポート。31:20分以降。

于 2015-08-01T07:06:27.653 に答える
48

それを行う公式の方法があります:

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

正しいロケールが常に返されるとは限らないため、他のソリューションを使用しないことをお勧めします。優先言語の上位にあるからといって、アプリケーションがそれをサポートしているとは限りません。

ソース: https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/SupportingRight-To-LeftLanguages/SupportingRight-To-LeftLanguages.html

于 2014-08-26T07:16:15.927 に答える
19

NSLocaleには と の 2 つの方法が+characterDirectionForLanguage:あり+lineDirectionForLanguage:ます。1 つ目はおそらく左から右と右から左、2 つ目は上から下と下から上です。の結果を渡すことができます[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]

アップデート:

最初の質問は、デバイス言語が RTL かどうかを判断する方法でした。+[NSLocale characterDirectionForLanguage:]andを使用+[NSLocale lineDirectionForLanguage:]することは、間違いなく正しいことです。[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]関連する情報を取得するには、 または のいずれかを渡すことができます(優先言語または設定された地域を使用する[NSLocale preferredLanguages][0]かどうかはわかりません)。NSLocaleLanguageCode

ただし、元の投稿者が実際に知りたかったのは、アプリケーションのインターフェイスを RTL と LTR のどちらでレイアウトする必要があるかということである可能性が非常に高いです。これは、言語の方向性を尋ねるのと非常に似ていますが、アプリケーションの利用可能なローカリゼーションが考慮される点が異なります。アプリケーションがユーザーの優先言語にローカライズされていない場合、代わりに非優先言語が使用されます。この質問に対する答えは、 を使用すること[UIApplication sharedApplication].userInterfaceLayoutDirectionです。

于 2012-07-05T21:03:45.123 に答える
11

デバイスの現在の地域ではなく、現在選択されている言語を返すようにしてください。多くの場合、地域と言語は同じです。ただし、北米にいて、言語を日本語に設定した場合、地域は引き続き英語 (米国) になります。現在選択されている言語の文字方向を確認するには、次のようにします。

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

を使用して、結果をキャッシュしたい場合がありdispatch_onceます。

これはユーザーの好みの言語方向であり、必ずしもテキストの言語方向ではないことに注意してください。そのためには、 に基づく C 関数を使用しu_charDirectionます。

于 2013-02-10T02:06:56.603 に答える
6

これがSwift 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
        }
    }
}
于 2016-11-28T13:55:48.080 に答える
5

Kevin Ballard's answer のおかげで、これを行うために次のユーティリティ関数を作成できました。

+ (BOOL)isDeviceLanguageRTL {
   return [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]==NSLocaleLanguageDirectionRightToLeft;
}
于 2013-01-06T14:35:13.813 に答える
3

iOS 10 以降で特定のビュー レイアウトの方向を知りたい場合は、次を使用できます。

view.effectiveUserInterfaceLayoutDirection == .rightToLeft
于 2021-02-02T13:06:13.213 に答える
2

デバイスが Swift 3 で RTL または LTR で実行されているかどうかを確認する場合

if(UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft) {
    //RTL
} else {
   //LTR
}
于 2016-11-29T16:27:34.730 に答える
2

これが私がそれをどのように使用したかです:

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

最後の例は私にはうまくいきませんでしたが、少し変形して、正しい X2 を得ました。

コメントはありますか?

于 2013-05-21T16:20:01.183 に答える
1

わかりました。回答が受け入れられた古い質問ですが、とにかく回答します。

アプリケーションがこの言語をサポートしているかどうかに関係なく、デバイス言語が RTLであるかどうかを確認したい場合は、次[NSLocale characterDirectionForLanguage:]のように使用する必要があります。

+ (BOOL)isDeviceLanguageRightToLeft {

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

上記のコードYESは、たとえば、アプリが英語のみをサポートしているが、デバイスがアラビア語に設定されている場合に返されます。

[UIApplication sharedApplication].userInterfaceLayoutDirectionアプリが使用している (サポートしている) 言語に基づいて方向を返すという理由だけで、Apple は を使用することをお勧めします。コード スニペットは次のとおりです。

+ (BOOL)isAppLanguageRightToLeft {

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

上記のコードNOは、たとえばアプリが英語のみをサポートしているが、デバイスがアラビア語に設定されている場合に返されます。

于 2015-05-13T09:39:45.237 に答える
1
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 は必見

于 2016-07-21T10:22:49.373 に答える
0

ローズ・ペローネは完全に正しいです。ただし、単純なブール値の getter で dispatch_once を使用すると、実際にはオーバーヘッドが大きすぎます。発送の不要な使用は一度。おそらく、レイアウトまたは描画関数内で何度も使用したいからです。

したがって、より高速なオプションが 2 つあります。

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

これにより、実際には、このコードを使用するクラス間で静的変数が共有されることに注意してください。

于 2013-02-11T10:35:22.903 に答える