ãã ã®è³ªåïŒ
'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}ãããŒãããããã«requiredepãã¹ãæ§ç¯ãããå ŽåãèããŠã¿ãŸãã ãã®å€æ°ããenããŸãã¯ãen-usãã®å Žåãrequirejsã¯ãã¡ã€ã«ã®ããŒãã«å€±æããŸãïŒ404ãååŸããŸãïŒã 'de'ãšããŠæ€åºãããå Žåããã¡ã€ã«ãããŒã
@eigood Momentã®ãã±ãŒã«ããŒããŒã¯ããã§ã«è±èªã䜿çšãããŠããããšãèªèããŠãããå€éšãã¡ã€ã«ããããŒãããããšã¯ããŸããã
@icambronãŠãŒã¶ãŒããã±ãŒã«ãšããŠãen-USããæž¡ãããšãã«ããªãŒãæ©ãããšã«ã€ããŠããªããæ£ãããšã¯æããŸããã å®éãç§ã¯çŸåšããããããã°ããŠããŸãããããªããæšãæ©ããŠããªãã®ã§å£ããŠããŸãã
ç§ã®ãŠãŒã¹ã±ãŒã¹ã¯ãmoment.utcïŒmyDateãmyFormatãlocaleãtrueïŒãåŒã³åºããŠããå Žåã§ããããã§ãlocaleã¯åäžã®æåå 'en-US'ã§ãã ãã®æååã¯ã€ã³ããŒãã§ããŸãããïŒãã¡ã€ã«ããªãããïŒãé
åã§ã¯ãªãããããã±ãŒã«ãèŠæ±ããããšããæ¬çªç°å¢ã§äžæããŸãã
æ¬åœã®æåã®åäœã¯ãããã©ã«ãã§ååšãããã±ãŒã«ã®ãªã¹ãã«å®éã«en-USãå«ããããšã§ããããã«æãããŸãïŒçŸåšã¯ååšãããenã ãã§ãïŒã
@steveccableãããšãããå ·äœçãªããŒã«ãªãŒãŒã·ã§ã³ããã£ãå Žåã«åããŠãããŒãããããšããŸãã 倱æãããšããenãã ããè©Šè¡ããŠæåããŸãã åæã¯ãã©ãããããããen-USãã®ããŒãã«å€±æããããšãåå ã ãšæããŸãã ããã§ã¯äœãççºããããšã¯ãããŸããã æ£åžžã«å€±æãã次ã®ãªãã·ã§ã³ã«ç§»åããããšã«ãªã£ãŠããŸãã ããã§ãããªãã¯ããªãã®ç°å¢ã«ã€ããŠãã£ãšç§ã«è©±ããªããã°ãªããªãã§ãããïŒå ·äœçã«ã¯äœãééã£ãŠããã®ã§ããïŒ
@icambronç§ã®ç°å¢ã¯ãnpmã䜿çšããŠäŸåé¢ä¿ãå¶åŸ¡ããReact Nativeã¢ããªã±ãŒã·ã§ã³ã§ãããæå°éã®ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã§ãé害ãåçŸããããšãã§ããŸããã åé¡ã¯ãloadLocaleé¢æ°ã§ãnameãen-USã§ããrequireïŒ './ locale /' + nameïŒãè©Šè¡ããrequireã倱æããããšã§ãã ãã®requireããªãªãŒã¹ãã«ãã§å€±æãããšãã¢ããªã¯æ¬¡ã®è¡ã«æ²¿ã£ãã¹ã¿ãã¯ãã¬ãŒã¹ã§ã¯ã©ãã·ã¥ããŸãã
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ããè©Šãåã«requireã«å€±æãããããrequireã倱æãããšã¢ããªãã¯ã©ãã·ã¥ããŸãããããé
åã®å Žåã
ãŸãããããå£ããŠããå Žæããã©ã€/ãã£ããã®å
åŽã«ãããšããäºå®ãå¥åŠã§ããããšã«ããã¯ã©ãã·ã¥ãåŒãèµ·ãããŸãã ããã¯å®éã«ããã§æ¬åœã«å°æããããšã§ãã
ç·šé2ïŒãããã°ïŒ__DEV__ïŒãã«ãã§ã¯ãrequireãæ£åžžã«å€±æãããã®åŸããenãã䜿çšããããšã«ãªããŸãã requireã__PROD__ã§ããã»ã©ççºçã§ããçç±ã¯ããããŸããããããã§ã¯ééããªãç¬éçã«å£ããŠããŸãã
ç·šé3ïŒrequire jsã®ããã¥ã¡ã³ãããããäŸåé¢ä¿ãè¡šçŸããªããšãRequireJSãã¹ã¯ãªãããéåæã«ããŒãããé床ãäœäžãããããããŒããšã©ãŒãçºçããå¯èœæ§ããããŸããã ãããã£ãŠãtry / catchã¯åæãšã©ãŒã«ã®ã¿åœ¹ç«ã€ãããtry / catchãå®éã«ããã«ä¿åãããå¯èœæ§ã¯ã»ãšãã©ãããŸããã
ãããã£ãŠãå°ãäœæ¥ããåŸãïŒçæ³çãšã¯èšããªãïŒåé¿çããããŸãã åºæ¬çã«ãã³ãŒãããen-USãã®ãã±ãŒã«ãæž¡ãããšãããšãã¯ãã€ã§ãããããã€ã³ã¿ãŒã»ããããŠã代ããã«ãenãã®ãã±ãŒã«ãæž¡ããŸãã ä»ã®ãã±ãŒã«ã¯å€æŽããã«ééã§ããŸãã
ãšã¯ãããen-USãèŠã€ãããªãããšããããã©ã«ãã§ãã§ã«ããããšã¯ãŸã åé¡ã ãšæããŸããå®éã«åŒã³åºããããšãã«èŠã€ãããªãããšãé¿ããããã«ãä»ã®ãã±ãŒã«ã®ããã«å ·äœçã«å«ããããšã¯ã§ããŸãããã«ã
@steveccable
ãŸãããããå£ããŠããå Žæããã©ã€/ãã£ããã®å åŽã«ãããšããäºå®ãå¥åŠã§ããããšã«ããã¯ã©ãã·ã¥ãåŒãèµ·ãããŸãã ããã¯å®éã«ããã§æ¬åœã«å°æããããšã§ãã
ããã§ãããããç§ãèšã£ãŠããããšã§ãã 倱æããrequireåŒã³åºããå£æ»
çã§ããçç±ãç解ããããšããŠããŸãã en-US
ç¥èã§ããŒãã³ãŒãã£ã³ã°ããã®ã¯å©ãã«ãªããŸãã; ä»ã®ãã©ãŒã«ããã¯ã®å Žåã§ããåæ§ã®é害ãçºçããŸãã ã€ãŸããããã¯en
ãç¹æ®ãªã±ãŒã¹ã§ããããšãšã¯é¢ä¿ãããŸãããããã©ãŒã«ããã¯ããã»ã¹ãç°å¢ã§ãŸã£ããæ©èœããŠããªãããšãšé¢ä¿ããããŸãã
ãããåŠçããŠã¿ããšãReactNativeã¯å€±æããèŠæ±ãç§ãã¡ãæãããã«åªé
ã«åŠçããŠããªãããã§ãã enãç¹å¥ãªå Žåã§ããããšã«é¢ä¿ããªãããšã¯æ£ããã§ããããããç¹å¥ã§ãããšæãããå¯äžã®çç±ã¯ãen-USã®requireã倱æããã®ãé²ãæ¹æ³ããªãã£ãããã§ãïŒçŽæ¥ã€ã³ããŒãã§ããªãããïŒä»ã®ãã±ãŒã«ãšåæ§ïŒã åŸã®ç·šéã§èª¬æããããã«ãtry / catchã¯éåæã§å€±æãããããæ©èœããŸããã
ä»ã®ãšããããen-USãã®ãã±ãŒã«ããµãã¿ã€ãºãããšããäžèšã®åé¿çã¯ãç§ã®ç®çã«ã¯æå¹ã§ãã
éåæã§å€±æãããããtry / catchã¯æ©èœããŸãã
ãããç§ã¯ãã®ç·šéãéããŸããã ãããç§ã®æšæž¬ã§ããã
@steveccable
ããã§ãåé¡ãçºçãããã©ããã¯ããããŸãããããªãªãŒã¹ãã«ãã§ãŸã£ããåãã¯ã©ãã·ã¥ãçºçããŸããïŒãã ãããã©ã³ã¹èªã®ãã±ãŒã«ã§ã¯ïŒã1æ¥ããããŸããð¢
E/ReactNativeJS: Requiring unknown module "./locale/fr".
(...)
ç§ã¯ããã解決ããŸããïŒ
import 'moment/locale/fr';
å€åããã¯åœ¹ç«ã¡ãŸã
ãã±ãŒã«å ¥åããµãã¿ã€ãºããåé¿çã¯åé¡ãããŸããããreact Native requireïŒïŒãã©ãã§ãéåæã«å€±æããå¯èœæ§ããããããããã£ããããæ¹æ³ããªãããšãç¥ãã®ã¯æ¬åœã«æãã§ãã ãŸããååšããªããã±ãŒã«ãŸãã¯ã©ã³ãã ãªæååïŒããšãã°ããblah-BlahãïŒãéä¿¡ãããšãã¢ããªãã¯ã©ãã·ã¥ããã©ãã§ããšã©ãŒãåŠçã§ããªããªããŸãã ã ããç§ã¯ã誰ããã®ãã°ãåŒãèµ·ãããªãããšãé²åŸ¡çã«ãã§ãã¯ããå¿ èŠããããŸãã
ããŒãžã§ã³2.19.2以éã§åé¡ãçºçããŸããããã®ãªãªãŒã¹ã§å€æŽãããå 容ã¯æ¬¡ã®ãšããã§ãhttps://github.com/moment/moment/compare/29afed6...328d51eé¢æ°updateLocaleãloadLocaleãå éšã§äœ¿çšãå§ããåçæååhttpsã§requireã䜿çšããŸãã
å€æ°https://github.com/facebook/react-native/issues/6391ã§ãã¡ã€ã«ãåçã«èŠæ±ã§ããªããããããã¯ãã€ãã£ãã®åå¿ã«å€±æãããšæã
ç§ã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãen-gbãã¡ã€ã«ãã€ã³ããŒãããŠããã®ã§ãmoment.localeãåŒã³åºããŸã§ã«locales[name]
ã«ããã¯ãã§ãã ãªããããå¿
èŠã«ãªãã®ãããããŸããã
RNãåªå äºé ã§ãããã©ããã¯ããããŸããããRNã®ç¬éã¯æ°ãæéå£ããŸãã
ããããã¹ãŠãèæ ®ãããšãfacebookïŒ69ããã¹ãŠã®äººã®ãããã¯ã解é€ããããã®æãçç£çãªä¿®æ£ã§ããããã«æãããŸãã @jeanlauliacãšè©±ãããŠãæææ¥ã«ããŒãžã§ãããã©ããã確èªããŸãã
èæ¯ã説æããããã«ãåçäŸåé¢ä¿ããµããŒãããªãçç±ã¯è€æ°ãããŸãã ãŸããåçã«ã¢ãžã¥ãŒã«ãå¿ èŠãšããå Žåãéçåæãæ©èœããªããªããŸãã 次ã«ãåçèŠæ±ã䜿çšããå Žåãæ¢ããŠããå®éã®ã¢ãžã¥ãŒã«ã䜿çšã§ããªãå ŽåããããŸãã ããã«ãããFacebookãå£ããªã©ããŠãŒã¶ãŒãã¢ããªã䜿çšã§ããªããªããããªå€§ããªåé¡ãæ¬çªç°å¢ã§çºçããå¯èœæ§ããããŸãã ç§ãã¡ã¯éå»ã«ãã®ãããªåé¡ãæ±ããŠããã®ã§ã察åŠããã®ã¯æ¥œããããšã§ã¯ãããŸããã Metroã¯ããŠãŒã¶ãŒããŠãŒã¶ãŒã«èŠçãäžãããããªããšãããªãããã«æå³çã«èããããŠããŸãã
æåŸã«ããã®ãªãŒãã³ãœãŒã¹ãªããžããªã¯çŸåšãè¯å¥œãªç¶æ ã§ã¯ãªãããšãç解ããŠããŸãã è¯ããã¥ãŒã¹ã¯ãFBã§Metroã«åãçµãã§ãã人ããããŸã§ã«ãªãå¢ããããšã§ãããŸããMetroãå€§å¹ ã«æ¹åããããã«ãåºèã«å€ãã®å€§ããªå€æŽããããŸãããæªããã¥ãŒã¹ã¯ãé¢ä¿ã®ãªãäœæ¥ãè¡ãå¿ èŠãããå·®ãè¿«ã£ãåé¡ãããããšã§ãããªãŒãã³ãœãŒã¹ã«ã æ°ãæ以å ã«ãã®ãªããžããªãã¯ããã«è¯ãç¶æ ã«ãªããè²¢ç®ãããããªãããšãé¡ã£ãŠããŸãã ãã°ãããåŸ ã¡ãã ããã
RNã®å Žåããã±ãŒã«ã®æåã®éšåïŒããããããxx-XXããã±ãŒã«ã®ããŒãã«å€±æãããšãã«ç»é¢ã®èåŸã§ã©ã®ãããªç¬éãçºçãããïŒãåé€ããããšã§ããªãªãŒã¹ã¢ãŒãã§åäœããããã«ãªããŸããã 次ã®ã¹ããããã§ã¯ã locale
ã¯ãxx-XXãã®åœ¢åŒã®ããã€ã¹ã®ãã±ãŒã«ã§ãã
moment.locale(locale.indexOf("-") === -1 ? locale : locale.substr(0, locale.indexOf('-')))
ããã¯å¥åŠãªæ¯ãèãã§ãã
https://stackoverflow.com/a/47260841/175825ãšã³ã·ã¹ãã ãããããæ¶è²»ã§ããããã«ããã«ã¯ãç¹å®ã®ãã±ãŒã«ãã€ã³ããŒãããå¿ èŠããããŸãã
ãã®éæ³ã®ããã§ãreact-big-calendarã«mm/yy
ã䜿çšããŠBigCalendar.momentLocalizer()
mm/yy
ãããªæ¥ä»ã衚瀺ãããããšã¯ã§ããŸãããããã¯ãããŒãããããã±ãŒã«ãæ³å®ããŠããããã§ãã
ç§ã¯react-big-calendarã§åé¡ãéãããšãã§ããŸããããç¹å®ã®ãã±ãŒã«ãæåŸ ããŠãã次ã®ã©ã€ãã©ãªã«ã€ããŠã¯ã©ãã§ããããïŒ ãããŠæ¬¡ã¯ïŒ
en-us
ãã±ãŒã«ãè¿œå ããã ãã§ãããã©ã«ãã¯ããžãã¯ã«ãªããŸãã
en-usãã±ãŒã«ãè¿œå ããããã©ã«ãã§ããžãã¯ã«èšå®ããã ãã§ãã
ããã¯åé¡ã解決ããŸãããèªåãã©ãŒã«ããã¯ãè¡ãã¹ãã€ã³èªïŒ es-ES
=> es
ïŒã®ãããªèšèªããããŸãã
ãŸã 解決çãæ¢ããŠãã人ã«ãšã£ãŠãããã¯åé¡ã軜æžããã®ã«åœ¹ç«ã€ãããããŸãããïŒããã€ãã®ãšããžã±ãŒã¹ãé€ããŠïŒãtry-catchã®éã«ã¯ã©ãã·ã¥ãåŒãèµ·ããRNã®æ ¹æ¬çãªåé¡ãä¿®æ£ããŸããrequire
ïŒ
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ã§æ¥ä»ããã«ãŒã䜿çšããŠããŠãæå°éã®å®è£ ãå ¥ããã ãã§ãã®ãšã©ãŒãçºçããŸãïŒã
æ¥æããã«ãŒã䜿çšããããšããŠã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"ã
ååã®ããŒãžã§ã³ã§ã®ä¿®æ£ã¯ãããŸããïŒ
ãã®åé¡ã«ã€ããŠãã£ã€ã ã鳎ãããŸãã
ãŸããå®ç§ã«æ©èœããçŽ æŽãããéçºãæ§ç¯ããåŸãæ¬çªç°å¢ã§ã®react-nativeã§ãã®ãšã©ãŒãçºçããŸããã
@adesmetãææ¡ãããœãªã¥ãŒã·ã§ã³ãšæ¬¡ã®ãªãã¡ã¯ã¿ãªã³ã°ã§è§£æ±ºããŸããã
function parseLocaleForMoment (language) {
if (language.indexOf('-') === -1) return language
else return language.substr(0, language.indexOf('-'))
}
RNã¯éåžžã«ç¬éçã«åžãããã«èŠããã®ã§ããã€ãã£ããã©ãŒããã¿ãŒãäœæããæ¹ãç°¡åã§ãã ãããããã£ã1è¡ã®ã³ãŒãã§ãé²åŒŸãæ©èœããŸãã
ãã®ããã«ä¿®æ£ããããšã«ãªããŸããïŒ
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);
æ²ããããšã«ãreact native @tapzã䜿çšãããšãããã¯Androidã§æ©èœããããã§ãããiOSã§ã¯æ²ããããšã«ïŒ/äœããã®çç±ã§zh
ãã±ãŒã«ã§åé¡ãçºçããŠããŸãïŒ/
ããã¯ãç°¡äœåãšåŸæ¥åãåºå¥ããããã«ãzhãšä»ã®ããã€ãã®ãã±ãŒã«ã®åœ¢åŒãç°ãªãããã§ããå¯èœæ§ããããŸãã https://gist.github.com/jacobbubu/1836273ãåç §ããŠ
@ rajivshah3確ãã«ç§ã¯tapxã¡ãœããã§åäœããŠããªãã£ã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 ã
Luxonãã¿ã€ã ããã«ãŒãšäžç·ã«è¿œå ãããšãåé¡ãçºçãããen-USããã±ãŒã«ã«é¢é£ããŠããããã«èŠããŸãã
@steveccableãããšãããå ·äœçãªããŒã«ãªãŒãŒã·ã§ã³ããã£ãå Žåã«åããŠãããŒãããããšããŸãã 倱æãããšããenãã ããè©Šè¡ããŠæåããŸãã åæã¯ãã©ãããããããen-USãã®ããŒãã«å€±æããããšãåå ã ãšæããŸãã ããã§ã¯äœãççºããããšã¯ãããŸããã _æ£åžžã«å€±æããããšã«ãªã£ãŠããŸã_ãããŠæ¬¡ã®ãªãã·ã§ã³ã«ç§»åããŸãã ããã§ãããªãã¯ããªãã®ç°å¢ã«ã€ããŠãã£ãšç§ã«è©±ããªããã°ãªããªãã§ãããïŒå ·äœçã«ã¯äœãééã£ãŠããã®ã§ããïŒ
'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
deväŸåé¢ä¿ããã±ãŒãžã®ãã«ãäžã«moment/locale
ãã£ã¬ã¯ããªããããããååŸããŸãã
ãã ãã moment
ã¯ãã¢ã®äŸåé¢ä¿ã§ãããããES6ã䜿çšããŠããŠã allSupportedLocales
ãšallSupportedLocalesMap
äž¡æ¹ãmoment
ææ°ã®ãã±ãŒã«ã䜿çšããŠããããšã確èªãããå Žåmoment-utl
ãšäžç·ã«ãããžã§ã¯ãã«ã€ã³ã¹ããŒã«ããmoment
ããŒãžã§ã³ïŒããšãã°ã moment
ããã€ãæ°ãããã±ãŒã«ãè¿œå ããå Žåãããã§ã«ããŒã§ããã¯ãã§ãïŒãã䜿çšããŠãããã®ãã±ãŒã«ãåçæããããšãã§ããŸãã moment-utl-locales
moment-utl
ã«ãã£ãŠæäŸãããmoment-utl-locales
ã¹ã¯ãªããã
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 ïŒ
ãã®åé¡ã¯Odooã®äººã ãæ©ãŸããŠããŸãããææ¡ãããä¿®æ£ã¯ãen-usãã¡ã€ã«ãæåã§äœæããããšã§ããã ã¯ãã
ç§ãç解ããŠããªãã®ã¯ãäžèšã®ã³ã¡ã³ãã§è¿°ã¹ãããã«ãããŒããŒããã§ã«ãenããæã£ãŠããããšãèªèããåçã«ã€ã³ããŒãããªãå Žåã«ãmomentãen-usãã¡ã€ã«ãããŒãããããšããçç±ã§ãã
ãšã«ãããããã¯ãŸã RNãŠãŒã¶ãŒã«ãšã£ãŠæªå€¢ã§ãã ææªã®éšåã¯ãåé¡ãæ¬çªãã«ãã§ã®ã¿çºçããããšã§ãã
é ãããããã©ã«ããæã€ããšã¯é©ãã®ããã±ãŒãžã§ã...
ãã®åé¡ã¯Odooã®äººã ãæ©ãŸããŠããŸãããææ¡ãããä¿®æ£ã¯ãen-usãã¡ã€ã«ãæåã§äœæããããšã§ããã ã¯ãã
ç§ãç解ããŠããªãã®ã¯ãäžèšã®ã³ã¡ã³ãã§è¿°ã¹ãããã«ãããŒããŒããã§ã«ãenããæã£ãŠããããšãèªèããåçã«ã€ã³ããŒãããªãå Žåã«ãmomentãen-usãã¡ã€ã«ãããŒãããããšããçç±ã§ãã
ãšã«ãããããã¯ãŸã RNãŠãŒã¶ãŒã«ãšã£ãŠæªå€¢ã§ãã ææªã®éšåã¯ãåé¡ãæ¬çªãã«ãã§ã®ã¿çºçããããšã§ãã
é ãããããã©ã«ããæã€ããšã¯é©ãã®ããã±ãŒãžã§ã...
ç§ã¯ããã®ããã«ðãååŸããã€ããã§ãããç§ã®è§£æ±ºçã¯moment
ãdayjs
ã«äº€æããããšfind all + replace all
ãšåããããç°¡åã§ããã
ãããæ€èšããããšæããããããªã人ã ã®ããã«ç§ãããããšãå ±æããã ãã§ãã
æãåèã«ãªãã³ã¡ã³ã
@icambronç§ã®ç°å¢ã¯ãnpmã䜿çšããŠäŸåé¢ä¿ãå¶åŸ¡ããReact Nativeã¢ããªã±ãŒã·ã§ã³ã§ãããæå°éã®ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã§ãé害ãåçŸããããšãã§ããŸããã åé¡ã¯ãloadLocaleé¢æ°ã§ãnameãen-USã§ããrequireïŒ './ locale /' + nameïŒãè©Šè¡ããrequireã倱æããããšã§ãã ãã®requireããªãªãŒã¹ãã«ãã§å€±æãããšãã¢ããªã¯æ¬¡ã®è¡ã«æ²¿ã£ãã¹ã¿ãã¯ãã¬ãŒã¹ã§ã¯ã©ãã·ã¥ããŸãã
ã³ãŒããèŠããšãgetLocaleã¯ç§ã®ããŒïŒãen-USãïŒãé åã§ã¯ãªãããšãèªèããŠããããããenããšäžèŽãããããšããã«loadLocaleã«åé¡ãããŸããããã¯ãchooseLocaleé¢æ°ã«å ¥ãå Žåã«ã®ã¿çºçããŸãã
ç·šéïŒchooseLocaleé¢æ°ãããå°ã詳ãã調ã¹ãåŸã§ããæåã«ãen-USããéžæããããšãã次ã«ãenããè©Šãåã«requireã«å€±æãããããrequireã倱æãããšã¢ããªãã¯ã©ãã·ã¥ããŸãããããé åã®å Žåã
ãŸãããããå£ããŠããå Žæããã©ã€/ãã£ããã®å åŽã«ãããšããäºå®ãå¥åŠã§ããããšã«ããã¯ã©ãã·ã¥ãåŒãèµ·ãããŸãã ããã¯å®éã«ããã§æ¬åœã«å°æããããšã§ãã
ç·šé2ïŒãããã°ïŒ__DEV__ïŒãã«ãã§ã¯ãrequireãæ£åžžã«å€±æãããã®åŸããenãã䜿çšããããšã«ãªããŸãã requireã__PROD__ã§ããã»ã©ççºçã§ããçç±ã¯ããããŸããããããã§ã¯ééããªãç¬éçã«å£ããŠããŸãã
ç·šé3ïŒrequire jsã®ããã¥ã¡ã³ãããããäŸåé¢ä¿ãè¡šçŸããªããšãRequireJSãã¹ã¯ãªãããéåæã«ããŒãããé床ãäœäžãããããããŒããšã©ãŒãçºçããå¯èœæ§ããããŸããã ãããã£ãŠãtry / catchã¯åæãšã©ãŒã«ã®ã¿åœ¹ç«ã€ãããtry / catchãå®éã«ããã«ä¿åãããå¯èœæ§ã¯ã»ãšãã©ãããŸããã