다양한 언어 및 문화 지원

앱에는 특정 문화에 관련된 리소스가 포함됩니다. 예를 들어 앱에는 현재 로케일 언어로 번역되는 문화 특정 문자열이 포함될 수 있습니다. 문화 특정 리소스는 앱의 나머지 리소스와 구별되도록 유지하는 것이 좋습니다. Android는 시스템 로케일 설정에 따라 언어 및 문화 특정 리소스를 처리합니다. Android 프로젝트의 리소스 디렉터리를 사용하여 다양한 로케일을 지원할 수 있습니다.

앱을 사용하는 사용자의 문화에 따라 맞춤설정된 리소스를 지정할 수 있습니다. 사용자의 언어와 문화에 적합한 리소스 유형을 제공할 수 있습니다. 예를 들어, 다음 스크린샷에서는 기기의 기본(en_US) 로케일과 스페인어(es_ES) 로케일로 문자열 및 드로어블 리소스를 표시하는 앱을 보여줍니다.

앱은 현재 로케일에 맞게 다른 텍스트와 아이콘을 표시합니다.

그림 1. 현재 로케일에 맞게 다른 리소스를 사용하는 앱

Android SDK 도구를 사용해 프로젝트를 만든 경우(Android 프로젝트 만들기 참조) 이 도구는 프로젝트 최상위에 res/ 디렉터리를 만듭니다. 이 res/ 디렉터리에는 다양한 리소스 유형의 하위 디렉터리가 있습니다. 또한, 문자열 값이 들어 있는 res/values/strings.xml과 같은 몇 가지 기본 파일도 있습니다.

다양한 언어를 지원하는 것은 로케일 특정 리소스를 사용하는 차원을 넘는 일입니다. 어떤 사용자는 해당 UI 로케일로 아랍어나 히브리어와 같이 RTL(오른쪽에서 왼쪽) 스크립트를 사용하는 언어를 선택합니다. 또 어떤 사용자는 영어같이 LTR 스크립트를 사용하는 언어를 해당 UI 로케일로 설정하고도 RTL 스크립트를 사용하는 언어로 콘텐츠를 보거나 생성합니다. 이러한 두 유형의 사용자를 모두 지원하려면 앱에서 다음 작업을 실행해야 합니다.

  • RTL 로케일에 RTL UI 레이아웃을 사용합니다.
  • 형식 지정된 메시지 내에 표시되는 텍스트 데이터의 방향을 감지하고 선언합니다. 일반적으로 텍스트 데이터의 방향을 판별하는 메서드를 호출할 수 있습니다.

로케일 디렉터리 및 리소스 파일 만들기

더 많은 로케일에 관한 지원을 추가하려면 res/에 추가 디렉터리를 만듭니다. 각 디렉터리의 이름은 다음 형식을 따라야 합니다.

    <resource type>-b+<language code>[+<country code>]
    

예를 들어 values-b+es/에는 언어 코드가 es인 로케일의 문자열 리소스가 들어 있습니다. 마찬가지로 mipmap-b+es+ES/에는 언어 코드가 es이고 국가 코드가 ES인 로케일의 아이콘이 들어 있습니다. Android는 런타임에 기기의 로케일 설정에 따라 적합한 리소스를 로드합니다. 자세한 정보는 대체 리소스 제공을 참조하세요.

지원할 로케일을 결정한 후에는 리소스 하위 디렉터리와 파일을 만듭니다. 예:

    MyProject/
        res/
           values/
               strings.xml
           values-b+es/
               strings.xml
           mipmap/
               country_flag.png
           mipmap-b+es+ES/
               country_flag.png
    

다음은 언어에 따라 달라지는 리소스 파일의 몇 가지 예입니다.

영어 문자열(기본 로케일), /values/strings.xml:

    <resources>
        <string name="hello_world">Hello World!</string>
    </resources>
    

스페인어 문자열(es 로케일), /values-es/strings.xml:

    <resources>
        <string name="hello_world">¡Hola Mundo!</string>
    </resources>
    

미국 국기 아이콘(기본 로케일), /mipmap/country_flag.png:

미국 국기 아이콘

그림 2. 기본(en_US) 로케일에 사용되는 아이콘

스페인 국기 아이콘(es_ES 로케일), /mipmap-b+es+ES/country_flag.png:

스페인 국기 아이콘

그림 3. es_ES 로케일에 사용되는 아이콘

참고: 비트맵 드로어블의 현지화된 버전을 제공하려는 경우와 같이 모든 리소스 유형에 로케일 한정자(또는 구성 한정자)를 사용할 수 있습니다. 자세한 내용은 현지화를 참조하세요.

앱에서 리소스 사용

각 리소스의 name 속성을 사용하여 소스 코드 및 다른 XML 파일의 리소스를 참조할 수 있습니다.

소스 코드에서는 R.<resource type>.<resource name> 구문을 사용하여 리소스를 참조할 수 있습니다. 이러한 식으로 리소스를 수락하는 메서드는 매우 다양합니다.

예:

Kotlin

    // Get a string resource from your app's Resources
    val hello = resources.getString(R.string.hello_world)

    // Or supply a string resource to a method that requires a string
    TextView(this).apply {
        setText(R.string.hello_world)
    }
    

자바

    // Get a string resource from your app's Resources
    String hello = getResources().getString(R.string.hello_world);

    // Or supply a string resource to a method that requires a string
    TextView textView = new TextView(this);
    textView.setText(R.string.hello_world);
    

다른 XML 파일에서는 XML 속성이 호환되는 값을 수락할 때마다 @<resource type>/<resource name> 구문을 사용하여 리소스를 참조할 수 있습니다.

예:

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/country_flag" />
    

메시지의 텍스트 형식 지정

앱에서 실행하는 가장 일반적인 작업 중 하나는 텍스트 형식을 지정하는 것입니다. 현지화된 메시지는 텍스트와 숫자 데이터를 적절한 위치에 삽입하여 형식을 지정합니다. 안타깝게도 RTL UI 또는 RTL 데이터를 처리하는 경우에는 간단한 형식 지정으로 부정확하거나 읽을 수 없는 텍스트 출력이 표시될 수 있습니다.

아랍어, 히브리어, 페르시아어, 우르두어 등의 언어는 전체적으로 RTL 방향으로 작성됩니다. 하지만 숫자와 삽입된 LTR 텍스트 같은 일부 요소는 다른 요소의 RTL 텍스트 내에 LTR 방향으로 작성됩니다. 영어를 비롯한 LTR 스크립트를 사용하는 언어도 양방향으로 작성됩니다. RTL 방향으로 표시해야 하는 삽입된 RTL 스크립트가 포함될 수 있기 때문입니다.

대부분은 앱 자체에서 이러한 삽입된 반대 방향 텍스트 인스턴스를 생성합니다. 임의의 언어로 된 텍스트 데이터가 임의의 텍스트 방향으로 현지화된 메시지에 삽입됩니다. 이렇게 방향이 혼합되면 반대 방향 텍스트의 시작과 끝이 명확하게 표시되지 않는 경우가 많습니다. 대부분의 문제는 앱 생성 텍스트의 이러한 특성으로 인해 발생합니다.

시스템의 기본적인 양방향 텍스트 처리에서는 대부분 예상대로 텍스트가 렌더링되지만 앱이 현지화된 메시지에 텍스트를 삽입하는 경우 텍스트가 제대로 렌더링되지 않을 수 있습니다. 다음 예에서는 텍스트가 제대로 표시되지 않을 가능성이 높은 사례를 보여줍니다.

  • 메시지의 맨 처음에 삽입되는 경우:

    PERSON_NAME님이 전화를 걸고 있습니다.

  • 주소나 전화 번호와 같이 숫자로 시작하는 경우:

    987 654-3210

  • 전화 번호와 같이 문장 부호로 시작하는 경우:

    +19876543210

  • 문장 부호로 끝나는 경우:

    계속할까요?

  • 이미 양방향이 포함된 경우:

    בננה 단어는 히브리어로 바나나입니다.

예를 들어 앱에서 런타임 시 %s 위치에 주소가 삽입된 '%s을(를) 찾으셨나요?' 메시지를 표시해야 하는 경우가 종종 있다고 가정해보겠습니다. 앱은 다양한 UI 로케일을 지원하므로 메시지는 로케일 특정 리소스에서 제공되며 RTL 로케일을 사용 중인 경우 RTL 방향을 사용합니다. 히브리어 UI의 경우 이 메시지는 다음과 같이 표시됩니다.

האם התכוונת ל %s?

하지만 로케일 언어로 된 텍스트가 없는 데이터베이스에서 제안이 제공될 수 있습니다. 예를 들어 해당 주소가 캘리포니아에 있는 장소이면 데이터베이스에서는 영어 텍스트로 주소가 표시됩니다. 주소 '15 Bay Street, Laurel, CA'를 텍스트 방향에 관한 어떠한 힌트도 없이 RTL 메시지에 삽입하면 결과는 예상대로 표시되지도 않고 정확하지도 않습니다.

האם התכוונת ל 15 Bay Street, Laurel, CA?

번지수가 의도와 달리 주소 왼쪽이 아닌 오른쪽에 표시되어 이상한 우편번호처럼 보입니다. LTR 텍스트 방향을 사용하는 메시지에 RTL 텍스트를 포함하는 경우에도 동일한 문제가 발생할 수 있습니다.

설명 및 해결 방법

이전 예를 보면 텍스트 형식 지정 도구에서 '15'가 주소의 일부임을 지정하지 않아서 시스템이 '15'가 주소 앞에 오는 RTL 텍스트의 일부인지 주소 뒤에 오는 LTR 텍스트의 일부인지 판단할 수 없어 문제가 발생했습니다.

이 문제를 해결하려면 현지화된 메시지에 삽입하는 모든 텍스트에서 BidiFormatter 클래스에 있는 unicodeWrap() 메서드를 호출하세요. unicodeWrap()를 사용하지 않아도 될 때는 다음과 같은 경우뿐입니다.

  • 텍스트가 URI 또는 SQL 쿼리 같은 기계가 읽을 수 있는 문자열에 삽입되는 경우입니다.
  • 텍스트가 제대로 래핑되는 것을 이미 알고 있는 경우입니다.

unicodeWrap() 메서드는 문자열의 방향을 감지하여 해당 방향을 선언하는 유니코드 형식 문자로 문자열을 래핑합니다. 이제 '15'가 다음과 같이 LTR로 선언된 텍스트 내에 나타나므로 올바른 위치에 표시됩니다.

האם התכוונת ל 15 Bay Street, Laurel, CA?

다음 코드 스니펫은 unicodeWrap()을 사용하는 방법을 보여줍니다.

Kotlin

    val mySuggestion = "15 Bay Street, Laurel, CA"
    val myBidiFormatter: BidiFormatter = BidiFormatter.getInstance()

    // The "did_you_mean" localized string resource includes
    // a "%s" placeholder for the suggestion.
    String.format(getString(R.string.did_you_mean), myBidiFormatter.unicodeWrap(mySuggestion))
    

자바

    String mySuggestion = "15 Bay Street, Laurel, CA";
    BidiFormatter myBidiFormatter = BidiFormatter.getInstance();

    // The "did_you_mean" localized string resource includes
    // a "%s" placeholder for the suggestion.
    String.format(getString(R.string.did_you_mean),
            myBidiFormatter.unicodeWrap(mySuggestion));
    

참고: 앱이 Android 4.3(API 레벨 18) 이상을 타겟팅하는 경우 Android 프레임워크에 있는 BidiFormatter 버전을 사용합니다. 또는 지원 라이브러리에 있는 BidiFormatter 버전을 사용합니다.

숫자 형식 지정

메서드 호출이 아니라 문자열 형식 지정을 사용하여 앱 로직에서 숫자를 문자열로 변환합니다.

Kotlin

    var myIntAsString = "$myInt"
    

자바

    String myIntAsString = String.format("%d", myInt);
    

이렇게 하면 로케일에 맞는 숫자 형식이 지정되며 다른 숫자 집합이 사용될 수도 있습니다.

페르시아어 및 대부분의 아랍어 로케일과 같이 해당 로케일이 고유한 숫자 집합을 사용하는 기기에서 String.format()을 사용하여 SQL 쿼리를 만드는 경우 쿼리 매개변수 중 숫자가 있으면 문제가 발생합니다. 숫자는 해당 로케일의 숫자로 형식 지정되는데 이러한 숫자가 SQL에서 유효하지 않기 때문입니다.

ASCII 형식 지정된 숫자를 보존하면서 SQL 쿼리도 유효하게 유지하려면 로케일이 첫 번째 매개변수로 포함되어 있는 오버로드된 버전의 String.format()을 사용해야 합니다. 로케일 인수는 Locale.US여야 합니다.

레이아웃 미러링 지원

RTL 스크립트를 사용하는 사용자는 오른쪽 정렬 메뉴, 오른쪽 정렬 텍스트, 왼쪽을 가리키는 앞으로 화살표가 있는 RTL 사용자 인터페이스를 선호합니다.

그림 4에서는 설정 앱 내의 LTR 버전 화면을 해당하는 RTL 버전과 비교하여 보여줍니다.

알림 영역은 오른쪽 상단 부근에 오른쪽 정렬되어 있고, 앱 바의 메뉴 버튼은 왼쪽 상단 부근에 있으며, 화면 주요 부분의 콘텐츠는 왼쪽 정렬되어 LTR로 표시되고, 뒤로 버튼은 왼쪽 하단 부근에서 왼쪽을 가리키고 있습니다. 알림 영역은 왼쪽 상단 부근에 왼쪽 정렬되어 있고, 앱 바의 메뉴 버튼은 오른쪽 상단 부근에 있으며, 화면 주요 부분의 콘텐츠는 오른쪽 정렬되어 RTL로 표시되고, 뒤로 버튼은 오른쪽 하단 부근에서 오른쪽을 가리키고 있습니다.
그림 4. 화면의 LTR 및 RTL 변형

RTL 지원을 앱에 추가하는 경우 다음 사항에 특히 유의해야 합니다.

  • RTL 텍스트 미러링은 앱이 Android 4.2(API 레벨 17) 이상을 실행하는 기기에서 사용되는 경우에만 지원됩니다. 이전 기기에서 텍스트 미러링을 지원하는 방법을 알아보려면 레거시 앱에 지원 제공을 참조하세요.
  • 앱이 RTL 텍스트 방향을 지원하는지 테스트하려면 개발자 옵션을 사용하여 테스트하고 RTL 스크립트를 사용하는 사용자가 앱을 사용해보도록 초대하세요.

참고: 미러링해야 하는 요소와 미러링하지 않아야 하는 요소 목록을 포함하여 레이아웃 미러링과 관련된 추가 디자인 가이드라인을 보려면 양방향성 머티리얼 디자인 가이드라인을 참조하세요.

앱의 UI 레이아웃을 미러링하여 RTL 로케일에서 RTL로 표시되도록 하려면 다음 섹션의 단계를 완료하세요.

빌드 및 manifest 파일 수정

앱 모듈의 build.gradle 파일과 앱 manifest 파일을 다음과 같이 수정합니다.

build.gradle(모듈: 앱)

    android {
        ...
        defaultConfig {
            targetSdkVersion 17 // Or higher
            ...
        }
    }
    

AndroidManifest.xml

    <manifest ... >
        ...
        <application ...
            android:supportsRtl="true">
        </application>
    </manifest>
    

참고: 앱이 Android 4.1.1(API 레벨 16) 이하를 타겟팅하는 경우 android:supportsRtl 속성이 앱 레이아웃 파일에 표시되는 startend 속성 값과 함께 무시됩니다. 이 경우 앱에서 RTL 레이아웃 미러링이 자동으로 발생하지 않습니다.

기존 리소스 업데이트

각각의 기존 레이아웃 리소스 파일에서 leftright를 각각 startend로 변환합니다. 이렇게 하면 프레임워크가 사용자의 언어 설정에 따라 앱 UI 요소를 정렬할 수 있습니다.

참고: 리소스를 업데이트하기 전에 레거시 앱에 지원을 제공하는 방법 또는 Android 4.1.1(API 레벨 16) 이하를 타겟팅하는 앱에 지원을 제공하는 방법을 알아보세요.

프레임워크의 RTL 정렬 기능을 사용하려면 표 1에 있는 레이아웃 파일의 속성을 변경하세요.

표 1. 앱이 여러 텍스트 방향을 지원하는 경우 사용하는 속성

LTR만 지원하는 속성 LTR 및 RTL을 지원하는 속성
android:gravity="left" android:gravity="start"
android:gravity="right" android:gravity="end"
android:layout_gravity="left" android:layout_gravity="start"
android:layout_gravity="right" android:layout_gravity="end"
android:paddingLeft android:paddingStart
android:paddingRight android:paddingEnd
android:drawableLeft android:drawableStart
android:drawableRight android:drawableEnd
android:layout_alignLeft android:layout_alignStart
android:layout_alignRight android:layout_alignEnd
android:layout_marginLeft android:layout_marginStart
android:layout_marginRight android:layout_marginEnd
android:layout_alignParentLeft android:layout_alignParentStart
android:layout_alignParentRight android:layout_alignParentEnd
android:layout_toLeftOf android:layout_toStartOf
android:layout_toRightOf android:layout_toEndOf

표 2에서는 대상 SDK 버전, leftright 속성 정의 여부, startend 속성 정의 여부에 따라 시스템이 UI 정렬 속성을 처리하는 방법을 보여줍니다.

표 2. 대상 SDK 버전 및 정의된 속성에 따른 UI 요소 정렬 동작

Android 4.2
(API 레벨 17) 이상 타겟팅 여부
Left 및 right 정의 여부 Start 및 end 정의 여부 결과
startend를 확인하고 leftright를 재정의
아니요 leftright만 사용
아니요 startend만 사용
아니요 leftright 사용(startend 무시)
아니요 아니요 leftright만 사용
아니요 아니요 startendleftright로 해석

방향 및 언어 특정 리소스 추가

이 단계에서는 다양한 언어 및 텍스트 방향에 맞춤설정된 값이 포함되어 있는 레이아웃, 드로어블, 값 리소스 파일의 특정 버전을 추가합니다.

Android 4.2(API 레벨 17) 이상에서는 -ldrtl(layout-direction-right-to-left) 및 -ldltr(layout-direction-left-to-right) 리소스 한정자를 사용할 수 있습니다. 기존 리소스를 로드하는 과정에서 이전 버전과의 호환성을 유지하기 위해 이전 버전의 Android에서는 리소스 언어 한정자를 사용해 정확한 텍스트 방향을 추론합니다.

특정 레이아웃 파일을 추가하여 히브리어, 아랍어, 페르시아어 등의 RTL 스크립트를 지원한다고 가정해보겠습니다. 이렇게 하려면 다음 예와 같이 res/ 디렉터리에 layout-ldrtl/ 디렉터리를 추가합니다.

    res/
        layout/
            main.xml This layout file is loaded by default.
        layout-ldrtl/
            main.xml This layout file is loaded for languages using an
                     RTL text direction, including Arabic, Persian, and Hebrew.
    

아랍어 텍스트용으로만 디자인된 특정 버전의 레이아웃을 추가하려는 경우 디렉터리 구조는 다음과 같습니다.

    res/
        layout/
            main.xml This layout file is loaded by default.
        layout-ar/
            main.xml This layout file is loaded for Arabic text.
        layout-ldrtl/
            main.xml This layout file is loaded only for non-Arabic
                     languages that use an RTL text direction.
    

참고: 언어 특정 리소스는 레이아웃 방향 특정 리소스보다 우선하고, 레이아웃 방향 특정 리소스는 기본 리소스보다 우선합니다.

지원되는 위젯 사용

Android 4.2(API 레벨 17)부터 프레임워크 UI 요소는 대부분 자동으로 RTL 텍스트 방향을 지원합니다. 하지만 ViewPager 같은 몇몇 프레임워크 요소는 RTL 텍스트 방향을 지원하지 않습니다.

홈 화면 위젯은 해당 manifest 파일에 속성 할당 android:supportsRtl="true"가 포함되어 있는 한 RTL 텍스트 방향을 지원합니다.

레거시 앱에 지원 제공

앱이 Android 4.1.1(API 레벨 16) 이하를 타겟팅하는 경우 startend 속성 외에 leftright 속성도 포함하세요.

레이아웃이 RTL 텍스트 방향을 사용해야 하는지 확인하려면 다음 로직을 사용합니다.

Kotlin

    private fun shouldUseLayoutRtl(): Boolean {
        return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
            View.LAYOUT_DIRECTION_RTL == layoutDirection
        } else {
            false
        }
    }
    

자바

    private boolean shouldUseLayoutRtl() {
        if (android.os.Build.VERSION.SDK_INT >=
                android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
            return View.LAYOUT_DIRECTION_RTL == getLayoutDirection();
        } else {
            return false;
        }
    }
    

참고: 호환성 문제를 방지하려면 Android SDK 빌드 도구 23.0.1 이상 버전을 사용합니다.

개발자 옵션을 사용하여 테스트

Android 4.4(API 수준 19) 이상을 실행하는 기기에서는 온디바이스 개발자 옵션에서 RTL 레이아웃 방향 강제 적용을 사용 설정할 수 있습니다. 이 설정을 사용하면 영어 텍스트처럼 LTR 스크립트를 사용하는 텍스트를 RTL 모드에서 볼 수 있습니다.

앱 로직 업데이트

이 섹션에서는 여러 텍스트 방향을 처리하기 위해 앱을 조정할 때 업데이트해야 하는 앱 로직의 특정 위치를 설명합니다.

속성 변경사항

레이아웃 방향, 레이아웃 매개변수, 패딩, 텍스트 방향, 텍스트 정렬 또는 드로어블 위치 지정과 같은 RTL 관련 속성의 변경을 처리하려면 onRtlPropertiesChanged() 콜백을 사용할 수 있습니다. 이 콜백을 사용하면 현재 레이아웃 방향을 확인하고 이에 맞게 활동 View 개체를 업데이트할 수 있습니다.

보기

대화상자, 토스트 같은 UI 요소 등 활동의 뷰 계층 구조에 직접 포함되지 않는 UI 위젯을 작성하는 경우 컨텍스트에 따라 올바른 레이아웃 방향을 설정하세요. 다음 코드 스니펫은 이 프로세스를 완료하는 방법을 보여줍니다.

Kotlin

    val config: Configuration = context.resources.configuration
    view.layoutDirection = config.layoutDirection
    

자바

    final Configuration config =
        getContext().getResources().getConfiguration();
    view.setLayoutDirection(config.getLayoutDirection());
    

View 클래스의 다음과 같은 여러 메서드를 추가로 고려해 볼 필요가 있습니다.

onMeasure()
뷰 측정은 텍스트 방향에 따라 달라질 수 있습니다.
onLayout()
자체 레이아웃 구현을 만드는 경우 사용 중인 버전의 onLayout()에 있는 super()를 호출하여 RTL 스크립트를 지원하도록 맞춤 로직을 조정해야 합니다.
onDraw()
맞춤 뷰를 구현하거나 고급 기능을 그림에 추가하는 경우 RTL 스크립트를 지원하도록 코드를 업데이트해야 합니다. 위젯이 RTL 모드인지 확인하려면 다음 코드를 사용합니다.

Kotlin

    // On devices running Android 4.1.1 (API level 16) and lower,
    // you can call the isLayoutRtl() system method directly.
    fun isLayoutRtl(): Boolean = layoutDirection == LAYOUT_DIRECTION_RTL
    

자바

    // On devices running Android 4.1.1 (API level 16) and lower,
    // you can call the isLayoutRtl() system method directly.
    public boolean isLayoutRtl() {
        return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
    }
    

드로어블

RTL 레이아웃용으로 미러링해야 하는 드로어블이 있는 경우 기기에서 실행되는 Android 버전에 따라 다음 단계 중 하나를 완료합니다.

  • Android 4.3(API 수준 18) 이하를 실행하는 기기에서는 -ldrtl 리소스 파일을 추가하고 정의해야 합니다.
  • Android 4.4(API 레벨 19) 이상에서는 드로어블을 정의할 때 android:autoMirrored="true"를 사용할 수 있습니다. 이 설정을 사용하면 시스템에서 RTL 레이아웃 미러링을 처리할 수 있습니다.

    참고: android:autoMirrored 속성은 해당 양방향 미러링이 전체 드로어블의 그래픽 미러링인 단순 드로어블에 관해서만 작동합니다. 드로어블에 여러 요소가 포함되어 있거나 드로어블을 반영하면 해석이 변경되는 경우에는 직접 미러링을 실행해야 합니다. 가능한 경우 양방향 전문가에게 문의하여 미러링된 드로어블이 사용자에게 적합한지 확인하세요.

중력

앱 코드에서 Gravity.LEFT 또는 Gravity.RIGHT을 사용하면, 이 값을 각각 Gravity.STARTGravity.END로 변경해야 합니다.

예를 들어 다음과 같은 코드를 사용하고 있을 수 있습니다.

Kotlin

    when (gravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
        Gravity.LEFT -> {
            // Handle objects that are left-aligned.
        }
        Gravity.RIGHT -> {
            // Handle objects that are right-aligned.
        }
    }
    

자바

    switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
        case Gravity.LEFT:
            // Handle objects that are left-aligned.
            break;
        case Gravity.RIGHT:
            // Handle objects that are right-aligned.
            break;
    }
    

이러한 코드는 다음과 같이 변경해야 합니다.

Kotlin

    val absoluteGravity: Int = Gravity.getAbsoluteGravity(gravity, layoutDirection)
    when (absoluteGravity and Gravity.HORIZONTAL_GRAVITY_MASK) {
        Gravity.LEFT -> {
            // Handle objects that are left-aligned.
        }
        Gravity.RIGHT -> {
            // Handle objects that are right-aligned.
        }
    }
    

자바

    final int layoutDirection = getLayoutDirection();
    final int absoluteGravity =
            Gravity.getAbsoluteGravity(gravity, layoutDirection);
    switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
        case Gravity.LEFT:
            // Handle objects that are left-aligned.
            break;
        case Gravity.RIGHT:
            // Handle objects that are right-aligned.
            break;
    }
    

즉, 중력 값에 startend를 사용하는 경우에도 왼쪽 정렬 및 오른쪽 정렬 값을 처리하는 기존 코드를 유지할 수 있습니다.

참고: 중력 설정을 적용하는 경우 layoutDirection 인수가 포함된 Gravity.apply()의 오버로드된 버전을 사용합니다.

여백 및 패딩

앱에서 RTL 스크립트를 지원하려면 여백 및 패딩 값과 관련된 다음 권장사항을 따르세요.

참고 항목