개요
i18n (Internationalization, 국제화)은 소프트웨어를 여러 언어·지역·문화권에서 사용할 수 있도록 설계하는 과정입니다. 이름의 유래는 i + 18글자(nternationalizatio) + n.
| 용어 | 풀네임 | 의미 |
|---|
| i18n | Internationalization | 다국어 지원이 가능하도록 설계/구조화 |
| l10n | Localization | 특정 언어/지역에 맞게 번역/적용 |
| g11n | Globalization | i18n + l10n 전체 프로세스 |
| t9n | Translation | 텍스트 번역 자체 |
[i18n — 구조 설계] → [l10n — 지역별 적용]
i18n: "날짜를 로케일에 따라 포맷하는 코드 작성"
l10n: "한국어 번역 파일 작성, 원화(₩) 통화 설정"
i18n에서 다루는 항목
| 항목 | 예시 |
|---|
| 텍스트 번역 | ”Submit” → “제출” |
| 날짜/시간 형식 | 2026-03-07 vs 03/07/2026 vs 07.03.2026 |
| 숫자 형식 | 1,234.56 vs 1.234,56 |
| 통화 | $100.00 vs ₩100,000 vs €100,00 |
| 텍스트 방향 | LTR (한국어, 영어) vs RTL (아랍어, 히브리어) |
| 복수형 | 영어: 1 item / 2 items, 러시아어: 3가지 복수 규칙 |
| 타임존 | UTC, KST (+9), PST (-8) |
| 문자 인코딩 | UTF-8 (표준) |
| 정렬 순서 | 언어별 알파벳/가나다 순서 다름 |
| 이미지/아이콘 | 문화권별 의미 차이 (손 제스처, 색상 등) |
| 법적 요구사항 | GDPR (유럽), 개인정보보호법 (한국) |
주요 라이브러리 / 프레임워크
JavaScript / TypeScript
| 라이브러리 | 특징 |
|---|
| i18next | 가장 인기, React/Vue/Node 등 전 플랫폼, 플러그인 풍부 |
| react-intl (FormatJS) | React 전용, ICU 메시지 포맷 |
| next-intl | Next.js 전용, App Router 지원 |
| vue-i18n | Vue.js 공식 i18n |
| Intl API (브라우저 내장) | Intl.DateTimeFormat, Intl.NumberFormat 등 |
| Paraglide (Inlang) | 컴파일 타임 번역, 트리쉐이킹, 타입 안전 |
// i18next 예시
import i18next from 'i18next';
i18next.init({
lng: 'ko',
resources: {
ko: { translation: { greeting: '안녕하세요, {{name}}님!' } },
en: { translation: { greeting: 'Hello, {{name}}!' } }
}
});
i18next.t('greeting', { name: '김철수' }); // "안녕하세요, 김철수님!"
// 브라우저 Intl API
new Intl.DateTimeFormat('ko-KR').format(new Date()); // "2026. 3. 7."
new Intl.NumberFormat('ko-KR', { style: 'currency', currency: 'KRW' }).format(50000); // "₩50,000"
Python
| 라이브러리 | 특징 |
|---|
| gettext | 표준 라이브러리, .po/.mo 파일 |
| Babel | 날짜/숫자/통화 로케일 포맷팅 |
| Django i18n | Django 내장, {% trans %} 템플릿 태그 |
| Flask-Babel | Flask + Babel 통합 |
모바일
| 플랫폼 | 도구 |
|---|
| Android | strings.xml (다국어 리소스), ICU4J |
| iOS | Localizable.strings, String Catalog (Xcode 15+) |
| Flutter | intl 패키지, ARB 파일 |
| React Native | i18next + react-i18next |
기타
| 언어/프레임워크 | 도구 |
|---|
| Go | golang.org/x/text, go-i18n |
| Rust | Fluent (Mozilla), rust-i18n |
| Java | ResourceBundle, ICU4J |
| Ruby on Rails | Rails I18n (내장), config/locales/*.yml |
| PHP / Laravel | Laravel Localization (lang/ 디렉토리) |
번역 파일 형식
| 형식 | 확장자 | 사용처 |
|---|
| JSON | .json | i18next, 웹 프레임워크 전반 |
| YAML | .yml | Rails, Django |
| PO/MO | .po / .mo | gettext (전통적) |
| XLIFF | .xliff | iOS, 번역 도구 표준 |
| ARB | .arb | Flutter/Dart |
| ICU MessageFormat | 인라인 | 복수형, 성별 등 복잡한 규칙 |
// JSON (i18next)
{
"greeting": "안녕하세요, {{name}}님!",
"items_count": "{{count}}개의 항목",
"items_count_plural": "{{count}}개의 항목"
}
# PO (gettext)
msgid "Hello, %s!"
msgstr "안녕하세요, %s님!"
번역 관리 플랫폼 (TMS)
| 플랫폼 | 특징 |
|---|
| Crowdin | 가장 인기, GitHub/GitLab 연동, AI 번역 |
| Lokalise | 개발자 친화적, API 강점, 스크린샷 OCR |
| Phrase | 엔터프라이즈, 워크플로우 관리 |
| Transifex | 오픈소스 프로젝트 많이 사용 |
| Weblate | 오픈소스 셀프호스팅 가능 |
| POEditor | 심플, 저렴 |
| Inlang | 오픈소스, Git 기반, Paraglide 연동 |
기계 번역 API
| 서비스 | 특징 |
|---|
| DeepL API | 품질 최고 (특히 유럽어), 한국어 지원 |
| Google Cloud Translation | 100+ 언어, 커스텀 모델 |
| Amazon Translate | AWS 통합 |
| Azure Translator | Microsoft 생태계 |
| LibreTranslate | 오픈소스 셀프호스팅 |
| LLM (GPT/Claude) | 문맥 이해 번역, 비용 높음 |
베스트 프랙티스
설계:
- 하드코딩된 텍스트 금지 → 모든 문자열을 번역 키로 분리
- UTF-8 인코딩 통일
- 날짜/숫자/통화는 Intl API 또는 라이브러리로 포맷
- UI에 텍스트 길이 여유 확보 (독일어는 영어 대비 30% 길어짐)
- RTL 레이아웃 고려 (CSS
direction: rtl, logical properties)
번역 키 네이밍:
// 나쁜 예
"btn1": "Submit"
// 좋은 예
"form.submit_button": "Submit"
"user.profile.edit_title": "Edit Profile"
복수형 처리 (ICU MessageFormat):
{count, plural,
=0 {항목이 없습니다}
one {1개의 항목}
other {#개의 항목}
}
관련 항목