on
안드로이드 시스템 언어 변경 코드
안드로이드 시스템 언어 변경 코드
- 안드로이드 코드 내에서 언어를 변경하고 싶을 때가 있습니다.
values-ko, values-en 과 같이 각 언어별 strings.xml 파일을 준비해둔 상태에서,
시스템 Locale을 변경하면 런타임에서 언어를 변경할수 있습니다.
예를들면, 처음에는 한국어 버전으로 앱을 사용하다가, 버튼 하나만 눌러서 영어 버전 앱을 사용하는 것입니다.
- 원리는 내버려두고, 먼저 필요 오브젝트를 먼저 만듭니다.
LocaleHelper 라는 클래스를 만들고,
package com.example.androidkotlintemplate.util import android.content.ContextWrapper import android.os.Build import android.annotation.TargetApi import android.content.Context import android.content.res.Configuration import java.util.* class LocaleHelper(base: Context?) : ContextWrapper(base) { companion object { var locale: Locale? = null fun wrap(context: Context?): Context? { if (null == context) { return context } else { if (null == locale) { return context } else { var innerContext = context val config = innerContext.resources.configuration Locale.setDefault(locale!!) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { setSystemLocale(config, locale) } else { setSystemLocaleLegacy(config, locale) } config.setLayoutDirection(locale) innerContext = innerContext.createConfigurationContext(config) return LocaleHelper(innerContext) } } } private fun setSystemLocaleLegacy(config: Configuration, locale: Locale?) { config.locale = locale } @TargetApi(Build.VERSION_CODES.N) private fun setSystemLocale(config: Configuration, locale: Locale?) { config.setLocale(locale) } } }
위와 같이 작성합니다.
그리고 아무 액티비티에서나 언어 변경용 버튼을 만들어서 클릭 리스너를 붙이고,
LocaleHelper.locale = Locale("ko") recreate()
를 적어줍시다.
위가 바로 시스템 언어를 바꾸는 코드입니다.
하지만 이것으로 끝이 아닙니다.
override fun attachBaseContext(newBase: Context?) { super.attachBaseContext(LocaleHelper.wrap(newBase)) }
액티비티에 위와 같은 메소드를 오버라이딩해주면 됩니다.
구현은 끝입니다.
버튼을 누르면 언어 설정이 바뀌어서, 앱이 켜진 상태에서 어느 액티비티를 가던지 위에서 설정한 언어를 사용할 것입니다.
- 해석
저도 아직 자세히 파고들지 않았기에 대략 코드 흐름만 보자면,
attachBaseContext 가 핵심입니다.
위에서 LocaleHelper로 context를 새로운 Locale 정보로 wrapping 해주고, 이것을 attachBaseContext 메소드에 넣어주는 것입니다.
attachBaseContext 메소드가 발동되는 시점은, 액티비티가 시작된 시점인데, 처음에는 newBase가 null 로 들어가서 기본 설정으로 돌아가게 되지만, recreate()로 다시 발동시키고, 새로운 Locale 로 만든 LocaleHelper의 래핑된 context 가 들어가서 새로운 언어 설정의 context 가 실행되는 것입니다.
from http://wiserloner.tistory.com/1494 by ccl(A) rewrite - 2021-12-28 21:27:07