2025๋…„ 8์›” 22์ผยท6๋ถ„ ์ฝ๊ธฐ

ํ”„๋กœ๋•์…˜ ๊นœ์ง ์ƒํ™ฉ ์—†๋Š” Vue 3 i18n ์›Œํฌํ”Œ๋กœ์šฐ (500+ ํ‚ค)

๋Œ€๊ทœ๋ชจ ์•ฑ์„ ์œ„ํ•œ ์‹ค์šฉ์ ์ธ Vue 3 i18n ์›Œํฌํ”Œ๋กœ์šฐ: ํ‚ค ๋„ค์ด๋ฐ, ๋ณต์ˆ˜ํ˜•, QA ์ฒดํฌ, ๋ฆด๋ฆฌ์Šค ๋‹จ๊ณ„๋กœ ํ”„๋กœ๋•์…˜์—์„œ ๋ฒˆ์—ญ ๋ˆ„๋ฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•.

ํ”„๋กœ๋•์…˜ ๊นœ์ง ์ƒํ™ฉ ์—†๋Š” Vue 3 i18n ์›Œํฌํ”Œ๋กœ์šฐ (500+ ํ‚ค)

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 ์•ˆ์—์„œ) ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์‹ค์ œ ํ…์ŠคํŠธ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ํ™”๋ฉด์—์„œ ํ•˜์„ธ์š”. ๋ ˆ์ด์•„์›ƒ ๋ฌธ์ œ, ๊ธ€์ž ์ž˜๋ฆผ, ์–ด์ƒ‰ํ•œ ๋ฌธ์žฅ ๊ตฌ์„ฑ์ด ๊ทธ๊ณณ์—์„œ ๋จผ์ € ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.

์„ฑ์žฅ์— ๋งž์ถ˜ ๋กœ์ผ€์ผ ํŒŒ์ผ ๊ตฌ์„ฑ

Ship new UI without surprises
Turn new flows into working screens quickly, then validate strings in a second locale.
Prototype now

์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋ฌธ์ž์—ด์ด ๋„˜์–ด๊ฐ€๋ฉด ํ•˜๋‚˜์˜ ํฐ en.json์ด ๋ณ‘๋ชฉ์ด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ํŒŒ์ผ์„ ๊ฑด๋“œ๋ฆฌ๋ฉด ๋จธ์ง€ ์ถฉ๋Œ์ด ๋Š˜๊ณ  ์นดํ”ผ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ์ข‹์€ ๊ตฌ์กฐ๋Š” ์ œํ’ˆ์ด ๋ฐ”๋€Œ์–ด๋„ Vue 3 i18n ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒ์žฅ ๊ตฌ์กฐ

2~5๊ฐœ ๋กœ์ผ€์ผ์—๋Š” ๊ธฐ๋Šฅ๋ณ„ ๋ถ„๋ฆฌ๊ฐ€ ๋ณดํ†ต ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋กœ์ผ€์ผ์—์„œ ๋™์ผํ•œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜์—ฌ ํ‚ค ์ถ”๊ฐ€๊ฐ€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํŽธ์ง‘์ด ๋˜๊ฒŒ ํ•˜์„ธ์š”.

  • locales/en/common.json, locales/en/auth.json, locales/en/billing.json
  • locales/es/common.json, locales/es/auth.json, locales/es/billing.json
  • locales/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๋กœ ๋งŒ๋“  ๊ฒฝ์šฐ) ์ด ๋‹จ๊ณ„๋Š” ๋ ˆ์ด์•„์›ƒ์ด ๊ธฐ๋Šฅ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‹จ๊ณ„๋ฅผ ๋ชจ๋“  ํ…์ŠคํŠธ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์˜ ์™„๋ฃŒ ์ •์˜๋กœ ๋‹ค๋ฃจ์„ธ์š”.

ํŒ€๋“ค์ด ๋ฐ˜๋ณตํ•˜๋Š” ํ”ํ•œ ์‹ค์ˆ˜

Build your Vue3 app faster
Build a Vue3 web app and keep UI copy consistent as your product grows.
Try AppMaster

๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜์„ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์€ i18n ํ‚ค๋ฅผ "๊ทธ์ € ๋ฌธ์ž์—ด"๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ‚ค๊ฐ€ ์Œ“์ด๋ฉด ์ž‘์€ ์Šต๊ด€๋“ค์ด ํ”„๋กœ๋•์…˜ ๋ฒ„๊ทธ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

์˜๋ฏธ๊ฐ€ ํ๋ ค์ง€๊ฑฐ๋‚˜ ์ถฉ๋Œํ•˜๊ฑฐ๋‚˜ ๊ฑฐ์ง“์ธ ํ‚ค๋“ค

์˜คํƒ€์™€ ๋Œ€์†Œ๋ฌธ์ž ์ฐจ์ด๋Š” ๋ˆ„๋ฝ๋œ ํ…์ŠคํŠธ์˜ ๊ณ ์ „์  ์›์ธ์ž…๋‹ˆ๋‹ค: ์–ด๋–ค ๊ณณ์—์„œ๋Š” checkout.title, ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” Checkout.title. ์ฝ”๋“œ ๋ฆฌ๋ทฐ์—์„œ๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ด๋‹ค๊ฐ€ ํด๋ฐฑ ์–ธ์–ด๊ฐ€ ์กฐ์šฉํžˆ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ํ”ํ•œ ๋ฌธ์ œ๋Š” ํ•˜๋‚˜์˜ ํ‚ค๋ฅผ ๋‹ค๋ฅธ ์˜๋ฏธ๋กœ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "Open"์ด ์ง€์› ํ™”๋ฉด์—์„œ๋Š” "ํ‹ฐ์ผ“ ์—ด๊ธฐ"๋ฅผ ๋œปํ•˜๊ณ  ์ƒ์  ํŽ˜์ด์ง€์—์„œ๋Š” "์ง€๊ธˆ ์—ด๊ธฐ"๋ฅผ ๋œปํ•œ๋‹ค๋ฉด ๊ฐ™์€ ํ‚ค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ํ•œ ํ™”๋ฉด์ด ํ‹€๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฒˆ์—ญ์ž๊ฐ€ ์ถ”์ธกํ•˜๊ฒŒ ๋˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊น๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๊ทœ์น™: ํ•˜๋‚˜์˜ ํ‚ค๋Š” ํ•˜๋‚˜์˜ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์˜๋ฏธ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์˜์–ด ํ…์ŠคํŠธ๊ฐ€ ๊ฐ™์•„๋„ ์ƒˆ ํ‚ค๋ฅผ ๋งŒ๋“œ์„ธ์š”.

"๋ฌธ์ž์—ด ๋ชจ์–‘" ๊ฐ€์ •์—์„œ ์˜ค๋Š” ๋ ˆ์ด์•„์›ƒ ๋ฒ„๊ทธ

ํŒ€์€ ์ข…์ข… ๋ฒˆ์—ญ์—์„œ ๋ฌธ์žฅ๋ถ€ํ˜ธ, ๊ณต๋ฐฑ, HTML ์ผ๋ถ€๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด์— ๋”ฐ๋ผ ๋ฌธ์žฅ๋ถ€ํ˜ธ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฑฐ๋‚˜ UI๊ฐ€ ๋งˆํฌ์—…์„ ๋‹ค๋ฅด๊ฒŒ ์ด์Šค์ผ€์ดํ”„/๋ Œ๋”๋งํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ๋งˆํฌ์—… ๊ฒฐ์ •์€ ํ…œํ”Œ๋ฆฟ์— ๋‘๊ณ  ๋ฉ”์‹œ์ง€๋Š” ํ…์ŠคํŠธ์— ์ง‘์ค‘ํ•˜๊ฒŒ ํ•˜์„ธ์š”.

๋ชจ๋ฐ”์ผ์—์„œ ๋ฌธ์ œ๊ฐ€ ์ˆจ๊ฒจ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜์–ด์— ๋งž๋Š” ๋ ˆ์ด๋ธ”์ด ๋…์ผ์–ด์—์„œ๋Š” ์„ธ ์ค„๋กœ ๊ฐ๊ธฐ๊ฑฐ๋‚˜ ํƒœ๊ตญ์–ด์—์„œ๋Š” ๋„˜์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ํ™”๋ฉด ํฌ๊ธฐ๋งŒ ํ…Œ์ŠคํŠธํ•˜๋ฉด ๋†“์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ๋“ค์„ ์ฃผ์‹œํ•˜์„ธ์š”: ๋ณ€์ˆ˜(์ด๋ฆ„, ์ˆ˜๋Ÿ‰, ๋‚ ์งœ)๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ์˜์–ด ๋‹จ์–ด ์ˆœ์„œ๋ฅผ ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ, ๋ฉ”์‹œ์ง€๋ฅผ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ์ด์–ด๋ถ™์ด๋Š” ๊ฒƒ ๋Œ€์‹  ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ, ๊ธด ๊ฐ’(์ œํ’ˆ๋ช…, ์ฃผ์†Œ, ์˜ค๋ฅ˜ ์„ธ๋ถ€) ํ…Œ์ŠคํŠธ๋ฅผ ์žŠ๋Š” ๊ฒƒ, ๋ˆ„๋ฝ๋œ ํ‚ค๊ฐ€ "์˜์–ด๋กœ ๋ณด์—ฌ์ ธ์„œ" ๊ดœ์ฐฎ์•„ ๋ณด์ด๋„๋ก ์กฐ์šฉํžˆ ํด๋ฐฑ์„ ์ผœ๋‘” ์ƒํƒœ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ, ์˜์–ด ๊ฐ’๋งŒ ํŽธ์ง‘ํ•˜๋ฉด์„œ ํ‚ค๋Š” ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋“ฑ.

500๊ฐœ ์ด์ƒ์˜ ํ‚ค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ‚ค๋ฅผ API์˜ ์ผ๋ถ€๋กœ ์ทจ๊ธ‰ํ•˜์„ธ์š”: ์•ˆ์ •์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ด๋ฉฐ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ฒ˜๋Ÿผ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

๋ฒˆ์—ญ ๋ˆ„๋ฝ์„ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜๋Š” QA ๋‹จ๊ณ„

Make system messages predictable
Use the Business Process Editor to standardize toasts, notifications, and error messages.
Build automations

๋ฒˆ์—ญ ๋ˆ„๋ฝ์€ ์•ฑ์ด ์—ฌ์ „ํžˆ "๋™์ž‘"ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ํ‚ค๋‚˜ ์ž˜๋ชป๋œ ๋กœ์ผ€์ผ, ๋นˆ ๋ฌธ์ž์—ด๋กœ ํด๋ฐฑํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ฒˆ์—ญ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ํ…Œ์ŠคํŠธ์ฒ˜๋Ÿผ ๋‹ค๋ฃจ์–ด ๋ฐฐํฌ ์ „์— ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์œผ์„ธ์š”.

์ž๋™ํ™” ๊ฒ€์‚ฌ(๋ชจ๋“  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๊ฐœ์˜ ์ƒˆ ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ๊ธฐ๋Šฅ ๋ฐฐํฌ

One workspace for all locales
Create backend, web UI, and mobile apps in one place and reduce i18n drift.
Start building

ํ•œ ์Šคํ”„๋ฆฐํŠธ์— ํŒ€์ด ๋™์‹œ์— ์„ธ ๊ฐ€์ง€๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค: ์ƒˆ ์„ค์ • ํŽ˜์ด์ง€, ์ฒญ๊ตฌ(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 ๊ฑด๊ฐ• ์ž‘์—…์„ ํ•˜๋‚˜์”ฉ ์˜ˆ์•ฝํ•˜์„ธ์š”: ์ฃฝ์€ ํ‚ค ์‚ญ์ œ, ํ”Œ๋ ˆ์ด์Šคํ™€๋” ๋ถˆ์ผ์น˜ ์ˆ˜์ •, ์ตœ๊ทผ ๋ˆ„๋ฝ๋œ ํ•ญ๋ชฉ ๋ฆฌ๋ทฐ. ์ž‘์€ ์ •๋ฆฌ๊ฐ€ ํ”„๋กœ๋•์…˜์—์„œ์˜ ๊ธด๊ธ‰ ๋ฒˆ์—ญ ์ˆ˜์ƒ‰๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

์‰ฌ์šด ์‹œ์ž‘
๋ฉ‹์ง„๋งŒ๋“ค๊ธฐ

๋ฌด๋ฃŒ ์š”๊ธˆ์ œ๋กœ AppMaster๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
์ค€๋น„๊ฐ€ ๋˜๋ฉด ์ ์ ˆํ•œ ๊ตฌ๋…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๋‹ค
ํ”„๋กœ๋•์…˜ ๊นœ์ง ์ƒํ™ฉ ์—†๋Š” Vue 3 i18n ์›Œํฌํ”Œ๋กœ์šฐ (500+ ํ‚ค) | AppMaster