본문 바로가기

Tech Interview/Android

[Android] 안드로이드에서 다국어 지원을 위해 해야할 작업에 대해서 설명하시오.

반응형

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") {
            //한국어가 아닌경우 처리
        }


이상으로 안드로이드 앱에서 다국어를 지원하는 방법을 살펴봤습니다. 




출처: http://zeany.net/49 [소소한 IT 이야기]

반응형