Study/Android

앱 현지화, 개별 앱 언어 변경 설정

hegunhee 2025. 5. 4. 17:29

저는 현재 하루를 기록하고 관리하는 Routiner라는 안드로이드 앱을 만들고 있습니다.

기록알람, 반복 기록 저장과 같은 기능들을 추가하고 있습니다.

 

최근 들어서 앱에서 다른 언어도 지원하면 어떨까라는 생각을 하게 되었습니다.
그렇게 된다면 한국 사용자뿐만 아니라 미국, 일본, 여러 나라에서도 저의 앱을 사용할 수 있어서 좋을 것 같다고 생각했습니다.

 


안드로이드의 경우 어떻게 적합한 리소스를 찾을까?

https://developer.android.com/guide/topics/resources/providing-resources?hl=ko#BestMatch

 

앱 리소스 개요  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 앱 리소스 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 리소스는 코드에서 사용하는 추가 파

developer.android.com

 

보통 앱을 만들면 정적 콘텐츠나 추가 파일들을 res/ 디렉터리 아래에 관리합니다.

ex) drawable, values, color

 

위 패키지들은 뒤에 한정자(qualifier)를 정의할 수 있습니다. (<resource-name>-<qualifier>)

ex) values-ko, values-en

 

안드로이드 앱은 구성될 때 여러 개의 qualifier가 있을 경우 다음과 같은 원칙으로 제일 적합한 디렉터리를 찾습니다.

 

먼저 예시를 들기 위해 다음과 같은 디렉터리가 있다고 가정하고 살펴보겠습니다.

drawable/

drawable-en/

drawable-fr/

drawable-fr-port/

 

현재 기기 구성은 다음과 같습니다.

언어: fr

화면 방향 : port

 

  1. 기기 구성에 모순되는 설정을 삭제한다.

  2. 현재 구성중 우선순위가 높은 한정자를 선택합니다. MCC(모바일 국가 코드)부터 시작합니다.

  3.  리소스 디렉터리 중 이 한정자를 포함하고 있는 것이 있나요?
    - 없을경우 다음 한정자를 살펴봅니다.
    - 있을 경우 4번으로 진행합니다.

  4. 이 한정자를 포함하지 않는 디렉터리는 삭제합니다.
    drawable-en/ 디렉터리는 삭제됩니다

  5. 마지막 한개의 디렉터리가 남을 때까지 2~4번 과정을 반복합니다.(이 예시에서 다음은 port 설정입니다.)
    즉 port 한정자의 유무에 따라 drawable-fr/는 삭제됩니다.

즉 마지막에 drawable-fr-port/ 디렉터리만 남게 되고 사용됩니다.

 

물론 values/ 의 경우 화면 방향 설정은 할 수 없지만 이런 식으로 앱이 구성될 때 디렉터리를 설정합니다.

모순되는 설정을 삭제 -> 우선순위가 높은 한정자를 선택 -> 한정자를 포함하고 있는 디렉터리 검색 -> 아닌 것은 삭제
-> 디렉터리가 하나가 남을 때까지 한정자 선택부터 반복


기본 디렉터리는 존재해야 하는걸까?

만약 values/ 기본 디렉터리가 존재하지 않는다면 앱이 해당 string을 읽어 들일 때 기본값을 찾지 못하므로 앱이 죽게 됩니다.

그러므로 만약 한국만 지원하는 앱이라고 values-ko/ 만 정의해 놓으면 안 됩니다.

그리고 기본 디렉터리가 존재하지 않는다면 IDE에서 strings.xml에 빨간 줄을 띄워줍니다.

 

그러므로 기본 values/ 디렉터리를 정의하고 추가적인 언어를 정의하면 됩니다.

 

이것은 안드로이드 공식 문서에서도 강조하는 부분입니다.

https://developer.android.com/guide/topics/resources/localization?hl=ko#strategies

 

앱 현지화  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 앱 현지화 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android는 다양한 지역의 많은 기기에서 실행

developer.android.com

 

그리고 앱이 현재 설정이 무엇인지도 확인 가능합니다.

val primaryLocale: Locale = context.resources.configuration.locales[0]
val locale: String = primaryLocale.displayName

영어를 적용해 보자

그러면 이제 영어에 대한 언어 설정을 해보도록 하겠습니다.

values-en/ 디렉터리를 만드는 방법은 두 가지가 있습니다.

1. 직접 디렉터리를 추가

   res 디렉터리를 우클릭 후 New -> Android Resource File -> Avaliable Qualifier


   언어는 물론 특정 지역까지 선택 가능합니다. 이럴 경우 values-en 디렉터리가 생기며 strings.xml을 만들어서 사용하면 됩니다.

2. 에디터를 사용

   strings.xml로 이동하면 상단의 open editor를 통해 에디터로 들어갈 수 있습니다.

좌측 상단에 있는 지구본 모양을 클릭해서 언어를 추가할 수 있습니다.
언어를 추가하면 자동으로 values-<qualifier> 디렉터리가 생성되며 strings.xml 파일도 생성됩니다.

한눈에 볼 수 있으며 기존의 설정값을 보고 반영할 수 있어서 에디터 방식이 더 쉬워 보입니다.

 

하지만 이스케이프 문자를 사용할 때는 직접 strings.xml에 접근해서 사용해야 합니다.

 


앱 언어 설정

현재 기기의 정보를 기반으로 디렉터리를 지정하는 것이 아닌 앱 기반으로 설정할 수도 있습니다.

이럴 경우 메니페스트에 현재 사용 가능한 언어를 알려줘야 합니다.

앱 모듈의 res/xml에 locales_config를 추가해서 현재 사용 가능한 언어의 코드를 작성해야 합니다.

 

그리고 앱 모듈의 매니페스토 설정에 localeConfig를 추가해줘야 합니다.

 

이럴 경우 settings -> language -> app language에서 해당 앱을 확인 가능하며 언어를 변경할 수 있습니다.

 

긴 글 읽어주셔서 감사합니다.

해당 프로젝트의 깃헙 주소 :  https://github.com/hegunhee/Routiner

 

GitHub - hegunhee/Routiner

Contribute to hegunhee/Routiner development by creating an account on GitHub.

github.com

 

해당 글을 작성할 때 참고한 공식 문서입니다.

https://developer.android.com/guide/topics/resources/localization

 

앱 현지화  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 앱 현지화 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android는 다양한 지역의 많은 기기에서 실행

developer.android.com