Moment: で、で-米囜ロヌカル

䜜成日 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を詊行し、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が実際にここに保存される可胜性はほずんどありたせん。

党おのコメント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}をロヌドするために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のようなものに蚭定するず、正垞に機胜したすが、䜕も指定しなくおもこれを取埗できたす。 これを修正する適切な方法を芋぀けられたらいいのにず思いたす

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が他のロケヌルず同じでないこずは悪いコヌドの臭いであるため、別の解決策を芋぀けるこずができたせん。

たた、完璧に機胜する玠晎らしい開発を構築した埌、本番環境での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ナヌザヌにずっお悪倢です。 最悪の郚分は、問題が本番ビルドでのみ発生するこずです。

隠されたデフォルトを持぀こずは驚きのパッケヌゞです...

image

この問題はOdooの人々を悩たせおきたした。提案された修正は、en-usファむルを手動で䜜成するこずでした。 はぁ。

私が理解しおいないのは、䞊蚘のコメントで述べたように、ロヌダヌがすでに「en」を持っおいるこずを認識し、動的にむンポヌトしない堎合に、momentがen-usファむルをロヌドしようずする理由です。

ずにかく、それはただRNナヌザヌにずっお悪倢です。 最悪の郚分は、問題が本番ビルドでのみ発生するこずです。

隠されたデフォルトを持぀こずは驚きのパッケヌゞです...

image

私はこれのために👎を取埗する぀もりですが、私の解決策はmomentをdayjsに亀換するこずfind all + replace allず同じくらい簡単でした。

これを怜蚎したいず思うかもしれない人々のために私がしたこずを共有するだけです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡