デバイスに設定されている言語が右から左 (RTL) かどうかを簡単に判断する方法はありますか?
15 に答える
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分以降。
それを行う公式の方法があります:
if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) {
}
正しいロケールが常に返されるとは限らないため、他のソリューションを使用しないことをお勧めします。優先言語の上位にあるからといって、アプリケーションがそれをサポートしているとは限りません。
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
です。
デバイスの現在の地域ではなく、現在選択されている言語を返すようにしてください。多くの場合、地域と言語は同じです。ただし、北米にいて、言語を日本語に設定した場合、地域は引き続き英語 (米国) になります。現在選択されている言語の文字方向を確認するには、次のようにします。
+ (BOOL)isDeviceLanguageRTL {
return ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]] == NSLocaleLanguageDirectionRightToLeft);
}
を使用して、結果をキャッシュしたい場合がありdispatch_once
ます。
これはユーザーの好みの言語方向であり、必ずしもテキストの言語方向ではないことに注意してください。そのためには、 に基づく C 関数を使用しu_charDirection
ます。
これが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
}
}
}
Kevin Ballard's answer のおかげで、これを行うために次のユーティリティ関数を作成できました。
+ (BOOL)isDeviceLanguageRTL {
return [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]==NSLocaleLanguageDirectionRightToLeft;
}
iOS 10 以降で特定のビュー レイアウトの方向を知りたい場合は、次を使用できます。
view.effectiveUserInterfaceLayoutDirection == .rightToLeft
デバイスが Swift 3 で RTL または LTR で実行されているかどうかを確認する場合
if(UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft) {
//RTL
} else {
//LTR
}
これが私がそれをどのように使用したかです:
+(NSTextAlignment) alignmentOfLanguage {
if ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]]==NSLocaleLanguageDirectionRightToLeft){
return NSTextAlignmentRight;
}
return NSTextAlignmentLeft;
}
最後の例は私にはうまくいきませんでしたが、少し変形して、正しい X2 を得ました。
コメントはありますか?
わかりました。回答が受け入れられた古い質問ですが、とにかく回答します。
アプリケーションがこの言語をサポートしているかどうかに関係なく、デバイス言語が 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
は、たとえばアプリが英語のみをサポートしているが、デバイスがアラビア語に設定されている場合に返されます。
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");
}
}
ローズ・ペローネは完全に正しいです。ただし、単純なブール値の 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;
}
これにより、実際には、このコードを使用するクラス間で静的変数が共有されることに注意してください。