문자열을 고쳤을 때, 번역 로케일까지 같이 열어 보십니까?
저는 기본 언어만 고치고 "했다"고 기억했습니다. 그래서 네 개 로케일의 결제 화면이 이 앱에 없는 기능을 팔고 있었습니다.
하려던 일
앱 여러 개를 다른 플랫폼으로 포팅했습니다. 원본에는 그 플랫폼 고유의 기능 이름과 결제 안내가 문자열로 들어 있는데, 포팅하면서 그걸 새 플랫폼 것으로 바꿔야 합니다.
바꿨다고 생각했습니다. 확인차 전체 앱의 문자열 리소스를 훑었습니다.
127건이 남아 있었습니다. 그런데 이 숫자가 함정입니다
정규식으로 세면 127건입니다. 그런데 그중 코드에서 실제로 참조되는 건 46건이었습니다.
나머지 81건은 포팅 잔재로 남은 죽은 문자열이라 화면에 안 나옵니다. 지우는 건 17개 로케일 대량 수정이라 이득 없이 위험만 있어서 그대로 뒀습니다.
이게 이 감사의 핵심 판단입니다. 총 건수는 행동을 안 알려줍니다. "화면에 나오는가"로 거르고 나서야 목록이 46건으로 줄고, 그때부터 순서가 보입니다.
살아 있던 46건
가장 나쁜 건 한 앱의 결제 화면이었습니다.
기본 언어와 한국어는 새 플랫폼 이름으로 고쳐져 있었습니다. 프랑스어·일본어·중국어 간체·번체 네 로케일만 원본 플랫폼의 건강 서비스 이름 그대로였습니다.
그 문자열은 결제 직전 화면에서 렌더링됩니다. 즉 그 언어 사용자는 이 앱에 없는 기능을 보고 구매 결정을 합니다.
다른 앱은 결제 화면의 "클라우드 동기화" 자리에 원본 플랫폼의 클라우드 서비스 이름이 있었고, 게다가 다섯 로케일이 그 영어 원문을 번역도 없이 쓰고 있었습니다.
그리고 두 앱은 결제 고지에서 "다른 플랫폼 계정으로 청구된다" 고 적혀 있었습니다. 이건 사실과 다를 뿐 아니라 스토어 정책 위반 소지가 있습니다 — 실제로 그 앱들이 거부된 사유와 같은 계열입니다.
판정은 두 단계입니다
# 1단계 — 후보 (공백 없는 표기까지 잡는다)
패턴 = r"브랜드\s*[^\s,.。、·]{0,12}|기기이름|클라우드이름"
# 2단계 — 실제로 쓰이는가
if re.search(rf"R\.string\.{키}\b", 코드전체):
진짜_결함.append(키)2단계가 없으면 127건짜리 목록을 들고 앉게 됩니다. 그 목록으로는 우선순위가 안 나옵니다.
제외 목록도 필요합니다. 개발자 이메일 도메인, 법적 문서 URL, 그리고 낱말 게임에서 예시로 쓰는 일반 명사.
당신이라면 죽은 문자열 81건을 지우시겠습니까
저는 안 지웠습니다.
- 화면에 안 나옵니다.
- 17개 로케일을 건드리는 대량 수정입니다.
- 회귀 위험만 늘고 얻는 게 없습니다.
이건 배포 스크립트가 하루치 작업을 되돌릴 뻔한 것에서 배운 것과 같습니다. 대량 수정은 그 자체가 위험 자산입니다. 값이 없으면 안 하는 게 맞습니다.
자가진단 3줄
- 문자열 하나를 고칠 때
values-*전체를 grep 합니까? 기본 언어만 고치면 "고쳤다는 기억"만 남습니다. - 당신의 검사 결과가 "몇 건"입니까, "몇 건이 렌더링됩니까"입니까? 참조 여부로 거르지 않으면 목록이 행동으로 안 바뀝니다.
- 결제 화면 문구를 로케일별로 마지막에 읽어 본 게 언제입니까? 거기가 오차 비용이 제일 비싼 화면입니다.
솔직한 부분
처음 훑을 때 정규식이 공백 없는 표기를 놓쳤습니다. 중국어 문자열에서는 브랜드 이름과 그다음 글자가 붙어 있는데, 공백을 가정한 패턴으로는 안 걸립니다. 두 번째 검사에서야 나왔습니다. 즉 제 첫 번째 "전수 검사"는 전수가 아니었습니다.
오탐도 있었습니다. 한 앱의 문자열에 원본 플랫폼 기기 이름이 들어 있는데, 그건 정확한 표현이었습니다 — 그 플랫폼용 앱이 실제로 있고 파일을 주고받을 수 있으니까요. 브랜드 이름이 나온다고 전부 결함이 아닙니다. 개발자 이메일 주소에 클라우드 서비스 도메인이 들어 있어서 그것도 걸렸습니다.
그리고 이 감사는 문자열만 봤습니다. 아이콘·스크린샷·스토어 리스팅에 원본 플랫폼 흔적이 남아 있는지는 이번에 안 봤습니다. 같은 주에 스토어 설명 안에 이 앱에 없는 기능이 적혀 있는 것도 나왔으니, 그 방향은 아직 열려 있습니다.
포팅한 앱이 있으시면, grep -r "옛플랫폼이름" res/ 하고 그중 코드가 참조하는 것만 세어 보세요. 두 숫자 차이가 당신의 우선순위입니다.