page.title=언어 및 로케일 page.tags=androidn page.image=images/cards/card-nyc_2x.jpg @jd:body
Android N에서는 다국어 사용자를 위한 지원이 개선되었으므로 이러한 사용자가 이제 설정에서 여러 로케일을 선택할 수 있습니다. Android N은 지원되는 로케일 수를 대폭 확대하고 시스템이 리소스를 결정하는 방식을 변경하여 이 기능을 제공합니다. 새로 도입된 리소스 결정 방법은 더욱 안정적이고 기존 APK와 호환되도록 설계되어 있지만 예상치 못한 동작이 없는지 신중히 살펴봐야 합니다. 예를 들어, 앱이 예상 언어로 기본 설정되어 있는지 테스트해야 합니다. 또한, 앱이 여러 언어를 지원한다면 원하는 대로 작동하는지 확인해야 합니다. 마지막으로 앱이 지원하도록 명시하지 않은 언어를 무리 없이 처리하는지 확인해야 합니다.
이 문서에서는 Android N 이전의 리소스 결정 전략을 설명한 뒤에, Android N의 개선된 리소스 결정 전략을 설명합니다. 마지막으로 더 많은 다국어 사용자를 지원하기 위해 확장된 로케일을 활용하는 방법을 설명합니다.
Android N 이전의 Android에서는 앱과 시스템 로케일을 매칭하지 못하는 경우가 가끔 있었습니다.
예를 들어, 다음과 같은 상황이라고 가정해 봅시다.
Java 코드가 문자열을 참조할 때 앱에서 {@code es_ES} 아래에 스페인어 리소스를 현지화했더라도, 시스템은 기본({@code en_US}) 리소스 파일로부터 문자열을 로드합니다. 그 이유는 시스템이 정확한 일치 항목을 찾을 수 없을 때 해당 로케일에서 국가 코드를 제거하여 리소스를 계속 찾기 때문입니다. 마지막으로, 일치 항목을 찾지 못한 경우 시스템은 기본값({@code en_US})으로 다시 돌아갑니다.
또한, 앱에서 전혀 지원하지 않는 언어(예: 프랑스어)를 사용자가 선택하면 시스템은 기본값을 {@code en_US}로 설정합니다. 예를 들면 다음과 같습니다.
사용자 설정 | 앱 리소스 | 리소스 결정 |
---|---|---|
fr_CH |
기본값(en) de_DE es_ES fr_FR it_IT |
fr_CH 시도 => 실패 fr 시도 => 실패 기본값(en) 사용 |
이 예시에서 시스템은 사용자가 영어를 이해할 수 있는지 여부와 관계없이 영어 문자열을 표시합니다. 현재 이러한 동작이 상당히 일반적입니다. Android N은 이런 결과가 나타나는 빈도를 상당히 낮추었습니다.
Android N은 더욱 안정적인 리소스 결정을 사용하고
자동으로 더욱 알맞은 대안책을 찾습니다. 그러나 결정 속도를 높이고
관리성을 개선하려면 가장 일반적인 상위 방언에 리소스를 저장해야 합니다.
예를 들어, 전에 {@code es-US} 디렉터리에
스페인어 리소스를 저장했다면 남미 스페인어가 있는 {@code es-419} 디렉터리로 이동합니다.
마찬가지로 {@code en-GB}란 폴더에 리소스 문자열이 있다면
폴더 이름을 {@code en-001}(국제 영어)로 변경합니다.
en-GB
문자열의 가장 일반적인 상위 리소스는 {@code en-001}이기 때문입니다.
다음은 이러한 방법이
성능과 리소스 결정의 신뢰성을 개선하는 이유를 설명하는 예시입니다.
Android N의 경우, 표 1의 사례는 다르게 결정됩니다.
사용자 설정 | 앱 리소스 | 리소스 결정 |
---|---|---|
|
기본값(en) de_DE es_ES fr_FR it_IT |
fr_CH 시도 => 실패 fr 시도 => 실패 Fr의 하위 리소스 시도 => fr_FR fr_FR 사용 |
이제 사용자는 영어 대신 프랑스어 리소스를 보게 됩니다. 이 예시에서는 Android N에서 프랑스어 문자열을 {@code fr_FR} 이 아니라 {@code fr}에 저장해야 하는 이유를 알 수 있습니다. 이러한 동작을 통해 가장 가까운 상위 방언과 일치시켜서 더욱 빠르고 예측 가능하게 결정합니다.
Android는 이러한 결정 논리를 개선했을 뿐만 아니라 선택 가능한 언어를 더 많이 제공합니다. 위의 예시에 이탈리아어가 추가 사용자 언어로 지정되었지만 앱에서 프랑스어를 지정하지 않는 경우를 적용해 보겠습니다.
사용자 설정 | 앱 리소스 | 리소스 결정 |
---|---|---|
|
기본값(en) de_DE es_ES it_IT |
fr_CH 시도 => 실패 fr 시도 => 실패 fr의 하위 리소스 시도 => 실패 it_CH 시도 => 실패 it 시도 => 실패 it의 하위 리소스 시도 => it_IT it_IT 사용 |
앱이 프랑스어를 지원하지 않지만 사용자는 여전히 자신이 이해하는 언어를 볼 수 있습니다.
Android N에서는 앱이 사용자가 지정한 언어 목록을 직접 쿼리할 수 있는 새로운 API {@code LocaleList.getDefault()}가 추가되었습니다. 이 API는 앱 동작을 더욱 정교하게 해주고 콘텐츠 표시를 더 최적화해 줍니다. 예를 들어, 검색 시 사용자 설정에 따라 여러 언어로 결과를 표시할 수 있습니다. 브라우저 앱은 사용자가 이미 알고 있는 언어로 번역 페이지를 제공하지 않고, 키보드 앱은 모든 적절한 레이아웃을 자동 활성화할 수 있습니다.
Android 6.0(API 레벨 23)까지 Android는 많은 공통 언어(en, es, ar, fr, ru)에 대해 1~2개의 로케일만 지원했습니다. 각 언어의 변종은 몇 개뿐이기 때문에 리소스 파일에 하드코딩된 문자열로 몇 개의 숫자와 날짜를 저장하는 것만으로 충분했습니다. 그러나 Android에서 지원되는 로케일 세트가 확장되면서 단일 로케일 내에서조차 날짜, 시간, 통화 및 유사 정보에 큰 차이가 생길 수 있게 되었습니다. 형식 하드코딩은 최종 사용자에게 혼란을 줄 수 있습니다. 그러므로 Android N을 개발할 때는 숫자와 날짜 문자열을 하드코딩하는 대신 포맷터를 사용하도록 하세요.
가장 좋은 예시로는 아랍어가 있습니다. Android N에서 아랍어 지원이 {@code ar_EG} 1개에서 27개 아랍어 로케일로 확장되었습니다. 이러한 로케일은 대부분의 리소스를 공유할 수 있지만 어떤 로케일은 ASCII 숫자를 선호하고 어떤 로케일은 네이티브 숫자를 선호합니다. 예를 들어, "4자리 PIN 선택"과 같은 숫자 변수가 포함된 문장을 생성하려면 아래와 같이 포맷터를 사용합니다.
format(locale, "Choose a %d-digit PIN", 4)