개요

i18n (Internationalization, 국제화)은 소프트웨어를 여러 언어·지역·문화권에서 사용할 수 있도록 설계하는 과정입니다. 이름의 유래는 i + 18글자(nternationalizatio) + n.

용어풀네임의미
i18nInternationalization다국어 지원이 가능하도록 설계/구조화
l10nLocalization특정 언어/지역에 맞게 번역/적용
g11nGlobalizationi18n + l10n 전체 프로세스
t9nTranslation텍스트 번역 자체
[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-intlNext.js 전용, App Router 지원
vue-i18nVue.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 i18nDjango 내장, {% trans %} 템플릿 태그
Flask-BabelFlask + Babel 통합

모바일

플랫폼도구
Androidstrings.xml (다국어 리소스), ICU4J
iOSLocalizable.strings, String Catalog (Xcode 15+)
Flutterintl 패키지, ARB 파일
React Nativei18next + react-i18next

기타

언어/프레임워크도구
Gogolang.org/x/text, go-i18n
RustFluent (Mozilla), rust-i18n
JavaResourceBundle, ICU4J
Ruby on RailsRails I18n (내장), config/locales/*.yml
PHP / LaravelLaravel Localization (lang/ 디렉토리)

번역 파일 형식

형식확장자사용처
JSON.jsoni18next, 웹 프레임워크 전반
YAML.ymlRails, Django
PO/MO.po / .mogettext (전통적)
XLIFF.xliffiOS, 번역 도구 표준
ARB.arbFlutter/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 Translation100+ 언어, 커스텀 모델
Amazon TranslateAWS 통합
Azure TranslatorMicrosoft 생태계
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 {#개의 항목}
}

관련 항목