์ง๋ฌธ ํ๋ :
'en', 'en-US'๋ก์ผ์ผ์ด์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๋๋ ๊ทธ๊ฒ๋ค์ด '๊ธฐ๋ณธ๊ฐ'๊ฐ์ผ๋ก ๋ฐ์ ๋ค์ฌ ์ก๋ค๋ ๊ฒ์ ์ดํดํ๊ณ , ๊ทธ๋์ ๊ทธ๊ฒ์ด ๋น์ ์ด ์ํ๋ ๊ฒ์ด๋ผ๋ฉด, ์์ํ๊ธฐ ์ํด ๋ก์ผ์ผ์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ฉ์๊ฐ ๋ก์ผ์ผ์ ์ ํํ ์์๋ ์ผ๋ฐ์ ์ธ ์ฝค๋ณด๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์ญ์์ค.
๊ทธ๋ฆฌ๊ณ ๋น์ ์ ๊ทธ ํ์ฌ ๊ฐ์ผ๋ก moment.locale ()์ ํธ์ถํ๊ณ ์์ต๋๋ค.
ํ์ฌ ์ํฉ์์๋ en / en-US ์ผ์ด์ค๋ฅผ ํน์ ์ผ์ด์ค๋ก ์ฒ๋ฆฌํด์ผํ๋๋ฐ, ์ข ์ด์ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋น์ ์ ์๋ํ ์ผ์ ๋ํ Thx. ๊ณ์ ๋ฐ๊ณ !
en
๋ก์ผ์ผ์ด ์์ง๋ง ๋ณ๋์ ํ์ผ๋ก ์ ๊ณต๋์ง ์์ต๋๋ค. moment().locale()
๋ฐ moment.locale()
๋งค์ฐ ๋ง์ด ํ์ฉ๋ฉ๋๋ค.
moment.locale('fr')
"fr"
moment().format("LLLL")
"vendredi 25 novembre 2016 03:39"
moment.locale('en')
"en"
moment().format("LLLL")
"Friday, November 25, 2016 3:39 AM"
en-US
์๋ํฉ๋๋ค. ๋ ๊ตฌ์ฒด์ ์ธ ์ผ์น ํญ๋ชฉ์ ๊ฒ์ํ๊ณ en
๋ก์ผ์ผ์ด ๋ฏธ๊ตญ ์์ด์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
moment.locale('en-GB')
"en-gb"
moment().format("LLLL")
"Friday, 25 November 2016 03:40"
moment.locale('en-US')
"en"
moment().format("LLLL")
"Friday, November 25, 2016 3:40 AM"
๋๋ ๊ทธ๊ฒ์ ์ฌ์ง ์๋๋ค. ํ๊ฒฝ์์ ๋ก์ผ์ผ์ด ๊ฐ์ง ๋ ๊ฒฝ์ฐ moment / locale / $ {detectedLocale}์๋ก๋ํ๊ธฐ ์ํด ํ์ํ dep ๊ฒฝ๋ก๊ฐ ๊ตฌ์ฑ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ํด๋น ๋ณ์๊ฐ "en"๋๋ "en-us"์ด๋ฉด requirejs๋ ํ์ผ๋ก๋์ ์คํจํฉ๋๋ค (404๋ฅผ ์ป์). 'de'๋ก ๊ฐ์ง๋๋ฉด ํ์ผ ์ด ๋ก๋๋ฉ๋๋ค.
@eigood Moment์ ๋ก์ผ์ผ ๋ก๋๋ ์ด๋ฏธ ์์ด๊ฐ ์์์ ์๊ณ ์์ผ๋ฉฐ ์ธ๋ถ ํ์ผ์์๋ก๋๋ฅผ ์๋ํ์ง ์์ต๋๋ค.
@icambron ์ฌ์ฉ์๊ฐ ๋ก์ผ์ผ๋ก 'en-US'๋ฅผ ์ ๋ฌํ ๋ ํธ๋ฆฌ๋ฅผ ๊ฑท๋ ๊ฒ์ ๋ํด ์ณ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ค, ๋๋ ํ์ฌ ๊ทธ๊ฒ์ ํตํด ๋๋ฒ๊น
ํ๊ณ ์์ผ๋ฉฐ ๋น์ ์ด ํธ๋ฆฌ๋ฅผ ๊ฑท๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ๊นจ์ง๊ณ ์์ต๋๋ค.
๋ด ์ฌ์ฉ ์ฌ๋ก๋ locale์ด ๋จ์ผ ๋ฌธ์์ด 'en-US'์ธ moment.utc (myDate, myFormat, locale, true)๋ฅผ ํธ์ถํ๋ ๊ฒ์
๋๋ค. ํด๋น ๋ฌธ์์ด์ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง (ํ์ผ์ด ์๊ธฐ ๋๋ฌธ์) ๋ฐฐ์ด์ด ์๋๋ฏ๋ก ๋ก์ผ์ผ์ ์๊ตฌํ๋ ค๊ณ ์๋ํ ๋ค์ ํ๋ก๋์
ํ๊ฒฝ์์ ์ค๋จ๋ฉ๋๋ค.
์ง์ง ์ต์ ์ ํ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์กด์ฌํ๋ ๋ก์ผ์ผ ๋ชฉ๋ก์ en-US๋ฅผ ์ค์ ๋ก ํฌํจํ๋ ๊ฒ ๊ฐ์ต๋๋ค (์ง๊ธ์ ์กด์ฌํ์ง ์๊ณ , ๊ทธ ์์ฒด๋ก en ๋ง ์์).
@steveccable ๊ธ์, ๊ทธ๊ฒ์ ๋น์ ์ด ๋ ๊ตฌ์ฒด์ ์ธ ์ง์ญ
@icambron ๋ด ํ๊ฒฝ์ npm์ ์ฌ์ฉํ์ฌ ์ข ์์ฑ์ ์ ์ดํ๋ โโReact Native ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฉฐ ์ต์ํ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ค๋ฅ๋ฅผ ๋ณต์ ํ ์์์์ต๋๋ค. ๋ฌธ์ ๋ loadLocale ํจ์์์ name์ด en-US ์ธ require ( './ locale /'+ name)์ ์๋ํ๊ณ ์์ฒญ์ด ์คํจํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฆด๋ฆฌ์ค ๋น๋์์ ์๊ตฌ ์ฌํญ์ด ์คํจํ๋ฉด ๋ค์ ์ค์ ๋ฐ๋ผ ์คํ ์ถ์ ๊ณผ ํจ๊ป ์ฑ์ด ์ค๋จ๋ฉ๋๋ค.
E/ReactNativeJS: Requiring unknown module "./locale/en-us".
E/AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
Process: com.myApp, PID: 30054
com.facebook.react.common.JavascriptException: Requiring unknown module "./locale/en-US"., stack:
o<strong i="7">@2</strong>:742
n<strong i="8">@2</strong>:426
i<strong i="9">@2</strong>:278
t<strong i="10">@2</strong>:210
Xe<strong i="11">@648</strong>:16702
nt<strong i="12">@648</strong>:17804
gt<strong i="13">@648</strong>:22583
yt<strong i="14">@648</strong>:22460
wt<strong i="15">@648</strong>:23200
c<strong i="16">@648</strong>:1112
parse<strong i="17">@645</strong>:1536
render<strong i="18">@643</strong>:2923
_renderValidatedComponentWithoutOwnerOrContext<strong i="19">@141</strong>:7295
_renderValidatedComponent<strong i="20">@141</strong>:7462
performInitialMount<strong i="21">@141</strong>:3012
mountComponent<strong i="22">@141</strong>:2056
mountComponent<strong i="23">@132</strong>:205
performInitialMount<strong i="24">@141</strong>:3162
mountComponent<strong i="25">@141</strong>:2056
mountComponent<strong i="26">@132</strong>:205
performInitialMount<strong i="27">@141</strong>:3162
mountComponent<strong i="28">@141</strong>:2056
mountComponent<strong i="29">@132</strong>:205
์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด getLocale์ด ๋ด ํค ( 'en-US')๊ฐ ๋ฐฐ์ด์ด ์๋์ ํ์ธํ๊ธฐ ๋๋ฌธ์ 'en'๊ณผ ์ผ์นํ์ง ์๊ณ loadLocale์ ๋น ์ง๋๋ค. ์ด๋ chooseLocale ํจ์๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํฉ๋๋ค.
ํธ์ง : chooseLocale ํจ์๋ฅผ ์ข ๋ ์์ธํ ์ดํด๋ณธ ํ์๋ ๋จผ์ 'en-US'๋ฅผ ์ ํํ ๋ค์ 'en'์ ์๋ํ๊ธฐ ์ ์ ์๊ตฌ ์ฌํญ์ ์คํจํ๋ฏ๋ก ์ฑ ์ถฉ๋๋ก ์ด์ด์ง๋ ์คํจํ ์๊ตฌ ์ฌํญ์ด ์ฌ์ ํ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐฐ์ด์ด๋ผ๋ฉด.
๋ํ ๊ทธ๊ฒ์ด ๊นจ์ง๋ ์ง์ ์ด try / catch ์์ ์์ง๋ง ์ด์จ๋ ์ถฉ๋์ ์ผ์ผํจ๋ค๋ ์ฌ์ค๋ ์ด์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ค์ ๋ก ์ฌ๊ธฐ์ ์ ๋ง ๋นํฉ์ค๋ฌ์ด ๊ฒ์
๋๋ค.
ํธ์ง 2 : ๋๋ฒ๊ทธ (__DEV__) ๋น๋์์ ์๊ตฌ๊ฐ ์ ์์ ์ผ๋ก ์คํจํ๊ณ 'en'์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋จ์ด์ง๋๋ค. ์ require๊ฐ __PROD__์์ ํจ์ฌ ๋ ํญ๋ฐ์ ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ํ์คํ ์ฌ๊ธฐ์ ๊นจ์ด๋๊ณ ์์ต๋๋ค.
ํธ์ง 3 : require js ๋ฌธ์์์ "์ข ์์ฑ์ ํํํ์ง ์์ผ๋ฉด RequireJS๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋๊ธฐ์์ผ๋ก๋ก๋ํ๊ณ ์๋์ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์๋ก๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค." ๋ฐ๋ผ์ try / catch๋ ์ค์ ๋ก ๋๊ธฐ ์ค๋ฅ์๋ง ๋์์ด๋๊ธฐ ๋๋ฌธ์ try / catch๊ฐ ์ค์ ๋ก ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ฅผ ๊ตฌํ ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฝ๊ฐ์ ์์ ์ ๋ง์น ํ์๋ (์ด์์ ์ด์ง ์์) ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด ์ฝ๋๊ฐ 'en-US'๋ก์ผ์ผ์ ์ ๋ฌํ๋ ค๊ณ ํ ๋๋ง๋ค ์ฝ๋๋ฅผ ๊ฐ๋ก ์ฑ๊ณ ๋์ 'en'๋ก์ผ์ผ์ ์ ๋ฌํฉ๋๋ค. ๋ค๋ฅธ ๋ก์ผ์ผ์ ๋ณ๊ฒฝ๋์ง ์๊ณ ํต๊ณผ ํ ์ ์์ต๋๋ค.
์ฆ, en-US๋ฅผ ์ฐพ์ ์ ์๊ฑฐ๋ ์ด๋ฏธ์๋ ๊ฒ์ผ๋ก ๊ธฐ๋ณธ ์ค์ ๋์ด ์์ง ์๋ค๋ ๊ฒ์ด ์ฌ์ ํ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ฉฐ ์ค์ ๋ก ํธ์ถ ๋ ๋ ์ฐพ์ง ๋ชปํ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ก์ผ์ผ๊ณผ ํจ๊ป ํ ์์๋ ๊ฒ์ฒ๋ผ ๊ตฌ์ฒด์ ์ผ๋ก ํฌํจ ํ ์ ์์ต๋๋ค. ์.
์๋ ํ์ธ์.
๋ํ ๊ทธ๊ฒ์ด ๊นจ์ง๋ ์ง์ ์ด try / catch ์์ ์์ง๋ง ์ด์จ๋ ์ถฉ๋์ ์ผ์ผํจ๋ค๋ ์ฌ์ค๋ ์ด์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ค์ ๋ก ์ฌ๊ธฐ์ ์ ๋ง ๋นํฉ์ค๋ฌ์ด ๊ฒ์ ๋๋ค.
๋ง์, ๊ทธ๊ฒ ๋ด๊ฐ ๋งํ๋๊ฑฐ์ผ. ์คํจํ ์์ฒญ ํธ์ถ์ด ์ ์น๋ช
์ ์ธ์ง ์ดํดํ๋ ค๊ณ ๋
ธ๋ ฅ ์ค์
๋๋ค. ๋๋ en-US
์ ๋ํ ์ง์์ผ๋ก ํ๋ ์ฝ๋ฉํ๋ ๊ฒ์ ๋์ง ์์ ๊ฒ์
๋๋ค; ๋ค๋ฅธ ํด ๋ฐฑ์ ๊ฒฝ์ฐ์๋ ์ ์ฌํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฆ, en
๊ฐ ํน๋ณํ ๊ฒฝ์ฐ์๋ ์๋ฌด ๊ด๋ จ์ด ์์ง๋ง, ํ๊ฒฝ์์ ์ ํ ์๋ํ์ง ์๋ ํด๋ฐฑ ํ๋ก์ธ์ค์ ๊ด๋ จ์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ ํตํด ์์
ํ๋ฉด React Native๊ฐ ์คํจํ ์๊ตฌ ์ฌํญ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋๋งํผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. en์ด ํน๋ณํ ๊ฒฝ์ฐ์ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ํน๋ณํ ๊ฒ์ฒ๋ผ ๋ณด์๋ ์ ์ผํ ์ด์ ๋ en-US ์๊ตฌ ์ฌํญ์ด ์คํจํ๋ ๊ฒ์ ๋ฐฉ์ง ํ ๋ฐฉ๋ฒ์ด ์์๊ธฐ ๋๋ฌธ์
๋๋ค (์ง์ ๊ฐ์ ธ์ฌ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค). ๋ค๋ฅธ ๋ก์ผ์ผ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก). ๋์ค์ ํธ์ง์์ ์ธ๊ธํ๋ฏ์ด try / catch๋ ๋น๋๊ธฐ ์ ์ผ๋ก ์คํจํ๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ต๋๋ค.
์ง๊ธ์ ์์์ ์ธ๊ธ ํ 'en-US'๋ก์ผ์ผ ์ญ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์ ๋ชฉ์ ์ ์ ํฉํฉ๋๋ค.
try / catch๋ ๋น๋๊ธฐ ์ ์ผ๋ก ์คํจํ๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ต๋๋ค.
์, ๊ทธ ํธ์ง์ ๋์ณค์ต๋๋ค. ๊ทธ๊ฒ๋ ๋ด ์ถ์ธก์ด ๋ ๊ฒ์ ๋๋ค.
์๋
ํ์ธ์.
์ฌ์ ํ ๋ฌธ์ ๊ฐ ์๋์ง ํ์คํ์ง ์์ง๋ง ๋ฆด๋ฆฌ์ค ๋น๋์์ ์ ํํ ๋์ผํ ์ถฉ๋ (ํ๋์ค์ด ๋ก์ผ์ผ ์ฌ์ฉ)์ด ๋๋ฅผ ์ํด ํ๋ฃจ ์ข
์ผ ์์
์ ์๋นํ์ต๋๋ค ๐ข
E/ReactNativeJS: Requiring unknown module "./locale/fr".
(...)
๋๋ ๊ทธ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ํด๊ฒฐํ๋ค.
import 'moment/locale/fr';
์๋ง๋ ๋์์ด ๋ ๊ฒ์ ๋๋ค
๋ก์ผ์ผ ์ ๋ ฅ์ ์ญ์ ํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ด์ฐฎ์ง ๋ง ๋ฐ์ ๋ค์ดํฐ๋ธ require ()๊ฐ ์ด๋ ๊ณณ์์๋ ๋น๋๊ธฐ ์ ์ผ๋ก ์คํจ ํ ์ ์์ผ๋ฉฐ์ด๋ฅผ ์ก์ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๋ ๊ฒ์ ์ ๋ง ๋ฌด์ญ์ต๋๋ค. ๋ํ ์กด์ฌํ์ง ์๋ ๋ก์ผ์ผ์ด๋ ์์์ ๋ฌธ์์ด (์ : 'blah-Blah')์ ๋ณด๋ด๋ฉด ์ฑ์ด ์ถฉ๋ํ๊ณ ์ด๋์๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌ ํ ์ โโ์์์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ์๋ฌด๋์ด ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ์ง ์๋์ง ๋ฐฉ์ด ์ ์ผ๋ก ํ์ธํด์ผํฉ๋๋ค.
๋ฒ์ 2.19.2 ์ดํ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. https://github.com/moment/moment/compare/29afed6...328d51e ํจ์ updateLocale์ด ๋ด๋ถ์ ์ผ๋ก loadLocale์ ์ฌ์ฉํ๊ธฐ ์์ํ์ผ๋ฉฐ ๋์ ๋ฌธ์์ด https๊ฐ ํ์ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ฐ์ ๋ค์ดํฐ๋ธ ์์ธ์์ ์คํจํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ณ์ https://github.com/facebook/react-native/issues/6391์ ์ํด ๋์ ์ผ๋ก ํ์ผ์ ์๊ตฌํ ์ ์์ต๋๋ค.
ํ์์ ํน์ ๊ฒฝ์ฐ์๋ en-gb ํ์ผ์ ๊ฐ์ ธ ์ค๋ฏ๋ก moment.locale์ ํธ์ถ ํ ๋ locales[name]
์์ ์ฐพ์ ์ ์์ต๋๋ค. ์ ํ์ํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
RN์ด ์ฐ์ ์์์ธ์ง ์๋์ง ํ์คํ์ง ์์ง๋ง RN์ ์๊ฐ์ ๋ช ๋ฌ ๋์ ๊นจ์ง ๊ฒ์ ๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ด facebook # 69๊ฐ ๋ชจ๋ ์ฌ๋์ ์ฐจ๋จ์ ํด์ ํ๋ ๊ฐ์ฅ ์์ฐ์ ์ธ ์์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. @jeanlauliac ์๊ฒ
๋ช ๊ฐ์ง ๋ฐฐ๊ฒฝ ์ง์์ ์ ๊ณตํ๊ธฐ ์ํด : ๋์ ์ข ์์ฑ์ ์ง์ํ์ง ์๋ ๋ฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค. ์ฒซ์งธ, ๋์ ์ผ๋ก ๋ชจ๋์ด ํ์ํ ๋ ์ ์ ๋ถ์์ด ์ค๋จ๋ฉ๋๋ค. ๋์งธ, ๋์ ์๊ตฌ ์ฌํญ์ ์ฌ์ฉํ ๋ ์ฐพ๊ณ ์๋ ์ค์ ๋ชจ๋์ ์ฌ์ฉํ์ง ๋ชปํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ํ๋ก๋์ ์์ ์ฌ์ฉ์๊ฐ ์ฑ์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒํ๋ ์ฃผ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Facebook์ ์์์ํฌ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ณผ๊ฑฐ์ ์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช์๊ณ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ฌ๋ฏธ ์์ง ์์ต๋๋ค. Metro๋ ์ฌ๋๋ค์ด ์ฌ์ฉ์์๊ฒ ๊ณ ํต์์ฃผ๋ ์ผ์ํ์ง ๋ชปํ๋๋ก ์๋์ ์ผ๋ก ์๊ฒฌ์ ์ ์ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ฐ๋ฆฌ๋์ด ์คํ ์์ค ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ํ์ฌ ์ข์ ์ํ๊ฐ ์๋๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ข์ ์์์ FB์์ Metro์์ ์์ ํ๋ ์ฌ๋์ด ๋ ์ด์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ Metro๋ฅผ ๋ ์ข๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋งค์ฅ์ ์ฌ๋ฌ ๊ฐ์ง ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ง๋ง ๋์ ์์์ Unrelate๋ฅผ ํตํด ์์ ํด์ผํ๋ ๊ธด๊ธํ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์คํ ์์ค๋ก. ์ฐ๋ฆฌ๋ ๋ช ๋ฌ ์์์ด repo๊ฐ โโํจ์ฌ ๋ ๋์ ์ํ๊ฐ๋๊ณ ๋ ์ฝ๊ฒ ๊ธฐ์ฌํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์๊ฐ์ ์ข์ฃผ์ธ์.
RN์ ๊ฒฝ์ฐ ๋ก์ผ์ผ์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ ( "xx-XX"๋ก์ผ์ผ์๋ก๋ํ์ง ๋ชปํ ๋ ํ๋ฉด ๋ค์์ ์ด๋ค ์๊ฐ์ด ์ํ๋๋์ง)์ผ๋ก ์ ๊ฑฐํ์ฌ ๋ฆด๋ฆฌ์ค ๋ชจ๋์์ ์๋ํ๋๋กํ์ต๋๋ค. ๋ค์ ์ค ๋ํซ์์ locale
๋ "xx-XX"ํ์์ ๊ธฐ๊ธฐ ๋ก์ผ์ผ์
๋๋ค.
moment.locale(locale.indexOf("-") === -1 ? locale : locale.substr(0, locale.indexOf('-')))
์ด๊ฒ์ ์ด์ํ ํ๋์ ๋๋ค.
https://stackoverflow.com/a/47260841/175825 ์ํ๊ณ์์ ์ฌ์ฉํ ์ ์๋๋ก ํน์ ๋ก์ผ์ผ์ ๊ฐ์ ธ์์ผํฉ๋๋ค.
์ด ๋ง๋ฒ ๋๋ฌธ์ mm/yy
์ฌ์ฉํ์ฌ BigCalendar.momentLocalizer()
mm/yy
์ ๊ฐ์ ๋ ์ง๋ฅผ ํ์ํ๋ react-big-calendar๋ฅผ ์ป์ ์ ์์ต๋๋ค.
react-big-calendar๋ก ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ง๋ง ํน์ ๋ก์ผ์ผ์ ์์ํ๋ ๋ค์ lib๋ ์ด๋ป์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๋ค์์?
en-us
๋ก์ผ์ผ์ ์ถ๊ฐํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก magic์ผ๋ก ์ค์ ํ์ญ์์ค.
en-us ๋ก์ผ์ผ์ ์ถ๊ฐํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก magic์ผ๋ก ์ค์ ํ์ญ์์ค.
๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ต๋๋ค. ์คํ์ธ์ด ( es-ES
=> es
)์ ๊ฐ์ด ์๋ ๋์ฒด๋ฅผ ์ํํ๋ ์ธ์ด๊ฐ ์์ต๋๋ค.
์ฌ์ ํ ํด๊ฒฐ์ฑ
์ ์ฐพ๊ณ ์๋ ์ฌ๋์ด๋ผ๋ฉด์ด ๋ฌธ์ ๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ง๋ง (๋ช ๊ฐ์ง ์ฃ์ง ์ผ์ด์ค๋ฅผ ์ ์ธํ๊ณ ) try-catch require
๋์ ์ถฉ๋์ ์ผ์ผํค๋ RN์ ๊ทผ๋ณธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ ๋ชปํฉ๋๋ค.
import moment from 'moment/min/moment-with-locales.min.js';
// locale is the locale detected by react-native-device-info
// ts is the time
export const formatTime = (locale, ts) => {
const m = moment.utc(ts);
locale = chooseMomentLocale(locale);
m.locale(locale);
// other logic to determine whether to show the time as "9:43 pm", "yesterday", or "7/8/2018"
return formattedTime;
}
/**
* Checks if the device locale is available in moment and returns the locale to be loaded
* <strong i="7">@param</strong> {string} locale locale to be checked
* <strong i="8">@return</strong> {string} locale to be loaded by moment
*/
const chooseMomentLocale = (locale) => {
// make the locale lower case
// will fix crashes caused by "en-GB" (instead of "en-gb") not being found
locale = locale.toLowerCase();
if (moment.locales().includes(locale)) { // check if the locale is included in the array returned by `locales()` which (in this case) tells us which locales moment will support
return locale;
} else if (moment.locales().includes(locale.substring(0, 2))) {
// check if the first two letters of the locale are included in the array returned by `locales()` which (in this case) tells us which locales moment will support
// will fixes crashes caused by "en-US" not being found, as we'll tell moment to load "en" instead
return locale.substring(0, 2);
}
// use "en-gb" (the default language and locale for my app) as a fallback if we can't find any other locale
return 'en-gb';
};
๋ํ React Native๋ฅผ ์ฌ์ฉํ์ฌ์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ผ๋ฉฐ Moment์ ํจ๊ป ๋ชจ๋ ๋ก์ผ์ผ์ ํฌํจํ์ฌ์ด๋ฅผ ํผํ ์์์์ต๋๋ค.
import moment from 'moment'
import 'moment/min/locales'
(๋๋ moment/min/moment-with-locales
๋ ์ ๊ณต๋์ง๋ง ๋ค๋ฅธ ํฌ๋งทํฐ์ ํธํ๋์ง ์์์ต๋๋ค.)
์ด๊ฒ์ ๋งค์ฐ ์ฑ๊ฐ์ ๋ฌธ์ ์ ๋๋ค.
๋น์ ์ด ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ ํ์์กฐ์ฐจ์๊ณ , ๋น์ ์ด ๋ฏธ๊ตญ์ ์๋ค๊ณ ํด์ ํ์คํ ๋น์ ์ ์ฝ๋์ 'en-US'๋ฅผ ํ๋ ์ฝ๋ฉํ์ง ์๋ ๋ก์ผ์ผ์ ์์ ์ด ์๋๊ฐ? ๋๋ ์ 'en-US'๋ก์ผ์ผ์ ์์ฒญํ ๋ ๊ทธ๊ฒ์ ๋ฐ์ ๋ค์ผ ์ ์๋์ง ์ดํดํ์ง ๋ชปํ๋ค. ์ฌ๋๋ค์๊ฒ ๋ํต์ ๋์ด ์์ต๋๋ค.
1 ๋ ์ ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง ๋ฐฉ๋ฒ์ ์์ ํ ์์์ผ๋ ๋ค์ ์์ํด์ผํฉ๋๋ค. (๋๋ Angular์์ ๋ ์ง ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ์ด ์ค๋ฅ๋ก ์ธํด ์ต์ํ์ ๊ตฌํ์ ์ ์ฉํ๊ณ ์์ต๋๋ค).
Datetime ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ Angular์์ ์ด๊ฒ์ ์ป๊ณ ์์ต๋๋ค. LOCALE๋ฅผ en-GB์ ๊ฐ์ ๊ฒ์ผ๋ก ์ค์ ํ๋ฉด ์ ๋๋ก ์๋ํ์ง๋ง ์๋ฌด๊ฒ๋ ์ง์ ํ์ง ์์ผ๋ฉด ์ป์ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ ์ ํ ๋ฐฉ๋ฒ์ ์์๋ผ ์ ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
RN์ ๊ฒฝ์ฐ ๋ก์ผ์ผ์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ ( "xx-XX"๋ก์ผ์ผ์๋ก๋ํ์ง ๋ชปํ ๋ ํ๋ฉด ๋ค์์ ์ด๋ค ์๊ฐ์ด ์ํ๋๋์ง)์ผ๋ก ์ ๊ฑฐํ์ฌ ๋ฆด๋ฆฌ์ค ๋ชจ๋์์ ์๋ํ๋๋กํ์ต๋๋ค. ๋ค์ ์ค๋ํ์์
locale
๋ "xx-XX"ํ์์ ์ฅ์น ๋ก์ผ์ผ์ ๋๋ค.
moment.locale(locale.indexOf("-") === -1 ? locale : locale.substr(0, locale.indexOf('-')))
์ด ์๋ฃจ์
์ ๋ค์๊ณผ ๊ฐ์ด i18n
๋ฐ momentjs
์ฌ์ฉํ์ฌ ์ ์๊ฒ ํจ๊ณผ์ ์
๋๋ค.
// imports:
import moment from 'moment';
import i18n from './i18n';
import 'moment/locale/fr';
// constructor:
moment.locale(i18n.locale.indexOf('-') === -1 ? i18n.locale : i18n.locale.substr(0, i18n.locale.indexOf('-')));
์ ๋ "moment": "^ 2.22.2"๋ฒ์ ์ ์คํํ๋ฉด์์ด ๋ฌธ์ ๋ฅผ ์คํํ๊ณ ์์ต๋๋ค.
๋ง์ง๋ง ๋ฒ์ ์์ ์์ ์ฌํญ์ด ์์ต๋๊น?
์ด ๋ฌธ์ ์ ๋ํด ๋ง์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋๋ ๋ํ ์๋ฒฝํ๊ฒ ์๋ํ๋ ๋ฉ์ง ๊ฐ๋ฐ์ ๋ง๋ ํ ์์ฐ์ ๋ฐ์ ๋ค์ดํฐ๋ธ ์์์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
@adesmet์ด ์ ์ํ ์๋ฃจ์
๊ณผ ๋ค์ ๋ฆฌํฉํฐ๋ง์ผ๋ก ํด๊ฒฐํ์ต๋๋ค.
function parseLocaleForMoment (language) {
if (language.indexOf('-') === -1) return language
else return language.substr(0, language.indexOf('-'))
}
RN์ด ์์๊ฐ์ ๋๋ฌด ์ง์ฆ๋์ ๋ค์ดํฐ๋ธ ํฌ๋งทํฐ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. ์๋ง๋ ํ ์ค์ ์ฝ๋๋ก ์๋ ํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ ํ์ต๋๋ค.
const subLocales = [
'ar-tn',
'ar-dz',
'ar-kw',
'ar-ma',
'ar-sa',
'ar-ly',
'de-at',
'de-ch',
'en-sg',
'en-au',
'en-ca',
'en-gb',
'en-ie',
'en-nz',
'es-us',
'es-do',
'fr-ca',
'fr-ch',
'gom-latn',
'hy-am',
'pa-in',
'pt-br',
'sr-cyrl',
'tl-ph',
'tlh',
'tet',
'ms-my',
'it-ch',
'tzl',
'tzm',
'tzm-latn',
'nl-be',
'ug-cn',
'uz-latn',
'zh-cn',
'zh-hk',
'zh-tw'
];
let momentLocale = i18n.locale.toLowerCase();
if (!subLocales.includes(momentLocale)) {
momentLocale = momentLocale.substring(0, 2);
}
moment.locale(momentLocale);
๋ฐ์ ๋ค์ดํฐ๋ธ @tapz๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๊น๊ฒ๋ Android์์ ์๋ํ๋ ๊ฒ ๊ฐ์ง๋ง iOS์์๋ ์ฌํ๊ฒ๋ : / ๋ช ๊ฐ์ง ์ด์ ๋ก zh
๋ก์ผ์ผ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค : /
์ด๋ zh ๋ฐ ๊ธฐํ ๋ช ๊ฐ์ง ๋ก์ผ์ผ์ด Simplified์ Traditional์ ๊ตฌ๋ณํ๊ธฐ ์ํด ๋ค๋ฅด๊ฒ ํ์ํ ๋์๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค. https://gist.github.com/jacobbubu/1836273 ์ฐธ์กฐ
@ rajivshah3 ์ค์ ๋ก ๋๋ tapz ๋ฐฉ๋ฒ์ผ๋ก ์๋ํ์ง ์๋ zh_Hant_HK
๊ฐ์ง๊ณ ์์์ต๋๋ค. ์ง๊ธ์ ๊ทํ์ ๊ฒ์๋ฌผ ๋๋ถ์์ด ๋ฌธ์ ๋ฅผ ์ต๋ํ ์ํํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ ์ธ ๊ทํ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค ๐
RN ์์ฐ ๋ชจ๋์์๋ง ๊ฐ์ ๋ฌธ์ ์ ๋๋ค.
์ด๊ฒ์ ๋๋ฅผ ์ํด ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
import 'moment/locale/fr';
import 'moment/locale/es';
import 'moment/locale/de';
import 'moment/locale/en-gb';
import 'moment/locale/es-us';
const toMomentLocale = locale => {
let momentLocale = locale;
momentLocale = momentLocale.replace('_', '-').toLowerCase();
momentLocale = ['en-gb', 'en-us'].includes(locale)
? momentLocale
: momentLocale.split('-')[0];
return momentLocale;
};
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ (๋๋ en
) ์ผ์ด์ค๋ฅผ ์กด์คํ๋ ํ, ์ฐ๋ฆฌ์๊ฒ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ์ ๋ง ๋ง๋ ์๋๋ ์ผ์
๋๋ค. ์ธ์ด ์ฝ๋์์ -region
์น์
์ ์ ๊ฑฐํ๋ ๊ฒ์ ํด๊ฒฐ์ฑ
์ด ์๋๋๋ค.
1) ๋ก์ผ์ผ์ ์ง์ญ์ ํน์ฑ์ด ์์ค๋ฉ๋๋ค.
2) ๋ ๋์ ๊ฒ์ ๊ทธ ๋ฐฉ๋ฒ์ด ๋ ๋ง์ ์ถฉ๋์ ์ผ์ผํฌ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ์ค๊ตญ์ด ( zh
)๋ MomentJS ๋ก์ผ์ผ์๋ ์กด์ฌํ์ง ์์ต๋๋ค. zh-cn
, zh-hk
๋ฐ zh-tw
๋ง ์ ์๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ผ์ผ ๋ฌธ์์ด์์ ์ง์ญ์ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ ๋๋ถ๋ถ์ ์ค๊ตญ ์ฅ์น์์ ์ฑ์ด ์ฆ์ ์ถฉ๋ํฉ๋๋ค. ์ฝ 8 ์ต ๋ช
์ ์ค๋งํธ ํฐ ์ฌ์ฉ์์
๋๋ค.
React Native์ ๋ํ ์์ (๊ทธ๋ฆฌ๊ณ ์์ ํ ๋งํ ) ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const locale = 'zh-cn'; // or en-US etc
const languageCode = moment.locale(locale.indexOf("-") === -1 ? locale : locale.substr(0, locale.indexOf('-'))); // now 'zh', 'en' etc. Thanks <strong i="14">@adesmet</strong>
let momentJsLocale;
switch(languageCode.toLowerCase()) {
case 'zh':
// No 'zh' locale exists in MomentJS. App will crash in production if used.
momentJsLocale = 'zh-cn';
break;
case 'pa':
momentJsLocale = 'pa-in';
break;
case 'hy':
momentJsLocale = 'hy-am';
break;
default:
momentJsLocale = languageCode.toLowerCase();
}
moment.locale(momentJsLocale);
@adammcarth ์๋ ํ์ธ์, RN์ ๋ชจ๋ฉํธ ๋ก์ผ์ผ ์์ ์ ๋ํ ์์์ด ์์ต๋๊น?
en-gb
์ฌ์ฉํ๋ ๋ฆด๋ฆฌ์ค ๋น๋์์ ๋ฐฉ๊ธ ์ถฉ๋ํ์ต๋๋ค.
๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. @simeyla .
Timepicker์ ํจ๊ป Luxon์ ์ถ๊ฐํ๋ฉด ๋ฌธ์ ๊ฐ ๋ํ๋๊ณ 'en-US'๋ก์ผ์ผ๊ณผ ๊ด๋ จ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
@steveccable ๊ธ์, ๊ทธ๊ฒ์ ๋น์ ์ด ๋ ๊ตฌ์ฒด์ ์ธ ์ง์ญ _ ๊ทธ๋ฅ ์ ์์ ์ผ๋ก ์คํจํ๊ณ ๋ค์ ์ต์ ์ผ๋ก ์ด๋ํด์ผํฉ๋๋ค. ๋ฐ๋ผ์ ํ๊ฒฝ์ ๋ํด ๋ ์์ธํ ์ค๋ช ํด์ผํฉ๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ๋ฌด์์ด ์๋ชป๋๊ณ ์์ต๋๊น?
'en-US'๋๋ ์์ธ๊ฐ์๋ ๋ค๋ฅธ ์ ํจํ ๋ก์ผ์ผ์ ์ฒ๋ฆฌ ํ ๋์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๋๋ฒ๊น ํ ๋ ๋๋ฒ๊ฑฐ์๊ฒ ์์ธ๋ฅผ ์ ๋ํ๋๋ก ์์ฒญํ ๋์ด ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ฉ ์ถฅ๋ ๋ค.
ํนํ 'en-US'์ ๊ฐ์ ๋๊ท๋ชจ ๋ก์ผ์ผ์ ๊ฒฝ์ฐ ๋ ์ข๊ณ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์์ด์ผํฉ๋๋ค.
๊ฒฐ๊ตญ, ๋ง์ ์ฒญ์ค / ์ฌ์ฉ ๊ฐ๋ฅ์ฑ์ด์๋ ์ด๋ฌํ ๋ก์ผ์ผ์ ์๋ ๊ณ ๋ ค๋ฅผ ์ํด ์์์ ํ์ธํ๊ณ ์ฒ๋ฆฌํด์ผํฉ๋๋ค.
@slorber ์ ์๋ฃจ์ ์ ๋ ๊ฐ๋ ฅํ๊ฒ ์์ ํ์ต๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์์ ๋ก์ผ์ผ (์ : "zh_CN"์์ "zh-cn"์ผ๋ก)์ ๋ค์ ํฌ๋งทํ๊ณ ์๊ฐ ์ค์น์์ ์ง์๋๋์ง ํ์ธํ๊ณ ๊ตญ๊ฐ๋ก ๋์๊ฐ ๋ค์ en-us๋ก ๋์๊ฐ๋๋ค.
const toMomentLocale = (locale) => {
let newLocale = locale.replace('_', '-').toLowerCase();
let tryLocales = [newLocale, newLocale.split('-')[0]];
for (let i = 0; i < tryLocales.length; i++) {
if (moment.locales().indexOf(tryLocales[i]) >= 0) return tryLocales[i];
}
return 'en-us';
};
// use it like this:
let m = moment();
m.locale(toMomentLocale('zh_CN')).format('LLL'); // "2019ๅนด12ๆ11ๆฅไธๅ9็น33ๅ" -- used "zh-cn"
moment.locale(toMomentLocale('ja_JP'));
moment().format('LLL') // 2019ๅนด12ๆ11ๆฅ 09:34 -- falls back to "ja"
RN ํ๋ก๋์ IOS ๋ชจ๋์์๋ง ๊ฐ์ ๋ฌธ์ ์ ๋๋ค.
์ด๊ฒ์ ๋๋ฅผ ์ํด ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
"์๊ฐ"์์ ์๊ฐ ๊ฐ์ ธ ์ค๊ธฐ;
import 'moment / locale / es';
์ด๊ฒ์ ๋๋ฒ๊น ํ๋ ๋ฐ ๊ฝค ๋ง์ ์๊ฐ์ ์๋นํ์ต๋๋ค. @jorodriguez ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ด๊ฒ์ ์ฌ์ ํ โโ๋ฌธ์ ์ ๋๋ค ๐ข
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
๋๋ ๋น์ ์ ์ํด ์์ ํจํค์ง๋ฅผ ๋ง๋ค์์ต๋๋ค-> https://github.com/tonix-tuft/moment-utl
npm install --save moment moment-utl
๋ค์์ ์ฌ์ฉํ์ฌ ๋ฏธ๋ฆฌ๋ก๋ ํ ํ์์์ด ์ง์๋๋ ๋ชจ๋ ๋ก์ผ์ผ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
import { allSupportedLocales, allSupportedLocalesMap } from "moment-utl";
const locales = allSupportedLocales(); // As an array: ["af", "ar", "ar-dz", "ar-kw", "ar-ly", "ar-ma", "ar-sa", "ar-tn", "az", "be", "bg", ..., "en", ..., "zh-tw"]
const localesMap = allSupportedLocalesMap(); // As an object: { "af": 1, "ar": 2, "ar-dz": 3, "ar-kw": 4, "ar-ly": 5, "ar-ma": 6, "ar-sa": 7, "ar-tn": 8, "az": 9, "be": 10, ..., "en": 27, "zh-tw": 128 };
moment-utl
ํผ์ด๋ moment
์ ์ข
์๋์ง๋ง ๋ชจ๋ moment
๋ก์ผ์ผ์ ๋ฒ๋ค๋ก ์ ๊ณตํฉ๋๋ค.
moment/locale
๋๋ ํ ๋ฆฌ์์ moment
dev ์ข
์์ฑ ํจํค์ง๋ฅผ ๋น๋ํ๋ ๋์ ๊ฐ์ ธ์ต๋๋ค.
๊ทธ๋ฌ๋ moment
๋ ํผ์ด ์ข
์์ฑ์ด๋ฏ๋ก ES6๋ฅผ ์ฌ์ฉํ๊ณ allSupportedLocales
๋ฐ allSupportedLocalesMap
๋ชจ๋ moment
์ ํจ๊ป ์ต์ ๋ก์ผ์ผ์ ์ฌ์ฉํ๋์ง ํ์ธํ๋ ค๋ ๊ฒฝ์ฐ moment-utl
์ ํจ๊ป ํ๋ก์ ํธ์ ์ค์น ํ moment
๋ฒ์ (์ : moment
์ด ์ธ์ ๊ฐ ์ ๋ก์ผ์ผ์ ์ถ๊ฐํ๋ฉด์ด ์์
์ ์ํํด์ผ ํจ), ๋ค์์ ์ฌ์ฉํ์ฌ ํด๋น ๋ก์ผ์ผ์ ๋ค์ ์์ฑ ํ ์๋ ์์ต๋๋ค. moment-utl-locales
์คํฌ๋ฆฝํธ ์ ๊ณต : moment-utl
.
npx
๋ช
๋ น๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
npm install -g npx # Install npx if you don't have it yet
npx moment-utl-locales # Run this command from your project's root folder
์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ๋๋ ์ฝ๋๋ฅผ Rollup ๋๋ Webpack (์ฌ์ฉํ๋ ๊ฒ)๊ณผ ํจ๊ป ๋ฒ๋ค๋ง ํ๊ธฐ ์ ์ ์คํํด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฒ ๋ค๋ฌ๊ฐ์ด๋ฅผ ๋ฐ๊ฒฌํ์ฌ ์ถ๊ฐํ๊ธฐ ์ ์ ์ต์ ๋ก์ผ์ผ ๋ฐฐ์ด ๋ฐ ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. ์ต์ข ๋ฒ๋ค.
์ด๊ฒ ๋์์ด ๋๊ธธ ๋ฐ๋๋ค!
@adammcarth์ ๋ํ ๋ต์ฅ์ผ๋ก ์ฌ๊ธฐ์์ ๋ด ๋๋ต์ ํ์ธํ์ญ์์ค : https://github.com/tonix-tuft/moment-utl/issues/1#issuecomment -616088826
์ด ๋ฌธ์ ๋ Odoo์ ์ฌ๋๋ค์ ๊ดด๋กญ ํ์ผ๋ฉฐ ์ ์ ๋ ์์ ์ฌํญ ์ en-us ํ์ผ์ ์๋์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์์ต๋๋ค. ํ์จ.
๋ด๊ฐ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ์ ์์ ์ค๋ช ์์ ์ธ๊ธํ๋ฏ์ด ๋ก๋๊ฐ ์ด๋ฏธ "en"์ด ์๊ณ ๋์ ์ผ๋ก ๊ฐ์ ธ ์ค์ง ์๋๋ค๋ ๊ฒ์ ์์์ผํ๋ ๊ฒฝ์ฐ en-us ํ์ผ์๋ก๋ํ๋ ค๊ณ ํ๋ ์ด์ ์ ๋๋ค.
์ด์จ๋ RN ์ฌ์ฉ์์๊ฒ๋ ์ฌ์ ํ ์ ๋ชฝ์ ๋๋ค. ์ต์ ์ ๋ถ๋ถ์ ๋ฌธ์ ๊ฐ ํ๋ก๋์ ๋น๋์์๋ง ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
์จ๊ฒจ์ง ๊ธฐ๋ณธ๊ฐ์ ๊ฐ๋ ๊ฒ์ ๋๋ผ์์ ํจํค์ง์ ๋๋ค ...
์ด ๋ฌธ์ ๋ Odoo์ ์ฌ๋๋ค์ ๊ดด๋กญ ํ์ผ๋ฉฐ ์ ์ ๋ ์์ ์ฌํญ ์ en-us ํ์ผ์ ์๋์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์์ต๋๋ค. ํ์จ.
๋ด๊ฐ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ์ ์์ ์ค๋ช ์์ ์ธ๊ธํ๋ฏ์ด ๋ก๋๊ฐ ์ด๋ฏธ "en"์ด ์๊ณ ๋์ ์ผ๋ก ๊ฐ์ ธ ์ค์ง ์๋๋ค๋ ๊ฒ์ ์์์ผํ๋ ๊ฒฝ์ฐ en-us ํ์ผ์๋ก๋ํ๋ ค๊ณ ํ๋ ์ด์ ์ ๋๋ค.
์ด์จ๋ RN ์ฌ์ฉ์์๊ฒ๋ ์ฌ์ ํ ์ ๋ชฝ์ ๋๋ค. ์ต์ ์ ๋ถ๋ถ์ ๋ฌธ์ ๊ฐ ํ๋ก๋์ ๋น๋์์๋ง ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
์จ๊ฒจ์ง ๊ธฐ๋ณธ๊ฐ์ ๊ฐ๋ ๊ฒ์ ๋๋ผ์์ ํจํค์ง์ ๋๋ค ...
๋๋ ์ด๊ฒ์ ์ํด ๐๋ฅผ ์ป์ ๊ฒ์ด์ง๋ง ๋ด ์๋ฃจ์
์ dayjs
moment
๊ต์ฒดํ์ต๋๋ค. ๋์ผํ ๊ธฐ๋ฅ / API ์ด๋ฆ์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ find all + replace all
๋งํผ ๊ฐ๋จํ์ต๋๋ค.
์ด๊ฒ์ ๊ณ ๋ คํ๊ณ ์ถ์ ์ฌ๋๋ค์ ์ํด ๋ด๊ฐ ํ ์ผ์ ๊ณต์ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@icambron ๋ด ํ๊ฒฝ์ npm์ ์ฌ์ฉํ์ฌ ์ข ์์ฑ์ ์ ์ดํ๋ โโReact Native ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฉฐ ์ต์ํ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ค๋ฅ๋ฅผ ๋ณต์ ํ ์์์์ต๋๋ค. ๋ฌธ์ ๋ loadLocale ํจ์์์ name์ด en-US ์ธ require ( './ locale /'+ name)์ ์๋ํ๊ณ ์์ฒญ์ด ์คํจํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฆด๋ฆฌ์ค ๋น๋์์ ์๊ตฌ ์ฌํญ์ด ์คํจํ๋ฉด ๋ค์ ์ค์ ๋ฐ๋ผ ์คํ ์ถ์ ๊ณผ ํจ๊ป ์ฑ์ด ์ค๋จ๋ฉ๋๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด getLocale์ด ๋ด ํค ( 'en-US')๊ฐ ๋ฐฐ์ด์ด ์๋์ ํ์ธํ๊ธฐ ๋๋ฌธ์ 'en'๊ณผ ์ผ์นํ์ง ์๊ณ loadLocale์ ๋น ์ง๋๋ค. ์ด๋ chooseLocale ํจ์๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํฉ๋๋ค.
ํธ์ง : chooseLocale ํจ์๋ฅผ ์ข ๋ ์์ธํ ์ดํด๋ณธ ํ์๋ ๋จผ์ 'en-US'๋ฅผ ์ ํํ ๋ค์ 'en'์ ์๋ํ๊ธฐ ์ ์ ์๊ตฌ ์ฌํญ์ ์คํจํ๋ฏ๋ก ์ฑ ์ถฉ๋๋ก ์ด์ด์ง๋ ์คํจํ ์๊ตฌ ์ฌํญ์ด ์ฌ์ ํ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐฐ์ด์ด๋ผ๋ฉด.
๋ํ ๊ทธ๊ฒ์ด ๊นจ์ง๋ ์ง์ ์ด try / catch ์์ ์์ง๋ง ์ด์จ๋ ์ถฉ๋์ ์ผ์ผํจ๋ค๋ ์ฌ์ค๋ ์ด์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ค์ ๋ก ์ฌ๊ธฐ์ ์ ๋ง ๋นํฉ์ค๋ฌ์ด ๊ฒ์ ๋๋ค.
ํธ์ง 2 : ๋๋ฒ๊ทธ (__DEV__) ๋น๋์์ ์๊ตฌ๊ฐ ์ ์์ ์ผ๋ก ์คํจํ๊ณ 'en'์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋จ์ด์ง๋๋ค. ์ require๊ฐ __PROD__์์ ํจ์ฌ ๋ ํญ๋ฐ์ ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ํ์คํ ์ฌ๊ธฐ์ ๊นจ์ด๋๊ณ ์์ต๋๋ค.
ํธ์ง 3 : require js ๋ฌธ์์์ "์ข ์์ฑ์ ํํํ์ง ์์ผ๋ฉด RequireJS๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋๊ธฐ์์ผ๋ก๋ก๋ํ๊ณ ์๋์ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์๋ก๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค." ๋ฐ๋ผ์ try / catch๋ ์ค์ ๋ก ๋๊ธฐ ์ค๋ฅ์๋ง ๋์์ด๋๊ธฐ ๋๋ฌธ์ try / catch๊ฐ ์ค์ ๋ก ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ฅผ ๊ตฌํ ์๋ ์์ต๋๋ค.