상세 컨텐츠

본문 제목

안드로이드 문서 정리 - 앱 현지화

안드로이드 문서 정리

by yebon.kim 2021. 5. 13. 00:31

본문

반응형

앱 현지화 (Localize your app)

사용자 언어에 맞게 텍스트, 오디오 파일, 숫자, 통화 및 그래픽을 처리할 수 있어야 한다.

 

기본 리소스가 중요한 이유

안드로이드는 지역이 정해진 string(values-en/strings.xml 등)을 제공하지 않으면 기본 리소스(res/values/strings.xml)를 로드한다. 예를 들어 title이라는 string이 [res/values/strings.xml]에만 선언되어 있고, [values-ja/string.xml]에 선언되어 있지 않은 경우 기기 언어 설정이 일본어로 되어있는 경우 안드로이드는 title을 [res/values/strings.xml]에서 불러온다.

만약 [res/values/strings.xml]과 같은 기본 파일이 없거나 앱에서 필요한 string이 없을 경우 아래와 같은 오류가 뜨면서 빌드에 실패한다.

 

 

string 리소스 파일 뿐만 아니라 모든 리소스 파일에 해당한다.


현지화를 위한 리소스 사용 방법

1. 기본 리소스 만들기

  • [res/drawable/], [res/layout/]은 기본으로 포함되어 있다.
  • [res/anim/], [res/xml/], [res/raw/] 폴더는 [res/anim-<qualifier>], [res/xml-<qualifier>], [res/raw-<qualifier>] 폴더가 있는 경우 필수로 만들어 주어야 한다.

2. 대체 리소스를 만드는 법

지역별로 다른 리소스를 제공하기 위해서는 언어를 나타내는 한정자와 지역을 나타내는 한정자를 사용할 수 있다.

values-en[언어를 나타내는 한정자]-rUS[지역을 나타내는 한정자]

이 한정자들에 대해서 더 자세히는 [링크]를 참고할 수 있다.

 


3. 어떤 리소스가 우선 적용되는가?

여러 개의 리소스 파일이 기기 configuration과 일치하는 경우 Android는 규칙에 따라 사용할 파일을 결정한다.

정확한 방법과 예제는 [링크]의 하단을 참고할 수 있다.


현지화를 위한 문자열 관리

 

1. 모든 string을 strings.xml로 옮긴다.

  string 하드코딩 금지. 하드코딩하지 않고 strings.xml을 이용하면 앱 업데이트와 현지화를 더욱 쉽게 할 수 있게 된다. Image를 텍스트로 부터 만들고 있는 경우에도 텍스트는 strings.xml에 두고 안드로이드에서 로드된(번역된) string을 통해 Image를 만들어야 한다.

 

2. 안드로이드 가이드라인을 따른다.

Material Design에는 텍스트 관련된 내용도 있다. 이를 따르도록 한다.

 

3. 안드로이드에 정의된 용어들을 따른다.

Notification, System Bar, Action Bar 등등

 

4. strings.xml에 선언할 때는 충분한 문맥을 주석으로 표현한다

아래에 나오는 예시처럼 주석은 번역가에게 중요한 정보를 전달하여 번역의 품질을 높일 수 있다. 사용자들에게 언제, 어디에서 또 어떤 View 위에서 표시되는지 적어두면 좋다.

<!-- The action for submitting a form. This text is on a button that can fit 30 chars -->
    <string name="login_submit_button">Sign in</string>

 

5. 번역하지 않을 언어를 xliff:g 태그로 표시한다.

이 역시 번역가에게 중요한 정보를 줄 수 있다. 예를 들면 아래와 같이 언어가 바뀌어도 바뀌지 않아야 할 부분을 표시할 수 있다.

 

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- 특수문자를 위한 placeholder -->
<string name="star_rating">5개의 <xliff:g id="star">⭐️</xliff:g>을 주세요!</string>
<!-- Url을 위한 placeholder -->
<string name="app_homeurl">
    <xliff:g id="application_homepage">http://my/app/home.html</xliff:g> 에서 확인할 수 있습니다.
</string>
<!-- 이름을 위한 placeholder -->
<string name="prod_name">
    <xliff:g id="prod_gamegroup">Game Group</xliff:g>에서 더 자세히 확인할 수 있습니다.
</string>
</resources>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Example placeholder for a special unicode symbol -->
<string name="star_rating">Check out our 5
    <xliff:g id="star">⭐️</xliff:g>
</string>
<!-- Example placeholder for a for a URL -->
<string name="app_homeurl">
    Visit us at <xliff:g
    id="application_homepage">http://my/app/home.html</xliff:g>
</string>
<!-- Example placeholder for a name -->
<string name="prod_name">
    Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g>
</string>
</resources>

 


현지화 꿀팁🍯

 

1. 어떤 언어에서든지 작동하도록 앱을 만들어야 한다.

한정자가 없는 [res/drawable/]과 [res/values]에는 앱에 필요한 모든 이미지와 텍스트가 포함되도록 한다.

 

2. 유연한 레이아웃 설계하기

특정 언어에 맞도록 레이아웃을 수정해야한다면 [res/layout-[locale qualifier]]를 사용할 수 있다. 예를 들어 긴 독일어를 위해서 [res/layout-[locale-qualifier]]를 추가할 수 있다.

-> 하지만 이는 유지를 어렵게 만듦으로 하나의 유연한 레이아웃을 설계하는 것이 좋다.

 

또 전형적인 상황은 이름을 입력하는 레이아웃이다. 예를 들어 한국에서는 이름 입력 EditText가 2개 이면 되지만 다른 나라에서는 3개가 필요할 수 있다. 이럴 때, 2가지 방법으로 대응할 수 있다.

  • 하나의 레이아웃에 3개의 EditText를 포함하고 마지막 하나는 Java나 Kotlin으로 언어설정에 따라 조절한다.
  • Main Layout을 만들고 그 안에 이름 관련 레이아웃을 include하는 방식으로 만든다.

3. 필요한 것보다 많은 리소스 파일과 string 만들지 않기

main_layout.xml이 언어에 따라 달라지지 않는다면 굳이 언어별 레이아웃 파일을 만들 필요가 없다.

string에 대해서도 마찬가지이다. 앱에 대부분의 미국식 영어와 약간의 영국식 영어가 필요할 경우에는 대부분의 string을 [res/values/en-rUS]에 선언하고 필요한 영국식 영어 string만 따로 [res/values/en-rGB]파일을 만들어 대체할 수 있다.

 

4. Android Context를 이용해서 locale을 알 수 있다.

val primaryLocale: Locale = context.resources.configuration.locales[0]
val locale: String = primaryLocale.displayName

 

5. 구글이 제공하는 번역 서비스를 이용한다.

번역 회사로부터 즉시 견적을 받고 번역을 요청할 수 있는 빠르고 간단한 방법이다. [링크]에서 확인할 수 있다.

 

현지화된 앱 테스트하기

[res/values/fr-CA] 와 같은 locale을 에뮬레이터에서 테스트하기 위한 방법이 있다. (실제 기기에서는 동작하지 않는다)

 

adb shell 이용하기

  1. adb shell 또는 adb -e shell 를 입력하여 adb shell로 진입
  2. su setprop persist.sys.locale [BCP-47 language tag];stop;sleep 5;start
    1. BCP-47 랭귀지 태그를 이용하여 위 명령어를 입력
    2. 예시

adb shell 진입
실제 Locale 변경

반응형

관련글 더보기

댓글 영역