Apply
home

[알라미 안드로이드] DayOfWeek 한 글자 다국어 관련 처리

해당 글은 Delightroom Town Hall Meeting 때 Notion에 정리해서 발표한 내용을 Medium에 옮겨온 글입니다.

요약

안드로이드 리디자인 이후 요일을 한 글자로 표기하기 시작했는데 문제가 발생하여 특정 언어에서 요일 선택이 힘들었다.
4.27.50-beta 부터 해결되어 나가는 중이다.
strings.xml을 활용한 노가다를 했으면 더 빠르고 정확하게 끝났을 것이라는 미련이 남아있다.

배경

안드로이드 Editor 화면이 기존에는 iOS처럼 팝업을 띄워 리스트를 보여주는 형태였으나, 리디자인이 끝나면서 요일을 한 글자로 표시하기 시작했다.

사건의 시작

이번에도 등장하는 Jayde
리디자인되어 좋아졌다는 내용과 함께 스페인어에서 화요일은 K로 표기되면 더 좋다는 유저의 피드백이들어왔다.
하지만 요일 표기 방식은 Library에서 제공해주는 것을 활용하고 있었다.
Library는 JakeWharton님이 만드신 ThreeTen Android Backport 라는 것을 사용하고 있었다.
여기서 ThreeTenABP는 Java8 에서 사용할 수 있는 java.time.* 을 사용하기 위한 backport library로, Android Gradle plugin 4.0이 나오기 이전에는 java.time.* 을 android api 버전이 낮은 (25이하)에서도 사용할 수 있도록 해주는 용도로 사용 중이었다.
OS 시계 앱(구글)도 D L M M J V S 로 표시한다!
위에서 들어온 안드로이드 개선 피드백은 Library가 개선되면 해결되는 문제이며, 실제 사용에는 큰 문제가 없기에 그냥 유지하기로 하였다.

하지만,

탐정 같은 Chan이 중국어에 이상이 있음을 발견하였다.
(-미션 알람 앱이니까-) 요일을 설정하는 방식부터 미션
이때부터 Library 탓을 하진 못하고 이제 직접 문제를 해결해야 하는 시점이 되었다. -JakeWharton 님 저에게 왜 이런 시련을…-
기존에는 DayOfWeek.MONDAY.getDisplayName(TextStyle.NARROW_STANDALONE, Locale.getDefault()) 을 이용해서 값을 출력하고 있었다.
여기서 TextStyle로는 넓은 의미로 FULL(전체), SHORT(일반적으로 3글자), NARROW(최소단위) 를 사용할 수 있다. ex) Full - Monday, Short - Mon., Narrow - M
해결을 위한 검색 과정 중 Library Issue 에 누군가가 이미 Report를 해둔 것을 발견하였고 해당 내용 끝자락에 코드가 반영되어 Issue가 close처리되어 있는 것을 확인했다.
기쁜 마음으로 최신 버전으로 올리면 모든 문제가 ‘짜잔’하고 해결될 것으로 기대했다.
하지만, 코드를 직접 확인해본 결과 그냥 단순히 요일의 전체 단어에서 substring(0, 1) 으로 첫 글자만 사용하고 중국어일 경우만 예외로 동작하고 있었다.
이 방법을 포기하고 다른 방법을 알아보던 도중 SHORT를 이용한 3자리는 의미를 표시하는데 아무런 문제가 없음을 확인했다. 다만, 문제가 있다면 언어별로 표시 길이가 조금씩 다르다는 점이다.
하지만 의미를 파악하는데는 문제가 없음으로 Design Group의 Bom을 설득시켜 3글자로 변경하고 디자인만 조금 개선해서 내보내기로 급선회했다. (-개발적으로 조사하다가 지친 것은 절대 아니다-)
그래서 Bom을 열심히 설득해서 요일 버튼의 여백을 조금 넓혀서 내보내는 것을 고려했으나 여기서 2가지 반박하기 힘든 주장이 2개가 들어온다.
3글자의 주장은 어느정도 포기하는 방향으로 정리하며 어떻게 하면 해결할 수 있을까 가장 간단한 방법을 떠올리다가 strings.xml을 활용하는 방안을 떠올리게 된다.
R.string.monday 같은 형태로 strings.xml을 활용하여 요일을 관리하면 모든 번역이 깔끔하게 처리가 되고 알라미에서 원하는 방향으로 string을 custom할 수 있다는 장점이 있으나, 현재 번역이나가는 모든 언어를 최종적으로 지원해야한다는 점에서 노가다가 필요했다.
그래서 Design Group, POM Group 들과 3글자로 나갈지, 6개국(영어, 한국어, 스페인어, 중국어, 일본어)를 우선 지원하고 순차적으로 추가해나갈지, 처음부터 노가다 뽷해서 전부 다 내보낼지 확정을 할 필요가 있었다.
수요일 퇴근 시간대에 목요일에 논의하기로 정하고 회의 전까지 기술적으로 다른 방법을 찾는 것을 고려하기로 했다.

Android Studio 4.0

하루종일 day of week 만 검색했다.
너무 많은 검색과 너무 많은 시도를 하다보니 과정이 어땠는지 정확히 기억이 안 나지만,
어쩌다보니 시도하게되었는데, org.threeten.bp.* 이 아닌 java.time.* 을 활용하면 Narrow 케이스가 정상적으로 동작하는 것을 확인하게 되었다.
그러다가 Android Studio 4에서 좋은 소식이 하나 있었다. Java 8 Language library desugaring in D8 and R8 Android Studio 4 를 업데이트하면 java.time.* 을 백포트 없이 쓸 수 있다!
두근두근하며 개발자 가이드문서 를 참고하여 desugraing 을 적용했다.
노가다 방법을 사용하지 않고 정말로 짜잔하고 결과물이 나올 것만 같았다.
Build를 기다리고 설레는 마음으로 카탈루냐어로 설정하고 결과물을 봤는데!!!
다시 제자리로 돌아왔다. (-저 d는 dumb의 d인건가-)
최신 안드로이드에서는 정상적으로 표시가 되나, Android 6.0에서는 여전히 번역이 안되는 것을 확인했다.
어쩌면 Java8을 쓸 수 없는 곳에서는 ThreeTenABP를 사용한 것이 아닌가 하는 의심이 들었다.

결론

이후 굉장히 많은 뻘짓과 조사와 좌절이 있었지만 슬슬 지루해하실 것 같으니 결론을 이야기드리면,
SDK 26 이상은 java.time.DayOfWeek 를 활용하여 요일을 보여주고 SDK 26 미만에 대해서는 SimpleDateFormat("EEEEE")java.util.Calendar 를 조합하여 날짜를 연산해서 표기하는 방식으로 해결했다.
26미만 케이스로 통일해도 문제가 없는 것이 아니냐라는 질문에 대해서는 DayOfWeek 는 java에서 제공하며 관리되는 Library이고 안정적일 것으로 기대해서 사용을 하기로했다.
그리고 SimpleDateFormat을 이용하여 날짜를 연산하는 로직을 포함하게 되는데 어떤 사이드이펙트를 가져올지 확실하지 않아서 분기를 타는 방식을 선택했다.
뿌듯하니 결과물 보고 갑시다. (스크롤 압박 + 뒤에 조금 남아있습니다.)
언제나 잘 출력된 한국어
스페인어
중국어
까딸루냐어
히브리어
줄루어

끝인가?

끝이라 생각했다. Release Build를 했다. 문제가 생겼다.
Android 4 에서는 앱이 실행하자마자 죽어버리는 증상이 나타났다.
정확한 원인 파악은 못했지만 com.android.tools.build:gradle 을 4.0.0 에서 3.x.x 대로 내리고 coreLibraryDesugaringEnabled 를 꺼버리니 해결이 되었다.
하지만 이번엔 SDK 26 이상에서 이상증상이 나타나는데 힘들게 번역시켜놓은 요일이 뜬금없이 숫자로 표기가 된다.
힘들게 번역했더니 숫자로 대통합
이쯤되면 그냥 다 같이 노가다해서 String에 추가하는 것이 더 안전하고 빠른 방법이 되었을 것 같은 후회가 들지만, 희망적인 SDK 26 미만을 위한 코드가 있었다.
더 찾아보면 요일이 숫자로 표기되는 것도 간단하게 해결이 될 것 같았지만 다른 작업이 밀려있기에 TODO로 기록하고(이렇게 또 Legacy를 만들었다.) SDK 26 미만을 위해 작성했던 CalendarSimpleDateFormat 조합을 Android 버전상관없이 적용하는 것으로 마무리했다.
멍청하지 않으려 노력해도 결국에 멍청하다면!

마무리

4.27.50-beta 부터 적용되어 나가고 있다. (라이브 테스트)
개발하면서 다국어 디자인도 확인의 필요를 깨달았다.
사건의 시작은 스페인어 D L M M J V S > D L K M J V S 요청이었다. (해결하지 못했다. 그냥 string 노가다 할 걸…)
어쩌면 더 간단한 방식이 많을 거라는 생각을 버리지 못하는 중이다.
Android 4를 버리니 Android 5, 6에게 고통받기 시작한다.
끝날때 까지 끝난게 아니다.