
Vue i18n: vue-i18n 국제화 설정 완벽 가이드
설치부터 프로덕션까지, Composition API로 vue-i18n을 설정하고 CLDR 규칙으로 복수형을 처리하며 컴포넌트 보간과 스마트 로케일 폴백 체인을 사용해 보세요.
vue-i18n 설치
vue-i18n은 Vue.js 공식 국제화 플러그인이에요. 반응형 번역, ICU 방식 복수형, 컴포넌트 보간, 날짜/시간 및 숫자 서식을 제공하고 Options API와 Composition API를 모두 지원해요.
npm install vue-i18n@9vue-i18n 설정
createI18n()으로 i18n 인스턴스를 만들고 Vue 플러그인으로 등록하세요. 로케일 메시지를 정의하고 기본 로케일과 폴백 로케일을 설정하세요. vue-i18n은 레거시(Options API) 모드와 컴포지션(Composition API) 모드를 모두 지원해요.
// src/i18n.ts
import { createI18n } from 'vue-i18n'
import en from './locales/en.json'
import de from './locales/de.json'
const i18n = createI18n({
legacy: false, // Use Composition API mode
locale: 'en', // Default locale
fallbackLocale: 'en', // Fallback locale
messages: { en, de },
})
export default i18n// src/main.ts
import { createApp } from 'vue'
import App from './App.vue'
import i18n from './i18n'
const app = createApp(App)
app.use(i18n)
app.mount('#app')템플릿에서 번역 사용
vue-i18n은 템플릿에서 $t() 함수(Options API)를 제공하고 useI18n()에서 t() 함수(Composition API)를 제공해요. 두 함수 모두 번역 키와 보간에 사용할 선택 사항인 명명된 매개변수나 목록 매개변수를 받아요.
// src/locales/en.json
{
"nav": {
"home": "Home",
"about": "About",
"settings": "Settings"
},
"greeting": "Hello, {name}!",
"cart": {
"itemCount": "no items | one item | {count} items"
}
}
// src/locales/de.json
{
"nav": {
"home": "Startseite",
"about": "Über uns",
"settings": "Einstellungen"
},
"greeting": "Hallo, {name}!",
"cart": {
"itemCount": "keine Artikel | ein Artikel | {count} Artikel"
}
}복수형 처리
vue-i18n은 파이프로 구분한 형식과 $tc() 함수(레거시) 또는 개수 매개변수를 받는 t()(Composition API)로 복수형을 지원해요. 로케일 메시지에 파이프 구분자로 복수형을 정의하세요: 'no items | one item | {count} items'.
<template>
<div>
<!-- Simple translation -->
<h1>{{ $t('nav.home') }}</h1>
<!-- With variables -->
<p>{{ $t('greeting', { name: userName }) }}</p>
<!-- In attributes -->
<input :placeholder="$t('nav.settings')" />
<!-- Composition API -->
<p>{{ greeting }}</p>
</div>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const userName = 'Alice'
const greeting = t('greeting', { name: userName })
</script>로케일 폴백 체인 추가
vue-i18n의 내장 fallbackLocale은 로케일별 체인이 아닌 평면 폴백 로케일 목록만 지원해요. pt-BR 사용자는 키가 누락되면 pt-PT 대신 영어로 대체돼요. vue-i18n-locale-chain은 설정 가능한 딥 머지 체인을 추가해 지역 사용자가 가장 가까운 번역을 볼 수 있게 해요.
<template>
<div>
<!-- Pipe-separated plurals -->
<p>{{ $t('cart.itemCount', count) }}</p>
<!-- Named plurals (recommended for complex languages) -->
<p>{{ $t('orders', { n: orderCount }) }}</p>
</div>
</template>
<!-- In your locale file: -->
<!-- "orders": "{n} order | {n} orders" -->번역 자동화
vue-i18n 설정이 끝나면 AI로 로케일 JSON 파일을 번역하세요. IDE에서 AI 어시스턴트에게 원본 파일 번역을 요청하거나 CI/CD 파이프라인에 번역을 통합해 현지화를 완전히 자동화할 수 있어요.
<template>
<select v-model="locale">
<option v-for="lang in availableLocales" :key="lang" :value="lang">
{{ lang }}
</option>
</select>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { locale, availableLocales } = useI18n()
</script>// src/i18n.ts
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
legacy: false,
locale: 'en',
fallbackLocale: 'en',
messages: {},
})
export async function loadLocale(locale: string) {
const messages = await import(`./locales/${locale}.json`)
i18n.global.setLocaleMessage(locale, messages.default)
i18n.global.locale.value = locale
}
export default i18n로케일 폴백 체인 설정
지역 사용자가 바로 영어로 넘어가지 않고 가장 가까운 번역을 볼 수 있도록 로케일별 폴백 체인을 설정하세요. vue-i18n은 객체 형식 fallbackLocale로 로케일별 체인을 정의할 수 있어요.
// src/i18n.ts
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
legacy: false,
locale: 'pt-BR',
fallbackLocale: {
'pt-BR': ['pt', 'en'],
'zh-Hant-TW': ['zh-Hant', 'zh', 'en'],
'es-419': ['es', 'en'],
default: ['en'],
},
messages: {
en: { /* ... */ },
pt: { /* ... */ },
'pt-BR': { /* ... */ },
},
})흔한 실수
레거시 모드와 Composition API 모드 혼용
번역 문자열에 v-html 사용
지역 사용자에게 상위 로케일 대신 영어가 표시됨
지금 i18n Agent 사용해 보기
번역 파일을 여기에 드롭
JSON, YAML, PO, XML, CSV, Markdown, Properties
또는 클릭하여 파일 선택
대상 언어