[Android] Mena 지역 서비스를 위한 RTL & 동아라비아 숫자 대응 방법
카테고리 없음

[Android] Mena 지역 서비스를 위한 RTL & 동아라비아 숫자 대응 방법


Mena 지역으로 서비스를 확장해야하는 상황이 주어져, RTL 및 동아라비아 숫자 대응 작업을 할 때 필요했던 방법들을 정리, 공유하고자 합니다

런타임 중 RTL 상황 판단

kotlin의 경우 아래와 같은 확장 함수를 사용하면 편리하다

fun Activity.isRTL(): Boolean = this.resources.isRTL()

fun Context.isRTL(): Boolean = this.resources.isRTL()

fun View.isRTL(): Boolean = this.context.isRTL()

fun Fragment.isRTL(): Boolean = this.resources.isRTL()

fun Resources.isRTL(): Boolean = this.configuration.layoutDirection == LAYOUT_DIRECTION_RTL

 

XML

Constraint 제약조건 방식 변경

Left, Right -> Start, End

 

Gravity

left -> start

right -> end

 

TextView 

공통 적용

textDirection locale

textAlignment viewStart

 

Gravity

gravity center -> textAlignment center

 

with Drawable

drawableRight, drawableLeft -> drawableEnd, drawableStart

setCompoundDrawablesWithIntrinsicBounds (left, right 사용) -> setCompoundDrawablesRelativeWithIntrinsicBounds (start, end 사용)

 

EditText

android:textDirection="firstStrong"
android:textAlignment="viewStart"

 

Image Asset

SVG 이미지

autoMirror="true" 설정 추가

 

PNG 이미지

아래와 같이 리소스를 만들어 처리한다

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/xxxxxxxxxxx"
android:autoMirrored="true">
</bitmap>

 

동아라비아어로 출력된 결과를 서아라비아로 변경

public class ArabicNumberUtils {
    //used in Persian apps
    private static final String extendedArabic = "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9";

    //used in Arabic apps
    private static final String arabic = "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669";

    // 동아리비아 -> 서아라비아
    // FIXME 소수점은 대응되어있지 않음
    public static String arabicToDecimal(String number) {
        char[] chars = new char[number.length()];
        for(int i=0;i<number.length();i++) {
            char ch = number.charAt(i);
            if (ch >= 0x0660 && ch <= 0x0669)
                ch -= 0x0660 - '0';
            else if (ch >= 0x06f0 && ch <= 0x06F9)
                ch -= 0x06f0 - '0';
            chars[i] = ch;
        }
        return new String(chars);
    }
}

 

동아라비아 숫자 0~9까지 유니코드 정규식

https://en.wikipedia.org/wiki/Arabic_script_in_Unicode

\u0660-\u0669

 

 

번외

SpannableStringBuilder을 사용한 곳이 있을 수 있다. 여긴 딱히 방법이 없으니 알아서 잘 처리해야함..

 

DateFormat을 RTL로 쉽게 치환하는 방법은 따로 없는 듯 하다. 또한 Mena 지역에서도 각 나라마다 생년월일 표기법이 YYYY-MM-DD인 곳도 있고, DD-MM-YYYY인 곳도 있다. 이건 요구사항대로 판단.

 

 

오픈소스

직접 import하여 RTL 상황에 따른 요구사항을 만족할 수 있게 내부소스 코드를 변경