Moment: di, dalam-AS lokal

Dibuat pada 24 Nov 2016  ·  42Komentar  ·  Sumber: moment/moment

Hanya sebuah pertanyaan:

Mengapa tidak ada lokal 'en', 'en-US'?
Saya mengerti mereka telah diambil sebagai nilai 'default', jadi, jika itu yang Anda inginkan, Anda tidak perlu menggunakan lokal untuk memulai.
Tapi, bayangkan Anda memiliki combo khas di mana pengguna dapat memilih lokal.
Dan Anda memanggil moment.locale () dengan nilai saat ini.
Dengan situasi saat ini, Anda harus menggunakan kasus khusus en / en-US case, yang menurut saya agak canggung.

Terima kasih atas kerja bagus Anda. Terus dorong!

Komentar yang paling membantu

@icambron Lingkungan saya adalah aplikasi React Native yang menggunakan npm untuk mengontrol dependensi saya, dan saya dapat mereplikasi kegagalan bahkan dalam aplikasi sampel minimal. Masalahnya adalah bahwa dalam fungsi loadLocale, ia mencoba untuk meminta ('./ locale /' + name) di mana nama adalah en-US, dan yang membutuhkan gagal. Jika Requirement gagal dalam build rilis, ini menyebabkan aplikasi crash dengan stack trace di sepanjang baris berikut:

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

Melihat-lihat kode, karena getLocale melihat bahwa kunci saya ('en-US') bukanlah sebuah array, ia jatuh ke loadLocale tanpa pernah mencoba mencocokkan 'en', yang hanya akan terjadi jika ia masuk ke fungsi chooseLocale.

EDIT: Setelah melihat sedikit lebih dekat pada fungsi chooseLocale, pertama-tama akan mencoba memilih 'en-US' dan kemudian gagal dalam persyaratan sebelum mencoba 'en', sehingga persyaratan yang gagal mengarah ke aplikasi yang mogok masih akan terjadi bahkan jika ini adalah sebuah array.
Yang juga aneh adalah fakta bahwa titik di mana ia memecahkan ada di dalam percobaan / tangkap, namun tetap menyebabkan crash. Itu sebenarnya hal yang sangat membingungkan di sini.

EDIT 2: Perhatikan bahwa Requirement gagal dengan anggun ketika dalam debug (__DEV__) build dan kemudian tidak menggunakan 'en'. Saya tidak yakin mengapa Requirement jauh lebih eksplosif di __PROD__, tapi sudah pasti rusak di sini pada saatnya.

EDIT 3: Dari dokumen require js, "Jika Anda tidak mengekspresikan dependensi, kemungkinan besar Anda akan mendapatkan error saat memuat karena RequireJS memuat skrip secara asinkron dan kecepatannya rusak." Jadi coba / tangkap tidak mungkin benar-benar menyelamatkan kita di sini, karena coba / tangkap hanya benar-benar membantu dengan kesalahan sinkron.

Semua 42 komentar

Ada lokal en , itu hanya tidak datang dalam file terpisah. Ini sangat diterima oleh moment().locale() dan 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 juga berfungsi karena kita berjalan mencari kecocokan yang kurang spesifik dan lokal en adalah bahasa Inggris AS:

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"

Saya tidak membelinya; pertimbangkan kasus di mana lokal terdeteksi dari lingkungan, lalu jalur require dep dibuat untuk memuat momen / locale / $ {terdeteksiLocale}. Jika variabel itu adalah "en" atau "en-us", maka requirejs akan gagal memuat file (mendapat 404). Jika terdeteksi sebagai 'de', maka file akan dimuat.

Pemuat lokal

@icambron Saya rasa Anda tidak benar tentang berjalan menuruni pohon ketika pengguna memasukkan 'en-US' sebagai lokal. Faktanya, saya sedang men-debugnya dan itu rusak karena Anda TIDAK berjalan menuruni pohon.
Kasus penggunaan saya adalah bahwa saya memanggil moment.utc (myDate, myFormat, locale, true) di mana lokal hanyalah satu string 'en-US'. Karena string itu tidak dapat diimpor (karena tidak ada file untuk itu) tetapi bukan sebuah array, ia mencoba untuk meminta lokal, dan kemudian berhenti di lingkungan produksi.
Tampak bagi saya bahwa perilaku terbaik sebenarnya adalah memasukkan en-US dalam daftar lokal yang ada secara default (saat ini tidak ada, hanya en sendiri).

@steveccable Ya, ia mencoba memuatnya, kalau-kalau Anda memiliki pelokalan yang lebih spesifik. Jika gagal, ia hanya mencoba "en" dan berhasil. Saya pikir putuskan hanya karena entah bagaimana gagal memuat "en-US" melanggar untuk Anda. Seharusnya tidak ada yang meledak di sini; itu hanya seharusnya gagal dengan anggun dan pindah ke opsi berikutnya. Jadi, Anda harus memberi tahu saya lebih banyak tentang lingkungan Anda: apa, khususnya, yang salah?

@icambron Lingkungan saya adalah aplikasi React Native yang menggunakan npm untuk mengontrol dependensi saya, dan saya dapat mereplikasi kegagalan bahkan dalam aplikasi sampel minimal. Masalahnya adalah bahwa dalam fungsi loadLocale, ia mencoba untuk meminta ('./ locale /' + name) di mana nama adalah en-US, dan yang membutuhkan gagal. Jika Requirement gagal dalam build rilis, ini menyebabkan aplikasi crash dengan stack trace di sepanjang baris berikut:

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

Melihat-lihat kode, karena getLocale melihat bahwa kunci saya ('en-US') bukanlah sebuah array, ia jatuh ke loadLocale tanpa pernah mencoba mencocokkan 'en', yang hanya akan terjadi jika ia masuk ke fungsi chooseLocale.

EDIT: Setelah melihat sedikit lebih dekat pada fungsi chooseLocale, pertama-tama akan mencoba memilih 'en-US' dan kemudian gagal dalam persyaratan sebelum mencoba 'en', sehingga persyaratan yang gagal mengarah ke aplikasi yang mogok masih akan terjadi bahkan jika ini adalah sebuah array.
Yang juga aneh adalah fakta bahwa titik di mana ia memecahkan ada di dalam percobaan / tangkap, namun tetap menyebabkan crash. Itu sebenarnya hal yang sangat membingungkan di sini.

EDIT 2: Perhatikan bahwa Requirement gagal dengan anggun ketika dalam debug (__DEV__) build dan kemudian tidak menggunakan 'en'. Saya tidak yakin mengapa Requirement jauh lebih eksplosif di __PROD__, tapi sudah pasti rusak di sini pada saatnya.

EDIT 3: Dari dokumen require js, "Jika Anda tidak mengekspresikan dependensi, kemungkinan besar Anda akan mendapatkan error saat memuat karena RequireJS memuat skrip secara asinkron dan kecepatannya rusak." Jadi coba / tangkap tidak mungkin benar-benar menyelamatkan kita di sini, karena coba / tangkap hanya benar-benar membantu dengan kesalahan sinkron.

Jadi setelah mengerjakannya sedikit, saya memiliki solusi (kurang dari ideal). Pada dasarnya, setiap kali kode saya mencoba untuk meneruskan di lokal 'en-US', saya mencegatnya dan meneruskan di lokal 'en' sebagai gantinya. Lokal lain diizinkan lewat tanpa diubah.

Meskipun demikian, menurut saya masih bermasalah karena tidak dapat menemukan en-US atau tidak secara default sudah memilikinya, dan Anda tidak dapat memasukkannya secara khusus seperti yang Anda bisa dengan lokal lain untuk menghindari kegagalan menemukannya ketika sebenarnya dipanggil atas.

@kontenvideo

Yang juga aneh adalah fakta bahwa titik di mana ia memecahkan ada di dalam percobaan / tangkap, namun tetap menyebabkan crash. Itu sebenarnya hal yang sangat membingungkan di sini.

Benar, itulah yang saya katakan. Saya mencoba untuk memahami mengapa panggilan membutuhkan panggilan yang gagal akan menjadi bencana besar. Saya tidak akan membantu membuat hardcode dengan pengetahuan tentang en-US ; kami masih akan mengalami kegagalan serupa dalam kasus fallback lainnya. yaitu yang tidak ada hubungannya dengan en sebagai kasus khusus, melainkan berkaitan dengan proses fallback yang tidak berfungsi sama sekali di lingkungan Anda.

Bekerja melaluinya, tampaknya React Native tidak menangani kebutuhan yang gagal seanggun yang kita inginkan. Anda benar bahwa ini tidak ada hubungannya dengan en menjadi kasus khusus, dan satu-satunya alasan mengapa sepertinya itu istimewa adalah karena tidak ada cara untuk mencegah persyaratan en-US dari kegagalan (karena kami tidak dapat mengimpornya secara langsung seperti di tempat lain). Seperti disebutkan dalam pengeditan nanti, coba / tangkap tidak berfungsi karena gagal secara asinkron.
Untuk saat ini, solusi yang saya sebutkan di atas hanya membersihkan lokal 'en-US' berfungsi untuk tujuan saya.

coba / tangkap tidak berfungsi karena gagal secara asinkron

Oh, saya melewatkan suntingan itu. Itu akan menjadi tebakanku juga.

@kontenvideo
Tidak yakin apakah Anda masih mengalami masalah, tetapi error yang sama persis dalam build rilis (meskipun dengan bahasa Prancis) menghabiskan satu hari kerja untuk saya 😢

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

Saya menyelesaikannya dengan:

import 'moment/locale/fr';

Mungkin itu membantu

Solusi untuk membersihkan masukan lokal tidak apa-apa, tetapi sangat menakutkan untuk mengetahui bahwa react native require () dapat gagal secara asinkron di mana pun dan tidak ada cara untuk menangkapnya. Juga, jika saya mengirim lokal yang tidak ada atau string acak (katakan 'bla-bla') itu berarti aplikasi macet dan saya tidak bisa menangani kesalahan di mana pun. Jadi saya harus memeriksa secara defensif bahwa tidak ada yang memicu bug ini.

Saya mendapat masalah setelah versi 2.19.2 inilah yang berubah dengan rilis itu https://github.com/moment/moment/compare/29afed6...328d51e fungsi updateLocale mulai menggunakan loadLocale secara internal yang pada gilirannya membutuhkan penggunaan dengan string dinamis https : //github.com/moment/moment/blob/fea48bb69eda8c0459915d6aa66a910a4d43a55b/moment.js#L1845

Saya kira ini gagal dalam bereaksi asli karena di sana Anda tidak dapat meminta file secara dinamis dengan variabel https://github.com/facebook/react-native/issues/6391

Dalam kasus khusus saya, saya mengimpor file en-gb sehingga file tersebut harus ditemukan di locales[name] pada saat saya memanggil moment.locale. Saya tidak yakin mengapa gagal untuk meminta.

tidak yakin bahwa RN menjadi prioritas atau tidak, tetapi momen untuk RN akan rusak selama berbulan-bulan.

Dengan semua ini, sepertinya facebook # 69 adalah perbaikan paling produktif untuk membuka blokir semua orang. Saya akan berbicara dengan @jeanlauliac dan kita akan melihat apakah kita dapat menggabungkannya pada hari Senin.

Sekadar memberikan beberapa latar belakang: Ada beberapa alasan mengapa kami tidak mendukung dependensi dinamis. Pertama, analisis statis rusak ketika modul membutuhkan secara dinamis. Kedua, saat menggunakan kebutuhan dinamis, modul nyata yang Anda cari mungkin tidak tersedia. Hal ini dapat menyebabkan masalah besar dalam produksi yang akan mencegah pengguna menggunakan aplikasi kami, seperti misalnya kami dapat merusak Facebook. Kami memiliki masalah seperti ini di masa lalu dan tidak menyenangkan untuk ditangani. Metro sengaja didasari untuk mencegah orang melakukan hal-hal yang merugikan penggunanya.

Akhirnya, kami memahami bahwa repo open source ini tidak dalam kondisi yang baik saat ini. Kabar baiknya adalah tidak pernah ada lebih banyak orang di FB yang bekerja di Metro, dan kami memiliki sejumlah perubahan besar untuk membuat Metro jauh lebih baik, tetapi berita buruknya adalah ada masalah mendesak yang perlu kami atasi yang tidak terkait ke sumber terbuka. Kami berharap dalam beberapa bulan ini repo ini akan jauh lebih baik dan lebih mudah untuk berkontribusi. Tolong beri kami waktu.

Untuk RN, saya membuatnya bekerja dalam mode rilis dengan mengupas ke bagian pertama lokal (mungkin momen apa yang dilakukan di belakang layar ketika gagal memuat lokal "xx-XX"). Dalam potongan berikut, locale adalah perangkat lokal Anda dalam bentuk "xx-XX".

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

Ini adalah perilaku yang aneh.

https://stackoverflow.com/a/47260841/175825 Anda perlu mengimpor lokasi tertentu untuk ekosistem agar dapat menggunakannya.

Karena keajaiban ini, saya tidak bisa mendapatkan react-big-calendar untuk menampilkan tanggal seperti mm/yy menggunakan BigCalendar.momentLocalizer() karena mengharapkan lokal apa pun yang dimuat.

Saya bisa membuka masalah dengan react-big-calendar, tapi bagaimana dengan lib berikutnya yang saya temui yang mengharapkan lokal tertentu? Dan selanjutnya?

Cukup tambahkan en-us locale dan default ke magic.

Cukup tambahkan lokal en-us dan default ke magic.

Ini tidak akan menyelesaikan masalah, ada bahasa seperti Spanyol ( es-ES => es ) yang melakukan fallback otomatis.

Bagi siapa pun yang masih mencari solusi, ini dapat membantu mengurangi masalah (dengan pengecualian beberapa kasus tepi) tetapi tidak akan memperbaiki masalah root RN yang menyebabkan crash selama coba-tangkap 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'; 
};

Saya juga mengalami masalah ini menggunakan React Native dan dapat menghindarinya dengan memasukkan semua lokal bersama Momen, mis

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

(Alternatifnya, moment/min/moment-with-locales juga disediakan tetapi tidak kompatibel dengan beberapa pemformat kami yang lain.)

Ini adalah masalah yang sangat menjengkelkan.

Bukankah inti dari lokal yang Anda bahkan tidak perlu memikirkannya, dan tentu saja tidak melakukan hardcode 'en-US' ke dalam kode Anda hanya karena ANDA berada di AS? Saya tidak mengerti mengapa ketika meminta lokal 'en-US' itu tidak bisa begitu saja. Menyebabkan orang sakit kepala tiada akhir.

Saya memecahkan masalah ini setahun yang lalu tetapi sama sekali lupa caranya, lalu saya harus memulai dari awal. (Saya menggunakan pemilih tanggal di Angular dan hanya menempatkan implementasi minimum dalam ledakan dengan kesalahan ini).

Saya mendapatkan ini di Angular mencoba menggunakan pemilih waktu. Jika saya menyetel LOCALE ke sesuatu seperti en-GB, ini berfungsi dengan baik tetapi tanpa menentukan apa pun, saya mengerti. Saya berharap saya dapat menemukan cara yang tepat untuk memperbaikinya

image

Untuk RN, saya membuatnya bekerja dalam mode rilis dengan mengupas ke bagian pertama lokal (mungkin momen apa yang dilakukan di belakang layar ketika gagal memuat lokal "xx-XX"). Dalam potongan berikut, locale adalah perangkat lokal Anda dalam bentuk "xx-XX".

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

Solusi ini berfungsi untuk saya, menggunakan i18n dan momentjs seperti ini:

// 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('-')));

Saya masih bereksperimen dengan masalah ini dengan menjalankan versi "moment": "^ 2.22.2",
Ada koreksi di versi terakhir?

Saya akan ikut campur dalam masalah ini.

  1. memperlakukan en-US sebagai beberapa bentuk default tersembunyi yang berbeda, yang lainnya adalah desain yang buruk.
  2. tanpa lokal en-us, saya tidak tahu versi CDN mana yang akan digunakan.
  3. Momen terlihat mengesankan, tetapi saya tidak akan menemukan solusi lain karena en-US tidak sama dengan lokal lain adalah bau kode yang buruk.

Saya juga mengalami kesalahan ini dalam react-native pada produksi setelah membuat pengembangan bagus yang bekerja dengan sempurna.
Mengatasinya dengan solusi

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

Sepertinya RN menyebalkan dengan momen sehingga lebih mudah untuk hanya menulis formatter asli. Mungkin hanya satu baris kode, anti peluru untuk bekerja.

Akhirnya memperbaikinya seperti ini:

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);

dengan react native @tapz sayangnya ini tampaknya berfungsi di Android tetapi sayangnya di iOS: / Saya mengalami masalah dengan zh locale karena beberapa alasan: /

Itu mungkin karena zh dan beberapa lokal lainnya diformat berbeda untuk membedakan antara Sederhana dan Tradisional. Lihat https://gist.github.com/jacobbubu/1836273

@ rajivshah3 memang saya mengalami zh_Hant_HK yang tidak berfungsi dengan metode tapz Saya sekarang menggunakan metode Anda yang tampaknya cara terbaik untuk menangani masalah ini semulus mungkin terima kasih atas kiriman Anda 👍

Masalah yang sama, hanya dalam mode produksi RN.

Sepertinya ini bekerja dengan baik untuk saya.

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;
};

Selama data diimpor (atau en ) dan sesuai dengan kasusnya, tampaknya berfungsi dengan baik bagi kami

Ini benar-benar konyol. Menghapus bagian -region dari kode bahasa bukanlah solusi.

1) Anda kehilangan kekhususan regional untuk lokasi tersebut.
2) Lebih buruk lagi, metode itu akan menyebabkan crash lebih lanjut. Bahasa China ( zh ), misalnya, bahkan tidak ada di lokal MomentJS. Hanya zh-cn , zh-hk dan zh-tw yang ditentukan. Jadi, jika Anda menggunakan kode di atas untuk menghapus region dari string lokal, aplikasi Anda akan langsung mogok di sebagian besar perangkat China. Hanya sedikit ~ 800 juta pengguna smartphone.

Solusi sementara saya (dan benar-benar omong kosong) untuk React Native adalah ini:

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 Hai, apakah kami punya berita tentang perbaikan lokal momen untuk RN?

Ini baru saja mogok pada versi rilis sekarang menggunakan en-gb .

Saya mendapatkan masalah yang sama seperti; @tokopedia

Ketika saya menambahkan Luxon bersama dengan masalah timepicker yang bermunculan dan tampaknya terkait dengan lokal 'en-US'.

@steveccable Ya, ia mencoba memuatnya, kalau-kalau Anda memiliki pelokalan yang lebih spesifik. Jika gagal, ia hanya mencoba "en" dan berhasil. Saya pikir putuskan hanya karena entah bagaimana gagal memuat "en-US" melanggar untuk Anda. Seharusnya tidak ada yang meledak di sini; _itu seharusnya gagal dengan anggun_ dan pindah ke opsi berikutnya. Jadi, Anda harus memberi tahu saya lebih banyak tentang lingkungan Anda: apa, khususnya, yang salah?

Masalah lain dalam menangani 'en-US' atau lokal valid lainnya dengan pengecualian adalah saat Anda men-debug dan meminta debugger untuk menghentikan pengecualian, Anda terjebak pada masalah ini berulang kali.

Seharusnya ada cara yang lebih baik dan lebih sederhana terutama untuk lokasi besar seperti 'en-US'.
Akhirnya, lokasi-lokasi dengan kemungkinan audiens / penggunaan yang besar ini harus diperiksa dan ditangani terlebih dahulu, untuk pertimbangan kecepatan.

Saya memodifikasi solusi dari @slorber agar lebih kuat. Ini memformat ulang lokal yang masuk (mis. "Zh_CN" menjadi "zh-cn") dan memeriksa apakah itu didukung oleh pemasangan saat Anda, kembali ke negara tersebut, kemudian kembali ke 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"

Masalah yang sama, hanya dalam mode IOS produksi RN.

Sepertinya ini bekerja dengan baik untuk saya.

impor momen dari "momen";
import 'moment / locale / es';

Menghabiskan beberapa waktu untuk men -debug ini, terima kasih

Ini masih menjadi masalah 😢

Hai kawan,

Saya telah membuat paket kecil untuk Anda -> https://github.com/tonix-tuft/moment-utl

npm install --save moment moment-utl

Anda dapat menggunakan berikut ini untuk menentukan semua momen lokal yang didukung tanpa perlu memuatnya terlebih dahulu:

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 peer bergantung pada moment , tetapi menggabungkan semua moment lokal
mengambilnya dari direktori moment/locale selama pembuatan paket ketergantungan moment dev.

Namun, karena moment adalah ketergantungan sesama, jika menggunakan ES6 dan ingin memastikan bahwa allSupportedLocales dan allSupportedLocalesMap keduanya menggunakan lokal terbaru dengan moment versi yang telah Anda instal dalam proyek Anda bersama dengan moment-utl (misalnya, jika moment menambahkan lokal baru suatu hari nanti, maka ini akan membantu Anda), maka Anda juga dapat membuat ulang lokal tersebut menggunakan moment-utl-locales skrip disediakan oleh moment-utl .

Anda dapat menggunakannya dengan perintah 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

Saat menggunakan skrip ini, pastikan untuk menjalankannya sebelum Anda memaketkan kode Anda dengan Rollup atau Webpack (mana pun yang Anda gunakan), sehingga ini akan menghasilkan larik dan objek lokal terbaru sebelum bundler Anda menemukannya dan menambahkannya ke bundel terakhir Anda.

Saya harap ini membantu!

Untuk membalas @adammcarth , silakan periksa jawaban saya di sini: https://github.com/tonix-tuft/moment-utl/issues/1#issuecomment -616088826

Masalah ini menghantui orang-orang di Odoo dan perbaikan yang disarankan adalah membuat file en-us secara manual. Mendesah.

Yang tidak saya mengerti adalah mengapa momen mencoba memuat file en-us jika, seperti yang dikatakan beberapa komentar di atas, loader harus tahu bahwa ia sudah memiliki "en" dan tidak mengimpornya secara dinamis.

Pokoknya itu masih mimpi buruk bagi pengguna RN. Bagian terburuknya adalah masalah ini hanya terjadi di build produksi.

Memiliki default tersembunyi adalah paket kejutan ...

image

Masalah ini menghantui orang-orang di Odoo dan perbaikan yang disarankan adalah membuat file en-us secara manual. Mendesah.

Yang tidak saya mengerti adalah mengapa momen mencoba memuat file en-us jika, seperti yang dikatakan beberapa komentar di atas, loader harus tahu bahwa ia sudah memiliki "en" dan tidak mengimpornya secara dinamis.

Pokoknya itu masih mimpi buruk bagi pengguna RN. Bagian terburuknya adalah masalah ini hanya terjadi di build produksi.

Memiliki default tersembunyi adalah paket kejutan ...

image

Saya akan mendapatkan 👎 untuk ini tetapi solusi saya menukar moment keluar menjadi dayjs . Karena mereka berbagi fungsi / penamaan API yang sama, itu semudah find all + replace all untuk saya.

Hanya berbagi apa yang saya lakukan untuk orang-orang yang mungkin ingin mempertimbangkan ini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat