국제화
Internationalization
개념
제품이 여러 언어와 지역 형식을 담을 수 있도록 문구와 형식을 코드 밖으로 빼서 구조를 미리 잡아 두는 일입니다.
등장 배경
한 나라에서만 쓰는 제품을 만들 때는 화면에 보일 말을 코드 안에 그대로 적는 편이 빠릅니다. 버튼을 그리는 자리에 "삭제" 라고 써 넣으면 그만이고, 날짜도 연도와 월과 일을 점으로 이어 붙이면 화면에 잘 나옵니다. 이 방식은 두 번째 언어가 필요해지기 전까지 아무 문제를 일으키지 않습니다.
페이지덱은 그 순간을 계약 직전에 만났습니다. 일본 고객이 마지막 검토 자리에서 화면을 일본어로 쓸 수 있느냐고 물었고, 태오가 하루 동안 코드를 뒤진 뒤 내놓은 답은 두 달이었습니다. 화면에 나오는 문구가 400군데 넘게 흩어져 있었고, 날짜는 코드가 직접 글자로 이어 붙이고 있어서 형식을 바꾸려면 그 자리들을 하나씩 찾아야 했습니다. 계약은 다음 분기로 밀렸습니다.
문제는 번역할 글을 찾는 것만이 아니었습니다. 같은 뜻을 독일어로 쓰면 영어보다 30퍼센트쯤 길어지는데, 페이지덱의 버튼은 글자 수에 맞춰 폭이 고정돼 있어 문구를 넣자마자 잘렸습니다.
국제화는 이 일을 나중이 아니라 처음에 하기로 한 결정입니다. 언어를 늘리는 작업이 아니라, 언어를 늘릴 수 있는 자리를 미리 만들어 두는 작업입니다. i18n 이라고 줄여 쓰는데, 첫 글자와 끝 글자 사이에 글자 18개가 있어서 붙은 이름입니다.
작동 방식
화면에 보이는 모든 문구를 코드 밖 언어 파일로 옮기고, 날짜와 숫자와 통화 형식을 코드가 직접 만들지 않고 지역 설정에 맡기는 것이 기본 구조입니다.
- 문구 분리. 코드에는
button.delete같은 이름만 남기고, 그 이름에 붙는 말을 언어별 파일에 모읍니다. 한국어 파일에는 "삭제", 영어 파일에는 "Delete" 가 들어갑니다. 언어를 하나 더하는 일이 파일 하나를 더하는 일이 됩니다. - 문장 조립 금지. "문서" 와 "가 삭제되었습니다" 를 코드에서 이어 붙이면 어순이 다른 언어에서 무너집니다. 문장 하나를 통째로 두고 이름이 들어갈 자리만 구멍으로 뚫어 둡니다.
- 개수에 따른 표현. 영어는 하나와 여럿을 다르게 쓰고, 한국어는 구분하지 않으며, 세 가지로 나뉘는 언어도 있습니다. 이 규칙을 직접 짜면 언어가 늘 때마다 고치게 되므로 처리 도구에 맡깁니다.
- 형식은 설정으로. 같은 날짜를 어떤 곳은 연·월·일 순으로, 어떤 곳은 일·월·연 순으로 적습니다. 천 단위와 소수점을 나누는 기호도 나라마다 반대로 씁니다. 코드에는 날짜라는 값만 넘기고 어떻게 보일지는 지역 설정이 정하게 둡니다.
- 자리 여유. 문구가 길어질 수 있다는 전제로 화면을 짭니다. 버튼 폭을 글자에 맞춰 고정하지 않고 최소 너비만 정하며, 두 줄이 되어도 아래 요소가 밀리지 않게 둡니다. 화면 크기에 따라 배치가 바뀌는 반응형 디자인을 이미 하고 있다면 그 규칙을 글자 길이에도 적용하는 셈입니다.
이 구조는 한 언어만 쓰는 동안에도 값을 합니다. 문구가 코드 밖에 있으면 마이크로카피, 그러니까 버튼과 안내문에 들어가는 짧은 문구를 쓰는 사람이 개발자를 거치지 않고 직접 고칠 수 있습니다. 단어 하나를 바꾸는 데 배포 일정을 기다리지 않아도 됩니다.
쓰이는 곳
새 화면을 만들 때, 빨리 가려고 미뤄 둔 정리 작업을 갚을 때, 새 시장에 들어갈지 정할 때 이 말이 나옵니다.
새 화면을 만들 때는 컴포넌트 단계에서 걸립니다. 화면을 이루는 재사용 가능한 코드 단위인데, 버튼 레이블을 받는 버튼 컴포넌트가 글자 길이에 따라 늘어나게 만들어져 있으면 그 뒤로 만드는 모든 화면이 자동으로 안전해집니다. 반대로 고정 폭으로 만들어 두면 같은 문제를 화면 수만큼 반복해 고치게 됩니다.
이미 만들어 둔 제품에서는 기술 부채로 다룹니다. 빨리 가려고 미뤄 둔 정리 작업이 쌓인 비용이고, 국제화를 건너뛴 코드가 전형적인 예입니다. 미뤄 둔 기간만큼 흩어진 자리가 늘어서 갚는 값이 갈수록 커집니다. 화면 열 개짜리 제품에서는 한 주면 되는 일이 화면 200개짜리 제품에서는 분기 과제가 됩니다.
확인은 품질 보증 단계에서 합니다. 번역이 오기 전에도 가짜 언어 파일로 볼 수 있습니다. 모든 문구를 원래 길이의 1.4배짜리 임시 글자로 바꿔 화면을 한 바퀴 돌면, 잘리는 버튼과 코드에 박혀 바뀌지 않은 문구가 한눈에 드러납니다.
실무 용례
"이 문구 코드에 박혀 있어요. 언어 파일로 빼 주세요."
번역이 닿지 않는 자리가 남아 있으니 구조부터 고치자는 요청입니다.
"국제화는 돼 있고 번역만 안 된 상태예요. 파일만 채우면 됩니다."
구조 작업은 끝났으니 언어를 하나 더하는 데 개발이 필요 없다는 뜻입니다.
"이 버튼 독일어에서 글자가 잘려요. 고정 폭 빼고 최소 너비만 두죠."
문구는 빠져나왔지만 화면이 길이 변화를 못 견디는 상태라는 지적입니다.
페이지덱은 일본 고객을 놓친 다음 분기에 두 달을 들여 문구를 전부 언어 파일로 옮겼습니다. 그 뒤로 새 화면을 만들 때 민서가 시안에 가장 긴 언어 기준으로 문구를 넣어 보는 습관이 생겼고, 태오는 코드 검토에서 화면에 직접 적힌 한글이 있으면 되돌려 보냅니다.
두 번째 언어를 실제로 낸 것은 그로부터 반년 뒤였습니다. 그때 든 시간은 2주였고, 대부분이 번역과 검수에 쓰였습니다. 처음 두 달과 나중 2주의 차이가 국제화를 미리 해 두는 값입니다.
흔한 오해
우리 제품은 국내에서만 쓰니 필요 없다고 넘기는 경우가 가장 흔합니다. 지금 외국어 화면을 낼 계획이 없으니 당장 쓸 데가 없는 작업으로 보이고, 그 판단 자체가 틀리지도 않습니다. 다만 이 작업의 값어치는 번역에서만 나오지 않습니다. 문구를 코드 밖으로 빼는 순간 문구를 고치는 일이 개발 일정에서 떨어져 나오고, 오탈자 하나를 고치는 데 며칠을 기다리지 않게 됩니다. 나중에 필요해졌을 때의 값도 계속 커집니다. 화면이 늘어난 뒤에 손대면 같은 작업에 몇 배가 듭니다.
한 번 끝내면 끝나는 일로 보는 것도 오해입니다. 구조를 잡는 작업이라는 말이 일회성으로 들리니 그렇게 읽기 쉽습니다. 실제로는 새 화면을 만들 때마다 같은 규칙을 지켜야 하고, 한 군데라도 문구를 코드에 직접 적으면 그 화면만 번역이 비어 있는 상태가 됩니다. 이런 구멍은 대개 번역을 맡긴 뒤가 아니라 그 언어를 쓰는 고객이 화면을 열었을 때 드러납니다.
자주 헷갈리는 용어
| 용어 | 무엇을 하는가 | 국제화와의 차이 |
|---|---|---|
| 현지화 | 언어와 문화에 맞게 표현을 바꾸는 일 | 국제화가 깔아 둔 구조 위에서 돌아갑니다. 국제화는 한 번 해 두면 언어가 늘어도 다시 하지 않지만, 현지화는 언어마다 한 번씩 필요합니다 |
같이 보면 좋은 페이지
마지막 업데이트 2026-09-16