태그:         

안드로이드로 다국어를 지원하는 앱을 만드는 방법은 아주 간단하다.
프로그램 코드는 언어에 따라 변경할 것이 거의 없고, 문자열과 화면에 출력할 아이콘이나 그림 파일만 해당 언어에 맞게 작성해서 별도의 폴더에 넣으면 된다.
프로그램 코드에서는 리소스를 직접 지정하지 말고, xml에서 불러오는 형태로 간접 지정한다.

예를 들어 한국어, 영어, 일본어, 중국어를 지원하려 한다면…
values 폴더에 기본 언어의 리소스를 넣고, values-xx에 지원하려는 언어의 리소스를 넣으면 된다.
이 때 기본 언어를 영어로 하고, 한국어, 일본어, 중국어를 별도의 폴더에 넣는 것이 좋다.
이렇게 하면 혹시라도 빼먹은 항목이 있더라도 적어도 영어는 정상적으로 출력되니까 이해를 하는데 거의 문제가 없기 때문이다.
즉 values에는 영어 리소스를 넣고, values-ko(한국어), values-ja(일본어), values-cn(중국어) 폴더에 해당 언어의 리소스를 넣으면 된다.

그런데 모든 언어 리소스에 같은 문자열을 넣으려면 어떻게 할까?
values의 strings.xml에도 넣고, 한국어에도 넣고, 일본어에도 넣고, 중국어에도 넣고??????

— values/strings.xml —

[code xml]
<string name=”versionstring”>1.1.1</string>
[/code]

— values-ko/strings.xml —

[code xml]
<string name=”versionstring”>1.1.1</string>
[/code]

— values-ja/strings.xml —

[code xml]
<string name=”versionstring”>1.1.1</string>
[/code]

— values-cn/strings.xml —

[code xml]
<string name=”versionstring”>1.1.1</string>
[/code]

위와 같이 언어마다 똑같은 문자열을 넣었는데…앱을 업그레이드 하면서 버전 문자열을 바꾸려 한다.
언어마다 같은 문자열을 다 바꿔야 한다.
버전 한 번 바뀔 때마다 4개의 파일을 모두 바꿔야 한다.
혹시나 한 언어에서 바꾸는 걸 잊어먹으면?
그 언어는 이전 버전을 쓰고 있는게 되는건가?

이런 때는 values에 대표로 한 번만 넣고, 나머지 언어에서는 해당하는 문자열을 아예 넣지 않으면 된다.
이렇게 하면 안드로이드는 시스템에 설정된 언어의 해당 values 폴더의 strings.xml 파일에서 찾다가 원하는 문자열이 없으면 기본 언어(여기서는 영어)의 strings.xml 파일에서 해당 문자열을 불러와서 이용한다.
이클립스에서 해보면 이상없이 잘 동작한다.
하지만…앱을 구글 플레이 스토어에 올리려고 signed package로 export를 했더니 언어별로 문자열이 지정된게 없다는 Lint 에러 메시지가 쭉~~~나온다.

이 에러를 해결하는 방법은 두 가지가 있다.
하나는 이클립스에서 다국어 번역에 대한 Lint 에러를 경고 또는 무시하는 것으로 바꾸는 것이고, 또 하나는 기본 언어의 strings.xml 파일에서 해당 문자열에 대해서는 번역을 하지 않게 하는 것이다.

첫 번째는 아래 그림처럼 이클립스의 Window 메뉴에서 Preferences를 선택한 다음, 나오는 설정창의 Android -> Lint Error Checking을 선택하고, 아래의 콤보박스에서 Warning 또는 Ignore를 선택하면 된다.

사용자 삽입 이미지

그런데 이렇게 하면 무슨 이유인지는 모르겠지만…다른 곳에서 에러가 많이 검출되었고, 결국 signed package로 추출하기 위해 몇 가지 수정을 해야만 했다.

두 번째 방법은 아래 그림과 같이 기본 언어의 strings.xml 파일에서 다른 언어로 번역을 원하지 않는 항목에 대해 translatable=”false”라고 지정하는 것이다.

사용자 삽입 이미지

두 번째 방법으로 하면 이상없이 signed package로 추출이 되었으며, 정상적으로 동작도 된다.

관련글

Intel HAXM 설치 후 동작하는지 확인하기... 안드로이드나 타이젠 에뮬레이터를 띄우려면 상당한 리소스와 시간이 소요된다. 이걸 더 원할하게 할 수 있도록 도와주는 역할을 하는게 Intel HAXM인데 설치를 해도 백그라운드에서 조용히 돌아가는 ...
안드로이드 – 카운트 다운 타이머(CountDownTimer)... Handler를 이용하지 않고도 일정 시간이 지난 뒤에 뭔가를 하고 싶은 경우에 사용할 수 있는 CountDownTimer 클래스가 있다. 카운트 다운 타이머는 총 시간과 인터벌을 주고 시작하면 ...
ActionBarSherlock를 이용한 탭 내비게이션... 바로 아래 글에 이어 ActionBarSherlock를 이용한 탭 내비게이션 프로그램을 만들어보자. 탭을 3개로 했을 때 필요한 소스 파일은 총 5개. 메인 액티비티 탭 리스너 댑1 처리 소스...
안드로이드 3.0 미만에서도 ActionBar를 써보자... 안드로이드 3.0부터는 ActionBar가 들어갔고, SDK에도 안드로이드 3.0에 해당하는 API 레벨 11부터 ActionBar를 처리할 수 있는 API가 들어가있다. 요즘 앱의 추세가 Acti...
안드로이드 물리버튼 없는 경우에 메뉴 버튼 만들기... 안드로이드폰을 보면 요즘 물리/하드웨어버튼을 탑재하지 않고 출시되는 상황이다 그래서 화면의 일부를 뒤로가기/홈/멀티태스킹 또는 메뉴 버튼으로 사용한다. 메뉴 버튼이 있는 경우에는 하드웨어 버튼의 메...
안드로이드 AVD 만들 때 에러가 발생하면…... Starting emulator for AVD 'JellyBean_4_2_Phone' Failed to allocate memory: 8 This application has requeste...
안드로이드 다국어 지원 앱 작성시…

안드로이드 다국어 지원 앱 작성시…”에 대한 1개의 생각

  • 2014년 1월 9일 4:44 오전
    고유주소

    와우 굳 도움!!
    정말 좋은 글이에요..정말이지..정말로…정말로….정말….

    응답

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다