목표
- string.xml 을 사용해 다국어 문자열을 만드는 방법을 안다.
개요
세계에는 한국어, 영어, 일본어, 중국어, 스페인어 등 다양한 언어가 있다. 사용자에 따라 자신에게 편한 언어가 다를 수 있다. 앱을 사용할 경우에도 마찬가지이다. 사용자 별로 자신이 편한 언어가 다를 수 있는데, 이는 주로 자신이 속한 국가에 영향을 받는다. 안드로이드에서는 국가에 따라 다르게 문자열을 표현할 수 있는 방법을 제공한다. 우리는 이를 다국어 문자열을 지원한다고 한다.
그렇다면 어떻게 지원을 할까? 바로 res(리소스) 폴더 내에 있는 values 폴더 내부의 strings.xml 파일을 통해 다국어 문자열을 지원한다.
strings.xml 이란?
여기서 strings.xml 파일 내부에서 string은 key-value 값을 통해 문자열 값을 저장된다.
*xml파일은 형태가 정해져있는 반정형 파일로, strings.xml은 태그, Key값, Value값으로 이루어진다.
이런식으로 저장된 string 파일은 안드로이드 프레임웍에 의해 string 콘테이너 내부에 key-value 쌍으로 만들어진다. 예를 들어 strings.xml을 다음과 같이 만들었다고 해보자
<resources>
<string name="champion_position_top">TOP</string>
<string name="champion_position_mid">MID</string>
<string name="champion_position_jungle">JUNGLE</string>
<string name="champion_position_bottom">BOTTOM</string>
<string name="champion_position_support">SUPPORT</string>
</resources>
그렇다면 이 구조는 다음과 같이 저장된다.
Key | Value |
champion_position_top | TOP |
champion_position_mid | MID |
champion_position_jungle | JUNGLE |
champion_position_bottom | BOTTOM |
champion_position_support | SUPPORT |
우리가 코드를 통해 champion_position_top Key를 호출할 경우 TOP이 호출되는 형태인 것이다.
다국어 지원
이러한 Map 형태의 구조를 이용해 다국어를 만들 수 있다. strings.xml의 오른쪽 위의 Open editor을 눌러보자.
그러면 다음과 같은 창이 뜬다.
이제 여기에 있는 지구본에 + 모양이 있는 키를 누른다음 South Korea를 찾아 누르자
그러면 그림6과 같이 만들어진다. 그림6 처럼 내용을 채우자
이제 휴대폰의 언어가 한국으로 설정되어 있을 시 한국어로 표기되게 된다. 반대로 미국으로 설정되어 있을 경우 영어로 뜨게 된다. 자 이제 strings.xml을 다시 보자
strings.xml에 속성값이 ko-rKR로 표기된 strings.xml이 하나 더 추가되었다. 이제 시스템에서는 언어값이 ko-rKR일 경우에는 strings.xml(ko-rKR)으로부터 생성된 Map을 참조하게 되고, 그 외의 언어값에서는 default 값인 strings.xml로부터 생성된 Map을 참조하게 된다.
strings.xml에서 값 가져오기
이제 strings.xml에서 값을 가져오는 방법을 알아보자. 하나는 layout xml파일에서 가져오는 방법이고 나머지는 kotlin 코드 상에서 가져오는 방법이다.
layout xml 파일에서 값 가져오기
xml파일에서 값을 가져오는 방법은 간단하다. 먼저 string resource를 가져오는 표시인 @string을 쓴다음 key 값을 추가로 입력해주면 된다. 즉, 아래와 같이 문자열이 들어가는 곳에 @string/search_champion_search_hint 와 같이 속성값을 입력해주면 된다.
<com.google.android.material.button.MaterialButton
android:id="@+id/button_search"
android:layout_width="200dp"
android:layout_height="45dp"
android:hint="@string/search_champion_search_hint"/>
kt 파일에서 값 가져오기
코드상에서 가져오려면 android의 리소스에의 접근이 필요하기 때문에 context가 필요하다.
fun getName(context: Context) = context.resources.getString(R.string.champion_position_top)
따라서, 다음과 같이 가져올 수 있다. 먼저 resources에 접근하기 위해 context에 접근한 다음 resource를 가져오고 그 다음 getString 메서드에서 resourceId를 참조하게 만들면 된다.
나는 개발에서 모든 값에서 이 메서드를 공통으로 사용하게 만들기 위해 enum class와 조합하여 다음과 같이 사용하였다.
enum class ChampionPosition(private val resourceId: Int) {
TOP(R.string.champion_position_top),
MID(R.string.champion_position_mid),
JUNGLE(R.string.champion_position_jungle),
BOTTOM(R.string.champion_position_bottom),
SUPPORT(R.string.champion_position_support);
fun getName(context: Context) = context.resources.getString(this.resourceId)
}
위와 같이 값을 가져오면 자신의 언어 설정에 따라 값이 다르게 나온다.
정리
앱은 여러 국가에 출시되는 경우가 빈번하다. 위의 사용법을 숙지하여 다국어 지원에 대비하도록 하자.