언어 및 로케일 해상도 개요

Android 7.0(API 수준 24)부터는 다국어 사용자를 위한 지원이 개선되었으므로 이러한 사용자가 이제 설정에서 여러 언어를 선택할 수 있습니다. Android는 지원되는 언어 수를 대폭 확대하고 시스템이 리소스를 결정하는 방식을 변경하여 이 기능을 제공합니다.

이 문서에서는 먼저 7.0(API 수준 24) 미만 Android 버전의 리소스 결정 전략을 설명합니다. 다음으로 Android 7.0에서 개선된 리소스 결정 전략을 설명합니다. 또한 더 많은 다국어 사용자를 지원하기 위해 추가된 언어를 활용하는 방법을 설명합니다.

언어 리소스 결정에서의 과제

Android 7.0 미만 버전의 Android에서는 앱 언어와 시스템 언어를 매칭하지 못하는 경우가 있었습니다.

예를 들어, 다음과 같은 상황이라고 가정해 보겠습니다.

  • 앱의 기본 언어가 en_US(미국 영어)인데, es_ES 리소스 파일에 스페인어로 현지화된 문자열도 있습니다.
  • 기기는 es_MX로 설정되어 있습니다.

자바 코드가 문자열을 참조할 때 앱에서 es_ES 아래에 스페인어로 현지화된 리소스가 있더라도, 시스템은 기본(en_US) 리소스 파일로부터 문자열을 로드합니다. 그 이유는 시스템이 정확한 일치 항목을 찾을 수 없을 때 해당 언어에서 국가 코드를 제거하여 리소스를 계속 찾기 때문입니다. 마지막으로, 일치 항목을 찾지 못한 경우 시스템은 기본값(en_US)으로 다시 돌아갑니다.

또한, 앱에서 전혀 지원하지 않는 언어(예: 프랑스어)를 사용자가 선택하면 시스템은 기본적으로 en_US로 설정합니다. 예:

표 1. 정확한 언어가 일치하지 않는 리소스 결정입니다.

사용자 설정 앱 리소스 리소스 결정
fr_CH 기본값(en)
de_DE
es_ES
fr_FR
it_IT
fr_CH 시도 => 실패
fr 시도 => 실패
기본값 사용(en)

이 예에서 시스템은 사용자가 영어를 이해할 수 있는지 여부와 관계없이 영어 문자열을 표시합니다. 현재 이러한 동작이 상당히 일반적입니다.

리소스 결정 전략 개선

Android 7.0(API 수준 24)은 더욱 안정적인 리소스 결정을 사용하고 자동으로 더욱 알맞은 대체를 찾습니다. 그러나 결정 속도를 높이고 유지관리 가능성을 개선하려면 가장 일반적인 상위 언어에 리소스를 저장해야 합니다. 예를 들어, 전에 values-es-rUS 디렉터리에 스페인어 리소스를 저장했다면 남미 스페인어가 있는 values-b+es+419 디렉터리로 이 리소스를 이동합니다. 마찬가지로 values-en-rGB라는 디렉터리에 리소스 문자열이 있다면 디렉터리 이름을 values-b+en+001(국제 영어)로 변경합니다. en-GB 문자열의 가장 일반적인 상위 리소스가 en-001이기 때문입니다. 다음은 이러한 방법이 성능과 리소스 결정의 신뢰성을 개선하는 이유를 설명하는 예입니다.

리소스 결정 예

7.0 이상 버전의 Android에서는 표 1에 설명되어 있는 사례가 다르게 결정됩니다.

표 2. 정확한 언어 일치 항목이 없을 때 확인 전략을 개선했습니다.

사용자 설정 앱 리소스 리소스 결정
  1. fr_CH
기본값(en)
de_DE
es_ES
fr_FR
it_IT
fr_CH 시도 => 실패
fr 시도 => 실패
fr의 하위 요소 시도 => fr_FR
fr_FR 사용

이제 사용자는 영어 대신 프랑스어 리소스를 보게 됩니다. 이 예에서는 Android 7.0 이상 버전에서 프랑스어 문자열을 fr_FR이 아니라 fr에 저장해야 하는 이유도 보여줍니다. 이러한 동작을 통해 가장 가까운 상위 언어와 일치시켜서 더욱 빠르고 예측 가능하게 결정합니다.

Android는 이러한 결정 로직을 개선했을 뿐만 아니라 선택 가능한 언어를 더 많이 제공합니다. 위의 예에 이탈리아어가 추가 사용자 언어로 지정되었지만 앱에서 프랑스어를 지원하지 않는 경우를 적용해 보겠습니다.

표 3. 앱이 사용자의 두 번째 선호 언어 설정만 일치할 경우의 리소스 확인.

사용자 설정 앱 리소스 리소스 결정
  1. fr_CH
  2. it_CH
기본값(en)
de_DE
es_ES
it_IT
fr_CH 시도 => 실패
fr 시도 => 실패
fr의 하위 요소 시도 => 실패
it_CH 시도 => 실패
it 시도 => 실패
it의 하위 요소 시도 => it_IT
it_IT 사용

앱이 프랑스어를 지원하지 않지만 사용자는 여전히 자신이 이해하는 언어를 볼 수 있습니다.

추가 언어 지원을 위한 앱 설계

Android는 앱 콘텐츠를 더 쉽게 현지화하고 사용자가 선호하는 언어로 참여를 유도할 수 있는 도구를 제공합니다. 다음 기법을 사용하여 확장 가능한 방식으로 다양한 언어 및 형식 지정 규칙을 수용할 수 있도록 앱을 구성하는 것이 좋습니다.

앱에서 지원하는 언어 지정

언어를 올바르게 결정하려면 모듈 수준 build.gradle 파일에서 resConfigs 속성을 사용하여 앱이 지원하는 언어를 지정합니다.

다음 코드 샘플은 resConfigs를 사용하여, 지원되는 언어를 표시하는 방법을 보여줍니다. 이 예에서는 앱이 영어와 스페인어를 모두 지원합니다.

Groovy

android {
    defaultConfig {
        ...
        resConfigs "en", "es"
    }
}

Kotlin

android {
    defaultConfig {
        ...
        resConfigs("en", "es")
    }
}
빌드 시스템이 앱과 그 종속 항목의 리소스를 병합하는 방식으로 인해, 사용자 언어 설정이 올바하게 수신되도록 지원되는 언어를 이러한 방식으로 지정해야 합니다.

LocaleList API

Android 7.0(API 수준 24)부터 Android에서는 앱이 사용자가 지정한 언어 목록을 직접 쿼리할 수 있도록 지원하는 LocaleList.getDefault() API를 제공합니다. 이 API를 사용하면 더욱 정교한 앱 동작 및 더욱 최적화된 콘텐츠 표시를 실현할 수 있습니다. 예를 들어, Google 검색에서는 사용자 설정에 따라 여러 언어로 결과를 표시할 수 있습니다. 브라우저 앱은 사용자가 이미 알고 있는 언어로 된 페이지의 경우 번역을 제공하지 않도록 차단할 수 있으며, 키보드 앱은 모든 적절한 레이아웃을 자동으로 사용 설정할 수 있습니다.

형식 지정 도구

Android 6.0(API 수준 23)까지 Android는 흔히 사용되는 많은 언어(en, es, ar, fr, ru)에 1~2개의 언어만 지원했습니다. 각 언어의 변형은 몇 개뿐이기 때문에 리소스 파일에 하드 코딩 문자열로 몇 개의 숫자와 날짜를 저장하는 것만으로 충분했습니다. 그러나 Android에서 지원되는 언어 세트가 확장되면서 단일 언어 내에서조차 날짜, 시간, 통화 및 유사 정보의 형식에 큰 차이가 생길 수 있게 되었습니다. 형식을 하드 코딩하면 최종 사용자에게 혼란을 줄 수 있습니다. 그러므로 Android 7.0 이상 버전을 개발할 때는 숫자와 날짜 문자열을 하드 코딩하는 대신 형식 지정 도구를 사용하세요.

예를 들어, Android 7.0 이상 버전은 27개의 아랍어 언어를 지원합니다. 이러한 언어는 대부분의 리소스를 공유할 수 있지만 어떤 언어는 ASCII 숫자를 선호하고 어떤 언어는 네이티브 숫자를 선호합니다. 예를 들어, '4자리 PIN 선택'과 같은 숫자 변수가 포함된 문장을 생성하려면 아래와 같이 형식 지정 도구를 사용합니다.

 format(locale, "Choose a %d-digit PIN", 4)