๋ค๊ตญ์ด ๋ฒ์ญ์ ์ด์ํ๋ฉด์ ๋ฒ์ญ ํค๋ฅผ ๊ด๋ฆฌํ๋ ์ผ์ด ์ ์ ์ด๋ ค์์ก๋ค. ์๋น์ค์์๋ ํ๊ตญ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ๋ณธ์ด์ ์์ด ๋ฒ์ญ์ ํจ๊ป ๊ด๋ฆฌํ๊ณ ์์๋๋ฐ, ๋ฒ์ญ ๋ฌธ๊ตฌ๋ Google Sheet์์ ๊ด๋ฆฌํ๊ณ , ์ค์ ์ฝ๋์์๋ react-i18next์ ์ธ์ด๋ณ JSON ํ์ผ์ ์ฌ์ฉํ๊ณ ์์๋ค.
์ฒ์์๋ ํ๊ตญ์ด ๋ฌธ์ฅ์ ๊ทธ๋๋ก i18n ํค๋ก ์ฌ์ฉํ๊ณ ์์๋ค. ํ์ง๋ง ์ด์์ด ์ด์ด์ง์๋ก ์ด ๊ตฌ์กฐ๋ง์ผ๋ก๋ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ด ์ผ์ด์ค๊ฐ ๋์ด๋ฌ๋ค.
๋จผ์ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ฒ์ญ์ด ๋ฌ๋ผ์ง๋ ๋ฌธ์ ๊ฐ ์์๋ค.
๊ฐ์ ํ๊ตญ์ด ๋ฌธ์ฅ์ด๋ผ๋ ํ๋ฉด์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฒ์ญ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ๋ค. ์๋ฅผ ๋ค์ด ํ๊ตญ์ด๋ก๋ ๊ฐ์ ํ์ธ์ด์ด๋, ์ด๋ค ํ๋ฉด์์๋ ๋จ์ํ ๋ชจ๋ฌ์ ๋ซ๋ ์๋ฏธ์ผ ์ ์๊ณ , ๋ค๋ฅธ ํ๋ฉด์์๋ ์ฌ์ฉ์๊ฐ ํน์ ์์
์ ์๋ฃํ๋ค๋ ์๋ฏธ์ผ ์ ์๋ค. ๋ฌธ์ ๋ ์ด ์ฐจ์ด๊ฐ ํค ๊ตฌ์กฐ์์ ๋๋ฌ๋์ง ์๋๋ค๋ ์ ์ด์๋ค. ํ๊ตญ์ด ๋ฌธ์ฅ์ ๊ทธ๋๋ก i18n ํค๋ก ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ฝ๋์์๋ ๋ ๋ค ๊ฐ์ ํ์ธ ํค๋ฅผ ๋ฐ๋ผ๋ณธ๋ค. ๋ฐ๋ฉด ์ํธ์์๋ ํ๋ฉด๋ณ๋ก ๋ค๋ฅธ ๋ฒ์ญ๊ฐ์ด ๋ค์ด๊ฐ ์ ์๋ค. ์ด๋ ๊ฐ๋ฐ ์
์ฅ์์๋ ์ด ๋ณ๊ฒฝ์ด ๊ธฐ์กด ํ์ธ ํค๋ฅผ ์์ ํด์ผ ํ๋ ๊ฒ์ธ์ง, ํน์ ํ๋ฉด์ ์ํ ๋ณ๋ ํค๋ก ๋ถ๋ฆฌํด์ผ ํ๋ ๊ฒ์ธ์ง ๋ฐ๋ก ํ๋จํ๊ธฐ ์ด๋ ค์ ๋ค.
๊ฒฐ๊ตญ ๊ฐ์ ํ๊ตญ์ด ๋ฌธ์ฅ์ด๋ผ๋ ๋ฒ์ญ๊ฐ์ด ๋ฌ๋ผ์ง ์ ์๋๋ฐ, ๊ทธ ์ฐจ์ด๋ฅผ ์์ ์ ์ผ๋ก ์ถ์ ํ ๊ธฐ์ค์ด ๋ถ์กฑํ๋ค. ์ด ๋๋ฌธ์ ๋ฒ์ญ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํด๋น ๋ฌธ๊ตฌ๋ฅผ ๊ธฐ์กด ํค์ ๋ฐ์ํด๋ ๋๋์ง, ๋ณ๋ ํค๋ก ๋๋ ์ผ ํ๋์ง ํ์ธํด์ผ ํ๋ค.
์ํธ์ JSON์ ํํ ๋ฐฉ์ ์ฐจ์ด๋ ์์๋ค.
์ํธ์์๋ ์ค๋ฐ๊ฟ์ผ๋ก ๊ด๋ฆฌ๋๋ ๋ฌธ๊ตฌ๊ฐ, JSON์์๋ i18next์ <1/>, <2> ๊ฐ์ ํ๊ทธ๋ฅผ ํฌํจํ ํํ๋ก ๋ค์ด๊ฐ๊ธฐ๋ ํ๋ค. ํ๋ฉด์ ํ์๋๋ ๋ด์ฉ์ ๊ฐ์ง๋ง, ๋ฌธ์์ด ๊ธฐ์ค์ผ๋ก๋ ๋ค๋ฅธ ๊ฐ์ฒ๋ผ ๋ณด์๋ค. ๋ํ ์ํธ๊ฐ ์
๋ฐ์ดํธ๋๋ฉด์ ๊ธฐ์กด์ ๊ฐ๋ฐํ๊ณผ ๋ง์ถฐ์ ธ ์๋ ๋ฌธ๊ตฌ ๊ตฌ์กฐ๋ ์ผ๋ถ ๋ฌ๋ผ์ก๋ค. ๊ธฐ์กด์๋ ํ๋์ JSON ํค์ ์ํธ์ ํ ํ์ด ์ด๋ ์ ๋ ๋์๋๋ ๊ตฌ์กฐ์์ง๋ง, ์ํธ๊ฐ ๊ฐํธ๋๋ฉด์ ํ๋ฉด์ ์ค์ด ๋๋๋ ๋ฌธ๊ตฌ๊ฐ ์ฌ๋ฌ ํ์ผ๋ก ๋ถ๋ฆฌ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ๋ค.
๊ฒฐ๊ตญ ๊ณ ๋ฏผํด์ผ ํ ๋ฌธ์ ๋ ์ธ ๊ฐ์ง์๋ค.
๊ฐ์ ํ๊ตญ์ด ํค๋ฅผ ๊ณ์ ๊ทธ๋๋ก ์ฌ์ฉํด๋ ๋๋๊ฐ?
์ํธ์ JSON์ด ์ค์ ๋ก ๊ฐ์ ์ํ์ธ์ง ์ด๋ป๊ฒ ํ์ธํ ๊ฒ์ธ๊ฐ?
๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๋ฒ์ญ์ ์ด๋ป๊ฒ ์์ ํ๊ฒ ๋ถ๋ฆฌํ ๊ฒ์ธ๊ฐ?
์ด ๋ฌธ์ ๋ค์ด ๊ฒน์น๋ฉด์ ๋ค๊ตญ์ด ๋ฌธ๊ตฌ ๊ด๋ฆฌ๊ฐ ์ ์ ๋ถ์์ ํด์ก๋ค. ๊ทธ๋์ ์ด๋ฒ์๋ ๋ฒ์ญ ํค์ JSON ๊ตฌ์กฐ๋ฅผ ํ ๋ฒ ์์ ํํ๊ธฐ๋ก ํ๋ค. ์ฒ์๋ถํฐ ๋ฒ์ญ ๊ด๋ฆฌ ํ๋ฆ ์ ์ฒด๋ฅผ ๋ฐ๊พธ๊ธฐ๋ณด๋ค๋, ํ์ฌ ๊ตฌ์กฐ ์์์ ๋ฐ๋ณต๋๋ ํ์ธ ๋น์ฉ์ ์ค์ด๊ณ ๋ฌธ๋งฅ๋ณ ํค ๋ถ๋ฆฌ๋ฅผ ์์ ํ๊ฒ ์งํํ ์ ์๋ ๋๊ตฌ๋ฅผ ๋จผ์ ๋ง๋ค๊ธฐ๋ก ํ๋ค.
์ ์์ ์๋ํ๋ถํฐ ํ์ง ์์๋
์ฒ์๋ถํฐ ๋ชจ๋ ๊ณผ์ ์ ์๋ํํ๋ ๋ฐฉ๋ฒ๋ ์๊ฐํ ์ ์์๋ค. ์๋ฅผ ๋ค์ด ์ํธ ๊ฐ์ ๊ธฐ์ค์ผ๋ก JSON์ ์๋ ๊ฐฑ์ ํ๊ณ , ์ฝ๋์ t() ํธ์ถ๋ ์๋์ผ๋ก ๋ฐ๊พธ๊ณ , ์๋ก ํ์ํ ๋ฒ์ญ๊ฐ๊น์ง ์๋์ผ๋ก ์ฑ์ฐ๋ ๋ฐฉ์์ด๋ค.
ํ์ง๋ง ์ง๊ธ ๋น์ฅ ๊ทธ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ก ๊ฐ๊ธฐ๋ ์ด๋ ค์ ๋๋ฐ, ์ฐ์ ์ผ์ ์ ์ฌ์ ๊ฐ ๋ง์ง ์์๋ค. ๋ฒ์ญ ์ ํฉ์ฑ ๋ฌธ์ ๋ ์ด๋ฏธ ์์
๊ณผ์ ์์ ๊ณ์ ๋ฐ์ํ๊ณ ์์๊ณ , ๋น์ฅ PR ๋ฆฌ๋ทฐ๋ ๋ฐฐํฌ ์ ํ์ธ์์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
๋ํ ๋ฒ์ญ ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ํ๊ณผ์ ์ผํ๋ ๋ฐฉ์๋ ํจ๊ป ์ฝํ ์์๋ค. Google Sheet๋ฅผ ์ด๋ค ๊ธฐ์ค์ผ๋ก ๊ด๋ฆฌํ ์ง, ๊ฐ์ ํ๊ตญ์ด์ ๋ค๋ฅธ ๋ฒ์ญ์ด ํ์ํ ๊ฒฝ์ฐ ์ด๋ค ๊ท์น์ผ๋ก ๊ด๋ฆฌํ ์ง ๋ฑ์ ๋ค๋ฅธ ํ๊ณผ๋ ๋
ผ์๊ฐ ํ์ํ ์์ญ์ด์๋ค. ํ์ง๋ง ์ด ๋
ผ์๋ฅผ ์ํ ์ผ์ ์ ๋น์ฅ ์ก๊ธฐ๋ ์ด๋ ค์ ๋ค.
๊ทธ๋ ๋ค๊ณ ๋
ผ์๊ฐ ๋๋ ๋๊น์ง ๊ธฐ์กด ๋ฐฉ์๋๋ก ๊ณ์ ์๋ ํ์ธ์ ํ๊ธฐ์๋ ๋นํจ์จ์ด ์ปธ๋ค. ๊ทธ๋์ ์ํธ ์ด์ ๋ฐฉ์ ์์ฒด๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ๋ค๋ฅธ ํ์ ์์
๋ฐฉ์์ ๊ฐ์ ํ๊ธฐ๋ณด๋ค๋, ์ง๊ธ ๋ด๊ฐ ํต์ ํ ์ ์๋ ์์ญ๋ถํฐ ์ ๋ฆฌํด ๋ณด๊ธฐ๋ก ํ๋ค.
๊ธฐ์ค์ ์๋์ ๊ฐ์ด ์ ํ๋ค.
- ์๋์ผ๋ก ๋น๊ตํ ์ ์๋ ๋ถ๋ถ์ ์๋ํํ๋ค.
- ์ฌ๋์ด ํ๋จํด์ผ ํ๋ ๋ถ๋ถ์ ๋๊ตฌ๊ฐ ํ๋ณด๋ง ์ ๊ณตํ๋ค.
- ๊ฒ์๊ฐ ํ์ํ ๊ฐ์ ์กฐ์ฉํ ๋์ด๊ฐ์ง ์๋๋ก ํ์ํ๋ค.
- ๊ธฐ์กด ํ์
๊ตฌ์กฐ๋ ํฌ๊ฒ ๋ฐ๊พธ์ง ์๋๋ค.
์ด๋ฒ ์์ ์ ์ฒ์๋ถํฐ ์์ ์๋ํ๊ฐ ์๋๋ผ, ์ด์ ์ค์ธ ๊ตฌ์กฐ ์์์ ์์ ํ๊ฒ ์ธ ์ ์๋ ๋ฐ์๋ ๋๊ตฌ๋ฅผ ๋ชฉํ๋ก ํ๋ค.
๋ฌธ์ 1. ๊ฐ์ ํ๊ตญ์ด ํค๊ฐ ๋ฌธ๋งฅ์ ํํํ์ง ๋ชปํ๋ค
๊ฐ์ฅ ๋จผ์ ํด๊ฒฐํ๊ณ ์ถ์๋ ๊ฒ์ ๊ฐ์ ํ๊ตญ์ด ํค๊ฐ ์ฌ๋ฌ ๋ฌธ๋งฅ์์ ์ฌ์ฉ๋๋ ๋ฌธ์ ์๋ค. ํ๊ตญ์ด ๋ฌธ์ฅ์ ๊ทธ๋๋ก i18n ํค๋ก ์ฌ์ฉํ๋ฉด ์ฒ์์๋ ๊ด๋ฆฌ๊ฐ ์ฝ๋ค.
{
"ํ์ธ": "OK"
}
ํ์ง๋ง ๊ฐ์ ํ์ธ์ด๋ผ๋ ํ๋ฉด์ ๋ฐ๋ผ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค. ์ด๋ค ํ๋ฉด์์๋ ๋จ์ํ ๋ซ๋ ๋ฒํผ์ผ ์ ์๊ณ , ๋ค๋ฅธ ํ๋ฉด์์๋ ์์ ์๋ฃ๋ฅผ ์๋ฏธํ ์ ์๋ค. ์ด ๊ตฌ์กฐ์์๋ ํ์ธ์ด๋ผ๋ ํค๊ฐ ํ๋๋ฟ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฉด๋ง๋ค ๋ค๋ฅธ ๋ฒ์ญ์ ์ค ์ ์๋ค. ๊ธฐ์กด ์ฝ๋์๋ ์ด๋ฏธ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด suffix๊ฐ ๋ถ์ ํค๋ค์ด ์์๋ค. ํ์ง๋ง ๊ท์น์ด ๋ช ํํ์ง ์์์, ๋์ค์ ๋ดค์ ๋ ์ ์ด ํค๊ฐ ๋๋์๋์ง ์๊ธฐ ์ด๋ ค์ ๋ค. ๊ทธ๋์ ํค๋ฅผ ๋๋๋ ๊ธฐ์ค์ด ํ์ํ๋ค.
{ํ๊ตญ์ด}_{context}
{namespace}:{ํ๊ตญ์ด}
{ํ๊ตญ์ด}-{ComponentName}
{ํ๊ตญ์ด}-{screen}-{๊ธฐ๋ฅ๋ช
}
i18next์ context ๊ธฐ๋ฅ์ ์ฐ๋ ๋ฐฉ๋ฒ๋ ์์๊ณ , namespace๋ฅผ ๋๋๋ ๋ฐฉ๋ฒ๋ ์์๋ค. ํ์ง๋ง ๊ธฐ์กด ์ฝ๋ ๊ตฌ์กฐ์ ๋ง์ง ์๊ฑฐ๋, ์ง๊ธ ๋น์ฅ ์ ์ฉํ๊ธฐ์๋ ๋น์ฉ์ด ์ปธ๋ค. ์ฒ์์๋ ์ปดํฌ๋ํธ ์ด๋ฆ์ suffix๋ก ๋ถ์ด๋ ๋ฐฉ์๋ ๊ด์ฐฎ์ ๋ณด์๋ค.
ํ์ธ-ConfirmModal
๋ค์์๋-ErrorModal
๊ฐ๋ฐ์ ์
์ฅ์์๋ ์์ฑํ๊ธฐ ์ฝ์ง๋ง, ์ํธ์ ๋ง์ถฐ๋ณด๋ฉด ์ ๋งคํ ๋ถ๋ถ์ด ์์๋ค. ๋ฒ์ญ ์ํธ๋ ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ ํ๋ฉด ๋จ์๋ก ์ ๋ฆฌ๋์ด ์์๋ค. ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฌ ํ๋ฉด์์ ์ฌ์ฌ์ฉ๋ ์๋ ์๊ณ , ์ปดํฌ๋ํธ ์ด๋ฆ๋ง์ผ๋ก๋ ๋ฒ์ญ ๋ฌธ๋งฅ์ ์ถฉ๋ถํ ์ค๋ช
ํ๊ธฐ ์ด๋ ค์ ๋ค.
์ด ๊ณ ๋ฏผ์ ์ ๋ฆฌํด์ ํ์์๊ฒ ์ปจ๋ฒค์
๋
ผ์๋ฅผ ์์ฒญํ๊ณ , ์ต์ข
์ ์ผ๋ก๋ ํ๋ฉด๊ณผ ๊ธฐ๋ฅ๋ช
์ ํจ๊ป ๋ถ์ด๋ ๋ฐฉ์์ผ๋ก ์ ํ๋ค.
{ํ๊ตญ์ด}-{screen}-{๊ธฐ๋ฅ๋ช
}
์๋ฅผ ๋ค๋ฉด ์ด๋ฐ ํํ๋ค.
ํ์ธ-์ค์ -์ ์ฅ๋ฒํผ
ํ์ธ-์๋ฆผ-์ฝ์์ฒ๋ฆฌ
์กฐ๊ธ ๊ธธ์ด์ง๊ธด ํ์ง๋ง, ์ํธ์ screen ๊ฐ๊ณผ ์ฐ๊ฒฐํ๊ธฐ ์ฝ๊ณ ๋์ค์ ๋ดค์ ๋ ์ด๋ค ํ๋ฉด์ ์ด๋ค ๊ธฐ๋ฅ์์ ์ฐ๋ ๋ฌธ๊ตฌ์ธ์ง ์ถ์ ํ๊ธฐ ์ฝ๋ค๊ณ ํ๋จํ๋ค.
๋ฌธ์ 2. ์ํธ์ JSON์ ์ฌ๋ ๋์ผ๋ก ๋น๊ตํ๊ธฐ ์ด๋ ค์ ๋ค
๋ฌธ๋งฅ๋ณ ํค ๋ถ๋ฆฌ๋ฅผ ํ๋ ค๋ฉด, ๋จผ์ ํ์ฌ ์ํธ์ JSON์ด ์ด๋ค ์ํ์ธ์ง ํ์ธํ ์ ์์ด์ผ ํ๋ค. ๋ฒ์ญ์ ๊ธฐ์ค์ Google Sheet์์ง๋ง, ์ค์ ์๋น์ค์์ ์ฌ์ฉํ๋ ๊ฐ์ JSON ํ์ผ์ ์์๋ค. ๋ ๊ฐ์ด ๋ง๋์ง ํ์ธํ๋ ค๋ฉด ๊ฒฐ๊ตญ ์ฌ๋์ด ์ง์ ๋น๊ตํด์ผ ํ๋ค. ๋ฌธ์ ๋ ๋จ์ํ ์์ด ๋ง๋ค๋ ๊ฒ๋ง์ ์๋์๋ค. ๊ฐ์ ์๋ฏธ์ ๋ฌธ์ฅ์ด๋ผ๋ ํํ ๋ฐฉ์์ด ๋ค๋ฅผ ์ ์์๋ค. ์๋ฅผ ๋ค์ด ์ํธ์๋ ์๋์ ๊ฐ์ ๊ฐ์ด ์๋ค๊ณ ํ์.
์ฒซ ๋ฒ์งธ ์ค์
๋๋ค.
๋ ๋ฒ์งธ ์ค์
๋๋ค.
JSON์๋ ๊ฐ์ ๋ฌธ์ฅ์ด ์ด๋ฐ ํํ๋ก ๋ค์ด ์์ ์ ์๋ค.
{
"์๋ด ๋ฌธ๊ตฌ": "์ฒซ ๋ฒ์งธ ์ค์
๋๋ค.<1/>๋ ๋ฒ์งธ ์ค์
๋๋ค."
}
ํ๋ฉด์ ํ์๋๋ ๋ด์ฉ์ ๊ฐ์ง๋ง, ๋ฌธ์์ด ๊ธฐ์ค์ผ๋ก๋ ๋ค๋ฅธ ๊ฐ์ฒ๋ผ ๋ณด์ธ๋ค. ๊ทธ๋์ ๋จ์ ๋น๊ต๋ง์ผ๋ก๋ ์ค์ ๋ฌธ์ ๊ฐ ์๋ ํญ๋ชฉ๊น์ง ๋ถ์ผ์น๋ก ์กํ๊ณ , ์ด๋ฅผ ์ค์ด๋ ๊ฒ์ด ๋จผ์ ํ์ํ๋ค. ์ฒ์์๋ ์ํธ์ ๋ฒ์ญ๊ฐ๊ณผ JSON์ ๋ฒ์ญ๊ฐ์ ๊ทธ๋๋ก ๋น๊ตํ๋ค. ์์๋๋ก ์ค์ ๋ฌธ์ ๊ฐ ์๋ ๊ฐ๋ค์ด ๋ถ์ผ์น๋ก ๋ง์ด ์กํ๋ค. ๊ทธ๋์ ๋น๊ต ์ ์ ๋ฌธ์์ด์ ์ ๊ทํํ๋ค.
function stripTags(s) {
return String(s || '')
.replace(/<[^>]*>/g, '')
.replace(/\s+/g, '');
}
์ด ํจ์๋ HTML์ด๋ i18next ํ๊ทธ๋ฅผ ์ ๊ฑฐํ๊ณ , ์ค๋ฐ๊ฟ์ ํฌํจํ ๊ณต๋ฐฑ๋ ์ ๊ฑฐํ๋ค. ์ด ๋๊ตฌ์ ๋ชฉ์ ์ ์ฝ๋ ํฌ๋งท์ ๊ฒ์ฌํ๋ ๊ฒ์ด ์๋๋ผ, ์ํธ์ ๋ฒ์ญ ๋ด์ฉ๊ณผ JSON์ ๋ฒ์ญ ๋ด์ฉ์ด ๊ฐ์์ง๋ฅผ ํ์ธํ๋ ๊ฒ์ด์๋ค. ๊ทธ๋์ ํ๊ทธ์ ๊ณต๋ฐฑ ์ฐจ์ด๋ ๋น๊ต์์ ์ ์ธํ๋ค.
๋จ์ ๋ถ์ผ์น ๋ชฉ๋ก์ผ๋ก๋ ๋ถ์กฑํ๋ค
์ฒ์์๋ ๋ถ์ผ์น ํญ๋ชฉ์ ํ๋์ ๋ชฉ๋ก์ผ๋ก ๋ณด์ฌ์คฌ๋ค. ๊ทธ๋ฐ๋ฐ ์ง์ ํ์ธํด ๋ณด๋ ๋ถ์ผ์น์๋ ์ข ๋ฅ๊ฐ ์์๋ค. ์ด๋ค ๊ฐ์ JSON ๊ฐ๋ง ์์ ํ๋ฉด ๋๋ฌ๋ค. ๋ฐ๋ฉด ์ด๋ค ๊ฐ์ ๊ฐ์ ํ๊ตญ์ด๊ฐ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๋๊ณ ์์ด์, ๋จ์ํ ๊ฐ์ ์์ ํ๋ฉด ๋ค๋ฅธ ํ๋ฉด์ ์ํฅ์ ์ค ์ ์์๋ค. ๊ทธ๋์ ๋ฆฌํฌํธ๋ฅผ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ๋๋์๋ค.
- ํค ๋ถ๋ฆฌ๊ฐ ํ์ํ ๊ฐ
- ์ํธ์๋ ์์ง๋ง JSON์๋ ์๋ ๊ฐ
- ๊ฐ์ด ๋ค๋ฅธ ๊ฐ / ์ฌ์ฉ ์์น 1๊ฐ
- ๊ฐ์ด ๋ค๋ฅธ ๊ฐ / ์ฌ์ฉ ์์น ์ฌ๋ฌ ๊ฐ
- ์ํธ์์ ์ฌ๋ฌ ํ์ผ๋ก ๋๋์ด ์์ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฐ
์ด๋ ๊ฒ ๋๋๋ ์ด๋ค ์ ํ์ ๋ฌธ์ ์ธ์ง ๋จผ์ ๋ณด๊ณ ๋์ํ ์ ์์๋ค. ํนํ ๊ฐ์ ํ๊ตญ์ด๊ฐ ์ฌ๋ฌ ์์น์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ๋ด์ผ ํ๋ค. ์ด ๊ฒฝ์ฐ์๋ ๋ฒ์ญ๊ฐ๋ง ์์ ํ๋ ๊ฒ์ด ์๋๋ผ, ํค ์์ฒด๋ฅผ ํ๋ฉด์ด๋ ๊ธฐ๋ฅ ๋จ์๋ก ๋๋๋ ์์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
check, plan, apply๋ก ๋จ๊ณ๋ฅผ ๋๋ด๋ค.
๋๊ตฌ๋ ํฌ๊ฒ ์ธ ๋จ๊ณ๋ก ๋๋์๋ค.
pnpm i18n:check
pnpm i18n:plan
pnpm i18n:apply
๊ฐ ๋ช ๋ น์ด์ ์ญํ ์ ๋ค์๊ณผ ๊ฐ์๋ค.
check: ์ํธ์ JSON์ ์ฐจ์ด๋ฅผ ํ์ธํ๋ค.
plan: ํค ๋ถ๋ฆฌ๊ฐ ํ์ํ ํญ๋ชฉ์ ํ๋ณด๋ฅผ ๋ง๋ ๋ค.
apply: ์ฌ๋์ด ํ์ ํ ๋งคํ๋ง ์ฝ๋์ JSON์ ์ ์ฉํ๋ค.
์ฒ์๋ถํฐ ํ๋์ ๋ช
๋ น์ด๋ก ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ ์๋ ์์๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ฉด ์ฌ๋์ด ํ๋จํด์ผ ํ๋ ๋ถ๋ถ๊น์ง ๋๊ตฌ๊ฐ ์ถ์ธกํ๊ฒ ๋๋ค.
๊ทธ๋์ ๋๊ตฌ๊ฐ ํ ์ ์๋ ์ผ์ ์๋ํํ๊ณ , ๋ฌธ๋งฅ ํ๋จ์ด ํ์ํ ๋ถ๋ถ์ ์ฌ๋์ด ๊ฒฐ์ ํ๋๋ก ๋จ๊ฒจ๋์๋ค.
i18n:check
i18n:check๋ Google Sheet์ JSON ํ์ผ์ ๋น๊ตํ๋ ๋ช ๋ น์ด๋ค. Google Sheet์ CSV ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ธ์ด๋ณ JSON๊ณผ ๋น๊ตํ๋ค. ๋น๊ต ๊ณผ์ ์์๋ ํ๊ทธ์ ๊ณต๋ฐฑ์ ์ ๊ทํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์ ํ๋ณ๋ก ๋๋์ด ๋ฆฌํฌํธํ๋ค. ์ํธ ๊ตฌ์กฐ๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด์ ์๋ก ์๊ธด ์ฐจ์ด๋ ์์๋ค. ๊ธฐ์กด์๋ ๊ฐ๋ฐํ์์ ์ฌ์ฉํ๋ JSON ํค์ ์ํธ์ ๋ฌธ๊ตฌ ํ์ด ์ด๋ ์ ๋ ๋ง์ถฐ์ ธ ์์๋๋ฐ, ์ํธ๊ฐ ๊ฐํธ๋๋ฉด์ ํ๋ฉด์ ์ค์ด ๋๋๋ ๋ฌธ๊ตฌ๊ฐ ์ํธ์์๋ ์ฌ๋ฌ ํ์ผ๋ก ๋ถ๋ฆฌ๋๊ธฐ ์์ํ๋ค. ๊ฐ๋ฐ ์ฝ๋์์๋ ์ฌ์ ํ ํ๋์ t() ํค๋ก ๋ฌถ์ด ์ฐ๊ณ ์๋๋ฐ, ์ํธ์์๋ ์ฌ๋ฌ ํ์ผ๋ก ๋๋์ด ์๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด ๊ฒ์ด๋ค. ๊ทธ๋์ ๋จ์ ๋น๊ต๋ง ํ๋ฉด JSON์๋ ์๋๋ฐ ์ํธ์๋ ์๋ ๊ฐ์ฒ๋ผ ์กํ๋ค. ์ด ์ผ์ด์ค๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ฐ์ screen/property ๊ทธ๋ฃน ์์์ ์ฐ์๋ ํ์ ์ด์ด ๋ถ์ฌ ๋น๊ตํ๋ ๋ก์ง์ ์ถ๊ฐํ๋ค.
for (let start = 0; start < rows.length; start++) {
let acc = '';
for (let len = 1; len <= MERGE_WINDOW_MAX && start + len <= rows.length; len++) {
acc += normalizeForMatch(rows[start + len - 1].ko);
if (len === 1) continue;
if (acc.length > targetNorm.length) break;
if (acc === targetNorm) {
candidates.push({
window: rows.slice(start, start + len),
});
break;
}
}
}
๋ค๋ง ์ด ๋ฐฉ์๋ ๋ชจ๋ ์ผ์ด์ค์ ๊ทธ๋๋ก ์ ์ฉํ๊ธฐ๋ ์ด๋ ค์ ๋ค. ์งง์ ๋ฌธ๊ตฌ๋ ์ฌ๋ฌ ๊ณณ์์ ํ๋ณด๋ก ์กํ๊ณ , ํ๋ณด๊ฐ ๋ง์์ง๋ฉด ๋ฆฌํฌํธ๊ฐ ์คํ๋ ค ์๋๋ฌ์์ก๋ค. ๊ทธ๋์ ๋๋ฌด ์งง์ ๋ฌธ๊ตฌ๋ ๋ณํฉ ํ๋ณด์์ ์ ์ธํ๊ณ , ์ด์ํด๋ณด๋ ๋ณผ ํ์๊ฐ ์ ์ ์น์ ์ ์ ๊ฑฐํ๋ค. ๋ฆฌํฌํธ๋ ๋ง์ด ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ณด๋ค ํ์ธํ ํญ๋ชฉ๋ง ๋จ๊ธฐ๋ ์ชฝ์ด ๋ ์ ์ฉํ๋ค.
i18n:plan
i18n:plan์ ํค ๋ถ๋ฆฌ๊ฐ ํ์ํ ํญ๋ชฉ์ ์ฐพ์์ ๋งคํ ์ด์์ ๋ง๋๋ ๋ช
๋ น์ด๋ค.
ํ๋ฆ์ ์ด๋ ๋ค.
1. ์ํธ์์ ๊ฐ์ ํ๊ตญ์ด์ง๋ง ๋ฒ์ญ๊ฐ์ด ์ฌ๋ฌ ๊ฐ์ธ ํญ๋ชฉ์ ์ฐพ๋๋ค.
2. ์ฝ๋์์ ํด๋น ํ๊ตญ์ด ํค๊ฐ ์ฌ์ฉ๋ ์์น๋ฅผ ์ฐพ๋๋ค.
3. ์ฌ์ฉ ์์น์ screen ํ๋ณด๋ฅผ CSV๋ก ์ถ๋ ฅํ๋ค.
4. ์ฌ๋์ด ๊ธฐ๋ฅ๋ช
์ ์ฑ์ฐ๊ณ action์ apply๋ก ๋ฐ๊พผ๋ค.
๋ค๋ง ๋๊ตฌ๊ฐ ์ต์ข ํค ์ด๋ฆ๊น์ง ๊ฒฐ์ ํ์ง๋ ์์๋ค. ์ฌ์ฉ ์์น์ screen ํ๋ณด๋ง ์ ๊ณตํ๊ณ , ์ด๋ค ๊ธฐ๋ฅ๋ช ์ผ๋ก ๋๋์ง๋ ์ฌ๋์ด ๊ฒฐ์ ํ๋๋ก ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋งคํ ํ์ผ ํ์์ CSV๋ก ๋ง๋ค์๋ค. UTF-8 BOM์ ๋ถ์ด๊ณ , VSCode์์ CSV๋ฅผ ํ์ฒ๋ผ ํธ์งํ ์ ์๋ ํ์ฅ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ ๋ฆฌํ๋ค.
i18n:apply
i18n:apply๋ ์ฌ๋์ด ํธ์งํ CSV๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ ์ฝ๋์ JSON์ ๋ณ๊ฒฝํ๋ ๋ช ๋ น์ด๋ค. CSV์์ action=apply๋ก ํ์ํ ํ๋ง ์ฒ๋ฆฌํ๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฐ ๋งคํ์ด ์๋ค๋ฉด,
ko,screen,function_name,action
ํ์ธ,์ค์ ,์ ์ฅ๋ฒํผ,apply
๊ธฐ์กด ์ฝ๋๋
t('ํ์ธ')
์์
t('ํ์ธ-์ค์ -์ ์ฅ๋ฒํผ')
๋ก ๋ณ๊ฒฝ๋๋ค.
์๋ก ๋ง๋ ๋ฒ์ญ๊ฐ์๋ ๊ฒ์ ๋ง์ปค๋ฅผ ๋ถ์๋ค.
ํค๋ฅผ ๋๋๋ฉด ์๋ก์ด ํค๊ฐ ์๊ธด๋ค. ๋ฌธ์ ๋ ์ ํค์ ์ผ๋ณธ์ด์ ์์ด ๋ฒ์ญ๊ฐ์ ์ฒ์๋ถํฐ ์ ํํ ์ ์ ์๋ค๋ ์ ์ด๋ค. ๋๋ถ๋ถ์ ๊ธฐ์กด ํค์ ๋ฒ์ญ๊ฐ์ ๋ณต์ ํด์ ์์ํ๊ฒ ๋๋ค.
{
"ํ์ธ": "OK",
"ํ์ธ-์ค์ -์ ์ฅ๋ฒํผ": "OK",
"ํ์ธ-์๋ฆผ-์ฝ์์ฒ๋ฆฌ": "OK"
}
ํ์ง๋ง ์ค์ ๋ก๋ ๋ ์ ํค๊ฐ ์๋ก ๋ค๋ฅธ ๋ฒ์ญ์ ๊ฐ์ ธ์ผ ํ ์๋ ์๋ค. ๊ธฐ์กด ๊ฐ์ ๊ทธ๋๋ก ๋ณต์ฌํ๋ฉด ๋น๋๋ ํต๊ณผํ์ง๋ง, ์๋ชป๋ ๋ฒ์ญ์ด ๊ฒ์ ์์ด ๋จ์ ์ ์๋ค. ์ด ๋ฌธ์ ๋ฅผ ๋ง๊ธฐ ์ํด ์๋์ผ๋ก ๋ณต์ ๋ ja/en ๊ฐ์๋ ๊ฒ์ ๋ง์ปค๋ฅผ ๋ถ์๋ค.
const REVIEW_MARK = ' ๐ฅ[ํ์ธํ์]';
if (lang !== 'ko' && typeof baseVal === 'string') {
newVal = baseVal.includes(REVIEW_MARK)
? baseVal
: baseVal + REVIEW_MARK;
}
์๋ฅผ ๋ค๋ฉด ์ด๋ฐ ์์ด๋ค.
{
"ํ์ธ-์๋ฆผ-์ฝ์์ฒ๋ฆฌ": "OK ๐ฅ[ํ์ธํ์]"
}
์ด ๋ง์ปค๋ ํ๋ฉด์ ๊ทธ๋๋ก ๋ ธ์ถ๋๋ค. ๋ํ ๐ฅ[ํ์ธํ์]๋ก ๊ฒ์ํ๋ฉด ์์ง ํ์ธํ์ง ์์ ํค๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค. ๋ฒ์ญ ๊ฒ์๊ฐ ๋๋๋ฉด ์ฌ๋์ด ์ ํํ ๋ฒ์ญ๊ฐ์ผ๋ก ๋ฐ๊พธ๋ฉด์ ๋ง์ปค๋ฅผ ์ ๊ฑฐํ๋๋ก ๋ง๋ค์๋ค.
์ ์ฉ ํ ๋ฌ๋ผ์ง ์
์ด ์์ ์ดํ์๋ ๋ฒ์ญ ํค๋ฅผ ํ์ธํ๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ก๋ค. ์ด์ ์๋ ์ํธ์ JSON์ ์ง์ ์ด๊ณ ์ฌ๋์ด ๋น๊ตํด์ผ ํ๋ค. ์ด์ ๋ `i18n:check` ๊ฒฐ๊ณผ๋ฅผ ๋จผ์ ๋ณด๊ณ , ์ค์ ๋ก ํ์ธํด์ผ ํ ํญ๋ชฉ์ ์ขํ ์ ์๊ฒ ๋์๋ค. ๊ฐ์ ํ๊ตญ์ด๊ฐ ์ฌ๋ฌ ๋ฌธ๋งฅ์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์๋, ์ด๋ค ๋ฌธ๊ตฌ๊ฐ ์ฌ๋ฌ ํ๋ฉด์ด๋ ๊ธฐ๋ฅ์์ ์ฐ์ด๊ณ ์๋์ง ๋จผ์ ํ์ ํ ์ ์์๋ค. ์ดํ ๊ธฐ์ค ์์ด suffix๋ฅผ ๋ถ์ด๋ ๋์ , ํ๋ฉด๊ณผ ๊ธฐ๋ฅ๋ช ์ ๊ธฐ์ค์ผ๋ก ํค๋ฅผ ๋ถ๋ฆฌํ๋ค. ๋งคํ์ CSV์์ ํ์ธํ๊ณ ์ ์ฉํ ์ ์๋๋ก ํ๋ค.
{ํ๊ตญ์ด}-{screen}-{๊ธฐ๋ฅ๋ช
}
๋ํ ํค ๋ถ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ํ ๋ฒ์ ์ฝ๋์ JSON์ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ, plan โ ์ฌ๋์ด ํ์ธ โ apply ํ๋ฆ์ผ๋ก ์ ์ฉํ ์ ์๊ฒ ๋์๋ค.
ํ๊ณ
์ด๋ฒ ์์ ์์ ๊ฐ์ฅ ๋ง์ด ๊ณ ๋ฏผํ ๋ถ๋ถ์ ์ด๋๊น์ง ์๋ํํ ์ง์๋ค. ์ํธ์ JSON์ ๋น๊ตํ๊ฑฐ๋ ์ฝ๋์์ ์ฌ์ฉ ์์น๋ฅผ ์ฐพ๋ ์ผ์ ์๋ํํ ์ ์์๋ค. ๋ฐ๋ฉด ์ด๋ค ๋ฌธ๋งฅ์ผ๋ก ํค๋ฅผ ๋๋์ง๋ ๋๊ตฌ๊ฐ ์ ํํ ํ๋จํ๊ธฐ ์ด๋ ค์ ๋ค. ๊ทธ๋์ ๋๊ตฌ๋ ํ๋ณด๋ฅผ ๋ง๋ค๊ณ , ์ต์ข ๊ธฐ๋ฅ๋ช ์ ์ฌ๋์ด ์ฑ์ฐ๋ ๋ฐฉ์์ผ๋ก ์ ๋ฆฌํ๋ค. ๋ฆฌํฌํธ๋ ๊ฐ๋ฅํ ๋ง์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ๋ณด๋ค, ์ค์ ๋ก ํ์ธํ ๊ฐ์น๊ฐ ์๋ ํญ๋ชฉ๋ง ๋จ๊ธฐ๋ ๋ฐฉํฅ์ด ๋ ์ ์ฉํ๋ค. ํ๊ทธ์ ๊ณต๋ฐฑ ์ฐจ์ด๋ฅผ ์ ๊ทํํ๊ณ , ์ด์์ ๊ฐ์น๊ฐ ๋ฎ์ ์น์ ์ ์ ๊ฑฐํ ๊ฒ๋ ์ด ๋๋ฌธ์ด๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋ฒ ์์ ์ ๋จ์ํ ๋ฒ์ญ JSON์ ์ ๋ฆฌํ ์์ ์ด๋ผ๊ธฐ๋ณด๋ค, ๋ฒ์ญ์ ํ์ธํ๊ณ ์์ ํ๋ ํ๋ฆ์ ์์ ํํ ์์ ์ ๊ฐ๊น์ ๋ค. ํ์๋ถ๋ ๋ฐ๋ก ์ข๋ค๊ณ ํด์ฃผ์ ์, ํผ์ ๊ณ ๋ฏผํ๋ ๋ฐฉํฅ์ด ํฌ๊ฒ ํ๋ฆฌ์ง ์์๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
'๐ WIL > ํ๊ณ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํ ์ค Frontend Fundamentals ๋ชจ์๊ณ ์ฌ 2ํ ํ๊ธฐ (1) | 2026.03.29 |
|---|---|
| Toss Frontend Accelerator 5๊ธฐ Pre-Course ํ๊ณ (1) | 2026.02.08 |
| 8์ ์ฒซ์งธ ์ฃผ.. (6) | 2025.08.03 |
| ๐ฆ Grit์ ํ์ฉํ Emotion โ Panda CSS ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ (0) | 2025.03.16 |
| ๋ธ๋ก๊ทธ ํ๊ณ ๋ฐ 2025 ๋ชฉํ (0) | 2025.01.05 |