์ด ํ์ด์ง์ ์ํ๋ AI ์ด์์คํดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฝํฉ๋๋ค
์ด ํ์ด์ง์ ์ฝํ ์ธ ๋ AI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ๋์์ต๋๋ค.
์์ด ์๋ณธ ๋ด์ฉ์ ์ต์ ๋ฒ์ ์ ๋ณด๊ธฐ์ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ ์์ด๋์ด๊ฐ ์์ผ์๋ฉด GitHub์ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ์ฌ ์์ ๋กญ๊ฒ ๊ธฐ์ฌํด ์ฃผ์ธ์.
๋ฌธ์์ ๋ํ GitHub ๋งํฌ๋ฌธ์์ Markdown์ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ICU MessageFormat: ๊ตฌ๋ฌธ๊ณผ ์์ฃผ ๊ฒช๋ ํจ์
ICU MessageFormat์ ๋ฒ์ญ ๋ฌธ์์ด ์์ฒด์ ์กฐ๊ฑด ๋ถ๊ธฐ ๋ก์ง(๋ณต์ํ, ์ฑ๋ณ์ ๋ฐ๋ฅธ ํํ, ์ซ์ ๋ฐ ๋ ์ง ์์)์ ์ง์ ํฌํจํ ์ ์๋๋ก ํด์ฃผ๋ ๋ฌธ์์ด ๊ตฌ๋ฌธ ๊ท๊ฒฉ์
๋๋ค. ๋ฌธ๋ฒ ์ฒ๋ฆฌ๋ if (count === 1)์ ์์ฑํ๋ ๊ฐ๋ฐ์๊ฐ ์๋๋ผ ๋ฒ์ญ๊ฐ์ ์์ญ์ด์ด์ผ ํ๋ค๋ ์์น์ ๊ธฐ๋ฐํฉ๋๋ค. ์ด ๊ธ์์๋ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ, ๋จ์ํ ๊ตฌํ์ ๋ง๊ฐ๋จ๋ฆฌ๋ ์ธ์ด๋ณ ํน์ง, ๊ทธ๋ฆฌ๊ณ JavaScript ์ํ๊ณ๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ดํด๋ด
๋๋ค.
๋ชฉ์ฐจ
๋ฌธ์ ์ํฉ ์ดํด๋ณด๊ธฐ
๋๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ ์ฒ์ ์์ฑํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ด ์ฝ๋๋ ์์ด์์๋ ์ ๋์ํ์ง๋ง ๋ค๋ฅธ ๊ฑฐ์ ๋ชจ๋ ์ธ์ด์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ๋ฌ์์์ด์ ํด๋๋์ด์์๋ 2๊ฐ๊ฐ ์๋ 3~4๊ฐ์ ํํ๊ฐ ํ์ํฉ๋๋ค.
- ํ๊ตญ์ด์ ์ผ๋ณธ์ด์์๋ ๋ณต์ ๊ตฌ๋ถ์ด ํ์ ์์ผ๋ฉฐ, ๋ฌธ์์ด ๊ฒฐํฉ์ผ๋ก ๋ถ์ธ ๊ณต๋ฐฑ์ด ๋ถ์์ฐ์ค๋ฌ์ธ ์ ์์ต๋๋ค.
- ์๋์ด์์๋ 6๊ฐ์ ํํ๊ฐ ํ์ํ๋ฉฐ, ์ซ์ ์์ฒด๋ ํด๋น ๋ก์ผ์ผ์ ์ซ์ ํ๊ธฐ ์ฒด๊ณ๋ก ๋ ๋๋ง๋์ด์ผ ํฉ๋๋ค.
- ํ๋์ค์ด์์๋ ํน์ ๋ฌธ์ฅ ๋ถํธ ์์ ์ค๋ฐ๊ฟ ์๋ ๊ณต๋ฐฑ(non-breaking space)์ ๋ฃ์ด์ผ ํ๋๋ฐ,
+ " "๊ฒฐํฉ ๋ฐฉ์์ด ์ด๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค.
๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ ๋ฌธ์ฅ์ด ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ํํธํ๋๋ค๋ ์ ์
๋๋ค. ๋ฒ์ญ๊ฐ๋ ๋ฌธ๋งฅ์ด ์๋ item๊ณผ items๋ง์ ๋ณด๊ฒ ๋๋ฉฐ, ๋ฌธ์ฅ์ ์ด์์ ์ ์ฐํ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค. ICU MessageFormat์ ์ ์ฒด ๋ฌธ์ฅ์ ๋จ์ผ ๋ฒ์ญ ๋ฌธ์์ด๋ก ์ ์งํ๋ฉด์ ๋ฒ์ญ๊ฐ์๊ฒ ๋ถ๊ธฐ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๋จ์ ์ธ์ ๋ณด๊ฐ
๊ฐ์ฅ ์์ ๋จ์๋ ๋จ์ผ ์ค๊ดํธ๋ก ๋ฌถ์ธ ํ๋ ์ด์คํ๋์ ๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ํฌ๋งท ์์ ์ { name: "Alice" }๋ฅผ ๋๊ฒจ์ฃผ๋ฉด Hello, Alice!๊ฐ ์์ฑ๋ฉ๋๋ค. ์ค๊ดํธ๋ ICU์์ ์ ์ผํ ํน์ ๋ฌธ์์
๋๋ค. ๋ฌธ์ ๊ทธ๋๋ก์ ์ค๊ดํธ๋ฅผ ์ถ๋ ฅํ๋ ค๋ฉด ์์๋ฐ์ดํ๋ก ๊ฐ์ธ์ผ ํฉ๋๋ค(์: '{').
์ด๊ฒ์ด ๋ณด๊ฐ(interpolation)์ ๊ธฐ๋ณธ ์๋ฆฌ์ด๋ฉฐ, ICU์ ๋ค๋ฅธ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ด ์์ ๊ตฌ์ถ๋ฉ๋๋ค.
๋ณต์ํ (plural)
plural์ ์ซ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ง์ ๋ถ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ฐ๋์ ์์๋์ด์ผ ํ ์ธ ๊ฐ์ง ๊ท์น:
#๊ธฐํธ๋ ๋ก์ผ์ผ ์์์ด ์ ์ฉ๋count๊ฐ์ผ๋ก ์นํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด1234๋en-US์์๋1,234๊ฐ ๋๊ณko-KR์์๋1,234๋ก ์์ํ๋ฉ๋๋ค.other๋ ํ์์ ๋๋ค. ๋ชจ๋ ICU ๊ตฌํ์ฒด๋other๊ฐ ๋๋ฝ๋๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ฑฐ๋ ๊ฒ์ฆ์ ์คํจํฉ๋๋ค. ์ด๋ค ์นดํ ๊ณ ๋ฆฌ์๋ ์ผ์นํ์ง ์์ ๋ ์ฌ์ฉํ๋ ํด๋ฐฑ ์ญํ ์ ํฉ๋๋ค.=0,=1๋ฑ์ ์ ํํ ๊ฐ๊ณผ ์ผ์นํ๋ฉฐ, CLDR ์นดํ ๊ณ ๋ฆฌ๋ณด๋ค ๋จผ์ ํ๊ฐ๋ฉ๋๋ค. ์ด๋one์ ๋์ฒดํ๋ ์ฉ๋๊ฐ ์๋๋ผ "๋ฉ์์ง๊ฐ ์์ต๋๋ค"์ ๊ฐ์ ํน์ํ ๋ฌธ๊ตฌ๋ฅผ ํํํ ๋ ์ฌ์ฉํฉ๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
offset
offset:n์ ์นดํ
๊ณ ๋ฆฌ ํ๋ณ ๋ฐ # ์นํ์ ์ํํ๊ธฐ ์ ์ ์ซ์์์ n์ ์ฐจ๊ฐํฉ๋๋ค. "์จ๋ฆฌ์ค ์ธ 3๋ช
์ด ์ข์ํฉ๋๋ค"์ ๊ฐ์ ํจํด์ ์ ์ฉํฉ๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
count: 4๊ฐ ์ ๋ฌ๋๋ฉด # ์๋ฆฌ์ 3์ด ๋ ๋๋ง๋ฉ๋๋ค. offset์ ์ ์ฉํ์ง๋ง ๋ฐํ์์ ๋ฐ๋ผ ์ง์ ํธ์ฐจ๊ฐ ์์ผ๋ฏ๋ก ์ฌ์ฉ ์ ํ์ธ์ด ํ์ํฉ๋๋ค.
์ธ์ด๋ง๋ค ๋ค๋ฅธ ๋ณต์ํ ์นดํ ๊ณ ๋ฆฌ
๊ฐ์ฅ ๋ง์ ์คํด๊ฐ ๋ฐ์ํ๋ ๋ถ๋ถ์
๋๋ค. zero, one, two, few, many, other ์นดํ
๊ณ ๋ฆฌ ์ด๋ฆ์ ๋ชจ๋ ์ธ์ด์ ๋์ผํ๊ฒ ์ ์ฉ๋๋ ๊ณตํต ๊ท๊ฒฉ์ด ์๋๋๋ค. ๊ฐ ๋ก์ผ์ผ์ CLDR ๋ณต์ํ ๊ท์น์ ์ ์๋ ์ผ๋ถ๋ง์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ ์ํ์ ์ง๊ด์ด ์๋ ๋ฌธ๋ฒ ๊ท์น์ ๊ทผ๊ฑฐํฉ๋๋ค.
ํ ์ด๋ธ์ ๋ชจ๋ฌ๋ก ์ด์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ๊ฒ ํ์ธ
| ์ธ์ด | ํ๊ทธ | ์ฌ์ฉ ์นดํ ๊ณ ๋ฆฌ | ์ด ๊ฐ์ |
|---|---|---|---|
| ํ๊ตญ์ด | ko | other | 1 |
| ์ผ๋ณธ์ด | ja | other | 1 |
| ์ค๊ตญ์ด | zh | other | 1 |
| ์์ด | en | one, other | 2 |
| ๋ ์ผ์ด | de | one, other | 2 |
| ํ๋์ค์ด | fr | one, many, other | 3 |
| ์ฒด์ฝ์ด | cs | one, few, many, other | 4 |
| ํด๋๋์ด | pl | one, few, many, other | 4 |
| ๋ฌ์์์ด | ru | one, few, many, other | 4 |
| ์๋์ด | ar | zero, one, two, few, many, other | 6 |
| ์จ์ผ์ค์ด | cy | zero, one, two, few, many, other | 6 |
์ฃผ์ํด์ผ ํ ๋ ๊ฐ์ง ๊ฒฐ๊ณผ:
one์ด ์ซ์ "1"๋ง์ ์๋ฏธํ์ง ์์ต๋๋ค. ๋ฌ์์์ด์์one์ 11๋ก ๋๋๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ 1, 21, 31, 101 ๋ฑ 1๋ก ๋๋๋ ๋ชจ๋ ์๋ฅผ ํฌํจํฉ๋๋ค. ํ๋์ค์ด์์๋0๋one์ ์ํฉ๋๋ค.- ์์ด ์๋ฌธ์ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ์ถ๊ฐํด๋ ๋ค๋ฅธ ์ธ์ด์ ์๋์ผ๋ก ์ ์ฉ๋์ง ์์ต๋๋ค. ์์ด ๋ฉ์์ง๋
one๊ณผother๋ง ์์ผ๋ฉด ์ถฉ๋ถํ์ง๋ง, ํด๋๋์ด ๋ฒ์ญ์ 4๊ฐ์ ๋ถ๊ธฐ๊ฐ ํ์ํ๋ฉฐ ์ด ๊ตฌ์กฐ๋ ํด๋๋์ด ๋ฌธ์์ด ์์ ์ง์ ์ ์๋์ด์ผ ํฉ๋๋ค. ๋ชจ๋ ๋ก์ผ์ผ์ด ๋์ผํ ํค ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ก ๊ฐ์ ํ๋ ๋๊ตฌ๋ ์ด๋ฌํ ๋ค๊ตญ์ด ๊ตฌ์กฐ์์ ์ถฉ๋์ ์ผ์ผํต๋๋ค.
๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ์์ด ํ์ฌ ๋ฐํ์์ ๋์ ๋ฐฉ์์ ์ง์ ํ์ธํ ์ ์์ต๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
๋ชจ๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ Node.js ํ๊ฒฝ์ Intl.PluralRules์๋ CLDR ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ณธ ํ์ฌ๋์ด ์์ต๋๋ค. CLDR ๋ณต์ํ์ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋๋ถ๋ถ ๋ด๋ถ์ ์ผ๋ก ์ด ํ์ค API๋ฅผ ํธ์ถํฉ๋๋ค.
select ์ selectordinal
select๋ ์ฑ๋ณ, ์ญํ , ์ํ, ๊ตฌ๋
๋ฑ ์์์ ๋ฌธ์์ด์ ๊ธฐ์ค์ผ๋ก ๋ถ๊ธฐํฉ๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ํค ๊ฐ์ ์ ํํ ์ผ์นํด์ผ ํ๋ฉฐ ์ฌ๊ธฐ์๋ other๋ ํ์์
๋๋ค. ์ธ์ด๋ง๋ค ๋ฌธ์ฅ ๊ตฌ์กฐ์ ์ํฅ์ ๋ฏธ์น๋ ์ด๊ฑฐํ ๊ฐ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, ๋ฌธ๋ฒ์ ๋ณํ๊ฐ ํ์ํ ๊ฒฝ์ฐ select๊ฐ ์ต์ ์ ๋๊ตฌ์
๋๋ค.
selectordinal์ plural๊ณผ ํํ๊ฐ ๊ฐ์ง๋ง, ๊ธฐ์๊ฐ ์๋ ์์(1st, 2nd ๋ฑ) ๊ท์น์ ๋ฐ๋ฆ
๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์์ด๋ ๊ธฐ์์์๋ 2๊ฐ์ ์นดํ ๊ณ ๋ฆฌ๋ง ์ฌ์ฉํ์ง๋ง, ์์์์๋ 4๊ฐ(1st, 2nd, 3rd, 4th)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ ๋น๋์นญ์ฑ ๋๋ฌธ์ ๋ ์ฐ์ฐ์๊ฐ ๋ถ๋ฆฌ๋์ด ์กด์ฌํฉ๋๋ค.
์ซ์, ๋ ์ง ๋ฐ ์๊ฐ ์์
ICU๋ ๋ณด๊ฐ๋๋ ๊ฐ์ ์ง์ ์์ํํ ์ ์์ต๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ํ๋์ ์ธ ๋ฐฉ์์ ICU 60์์ ๋์
๋ :: ์ ๋์ฌ ๊ธฐ๋ฐ์ ์ค์ผ๋ ํค(skeleton)์
๋๋ค. ์ค์ผ๋ ํค์ ๊ธฐ์กด ๋ ๊ฑฐ์ ์คํ์ผ์ ๋นํด ํจ์ฌ ํ๋ถํ ํํ๋ ฅ์ ๊ฐ์ง๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ํ๊ณ ๋ด ์ค์ผ๋ ํค ์ง์ ํํฉ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง๋ค ์์ดํฉ๋๋ค. FormatJS๋ ์ด๋ฅผ ์จ์ ํ ์ง์ํ์ง๋ง ๋ค๋ฅธ ๋ฐํ์์ ๋ ๊ฑฐ์ ํํ(number, currency๋ date, long)๋ง ์ง์ํ ์ ์์ต๋๋ค. ํ๋ก๋์
ํ๊ฒฝ์ ๋ฐฐํฌํ๊ธฐ ์ ์ค์ ๋ฐํ์์ ์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ์ธ์.
์ค์ฒฉ ๊ตฌ์กฐ์ ๊ฐ๋ ์ฑ
ICU๋ ์กฐํฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ณต์ํ ๋ถ๊ธฐ ์์ select๋ฅผ ํฌํจํ๊ณ , ๊ทธ ์์ ๋ค์ ๋ค๋ฅธ ๋ณต์ํ์ ๋ฃ์ ์ ์์ต๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ด ์ฝ๋๋ ์ ํ์ ์ธ ICU ์์ ์ด๋ฉด์ ๊ณผ๋ํ ์ค์ฒฉ์ ํผํด์ผ ํ๋ ์ด์ ๋ฅผ ์ ๋ณด์ฌ์ค๋๋ค. 2๋จ๊ณ๋ฅผ ๋์ด๊ฐ๋ฉด ๋ฒ์ญ๊ฐ๊ฐ ๊ดํธ ์ค์๋ฅผ ์ ์ง๋ฅด๊ธฐ ์ฌ์ฐ๋ฉฐ TMS ์๋ํฐ์ ๋ณด์กฐ ๊ธฐ๋ฅ๋ ํ๊ณ์ ๋ถ๋ชํ๋๋ค. ์ค์ฒฉ์ ์ต๋ 2๋จ๊ณ๊น์ง๋ง ์ ์งํ๊ณ , 3๋จ๊ณ๊ฐ ํ์ํ๋ค๋ฉด ๋ฌธ์ฅ์ ๋ ๊ฐ์ ๊ฐ๋ณ ๋ฉ์์ง๋ก ๋๋๋ ๊ฒ์ด ํ๋ช ํฉ๋๋ค.
JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณ ICU ์ง์ ํํฉ
ํ ์ด๋ธ์ ๋ชจ๋ฌ๋ก ์ด์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ๊ฒ ํ์ธ
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ICU ์ง์ ์์ค | ์ค์ ์์ฑํ๋ ์ฝ๋ ํํ |
|---|---|---|
| react-intl (FormatJS) | ๋ค์ดํฐ๋ธ, ์์ ์ง์ | ์ค์ผ๋ ํค ๋ฐ ๋ฆฌ์น ํ ์คํธ ํ๊ทธ๋ฅผ ํฌํจํ ICU ๋ฌธ์์ด |
| next-intl | ๋ค์ดํฐ๋ธ | FormatJS์ intl-messageformat ๊ธฐ๋ฐ ICU ๋ฌธ์์ด |
| i18next | ํ๋ฌ๊ทธ์ธ ํ์ | key_one / key_other ์ ๋ฏธ์ฌ ๋ฐ {{name}}; ICU๋ i18next-icu๋ก ์ง์ |
| vue-i18n | ๋ถ๋ถ์ / ๋ ์ ๊ท๊ฒฉ | {name} ๋ณด๊ฐ ๋ฐ ํ์ดํ๋ก ๊ตฌ๋ถ๋ ๋ณต์ํ ๋ถ๊ธฐ |
Angular ($localize) | ํ์ ์งํฉ | ํ
ํ๋ฆฟ ๋ด๋ถ์ ICU plural / select, XLIFF๋ก ์ถ์ถ |
ํ๋ฅผ ์ฝ์ ๋ ์ฐธ๊ณ ํด์ผ ํ ์ฌํญ:
- i18next์ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ICU๊ฐ ์๋๋ฉฐ, ์ด๊ฒ์ด ๋จ์ ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ์ ๋ฏธ์ฌ ํค(
item_one,item_few)๋Intl.PluralRules์นดํ ๊ณ ๋ฆฌ์ ๋งคํ๋๋ฉฐ ํ๋ซ JSON์์ ํธ์งํ๊ธฐ ๋ ์์ํฉ๋๋ค. ๋ค๋งselect๋ ์ค์ฒฉ ๋ถ๊ธฐ๋ ์ง์ํ์ง ์์ผ๋ฏ๋กi18next-icu๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ฝ๋ ๋ ๋ฒจ์์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. - vue-i18n์ ํ์ดํ ๋ณต์ํ์ ๊ธฐ๋ณธ์ ์ผ๋ก CLDR ๊ท์น ๋์ ๋ก์ผ์ผ๋ณ ๊ท์น ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋์์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง ๊ท์น์ด ๋ฐ์ดํฐ๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ์ ์ข ์๋ฉ๋๋ค.
- FormatJS๋ JS ์ํ๊ณ์ ๋ ํผ๋ฐ์ค์ ๋๋ค. JavaScript ์ง์์์ "ICU MessageFormat"์ ์ธ๊ธํ ๋๋ ํต์ FormatJS๊ฐ ์์ฉํ๋ ํ์ค์ ์๋ฏธํฉ๋๋ค.
- ์์ ํ ICU ์ง์์ ๋ฒ๋ค ํฌ๊ธฐ ๋ถ๋ด์ ์๋ฐํฉ๋๋ค. ํ์์ ์ค์ผ๋ ํค ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ฝ 10KB์ ์์ถ๋ JavaScript ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. ICU๊ฐ JavaScript์ ๋ง์ง ์๋ ์ด์ ๋ฅผ ํ์ธํ์ธ์.
Intlayer์ ํด๊ฒฐ ๋ฐฉ์
Intlayer๋ ๋ฌธ์์ด DSL์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์กฐ๊ฑด ๋ถ๊ธฐ ์ฐ์ฐ์๋ค์ด ํ์ ์์ ํ ์ฝํ ์ธ ์ ์ธ ํ์ผ ๋ด์ ํจ์๋ก ์ ๊ณต๋๋ฏ๋ก, ๊ตฌ์กฐ๊ฐ ๊ฒฌ๊ณ ํ๊ฒ ์ ์ง๋๊ณ ๊ฐ ๋ก์ผ์ผ์ ์์ ์ ๋ฌธ๋ฒ์ ํ์ํ ์นดํ ๊ณ ๋ฆฌ๋ง์ ์ ์ธํ ์ ์์ต๋๋ค.
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
์ฝ๋๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ
ICU ๊ฐ๋ ๊ณผ์ ๋งคํ ๊ด๊ณ๋ ์ง๊ด์ ์ ๋๋ค.
ํ ์ด๋ธ์ ๋ชจ๋ฌ๋ก ์ด์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ๊ฒ ํ์ธ
| ICU ๊ตฌ์กฐ | Intlayer ๋์ ๋ฐฉ์ |
|---|---|
{name} | insert("Hello {{name}}") ๋๋ ์๋ ๊ฐ์ง |
{count, plural, โฆ} | plural({ one, few, many, other }) |
{value, select, โฆ} | select({ draft, published, fallback }) |
select์ ์ฑ๋ณ ๋ถ๊ธฐ | gender({ male, female, fallback }) |
select์ ๋ถ๋ฆฌ์ธ ๋ถ๊ธฐ | cond({ true, false }) |
| ์ซ์ ๋ฒ์(๋นCLDR) | enu({ "0": โฆ, ">5": โฆ, fallback: โฆ }) |
{n, number, ::currency/EUR} | useCurrency()(1234.5, { currency: "EUR" }) |
plural์ ์นดํ
๊ณ ๋ฆฌ ํ๋ณ์ Intl.PluralRules์ ์์ํ๋ฏ๋ก ์์ ์ดํด๋ณธ CLDR ํ
์ด๋ธ์ด ๊ทธ๋๋ก ์ ์ฉ๋ฉ๋๋ค. ์ซ์, ๋ ์ง, ํตํ, ๋ชฉ๋ก ์์ํ๋ ๋ฉ์์ง ๋ฌธ์์ด์ ์์ง ์๊ณ ํฌ๋งทํฐ ํ
์ ํตํด ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
๊ณ ๋ คํด์ผ ํ ํ๊ณ์ :
- Intlayer๋ ๋น๋ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๋น๋ ํ์์ ์ฝํ ์ธ ์ ์ธ์ ์ถ์ถํฉ๋๋ค. ๋ฐํ์์ ๋จ์ JSON์ ๋์ ์ผ๋ก ๋ถ๋ฌ์ค๋ ๋ชจ๋ธ๊ณผ๋ ๋ฐฉํฅ์ฑ์ด ๋ค๋ฆ ๋๋ค.
- ํ์ฌ
plural๋ถ๊ธฐ ๋ด๋ถ์t()๋ฅผ ์ง์ ์ค์ฒฉํ ์ ์์ต๋๋ค.t()๋ด๋ถ์์plural์ ํธ์ถํ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. - i18next์ ๋นํด ์๋์ ์ผ๋ก ์ ์ ์ํ๊ณ์ด๋ฏ๋ก TMS ๋๊ตฌ ์ฐ๋์ด๋ ์ปค๋ฎค๋ํฐ ๋ ํผ๋ฐ์ค๊ฐ ์ถ์ ๋๋ ๋จ๊ณ์ ์์ต๋๋ค.
๊ธฐ์กด์ ์์ฑ๋ ICU ๋ฌธ์์ด์ด ์๋ ํ๋ก์ ํธ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์
ํ ๊ฒฝ์ฐ, react-intl ํธํ ์ด๋ํฐ๊ฐ plural, select, selectordinal, #, ๋ ๊ฑฐ์ number / date / time ๊ตฌ๋ฌธ์ ์ง์ ํด์ํฉ๋๋ค. ์ค์ผ๋ ํค ๋ฐ offset:์ ํ์ฌ ํด๋น ๋ฆฌ์กธ๋ฒ์์ ์ง์๋์ง ์์ผ๋ฏ๋ก ๋ง์ด๊ทธ๋ ์ด์
์ ๊ฒํ ๊ฐ ํ์ํฉ๋๋ค. i18next ์ด๋ํฐ๋ ์ ๋ฏธ์ฌ ํ์(key_one, key_male)์ Intl.PluralRules๋ฅผ ํตํด ์ฒ๋ฆฌํฉ๋๋ค.
ํํ ๋ฒํ๋ ์ค์
- ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ด์ ๋ณต์ํ ์ผํญ ์ฐ์ฐ์๋ฅผ ํ๋์ฝ๋ฉํ๋ ๊ฒ.
count === 1 ? a : b๊ตฌ๋ฌธ์ ์ ํ์ ์๋ 10๊ฐ ์ธ์ด ์ค 8๊ฐ ์ธ์ด์์ ์๋ชป๋ ๋ฌธ๋ฒ์ ์ถ๋ ฅํฉ๋๋ค. ์ผํญ ์ฐ์ฐ์๊ฐ ์ฝ๋์ ๊ณ ์ ๋๋ฉด ๋ฒ์ญ๊ฐ๊ฐ ์ด๋ฅผ ์์ ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. - ๋ฒ์ญ๋ ํ ์คํธ ์กฐ๊ฐ๋ค์ ๋ฌธ์์ด๋ก ์ด์ด ๋ถ์ด๋ ๊ฒ. ์ด์, ์ฑ์ ์ผ์น, ๋ฌธ์ฅ ๋ถํธ ์๋ค ๊ณต๋ฐฑ ๊ท์น์ ๋ก์ผ์ผ๋ง๋ค ๋ค๋ฆ ๋๋ค. ํญ์ ๋ฌธ์ฅ ๋จ์๋ก ์จ์ ํ๊ฒ ๋ฒ์ญํด์ผ ํฉ๋๋ค.
other๋ฅผ ๋น ๋จ๋ฆฌ๋ ๊ฒ. ์ด๋ ๊ถ์ฅ ์ฌํญ์ด ์๋๋ผ ํ์ค ๊ท๊ฒฉ์ ํ์ ์๊ตฌ์ฌํญ์ ๋๋ค. ๋๋ถ๋ถ์ ํ์๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ฉฐ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ๋น ๋ฌธ์์ด๋ง ์ถ๋ ฅ๋ฉ๋๋ค.- ๋ชจ๋ ์ธ์ด์ ์นดํ
๊ณ ๋ฆฌ ๊ตฌ์ฑ์ด ๊ฐ์ ๊ฒ์ด๋ผ ๊ฐ์ ํ๋ ๊ฒ. ์์ด ์๋ฌธ์ด
one๊ณผother2๊ฐ๋ผ๊ณ ํด์ ํด๋๋์ด ๋ฒ์ญ๋ 2๊ฐ์ผ ์๋ ์์ต๋๋ค. ๊ฐ ์ธ์ด๊ฐ ๊ณ ์ ํ ๋ถ๊ธฐ๋ฅผ ์ ์ธํ ์ ์์ด์ผ ํฉ๋๋ค. ๋ก์ผ์ผ๋ณ ์ฝํ ์ธ ์ ์ธ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์ธ์. one๋์=1์ ์ฌ์ฉํ๋ ๊ฒ.=1์ ์ ํํ ์ซ์ 1์๋ง ๋งค์นญ๋ฉ๋๋ค. ๋ฌ์์์ด์์ 21์one์นดํ ๊ณ ๋ฆฌ์ ์ํ์ง๋ง=1์๋ ๊ฒฐ์ฝ ์ผ์นํ์ง ์์ต๋๋ค.#์ ๋ณต์ํ ๋ถ๊ธฐ ์ธ๋ถ์ ๋ฐฐ์นํ๋ ๊ฒ.#์plural์ด๋selectordinal๋ด๋ถ์์๋ง ํน์ํ ์นํ์๋ก ์๋ํฉ๋๋ค. ๊ทธ ์ธ ์์น์์๋ ๋จ์ํ ํด์ ๊ธฐํธ๋ก ์ทจ๊ธ๋ฉ๋๋ค.#์ด ์ด๋ฏธ ๋ก์ผ์ผ ์์ํ๋์์์ ๊ฐ๊ณผํ๋ ๊ฒ. ์ฒ ๋จ์ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ์๋ ์์ ์ซ์๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ธ์ ์ด๋ฆ์ ์ง์ ์ง์ ํ์ฌ ๋ณด๊ฐํ์ธ์.
๋ ์์๋ณด๊ธฐ
๋๊ธ
์์ง ๋๊ธ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ก ์๊ฒฌ์ ๋๋ ๋ณด์ธ์.
