비즈니스 현실8 분 읽기

앱은 14개 언어를 하는데 스토어는 1개였습니다. 반대인 앱도 있었습니다

안드로이드 앱 14개의 리스팅을 개선하려다, 먼저 물어야 할 것을 알았습니다. 이 앱이 실제로 몇 개 언어를 하는가. 앱과 스토어의 언어 목록을 나란히 놓으니 어긋남이 양방향이었고, 한쪽은 순손실이고 다른 쪽은 평점을 깎고 있었습니다.

#i18n#aso#android#audit
좌우 두 열. 왼쪽은 앱이 하는 말, 오른쪽은 스토어가 하는 말. 위 행은 앱 14개 언어 대 스토어 1개, 아래 행은 반대로 앱 2개 대 스토어 17개. 가운데에 양방향 화살표.
번역은 이미 값을 치렀는데 등록만 빠진 앱과, 못 하는 언어로 광고하는 앱이 같은 계정에 있었습니다.

당신의 앱이 지원하는 언어 수와, 스토어 페이지가 존재하는 언어 수를 나란히 적어 본 적 있으십니까?

저는 없었습니다. 리스팅 문구를 개선하려고 앉았다가, 그 전에 이 두 숫자를 적어야 한다는 걸 알았습니다. 적어 보니 앱 14개 중 두 개가 어긋나 있었고, 어긋난 방향이 서로 반대였습니다.

두 줄짜리 대조

앱의 언어 수는 리소스 폴더를 세면 나오고, 스토어의 언어 수는 리스팅 API로 나옵니다.

앱_언어수   = res/values-* 폴더 수 + 1     # values 는 기본 언어
스토어_언어수 = 리스팅 API 가 돌려주는 로케일 수

주의할 게 있습니다. 안드로이드 리소스 한정자는 표준 언어 코드가 아닙니다. 인도네시아어는 in(id가 아닙니다), 중국어는 zh-rCN/zh-rTW입니다. 스토어 쪽 코드와 그대로 비교하면 없는 어긋남이 생깁니다.

그리고 빌드 설정에 언어 목록을 고정해 두면(resConfigs) 폴더를 추가해도 안 먹습니다. 대조 전에 그것부터 확인해야 합니다.

결과: 어긋남이 양방향이었습니다

14개 앱 중 12개는 일치. 나머지 둘이 정반대였습니다.

한 앱은 리소스에 14개 언어가 다 들어 있는데 스토어 리스팅이 하나뿐이었습니다. 13개 시장의 사용자가, 자기 언어를 이미 하는 앱의 스토어 페이지를 영어로만 보고 있었습니다.

이건 순손실입니다. 번역은 이미 값을 치렀고, 등록만 빠졌습니다. 추가 비용이 거의 0인 수정입니다.

다른 앱은 리소스에 언어가 둘뿐인데 스토어 리스팅이 17개였습니다. 15개 시장에서 그 언어로 광고하고, 설치하면 영어 앱이 열립니다.

이쪽이 더 불편합니다. 설치는 늘지만 평점과 잔존이 깎입니다. 그리고 리스팅을 지우는 게 답이 아닙니다 — 답은 앱을 번역하는 겁니다. 지우면 유입이 즉시 줄고, 번역은 별도 작업입니다.

당신이라면 어느 쪽부터 하시겠습니까

두 방향은 비용 구조가 완전히 다릅니다.

방향 손해 고치는 비용
앱 14 / 스토어 1 발견 경로 없음 문구 세 개 × 13 로케일
앱 2 / 스토어 17 평점·잔존 하락 앱 번역 15개 언어

한 가지 다행인 사실이 있습니다. 안드로이드 스토어는 리스팅 언어를 추가하는 데 새 빌드도 스크린샷도 필요 없습니다. 제목·짧은 설명·전체 설명 세 개만 있으면 되고, 그래픽은 기본 언어에서 폴백합니다.

애플 쪽은 정반대입니다. 새 로케일을 만들면 스크린샷 세트가 빈 채로 생겨서 제출 자체가 막힙니다. 자산은 있는데 파이프라인이 로케일을 안 물어서 일본어 스크린샷이 비었던 일이 그 계열이었습니다.

API 함정 하나

리스팅 갱신 API는 전체 교체입니다.

# 위험 — 지정하지 않은 필드는 지워진다
update_listing(locale="de-DE", full_description=새본문)
 
# 안전 — 읽고, 바꿀 것만 바꾸고, 통째로 되쓴다
현재 = get_listing(locale="de-DE")
현재["fullDescription"] = 새본문
update_listing(locale="de-DE", **현재)

새 로케일은 세 필드를 다 줘야 하고, 하나라도 비면 그 언어가 빈 채로 생깁니다. 그러면 없느니만 못한 페이지가 하나 늘어납니다.

같은 성질이 배포 스크립트가 리포 값으로 라이브를 덮으려 한 일의 원인이기도 했습니다. 전체 교체 API는 조용히 되돌립니다.

자가진단 3줄

  1. 앱이 하는 언어 수와 스토어가 하는 언어 수를 지금 말할 수 있습니까? 못 하면 둘 중 하나는 틀려 있을 가능성이 큽니다.
  2. 어긋남의 방향을 구분했습니까? 한 방향은 공짜로 고쳐지고 다른 방향은 번역 예산이 듭니다. 같은 "불일치"로 묶으면 계획이 안 나옵니다.
  3. 리소스 한정자와 스토어 로케일 코드를 그대로 비교하고 있습니까? in/id, zh-rCN/zh-Hans 에서 유령 불일치가 나옵니다.

솔직한 부분

13개 리스팅을 추가한 앱의 설치가 늘었는지는 아직 모릅니다. 스토어 검색 반영에 시간이 걸리고, 그 앱은 원래 설치가 적어서 노이즈를 넘는 신호가 나오려면 몇 주가 필요합니다.

반대 방향(앱 2개 언어 / 스토어 17개)은 이번에 고치지 않았습니다. 리스팅을 줄이면 유입이 즉시 줄고, 앱을 번역하는 건 별도 작업입니다. 어느 쪽을 택할지는 숫자를 더 봐야 하는 판단이라 그대로 뒀습니다. 즉 이 글에는 미해결로 남긴 항목이 하나 있습니다.

그리고 리소스 폴더 개수는 "번역이 존재한다"는 뜻이지 "번역이 완전하다"는 뜻이 아닙니다. 키 하나만 있어도 폴더는 생깁니다. 이번 대조는 그 안쪽을 보지 않았습니다 — 실제로 폴더는 있는데 문자열 절반이 영어인 앱이 있어도 이 검사는 통과합니다.

앱이 여러 개 있으시면, 지금 ls res/values-* | wc -l 하나와 스토어 리스팅 로케일 수를 나란히 적어 보세요. 두 숫자가 다르면 어느 방향인지부터 보시면 됩니다.

관련 글