Moment: in, ๋ฏธ๊ตญ ๋‚ด ์ง€์—ญ

์— ๋งŒ๋“  2016๋…„ 11์›” 24์ผ  ยท  42์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: moment/moment

์งˆ๋ฌธ ํ•˜๋‚˜ :

'en', 'en-US'๋กœ์ผ€์ผ์ด์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด '๊ธฐ๋ณธ๊ฐ’'๊ฐ’์œผ๋กœ ๋ฐ›์•„ ๋“ค์—ฌ ์กŒ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ , ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด, ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ผ€์ผ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ์ผ€์ผ์„ ์„ ํƒํ•  ์ˆ˜์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ์ฝค๋ณด๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด๋ณด์‹ญ์‹œ์˜ค.
๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ๊ทธ ํ˜„์žฌ ๊ฐ’์œผ๋กœ moment.locale ()์„ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ƒํ™ฉ์—์„œ๋Š” en / en-US ์ผ€์ด์Šค๋ฅผ ํŠน์ˆ˜ ์ผ€์ด์Šค๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š”๋ฐ, ์ข€ ์–ด์ƒ‰ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ์œ„๋Œ€ํ•œ ์ผ์— ๋Œ€ํ•œ Thx. ๊ณ„์† ๋ฐ€๊ณ !

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@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๊ฐ€ ์‹ค์ œ๋กœ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  42 ๋Œ“๊ธ€

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์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

image

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"๋ฒ„์ „์„ ์‹คํ–‰ํ•˜๋ฉด์„œ์ด ๋ฌธ์ œ๋ฅผ ์‹คํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰ ๋ฒ„์ „์—์„œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ง์”€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. en-US๋ฅผ ์ˆจ๊ฒจ์ง„ ๊ธฐ๋ณธ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๋””์ž์ธ์ž…๋‹ˆ๋‹ค.
  2. en-us ๋กœ์ผ€์ผ์ด ์—†์œผ๋ฉด ์–ด๋–ค CDN ๋ฒ„์ „์„ ์‚ฌ์šฉํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
  3. ์ˆœ๊ฐ„์ด ์ธ์ƒ์ ์ด์ง€๋งŒ en-US๊ฐ€ ๋‹ค๋ฅธ ๋กœ์ผ€์ผ๊ณผ ๋™์ผํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ๋‚˜์œ ์ฝ”๋“œ ๋ƒ„์ƒˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ฉ‹์ง„ ๊ฐœ๋ฐœ์„ ๋งŒ๋“  ํ›„ ์ƒ์‚ฐ์‹œ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์—์„œ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
@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 ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์—ฌ์ „ํžˆ ์•…๋ชฝ์ž…๋‹ˆ๋‹ค. ์ตœ์•…์˜ ๋ถ€๋ถ„์€ ๋ฌธ์ œ๊ฐ€ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ˆจ๊ฒจ์ง„ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋†€๋ผ์›€์˜ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค ...

image

์ด ๋ฌธ์ œ๋Š” Odoo์˜ ์‚ฌ๋žŒ๋“ค์„ ๊ดด๋กญ ํ˜”์œผ๋ฉฐ ์ œ์•ˆ ๋œ ์ˆ˜์ • ์‚ฌํ•ญ ์€ en-us ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•œ์ˆจ.

๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์œ„์˜ ์„ค๋ช…์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋กœ๋”๊ฐ€ ์ด๋ฏธ "en"์ด ์žˆ๊ณ  ๋™์ ์œผ๋กœ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์•ผํ•˜๋Š” ๊ฒฝ์šฐ en-us ํŒŒ์ผ์„๋กœ๋“œํ•˜๋ ค๊ณ ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  RN ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์—ฌ์ „ํžˆ ์•…๋ชฝ์ž…๋‹ˆ๋‹ค. ์ตœ์•…์˜ ๋ถ€๋ถ„์€ ๋ฌธ์ œ๊ฐ€ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ˆจ๊ฒจ์ง„ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋†€๋ผ์›€์˜ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค ...

image

๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด ๐Ÿ‘Ž๋ฅผ ์–ป์„ ๊ฒƒ์ด์ง€๋งŒ ๋‚ด ์†”๋ฃจ์…˜์€ dayjs moment ๊ต์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๊ธฐ๋Šฅ / API ์ด๋ฆ„์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— find all + replace all ๋งŒํผ ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•œ ์ผ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰