오른쪽에서 왼쪽으로 쓰는 언어 지역화

Download Sample 샘플 다운로드

오른쪽에서 왼쪽 지역화는 애플리케이션에 오른쪽에서 왼쪽 흐름 방향에 Xamarin.Forms 대한 지원을 추가합니다.

참고 항목

오른쪽에서 왼쪽으로 쓰는 언어 지역화를 위해서는 iOS 9 이상을 사용해야 하며 Android에서 API 17 이상을 사용해야 합니다.

흐름 방향은 페이지의 UI 요소를 육안으로 흝어보는 방향입니다. 아랍어 및 히브리어와 같은 일부 언어는 UI 요소가 오른쪽에서 왼쪽 흐름 방향으로 배치되어야 합니다. 이것은 VisualElement.FlowDirection 속성을 설정하여 구현할 수 있습니다. 이 속성은 레이아웃을 제어하는 부모 요소 내에서 UI 요소가 흐르는 방향을 가져오거나 설정하며 FlowDirection 열거형 값 중 하나로 설정되어야 합니다.

요소에서 FlowDirection 속성을 RightToLeft로 설정하면 정렬은 오른쪽으로, 읽기 순서는 오른쪽에서 왼쪽으로, 컨트롤의 레이아웃은 오른쪽에서 왼쪽으로 설정됩니다.

TodoItemPage in Arabic with a right-to-left flow direction

초기 레이아웃에서만 FlowDirection 속성을 설정해야 합니다. 런타임에 이 값을 변경하면 성능에 영향을 주는 비용이 많이 드는 레이아웃 프로세스가 발생합니다.

부모가 없는 요소의 기본 FlowDirection 속성 값은 LeftToRight이고 부모가 있는 요소의 기본 FlowDirectionMatchParent입니다. 따라서 요소는 시각적 트리에 있는 부모로부터 FlowDirection 속성 값을 상속받으며 모든 요소는 부모로부터 얻은 값을 재정의할 수 있습니다.

앱을 오른쪽에서 왼쪽으로 쓰는 언어로 지역화할 때는 페이지 또는 루트 레이아웃에서 FlowDirection 속성을 설정합니다. 이렇게 하면 페이지 또는 루트 레이아웃에 포함된 모든 요소가 흐름 방향에 적절하게 응답하게 됩니다.

디바이스 흐름 방향 존중

선택된 언어 및 지역에 기반하여 디바이스의 흐름 방향을 존중하는 것은 명시적인 개발자의 선택이며 자동으로는 수행되지 않습니다. 페이지 또는 루트 레이아웃의 FlowDirection 속성을 staticDevice.FlowDirection 값으로 설정하여 구현할 수 있습니다.

<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />
this.FlowDirection = Device.FlowDirection;

페이지 또는 루트 레이아웃의 모든 자식 요소는 기본적으로 Device.FlowDirection 값을 상속받습니다.

플랫폼 설정

오른쪽에서 왼쪽 방향 로캘을 사용하려면 특정 플랫폼 설정이 필요합니다.

iOS

필요한 오른쪽에서 왼쪽 방향 로캘이 Info.plistCFBundleLocalizations 키에 대한 배열 항목에 지원되는 언어로 추가되어야 합니다. 다음 예제는 CFBundleLocalizations 키에 대한 배열에 아랍어가 추가된 것을 보여줍니다.

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>ar</string>
</array>

Info.plist supported languages

자세한 내용은 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

Android

UWP

오른쪽에서 왼쪽 레이아웃 강제 적용

Xamarin.iOS 및 Xamarin.Android 애플리케이션은 각 플랫폼 프로젝트를 수정함으로써 디바이스 설정과 관계없이 항상 오른쪽에서 왼쪽 레이아웃이 사용되도록 강제할 수 있습니다.

iOS

Xamarin.iOS 애플리케이션은 다음과 같이 AppDelegate 클래스를 수정함으로써 항상 오른쪽에서 왼쪽 레이아웃이 사용되도록 강제할 수 있습니다.

  1. 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);
    
  2. 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 오른쪽에서 왼쪽으로 쓰는 언어 지원 동영상