Moment: में, अमेरिका में स्थानीय

को निर्मित 24 नव॰ 2016  ·  42टिप्पणियाँ  ·  स्रोत: moment/moment

सिर्फ एक प्रश्न:

कोई 'एन', 'एन-यूएस' स्थान क्यों नहीं हैं?
मैं समझता हूं कि उन्हें 'डिफ़ॉल्ट' मान के रूप में लिया गया है, और इसलिए, यदि आप चाहते हैं, तो आपको शुरू करने के लिए लोकेल का उपयोग करने की आवश्यकता नहीं है।
लेकिन, कल्पना कीजिए कि आपके पास विशिष्ट कॉम्बो है जहां उपयोगकर्ता लोकेल चुन सकता है।
और आप उसी के वर्तमान मूल्य के साथ क्षण.लोक () कह रहे हैं।
वर्तमान स्थिति के साथ, आपको en / en-US मामले को विशेष रूप से दर्ज करना होगा, जो मुझे थोड़ा अजीब लगता है।

अपने महान काम के लिए Thx। धकेलना जारी रखें!

सबसे उपयोगी टिप्पणी

@icambron मेरा वातावरण मेरी निर्भरता को नियंत्रित करने के लिए

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' से मेल किए बिना लोडलोकेल में गिर जाता है, जो कि केवल तब होता है जब वह selectLocale फ़ंक्शन में जाता है।

संपादित करें: चयन सूची में थोड़ा और अधिक बारीकी से देखने के बाद, यह पहले 'एन-यूएस' चुनने की कोशिश करेगा और फिर 'एन' की कोशिश करने से पहले आवश्यकता को विफल कर देगा, इसलिए विफल होने पर दुर्घटनाग्रस्त ऐप के लिए अग्रणी की आवश्यकता होगी। अगर यह एक सरणी थी।
यह भी अजीब तथ्य है कि जिस स्थान पर यह टूट रहा है वह एक कोशिश / पकड़ के अंदर है, फिर भी दुर्घटना का कारण बनता है। यह वास्तव में यहाँ वास्तव में चौंकाने वाली बात है।

EDIT 2: ध्यान दें कि आवश्यकता तब विफल हो जाती है जब डिबग (__DEV__) में निर्माण होता है और फिर 'एन' का उपयोग करने के लिए नीचे गिरता है। मुझे यकीन नहीं है कि __PROD__ में इतनी अधिक विस्फोटक की आवश्यकता क्यों है, लेकिन यह निश्चित रूप से यहां क्षण में टूट रहा है।

EDIT 3: आवश्यकता जेएस डॉक्स से, "यदि आप निर्भरता व्यक्त नहीं करते हैं, तो आपको संभावनाएं लोड करने में त्रुटियां मिलेंगी क्योंकि आवश्यकताएं स्क्रिप्ट को अतुल्यकालिक रूप से लोड करती हैं और गति के लिए आदेश से बाहर होती हैं।" तो कोशिश / पकड़ वास्तव में हमें यहाँ बचाने की संभावना नहीं है, क्योंकि कोशिश / पकड़ वास्तव में केवल तुल्यकालिक त्रुटियों के साथ मदद करता है।

सभी 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 लोकेल US:

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"

मैं इसे नहीं खरीदता; उस स्थिति पर विचार करें जहां वातावरण से लोकेल का पता लगाया जाता है, और फिर पल / लोकेल / $ {डिटेलोकेल} लोड करने के लिए एक आवश्यक डिप पथ का निर्माण किया जाता है। यदि वह चर "एन" या "एन-यू" है, तो आवश्यकताएं किसी फ़ाइल को लोड करने में विफल हो जाएंगी (404 मिलता है)। यदि इसे 'डी' के रूप में पाया जाता है, तो फ़ाइल लोड हो जाएगी

@ ईगूड मोमेंट के लोकल लोडर को पता है कि इसमें पहले से ही अंग्रेजी है और इसे बाहरी फाइल से लोड करने की कोशिश नहीं की जाती है।

@icambron मुझे नहीं लगता कि जब उपयोगकर्ता 'एन-यूएस' में लोकल के रूप में गुजरता है तो आप पेड़ के नीचे चलने के बारे में सही होते हैं। वास्तव में, मैं वर्तमान में इसके माध्यम से डिबगिंग कर रहा हूं और यह टूट रहा है क्योंकि आप पेड़ के नीचे नहीं चल रहे हैं।
मेरा उपयोग करने का मामला यह है कि मैं क्षण भर में कॉल कर रहा हूं। mycate (myDate, myFormat, locale, true) जहां लोकेल सिर्फ एक स्ट्रिंग 'एन-यूएस' है। चूंकि उस स्ट्रिंग को आयात नहीं किया जा सकता है (क्योंकि इसके लिए कोई फ़ाइल नहीं है) लेकिन यह एक सरणी नहीं है, यह लोकेल की आवश्यकता की कोशिश करता है, और फिर उत्पादन वातावरण में टूट जाता है।
मुझे लगता है कि वास्तविक सबसे अच्छा व्यवहार वास्तव में एन-यूएस को डिफ़ॉल्ट रूप से मौजूद स्थानों की सूची में शामिल करना होगा (यह अभी वहां नहीं है, बस अपने आप ही एन)।

@steveccable खैर, यह इसे लोड करने की कोशिश करता है, बस अगर आपके पास एक अधिक विशिष्ट स्थानीयकरण था। जब यह विफल होता है, तो यह सिर्फ "एन" की कोशिश करता है और सफल होता है। मुझे लगता है कि डिस्कनेक्ट सिर्फ इतना है कि किसी तरह यह "एन-यूएस" लोड करने में विफल हो रहा है, आपके लिए टूट रहा है। यहां कुछ भी नहीं उड़ाना चाहिए; यह केवल इनायत से विफल होना और अगले विकल्प पर जाना है। तो आपको मुझे अपने पर्यावरण के बारे में अधिक बताना होगा: क्या, विशेष रूप से, गलत हो रहा है?

@icambron मेरा वातावरण मेरी निर्भरता को नियंत्रित करने के लिए

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' से मेल किए बिना लोडलोकेल में गिर जाता है, जो कि केवल तब होता है जब वह selectLocale फ़ंक्शन में जाता है।

संपादित करें: चयन सूची में थोड़ा और अधिक बारीकी से देखने के बाद, यह पहले 'एन-यूएस' चुनने की कोशिश करेगा और फिर 'एन' की कोशिश करने से पहले आवश्यकता को विफल कर देगा, इसलिए विफल होने पर दुर्घटनाग्रस्त ऐप के लिए अग्रणी की आवश्यकता होगी। अगर यह एक सरणी थी।
यह भी अजीब तथ्य है कि जिस स्थान पर यह टूट रहा है वह एक कोशिश / पकड़ के अंदर है, फिर भी दुर्घटना का कारण बनता है। यह वास्तव में यहाँ वास्तव में चौंकाने वाली बात है।

EDIT 2: ध्यान दें कि आवश्यकता तब विफल हो जाती है जब डिबग (__DEV__) में निर्माण होता है और फिर 'एन' का उपयोग करने के लिए नीचे गिरता है। मुझे यकीन नहीं है कि __PROD__ में इतनी अधिक विस्फोटक की आवश्यकता क्यों है, लेकिन यह निश्चित रूप से यहां क्षण में टूट रहा है।

EDIT 3: आवश्यकता जेएस डॉक्स से, "यदि आप निर्भरता व्यक्त नहीं करते हैं, तो आपको संभावनाएं लोड करने में त्रुटियां मिलेंगी क्योंकि आवश्यकताएं स्क्रिप्ट को अतुल्यकालिक रूप से लोड करती हैं और गति के लिए आदेश से बाहर होती हैं।" तो कोशिश / पकड़ वास्तव में हमें यहाँ बचाने की संभावना नहीं है, क्योंकि कोशिश / पकड़ वास्तव में केवल तुल्यकालिक त्रुटियों के साथ मदद करता है।

इसलिए इसके माध्यम से थोड़ा काम करने के बाद, मेरे पास (आदर्श से कम) वर्कअराउंड है। मूल रूप से, जब भी मेरा कोड 'en-US' के किसी लोकल में पास होने की कोशिश करता है, मैं इसे इंटरसेप्ट करता हूं और इसके बजाय 'en' के लोकेल में पास करता हूं। अन्य स्थानों को अपरिवर्तित से गुजरने की अनुमति है।

उस ने कहा, मुझे अभी भी लगता है कि यह समस्याग्रस्त है कि यह न तो एन-यूएस को खोज सकता है और न ही इसे पहले से ही तय करने के लिए डिफ़ॉल्ट है, और आप इसे विशेष रूप से शामिल नहीं कर सकते हैं जैसे कि आप अन्य स्थानों के साथ इसे खोजने में विफलता से बचने के लिए कर सकते हैं जब इसे वास्तव में कहा जाता है के ऊपर।

@steveccable

यह भी अजीब तथ्य है कि जिस स्थान पर यह टूट रहा है वह एक कोशिश / पकड़ के अंदर है, फिर भी दुर्घटना का कारण बनता है। यह वास्तव में यहाँ वास्तव में चौंकाने वाली बात है।

सही है, मैं यही कह रहा हूं। मैं यह समझने की कोशिश कर रहा हूं कि एक असफल कॉल के लिए भयावह कॉल की आवश्यकता क्यों होगी। मैं en-US ज्ञान में हार्डकोड करने में मदद नहीं करूंगा; हम अभी भी किसी भी अन्य कमबैक मामले में एक समान विफलता होगी। इसका मतलब है कि en का एक विशेष मामला होने के साथ कुछ भी नहीं करना है, बल्कि इसके लिए आपके पर्यावरण में काम नहीं करने वाली फालबैक प्रक्रिया के साथ क्या करना है।

इसके माध्यम से काम करते हुए, ऐसा प्रतीत होता है कि रिएक्ट नेटिव विफल नहीं हो रहा है जैसे कि हमें इनायत की आवश्यकता है। आप सही हैं कि इसका कोई विशेष मामला होने से कोई लेना-देना नहीं है, और केवल यही कारण है कि ऐसा लगता था कि यह विशेष था क्योंकि एन-यूएस को विफल होने से रोकने का कोई तरीका नहीं था (क्योंकि हम इसे सीधे आयात नहीं कर सकते हैं अन्य स्थानों की तरह)। जैसा कि बाद के संपादन में बताया गया है, कोशिश / कैच काम नहीं करता है क्योंकि यह एसिंक्रोनस रूप से विफल रहता है।
अभी के लिए, मैंने 'en-US' के स्थानों को अपने उद्देश्यों के लिए काम करने वाले स्थानों से ऊपर बताया।

कोशिश / कैच काम नहीं करता क्योंकि यह एसिंक्रोनस रूप से विफल रहता है

ओह, मुझे वह संपादन याद आ गया। मेरा भी यही अनुमान होने वाला था।

@steveccable
निश्चित नहीं है कि आपके पास अभी भी मुद्दा है, लेकिन रिलीज बिल्ड में सटीक क्रैश (हालांकि फ्रेंच लोकेल के साथ) मेरे लिए एक दिन का काम था ed

E/ReactNativeJS: Requiring unknown module "./locale/fr".
(...)

मैंने इसे हल किया:

import 'moment/locale/fr';

शायद यह मदद करता है

स्थानीय इनपुट को सैनिटाइज करने का तरीका ठीक है, लेकिन वास्तव में यह जानना डरावना है कि एक प्रतिक्रिया देशी आवश्यकता () किसी भी स्थान पर अतुल्यकालिक रूप से विफल हो सकती है और इसे पकड़ने का कोई तरीका नहीं है। इसके अलावा, अगर मैं एक गैर-मौजूदा लोकेल या एक यादृच्छिक स्ट्रिंग ('ब्ला-ब्लाह' कहता हूं) भेजता हूं, जिसका अर्थ है कि ऐप क्रैश हो जाता है और मैं कहीं भी त्रुटि को संभाल नहीं सकता। इसलिए मुझे चारों ओर से रक्षात्मक रूप से जांचना होगा कि कोई भी इस बग को ट्रिगर न करे।

मुझे संस्करण 2.19.2 के बाद समस्याएँ आईं, यहाँ उस रिलीज़ के साथ क्या बदला है https://github.com/moment/moment/compare/29afed6...328d51e फंक्शन अपडेटलोकेल ने लोडलोकेल का आंतरिक रूप से उपयोग करना शुरू कर दिया, जिसके लिए डायनामिक स्ट्रिंग https की आवश्यकता होती है

मुझे लगता है कि यह प्रतिक्रिया के मूल कारण में विफल रहता है क्योंकि आपको चर https://github.com/facebook/react-native/issues/6391 द्वारा गतिशील रूप से फ़ाइलों की आवश्यकता नहीं हो सकती है

मेरे विशिष्ट मामले में, मैं en-gb फ़ाइल आयात कर रहा हूं, इसलिए इसे पल भर में कॉल करने पर locales[name] में मिलना चाहिए। मुझे यकीन नहीं है कि इसकी आवश्यकता क्यों पड़ती है

सुनिश्चित नहीं है कि RN एक प्राथमिकता है या नहीं, लेकिन RN के लिए पल महीनों के लिए टूट जाएगा।

इस सब के साथ ऐसा लगता है जैसे facebook # 69 हर किसी को अनब्लॉक करने के लिए सबसे अधिक उत्पादक है। मैं @jeanlauliac से बात देखूंगा कि क्या हम इसे सोमवार को मर्ज कर सकते हैं।

बस कुछ पृष्ठभूमि देने के लिए: कई कारण हैं जो हम गतिशील निर्भरता का समर्थन नहीं करते हैं। सबसे पहले, स्थैतिक विश्लेषण टूट जाता है जब गतिशील रूप से मॉड्यूल की आवश्यकता होती है। दूसरा, जब डायनेमिक की आवश्यकता होती है, तो आप जिस वास्तविक मॉड्यूल की तलाश कर रहे हैं, वह उपलब्ध नहीं हो सकता है। यह उत्पादन में बड़े मुद्दों का कारण बन सकता है जो उपयोगकर्ताओं को हमारे ऐप्स का उपयोग करने से रोकेंगे, उदाहरण के लिए हम फेसबुक को तोड़ सकते हैं। हमारे पास अतीत में इस तरह की समस्याएं थीं और इससे निपटना मजेदार नहीं है। मेट्रो को जानबूझकर लोगों को ऐसा काम करने से रोकने के लिए कहा जाता है जिससे उपयोगकर्ताओं को दर्द होगा।

अंत में, हम समझते हैं कि यह ओपन सोर्स रेपो अभी एक शानदार आकार में नहीं है। अच्छी खबर यह है कि मेट्रो पर काम करने वाले एफबी में कभी भी अधिक लोग नहीं रहे हैं, और मेट्रो को एक टन बेहतर बनाने के लिए हमारे पास स्टोर में कई बड़े बदलाव हैं, लेकिन बुरी खबर यह है कि ऐसे मुद्दे हैं जिन्हें हमें असंबंधित काम करने की आवश्यकता है स्रोत खोलने के लिए। हम उम्मीद कर रहे हैं कि एक दो महीने में यह रेपो काफी बेहतर स्थिति में होगा और इसके लिए योगदान करना आसान होगा। हमें कुछ समय दीजिए।

आरएन के लिए, मुझे इसे लोकेल के पहले भाग (शायद स्क्रीन के पीछे क्या होता है जब "xx-XX" लोकेल लोड करने में विफल रहता है) से अलग करके रिलीज़ मोड में काम करना शुरू कर दिया। निम्नलिखित स्निपेट में, "xx-XX" के रूप में locale आपके डिवाइस का स्थान है।

moment.locale(locale.indexOf("-") === -1 ? locale : locale.substr(0, locale.indexOf('-')))

यह अजीब व्यवहार है।

https://stackoverflow.com/a/47260841/175825 आपको इकोसिस्टम के लिए एक विशिष्ट स्थान का आयात करने की आवश्यकता है ताकि उनका उपभोग किया जा सके।

इस जादू की वजह से, मैं प्रतिक्रिया-बड़े कैलेंडर नहीं प्राप्त कर सकते हैं की तरह तिथियां प्रदर्शित करने के लिए mm/yy का उपयोग कर BigCalendar.momentLocalizer() क्योंकि यह उम्मीद कर रहा है जो कुछ भी स्थान भरी हुई है।

मैं प्रतिक्रिया-बड़े-कैलेंडर के साथ एक समस्या को खोल सकता था, लेकिन अगले स्थानीय के बारे में मुझे जो एक विशेष स्थान की उम्मीद थी, उसके बारे में क्या होगा? और अगले एक?

बस en-us लोकेल में जोड़ें और जादू के लिए डिफ़ॉल्ट।

बस एन-यूएस लोकेल में जोड़ें और जादू के लिए डिफ़ॉल्ट।

यह समस्या का समाधान नहीं करेगा, स्पेनिश ( es-ES => es ) जैसी भाषाएँ हैं जो स्वचालित रूप से कमबैक करती हैं।

जो कोई अभी भी एक समाधान की तलाश में है, यह इस समस्या को कम करने में मदद कर सकता है (कुछ बढ़त के मामलों के अपवाद के साथ), लेकिन आरएन के मूल मुद्दे को ठीक नहीं करेगा, जिसके कारण 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'; 
};

मैंने इस मुद्दे को रिएक्ट नेटिव का उपयोग करके भी अनुभव किया और मोमेंट के साथ-साथ सभी स्थानों को शामिल करके इससे बचने में सक्षम था, अर्थात

import moment from 'moment'
import 'moment/min/locales'

(वैकल्पिक रूप से, moment/min/moment-with-locales भी प्रदान किया जाता है लेकिन यह हमारे कुछ अन्य स्वरूपकों के साथ संगत नहीं था।)

यह एक सुपर कष्टप्रद मुद्दा है।

क्या उन स्थानों के पूरे बिंदु नहीं हैं, जिनके बारे में आपको सोचना भी नहीं है, और निश्चित रूप से आपके कोड में 'एन-यूएस' को हार्डकोडिंग नहीं किया जाना चाहिए क्योंकि आप यूएस में हैं? मुझे समझ में नहीं आता कि जब 'एन-यूएस' के एक लोकेल का अनुरोध किया जाता है, तो वह इसे नहीं ले सकता। लोगों में सिरदर्द का कोई अंत नहीं है।

मैंने एक साल पहले इस समस्या को हल किया था लेकिन पूरी तरह से भूल गया कि कैसे, फिर मुझे शुरू करना होगा। (मैं एंगुलर में डेट पिकर का उपयोग कर रहा हूं और इस त्रुटि के साथ कम से कम कार्यान्वयन लागू कर रहा हूं)।

मैं इस Angular में डेटाइम पिकर का उपयोग करने की कोशिश कर रहा हूं। अगर मैं एन-जीबी जैसी कुछ चीज़ों को LOCALE सेट करता हूं तो यह ठीक काम करता है, लेकिन कुछ भी निर्दिष्ट किए बिना मुझे यह मिलता है। काश मैं इसे ठीक करने का उचित तरीका समझ पाता

image

आरएन के लिए, मुझे इसे लोकेल के पहले भाग (शायद स्क्रीन के पीछे क्या होता है जब "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('-')));

मैं अभी भी इस मुद्दे को "क्षण" संस्करण चला रहा हूं: "^ 2.22.2",
पिछले संस्करण में कोई सुधार?

मैं इस मुद्दे पर झंकार करूँगा।

  1. एन-यूएस को कुछ छिपे हुए डिफॉल्ट के रूप में व्यवहार करने से अन्य खराब डिजाइन होते हैं।
  2. बिना एन-लोकेल के साथ, मुझे नहीं पता कि कौन सा सीडीएन संस्करण उपयोग करना है।
  3. पल प्रभावशाली लगता है, लेकिन बीमार को एक और समाधान मिल जाता है क्योंकि एन-यूएस अन्य स्थानों के समान नहीं है क्योंकि एक बुरा कोड गंध है।

मैं भी उत्पादन में एक अच्छा विकास किया है कि पूरी तरह से काम करता है बनाने के बाद उत्पादन पर प्रतिक्रिया देशी में यह त्रुटि थी।
प्रस्तावित और निम्नलिखित रिफ्लेक्टर @ समाधान के साथ इसे हल किया:

function parseLocaleForMoment (language) {
  if (language.indexOf('-') === -1) return language
  else return language.substr(0, language.indexOf('-'))
}

ऐसा लगता है कि आरएन पल के साथ इतना बेकार हो जाता है कि सिर्फ एक देशी फॉर्मेटर लिखना आसान होता है। शायद कोड की सिर्फ एक पंक्ति, काम करने के लिए बुलेट प्रूफ।

इसे इस तरह से ठीक किया गया:

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 दुख की बात है कि यह एंड्रॉइड पर काम करता है लेकिन iOS पर दुख की बात है: / मुझे कुछ कारणों से zh लोकेल के साथ कुछ परेशानी हो रही है: /

ऐसा इसलिए हो सकता है क्योंकि सरलीकृत और पारंपरिक के बीच अंतर करने के लिए zh और कुछ अन्य स्थानों को अलग-अलग स्वरूपित किया जाता है। Https://gist.github.com/jacobbubu/1836273 देखें

@ rajivshah3 वास्तव में मेरे पास zh_Hant_HK था जो कि टाॅप विधि के साथ काम नहीं कर रहा था, अब मैं आपके तरीके का उपयोग कर रहा हूं जो इस समस्या से निपटने के लिए सबसे अच्छा तरीका लगता है जितना संभव हो उतना आसान आपके पोस्ट के लिए धन्यवाद h

समान समस्या, केवल आरएन उत्पादन मोड में।

यह मेरे लिए ठीक काम लगता है।

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 ), उदाहरण के लिए, मोमेंटजेएस स्थानों में भी मौजूद नहीं है। केवल zh-cn , zh-hk और zh-tw परिभाषित हैं। इसलिए यदि आप लोकल स्ट्रिंग से क्षेत्रों को हटाने के लिए उपरोक्त कोड का उपयोग कर रहे हैं, तो आपका ऐप तुरंत अधिकांश चीनी उपकरणों पर क्रैश हो जाएगा। बस एक औसतन ~ 800 मिलियन स्मार्टफोन उपयोगकर्ता।

रिएक्टिव नेटिव के लिए मेरा अस्थायी (और पूरी तरह से बैटशिट) समाधान यह है:

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 का उपयोग करके एक रिलीज़ बिल्ड पर क्रैश हो गया।

मुझे एक समान समस्या की समस्या है; @ सिइमिला

जब मैंने लुपकन को टाइमपिकर मुद्दों के साथ जोड़ा तो वे काफी लोकप्रिय हो रहे हैं और वे 'एन-यूएस' लोकेल से संबंधित प्रतीत होते हैं।

@steveccable खैर, यह इसे लोड करने की कोशिश करता है, बस अगर आपके पास एक अधिक विशिष्ट स्थानीयकरण था। जब यह विफल होता है, तो यह सिर्फ "एन" की कोशिश करता है और सफल होता है। मुझे लगता है कि डिस्कनेक्ट सिर्फ इतना है कि किसी तरह यह "एन-यूएस" लोड करने में विफल हो रहा है, आपके लिए टूट रहा है। यहां कुछ भी नहीं उड़ाना चाहिए; _it के लिए केवल कृपापूर्वक असफल होना चाहिए_ और अगले विकल्प पर जाएं। तो आपको मुझे अपने पर्यावरण के बारे में अधिक बताना होगा: क्या, विशेष रूप से, गलत हो रहा है?

अपवादों के साथ 'एन-यूएस' या अन्य वैध स्थानों को संभालने के साथ एक और समस्या यह है कि जब आप डिबगिंग कर रहे हैं और डिबगर को अपवादों पर ब्रेक लगाने के लिए कहते हैं, तो आप इस पर बार-बार अटक जाते हैं।

विशेष रूप से 'एन-यूएस' के रूप में इतने बड़े स्थान के लिए बेहतर और सरल तरीका होना चाहिए।
आखिरकार, बड़े दर्शकों / उपयोग की संभावना वाले इन स्थानों की जाँच की जानी चाहिए और उनके सामने इलाज किया जाना चाहिए, गति पर विचार के लिए।

मैंने @slorber से समाधान को और अधिक मजबूत

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"

एक ही समस्या, आरएन उत्पादन IOS मोड में ही।

यह मेरे लिए ठीक काम लगता है।

"पल" से आयात पल;
आयात 'पल / स्थान / तों';

इसे डिबेट करने में काफी समय लगा, @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-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

इस स्क्रिप्ट का उपयोग करते समय, रोलअप या वेबपैक (जो भी आप उपयोग करते हैं) के साथ अपना कोड बंडल करने से पहले बस इसे चलाना सुनिश्चित करें, इसलिए यह आपके बर्नर के आने से पहले एक अप-टू-डेट स्थान सरणी और ऑब्जेक्ट उत्पन्न करेगा और उन्हें जोड़ देगा। आपका अंतिम बंडल

आशा है कि ये आपकी मदद करेगा!

@Adammcarth के उत्तर में, कृपया यहां मेरा उत्तर देखें :

इस समस्या ने ओडू के लोगों को परेशान कर दिया है और फिक्स एन-यू फाइल को मैन्युअल रूप से बनाना है। आह।

मुझे समझ में नहीं आता है कि क्यों क्षण एन-यू फाइल को लोड करने की कोशिश करता है यदि, जैसा कि ऊपर कुछ टिप्पणियों को बताया गया है, लोडर को पता होना चाहिए कि यह पहले से ही "एन" है और इसे गतिशील रूप से आयात नहीं करता है।

वैसे भी यह अभी भी आरएन उपयोगकर्ताओं के लिए एक बुरा सपना है। सबसे बुरी बात यह है कि मुद्दा केवल उत्पादन में होता है।

छिपा हुआ डिफ़ॉल्ट होना आश्चर्य का एक पैकेज है ...

image

इस समस्या ने ओडू के लोगों को परेशान कर दिया है और फिक्स एन-यू फाइल को मैन्युअल रूप से बनाना है। आह।

मुझे समझ में नहीं आता है कि क्यों क्षण एन-यू फाइल को लोड करने की कोशिश करता है यदि, जैसा कि ऊपर कुछ टिप्पणियों को बताया गया है, लोडर को पता होना चाहिए कि यह पहले से ही "एन" है और इसे गतिशील रूप से आयात नहीं करता है।

वैसे भी यह अभी भी आरएन उपयोगकर्ताओं के लिए एक बुरा सपना है। सबसे बुरी बात यह है कि मुद्दा केवल उत्पादन में होता है।

छिपा हुआ डिफ़ॉल्ट होना आश्चर्य का एक पैकेज है ...

image

मैं इसके लिए 👎 प्राप्त करने जा रहा हूं, लेकिन मेरा समाधान moment के लिए dayjs moment स्वैप कर रहा था। चूँकि वे समान फ़ंक्शन / API का नामकरण करते हैं, यह मेरे लिए find all + replace all जितना सरल था।

सिर्फ उन लोगों के लिए जो मैंने किया, जो इस पर विचार करना चाहते हैं, उसे साझा करना।

क्या यह पृष्ठ उपयोगी था?
0 / 5 - 0 रेटिंग्स

संबंधित मुद्दों

usmonster picture usmonster  ·  13टिप्पणियाँ

llacroix picture llacroix  ·  186टिप्पणियाँ

Brendan-Lucas picture Brendan-Lucas  ·  9टिप्पणियाँ

arcady-zherdev picture arcady-zherdev  ·  7टिप्पणियाँ

cristianstaicu picture cristianstaicu  ·  24टिप्पणियाँ