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 상황에 따른 요구사항을 만족할 수 있게 내부소스 코드를 변경