デバイスに設定されている言語が右から左(RTL)かどうかを簡単に判断する方法はありますか?
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
には、+characterDirectionForLanguage:
と+lineDirectionForLanguage:
の2つのメソッドがあります。 1つ目はおそらく左から右と右から左です。2つ目は上から下か下から上です。 [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]
の結果を渡すことができます。
更新:
最初に尋ねられた質問は、デバイスの言語がRTLかどうかを判断する方法でした。 +[NSLocale characterDirectionForLanguage:]
および+[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
を使用して、結果をキャッシュしたい場合があります。
これはユーザーの優先言語方向であり、必ずしもテキストの言語方向ではないことに注意してください。そのためには、u_charDirection
に基づくC関数を使用します。
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の回答のおかげで、これを行うための次のユーティリティ関数を作成できました。
+ (BOOL)isDeviceLanguageRTL {
return [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]==NSLocaleLanguageDirectionRightToLeft;
}
わかりました、それは受け入れられた答えを持つ古い質問ですが、私はとにかく答えます。
アプリケーションがこの言語をサポートしているかどうかに関係なく、デバイスの言語はRTLかどうかを確認したい場合は、次のように[NSLocale characterDirectionForLanguage:]
を使用する必要があります。
+ (BOOL)isDeviceLanguageRightToLeft {
NSLocale *currentLocale = [NSLocale currentLocale];
NSLocaleLanguageDirection direction = [NSLocale characterDirectionForLanguage:[currentLocale objectForKey:NSLocaleLanguageCode]];
return (direction == NSLocaleLanguageDirectionRightToLeft);
}
上記のコードは、アプリが英語のみをサポートし、デバイスがアラビア語に設定されている場合などにYES
を返します。
アプリが使用している(サポートがある)言語に基づいて方向を返すという理由だけで、[UIApplication sharedApplication].userInterfaceLayoutDirection
を使用することをお勧めします。コードスニペットは次のとおりです。
+ (BOOL)isAppLanguageRightToLeft {
NSLocaleLanguageDirection direction = [UIApplication sharedApplication].userInterfaceLayoutDirection;
return (direction == UIUserInterfaceLayoutDirectionRightToLeft);
}
上記のコードは、アプリが英語のみをサポートし、デバイスがアラビア語に設定されている場合などにNO
を返します。
Swift 3でデバイスがRTLまたはLTRで実行されているかどうかを確認したい場合
if(UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft) {
//RTL
} else {
//LTR
}
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");
}
}
これが私がそれをどのように使用したかです:
+(NSTextAlignment) alignmentOfLanguage {
if ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]]==NSLocaleLanguageDirectionRightToLeft){
return NSTextAlignmentRight;
}
return NSTextAlignmentLeft;
}
最後の例は私にとってはうまくいきませんでしたが、少し変形したもので、私はそれを正しくX2にしました。
コメントは?
ローズ・ペローネは完全に正しいです。ただし、単純なブール値のゲッターで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;
}
これは、このコードを使用するクラス間で実際に静的変数を共有することに注意してください。