lifecarelog
개발일지

다국어 앱스토어 스크린샷, 텍스트가 박스를 넘칠 때 Canvas로 맞춘 기록

언어마다 카피 길이가 달라 앱스토어 스크린샷 텍스트가 박스를 넘칠 때, Canvas measureText와 이진탐색으로 폰트를 자동으로 맞춘 과정을 정리했어요.

5분 읽기

다국어 앱스토어 스크린샷, 텍스트가 박스를 넘칠 때 Canvas로 맞춘 기록

앱스토어에 올릴 홍보 스크린샷을 언어별로 만들다 보면, 같은 문구인데 언어마다 길이가 제각각이에요. 영어로는 한 줄에 딱 들어가던 카피가 다른 언어로 바꾸면 박스 밖으로 삐져나오고, 짧은 언어는 또 휑하게 남더라고요. 혹시 언어 하나 추가할 때마다 스크린샷을 손으로 다시 그려 본 적 있나요?

처음엔 라이프케어로그 스크린샷을 만들면서 폰트를 48px로 고정해 뒀어요. 영어 기준으로 예쁘게 맞춰 놓고 12개 언어를 한 번에 뽑았는데, 돌려 보니 서너 개 언어에서 글자가 이미지 가장자리를 넘겼어요. 눈으로 하나씩 확인하고 크기를 다시 줄이는 건 스크린샷 10장 × 12개 언어면 손이 남아나질 않죠.

왜 자꾸 넘칠까

핵심은 같은 의미라도 언어마다 문자열의 픽셀 폭이 다르다는 거예요. 라틴 계열 언어는 영어보다 길어지는 경우가 흔하고, 공백과 자간까지 더해지면 고정 폰트로는 감당이 안 돼요. 사람이 일일이 맞추는 대신, 그리기 직전에 폭을 재서 폰트를 스스로 줄이게 만드는 쪽이 편했어요.

measureText로 실제 폭을 재기

Canvas에는 텍스트의 픽셀 폭을 알려 주는 measureText가 있어요. 지금 폰트에서 문구가 몇 px인지 재고, 박스 너비를 넘으면 폰트를 한 단계 줄이는 식이에요.

function fitFont(ctx, text, maxWidth, max = 48, min = 28) {
  let lo = min, hi = max + 1; // hi = 아직 넘칠 수 있는 상한 경계
  while (hi - lo > 1) {
    const mid = (hi + lo) >> 1;
    ctx.font = `${mid}px Pretendard`;
    if (ctx.measureText(text).width <= maxWidth) lo = mid;
    else hi = mid;
  }
  return lo; // min에서도 넘치면 min 반환 → 줄바꿈으로 폴백
}
폰트 크기 설정measureText로 폭 측정넘치면 축소하한 도달 시 줄바꿈

한 px씩 줄이는 반복문으로도 되지만, 이진탐색으로 바꾸니 48px에서 28px 사이를 대여섯 번이면 찾더라고요. 좌우 여백을 64px 잡고 박스 너비를 계산해서 넘겨줬어요.

무작정 줄이면 안 돼서 하한을 둠

테스트해 보면 폰트를 끝없이 줄이는 것도 답은 아니에요. 24px 밑으로 내려가면 스크린샷에선 글씨가 잘 안 읽혀요. 그래서 하한을 28px로 정하고, 거기서도 넘치면 더 줄이는 대신 줄바꿈으로 넘겼어요. 단어 단위로 끊어서 두 줄로 배치하니 대부분 해결됐어요.

  • measureText로 실측
  • 이진탐색으로 수렴
  • 폰트 하한 28px
  • 줄바꿈 폴백

적용해 봤더니 언어를 새로 추가해도 스크린샷 생성 스크립트를 한 번 돌리면 알아서 맞아떨어졌어요. 손으로 언어별 크기를 만지던 작업이 사라진 게 제일 컸어요.

다국어 대응은 결국 사람이 매번 확인하던 걸 코드가 재게 만드는 방향이 편하더라고요. 작은 도구 하나가 반복을 꽤 줄여 줬어요. 앱스토어 스크린샷을 여러 언어로 뽑는 분이라면, measureText로 폭부터 재 보는 걸 권해요.

#Canvas#앱스토어스크린샷#다국어대응#프론트엔드

라이프케어로그 서비스가 궁금하신가요?

AI 기반 건강·일정·재활 관리 앱을 직접 써보세요.

서비스 살펴보기

관련 글

댓글

아직 댓글이 없어요. 첫 댓글을 남겨주세요.