i18n
국제화(i18n)는 앱을 여러 언어와 지역에 맞게 적응시키는 과정입니다. vue-i18n은 Vue의 공식 국제화 라이브러리입니다.
면접에서 "다국어 지원은 어떻게 구현하나요?"라고 물으면, 메시지 관리, 지연 로딩, 날짜/숫자 포매팅까지 설명할 수 있으면 좋습니다.
설치와 설정
// plugins/i18n.ts
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
locale: 'ko',
fallbackLocale: 'en',
messages: {
ko: {
greeting: '안녕하세요, {name}님!',
nav: { home: '홈', about: '소개', contact: '연락처' },
items: '아이템이 없습니다 | 1개의 아이템 | {count}개의 아이템'
},
en: {
greeting: 'Hello, {name}!',
nav: { home: 'Home', about: 'About', contact: 'Contact' },
items: 'No items | 1 item | {count} items'
}
}
})
export default i18n
컴포넌트에서 사용
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { t, locale, availableLocales } = useI18n()
const switchLocale = (newLocale: string) => {
locale.value = newLocale
}
</script>
<template>
<p>{{ t('greeting', { name: '심정훈' }) }}</p>
<nav>
<a>{{ t('nav.home') }}</a>
<a>{{ t('nav.about') }}</a>
</nav>
<!-- 복수형 -->
<p>{{ t('items', 0) }}</p> <!-- 아이템이 없습니다 -->
<p>{{ t('items', 1) }}</p> <!-- 1개의 아이템 -->
<p>{{ t('items', { count: 5 }, 5) }}</p> <!-- 5개의 아이템 -->
<!-- 언어 전환 -->
<select v-model="locale">
<option v-for="loc in availableLocales" :key="loc" :value="loc">
{{ loc }}
</option>
</select>
</template>
날짜/숫자 포매팅
const i18n = createI18n({
locale: 'ko',
datetimeFormats: {
ko: {
short: { year: 'numeric', month: '2-digit', day: '2-digit' },
long: { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' }
}
},
numberFormats: {
ko: {
currency: { style: 'currency', currency: 'KRW' },
percent: { style: 'percent', minimumFractionDigits: 1 }
}
}
})
<template>
<p>{{ d(new Date(), 'short') }}</p> <!-- 2026. 11. 06 -->
<p>{{ d(new Date(), 'long') }}</p> <!-- 2026년 11월 6일 금요일 -->
<p>{{ n(1500000, 'currency') }}</p> <!-- ₩1,500,000 -->
</template>
지연 로딩
// 번역 파일을 필요할 때만 로드
async function loadLocaleMessages(locale: string) {
const messages = await import(`./locales/${locale}.json`)
i18n.global.setLocaleMessage(locale, messages.default)
}
const switchLocale = async (newLocale: string) => {
if (!i18n.global.availableLocales.includes(newLocale)) {
await loadLocaleMessages(newLocale)
}
i18n.global.locale.value = newLocale
}
면접 팁
- i18n 키 관리 전략(flat vs nested), 번역 파일 지연 로딩, RTL 지원까지 설명할 수 있으면 실무 경험을 보여줄 수 있습니다
fallbackLocale설정의 중요성 — 번역이 없는 키에 대한 대응- SEO를 위한
hreflang태그와 URL 전략(경로 기반 vs 서브도메인)도 알아두면 좋습니다
요약
vue-i18n은 메시지 보간, 복수형, 날짜/숫자 포매팅을 지원하는 Vue 공식 국제화 라이브러리입니다. 번역 파일 지연 로딩으로 번들 크기를 관리하고, fallbackLocale로 미번역 키에 대응합니다.
댓글 로딩 중...