안드로이드 현지화(Localization): 베이직

안드로이드 현지화(Localization): 베이직

안드로이드는 세계 곳곳의 많은 지역에서 많은 장치들에서 작동한다. 많은 수의 유저들에게 서비스를 제공하기 위해서 앱이 사용되는 지역에 대한 번역 등의 현지화를 해줘야 한다.

앱을 만들 때, 앱의 사용자를 생각하는게 가장 중요하다. 당연히 그 사람들이 앱을 사용할 사람들이기 때문이다.

당신의 앱이 멀티 랭귀지를 지원한다면 어떤 이득을 가질 수 있을지 고려해야 한다. 지역에 맞는 다른 더 좋은 이미지나 레이아웃이 무엇일지도 생각해봐야 한다.

이 튜토리얼에서는 다음의 내용을 배워볼 것이다.

  • 다중 언어 지원
  • 오른쪽에서 왼쪽으로 읽는 언어들을 위해서 앱의 레이아웃을 테스트
  • 다양한 현지화를 위한 리소스들을 추가

이 튜토리얼은 안드로이드와 안드로이드 스튜디오의 기본 지식이 있는 개발자를 대상으로 작성되었다. 만약 안드로이드 개발이 처음이라면, 다른 자료를 통해서 학습을 먼저 진행하기를 바란다.

시작하면서

튜토리얼을 원할히 진행하기 위해서 다운로드 버튼을 눌러서 안드로이드 스튜디오 프로젝트를 다운받기 바란다.

안드로이드 스튜디오에서 프로젝트를 열고 파일을 살펴보자. 프로젝트를 빌드하고 테스트 장치에서 어떤 앱인지 실행 시켜보자.

이 앱은 간단한 아바타 생성기이다. 유저는 4개의 스피너로 헤어 스타일, 의상, 신발을 선택해서 아바타를 생성할 수 있다. 공유 버튼을 누르면 텍스트로 된 아바타의 설명을 원하는 앱으로 공유할 수 있다.

이 프로젝트는 글로벌 타겟 앱이지만, 우선 미국인들을 위해 미국 영어로 모든 메뉴들이 구성 되어 있다.

현재 상태로는 미국 사람들에게는 아무런 문제가 없다. 하지만 한국 사람들에게 사용하라고 하기에는 좀 곤란할 수도 있다.

그래서 한국 사람들을 위해서 현지화 지원을 추가해야된다. 이 튜토리얼은 그걸 어떻게 하는지 알려줄 것이다.

현지화

시작하기 전에, 아래 내용을 항상 숙지하고 있기 바란다. 추후에 현지화하기가 아주 편할 것이다.

  • 문자값은 strings.xml 값에다가 넣자. : 소스코드에다가 바로 하드코딩하는 것보다는 모든 문자열 값을 키-벨류 값으로 strings.xml 이라는 별도의 리소스 파일에 저장하자. 각각의 문자열 값에 아이디를 부여하면 프로젝트 내에 어디든 원하는 곳에서 사용할 수 있다.

    이건 문자열을 찾기에도 쉽다. 해석을 추가하는게 얼마나 쉬운지 곧 보게 될 것이다.

    이 파일은 프로젝트내에 리소스 섹션 values 디렉토리 내에 위치해야한다. 이게 디폴트 문자열 파일이다.
  • 텍스트를 포함하고 있는 이미지들은 최대한 피하자: 현지화를 하기로 결정했다면, 각각의 언어에 대한 이미지 애셋을 넣어야만 한다. 이건 수고스러울 뿐만 아니라 APK의 용량을 증가시킨다, 가능한한 모든 문자열을 텍스트로 넣는 것이 좋다.

모든 문자열들을 strings.xml 파일에다가 잘 작성해서 앱을 제작했다면, 현지화 지원을 추가하는건 굉장히 쉽다. 파일만 작성하면 안드로이드 시스템이 다 알아서 해줄 것이다.

안드로이드 시스템은 무엇을 보여줄지 어떻게 결정하는가

유저가 앱을 실행하면, 안드로이드 시스템은 어떤 디렉토리에 화면에 표시할 리소스가 저장된 건지 판단하기 위해 장치 로케일을 사용한다. 디렉토리 이름에는 로케일 문구가 포함되어 있다. 안드로이드 시스템은 이 문구를 이용해서 각각의 로케일에 맞는 정확한 디렉토리를 선택한다.

문자열이나 drawables에 대한 디폴트 리소스 파일들을 제공하는 것인 중요하다. 안드로이드 시스템이 장치 로케일에 대한 디렉토리를 찾지 못한다면 디폴트 리소스를 사용하기 때문이다. 이 프로젝트는 글로벌 타겟이므로 영어를 디폴트로 정했다. 모든 로케일에 대해서 현지화를 진행할 수는 없으므로, 리소스 파일이 없는 로케일의 장치에서는 글로벌 언어인 영어가 나오도록 한 것이다. 예를 들어, 스페인 유저가 앱을 실행했는데 values-es 디렉토리가 없다면, 아쉬운대로 영어를 표시할 것이다.

만약 리소스 id에 대한 디폴트 값을 찾을 수 없다면 앱은 실행이 중지될 것이다. 그러므로, 모든 리소스에 대해서 디폴트 값을 정의하는 것이 좋다.

지원하기 원하는 각각의 언어들에 대해서 해설을 포함된 strings.xml 파일을 로케일 문구가 포함된 디렉토리에다가 넣어야만 한다. 그 파일에는 동일한 리소스 id를 가진 해석된 문자열들을 포함하고 있어야한다. 소스코드에서 id 값을 가지고 참조되기 때문이다.

혹시 약간 어렵다고 느껴진다면 걱정할 필요가 없다. 다음 섹션에서 샘플 앱에 한국어 지원을 추가하는 것을 하나 하나씩 진행할 것이다.

아래 테이블은 현지화에 대한 안드로이드 공식 문서에서 가지고 온 것이다. 이건 안드로이드 7 이상의 버전에서 리소스 결정을 어떻게 하는지 나타내는 이미지이다.

앱을 실행하는 유저의 언어는 fr_CH(프랑스어 – 스위스)이지만, 앱에서는 지원하지 않는다. 안드로이드 시스템은 정확히 일치하는 리소스를 찾기에 실패한 후, 같은 언어지만 다른 지역의 디렉토리를 찾으려고 한다. 이 앱은 fr_FR(프랑스어 – 프랑스) 지원하고 있으므로 이걸 화면에 표시한다.

만약 이 디렉토리도 없다면, 디폴트만 남은 상황이 된다. 안드로이드 시스템의 디폴트 로케일은 대부분 en-rUS이다.

많은 일이 일어나는 것처럼 보이지만, 사실 꽤나 단순한 절차로 진행된다. 아무튼 우리의 샘플 앱을 현지화 해보도록 하자!

다른 언어를 위해 Strings 파일을 추가하기

샘플 프로젝트에서, strings.xml 파일을 열어보자. 한국어 사용자를 위해 아래의 내용은 꼭 해석되어야 한다.

<string name="label_hair">Hair colour</string>
<string name="label_top">Top</string>
<string name="label_bottom">Bottom</string>
<string name="label_shoes">Shoes</string>

새로운 리소스 디렉토리를 생성

계속 진행하기에 앞서, 안드로이드 스튜디오의 프로젝트 패널 모드를 Android가 아니라 Project로 하도록 하자. 이래야 디스크에 있는 그대로 표시되기 때문에 새로운 리소스 파일을 추가하기에 편하다.

한국어 해석을 저장할 새로운 리소스 디렉토리를 생성하자. 안드로이드 스튜디오에서 프로젝트 패널로 가서 res를 선택하자. 마우스 오른쪽 버튼 클릭 후, New > Android Resource Directory를 선택하자.

그럼 New Resource Directory 창이 열릴 것이다. 이 곳에서, 원하는 리소스 타입과 로케일 문구를 선택할 수 있다. 스트링을 현지화하기 위해서, values 리소스 타입과 로케일 문구를 가진 디렉토리를 추가해보자.

Available qualifiers에서 Locale을 선택하고 >> 버튼을 클릭하자. 그럼 선택된 qualifiers에 대한 옵션들이 나오는 새로운 패널이 열릴 것이다. 거기서 Language에서 Korean을 선택하고 Region에서 KR: South Korea을 선택하자.

선택한 리소스 타입과 qualifiers로 디렉토리 이름이 채워진것을 확인하자. 이 디렉토리 이름 형식은 안드로이드 시스템에서 리소스를 찾는데 사용하기 때문에 임의로 디렉토리 이름을 바꾸지 말기를 바란다.

OK버튼을 눌러서 창을 닫자. Project 패널에서 values-ko-rKR란 이름의 디렉토리가 생성된 것이 보일 것이다. 이 곳에 한국인들을 위한 번역된 문자열들을 가진 strings.xml을 넣으면 된다.

새로운 Strings 파일을 생성

위에서 생성한 디렉토리에 새로운 strings.xml 파일을 생성하자. 디렉토리 위에서 마우스 오른쪽 클릭 후 New > Values Resource file을 선택하면 된다.

새로 열리는 창에서, strings.xml이라고 입력하고 OK 버튼을 누르자. 안드로이드 시스템이 필요한 경우에 리소스를 전환할 수 있도록 디폴트 파일 strings.xml 똑같은 이름을 할당하도록 하자.

우리가 생성한 strings.xml 파일은 Project 패널과 열린 파일 탭에 태극기와 함께 표시되서 구분하기가 쉬울 것이다.

이 파일에서 한국어로 설정된 기기에서 표시되기 원하는 어떠한 번역문이라도 추가할 수 있다. 하지만 앱에 있는 모든 문구에 대해서 번역을 추가할 필요는 없다. 한국어 번역 값에 데이터가 없더라도 디폴트 strings.xml 파일에 해당하는 string name을 가진 문자열 값이 저장되어 있는 한 알아서 디폴트 값을 사용할 것이기 때문이다.

한국어 strings.xml 파일의 resources 태그 안에 아래 번역문을 추가하도록 하자. 디폴트 파일에 정의된 string name 값과 정확히 일치하고 오직 value 값만 번역되어 있다.

이게 할일의 전부다. 튜토리얼 앱에 번역문을 성공적으로 추가했다. 실제 안드로이드 장치에서 실행하기 전에 안드로이드 스튜디오에서 테스트를 해보도록 하자.

안드로이드 스튜디오에서 프리뷰 해보기

안드로이드 스튜디오에서 activity_main.xml 파일을 열어보자. 파일 아래부분에 Text 탭을 선택하자. 그래야 xml 코드를 볼 수 있다.

화면 오른쪽에 Preview 패널이 뜬 것이 보일 것이다. 만약 안 보인다면 오른쪽에 사이트 패널에서 Preview를 선택할 수 있다.

Preview 패널의 툴바를 보면, Default (en-us)를 표시하고 있는 Locale을 선택할 수 있는 드롭다운 메뉴가 있다.

이제 프로젝트는 복수의 로케일 디렉토리를 가지고 있으므로, 드롭다운 메뉴에서 다른 값을 선택할 수 있다. Korean (ko) in South Korea (KR)을 선택해보자.

아직은 타이틀 부분만 번역한 상태이기 때문에 아래와 같은 화면이 나오게 될 것이다.

프리뷰는 다양한 값들에 대해서 레이아웃이 어떻게 보이는지 확인할 수 있기 때문에 유용하다. 언어들마다 더 길거나 짧은 문장으로 번역될 수 있다. 이로인해 발생할 수 있는 문제들을 빨리 잡아낼 수 있는 좋은 방법 중에 하나이다.

실제 장치에서 테스트 해보기

이제 실제 안드로이드 장치에서 한번 테스트 해보자. 앱을 빌드하고 실행시켜 보자. 안드로이드 장치의 언어가 영어로 되어 있다면 처음 화면과 다른게 없을 것이다.

이제 안드로이드 장치의 언어를 한국어로 변경해보자. 안드로이드 설정에 들어가서 시스템 > 언어 및 키보드 > 언어로 들어가면 아래와 같은 화면이 나온다. 여기서 한국어가 없다면 한국어를 추가하고, 있다면 한국어를 상단으로 올리자. 그럼 한국어가 메인 언어가 된다.

그런 다음 앱을 다시 한번 실행시켜보자. 그럼 다음과 같은 화면이 나오는 걸 확인할 수 있을 것이다.

앱은 이제 유저가 설정한 기본 언어를 지원하기 위해 우리가 생성한 한국어 리소스 디렉토리에서 번역된 문장을 가져오고 있다.

좋은 번역문을 작성하기 위한 팁

이제 앱에서 어떻게 다양한 언어들을 지원하는지에 대해서 알아보았다. 하지만 앱에 있는 텍스트를 얼마나 잘 번역하는지에 대한 것도 중요하다.

당신이 언어의 천재라면 모르겠지만, 사실 혼자서 지원하고 싶은 언어에 대한 번역을 한다는 건 불가능에 가깝다. 그래서 번역을 대신해 줄 사람을 찾아야한다.

아마 당신이 번역을 믿고 맡길 수 있는 다양한 국가 출신들의 친구들이 있을지도 모른다. 그게 아니라면, 번역 서비스를 맡길 업체를 이용하는 방법도 있다.

어떻게 번역을 하든, 대부분의 경우에 strings.xml 파일을 보내야 될 것이다. 파일을 보낼 때, 그 문장이 사용되는 위치, 문맥에 대해서 자세히 설명할수록 좋다.

strings.xml 파일에서 각각의 문장에 대해서 아래와 같이 커멘트를 달아야만 한다. 이 문장이 어디에서 나오는지 무슨 목적으로 사용되는지에 대한 설명을 달아야 옳은 번역을 할 수 있다

<!-- 메인 화면에 표시. 아바타의 특성을 나타내는 각 섹션의 타이틀 텍스트임. 스피너 왼쪽에 표시 -->
<string name="label_hair">헤어 컬러</string>
<string name="label_top">상의</string>
<string name="label_bottom">하의</string>
<string name="label_shoes">신발</string>

아래는 추가적으로 알아둬야할 부분들이다.

  • 번역이 불가능한 문장: 만약 문장을 번역하고 싶지않다면, translatable=”false”라고 문자열 선언의 name 뒤에다가 추가하면 된다.
  • Formatters: 안드로이드가 제공하는 광범위한 지역별 지원으로, 같은 로케일이라도 날짜나 시간의 포맷이 다를 수도 있다.

    하드코딩된 값을 사용하거나 숫자나 날짜를 변환시키는 직접 만든 메소드를 이용하기 보다는 안드로이드가 제공하는 포맷 형식의 스트링을 사용해야한다. 안드로이드는 지역에 따라서 숫자, 날짜, 스트링을 정확하게 변환시킬 수 있기 때문이다.
  • 스트링 내 위치를 포함하는 인자: 어떤 로케일에서는 제공받은 파라미터의 순서가 다를 수 있다. 그래서 strings 파일에서 순서에 대한 주석을 달아야만 한다. 샘플 튜토리얼 내에도 share_text라는 예시가 있다.
<string name="share_text">I just generated a cool character with %1$s hair, wearing a %2$s, %3$s and %4$s!</string>

오른쪽에서 왼쪽으로 읽는 언어들 (RTL)

다중 언어를 지원하기 위해서 조금 더 고려해야할 사항이 있다. 몇몇의 언어의 경우, 예를 들면, 아랍어나 히브리어의 경우 왼쪽에서 오른쪽으로 읽는게 (LTR) 아니라 오른쪽에서 왼쪽으로 (RTL) 읽는다.

UI를 미러링 해보기

앱에서 RTL 언어들을 지원하기 위해, 미러링 되었을 때 UI 기능들이 의도한 대로 작동하는지 확인하기 위해서 레이아웃을 테스트할 필요가 있다.

간단한 레이아웃의 경우, 레이아웃을 만들 때 안드로이드의 베스트 프랙티스에 따라서만 만드는 건 매우 많은 도움이 될 수 있다. 앱 개발이 진행되는 동안 변경하는데 들어가는 노력을 줄이기 위해 항상 베스트 프랙티스에 따라서 만들어야 한다. 아래에서 중요한 몇개를 언급해 보겠다.

  • 항상 레이아웃 작성 시 xml 속성 left와 right가 아니라 start와 end를 사용하라. 장치가 RTL로 설정되어 있다면, 스크린의 왼쪽이 아니라 오른쪽 부분이 start로 여겨진다. 속성을 left로 설정을 했다면, 화면의 전환이 필요한데도 그대로 왼쪽에 있게 되어서 문제가 될 수 있다.
  • 텍스트 뷰의 android:layout_width와 android:layout_height의 크기를 고정된 길이로 둘다 한정시키지 마라. 문장과 단어들의 길이는 언어별로 다르게 번역될 수 있다. 만약 사이즈가 고정되어 있다면 뷰의 사이즈가 너무 작아 텍스트의 끝 부분이 잘려 나갈 수 있다. android:layout_width나 android:layout_height를 wrap_content를 설정해서 크기가 변경되게 하는 것이 좋다.
  • 레이아웃을 작성하는데 ConstraintLayout를 사용하는걸 고려하라. Barriers 같은 기능들은 다양한 길이의 스트링을 UI에 표시하는데 특히나 유용하다.

로케일을 위해 커스텀 레이아웃을 생성

대부분의 경우에, 위의 팁을 따르는 건 LTR과 RTL 둘다를 지원하는데 하나의 레이아웃 파일로 충분할 것이다. 하지만 복잡한 레이아웃이나 특별히 커스텀이 필요한 UI의 경우, 별도의 레이아웃 파일을 작성하는게 레이아웃을 더 최적화 시킬 수 있다.

RTL을 위해 최적화된 레이아웃 파일을 리소스 디렉토리 layout-ldrtl에 저장하자. 물론 LTR 레이아웃 파일과 파일 이름은 똑같아야 한다. 이 디렉토리는 안드로이드 스튜디오에서 이전에 다른 로케일의 스트링 리소스를 위해 생성했던 것과 같은 방식으로 만들 수 있다.

이번에는 Resource Type으로 layout을 선택하고 qualifier로 Layout Direction을 선택하자. 그리고 RTL을 이 디렉토리의 레이아웃 방향으로 선택하자.

RTL 로케일을 위해 테스트

샘플 프로젝트는 현재 어떠한 RTL 언어 파일을 가지고 있지 않다. 하지만 그래도 앱이 지원할 준비가 되었는지 테스트해 볼 수 있다.

우선, AndroidManifest.xml에서 RTL 지원을 한다고 설정했는지 확인해 보자. application 내에 android:supportsRtl=”true”로 되어 있어야 한다.

안드로이드 스튜디오에서 레이아웃을 개발하는 동안, 레이아웃 프리뷰에서 RTL 모드일 때 레이아웃의 상태가 어떤지 확인해 볼 수 있다.

레이아웃 프리뷰 패널에서 로컬화된 스트링을 테스트 해볼 때, Preview Right to Left라는 아이템이 같은 메뉴에 있는 걸 눈치챘을 수도 있다. 이걸 활성화 시키면 프리뷰에서 오른쪽 왼쪽이 바뀐 레이아웃을 확인할 수 있다.

프리뷰로 레이아웃이 문제가 없다는 걸 확인했다면 실제 안드로이드 장치에서 확인해 볼 차례다. 안드로이드 장치에는 다양한 언어 타입들을 테스트하기 위해 유용한 툴들이 준비되어 있다.

허위 로케일 (Pseudolocales)

디버그 빌드에서 pseudolocales를 활성화 시켜보자. 샘플 프로젝트의 build.gradle 파일에 새로운 빌드 타입과 pseudolocales를 활성화 시키기 위해 아래 코드를 buildTypes 섹션 아래에 붙여넣자.

android {
  compileSdkVersion 29
  defaultConfig {
    applicationId "com.raywenderlich.android.avatargenerator"
    minSdkVersion 26
    targetSdkVersion 29
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  }
  buildTypes {
    debug {
      pseudoLocalesEnabled true
    }
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}

앱을 다시 빌드해서 실행시켜보자. 위에서 수정한 앱 버전이 실행중이므로 장치 언어를 허위 로케일로 바꿔서 RTL 로케일 지원을 확인해보면 된다.

  • English([XA]): 이건 영어처럼 읽는 LTR 로케일이다. 하지만 액센트 표시를 추가하고 있고 문자열을 크게 확대 시켜서 레이아웃 문제들을 찾는데 도움이 된다.
  • 언어명[XB]: 이건 RTL 로케일이다. 이건 장치를 RTL 텍스트 방향을 지원하기 위해 화면의 오른쪽 왼쪽을 전환되도록 만든다. 또한 영어 문자열을 반대 방향으로 바꿔서 RTL 로케일을 흉내내는 것도 가능하다. 오른쪽 왼쪽 전환이 제대로 되지 않는 레이아웃 문제와 번역될 수 없는 문자나 구두점, 숫자 문자들의 문제들을 찾는데 도움을 준다.

어떤 것이라도 좋으니 “언어명[XB]” 형태로 표시된 것을 언어 리스트에서 선택해서 언어들 중에서 최상단으로 올리자. 안드로이드 장치는 자동으로 RTL 모드로 변경될 것이다. 그럼, 안드로이드 시스템 문자열들도 RTL 방향의 로케일을 위해 전환되는 걸 볼 것이다.

그런 다음 샘플 앱을 열어서 RTL 로케일에서 어떤 상태인지 확인해보면 방향 전환이 아주 잘 된 것을 볼 수 있을 것이다.

디자인 요소들(drawables)

이미 많은 것을 알아보았지만, 아직 하나가 더 남아있다. 앱 내에 있는 미국 국기가 한국어를 쓰는 유저들에게도 보이고 있는 문제가 있다.

태극기를 추가하기 위해 새로운 리소스 디렉토리를 만들어 보자. 전과 같이, res 디렉토리에서 마우스 오른쪽을 눌러 New > Android Resource Directory를 선택하자. drawable을 리소스 타입으로 선택하고, Korean을 언어로 South Korea을 Region으로 선택하자.

새로운 이미지를 이 디렉토리에 추가할 때, 디폴트 이미지의 이름과 똑같은 이름으로 저장해야 한다. 그래야 장치 로케일이 변경될 때, 안드로이드 시스템이 소스코드에서 참조된 파일 이름을 이용해 원하는 로케일의 이미지를 가져올 수 있다.

앱의 태극기 이미지 파일은 img_flag.png 이름으로 새로 생성한 디렉토리에 저장하자. 이 이미지를 파일 탐색기를 이용해서 저장할 수도 있고, 안드로이드 스튜디오 내 폴더에 드래그 & 드롭으로도 저장할 수 있다.

이제 현지화된 디자인 요소들(drawables)까지 넣는 것을 마무리 하였다. 앱을 다시 빌드해서 실행해 보자. 장치 언어를 한국어로 바꿔서 앱을 다시 실행시키면 우리가 추가한 태극기가 화면에 표시될 것이다.

현지화 체크 리스트

구글은 개발자들을 위해 많은 지원을 하고 있다. 현지화를 위해선, 개발중인 앱이 새로운 로케일을 지원할 수 있도록 현지화 체크리스트를 제공하고 있다.

체크리스트는 처음부터 끝까지의 전 과정을 포함하여 행여나 빠진 것들이 없는지 확인할 수 있는 유용한 팁들을 포함하고 있다. 매우 유용한 자료이므로 새로운 로케일을 적용하기 전 후에 꼭 확인해보기 바란다.

체크리스트를 모두 확인해서 이상이 없다면 현지화를 위한 모든 준비를 마친것이다!

마치면서…

샘플 프로젝트를 다운 받아서 꼭 확인해 보기 바란다.

위에서 살펴본 것과 같이, 다양한 국가의 유저들을 위한 현지화를 진행하기 위해서는 고려할 것이 많은 걸 알았을 것이다. 하지만 안드로이드는 리소스 디렉토리들을 프로젝트에 추가하는 것만으로 어렵지 않게 만들어 준다.

현지화 지원을 좀 더 강화하고 싶다면, 앱에 다른 리소스들을 제공하는 걸 고려해보자. 커스텀 레이아웃이라던지, 멀티 화폐나 오디오 파일 등 좀 더 디테일하게 바꿀 것들이 많이 있다.

짧은 튜토리얼이지만, 이 글이 당신이 전 세계 다양한 유저들에게 다가갈 수 있는 훌륭한 앱을 만들 수 있는 시작점이 되었으면 하는 바람이다.

답글 남기기