비콘앱 탄생의 이유 중 하나이다. 외국인들이 한국 관광을 왔을 때 발생한 재난에 대해서 그들이 이해할 수 있는 언어로 재난 상황을 설명해줄 수 있어야할 것이다.
이를 위해서 UI들의 텍스트들이 다국어를 지원해야할 것이며, 추가로 발송되는 알림이 번역되어 발송되어야 할 것이다.
코틀린에서 지원하는 Translations Editor를 이용해서 각 텍스트들을 각각 번역해주었다. 우리 UI화면들이 그렇게 많지 않기 때문에 직접 번역을 해서 넣어놓았다. 그게 더 마음이 편하기도 하고
문제는 설정 > 언어 > 원하는 언어를 선택했을 때 변경한 언어로 UI 전체가 다 변경되어야 한다. 이런 경우에 어떤 식으로 구현을 해야지 좋을 지 감이 잡히지 않았다.
애초에 로케일이라는 변수를 통해서 기본적으로 앱에 설정된 언어 설정을 불러오는데 이러한 변경한 내역을 저장할 수 있어야 하고 이에 따른 UI도 변경되서 보여줘야했다.
우선적으로 Locale을 저장하는 방법은 아래 코드 형식으로 진행했다.
private fun setLocale(lang: String) {
Log.d("언어 변경", "setLocale")
val locale = Locale(lang)
Locale.setDefault(locale)
val config = Configuration()
config.setLocale(locale)
baseContext.resources.updateConfiguration(config, baseContext.resources.displayMetrics)
val editor = getSharedPreferences("Settings", Context.MODE_PRIVATE).edit()
editor.putString("My_Lang", lang)
editor.apply()
}
lang에 값은 사용자가 선택한 ko, en, ja 등이 되며
Locale의 디폴트 값을 변경해준다.
config쪽도 설정을 해주고
getSharedPreferences을 통해 설정을 저장할 수 있도록 했다.
하지만 이렇게 해도 앱 전체가 변경되지는 않는다.
그래서 이러한 변경 자체를 한 번에 잘 적용할 수 있도록 하는 방법이 바로..
BaseActivity였다.
BaseActivity를 통해서 모든 액티비티들은 처음 생성 시에 setAppLocale이 되고 추가적으로 원하는 경우 액티비티 생명주기에 따라 또 적용을 해주면 된다!
open class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setAppLocale()
}
fun setAppLocale() {
val sharedPreferences = getSharedPreferences("Settings", Context.MODE_PRIVATE)
val language = sharedPreferences.getString("My_Lang", "")
if (!language.isNullOrBlank()) {
val locale = Locale(language)
Locale.setDefault(locale)
val config = Configuration()
config.setLocale(locale)
resources.updateConfiguration(config, resources.displayMetrics)
}
}
}
최대한 프론트의 경량화를 위해서 서버에서 받은 것을 앱에서 번역하는 것을 지양했지만 안전장치 느낌으로 일단 앱에서 정상적으로 번역을 구현하고 그 후에 서버에서 구현을 완료하고 옮기는 것으로 계획을 변경했다.
이는 아마 네이버 파파고 API를 사용해서 적용할 예정이다.
fcm에서 정말 엄청 고통을 받았다..
아무리 블로그를 뒤져보고 영어로 서칭을 해보아도 fcm이 1~5분 사이 지연되서 도착하는 경우는 찾아보기 힘들었다..
도데체 왜 이럴까..1주 내내 이걸로 고통 받고 팀원과의 회의 당일에야 해결 방법이 보였다.
어김없이 messaging을 통해 TEST를 하고있는데
테스트 메시지 전송이라는 부분이 보였다.
혹시나 해서 이걸 통해 토큰을 찍어서 전송을 해보니 2~4초? 거의 2초만에 알림이 도착했다..
권한 바꾸고, 메시지의 우선순위 바꾸고..등의 뻘짓 아닌 뻘짓을 했는데 토큰을 통해서 보내는 경우 정상 작동이니 백엔드 쪽에서 토큰을 통해 알림을 보내주시면 빠르게 받아서 처리할 수 있을 것이다!