ํ๋ก๋์ ๊น์ง ์ํฉ ์๋ Vue 3 i18n ์ํฌํ๋ก์ฐ (500+ ํค)
๋๊ท๋ชจ ์ฑ์ ์ํ ์ค์ฉ์ ์ธ Vue 3 i18n ์ํฌํ๋ก์ฐ: ํค ๋ค์ด๋ฐ, ๋ณต์ํ, QA ์ฒดํฌ, ๋ฆด๋ฆฌ์ค ๋จ๊ณ๋ก ํ๋ก๋์ ์์ ๋ฒ์ญ ๋๋ฝ์ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ.

500๊ฐ๊ฐ ๋๋ i18n ํค์์ ๋ฌด์์ด ์๋ชป๋๋๊ฐ
์ฑ์ ์๋ฐฑ ๊ฐ์ ๋ฌธ์์ด์ด ๋์ด๊ฐ๋ฉด ์ฒ์์ ๊นจ์ง๋ ๊ฒ์ ๋ณดํต Vue I18n ์์ฒด๊ฐ ์๋๋๋ค. ์ผ๊ด์ฑ์ด ๊นจ์ง๋๋ค. ์ฌ๋๋ค์ด ์๋ก ๋ค๋ฅธ ์คํ์ผ๋ก ํค๋ฅผ ์ถ๊ฐํ๊ณ , ๊ฐ์ ์๋ฏธ๋ฅผ ์ค๋ณตํด์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ง๋ค๊ณ , ์ด๋ค ๋ฉ์์ง๋ฅผ ์ญ์ ํด๋ ๋๋์ง ์๋ฌด๋ ํ์ ํ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค.
๋ฒ์ญ ๋๋ฝ๋ ๋๋ฌผ์ง ์๊ฒ ๋ฉ๋๋ค. ์ค์ , ์ค๋ฅ ์ํ, ๋น ์ํ, ์๋ฆผ์ฒ๋ผ ์ ์ฌ์ฉ๋์ง ์๋ ํ๋ฉด์์ ์ผ๋ฐ ์ฌ์ฉ์ ๊ฒฝ๋ก์ ๋ํ๋ฉ๋๋ค.
๋ฒ์ญ์ด ์์ ๋ ์ฌ์ฉ์๊ฐ ๋ณด๊ฒ ๋๋ ์คํจ๋ ๋ณดํต ์ธ ๊ฐ์ง์
๋๋ค: ๋น UI(๋ ์ด๋ธ ์๋ ๋ฒํผ), ์์ ํค(์: checkout.pay_now), ๋๋ ํ์ด์ง ์ผ๋ถ๊ฐ ๋ค๋ฅธ ์ธ์ด๋ก ๋ฐ๋๋ ์ด์ํ ํด๋ฐฑ. ์ด๋ ์ชฝ๋ ์์ ๋ฒ๊ทธ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ์ฑ์ด ๊นจ์ง ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํฉ๋๋ค.
๊ทธ๋์ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค Vue 3 i18n ์ํฌํ๋ก์ฐ๊ฐ ๋ ์ค์ํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ฒญํ ๋๋ก ๋์ํฉ๋๋ค. ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ํ๋ค์ด "์๋ฃ"์ ๊ธฐ์ค์ ํฉ์ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
ํํ ์: ๊ฐ๋ฐ์๊ฐ 40๊ฐ์ ์ ๋ฌธ์์ด์ ํฌํจํ "๋๋ฃ ์ด๋" ํ๋ฆ์ ๋ฐฐํฌํฉ๋๋ค. ์์ด ํ์ผ๋ง ์ ๋ฐ์ดํธ๋๊ณ ํ๋์ค์ด ํ์ผ์ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค. ์คํ ์ด์ง์์๋ ํ ์คํฐ๊ฐ ์์ด๋ฅผ ์ฐ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ ์์ผ๋ก ๋ณด์ ๋๋ค. ํ๋ก๋์ ์์๋ ํ๋์ค์ด ์ฌ์ฉ์๊ฐ ๋ฒ์ญ๋ UI์ ๋ฒ์ญ๋์ง ์์ UI๊ฐ ์์ธ ํ๋ฉด์ ๋ณด๊ฒ ๋๊ณ , ์ง์ํ์๋ ์์ ํค ์คํฌ๋ฆฐ์ท์ด ์ฌ๋ผ์ต๋๋ค.
ํด๊ฒฐ์ฑ ์ ๋ฒ์ญ๋ UI์ ๋ํด "์๋ฃ"๊ฐ ๋ฌด์์ธ์ง ์ ์ํ๋ ๊ฒ์ ๋๋ค. ๋จ์ํ "๋ฌธ์์ด์ด ์ถ๊ฐ๋์๋ค"๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ํ์ค์ ์ธ ์๋ฃ ์ ์์๋ ๋ณดํต ๋ค์์ด ํฌํจ๋ฉ๋๋ค: ํค๊ฐ ๋ค์ด๋ฐ ๊ท์น์ ๋ฐ๋ฅด๊ณ ๋ก์ผ์ผ ๋น๋์์ missing-key ๊ฒฝ๊ณ ๊ฐ ์๊ณ , ๋ณต์ํ๊ณผ ๋ณ์๋ค์ด ์ค์ ๋ฐ์ดํฐ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋๋ฉฐ, ์ต์ ํ๋ ์ด์์ ๋น๊ธฐ๋ณธ ๋ก์ผ์ผ์ด ์ฒดํฌ๋๊ณ , ์นดํผ ๋ณ๊ฒฝ์ด ์ถ์ ๋์ด ์ค๋๋ ํค๊ฐ ๋จ์ง ์๋๋ก ํ๋ ๊ฒ.
500๊ฐ๊ฐ ๋์ผ๋ฉด ๋ก์ปฌ๋ผ์ด์ ์ด์ ์ ๋ง๋ฐ์ง ํ์ผ ํธ์ง์ด ์๋๋ผ ๋ฆด๋ฆฌ์ค ํ๋ก์ธ์ค๋ก ๋ค๋ฃจ๋ ์ชฝ์ด ์ด๊น๋๋ค.
๋ฌธ์์ด์ ๋ ์ถ๊ฐํ๊ธฐ ์ ์ ๋ช ๊ฐ์ง ๊ท์น์ ์ ํ๋ผ
์๋ฐฑ ๊ฐ์ ๋ฌธ์์ด์ด ๋์ด๊ฐ๋ฉด ๋ฒ์ญ ์์ ์์ฒด๋ ํฐ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์ผ๊ด์ฑ์ด ๋ฌธ์ ์ ๋๋ค. ์๊ท๋ชจ ๊ท์น ์ธํธ๋ ์ฌ๋ฌ ์ฌ๋์ด ๋งค์ฃผ ์นดํผ๋ฅผ ๊ฑด๋๋ ค๋ Vue 3 i18n ์ํฌํ๋ก์ฐ๋ฅผ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
๋จผ์ โ๊ฐ๋
โ์ด ๋ฌด์์ธ์ง ์ ์ํ๊ณ ๊ทธ ๊ฐ๋
์ ๋ํด ํ๋์ ์ง์ค ์์ค(source of truth)๋ฅผ ์ ์งํ์ธ์. ๊ฐ์ UI ์์ด๋์ด๊ฐ ๋ค์ฏ ๊ณณ์ ๋์จ๋ค๋ฉด(์: โ๋ณ๊ฒฝ ์ฌํญ ์ ์ฅโ) ํ๋์ ํค๋ฅผ ์ํฉ๋๋ค. save, saveChanges, save_update, saveBtn ๊ฐ์ ๋ค์ฏ ๊ฐ์ง ๋ณํ์ด ์๋ ํ๋์ ํค๋ฅผ ์ฌ์ฉํ์ธ์. ์ค๋ณต ํค๋ ์๊ฐ์ด ์ง๋๋ฉฐ ์๋ฏธ๊ฐ ํ๋ ค์ง๊ณ ์ฌ์ฉ์ ๊ฒฝํ์์ ์ผ๊ด์ฑ์ด ์ฌ๋ผ์ง๋๋ค.
๋ค์์ผ๋ก ํฌ๋งทํ ์ ์์น๋ฅผ ๊ฒฐ์ ํ์ธ์. ํ์ ์ค์๋ก ์ด๋ฅผ ๋๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค: ์ด๋ค ๋ฉ์์ง๋ ๋ฌธ์ฅ ๋ถํธ์ ๋์๋ฌธ์๊น์ง ํฌํจํ๊ณ , ๋ค๋ฅธ ๋ฉ์์ง๋ ์ฝ๋๊ฐ ์ถ๊ฐํฉ๋๋ค. ํ ๊ฐ์ง ์ ๊ทผ์ ์ ํํ๊ณ ์งํค์ธ์.
์ค์ฉ์ ์ธ ๊ธฐ๋ณธ ๊ท์น:
- ๋ฌธ๋ฒ, ๋ฌธ์ฅ๋ถํธ, ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ํฌ๋งท(์: โ(์ ํ ์ฌํญ)โ)์ ๋ฉ์์ง์ ๋ฃ์ผ์ธ์.
- ์์ํ ๋ฐ์ดํฐ ํฌ๋งท(๋ ์ง, ํตํ, ๋จ์)์ ์ฝ๋์์ ์ฒ๋ฆฌํ ๋ค์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ i18n์ ์ ๋ฌํ์ธ์.
- ์ด๋ฆ๊ณผ ์๋ ๊ฐ์ ๊ฐ๋ณ ๋ถ๋ถ์ ๋ฌธ์์ด ๊ฒฐํฉ์ด ์๋๋ผ ํ๋ ์ด์คํ๋๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋ฉ์์ง์ HTML์ ๋ฃ๋ ๊ฒ์ ํน์ ์ฌ๋ก๋ก ๋ช ํํ ๊ท์น(ํ์ฉ ์ฌ๋ถ)์ ์ ํ์ธ์.
๊ทธ๋ค์ ์์ ๊ถ์ ์ ์ํ์ธ์. ๋๊ฐ ์ ํค๋ฅผ ์ถ๊ฐํ ์ ์๋์ง, ๋๊ฐ ๊ธฐ๋ณธ ์ธ์ด ์นดํผ๋ฅผ ๊ฒํ ํ๋์ง, ๋๊ฐ ๋ค๋ฅธ ๋ก์ผ์ผ์ ์น์ธํ๋์ง ๊ฒฐ์ ํ์ธ์. ์ด๊ฒ์ด ์์ผ๋ฉด ๋ฌธ์์ด์ด ๊ธํ๊ฒ ์ถ๊ฐ๋๊ณ ๊ฒํ ๋์ง ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ํด๋ฐฑ ์ ๋ต์ ์ ํํ๊ณ ๋ฌธ์ํํ์ธ์. ํค๊ฐ ์์ ๋ ์ฌ์ฉ์๊ฐ ๋ฌด์์ ๋ณด์์ผ ํ ๊น์: ํค ์ด๋ฆ, ๊ธฐ๋ณธ ๋ก์ผ์ผ ํ ์คํธ, ์๋๋ฉด ์์ ํ ์ผ๋ฐ ๋ฉ์์ง? ํ๋ก๋์ ์์๋ ๋ง์ ํ์ด ๊ธฐ๋ณธ ๋ก์ผ์ผ๋ก ํด๋ฐฑํ๊ณ ๋ก๊น ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ ์ ํธํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ฐจ๋จ๋์ง ์๊ณ ๋ฌธ์ ๋ฅผ ์ ์ ์๋ ์ ํธ๋ฅผ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
AppMaster ๊ฐ์ ์ ๋๋ ์ดํฐ(AppMaster (appmaster.io))๋ก Vue 3 ์ฑ์ ๋ง๋ ๋ค๋ฉด ์ด ๊ท์น๋ค์ ์ฌ์ ํ ์ ์ฉ๋ฉ๋๋ค. ๋ฒ์ญ์ "๊ทธ๋ฅ ๊ฐ๋ฐ ํ ์คํธ"๋ก ๋ณด์ง ๋ง๊ณ ์ ํ ์ฝํ ์ธ ๋ก ๋ค๋ฃจ๋ฉด ๋๋ถ๋ถ์ ๋ฆ์ ๊น์ง ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ต๋๋ค.
์ฝ๊ธฐ ์ฌ์ด ํค ๋ค์ด๋ฐ ๊ท์น
์๋ฐฑ ๊ฐ ์ด์์ ๋ฌธ์์ด์์๋ ์ผ๊ด์ฑ์ด ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํ ๊ฐ์ง ํค ์คํ์ผ์ ์ ํํ์ธ์(๋๋ถ๋ถ ํ์ billing.invoice.title ๊ฐ์ ์ (dot) ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค) ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๊ท์น์ผ๋ก ๋ง๋์ธ์. ์ , ์ฌ๋์, snake_case, ์์์ ์บ์ฑ์ ํผํฉํ๋ฉด ๊ฒ์๊ณผ ๋ฆฌ๋ทฐ๊ฐ ๋๋ ค์ง๋๋ค.
์นดํผ ๋ณ๊ฒฝ์ ๊ฒฌ๋ ์ ์๋ ์์ ์ ์ธ ํค๋ฅผ ์ฌ์ฉํ์ธ์. "Please enter your email" ๊ฐ์ ํค๋ ๋ง์ผํ
์ด ๋ฌธ์ฅ์ ์กฐ๊ธ ๋ฐ๊พธ๋ ์๊ฐ ๊นจ์ง๋๋ค. auth.email.required๋ auth.email.invalid์ฒ๋ผ ์๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ด๋ฆ์ ์ ํธํ์ธ์.
๋จผ์ ์ ํ ์์ญ์ด๋ UI ํ๋ฉด์ผ๋ก ํค๋ฅผ ๊ทธ๋ฃนํํ๊ณ ๊ทธ๋ค์ ๋ชฉ์ ๋ณ๋ก ๋๋์ธ์. ์ด๋ฏธ ์ฑ์ด ๊ฐ์ง ์นดํ
๊ณ ๋ฆฌ๋ก ์๊ฐํ์ธ์: auth, billing, settings, support, dashboard. ์ด๋ ๊ฒ ํ๋ฉด ๋ก์ผ์ผ ํ์ผ์ ์ค์บํ๊ธฐ ์ฌ์์ง๊ณ , ๋ ํ๋ฉด์์ ๊ฐ์ ์์ด๋์ด๊ฐ ํ์ํ ๋ ์ค๋ณต์ ์ค์ผ ์ ์์ต๋๋ค.
๊ฐ ์์ญ ๋ด์์ ๊ณตํต UI ์์์ ๋ํด ์์ ํจํด ์งํฉ์ ์ ์งํ์ธ์:
- ๋ฒํผ:
*.actions.save,*.actions.cancel - ๋ ์ด๋ธ:
*.fields.email.label,*.fields.password.label - ํํธ/๋์๋ง ํ
์คํธ:
*.fields.email.hint - ์๋ฌ/๊ฒ์ฆ:
*.errors.required,*.errors.invalidFormat - ์๋ฆผ/ํ ์คํธ:
*.notices.saved,*.notices.failed
๋์ ๋ฉ์์ง๋ ๋ฌด์์ด ๋ฐ๋๋์ง๋ฅผ ๋งํด์ผ์ง ์ด๋ป๊ฒ ๋ฐ๋๋์ง๋ฅผ ๋งํ๋ฉด ์ ๋ฉ๋๋ค. ๋ณ์ ๋ถ๋ถ์ ํ๋ผ๋ฏธํฐ๋ก ์ฒ๋ฆฌํ๊ณ ๋ฉ์์ง ์ด๋ฆ์ ์๋๋ก ๋ช
๋ช
ํ์ธ์. ์: billing.invoice.dueInDays์ {days}๋ฅผ ์ฐ๋ ๊ฒ์ด billing.invoice.dueIn3Days๋ณด๋ค ๋ช
ํํฉ๋๋ค.
์์(์ด ๋ฐฉ์์ Vue 3 i18n ์ํฌํ๋ก์ฐ์ ์ ๋ง์ต๋๋ค): orders.summary.itemsCount์ {count}๋ก ์๋์, orders.summary.total์ {amount}๋ก ๊ธ์ก์ ๋ฃ์ต๋๋ค. ์ฝ๋์์ ํค๋ฅผ ๋ณด๋ฉด ํด๋น ํค๊ฐ ์ด๋์ ์ํ๋์ง, ์ ์กด์ฌํ๋์ง ์ ์ ์์ด์ผ ํฉ๋๋ค. ์ต์ข
๋ฌธ๊ตฌ๊ฐ ๋ฐ๋๋๋ผ๋ ์๋ฏธ๊ฐ ์ ์ง๋์ด์ผ ํฉ๋๋ค.
์๊ธฐ์น ์์ ๋ณต์ํ ๊ท์น๊ณผ ๋ฉ์์ง ํฌ๋งทํ ๋ฐฉ์ง
์์ด์ฒ๋ผ ๋ชจ๋ ์ธ์ด๋ฅผ ์ทจ๊ธํ๋ฉด ๋ณต์ํ ํ ์คํธ๋ ์กฐ์ฉํ ๊นจ์ง๋๋ค. ์ธ์ ICU ๋ฉ์์ง ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ง, ์ธ์ ๋จ์ ํ๋ ์ด์คํ๋๋ก ์ถฉ๋ถํ ์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ์ธ์.
๋ผ๋ฒจ์ด๋ ์ซ์์ ๋ฐ๋ผ ๋ฐ๋์ง ์๋ ์งง์ UI ํ
์คํธ์๋ ๋จ์ ์นํ์ ์ฌ์ฉํ์ธ์(์: Welcome, {name}). ์ซ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ฒ์ ICU ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ธ์. ICU๋ ๋ชจ๋ ํํ๋ฅผ ํ ๊ณณ์ ๋ชจ์ ๊ท์น์ ๋ช
ํํ ํด์ค๋๋ค.
{
"notifications.count": "{count, plural, =0 {No notifications} one {# notification} other {# notifications}}"
}
๋ฒ์ญํ๊ธฐ ์ฌ์ด ๋ฐฉ์์ผ๋ก ์นด์ดํธ ๋ฉ์์ง๋ฅผ ์์ฑํ์ธ์. ์ ์ฒด ๋ฌธ์ฅ์ ์ ํธํ๊ณ ์ซ์ ํ๋ ์ด์คํ๋(#)๋ฅผ ๋ช
์ฌ ๊ทผ์ฒ์ ๋์ธ์. "1 ํญ๋ชฉ"๊ณผ "2 ํญ๋ชฉ"์ ๊ฐ์ ํค๋ก ์ฌ์ฌ์ฉํ๋ ์์ ํธ๋ฆญ์ ํผํ์ธ์. ๋ฒ์ญ์๋ ์ ์ฒด ๋ฉ์์ง๋ฅผ ๋ณด๊ณ ๋ฒ์ญํด์ผ์ง ์ด๋ป๊ฒ ์ด์ด๋ถ์ผ์ง ์ถ์ธกํ๋ฉด ์ ๋ฉ๋๋ค.
์ต์ํ =0, one, other๋ฅผ ๊ณํํ๊ณ 0์ ๋ํด ํ์ด ์ด๋ค ์คํ์ผ์ ์ํ๋์ง ๋ฌธ์ํํ์ธ์. ์ด๋ค ์ ํ์ "0 items"๋ฅผ ์ํ๊ณ ๋ค๋ฅธ ์ ํ์ "No items"๋ฅผ ์ํฉ๋๋ค. ํ๋์ ์คํ์ผ์ ์ ํ๊ณ ์ง์ผ์ UI์ ์ผ๊ด์ฑ์ ์ ์งํ์ธ์.
๋ํ ๊ธฐ๋๋ณด๋ค ๋ ๋ง์ ๋ณต์ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๊ฐ์ง ์ธ์ด๊ฐ ์๋ค๋ ์ ์ ์ฃผ์ํ์ธ์. ๋ง์ ์ธ์ด๊ฐ ๋จ์ํ "one vs many"๋ฅผ ๋ฐ๋ฅด์ง ์์ต๋๋ค. ๋์ค์ ์๋ก์ด ๋ก์ผ์ผ์ ์ถ๊ฐํ๋ฉด one๊ณผ other๋ง ์๋ ๋ฉ์์ง๋ ๋ฌธ๋ฒ์ ์ผ๋ก ํ๋ฆด ์ ์์ต๋๋ค.
๋ฐฐํฌ ์ ์ UI์์ ์ค์ ์นด์ดํธ๋ก ๋ณต์๋ฅผ ํ ์คํธํ์ธ์. JSON๋ง ๋ณด๋ ๊ฒ์ด ์๋๋ผ ํ๋ฉด์์ 0, 1, 2, 5, 21 ๊ฐ์ด ๊ฒ์ฌํ๋ ๊ฐ๋จํ ์ฒดํฌ๊ฐ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ฅผ ์ก์๋ ๋๋ค.
Vue3 ์น ์ฑ์ ๊ตฌ์ถํ๋ค๋ฉด(์: AppMaster ์์์) ์ด ํ ์คํธ๋ฅผ ์ค์ ํ ์คํธ๊ฐ ํ์๋๋ ํ๋ฉด์์ ํ์ธ์. ๋ ์ด์์ ๋ฌธ์ , ๊ธ์ ์๋ฆผ, ์ด์ํ ๋ฌธ์ฅ ๊ตฌ์ฑ์ด ๊ทธ๊ณณ์์ ๋จผ์ ๋๋ฌ๋ฉ๋๋ค.
์ฑ์ฅ์ ๋ง์ถ ๋ก์ผ์ผ ํ์ผ ๊ตฌ์ฑ
์๋ฐฑ ๊ฐ์ ๋ฌธ์์ด์ด ๋์ด๊ฐ๋ฉด ํ๋์ ํฐ en.json์ด ๋ณ๋ชฉ์ด ๋ฉ๋๋ค. ์ฌ๋ฌ ์ฌ๋์ด ๊ฐ์ ํ์ผ์ ๊ฑด๋๋ฆฌ๋ฉด ๋จธ์ง ์ถฉ๋์ด ๋๊ณ ์นดํผ๊ฐ ์ด๋์ ์๋์ง ์ถ์ ํ๊ธฐ ์ด๋ ค์์ง๋๋ค. ์ข์ ๊ตฌ์กฐ๋ ์ ํ์ด ๋ฐ๋์ด๋ Vue 3 i18n ์ํฌํ๋ก์ฐ๋ฅผ ์์ ์ ์ผ๋ก ์ ์งํฉ๋๋ค.
๊ถ์ฅ ๊ตฌ์กฐ
2~5๊ฐ ๋ก์ผ์ผ์๋ ๊ธฐ๋ฅ๋ณ ๋ถ๋ฆฌ๊ฐ ๋ณดํต ์ถฉ๋ถํฉ๋๋ค. ๋ชจ๋ ๋ก์ผ์ผ์์ ๋์ผํ ํ์ผ ๊ตฌ์กฐ๋ฅผ ์ ์งํ์ฌ ํค ์ถ๊ฐ๊ฐ ์์ธก ๊ฐ๋ฅํ ํธ์ง์ด ๋๊ฒ ํ์ธ์.
locales/en/common.json,locales/en/auth.json,locales/en/billing.jsonlocales/es/common.json,locales/es/auth.json,locales/es/billing.jsonlocales/index.ts(๋ฉ์์ง๋ฅผ ๋ก๋ํ๊ณ ๋ณํฉ)
20๊ฐ ์ด์์ ๋ก์ผ์ผ์๋ ๊ฐ์ ์์ด๋์ด๋ฅผ ํ์ฅํ๋ ๋๋ฆฌํํธ๊ฐ ์ผ์ด๋๊ธฐ ์ด๋ ต๊ฒ ๋ง๋์ธ์. ์์ด๋ฅผ ์ง์ค์ ์์ค(source of truth)๋ก ์ผ๊ณ ๋ชจ๋ ๋ก์ผ์ผ์ด ๋์ผํ ํด๋์ ํ์ผ ์ด๋ฆ์ ๋ฏธ๋ฌ๋งํ๋๋ก ๊ฐ์ ํ์ธ์. ์๋ก์ด ๋๋ฉ์ธ(์: notifications)์ด ๋ํ๋๋ฉด ๋ชจ๋ ๋ก์ผ์ผ์ ๊ทธ ํ์ผ์ด ์์ด์ผ ํฉ๋๋ค. ์์ ํ
์คํธ๋ผ๋ ๊ตฌ์กฐ๊ฐ ๊ฐ์์ผ ์์ธก ๊ฐ๋ฅ์ฑ์ด ์ ์ง๋ฉ๋๋ค.
๋๋ฉ์ธ๋ณ ๋ถ๋ฆฌ๋ ๋ ์ฌ๋์ด ์๋ก ๋ค๋ฅธ ํ์ผ์ ๋ฌธ์์ด์ ์ถ๊ฐํ๋ฉด ์ถฉ๋์ด ์ค์ด๋ญ๋๋ค. ๋๋ฉ์ธ์ ์ฑ์ด ๊ตฌ์ฑ๋ ๋ฐฉ์๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค: common, navigation, errors, settings, reports, ๊ทธ๋ฆฌ๊ณ ํฐ ์์ญ์ ํผ์ฒ ํด๋๋ก ๋ถ๋ฆฌํ์ธ์.
ํค ์ผ๊ด์ฑ ์ ์ง
๊ฐ ํ์ผ ๋ด์์๋ ๋ก์ผ์ผ ์ ๋ฐ์ ๊ฑธ์ณ ๋์ผํ ํค ๋ชจ์์ ์ ์งํ์ธ์: ๊ฐ์ ๋ค์คํ
, ๊ฐ์ ํค ์ด๋ฆ, ๋ค๋ฅธ ํ
์คํธ. ์ธ์ด๋ณ๋ก ์ฐฝ์์ ์ธ ํค๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์. ์์ด์ billing.invoice.status.paid๊ฐ ํ์ํ๋ฉด ๋ชจ๋ ๋ก์ผ์ผ์ ๋์ผํ ํค๊ฐ ์์ด์ผ ํฉ๋๋ค.
์ง์ ์ผ๋ก ๋ฐ๋ณต๋๋ ๊ฒ๋ง ์ค์ํํ์ธ์: ๋ฒํผ ๋ผ๋ฒจ, ์ผ๋ฐ ๊ฒ์ฆ ์๋ฌ, ๊ธ๋ก๋ฒ ๋ด๋น๊ฒ์ด์
๊ฐ์ ๊ฒ๋ค์
๋๋ค. ๊ธฐ๋ฅ๋ณ ์นดํผ๋ ํด๋น ๊ธฐ๋ฅ ๋๋ฉ์ธ ๊ฐ๊น์ด์ ๋์ธ์. ์: "Save"๋ common์, "Save payment method"๋ billing์ ๋ก๋๋ค.
์ฅ๋ฌธ์ ์ฝํ ์ธ
๊ธด ๋์๋ง ํ ์คํธ, ์จ๋ณด๋ฉ ๋จ๊ณ, ์ด๋ฉ์ผ ํ ํ๋ฆฟ์ ๋นจ๋ฆฌ ์ง์ ๋ถํด์ง๋๋ค. ๋ช ๊ฐ์ง ๊ท์น์ด ๋์์ด ๋ฉ๋๋ค:
- ์ฅ๋ฌธ์ ๋ณ๋์ ๋๋ฉ์ธ(์:
help๋๋onboarding)์ ๋๊ณ ๊น์ ๋ค์คํ ์ ํผํ์ธ์. - ๋ฒ์ญ์๊ฐ ์์ ํ๊ฒ ์์ ํ ์ ์๋๋ก ๊ธด ๋ฌธ๋จ ํ๋๋ณด๋ค๋ ์งง์ ๋ฌธ๋จ์ ์ ํธํ์ธ์.
- ๋ง์ผํ ์ด๋ ์ง์ํ์ด ์์ฃผ ํธ์งํ๋ ํ ์คํธ๋ ์ ์ฉ ํ์ผ์ ๋์ด ๋ค๋ฅธ ๊ณณ์ ๋ณ๊ฒฝ์ ์ค์ด์ธ์.
- ์ด๋ฉ์ผ์ ์ ๋ชฉ(subject)๊ณผ ๋ณธ๋ฌธ(body)์ ๋ถ๋ฆฌํด์ ์ ์ฅํ๊ณ ํ๋ ์ด์คํ๋(์ด๋ฆ, ๋ ์ง, ๊ธ์ก)๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ์ธ์.
์ด๋ฐ ์ค์ ์ ๋ณ๊ฒฝ ๊ฒํ , ๋ฒ์ญ ์์ , ๋ฆด๋ฆฌ์ค ์ง์ ์ ๊น์ง ๋๋ฝ ๋ฐฉ์ง์ ๋์์ด ๋ฉ๋๋ค.
๋ฌธ์์ด ์ถ๊ฐ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํ ๋จ๊ณ๋ณ ์ํฌํ๋ก์ฐ
์์ ์ ์ธ Vue 3 i18n ์ํฌํ๋ก์ฐ๋ ๋๊ตฌ๋ณด๋ค ๋งค๋ฒ ๊ฐ์ ์์ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ์ ๊ฐ๊น์ต๋๋ค. ์ UI ํ ์คํธ๋ ํค, ๊ธฐ๋ณธ ๋ฉ์์ง, ๋ช ํํ ๋ฒ์ญ ์ํ ์์ด ํ๋ก๋์ ์ ๋๋ฌํด์๋ ์ ๋ฉ๋๋ค.
๋จผ์ ๊ธฐ๋ณธ ๋ก์ผ์ผ(๋ณดํต en)์ ํค๋ฅผ ์ถ๊ฐํ์ธ์. ๊ธฐ๋ณธ ํ
์คํธ๋ ์ค์ ์นดํผ์ฒ๋ผ ์์ฑํ๊ณ ์๋ฆฌํ์์์ฒ๋ผ ๋์ง ๋ง์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ํ๋ก๋ํธ์ QA๊ฐ ์ฝ์ด์ ๊ฒํ ํ ์ ์๊ณ ๋์ค์ "๋ฏธ์คํฐ๋ฆฌ ๋ฌธ์์ด"์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ปดํฌ๋ํธ์์ ํค๋ฅผ ์ฌ์ฉํ ๋๋ ์ฒ์๋ถํฐ ํ๋ผ๋ฏธํฐ์ ๋ณต์ ๋ก์ง์ ํฌํจํด ๋ฒ์ญ์๊ฐ ๋ฉ์์ง์ ์ ์ฒด ํํ๋ฅผ ๋ณผ ์ ์๊ฒ ํ์ธ์.
// simple param
$t('billing.invoiceDue', { date: formattedDate })
// plural
$t('files.selected', count, { count })
๋ฒ์ญ์ด ์ค๋น๋์ง ์์๋ค๋ฉด ํค๋ฅผ ๋น์๋์ง ๋ง์ธ์. ๋ค๋ฅธ ๋ก์ผ์ผ์ ์๋ฆฌํ์์ ๋ฒ์ญ์ ์ถ๊ฐํ๊ฑฐ๋ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๋ฏธ์๋ฃ(TODO: ์ ๋์ฌ ๋ฑ)๋ก ํ์ํ์ธ์. ์ค์ํ ๊ฒ์ ์ฑ์ด ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ ๋๋ง๋๊ณ ๋ฆฌ๋ทฐ์ด๊ฐ ๋ฏธ์๋ฃ ์นดํผ๋ฅผ ์ฝ๊ฒ ์๋ณํ ์ ์์ด์ผ ํ๋ค๋ ์ ์
๋๋ค.
๋จธ์ง ์ ์ ๋น ๋ฅธ ์๋ํ ๊ฒ์ฌ๋ค์ ์คํํ์ธ์. ์ด ๊ฒ์ฌ๋ค์ ์ง๋ฃจํ๊ณ ์๊ฒฉํด์ผ ํฉ๋๋ค: ๋ก์ผ์ผ ๊ฐ ๋๋ฝ๋ ํค, ์ฌ์ฉ๋์ง ์๋ ํค, ํ๋ ์ด์คํ๋ ๋ถ์ผ์น(์: {count}๋ {date} ๋๋ฝ ๋๋ ์๋ชป๋ ์ค๊ดํธ), ์ง์๋๋ ์ธ์ด์ ๋ง์ง ์๋ ๋ณต์ํ, ์ฐ๋ฐ์ ์ค๋ฒ๋ผ์ด๋ ๋ฑ์ ๊ฒ์ฌํ์ธ์.
๋ง์ง๋ง์ผ๋ก ์ต์ ํ๋์ ๋น๊ธฐ๋ณธ ๋ก์ผ์ผ์์ ์งง์ UI ๊ฒ์ฌ๋ฅผ ํ์ธ์. ๋ฌธ์์ด์ด ๊ธด ์ธ์ด(์ข ์ข ๋ ์ผ์ด ๋๋ ํ๋์ค์ด)๋ฅผ ์ ํํด ์ค๋ฒํ๋ก์ฐ, ์๋ฆฌ๋ ๋ฒํผ, ์ด์ํ ์ค๋ฐ๊ฟ์ ์ก์๋ด์ธ์. Vue 3 UI๊ฐ ์ ๋๋ ์ดํฐ๋ก ์์ฑ๋๊ฑฐ๋ ์ ํ์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ ํจ๊ป ์ ์ง๋๋ค๋ฉด(์: Vue3 ์น ์ฑ์ AppMaster๋ก ๋ง๋ ๊ฒฝ์ฐ) ์ด ๋จ๊ณ๋ ๋ ์ด์์์ด ๊ธฐ๋ฅ ๋ณํ์ ๋ฐ๋ผ ๋ฐ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ์ค์ํฉ๋๋ค.
์ด ๋จ๊ณ๋ฅผ ๋ชจ๋ ํ ์คํธ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์๋ฃ ์ ์๋ก ๋ค๋ฃจ์ธ์.
ํ๋ค์ด ๋ฐ๋ณตํ๋ ํํ ์ค์
๋ก์ปฌ๋ผ์ด์ ์ด์ ์ ๊ณ ํต์ค๋ฝ๊ฒ ๋ง๋๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ i18n ํค๋ฅผ "๊ทธ์ ๋ฌธ์์ด"๋ก ์ทจ๊ธํ๋ ๊ฒ์ ๋๋ค. ์๋ฐฑ ๊ฐ์ ํค๊ฐ ์์ด๋ฉด ์์ ์ต๊ด๋ค์ด ํ๋ก๋์ ๋ฒ๊ทธ๋ก ์ด์ด์ง๋๋ค.
์๋ฏธ๊ฐ ํ๋ ค์ง๊ฑฐ๋ ์ถฉ๋ํ๊ฑฐ๋ ๊ฑฐ์ง์ธ ํค๋ค
์คํ์ ๋์๋ฌธ์ ์ฐจ์ด๋ ๋๋ฝ๋ ํ
์คํธ์ ๊ณ ์ ์ ์์ธ์
๋๋ค: ์ด๋ค ๊ณณ์์๋ checkout.title, ๋ค๋ฅธ ๊ณณ์์๋ Checkout.title. ์ฝ๋ ๋ฆฌ๋ทฐ์์๋ ๊ด์ฐฎ์ ๋ณด์ด๋ค๊ฐ ํด๋ฐฑ ์ธ์ด๊ฐ ์กฐ์ฉํ ๋ฐฐํฌ๋ฉ๋๋ค.
๋ ๋ค๋ฅธ ํํ ๋ฌธ์ ๋ ํ๋์ ํค๋ฅผ ๋ค๋ฅธ ์๋ฏธ๋ก ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. "Open"์ด ์ง์ ํ๋ฉด์์๋ "ํฐ์ผ ์ด๊ธฐ"๋ฅผ ๋ปํ๊ณ ์์ ํ์ด์ง์์๋ "์ง๊ธ ์ด๊ธฐ"๋ฅผ ๋ปํ๋ค๋ฉด ๊ฐ์ ํค๋ฅผ ์ฌ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ธ์ด์์ ํ ํ๋ฉด์ด ํ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ๋ฒ์ญ์๊ฐ ์ถ์ธกํ๊ฒ ๋๋ ์ํฉ์ด ์๊น๋๋ค.
๊ฐ๋จํ ๊ท์น: ํ๋์ ํค๋ ํ๋์ ์๋ฏธ์ ๋๋ค. ์๋ฏธ๊ฐ ๋ฐ๋๋ฉด ์์ด ํ ์คํธ๊ฐ ๊ฐ์๋ ์ ํค๋ฅผ ๋ง๋์ธ์.
"๋ฌธ์์ด ๋ชจ์" ๊ฐ์ ์์ ์ค๋ ๋ ์ด์์ ๋ฒ๊ทธ
ํ์ ์ข ์ข ๋ฒ์ญ์์ ๋ฌธ์ฅ๋ถํธ, ๊ณต๋ฐฑ, HTML ์ผ๋ถ๋ฅผ ํ๋์ฝ๋ฉํฉ๋๋ค. ์ธ์ด์ ๋ฐ๋ผ ๋ฌธ์ฅ๋ถํธ๊ฐ ๋ฌ๋ผ์ง๊ฑฐ๋ UI๊ฐ ๋งํฌ์ ์ ๋ค๋ฅด๊ฒ ์ด์ค์ผ์ดํ/๋ ๋๋งํ๋ฉด ๋ฌธ์ ๊ฐ ์๊น๋๋ค. ๋งํฌ์ ๊ฒฐ์ ์ ํ ํ๋ฆฟ์ ๋๊ณ ๋ฉ์์ง๋ ํ ์คํธ์ ์ง์คํ๊ฒ ํ์ธ์.
๋ชจ๋ฐ์ผ์์ ๋ฌธ์ ๊ฐ ์จ๊ฒจ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์์ด์ ๋ง๋ ๋ ์ด๋ธ์ด ๋ ์ผ์ด์์๋ ์ธ ์ค๋ก ๊ฐ๊ธฐ๊ฑฐ๋ ํ๊ตญ์ด์์๋ ๋์น ์ ์์ต๋๋ค. ํ ํ๋ฉด ํฌ๊ธฐ๋ง ํ ์คํธํ๋ฉด ๋์น๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ณต์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒ๋ค์ ์ฃผ์ํ์ธ์: ๋ณ์(์ด๋ฆ, ์๋, ๋ ์ง)๋ฅผ ์ฝ์ ํ ๋ ์์ด ๋จ์ด ์์๋ฅผ ๊ฐ์ ํ๋ ๊ฒ, ๋ฉ์์ง๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ์ด์ด๋ถ์ด๋ ๊ฒ ๋์ ํ๋์ ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ, ๊ธด ๊ฐ(์ ํ๋ช , ์ฃผ์, ์ค๋ฅ ์ธ๋ถ) ํ ์คํธ๋ฅผ ์๋ ๊ฒ, ๋๋ฝ๋ ํค๊ฐ "์์ด๋ก ๋ณด์ฌ์ ธ์" ๊ด์ฐฎ์ ๋ณด์ด๋๋ก ์กฐ์ฉํ ํด๋ฐฑ์ ์ผ๋ ์ํ๋ก ๋ฐฐํฌํ๋ ๊ฒ, ์์ด ๊ฐ๋ง ํธ์งํ๋ฉด์ ํค๋ ์ฌ์ฌ์ฉํ๋ ๊ฒ ๋ฑ.
500๊ฐ ์ด์์ ํค๋ฅผ ์์ ์ ์ผ๋ก ์ ์งํ๊ณ ์ถ๋ค๋ฉด ํค๋ฅผ API์ ์ผ๋ถ๋ก ์ทจ๊ธํ์ธ์: ์์ ์ ์ด๊ณ ๊ตฌ์ฒด์ ์ด๋ฉฐ ๋ค๋ฅธ ๊ฒ๋ค์ฒ๋ผ ํ ์คํธํ์ธ์.
๋ฒ์ญ ๋๋ฝ์ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ๋ QA ๋จ๊ณ
๋ฒ์ญ ๋๋ฝ์ ์ฑ์ด ์ฌ์ ํ "๋์"ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋จ์ง ํค๋ ์๋ชป๋ ๋ก์ผ์ผ, ๋น ๋ฌธ์์ด๋ก ํด๋ฐฑํ ๋ฟ์ ๋๋ค. ๋ฒ์ญ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํ ์คํธ์ฒ๋ผ ๋ค๋ฃจ์ด ๋ฐฐํฌ ์ ์ ๋น ๋ฅธ ํผ๋๋ฐฑ์ ๋ฐ์ผ์ธ์.
์๋ํ ๊ฒ์ฌ(๋ชจ๋ PR์์ ์คํ)
๋น๋๋ฅผ ์คํจํ๊ฒ ๋ง๋๋ ๊ฒ์ฌ๋ถํฐ ์์ํ์ธ์. ๊ฒฝ๊ณ ๋ง ์ถ๋ ฅํ๋ ๊ฒ์ฌ๋ ์๋ฌด๋ ๋ณด์ง ์์ต๋๋ค.
- ์ฝ๋๋ฒ ์ด์ค์์
$t('...')์t('...')์ฌ์ฉ์ ์ค์บํ๊ณ ์ฌ์ฉ๋ ๋ชจ๋ ํค๊ฐ ๊ธฐ๋ณธ ๋ก์ผ์ผ์ ์กด์ฌํ๋์ง ํ์ธํ์ธ์. - ๋ก์ผ์ผ ๊ฐ ํค ์งํฉ์ ๋น๊ตํ๊ณ ์ด๋ค ๋ก์ผ์ผ์ด๋ผ๋ ํค๊ฐ ๋๋ฝ๋๋ฉด ์คํจ์ํค์ธ์(์์ธ ๋ชฉ๋ก์ ์งง๊ฒ ์ ์ง).
- ๋ก์ผ์ผ ํ์ผ์ ์กด์ฌํ์ง๋ง ์ฌ์ฉ๋์ง ์๋ ๊ณ ์ ํค๋ฅผ ํ์ํ์ธ์.
- ๋ฉ์์ง ๋ฌธ๋ฒ(ํ๋ ์ด์คํ๋, ICU/ํ๋ด ๋ธ๋ก)์ ๊ฒ์ฆํ์ธ์. ํ๋์ ๊นจ์ง ๋ฉ์์ง๊ฐ ๋ฐํ์์์ ํ์ด์ง๋ฅผ ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค.
- ์ค๋ณต ํค๋ ์ผ๊ด์ฑ ์๋ ๋์๋ฌธ์๋ ์๋ฌ๋ก ์ฒ๋ฆฌํ์ธ์.
์์ธ ๋ชฉ๋ก์ ์งง๊ณ ํ์ด ์์ ํ๊ฒ ํ์ธ์. "CI๋ฅผ ํต๊ณผํ๋ ๊ฒ"์ด ์์ธ์ ์ฃผ์ธ์ด ๋์ง ์๋๋ก ํฉ๋๋ค.
๋ฐํ์ ๋ฐ ์๊ฐ์ ๊ฒ์ฌ(์คํ ์ด์ง)
CI๊ฐ ์์ด๋ ์ค์ ์ฌ์ฉ์ ๊ฒฝ๋ก์์ ํธ๋ฆฌ๊ฑฐ๋๋ ๋ฌธ์์ด์ ์ก์๋ด๊ธฐ ์ํด ์คํ ์ด์ง์ ์์ ๋ง์ ๋์ด์ผ ํฉ๋๋ค.
์คํ ์ด์ง์์ missing-translation ๋ก๊น ์ ํ์ฑํํ๊ณ ๋น ๋ฅด๊ฒ ๊ณ ์น ์ ์๋๋ก ์ปจํ ์คํธ(๋ก์ผ์ผ, ๋ผ์ฐํธ, ์ปดํฌ๋ํธ ์ด๋ฆ ๋ฑ)๋ฅผ ํฌํจํ์ธ์. ๋์ ๋๊ฒ ๋ง๋์ธ์. ๋ฌด์ํ๊ธฐ ์ฌ์ฐ๋ฉด ๋ฌด์๋ฉ๋๋ค.
์์ฌ-๋ก์ผ์ผ(pseudo-locale)์ ์ถ๊ฐํด ๋น ๋ฅธ UI ์ ๊ฒ์ ํ์ธ์. ๋ฌธ์์ด์ ๋ณํํด ๊ธธ๊ฒ ๋ง๋ค๊ณ ํ์ ๋ง์ปค๋ฅผ ๋ฃ์ผ๋ฉด ๋ ์ด์์ ๋ฌธ์ ๊ฐ ๋ฐ๋ก ๋์ ๋๋๋ค(์: [!!! ๐ง๐ฒ๐
๐ ๐ฒ๐
๐ฝ๐ฎ๐ป๐ฑ๐ฒ๐ฑ !!!]). ์๋ฆผ, ํ ํค๋ ๊นจ์ง, ๊ณต๋ฐฑ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ์ก์๋ผ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ฌ์ ๋ฆด๋ฆฌ์ค์์ ํต์ฌ ํ๋ฆ์ 2~3๊ฐ ๋ก์ผ์ผ๋ก ๋น ๋ฅด๊ฒ ํ์ธํ์ธ์: ๋ก๊ทธ์ธ, ๊ฒฐ์ /์ฒดํฌ์์, ํต์ฌ ์ค์ , ๊ทธ๋ฆฌ๊ณ ์ด๋ฒ์ ์ถ์ํ๋ ์ ๊ธฐ๋ฅ. ์ฌ๊ธฐ์ "๋ฒ์ญ์ ๋์ด ์์ผ๋ ํ๋ ์ด์คํ๋๊ฐ ์๋ชป๋" ๋ฒ๊ทธ๋ฅผ ์ก์ต๋๋ค.
์๋ก์ด ์ธ์ด ์ถ๊ฐ์ ์ง์์ ์ธ ์นดํผ ๋ณ๊ฒฝ ์ฒ๋ฆฌ
์๋ก์ด ์ธ์ด๋ฅผ ์ถ๊ฐํ๋ ์ผ์ "๋จ์ ์นดํผ ์์ "์ด ์๋๋ผ ์๊ท๋ชจ ์ ํ ๋ฆด๋ฆฌ์ค๋ก ๋ค๋ฃจ๋ฉด ๋ณต์กํจ์ ์ค์ผ ์ ์์ต๋๋ค. ์ฑ์ ๋ก์ผ์ผ์ด ๋ถ์์ ํด๋ ๋น๋๋๊ฒ ํ๋, ์ฌ์ฉ์์๊ฒ ๋ณด์ด๊ธฐ ์ ์ ๊ฒฉ์ฐจ๊ฐ ๋ช ํํ๊ฒ ๋๋ฌ๋๊ฒ ํ์ธ์.
์ ๋ก์ผ์ผ์ ์ถ๊ฐํ ๋๋ ๋ฒ์ญ๋ถํฐ ํ์ง ๋ง๊ณ ๊ตฌ์กฐ๋ถํฐ ์์ฑํ์ธ์(๋ณดํต en์ ํ์ผ ํํ๋ฅผ ๋ณต์ฌ).
- ์์ค ๋ก์ผ์ผ์ ์ ์ฒด ํค ์งํฉ์ ๋ณต์ฌํด ์ ๋ก์ผ์ผ ํด๋/ํ์ผ์ ๋ง๋์ธ์.
- ๊ฐ์ TODO ์๋ฆฌํ์์๋ก ํ์ํด QA์์ ๋๋ฝ ๋ฌธ์์ด์ด ๋ณด์ด๊ฒ ํ์ธ์.
- ๊ธฐ๋ณธ ํญ๋ชฉ์ด ์ปค๋ฒ๋๊ธฐ ์ ๊น์ง๋ ์ธ์ด ์ ํ๊ธฐ์ ์ ๋ก์ผ์ผ์ ์ถ๊ฐํ์ง ๋ง์ธ์.
- ํ๋ฉด๋ณ๋ก ํ ๋ฒ์ฉ ํ์ธํด ๊ธด ๋จ์ด, ์ค๋ฐ๊ฟ ๋ฌธ์ ๋ฅผ ์ฒดํฌํ์ธ์.
๋ฒ์ญ์ ๋ฆ๊ฒ ์ค๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ "๋ถ๋ถ์ "์ด ์ ํ์์ ๋ฌด์์ ์๋ฏธํ๋์ง ๋ฏธ๋ฆฌ ์ ํ์ธ์. ๊ณ ๊ฐ ๋์ ๊ธฐ๋ฅ์ด๋ฉด ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํด ๊ธฐ๋ฅ๊ณผ ๋ฌธ์์ด์ ํจ๊ป ๋ฐฐํฌํ์ธ์. ์ ์ฒด ๋ฒ์ญ ์์ด ๋ฐฐํฌํด์ผ ํ๋ค๋ฉด ๋น ๋ ์ด๋ธ๋ณด๋ค๋ ๋ช ํํ ํด๋ฐฑ(์: ์์ด)์ ์ ํธํ๋ ์คํ ์ด์ง์์๋ ํฌ๊ฒ ํ์๋๋๋ก ํ์ธ์.
์นดํผ ์ ๋ฐ์ดํธ๋ ํค๋ฅผ ๋ง๊ฐ๋จ๋ฆฌ๋ ์ง์ ์ ๋๋ค. ๋ฌธ๊ตฌ๋ฅผ ๋ฐ๊ฟ ๋๋ ํค๋ฅผ ์์ ์ ์ผ๋ก ์ ์งํ์ธ์. ํค๋ ์ ํํ ๋ฌธ์ฅ์ ์ค๋ช ํ๋ฉด ์ ๋๊ณ ์๋๋ฅผ ์ค๋ช ํด์ผ ํฉ๋๋ค. ์๋ฏธ๊ฐ ๋ฐ๋ ๋๋ง ํค ์ด๋ฆ์ ๋ฐ๊พธ๊ณ , ๊ทธ๋๋ ํต์ ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ผ๋ก ์งํํ์ธ์.
"์ข๋น ๋ฌธ์์ด"์ ํผํ๋ ค๋ฉด ํค๋ฅผ ์๋์ ์ผ๋ก ์ฌ์ฉ ์ค๋จ(deprecate)ํ์ธ์: ๋์ฒด ํค์ ํจ๊ป ์ฌ์ฉ ์ค๋จ ๋ ์ง๋ฅผ ํ์ํ๊ณ ํ ๋ฆด๋ฆฌ์ค ์ฃผ๊ธฐ ๋์ ์ ์งํ ๋ค ์ฐธ์กฐ๊ฐ 0๊ฐ์ธ ๊ฒ์ ํ์ธํ๊ณ ์ ๊ฑฐํ์ธ์.
๋ฒ์ญ ๋ ธํธ๋ ํค ๊ฐ๊น์ด์ ๋์ธ์. JSON ํฌ๋งท์ด ์ฃผ์์ ํ์ฉํ์ง ์์ผ๋ฉด ์์ ๋ณด์กฐ ๋ฌธ์๋ ์ธ์ ๋ฉํ๋ฐ์ดํฐ ํ์ผ์ ๋ ธํธ๋ฅผ ์ ์ฅํ์ธ์(์: "checkout success ํ๋ฉด์์ ์ฌ์ฉ"). ์ฌ๋ฌ ์ฌ๋์ด ์นดํผ์ UI๋ฅผ ๊ฑด๋๋ ํ๊ฒฝ(์: AppMaster๋ก ์์ฑ๋ Vue 3 ์น ์ฑ)์์ ํนํ ์ ์ฉํฉ๋๋ค.
์: 60๊ฐ์ ์ ๋ฌธ์์ด์ด ํฌํจ๋ ๊ธฐ๋ฅ ๋ฐฐํฌ
ํ ์คํ๋ฆฐํธ์ ํ์ด ๋์์ ์ธ ๊ฐ์ง๋ฅผ ๋ฐฐํฌํฉ๋๋ค: ์ ์ค์ ํ์ด์ง, ์ฒญ๊ตฌ(Billing) ํ๋ฉด, ๊ทธ๋ฆฌ๊ณ ์์์ฆ/๊ฒฐ์ ์คํจ/์ฒดํ ์ข ๋ฃ ์ด๋ฉ์ผ ํ ํ๋ฆฟ ์ธ ๊ฐ. ๋๋ต 60๊ฐ์ ์ ๋ฌธ์์ด์ด๊ณ ์ฌ๊ธฐ์ ๋ณดํต i18n ๋ฌธ์ ๊ฐ ์์๋ฉ๋๋ค.
ํ์ ๊ธฐ๋ฅ๋ณ๋ก, ๊ทธ๋ค์ ํ๋ฉด๋ณ๋ก ํค๋ฅผ ๊ทธ๋ฃนํํ๊ธฐ๋ก ํฉ์ํฉ๋๋ค. ๊ฐ ๊ธฐ๋ฅ์ ์ ํ์ผ์ ๋ง๋ค๊ณ ์ด๋์๋ ๊ฐ์ ํจํด(feature.area.element)์ ๋ฐ๋ฆ
๋๋ค.
// settings
"settings.profile.title": "Profile",
"settings.security.mfa.enable": "Enable two-factor authentication",
// billing
"billing.plan.current": "Current plan",
"billing.invoice.count": "{count} invoice | {count} invoices",
// email
"email.receipt.subject": "Your receipt",
"email.payment_failed.cta": "Update payment method"
๋ฒ์ญ ์์
์ ์์ํ๊ธฐ ์ ์ ๋ณต์ํ ๋ฌธ์์ด์ ์ค์ ๊ฐ์ผ๋ก ํ
์คํธํฉ๋๋ค. billing.invoice.count์ ๊ฒฝ์ฐ QA๊ฐ 0, 1, 2, 5๋ฅผ ์๋๋ ๋ฐ์ดํฐ๋ ๊ฐ๋จํ ๊ฐ๋ฐ ํ ๊ธ๋ก ํ์ธํฉ๋๋ค. "0 invoice" ๊ฐ์ ์ด์ํ ๊ฒฝ์ฐ๋ฅผ ์กฐ๊ธฐ์ ์ก์ต๋๋ค.
QA๋ ๋ํ ๋๋ฝ๋ ํค๋ฅผ ๋๋ฌ๋ด๊ธฐ ์ฌ์ด ์ง์ค์ ์ธ ํ๋ฆ์ ์คํํฉ๋๋ค: ์ค์ ๊ณผ Billing์ ์ด์ด ํญ์ ํ ๋ฒ์ฉ ํด๋ฆญํ๊ณ , ์ด๋ฉ์ผ ํ ํ๋ฆฟ์ ์คํ ์ด์ง์์ ํ ์คํธ ๊ณ์ ์ผ๋ก ํธ๋ฆฌ๊ฑฐํ๊ณ , ๋น๊ธฐ๋ณธ ๋ก์ผ์ผ๋ก ์ฑ์ ์คํํ๋ฉฐ ๋ก๊ทธ์์ ๋๋ฝ ๋ฒ์ญ ๊ฒฝ๊ณ ๊ฐ ๋ํ๋๋ฉด ๋น๋๋ฅผ ์คํจ์ํค๋ ์์ ๋๋ค.
์ด ์คํ๋ฆฐํธ์์ QA๋ Billing ํ๋ฉด์ ํ ๋ ์ด๋ธ๊ณผ ์ด๋ฉ์ผ ์ ๋ชฉ์ ํ ํญ๋ชฉ์ด ๋๋ฝ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ณ ํ์ ์ถ์ ์ ์ ์ด๋ฅผ ๊ณ ์ณค์ต๋๋ค.
๋ฆด๋ฆฌ์ค๋ฅผ ์ฐจ๋จํ ์ง ํด๋ฐฑ์ ํ์ฉํ ์ง ๊ฒฐ์ ํ ๋๋ ๊ฐ๋จํ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค: ์ฌ์ฉ์ ๋์ ํ๋ฉด๊ณผ ํธ๋์ญ์ ์ด๋ฉ์ผ์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ฐจ๋จํ๋ค; ์ํ์ด ๋ฎ์ ๊ด๋ฆฌ์ ์ ์ฉ ํ ์คํธ๋ ์ผ์์ ์ผ๋ก ๊ธฐ๋ณธ ์ธ์ด๋ก ํด๋ฐฑํ ์ ์์ผ๋ ํฐ์ผ๊ณผ ๋ช ํํ ๋ฐ๋๋ผ์ธ์ด ์์ด์ผ ํฉ๋๋ค.
๋ค์ ๋จ๊ณ์ ๊ฐ๋จํ ๋ฆด๋ฆฌ์ค ์ฒดํฌ๋ฆฌ์คํธ
Vue 3 i18n ์ํฌํ๋ก์ฐ๋ ๋ฒ์ญ์ ์ฝ๋์ฒ๋ผ ๋ค๋ฃฐ ๋ ์์ ์ ์ ๋๋ค: ๋งค๋ฒ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ถ๊ฐํ๊ณ , ํ ์คํธํ๊ณ , ์ ์๋ฅผ ๋งค๊ธฐ์ธ์.
๋ฆด๋ฆฌ์ค ์ฒดํฌ๋ฆฌ์คํธ(๋ณํฉ 5๋ถ ์ )
- ํค: ๋ค์ด๋ฐ ํจํด์ ๋ฐ๋ฅด๊ณ ์ค์ฝํ๊ฐ ๋ช ํํ์ง(ํ์ด์ง, ๊ธฐ๋ฅ, ์ปดํฌ๋ํธ) ํ์ธํ์ธ์.
- ๋ณต์ํ: ์ต์ ํ ์ธ์ด์์ ์ฌ๋ฌ ๋ณต์ ๊ท์น์ ๊ฐ์ง ์ผ์ด์ค๋ก ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋๋์ง ํ์ธํ์ธ์.
- ํ๋ ์ด์คํ๋: ๋ณ์๋ค์ด ๋ชจ๋ ๊ณณ์์ ์กด์ฌํ๊ณ ์ด๋ฆ์ด ๋์ผํ๋ฉฐ ์ค์ ๋ฐ์ดํฐ๋ก ํ์ธํ์ ๋ ์์ฐ์ค๋ฌ์ด์ง ๊ฒ์ฆํ์ธ์.
- ํด๋ฐฑ: ๋๋ฝ ํค ๋์์ด ํ์ฌ ์ ์ฑ ๊ณผ ์ผ์นํ๋์ง ํ์ธํ์ธ์.
- ํ๋ฉด: ๊นจ์ง๊ธฐ ์ฌ์ด ๋ช๋ช ํ๋ฉด(ํ ์ด๋ธ, ํ ์คํธ, ๋ชจ๋ฌ, ๋น ์ํ)์ ์คํ ์ฒดํฌํ์ธ์.
์ธก์ ํ ํญ๋ชฉ ๊ฒฐ์ (๋ฌธ์ ์กฐ๊ธฐ ๋ฐ๊ฒฌ์ฉ)
๋ช ๊ฐ์ง ๊ฐ๋จํ ์์น๋ฅผ ์ ํํด ์ ๊ธฐ์ ์ผ๋ก ๊ฒํ ํ์ธ์: ํ ์คํธ ์คํ์์์ ๋๋ฝ ํค ๋น์จ, ๋น๊ธฐ๋ณธ ๋ก์ผ์ผ์ ๋ฒ์ญ๋์ง ์์ ๋ฌธ์์ด ์, ์ฌ์ฉ๋์ง ์๋ ํค ์(๋ ์ด์ ์ด๋์๋ ๋ํ๋์ง ์๋ ๋ฌธ์์ด). ๋ฆด๋ฆฌ์ค๋ณ๋ก ์ถ์ ํ๋ฉด ์ผํ์ฑ ์คํจ๋ณด๋ค ์ถ์ธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๋ฌธ์์ด ์ถ๊ฐ, ๋ฒ์ญ ์ ๋ฐ์ดํธ, ๊ฒฐ๊ณผ ํ์ธ์ ์ ํํ ๋จ๊ณ๋ฅผ ์ ์ด๋์ธ์. ์งง๊ฒ ์ ์งํ๊ณ ํค ์ด๋ฆ๊ณผ ๋ณต์ํ ์ฌ์ฉ ์์๋ฅผ ํฌํจํ์ธ์. ์ ๊ธฐ์ฌ์๊ฐ ์ง๋ฌธํ์ง ์๊ณ ๋ฐ๋ผ ํ ์ ์๊ฒ ํ์ธ์.
๋ด๋ถ ๋๊ตฌ๋ฅผ ๋ง๋ ๋ค๋ฉด AppMaster (appmaster.io)๋ Vue3 ์น ์ฑ๊ณผ ๋๋ฐ ๋ชจ๋ฐ์ผ ์ฑ ์ ๋ฐ์์ UI ์นดํผ์ ๋ฒ์ญ ํค๋ฅผ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ๋ ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ผ ์ ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ํ ๊ณณ์์ ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์คํ๋ฆฐํธ๋ง๋ค ์์ i18n ๊ฑด๊ฐ ์์ ์ ํ๋์ฉ ์์ฝํ์ธ์: ์ฃฝ์ ํค ์ญ์ , ํ๋ ์ด์คํ๋ ๋ถ์ผ์น ์์ , ์ต๊ทผ ๋๋ฝ๋ ํญ๋ชฉ ๋ฆฌ๋ทฐ. ์์ ์ ๋ฆฌ๊ฐ ํ๋ก๋์ ์์์ ๊ธด๊ธ ๋ฒ์ญ ์์๋ณด๋ค ๋ซ์ต๋๋ค.


