Android 앱별 언어 설정, Android 13부터 시스템 선택과 앱 내부 선택을 맞추는 법

무브랜드 안드로이드 스마트폰과 여러 색의 빈 언어 카드, 개발용 노트가 놓인 자연광 책상

AI를 활용하여 생성한 이미지입니다.

휴대전화 전체 언어는 영어로 두면서 특정 앱만 한국어로 쓰고 싶은 경우가 있어요. Android 13부터는 앱이 지원 언어를 선언하면 시스템 설정에서 앱별 언어를 고를 수 있습니다.[1][2] 이 기능은 단순히 메뉴 하나를 추가하는 작업이 아니에요. 앱 리소스 구성, 시스템 설정과 앱 내부 선택기의 동기화, Android 12 이하 호환성을 함께 설계해야 실제 배포에서 덜 흔들립니다.

앱별 언어는 리소스가 있어야 작동해요

Android 13의 앱별 언어 설정은 앱이 어떤 언어를 지원하는지 시스템에 알려주는 구조예요. 자동 설정을 쓰면 Android Gradle Plugin이 프로젝트 리소스를 바탕으로 LocaleConfig를 생성할 수 있고, 수동 방식에서는 res/xml/locale_config.xml과 manifest의 android:localeConfig를 직접 연결합니다.[1]

층 담당하는 일 빠뜨리면 생기는 문제
리소스 폴더 언어별 문자열·레이아웃 제공 선택한 언어가 일부 화면에만 적용돼요.
LocaleConfig 시스템에 지원 언어를 공개 앱 언어 메뉴에 앱이 안 보일 수 있어요.
AppCompat 또는 LocaleManager 앱 내부 선택과 시스템 설정 연결 앱 안과 설정 앱의 값이 엇갈려요.
백워드 호환 계층 Android 12 이하에서 선택값 저장 구형 기기에서 앱을 다시 열 때 언어가 돌아가요.

자동 LocaleConfig를 먼저 검토해요

새 프로젝트나 리소스 구성이 정돈된 프로젝트라면 자동 방식을 먼저 검토할 만해요. Android 공식 문서는 모듈 수준 Gradle의 androidResources 블록에서 generateLocaleConfig를 켜는 방법을 안내하고, 이 기능은 기본값이 꺼져 있다고 설명합니다.[1]

android {
    androidResources {
        generateLocaleConfig = true
    }
}

이 설정을 켠 뒤에는 빌드 결과의 manifest와 생성된 LocaleConfig를 확인해야 해요. 리소스가 없는 언어를 목록에 억지로 추가하면 시스템에는 선택지가 보이는데 실제 화면은 기본 언어로 남을 수 있습니다. 언어 코드와 폴더 이름도 같은 규칙으로 맞춰야 합니다.

수동 방식은 목록을 직접 통제할 때 써요

지역별로 노출할 언어를 다르게 하거나 서버 설정에 따라 목록을 바꾸어야 한다면 수동 구성이나 동적 LocaleConfig가 더 맞을 수 있어요. manifest에는 지원 언어 목록을 가리키는 항목을 넣고, XML에는 앱의 기본 fallback을 포함해야 합니다.[1]

<application
    android:localeConfig="@xml/locale_config" />

<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
    <locale android:name="ko" />
    <locale android:name="en" />
</locale-config>

기본 언어 리소스가 res/values/strings.xml에 있는데 LocaleConfig에는 다른 언어만 적는 식으로 구성하면 fallback이 예상과 달라질 수 있어요. 실제 설치본에서 앱 언어 목록과 기본 언어 복귀를 함께 확인하세요.

앱 내부 선택기는 시스템과 같은 API를 써요

앱 안에 언어 선택 메뉴가 이미 있다면 별도의 저장 로직을 계속 유지하기보다 AppCompatDelegate.setApplicationLocales를 사용하는 편이 안전합니다. Android 공식 문서는 이 API가 시스템 설정과 선택값을 맞출 수 있도록 안내하고, Android 13에서는 framework의 LocaleManager API도 사용할 수 있다고 설명합니다.[1][2]

val locales = LocaleListCompat.forLanguageTags("ko")
AppCompatDelegate.setApplicationLocales(locales)

이 호출 뒤에는 configuration change가 발생할 수 있어요. Compose 화면이나 Activity가 새 리소스를 다시 읽는지, 사용자가 선택한 뒤 화면이 중간 언어로 섞이지 않는지 확인하세요. 언어 변경 버튼이 단순히 문자열 몇 개만 바꾸는 방식이면 날짜·통화·접근성 문자열에서 누락이 생길 수 있습니다.

Android 12 이하를 별도로 테스트해요

자동 per-app language 기능은 Android 13(API 33) 이상을 대상으로 합니다.[1] 이전 버전까지 지원해야 한다면 AndroidX AppCompat의 호환 경로와 저장 방식을 점검해야 해요. 공식 문서는 Android 12 이하에서 앱이 선택한 언어를 저장하고 다음 실행 때 다시 전달하는 흐름을 설명합니다.[1]

테스트 매트릭스는 최소한 Android 13 이상과 Android 12 이하, 새 설치와 업데이트 설치, 시스템 언어 변경 전후, 앱 데이터 삭제 후를 나누는 게 좋아요. 앱을 업데이트하면서 지원 언어를 제거했을 때 사용자의 기존 locale 값이 남는지도 확인해야 합니다.

언어 리소스 누락을 찾는 방법

  1. 지원 언어 목록과 실제 res/values-* 폴더를 대조해요.
  2. Android 13 설정에서 앱 언어 메뉴가 보이는지 확인해요.
  3. 시스템 설정에서 언어를 바꾼 뒤 앱을 완전히 다시 열어요.
  4. 앱 내부 선택기에서 바꾼 값이 시스템 설정에도 반영되는지 봐요.
  5. Android 12 이하에서 재시작·업데이트 후 선택값이 유지되는지 확인해요.
  6. 번역되지 않은 문자열과 날짜·숫자 형식을 화면별로 기록해요.

다국어 앱에서 흔한 함정

지원 언어를 늘리는 것과 모든 기능을 번역하는 것은 다른 일입니다. 서버가 내려주는 문자열, 알림 채널 이름, 위젯, 백그라운드 작업의 알림 문구가 별도 리소스를 쓰는지 확인해야 해요. 앱 언어 설정만 정상이어도 서버의 콘텐츠 언어가 그대로일 수 있으므로 API의 언어 협상과 화면 리소스를 분리해서 봐야 합니다.[3]

또한 사용자가 앱 언어를 시스템 언어와 다르게 선택할 수 있다는 점을 전제로 날짜·통화·정렬을 구현해야 해요. 언어 목록에 한국어가 보인다는 이유만으로 모든 문자열이 자연스럽게 표시된다고 단정하지 마세요.

확인 목록

  • compileSdk와 Android 13 이상 동작 조건을 확인해요.
  • 자동 또는 수동 LocaleConfig 중 하나를 명확히 선택해요.
  • 시스템 설정과 앱 내부 선택기에 같은 locale API를 사용해요.
  • Android 12 이하의 저장·복원 경로를 별도 테스트해요.
  • 새 설치·업데이트·언어 제거 상황을 모두 확인해요.

앱 자체의 언어를 바꾸기 전에 기기 설정과 백업 범위를 정리하려면 Android Google One 백업 글의 계정·복원 조건도 함께 확인해 보세요.

Sources

  1. Per-app language preferences | Android Developers
  2. Features and APIs Overview | Android Developers
  3. Language and locale resolution overview | Android Developers

함께 읽을 글