Wie ändere ich die Sprache von moment.js?


196

Ich versuche, die Sprache des Datums zu ändern, das von moment.js festgelegt wird. Die Standardeinstellung ist Englisch, aber ich möchte die deutsche Sprache einstellen. Folgendes habe ich versucht:

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

Es gibt NaN.

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

Das reagiert nicht einmal.

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

Keine Änderung: Dies führt immer noch zu einem Ergebnis auf Englisch.

Wie ist das möglich?


Antworten:


303

Sie müssen moment.lang ( ACHTUNG : lang()da Moment ist veraltet 2.8.0, verwenden Sie locale()stattdessen):

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

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


Ab Version 2.8.1 wird moment.locale('de')die Lokalisierung festgelegt, a wird jedoch nicht zurückgegeben moment. Einige Beispiele:

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'

Zusammenfassend lässt sich sagen, dass beim Aufrufen localevon global momentdas Gebietsschema für alle zukünftigen momentInstanzen festgelegt wird, jedoch keine Instanz von zurückgegeben wird moment. Wenn Sie localeeine Instanz aufrufen, wird sie für diese Instanz festgelegt UND diese Instanz zurückgegeben.

Stellen Sie außerdem, wie Shiv in den Kommentaren sagte, sicher, dass Sie "moment-with-locales.min.js" und nicht "moment.min.js" verwenden, da dies sonst nicht funktioniert.


1
In den Dokumenten können Sie auf diese Weise sprachspezifische Momentinstanzen erstellen. Wenn Sie zuerst formatieren, wird die Sprache nicht verarbeitet. Alternativ können Sie in Ihrem gesamten Skript so etwas wie " var deMoment = moment(); deMoment.lang('de')Wiederverwenden" deMomentanstelle von "Moment" verwenden.
Kalley

32
Wenn Sie "moment.min.js" verwenden, funktioniert es nicht. Sie brauchen "moment-with-locales.min.js"
Shiv

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

8
Sie müssen die gewünschte Sprache importieren, sonst funktioniert dies nicht: import moment from 'moment'; import localization from 'moment/locale/de' moment().locale("de", localization).format('LLL')
Blue Bot

2
Moment aus 'moment / min / moment-with-locales' importieren;
Leojnxs

166

Ich musste auch die Sprache importieren:

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

Verwenden Sie dann den Moment wie gewohnt

alert(moment(date).fromNow())

15
Ihre Antwort ist hilfreicher als andere, weil Sie überimport 'moment/locale/es'
Artem Solovev

4
Ja, das ist die richtige Antwort ... danke, ich habe mir die Haare ausgezogen und mich gefragt, warum es nicht funktioniert hat. Dies ist jedoch ein echtes Problem, das für jeden möglicherweise verwendeten Sprachtyp importiert werden muss. Es muss einen besseren Weg geben.
Maniaque

1
Vielen Dank, dass Sie den Import eines bestimmten Gebietsschemas erklärt haben.
Fernando León

Laut Dokumentation kann jemand, der möchte, dass alle Gebietsschemas enthalten sind, dies verwenden require("moment/min/locales.min");oder importierenimport 'moment/min/locales.min'
kamran

Danke, genau das, was ich brauche
Davide P.

55

Schnellste Methode: Mit Bower installieren

Ich habe gerade moment mit bower installiert und de.jsals Javascript-Ressource in meinem HTML-Projekt verlinkt .

bower install moment --save

Sie können das moment.jsund auch manuell herunterladen de.js.

Verknüpfen Sie 'de.js' in Ihrem Projekt

Durch das Verknüpfen der de.jsDatei in meiner Hauptprojektdatei wurde automatisch das Gebietsschema für alle Zugriffe auf die Moment-Klasse und ihre Methoden geändert.

Es ist nicht mehr erforderlich, ein moment.locale("de").oder moment.lang("de"). im Quellcode auszuführen.

Verknüpfen Sie einfach Ihr gewünschtes Gebietsschema wie folgt:

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

Oder Sie können die Bibliotheken ohne bower_componentsPfad verknüpfen , wenn Sie moment.js im Stil der 90er Jahre per Rechtsklick heruntergeladen haben, was in den meisten Szenarien immer noch gut funktioniert.


2
Dies sollte die richtige Antwort sein. Verknüpfen Sie einfach das gewünschte Lokal mit. <script src="/bower_components/moment/locale/de.js"></script>Es funktioniert gerade für mich.
mles

8
"Es ist nicht mehr erforderlich, einen moment.locale (" de "). Oder einen moment.lang (" de "). Im Quellcode auszuführen." Ich denke, dies ist immer noch nützlich für dynamische Apps, die das Gebietsschema ändern. Als ob Sie theoretisch das Gebietsschema in meiner App über ein lang / country-Dropdown-Menü in meiner eckigen App ändern könnten, und dann sollte moment die Formate dynamisch ändern, was ich mit moment.locale ($ lang) tun würde
armee von da12mnkeys

Sicher, aber Sie müssen in meinen Tests immer noch die Javascript-Datei in Ihre index.html laden. Dies ist immer noch ein Problem im Mai 2017, vielleicht sollte der Moment dies in ihre Dokumente aufnehmen.
Steve K

37

Gehen Sie mit momentjs 2.8+ wie folgt vor:

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

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


Es sollte funktionieren; Können Sie ein Beispiel dafür geben, wo es nicht funktioniert und wie Sie moment verwenden (haben Sie es über npm usw. installiert)?
Omninonsense

4
Verwenden Sie in den letzten Momenten (die ich in 2.18.1 getestet habe) Folgendes: moment.locale ("de"); var m = moment (). format ("LLL")
apadana

1
apadana ist richtig: Sie setzen das Gebietsschema mit moment.locale('de')und erstellen ein neues Objekt, das das Datum von jetzt bis moment()(beachten Sie die Klammern) und dann format('LLL')es. Die Klammer ist wichtig. Getestet in 2.20. Denken Sie auch daran moment-with-locale.js, den Namen zu verwenden und gegebenenfalls zu ändern moment.js. Django weigert sich einfach, moment-with-locale.jsin meinem Fall zu laden .
WesternGun

1
Wenn dieser nicht funktioniert, versuchen Sie diesen: moment().locale('de').format('LLL');
Anthony Kal

Dieser ist korrekt. Vergessen Sie jedoch nicht, das Gebietsschema zu importieren, das Sie verwenden möchten (vgl. Antwort von Agu Dondo).
Jeroen Crevits

13

Sie müssten moment.lang(navigator.language)in Ihrem Skript hinzufügen .

Außerdem muss jedes Ländergebietsschema hinzugefügt werden, in dem Sie anzeigen möchten: Zum Beispiel für GB oder FR müssen Sie dieses Gebietsschemaformat in der Bibliothek moment.js hinzufügen. Ein Beispiel für ein solches Format finden Sie in der Dokumentation von momentjs. Wenn Sie dieses Format nicht in moment.js hinzufügen, wird IMMER das US-Gebietsschema übernommen, da dies das einzige ist, das ich derzeit sehe.


Was ist, wenn ihr Browser in 'en' ist und sie in 'es' lesen, dann wird nur die Zeit in 'en' angezeigt
Peter der Russe

12

Ende 2017/2018: Die anderen Antworten haben zu viel alten Code zum Bearbeiten, also hier meine alternative saubere Antwort:

mit erfordern

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

mit Importen

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

Verwenden:

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

mit Zeitzone

*benötigen:

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

*importieren:

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

Zonen verwenden:

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

Funktion zum Formatieren des Datums

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

Das einzige, was für mich funktioniert hat, war den Moment des Imports zu ändern:import moment from 'moment/min/moment-with-locales';
Leojnxs

@leojnxs ja, wenn Sie alle Gebietsschemas einschließen möchten, aber es ist möglich, nur mit einem oder mehreren bestimmten Gebietsschemas zu arbeiten, die einen Import für jede Sprache durchführen
stackdave

6

FÜR METEOR-BENUTZER:

Sobald Gebietsschemas in meteor nicht standardmäßig installiert sind, erhalten Sie das Gebietsschema 'en' nur mit der Standardinstallation.

Sie verwenden den Code also wie in anderen Antworten korrekt gezeigt:

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

Es bleibt jedoch in Englisch, bis Sie das gewünschte Gebietsschema installieren.

Es gibt eine schöne, saubere Möglichkeit, einzelne Gebietsschemas für den Moment in Meteor hinzuzufügen (geliefert von rzymek ).

Installieren Sie das Moment- Paket auf die übliche Meteor-Weise mit:

meteor add rzymek:moment

Fügen Sie dann einfach die Gebietsschemas hinzu, die Sie benötigen, z. B. für Italienisch:

meteor add rzymek:moment-locale-it

Oder wenn Sie wirklich alle verfügbaren Gebietsschemas hinzufügen möchten (fügt Ihrer Seite etwa 30.000 hinzu):

meteor add rzymek:moment-locales

@AntonAL Gut, dass du mir deinen Kommentar geschickt hast, ich habe gerade bemerkt, dass die Frage eigentlich nicht für Meteor war. Meine Antwort ist jedoch ziemlich nützlich, denke ich. Ich habe meine Antwort bearbeitet, um dies widerzuspiegeln.
Mwarren

Vielen Dank! Hinzugefügt rzymek:moment-locale-deund es hat funktioniert :)
nooitaf

4

Ab Moment 2.18.1:

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

2
Muss die Gebietsschemadateien enthalten, sonst funktioniert es nicht.
Zeleven

2
Dies wurde bereits als nicht funktionsfähig erwähnt, es sei denn, das zugehörige spezifische Moment-Gebietsschema-Modul wurde ebenfalls importiert.
Maniaque

@Maniaque Ich habe nichts Besonderes installiert, nur npm installieren - Moment speichern und es funktioniert gut
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>

Demo


3

Da ich Webpack mit Schluck und Freunden benutzte ( dieser Generator hat alles für mich eingerichtet), musste ich eine Änderung an der Datei bower.json vornehmen. Ich musste den Standardimport für das Moment-Paket überschreiben und die Datei auswählen, die mit allen Sprachen geliefert wird:

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

Dies ist meine vollständige Datei 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"
  }
}

Danach müssen Sie noch das Gebietsschema für den Moment deklarieren / festlegen, bevor Sie ein Datum ausgeben, oder?
NikZ

Natürlich :) Dies stellt nur sicher, dass Sie die übersetzten Phrasen zur Verfügung haben, damit Sie (im
laufenden Betrieb

3

Ich verwende angle2-moment, aber die Verwendung muss ähnlich sein.

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

export class AppModule {

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

3

Ändern Sie den Moment js Sprache gemäß Version

Version: 2.8+

moment.locale ('hi');

Version: 2.5.1

moment.lang ('hi');


3

so gut funktionieren: return moment(status.created_at).locale('es').fromNow();


2
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Badacadabra

3

Ich bin nicht sicher, was sich geändert hat, aber das Importieren der Sprachdatei wie diese hat bei mir funktioniert

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

Beachten Sie den src in der import-Anweisung


2

Führen Sie für momentjs 2.12+ Folgendes aus:

moment.updateLocale('de');

Beachten Sie auch, dass Sie moment.updateLocale(localeName, config)ein vorhandenes Gebietsschema ändern müssen . moment.defineLocale(localeName, config)sollte nur zum Erstellen eines neuen Gebietsschemas verwendet werden.


2

Für mich sind einige Änderungen vorzunehmen (Ver. 2.20)

  1. Sie legen das Gebietsschema mit fest moment.locale('de')und erstellen ein neues Objekt, das das Datum bis jetzt darstellt moment()(beachten Sie die Klammern), und dann format('LLL'). Die Klammer ist wichtig.

Das bedeutet also:

moment.locale('de');
var now = moment();
now.format('LLL');
  1. Denken Sie auch daran, zu verwenden moment-with-locale.js. Die Datei enthält alle Gebietsschemainformationen und hat eine größere Dateigröße. Das Herunterladen des localeOrdners reicht nicht aus. Ändern Sie gegebenenfalls den Namen in moment.js. Django weigert sich nur, moment-with-locale.jsin meinem Fall zu laden .

BEARBEITEN: Es stellte sich heraus, dass das Umbenennen der Datei nicht erforderlich ist. Ich habe nur vergessen, es auf der Seite aufzurufen, damit Django das Laden nicht für notwendig hält, also meine Schuld.


2

Dieser funktioniert nur durch automatische Erkennung des aktuellen Benutzerstandorts.

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

Whoops Slip of the Pen. Ich würde das lösen: var moment = function(x) { return moment(x).locale('de'); }Die anderen Wege scheinen unter Bedingungen (für mich) nicht wirklich zu bleiben.


0

Verhalten sich in asynchronen Umgebungen momentbeim Laden von Gebietsschemas bei Bedarf unerwartet.

Anstatt

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

kehre die Reihenfolge um

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

Es scheint, als würden die Gebietsschemas in das aktuell ausgewählte Gebietsschema geladen und überschreiben alle zuvor festgelegten Gebietsschemainformationen. Wenn Sie also zuerst das Gebietsschema wechseln und dann die Gebietsschemainformationen laden, tritt dieses Problem nicht auf.


0

Nach dem Kämpfen funktionierte dies für mich für 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>
  );
}

Sie können übergeben en, froder es. Wenn Sie eine andere Sprache möchten, müssen Sie das Gebietsschema importieren und dem Array hinzufügen.

Wenn Sie nur eine Sprache unterstützen müssen, ist dies etwas einfacher:

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>
  );
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.