오른쪽에서 왼쪽으로 쓰는 언어 지역화
오른쪽에서 왼쪽 지역화는 애플리케이션에 오른쪽에서 왼쪽 흐름 방향에 Xamarin.Forms 대한 지원을 추가합니다.
참고 항목
오른쪽에서 왼쪽으로 쓰는 언어 지역화를 위해서는 iOS 9 이상을 사용해야 하며 Android에서 API 17 이상을 사용해야 합니다.
흐름 방향은 페이지의 UI 요소를 육안으로 흝어보는 방향입니다. 아랍어 및 히브리어와 같은 일부 언어는 UI 요소가 오른쪽에서 왼쪽 흐름 방향으로 배치되어야 합니다. 이것은 VisualElement.FlowDirection
속성을 설정하여 구현할 수 있습니다. 이 속성은 레이아웃을 제어하는 부모 요소 내에서 UI 요소가 흐르는 방향을 가져오거나 설정하며 FlowDirection
열거형 값 중 하나로 설정되어야 합니다.
요소에서 FlowDirection
속성을 RightToLeft
로 설정하면 정렬은 오른쪽으로, 읽기 순서는 오른쪽에서 왼쪽으로, 컨트롤의 레이아웃은 오른쪽에서 왼쪽으로 설정됩니다.
팁
초기 레이아웃에서만 FlowDirection
속성을 설정해야 합니다. 런타임에 이 값을 변경하면 성능에 영향을 주는 비용이 많이 드는 레이아웃 프로세스가 발생합니다.
부모가 없는 요소의 기본 FlowDirection
속성 값은 LeftToRight
이고 부모가 있는 요소의 기본 FlowDirection
은 MatchParent
입니다. 따라서 요소는 시각적 트리에 있는 부모로부터 FlowDirection
속성 값을 상속받으며 모든 요소는 부모로부터 얻은 값을 재정의할 수 있습니다.
팁
앱을 오른쪽에서 왼쪽으로 쓰는 언어로 지역화할 때는 페이지 또는 루트 레이아웃에서 FlowDirection
속성을 설정합니다. 이렇게 하면 페이지 또는 루트 레이아웃에 포함된 모든 요소가 흐름 방향에 적절하게 응답하게 됩니다.
디바이스 흐름 방향 존중
선택된 언어 및 지역에 기반하여 디바이스의 흐름 방향을 존중하는 것은 명시적인 개발자의 선택이며 자동으로는 수행되지 않습니다. 페이지 또는 루트 레이아웃의 FlowDirection
속성을 static
Device.FlowDirection
값으로 설정하여 구현할 수 있습니다.
<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />
this.FlowDirection = Device.FlowDirection;
페이지 또는 루트 레이아웃의 모든 자식 요소는 기본적으로 Device.FlowDirection
값을 상속받습니다.
플랫폼 설정
오른쪽에서 왼쪽 방향 로캘을 사용하려면 특정 플랫폼 설정이 필요합니다.
iOS
필요한 오른쪽에서 왼쪽 방향 로캘이 Info.plist의 CFBundleLocalizations
키에 대한 배열 항목에 지원되는 언어로 추가되어야 합니다. 다음 예제는 CFBundleLocalizations
키에 대한 배열에 아랍어가 추가된 것을 보여줍니다.
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>ar</string>
</array>
자세한 내용은 iOS의 지역화 기본 사항을 참조하세요.
디바이스/시뮬레이터의 언어와 지역을 Info.plist에 지정된 오른쪽에서 왼쪽으로 쓰는 로캘로 변경하여 오른쪽에서 왼쪽으로 쓰는 언어 지역화를 테스트할 수 있습니다.
Warning
iOS에서 언어와 지역을 오른쪽에서 왼쪽 방향 로캘로 변경하는 경우 로캘에 필요한 리소스가 포함되지 않으면 DatePicker
뷰에서 예외가 발생합니다. 예를 들어, DatePicker
가 있는 아랍어로 앱을 테스트하는 경우에는 iOS 빌드 창의 Internationalization(국제화) 섹션에 mideast(중동)이 선택되어 있어야 합니다.
Android
<uses-sdk>
노드가 android:minSdkVersion
특성을 17로 설정하고 <application>
노드가 android:supportsRtl
특성을 true
로 설정하도록 앱의 AndroidManifest.xml 파일을 업데이트해야 합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<uses-sdk android:minSdkVersion="17" ... />
<application ... android:supportsRtl="true">
</application>
</manifest>
그런 다음 오른쪽에서 왼쪽으로 쓰는 언어를 사용하도록 디바이스/에뮬레이터를 변경하거나 설정 > 개발자 옵션에서 RTL 레이아웃 방향을 강제로 사용하도록 설정하여 오른쪽에서 왼쪽으로 지역화를 테스트할 수 있습니다.
UWP(유니버설 Windows 플랫폼)
필요한 언어 리소스는 Package.appxmanifest 파일의 <Resources>
노드에 지정해야 합니다. 다음 예제는 <Resources>
노드에 아랍어가 추가된 것을 보여줍니다.
<Resources>
<Resource Language="x-generate"/>
<Resource Language="en" />
<Resource Language="ar" />
</Resources>
또한 UWP에서는 앱의 기본 문화권이 .NET Standard 라이브러리에 명시적으로 정의되어 있어야 합니다. 이것은 AssemblyInfo.cs
또는 다른 클래스의 NeutralResourcesLanguage
특성을 기본 문화권으로 설정하여 구현할 수 있습니다.
using System.Resources;
[assembly: NeutralResourcesLanguage("en")]
그런 다음, 디바이스의 언어 및 지역을 적절한 오른쪽에서 왼쪽으로 쓰는 로캘로 변경하여 오른쪽에서 왼쪽으로 쓰는 지역화를 테스트할 수 있습니다.
제한 사항
현재 Xamarin.Forms 오른쪽에서 왼쪽 지역화에는 많은 제한 사항이 있습니다.
NavigationPage
단추 위치, 도구 모음 항목 위치 및 전환 애니메이션이FlowDirection
속성이 아닌 디바이스 로캘에 의해 제어됩니다.CarouselPage
살짝 밀기 방향이 뒤집히지 않습니다.Image
시각적 콘텐츠가 뒤집히지 않습니다.WebView
콘텐츠가FlowDirection
속성을 따르지 않습니다.- 텍스트 맞춤을 제어하려면
TextDirection
속성을 추가해야 합니다.
iOS
Stepper
방향이FlowDirection
속성이 아닌 디바이스 로캘에 의해 제어됩니다.EntryCell
텍스트 맞춤이FlowDirection
속성이 아닌 디바이스 로캘에 의해 제어됩니다.ContextActions
제스처와 맞춤이 반전되지 않습니다.
Android
SearchBar
방향이FlowDirection
속성이 아닌 디바이스 로캘에 의해 제어됩니다.ContextActions
배치가FlowDirection
속성이 아닌 디바이스 로캘에 의해 제어됩니다.
UWP
Editor
텍스트 맞춤이FlowDirection
속성이 아닌 디바이스 로캘에 의해 제어됩니다.FlowDirection
속성이FlyoutPage
자식에 상속되지 않습니다.ContextActions
텍스트 맞춤이FlowDirection
속성이 아닌 디바이스 로캘에 의해 제어됩니다.
오른쪽에서 왼쪽 레이아웃 강제 적용
Xamarin.iOS 및 Xamarin.Android 애플리케이션은 각 플랫폼 프로젝트를 수정함으로써 디바이스 설정과 관계없이 항상 오른쪽에서 왼쪽 레이아웃이 사용되도록 강제할 수 있습니다.
iOS
Xamarin.iOS 애플리케이션은 다음과 같이 AppDelegate 클래스를 수정함으로써 항상 오른쪽에서 왼쪽 레이아웃이 사용되도록 강제할 수 있습니다.
IntPtr_objc_msgSend
함수를AppDelegate
클래스의 첫 번째 줄로 선언합니다.[System.Runtime.InteropServices.DllImport(ObjCRuntime.Constants.ObjectiveCLibrary, EntryPoint = "objc_msgSend")] internal extern static IntPtr IntPtr_objc_msgSend(IntPtr receiver, IntPtr selector, UISemanticContentAttribute arg1);
FinshedLaunching
메서드에서 반환하기 전에 먼저FinishedLaunching
메서드에서IntPtr_objc_msgSend
함수를 호출합니다.bool result = base.FinishedLaunching(app, options); ObjCRuntime.Selector selector = new ObjCRuntime.Selector("setSemanticContentAttribute:"); IntPtr_objc_msgSend(UIView.Appearance.Handle, selector.Handle, UISemanticContentAttribute.ForceRightToLeft); return result;
이 방법은 항상 오른쪽에서 왼쪽 레이아웃이 필요한 애플리케이션에 유용하며, FlowDirection
속성을 설정해야 한다는 요구 사항을 제거합니다.
IntrPtr_objc_msgSend
메서드에 대한 자세한 내용은 Xamarin.iOS의 Objective-C 선택기를 참조하세요.
Android
Xamarin.Android 애플리케이션은 다음 줄을 포함하도록 MainActivity 클래스를 수정함으로써 항상 오른쪽에서 왼쪽 레이아웃이 사용되도록 강제할 수 있습니다.
Window.DecorView.LayoutDirection = LayoutDirection.Rtl;
참고 항목
이 방법을 사용하려면 오른쪽에서 왼쪽 레이아웃을 지원하도록 애플리케이션을 설정해야 합니다. 자세한 내용은 Android 플랫폼 설정을 참조하세요.
이 방법은 항상 오른쪽에서 왼쪽 레이아웃이 필요한 애플리케이션에 유용하며 이 방법을 사용하면 대부분의 컨트롤이 FlowDirection
속성을 설정하지 않아도 됩니다. 그러나 CollectionView
같은 일부 컨트롤은 LayoutDirection
속성을 적용하지 않으며 여전히 FlowDirection
속성을 설정해야 합니다.
Xamarin.University를 통한 오른쪽에서 왼쪽 쓰기 언어 지원
Xamarin.Forms 3.0 오른쪽에서 왼쪽으로 쓰는 언어 지원 동영상