1. 다국어 지원을 위한 values 추가
기본적으로 안드로이드 앱에서 사용되는 문자열들은 res\values\strings.xml에 정의해서 사용합니다.
여러 언어를 지원하려면 새로운 언어를 위한 values 디렉토리를 만들고 그 안에 그 언어로 된 strings.xml을 만들면 됩니다. 새로운 언어를 위한 values 디렉토리의 형식은 values-"언어 코드 2자리(소문자)" 입니다. 예를 들어 영어라면 values-en, 일어라면 values-jp 등으로 만들면 됩니다.
언어 코드는 ISO 639-1의 두자리를 사용하고, 그 코드는 http://www.loc.gov/standards/iso639-2/php/code_list.php 에서 찾아볼 수 있습니다.
아래에 가장 많이 쓸 것 같은 7개 언어를 정리해 봤습니다. (저는 영어, 한국어 이외에는 쓸 일이 없겠네요.)
- 한국어 ko
- 영어 en
- 일어 jp
- 중국어 zh
- 불어 fr
- 독일어 de
- 스페인어 es
만약 영어처럼 사용하는 지역이 여러 곳인 언어에 대해 특정 지역을 추가로 지정하고 싶으면
ISO 3166-1-alpha-2의 지역 코드 2자리를 values-"언어 코드 2자리(소문자)"-r"지역 코드 2자리(대문자)" 로 붙이면 됩니다. 예를 들어 미국에서 사용하는 영어라고 콕 집어 지정하고 싶으면 en-r에 US를 붙여서 values-en-rUS 로 하면 됩니다.
이에 대한 코드는 https://www.iso.org/obp/ui/#search/code/ 에 잘 나와 있습니다.
2. 다국어 지원을 위한 strings.xml 의 예제
한국어와 영어를 지원하는 앱의 예를 들어보도록 하겠습니다. 슬프지만, 영어를 할 줄 아는 사람이 전세계적으로 보면 더 많기 때문에 기본은 영어로 하고 한국어를 추가하도록 하겠습니다.
1) res\values\strings.xml
영어로 된 strings.xml은 다음과 같습니다.
1 2 3 4 5 6 7 8 | <resources> <string name="app_name">Sample</string> <string name="hello">Hello</string> <string name="android">android</string> <string name="some_key">ca-app-pub-3930256*^^*99962527/6300978111</string>--> </resources> |
2) res\values-ko\strings.xml
한글을 위해 values-ko 디렉토리를 만들고 그 안에 strings.xml을 새로 만듭니다. 이 때 기본(영어) strings.xml와 내용이 동일하다면 아래처럼 생략해도 무방합니다. 특히 some_key와 같이 복잡한 내용이라면 한 곳에서 관리하는 것이 좋아보입니다. 하지만, 기본적으로 안드로이드에서는 모든 항목에 대해 별도로 나눠서 관리하는 것을 더 좋아하는 것도 같습니다.
1 2 3 4 5 | <resources> <string name="app_name">예제</string> <string name="hello">안녕</string> </resources> |
3. 다국어 사용 예제
관리는 나눠서 하지만, 사용할 때는 동일하게 하는 것이 안드로이드의 다국어 지원 방식의 장점입니다. 익숙할테니 짧게 살펴보겠습니다.
1) xml
AndroidManifest.xml이나 layout 등에서는 다음 @string/app_name 처럼 사용하면 됩니다.
이 경우라면 기기 설정을 한국어로 한 경우라면 앱의 아이콘 아래 이름이 '예제'가 될 것이고, 나머지 경우라면 'Sample'이 될 것입니다.
1 2 | <application android:label="@string/app_name" |
2) java
Activity와 같은 소스에서는 다음처럼 사용합니다.
1 | mTextView.setText(R.string.hello); |
4. 앱 배포
만약 위의 예제처럼 두 개의 strings.xml이 다른 경우에는 배포를 위해 apk를 만들 때 다음과 같은 에러를 볼 수 있습니다.
Error:Execution failed for task ':app:lintVitalRelease'.
> Lint found fatal errors while assembling a release target.
To proceed, either fix the issues identified by lint, or modify your build script as follows:
...
android {
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
}
...
이 경우 lint를 무시하고 싶다면 에러 메시지에서 말하는 것처럼 app 수준의 build.gradle에 아래처럼 추가하면 됩니다.
1 2 3 4 5 6 7 8 9 | android { ... lintOptions { checkReleaseBuilds false // Or, if you prefer, you can continue to check for errors in release builds, // but continue the build even when errors are found: abortOnError false } } |
5. 예외
strings.xml에 정의한 것만으로는 부족할 때가 있는데 대표적인 경우가 다른 값들과 결합해서 문자열을 만들 때 입니다. 예를 들어 상품을 판매한다고 할 때 "이 상품은 1,000원입니다." 라고 한국어로 표현하는 것을 영어로 한다면 "It costs 1 USD." 처럼 문법이나 화폐 단위에 따라 문자열을 별도로 구성해줘야 할 필요가 생깁니다.
이런 경우에는 다음처럼 기기의 언어 코드를 가져와서 직접 적합한 문자열을 만들 수 있습니다.
1 2 3 4 5 6 7 8 | Locale mLocale = getResources().getConfiguration().locale; String language = mLocale.getLanguage(); if (language.contains("ko")) //한국어인 경우 처리 else if (language.contains("ko") { //한국어가 아닌경우 처리 } |
이상으로 안드로이드 앱에서 다국어를 지원하는 방법을 살펴봤습니다.
'Android' 카테고리의 다른 글
안드로이드에서 Activity 시작하기 - startActivity() (0) | 2017.02.16 |
---|---|
안드로이드 Action Bar에 메뉴 추가하기 (1) | 2017.01.31 |
SoundPool을 이용한 안드로이드의 효과음 재생 예제 (1) | 2017.01.24 |
안드로이드 앱에서 Firebase AdMob을 통해 광고 게재하기 (1) | 2017.01.18 |
안드로이드 View (0) | 2017.01.18 |