๐ŸŒ Next.js ์‹ฌํ™” 13์žฅ: Advanced I18n โ€” ์ „ ์„ธ๊ณ„ ์œ ์ €๋ฅผ ์‚ฌ๋กœ์žก๋Š” ๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜ ์ „๋žต

2026๋…„ 4์›” 30์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

๊ณ ๊ธ‰ ๊ตญ์ œํ™” ์ „๋žต โ€” ๋™์  locale, ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ i18n, RTL ์ง€์›๊นŒ์ง€ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ


๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 18๋ถ„ (์ „์ฒด) / ํ•ต์‹ฌ ํŒŒํŠธ๋งŒ: 8๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ์˜์ˆ™(๋””์ž์ด๋„ˆ): "์˜์ˆ˜ ๋‹˜, ์šฐ๋ฆฌ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ผ๋ณธ์ด๋ž‘ ๋ฏธ๊ตญ ์œ ์ €๋“ค์ด ์—„์ฒญ ์œ ์ž…๋˜๊ณ  ์žˆ์–ด์š”! ์˜์–ด๋ž‘ ์ผ๋ณธ์–ด ๋ฒ„์ „๋„ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”."
  • ์˜์ˆ˜(PM): "์ข‹์•„์š”! ์˜์ฒ  ๋‹˜, ์ง€๊ธˆ ๋ฐ”๋กœ ๋‹ค๊ตญ์–ด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜ ์žˆ์ฃ ?"
  • ์˜์ฒ (์ฃผ๋‹ˆ์–ด): "๋„ค! localStorage์— language ์ €์žฅํ•ด์„œ ๋ฐ”๊พธ๋ฉด ๋˜๊ฒ ์ฃ ?"
  • ์˜ํ˜ธ(๋ฆฌ๋“œ): "์˜์ฒ  ๋‹˜, ์•ˆ ๋ผ์š”! ๊ทธ๋Ÿฌ๋ฉด SEO๊ฐ€ ํ›ผ์†๋ผ์š”. ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ๋กœ๋ด‡์€ ํ•œ๊ตญ์–ด ๋ฌธ์„œ๋ฐ–์— ๋ชป ๋ณด๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. App Router์˜ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ I18n์œผ๋กœ ๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค."

๐ŸŽฏ ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • /ko, /en ์ฒ˜๋Ÿผ URL ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)๊ฐ€ ๋ณด์žฅ๋˜๋Š” ๋‹ค๊ตญ์–ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„์š”ํ•œ ์‚ฌ์ „์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜์—ฌ ์ดˆ๊ธฐ ์ „์†ก๋Ÿ‰์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ด์šฉํ•ด ์œ ์ €์˜ ๋ธŒ๋ผ์šฐ์ € ์„ค์ •์— ๋งž๋Š” ์–ธ์–ด๋กœ ์ž๋™ ์—ฐ๊ฒฐ(Redirect) ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค

๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€

๋‹ค๊ตญ์–ด๋Š” ๋‹จ์ˆœํžˆ ๊ธ€์ž๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ๋น„์ฆˆ๋‹ˆ์Šค์˜ ํ™•์žฅ์„ฑ ๊ทธ ์ž์ฒด์ง€.
Next.js App Router์—์„œ๋Š” ๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ๊ฐ€ ๋ผ์šฐํŒ… ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ์œผ๋กœ ๋“ค์–ด์™”์–ด.

ํ•ต์‹ฌ ํฌ์ธํŠธ:

  1. SEO: ๊ฐ ์–ธ์–ด๋ณ„๋กœ ๊ณ ์œ ํ•œ URL์ด ์žˆ์–ด์•ผ ๊ฒ€์ƒ‰ ์—”์ง„์ด ๋ชจ๋“  ๋ฒ„์ „์˜ ํŽ˜์ด์ง€๋ฅผ ์ธ๋ฑ์‹ฑํ•  ์ˆ˜ ์žˆ์–ด.
  2. Server-side First: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฒˆ์—ญ ํŒŒ์ผ์„ ๋ฐ›๊ธฐ ์ „์—, ์„œ๋ฒ„์—์„œ ์ด๋ฏธ ๋ฒˆ์—ญ๋œ HTML์„ ๋‚ด๋ ค์ค˜์•ผ ํ•ด.
  3. PPR & Layouts: ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์–ธ์–ด๋งŒ ๊ฐˆ์•„ ๋ผ์šฐ๋Š” ์šฐ์•„ํ•œ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•ด.

๐Ÿ—๏ธ ๋น„์œ ๋กœ ๋จผ์ € ์ดํ•ดํ•˜๊ธฐ

๐Ÿ“– ๋„์„œ๊ด€ ์•ˆ๋‚ด์ฑ…์ž๋กœ ์„ค๋ช…ํ•œ๋‹ค๋ฉด?
๋„์„œ๊ด€ ์ž…๊ตฌ์— ์•ˆ๋‚ด์ฑ…์ž๊ฐ€ ์Œ“์—ฌ์žˆ์–ด.

  1. Client-side I18n: ์ฑ…์ž๋Š” ๋ชจ๋‘ ํ•œ๊ตญ์–ด์ธ๋ฐ, ์„œ์–‘์ธ์ด ์˜ค๋ฉด ๋งˆ์ˆ ์„ ๋ถ€๋ ค์„œ ๋ˆˆ์•ž์—์„œ ๊ธ€์ž๋ฅผ ์˜์–ด๋กœ ๋ฐ”๊พธ๋Š” ๊ฑฐ์•ผ. ๋งˆ์ˆ ์‚ฌ๊ฐ€ ์—†์œผ๋ฉด(JS ๋กœ๋“œ ์ „) ๋ฌด์กฐ๊ฑด ํ•œ๊ตญ์–ด๋งŒ ๋ณด์—ฌ.
  2. App Router I18n: ์ž…๊ตฌ์— 'ํ•œ๊ตญ์–ด ์ž…๊ตฌ', '์˜์–ด ์ž…๊ตฌ'๊ฐ€ ๋”ฐ๋กœ ์žˆ๋Š” ๊ฑฐ์•ผ. ์˜์–ด ์ž…๊ตฌ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์•„์˜ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์˜์–ด๋กœ ๋œ ์ฑ…์ž๋“ค๋งŒ ๋น„์น˜๋˜์–ด ์žˆ์ง€. ์†๋‹˜์ด ๋งˆ์ˆ ์„ ๋ถ€๋ฆด ํ•„์š”๊ฐ€ ์—†์–ด.

๐Ÿ—บ๏ธ App Router์˜ I18n ๊ธฐ๋ณธ ์ฒ ํ•™ ๐ŸŸข

Next.js๋Š” ๋‚ด์žฅ๋œ I18n ์‹œ์Šคํ…œ์„ ๊ฐ•์ œํ•˜์ง€ ์•Š์•„. ๋Œ€์‹  ํด๋” ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ผ๊ณ  ๊ถŒ์žฅํ•˜์ง€.

๊ตฌ์กฐ ์˜ˆ์‹œ:

app/
  [lang]/
    layout.tsx
    page.tsx
    about/page.tsx

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์œ ์ €๊ฐ€ /en/about์œผ๋กœ ๋“ค์–ด์™”์„ ๋•Œ lang ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ "en"์œผ๋กœ ์ „๋‹ฌ๋ผ.


๐Ÿ—๏ธ ๋™์  ์‚ฌ์ „(Dict) ๋กœ๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๐ŸŸก

๋ชจ๋“  ์‹ค๋ฌด์šฉ ๊ฐ€์ด๋“œ๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋กœ๋“œ๋ฅผ ์ง€ํ–ฅํ•ด์•ผ ํ•ด.

// lib/get-dictionary.ts
import 'server-only'
 
// โœ… 1. ๊ฐ ์–ธ์–ด๋ณ„ ์‚ฌ์ „ ํŒŒ์ผ์„ ์ •์˜ํ•ด (์‹ค์ œ๋กœ๋Š” public/locales ๋ฐ‘์— ๋‘๋Š” ๊ฒŒ ์ข‹์Œ)
const dictionaries = {
  en: () => import('@/dictionaries/en.json').then((module) => module.default),
  ko: () => import('@/dictionaries/ko.json').then((module) => module.default),
}
 
export const getDictionary = async (lang: 'en' | 'ko') =>
  dictionaries[lang]?.() ?? dictionaries.en() // ํ•ด๋‹น ์–ธ์–ด ์—†์œผ๋ฉด ์˜์–ด๊ฐ€ ๊ธฐ๋ณธ

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

// app/[lang]/page.tsx
import { getDictionary } from '@/lib/get-dictionary'
 
export default async function Page({ params }: { params: { lang: 'en' | 'ko' } }) {
  const { lang } = await params
  const dict = await getDictionary(lang) // โœ… ์„œ๋ฒ„์—์„œ ํ•„์š”ํ•œ ์–ธ์–ด๋งŒ ์™ ๊ฐ€์ ธ์˜ด
 
  return (
    <main>
      <h1>{dict.home.title}</h1>
      <p>{dict.home.description}</p>
    </main>
  )
}

๐Ÿš€ ๋ฏธ๋“ค์›จ์–ด์™€ ์–ธ์–ด ๊ฐ์ง€(Detection) ์ตœ์ ํ™” ๐Ÿ”ด

์œ ์ €๊ฐ€ ๊ทธ๋ƒฅ youngsu.com์œผ๋กœ ๋“ค์–ด์™”์„ ๋•Œ, ๋ธŒ๋ผ์šฐ์ € ์–ธ์–ด ์„ค์ •์„ ์ฝ์–ด์„œ /ko๋‚˜ /en์œผ๋กœ ๋ณด๋‚ด์ค˜์•ผ ํ•ด.

// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
import { match } from '@formatjs/intl-localematcher'
import Negotiator from 'negotiator'
 
const locales = ['ko', 'en']
const defaultLocale = 'ko'
 
function getLocale(request: NextRequest) {
  const headers = { 'accept-language': request.headers.get('accept-language') ?? '' }
  const languages = new Negotiator({ headers }).languages()
  return match(languages, locales, defaultLocale)
}
 
export function middleware(request: NextRequest) {
  const { pathname } = request.nextUrl
 
  // โœ… ์ด๋ฏธ ์–ธ์–ด ๊ฒฝ๋กœ๊ฐ€ ๋ถ™์–ด์žˆ๋Š”์ง€ ํ™•์ธ
  const pathnameHasLocale = locales.some(
    (locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`
  )
 
  if (pathnameHasLocale) return
 
  // โœ… ์–ธ์–ด๊ฐ€ ์—†๋‹ค๋ฉด ๊ฐ์ง€ํ•ด์„œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  const locale = getLocale(request)
  request.nextUrl.pathname = `/${locale}${pathname}`
  return NextResponse.redirect(request.nextUrl)
}
 
export const config = {
  matcher: [
    // โš ๏ธ ์ •์  ์ž์‚ฐ(images, favicon ๋“ฑ)์€ ์ œ์™ธํ•˜๊ณ  ๋ผ์šฐํŠธ๋งŒ ๊ฐ์ง€!
    '/((?!api|_next/static|_next/image|favicon.ico).*)',
  ],
}

๐Ÿ ์ด๋ฒˆ์— ๋ฐฐ์šด ๋‚ด์šฉ ์ด์ •๋ฆฌ

๐Ÿ“‹ I18n ์„ค๊ณ„ ํ•ต์‹ฌ ์›์น™

ํ•ญ๋ชฉ์ „๋žต์ด์œ 
URL ๊ตฌ์กฐ/lang/path (๋™์  ์„ธ๊ทธ๋จผํŠธ)์–ธ์–ด๋ณ„ ๊ณ ์œ  URL ํ™•๋ณด (SEO)
๋ฐ์ดํ„ฐ ๋กœ๋“œimport() (๋™์  ์ž„ํฌํŠธ)ํ•„์š” ์—†๋Š” ์–ธ์–ด ํŒฉ์€ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ์ง€ ์•Š์Œ
์–ธ์–ด ๊ฐ์ง€middleware.ts์œ ์ € ๊ฒฝํ—˜(UX) ์ตœ์ ํ™” ๋ฐ ์ž๋™ ์ „ํ™˜

โš ๏ธ ์ ˆ๋Œ€ ํ•˜์ง€ ๋ง ๊ฒƒ

์ƒํ™ฉโŒ ๋‚˜์œ ์˜ˆโœ… ์ข‹์€ ์˜ˆ
์–ธ์–ด ์ €์žฅlocalStorage๋งŒ ์‚ฌ์šฉURL ๊ฒฝ๋กœ([lang])๋ฅผ ์ง„์‹ค์˜ ๊ทผ์›์œผ๋กœ ์‚ฌ์šฉ
๋ฒˆ์—ญ ๋กœ๋“œํด๋ผ์ด์–ธํŠธ์—์„œ ๊ฑฐ๋Œ€ํ•œ JSON ํ†ต์งธ๋กœ fetch์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์‚ฌ์ „ ๋กœ๋“œ
SEO?lang=en ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ์‚ฌ์šฉ/en ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์‚ฌ์šฉ

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. App Router i18n์—์„œ /ko, /en ๊ฐ™์€ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ locale์„ ์“ฐ๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

โœ… ์ •๋‹ต: ์–ธ์–ด๋ณ„ ํŽ˜์ด์ง€๊ฐ€ ๊ณ ์œ  URL์„ ๊ฐ€์ ธ SEO, ๊ณต์œ , ์บ์‹ฑ, ๋ผ์šฐํŒ… ํŒ๋‹จ์ด ๋ช…ํ™•ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค: localStorage์— ์–ธ์–ด๋งŒ ์ €์žฅํ•˜๋ฉด ๊ฒ€์ƒ‰ ์—”์ง„๊ณผ ๊ณต์œ  ๋งํฌ๋Š” ์–ด๋–ค ์–ธ์–ด ๋ฌธ์„œ์ธ์ง€ ์•Œ๊ธฐ ์–ด๋ ต๋‹ค. URL์— locale์ด ์žˆ์œผ๋ฉด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์ „์„ ๊ณ ๋ฅด๊ณ , hreflang ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.


Q2. ๋ฒˆ์—ญ ์‚ฌ์ „์„ server-only๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

โœ… ์ •๋‹ต: ํฐ JSON ์‚ฌ์ „๊ณผ ์„œ๋ฒ„ ์ „์šฉ ๋กœ์ง์ด ํด๋ผ์ด์–ธํŠธ ๋ฒˆ๋“ค์— ์„ž์ด๋Š” ์‹ค์ˆ˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„์š”ํ•œ ๋ฒˆ์—ญ ๊ฒฐ๊ณผ๋งŒ HTML๋กœ ๋‚ด๋ ค๋ณด๋‚ด๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ชจ๋“  ์–ธ์–ด ์‚ฌ์ „์„ ๋ฐ›์„ ํ•„์š”๊ฐ€ ์—†๋‹ค. server-only๋Š” ์‹ค์ˆ˜๋กœ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ importํ•  ๋•Œ ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ๋ง‰์•„ ์ฃผ๋Š” ์šธํƒ€๋ฆฌ ์—ญํ• ์„ ํ•œ๋‹ค.


Q3. ์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„: ์˜์ˆ™์ด "ํ•œ๊ตญ์–ด๋Š” ๋‚ ์งœ๊ฐ€ 2026๋…„ 4์›” 30์ผ, ์˜์–ด๋Š” Apr 30, 2026์ฒ˜๋Ÿผ ๋ณด์—ฌ์•ผ ํ•œ๋‹ค"๊ณ  ์š”์ฒญํ–ˆ๋‹ค. ๋‹จ์ˆœ ๋ฒˆ์—ญ ํ‚ค๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ• ๊นŒ?

โœ… ์ •๋‹ต: ๋ถ€์กฑํ•˜๋‹ค. locale๋ณ„ Intl ํฌ๋งท, ํƒ€์ž„์กด, ์ˆซ์ž/ํ†ตํ™” ํ‘œ๊ธฐ๊นŒ์ง€ ๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜ ๊ทœ์น™์œผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค: i18n์€ ํ…์ŠคํŠธ ์น˜ํ™˜์ด๊ณ , localization์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž๊ธฐ ๋ฌธํ™”๊ถŒ์˜ ๊ทœ์น™์œผ๋กœ ์ดํ•ดํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ผ์ด๋‹ค. ๋‚ ์งœ, ํ†ตํ™”, ๋ณต์ˆ˜ํ˜•, ์ •๋ ฌ, RTL ์—ฌ๋ถ€๋Š” ๋ฌธ์ž์—ด ์‚ฌ์ „๋งŒ์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค. URL locale์„ ๊ธฐ์ค€์œผ๋กœ ํฌ๋งทํ„ฐ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊นŒ์ง€ ํ•จ๊ป˜ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

์˜ค๋Š˜์€ ๋‹ค๊ตญ์–ด๋ฅผ "๋ฌธ์ž์—ด ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋‘๋Š” ์ผ"๋กœ๋งŒ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒŒ ๋ถ€๋„๋Ÿฌ์› ๋‹ค. URL, ์„œ๋ฒ„ ์‚ฌ์ „ ๋กœ๋”ฉ, SEO, ๋‚ ์งœ์™€ ํ†ตํ™” ํฌ๋งท๊นŒ์ง€ ์ด์–ด์ ธ์•ผ ์‚ฌ์šฉ์ž๋Š” ์ง„์งœ ์ž๊ธฐ ์–ธ์–ด์˜ ์„œ๋น„์Šค๋ผ๊ณ  ๋А๋‚€๋‹ค.

๐Ÿ’ก "๊ธ€์ž๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฑด ๋ฒˆ์—ญ์ด๊ณ , ์‚ฌ์šฉ์ž์˜ ๋งฅ๋ฝ์— ๋งž์ถ”๋Š” ๊ฑด ๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜์ด๋‹ค."

๋‹ค์Œ i18n ์ž‘์—…์—์„œ๋Š” ๋จผ์ € locale์ด ๋ผ์šฐํŒ…์˜ ์ผ๋ถ€์ธ์ง€ ํ™•์ธํ•˜๊ฒ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒˆ์—ญ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” PR์—์„œ๋„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ๋‚ ์งœ/์ˆซ์ž ํฌ๋งท, ๋ˆ„๋ฝ ํ‚ค fallback์ด ํ•จ๊ป˜ ๊ฒ€์ฆ๋˜๋Š”์ง€ ์ฒดํฌํ•˜๊ฒ ๋‹ค.

๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ