moment.jsの言語を変更するにはどうすればよいですか?


196

moment.jsで設定されている日付の言語を変更しようとしています。デフォルトは英語ですが、ドイツ語を設定したいです。これらは私が試したものです:

var now = moment().format("LLL").lang("de");

それは与えていNaNます。

var now = moment("de").format("LLL");

これも反応していません。

var now = moment().format("LLL", "de");

変更なし:これはまだ英語で結果を生成しています。

これはどのようにして可能ですか?


回答:


303

moment.langが必要です(警告lang()はモーメント以降廃止予定です。代わり2.8.0に使用locale()してください):

moment.lang("de").format('LLL');

http://momentjs.com/docs/#/i18n/


v2.8.1以降moment.locale('de')、ローカリゼーションを設定しますが、を返しませんmoment。いくつかの例:

var march = moment('2017-03')
console.log(march.format('MMMM')) // 'March'

moment.locale('de') // returns the new locale, in this case 'de'
console.log(march.format('MMMM')) // 'March' still, since the instance was before the locale was set

var deMarch = moment('2017-03')
console.log(deMarch.format('MMMM')) // 'März'

// You can, however, change just the locale of a specific moment
march.locale('es')
console.log(march.format('MMMM')) // 'Marzo'

要約するとlocale、グローバルを呼び出すと、moment将来のすべてのmomentインスタンスのロケールが設定されますが、のインスタンスは返されませんmomentlocaleインスタンスを呼び出すと、そのインスタンスに設定され、そのインスタンスが返されます。

また、Shivがコメントで述べたように、「moment.min.js」ではなく「moment-with-locales.min.js」を使用してください。そうしないと機能しません。


1
ドキュメントでは、そうすることで、言語固有のモーメントのインスタンスを作成できます。最初にフォーマットすると、言語は処理されません。代わりに、スクリプト全体で瞬間の代わりに何かを実行してvar deMoment = moment(); deMoment.lang('de')再利用することもできdeMomentます。
kalley 2013

32
「moment.min.js」を使用すると機能しません。「moment-with-locales.min.js」が必要
Shiv

2
更新:Deprecation warning: moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages. Arguments: fr
Abdelouahab 2016年

8
:あなたは賢明な他のこの文句を言わない仕事たかっ言語インポートする必要がある import moment from 'moment'; import localization from 'moment/locale/de' moment().locale("de", localization).format('LLL')
ブルーボット

2
'moment / min / moment-with-locales'からモーメントをインポートします。
leojnxs

166

言語もインポートする必要がありました。

import moment from 'moment'
import 'moment/locale/es'  // without this line it didn't work
moment.locale('es')

次に、通常のように瞬間を使用します

alert(moment(date).fromNow())

15
あなたが言及したので、あなたの答えは他よりも役に立ちますimport 'moment/locale/es'
Artem Solovev '

4
はい、これが正解です...どうしてうまくいかないのかと思って髪を抜いていたのです。しかし、これは、使用される可能性のあるすべての言語タイプをインポートする必要があるという本当の痛みです。もっと良い方法があるはずです。
マニアック2018

1
特定のロケールのインポートについて説明していただきありがとうございます。
フェルナンドレオン

ドキュメントによれば、誰かがすべてのロケールを含めたい場合、彼/彼女はこれを使用するrequire("moment/min/locales.min");か、インポートを使用できますimport 'moment/min/locales.min'
kamran

ありがとう、正確に私が必要なもの
Davide P.

55

最速の方法:Bowerでインストール

bowerを使用しde.jsてモーメントをインストールし、htmlプロジェクトにjavascriptリソースとしてリンクしました。

bower install moment --save

moment.jsおよびを手動でダウンロードすることもできますde.js

プロジェクトに「de.js」をリンクする

de.jsメインプロジェクトファイルでをリンクすると、モーメントクラスとそのメソッドへのすべてのアクセスのロケールが自動的に変更されました。

あり得ないだろう もはや不要行うmoment.locale("de").moment.lang("de"). にソースコードを。

次のように希望のロケールをリンクするだけです。

<script src="/bower_components/moment/moment.js"></script>
<script src="/bower_components/moment/locale/de.js"></script>

またはbower_components、右クリックでmoment.js 1990iesスタイルをダウンロードした場合は、パスなしでライブラリをリンクできます。これは、ほとんどのシナリオで正常に機能します。


2
これが正解です。目的のローカルをにリンクするだけ<script src="/bower_components/moment/locale/de.js"></script>です。今すぐ機能します。
mles

8
"ソースコードでmoment.locale(" de ")。またはmoment.lang(" de ")。を実行する必要はもうありません。"。これは、ロケールを変更する動的なアプリにとってはまだ便利だと思います。あなたは理論的には私の角度アプリでLANG /国のドロップダウンメニューを経由して私のアプリでロケールを変更することができ、その後の瞬間は私がmoment.locale($ LANG)と思いますかと思われる動的にフォーマットを変更する必要がありますのような
armyofda12mnkeys

もちろん、私のテストでは、javascriptファイルをindex.htmlにロードする必要があります。これは2017年5月の問題であり、ドキュメントにこれを含める必要があるかもしれません。
スティーブK

37

momentjs 2.8以降では、次の操作を行います。

moment.locale("de").format('LLL');

http://momentjs.com/docs/#/i18n/


それうまくいくはずです。それが機能しない場所の例、およびどのようにモーメントを使用していますか(npm経由でインストールしたかなど)?
オムニノンセンス

4
最近の瞬間(私は2.18.1でテストしました)では、これを使用します:moment.locale( "de"); var m = moment()。format( "LLL")
apadana

1
apadanaは正解です。ロケールをmoment.locale('de')で設定し、現在の日付を表す新しいオブジェクトを作成しますmoment()(括弧に注意してください)format('LLL')。括弧は重要です。2.20でテスト済み。また、moment-with-locale.js必ず使用し、必要に応じて名前をに変更してくださいmoment.jsmoment-with-locale.js私の場合、Djangoはロードを拒否します。
WesternGun 2017

1
この1つは動作していない場合は、これを試してみてください: moment().locale('de').format('LLL');
アンソニーカル

これは正しいです。使用するロケールをインポートすることを忘れないでください(Agu Dondoの回答を参照)。
Jeroen Crevits

13

moment.lang(navigator.language)スクリプトを追加する必要があります。

また、表示したい各国のロケールを追加する必要もあります。たとえば、GBやFRの場合は、moment.jsライブラリにそのロケール形式を追加する必要があります。このような形式の例は、momentjsのドキュメントにあります。このフォーマットをmoment.jsに追加しない場合は、常にUSロケールを選択します。これは、現在表示されているロケールが唯一のロケールであるためです。


ブラウザが「en」にあり、「es」を読んでいる場合、「en」の時間のみが表示されます
Peter the Russian

12

2017/2018年末:もう1つの回答には古いコードが多すぎて編集できないため、ここに私の代替の明確な回答を示します。

必要と

let moment = require('moment');
require('moment/locale/fr.js');
// or if you want to include all locales:
require("moment/min/locales.min");

インポートあり

import moment from 'moment';
import 'moment/locale/fr';
// or if you want to include all locales:
require("moment/min/locales.min");

使用する:

moment.locale('fr');
moment().format('D MMM YY');  // Correct, set default global format 
// moment.locale('fr').format('D MMM YY') //Wrong old versions for global default format

タイムゾーン付き

*必要とする:

require('moment-range');
require('moment-timezone');

*インポート:

import 'moment-range';
import 'moment-timezone';

ゾーンを使用:

const newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
const losAngeles = newYork.clone().tz("America/Los_Angeles");
const london     = newYork.clone().tz("Europe/London");

日付をフォーマットする関数

const ISOtoDate = function (dateString, format='') {

 // if date is not string use conversion:
 // value.toLocaleDateString() +' '+ value.toLocaleTimeString();

  if ( !dateString ) {
    return '';
  }

  if (format ) {
    return moment(dateString).format(format);
  } else  {
    return moment(dateString);  // It will use default global format
  }  
};

私のために働いた唯一のことは、次のようにインポートする瞬間を変更することでした:import moment from 'moment/min/moment-with-locales';
leojnxs '29

@leojnxsはい、すべてのロケールを含めたいが、すべての言語でインポートを実行している1つ以上の特定のロケールでのみ機能する場合があります
stackdave

6

流星のユーザー向け:

瞬間のロケールはデフォルトではmeteorにインストールされません。デフォルトのインストールでは 'en'ロケールのみが取得されます。

したがって、他の回答で正しく示されているコードを使用します。

moment.locale('it').format('LLL');

ただし、必要なロケールをインストールするまで、英語のままになります。

流星の瞬間に個々のロケールを追加する、すてきでクリーンな方法があります(rzymekによって提供されます))。

次のコマンドを使用して、通常の流星の方法でモーメントパッケージをインストールします。

meteor add rzymek:moment

次に、たとえばイタリア語の場合に必要なロケールを追加します。

meteor add rzymek:moment-locale-it

または、使用可能なすべてのロケールを本当に追加したい場合(ページに約30kを追加します):

meteor add rzymek:moment-locales

@AntonALコメントを送ってくれてよかった。質問が実際には流星のためではないことに気づいた。しかし、私の答えはかなり役に立つと思います。これを反映するように私の回答を編集しました。
mwarren 2016年

ありがとう!追加されrzymek:moment-locale-de、機能しました:)
nooitaf 2017

4

瞬間2.18.1以降:

  moment.locale("de");
  var m = moment().format("LLL")

2
ロケールファイルを含める必要があります。そうしないと機能しません。
zeleven

2
これは、関連する特定のモーメントロケールモジュールもインポートされない限り、機能しないと既に述べられています。
マニアック2018

@Maniaque npm install --save momentだけで特別なものは何もインストールしませんでした。問題なく動作します
fedeteka

3
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>MomentJS</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
    <script type="text/javascript" src="moment.js"></script>
    <script type="text/javascript" src="locale/ne.js"></script>
</head>
<body>
    <script>
        jQuery(document).ready(function($) {
            moment.locale('en'); // default the locale to English
            var localLocale = moment();

            moment.locale('ne'); // change the global locale to Nepalese
            var ne1 = localLocale.format('LLLL');
            var ne2 = moment().format('LLLL');

            $('.ne1').text(ne1);
            $('.ne2').text(ne2);
        });
    </script>
    <p class="ne1"></p>
    <p class="ne2"></p>
</body>
</html>

デモ


3

gulpや友達と一緒にwebpackを使用していたので(このジェネレーターがすべてをセットアップしてくれました)、bower.jsonファイルを変更する必要がありました。momentパッケージのデフォルトのインポートを上書きして、すべての言語に付属するファイルを選択する必要がありました。

"overrides": {
  "moment": {
    "main": [
        "min/moment-with-locales.min.js"
    ]
  }
}

これは私の完全なbower.jsonファイルです:

{
  "name": "html5",
  "version": "0.0.0",
  "dependencies": {
    "angular-animate": "~1.4.2",
    "angular-cookies": "~1.4.2",
    "angular-touch": "~1.4.2",
    "angular-sanitize": "~1.4.2",
    "angular-messages": "~1.4.2",
    "angular-ui-router": "~0.2.15",
    "bootstrap-sass": "~3.3.5",
    "angular-bootstrap": "~0.13.4",
    "malarkey": "yuanqing/malarkey#~1.3.1",
    "angular-toastr": "~1.5.0",
    "moment": "~2.10.6",
    "animate.css": "~3.4.0",
    "angular": "~1.4.2",
    "lodash": "^4.13.1",
    "angular-moment": "^0.10.3",
    "angularLocalStorage": "ngStorage#^0.3.2",
    "ngstorage": "^0.3.10"
  },
  "devDependencies": {
    "angular-mocks": "~1.4.2"
  },
  "overrides": {
    "bootstrap-sass": {
      "main": [
        "assets/stylesheets/_bootstrap.scss",
        "assets/fonts/bootstrap/glyphicons-halflings-regular.eot",
        "assets/fonts/bootstrap/glyphicons-halflings-regular.svg",
        "assets/fonts/bootstrap/glyphicons-halflings-regular.ttf",
        "assets/fonts/bootstrap/glyphicons-halflings-regular.woff",
        "assets/fonts/bootstrap/glyphicons-halflings-regular.woff2"
      ]
    },
    "moment": {
      "main": [
          "min/moment-with-locales.min.js"
      ]
    }
  },
  "resolutions": {
    "angular": "~1.4.2"
  }
}

この後も、日付を出力する前に瞬間ロケールを宣言/設定する必要がありますよね?
NikZ 2017

もちろん:)これにより、翻訳されたフレーズが利用可能になり、別の言語に(その場で)切り替えられるようになります
GameScripting

3

私はangular2-momentを使用していますが、使用方法は同様でなければなりません。

import { MomentModule } from "angular2-moment";
import moment = require("moment");

export class AppModule {

  constructor() {
    moment.locale('ru');
  }
}

3

バージョンごとに瞬間のjs言語を変更する

バージョン:2.8+

moment.locale( 'hi');

バージョン:2.5.1

moment.lang( 'hi');


3

そのようにうまく働く: return moment(status.created_at).locale('es').fromNow();


2
このコードは質問に答えることがありますが、問題を解決する方法および/または理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
バダカダブラ2017年

3

何が変わったのかわかりませんが、このように言語ファイルをインポートするとうまくいきました

import 'moment/src/locale/fr';
moment.locale('fr)

importステートメントのsrcに注意してください


2

以下のためmomentjs 2.12+、次の手順を実行します。

moment.updateLocale('de');

また、を使用moment.updateLocale(localeName, config)して既存のロケールを変更する必要があることにも注意してください。moment.defineLocale(localeName, config)新しいロケールの作成にのみ使用してください。


2

私にとっては、いくつかの変更点があります(バージョン2.20)

  1. でロケールを設定しmoment.locale('de')、現在の日付を表す新しいオブジェクトをmoment()(括弧に注意して)作成し、次にformat('LLL')それを作成します。括弧は重要です。

つまり:

moment.locale('de');
var now = moment();
now.format('LLL');
  1. また、必ず使用してくださいmoment-with-locale.js。ファイルにはすべてのロケール情報が含まれ、ファイルサイズが大きくなります。localeフォルダをダウンロードするだけでは不十分です。必要に応じて、名前をに変更しますmoment.js。Django moment-with-locale.jsは、私の場合、ロードを拒否します。

編集:ファイルの名前を変更する必要がないことがわかりました。ページでそれを呼び出すのを忘れたので、Djangoはそれをロードする必要があるとは思わないので、私のせいです。


2

これは、現在のユーザーの場所を自動検出するだけで機能します。

import moment from "moment/min/moment-with-locales";

// Then use it as you always do. 
moment(yourDate).format("MMMM Do YYYY, h:mm a")

1

ペンのスリップ。私はこれを解決します: var moment = function(x) { return moment(x).locale('de'); }他の方法は、実際には(私にとって)条件下で固定/保持されていないようです。


0

非同期環境で作業しているmoment場合、オンデマンドでロケールをロードするときに予期しない動作をします。

の代わりに

await import('moment/locale/en-ca');
moment.locale('en-ca');

順序を逆にする

moment.locale('en-ca');
await import('moment/locale/en-ca');

ロケールは現在選択されているロケールに読み込まれ、以前に設定されたロケール情報を上書きしているようです。したがって、最初にロケールを切り替えてからロケール情報をロードしても、この問題は発生しません。


0

苦労した後、これは私にとってmomentv2.26.0でうまくいきました:

import React from "react";
import moment from "moment";
import frLocale from "moment/locale/fr";
import esLocale from "moment/locale/es";

export default function App() {
  moment.locale('fr', [frLocale, esLocale]) // can pass in 'en', 'fr', or 'es'

  let x = moment("2020-01-01 00:00:01");
  return (
    <div className="App">
      {x.format("LLL")}
      <br />
      {x.fromNow()}
    </div>
  );
}

あなたは渡すことができenfrまたはes。別の言語が必要な場合は、ロケールをインポートして配列に追加する必要があります。

1つの言語のみをサポートする必要がある場合は、少し簡単です。

import React from "react";
import moment from "moment";
import "moment/locale/fr"; //always use French

export default function App() {  
  let x = moment("2020-01-01 00:00:01");
  return (
    <div className="App">
      {x.format("LLL")}
      <br />
      {x.fromNow()}
    </div>
  );
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.