Android 지역화

이 문서에서는 Android SDK의 지역화 기능과 Xamarin을 사용하여 액세스하는 방법을 소개합니다.

Android 플랫폼 기능

이 섹션에서는 Android의 기본 지역화 기능에 대해 설명합니다. 특정 코드 및 예제를 보려면 다음 섹션 으로 건너뜁니다.

로캘

사용자는 설정 > 언어 및 입력에서 해당 언어를 선택합니다. 이 선택 영역은 표시되는 언어와 사용된 국가별 설정(예: 날짜 및 숫자 서식 지정)을 모두 제어합니다.

현재 로캘은 현재 컨텍스트의 Resources다음을 통해 쿼리할 수 있습니다.

var lang = Resources.Configuration.Locale; // eg. "es_ES"

이 값은 밑줄로 구분된 언어 코드와 로캘 코드를 모두 포함하는 로캘 식별자가 됩니다. 참고로, StackOverflow통한 Java 로캘 및 Android 지원 로캘 목록은 다음과 같습니다.

일반적인 예는 다음과 같습니다.

  • en_US영어(미국)
  • es_ES 스페인어(스페인)
  • ja_JP 일본어(일본)
  • zh_CN 중국어(중국)
  • zh_TW 중국어(대만)
  • pt_PT 포르투갈어(포르투갈)
  • pt_BR 포르투갈어(브라질)

LOCALE_CHANGED

Android는 android.intent.action.LOCALE_CHANGED 사용자가 언어 선택을 변경할 때 생성합니다.

활동은 다음과 같이 활동의 특성을 설정 android:configChanges 하여 이 작업을 처리하도록 선택할 수 있습니다.

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges = ConfigChanges.Locale | ConfigChanges.ScreenSize | ConfigChanges.Orientation)]

Android의 국제화 기본 사항

Android의 지역화 전략에는 다음과 같은 주요 부분이 있습니다.

  • 지역화된 문자열, 이미지 및 기타 리소스를 포함할 리소스 폴더입니다.

  • GetText 메서드: 코드에서 지역화된 문자열을 검색하는 데 사용됩니다.

  • @string/id AXML 파일에서 지역화된 문자열을 레이아웃에 자동으로 배치합니다.

리소스 폴더

Android 애플리케이션은 리소스 폴더에서 다음과 같은 대부분의 콘텐츠를 관리합니다.

  • layout - AXML 레이아웃 파일을 포함합니다.
  • drawable - 이미지 및 기타 그리기 가능한 리소스를 포함합니다.
  • values - 문자열을 포함합니다.
  • raw - 데이터 파일을 포함합니다.

대부분의 개발자는 드로어블 디렉터리에서 dpi 접미사를 사용하여 여러 버전의 이미지를 제공하므로 Android가 각 디바이스에 대해 올바른 버전을 선택할 수 있습니다. 동일한 메커니즘은 리소스 디렉터리에 언어 및 문화권 식별자를 접미사로 추가하여 여러 언어 번역을 제공하는 데 사용됩니다.

Screenshot of Resources/drawable and Resources/values folders for multiple cultural identifiers

참고 항목

두 문자와 같은 es 최상위 언어를 지정해야 하지만 전체 로캘을 지정할 때 디렉터리 이름 형식에는 pt-rBR 또는 zh-rCN과 같은 두 부분을 구분하기 위해 대시 및 소문자 r이 필요합니다. 밑줄(예 pt_BR: )이 있는 코드에서 반환된 값과 비교합니다. 둘 다 .NET CultureInfo 클래스에서 사용하는 값과 다르며 대시만 있습니다(예: pt-BR). Xamarin 플랫폼에서 작업할 때는 이러한 차이점을 염두에 두어야 합니다.

Strings.xml 파일 형식

지역화된 디렉터리(예: values-es 또는 values-pt-rBR)에는 해당 로캘에 대한 번역된 텍스트를 포함하는 Strings.xml 파일이 포함되어야 합니다.

변환 가능한 각 문자열은 리소스 ID가 특성으로 name 지정되고 변환된 문자열이 값으로 지정된 XML 요소입니다.

<string name="app_name">TaskyL10n</string>

일반 XML 규칙에 따라 이스케이프해야 하며 name 유효한 Android 리소스 ID(공백 또는 대시 없음)여야 합니다. 다음은 예제에 대한 기본(영어) 문자열 파일의 예입니다.

values/Strings.xml

<resources>
    <string name="app_name">TaskyL10n</string>
    <string name="taskadd">Add Task</string>
    <string name="taskname">Name</string>
    <string name="tasknotes">Notes</string>
    <string name="taskdone">Done</string>
    <string name="taskcancel">Cancel</string>
</resources>

스페인어 디렉터리 values-es 에는 번역이 포함된 이름이 같은 파일(Strings.xml)이 포함되어 있습니다.

values-es/Strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">TaskyLeon</string>
    <string name="taskadd">agregar tarea</string>
    <string name="taskname">Nombre</string>
    <string name="tasknotes">Notas</string>
    <string name="taskdone">Completo</string>
    <string name="taskcancel">Cancelar</string>
</resources>

Screenshot of multiple values folders, each containing a Strings.xml file

문자열 파일을 설정하면 변환된 값을 레이아웃과 코드 모두에서 참조할 수 있습니다.

AXML 레이아웃 파일

레이아웃 파일에서 지역화된 문자열을 참조하려면 구문을 사용합니다 @string/id . 샘플의 이 XML 코드 조각은 지역화된 리소스 ID로 설정되는 속성을 보여 text 줍니다(일부 다른 특성은 생략됨).

<TextView
    android:id="@+id/NameLabel"
    android:text="@string/taskname"
    ... />
<CheckBox
    android:id="@+id/chkDone"
    android:text="@string/taskdone"
    ... />

GetText 메서드

코드에서 번역된 문자열을 검색하려면 메서드를 GetText 사용하고 리소스 ID를 전달합니다.

var cancelText = Resources.GetText (Resource.String.taskcancel);

수량 문자열

Android 문자열 리소스를 사용하면 번역자가 다음과 같은 다양한 수량에 대해 서로 다른 번역을 제공할 수 있는 수량 문자열을 만들 수도 있습니다.

  • "남은 작업은 1가지입니다."
  • "아직 해야 할 작업이 2개 있습니다."

(제네릭 "n 작업이 남아 있습니다"가 아닌).

Strings.xml

<plurals name="numberOfTasks">
   <!--
      As a developer, you should always supply "one" and "other"
      strings. Your translators will know which strings are actually
      needed for their language.
    -->
   <item quantity="one">There is %d task left.</item>
   <item quantity="other">There are %d tasks still to do.</item>
 </plurals>

전체 문자열을 렌더링하려면 메서드를 GetQuantityString 사용하여 표시할 리소스 ID와 값을 전달합니다(두 번 전달됨). 두 번째 매개 변수는 Android에서 사용할 문자열을 결정하는 quantity 데 사용되며, 세 번째 매개 변수는 실제로 문자열로 대체되는 값입니다(둘 다 필요).

var translated = Resources.GetQuantityString (
                    Resource.Plurals.numberOfTasks, taskcount, taskcount);`

유효한 quantity 스위치는 다음과 같습니다.

  • zero
  • 1
  • two
  • few
  • many
  • 기타

Android 문서에서 자세히 설명합니다. 지정된 언어에 '특수' 처리가 필요하지 않은 경우 해당 quantity 문자열은 무시됩니다(예: 영어만 사용하고 oneother, 문자열을 지정해 zero 도 효과가 없으며 사용되지 않음).

이미지

지역화된 이미지는 문자열 파일과 동일한 규칙을 따릅니다. 애플리케이션에서 참조되는 모든 이미지는 대체가 되도록 그리기 가능한 디렉터리에 배치해야 합니다.

그런 다음 로캘별 이미지를 drawable-es 또는 drawable-ja와 같은 정규화된 드로블 폴더에 배치해야 합니다(dpi 지정자도 추가할 수 있습니다).

이 스크린샷에서는 4개의 이미지가 그리기 가능한 디렉터리에 저장되지만 flag.png 하나만 다른 디렉터리에 지역화된 복사본이 있습니다.

Screenshot of multiple drawable folders, each containing one or more localized .png files

기타 리소스 종류

레이아웃, 애니메이션 및 원시 파일을 비롯한 다른 유형의 대체 언어별 리소스를 제공할 수도 있습니다. 즉, 하나 이상의 대상 언어에 대해 특정 화면 레이아웃을 제공할 수 있습니다. 예를 들어 매우 긴 텍스트 레이블을 허용하는 독일어용 레이아웃을 만들 수 있습니다.

Android 4.2는 애플리케이션 설정을 android:supportsRtl="true"설정하는 경우 RTL(오른쪽에서 왼쪽) 언어에 대한 지원을 도입했습니다. 리소스 한정 "ldrtl" 자는 RTL 표시를 위해 설계된 사용자 지정 레이아웃을 포함하도록 디렉터리 이름에 포함될 수 있습니다.

리소스 디렉터리 명명 및 대체에 대한 자세한 내용은 대체 리소스를 제공하는 Android 문서를 참조하세요.

앱 이름

애플리케이션 이름은 작업에 대한 in을 @string/id 사용하여 쉽게 지역화할 수 MainLauncher 있습니다.

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges =  ConfigChanges.Orientation | ConfigChanges.Locale)]

RTL(오른쪽에서 왼쪽) 언어

Android 4.2 이상에서는 네이티브 RTL 지원 블로그에 자세히 설명된 RTL 레이아웃에 대한 전체 지원을 제공합니다.

Android 4.2(API 수준 17) 이상을 사용하는 경우 맞춤 값은 (예android:paddingStart: ) 대신 leftright 에 지정할 startend 수 있습니다. RTL 판독기를 위해 조정되는 화면을 빌드하는 데 도움이 되는 새로운 API LayoutDirectionTextDirectionTextAlignment 도 있습니다.

다음 스크린샷은 아랍어로 지역화된 Tasky 샘플을 보여줍니다.

Screenshot of Tasky app in Arabic

다음 스크린샷은 히브리어로 지역화된 Tasky 샘플을 보여줍니다.

Screenshot of Tasky app in Hebrew

RTL 텍스트는 LTR 텍스트와 동일한 방식으로 Strings.xml 파일을 사용하여 지역화됩니다.

테스팅

기본 로캘을 철저히 테스트해야 합니다. 어떤 이유로 인해 기본 리소스를 로드할 수 없는 경우(즉, 누락된 경우) 애플리케이션이 충돌합니다.

에뮬레이터 테스트

ADB 셸을 사용하여 에뮬레이터를 특정 로캘로 설정하는 방법에 대한 지침은 Android Emulator 섹션에서 Google 테스트를 참조하세요.

adb shell setprop persist.sys.locale fr-CA;stop;sleep 5;start

디바이스 테스트

디바이스에서 테스트하려면 설정 앱에서 언어를 변경합니다.

언어를 원래 설정으로 되돌리기 수 있도록 메뉴 항목의 아이콘과 위치를 기록해 둡니다.

요약

이 문서에서는 기본 제공 리소스 처리를 사용하여 Android 애플리케이션을 지역화하는 기본 사항을 설명합니다. 이 플랫폼 간 가이드에서는 iOS, Android 및 플랫폼 간(Xamarin.Forms 포함) 앱용 i18n 및 L10n에 대해 자세히 알아볼 수 있습니다.