Jak zmienić język mom.js?

196

Próbuję zmienić język daty ustawianej przez moment.js. Domyślnym jest angielski, ale chcę ustawić język niemiecki. Oto, co próbowałem:

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

Daje NaN.

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

To nawet nie reaguje.

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

Bez zmian: nadal daje wynik w języku angielskim.

Jak to jest możliwe?

dawca
źródło

Odpowiedzi:

305

Potrzebujesz moment.lang ( OSTRZEŻENIE : lang()jest przestarzałe od chwili 2.8.0, locale()zamiast tego użyj ):

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

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


Począwszy od wersji 2.8.1, moment.locale('de')ustawia lokalizację, ale nie zwraca a moment. Kilka przykładów:

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'

Podsumowując, wywołanie localeglobalnego momentustawia ustawienia regionalne dla wszystkich przyszłych momentinstancji, ale nie zwraca instancji moment. Wywołanie localeinstancji ustawia ją dla tej instancji ORAZ zwraca tę instancję.

Ponadto, jak powiedział Shiv w komentarzach, upewnij się, że używasz „moment-with-locales.min.js”, a nie „moment.min.js”, w przeciwnym razie nie zadziała.

kalley
źródło
1
W dokumentach możesz w ten sposób tworzyć instancje językowe właściwe dla danego momentu. Jeśli sformatujesz pierwszy, język nie będzie przetwarzany. Alternatywnie możesz zrobić coś podobnego var deMoment = moment(); deMoment.lang('de')i użyć ponownie deMomentzamiast chwili w całym skrypcie.
kalley
33
Jeśli użyjesz „moment.min.js”, to nie zadziała; potrzebujesz „moment-with-locales.min.js”
Shiv
2
aktualizacja: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
musisz zaimportować poszukiwany język, inaczej nie zadziała: import moment from 'moment'; import localization from 'moment/locale/de' moment().locale("de", localization).format('LLL')
Blue Bot
2
importuj moment z „moment / min / moment-z-lokalizacjami”;
leojnxs
169

Musiałem zaimportować również język:

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

Następnie wykorzystaj moment, jak zwykle

alert(moment(date).fromNow())
Agu Dondo
źródło
15
Twoja odpowiedź jest bardziej pomocna niż inne, ponieważ wspomniałeś oimport 'moment/locale/es'
Artem Solovev
4
Tak, to poprawna odpowiedź ... dzięki, wyciągałam włosy, zastanawiając się, dlaczego to nie działa. Ale to prawdziwy ból, który trzeba importować dla każdego rodzaju języka, który może być użyty. Musi być lepszy sposób.
Maniaque
1
Dziękujemy za wyjaśnienie importu określonych ustawień regionalnych.
Fernando León
zgodnie z dokumentacją, jeśli ktoś chce, aby wszystkie lokalizacje były uwzględnione, może on / ona użyć tego require("moment/min/locales.min");lub importuimport 'moment/min/locales.min'
kamran
Dzięki, dokładnie to, czego potrzebuję
Davide P.
55

Najszybsza metoda: zainstaluj z Bower

Właśnie zainstalowałem moment z altaną i połączono de.jsjako zasób javascript w moim projekcie HTML.

bower install moment --save

Możesz także ręcznie pobrać moment.jsi de.js.

Link „de.js” w swoim projekcie

Łączenie de.jsw moim głównym pliku projektu automatycznie zmieniało ustawienia regionalne dla wszystkich dostępów do klasy momentu i jej metod.

Tam będzie już potrzeby wykonywania moment.locale("de").ani moment.lang("de"). w kodzie źródłowym.

Po prostu połącz swoje pożądane ustawienia regionalne w ten sposób:

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

Możesz też połączyć biblioteki bez bower_componentsścieżki, jeśli pobrałeś plik moment.js w stylu lat 90. za pomocą kliknięcia prawym przyciskiem myszy, co nadal działa dobrze w większości scenariuszy.

Steve K.
źródło
2
To powinna być poprawna odpowiedź. Po prostu połącz żądany lokalny z. <script src="/bower_components/moment/locale/de.js"></script>To działa teraz dla mnie.
2015
8
Msgstr "Nie będzie już więcej potrzeby wykonywania moment.locale („ de ”). Lub moment.lang („ de "). W kodzie źródłowym." Myślę, że nadal jest to przydatne w przypadku dynamicznych aplikacji, które zmieniają ustawienia regionalne. Jak możesz teoretycznie zmienić ustawienia regionalne w mojej aplikacji za pomocą menu rozwijanego lang / country w mojej aplikacji kątowej, a następnie moment powinien dynamicznie zmieniać formaty, co zrobiłbym, myślę z moment.locale ($ lang)
armyofda12mnkeys
Jasne, ale nadal musisz załadować plik javascript do index.html w moich testach. To wciąż jest problem w maju 2017 roku, być może moment powinien uwzględnić to w swoich dokumentach.
Steve K
37

Z momentjs 2.8+ wykonaj następujące czynności:

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

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

Nashenas
źródło
To powinno działać; czy możesz podać przykład, gdzie to nie działa, a także jak wykorzystujesz moment (czy zainstalowałeś go za pomocą npm itp.)?
omninonsense
4
W ostatnich momentach (testowałem w 2.18.1) użyj tego: moment.locale ("de"); var m = moment (). format („LLL”)
apadana
1
apadana ma rację: ustawiasz ustawienia narodowe za pomocą moment.locale('de')i tworzysz nowy obiekt reprezentujący datę teraz przez moment()(zwróć uwagę na nawias), a następnie format('LLL')to. Nawias jest ważny. Testowany w 2.20. Pamiętaj również, aby użyć moment-with-locale.jsi, jeśli to konieczne, zmień nazwę na moment.js. Django po prostu odmawia załadowania moment-with-locale.jsw moim przypadku.
WesternGun,
1
jeśli ten nie działa, spróbuj tego: moment().locale('de').format('LLL');
Anthony Kal
Ten jest prosty, ale nie zapomnij zaimportować ustawień narodowych, których chcesz użyć (por. Odpowiedź Agu Dondo).
Jeroen Crevits
13

Musisz dodać moment.lang(navigator.language)w skrypcie.

Musisz także dodać ustawienia regionalne dla każdego kraju, w którym chcesz wyświetlać: na przykład dla GB lub FR, musisz dodać ten format ustawień regionalnych do biblioteki moment.js. Przykład takiego formatu jest dostępny w dokumentacji momentjs. Jeśli nie dodasz tego formatu w chwili.js, ZAWSZE wybierzesz ustawienia regionalne w USA, ponieważ jest to jedyny, który obecnie widzę.

Smart Coder
źródło
co jeśli ich przeglądarka jest w trybie „en” i czytają w języku „es”, wówczas wyświetli się tylko godzina w „en”
Piotr, rosyjski,
12

koniec 2017/2018: inne odpowiedzi mają zbyt stary kod do edycji, więc tutaj moja alternatywna czysta odpowiedź:

z wymaganiem

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

z importem

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

Posługiwać się:

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

ze strefą czasową

*wymagać:

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

*import:

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

użyj stref:

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

funkcja formatowania daty

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
  }  
};
stackdave
źródło
Jedyną rzeczą, która działała dla mnie, była zmiana momentu importu na:import moment from 'moment/min/moment-with-locales';
leojnxs,
@leojnxs tak, jeśli chcesz uwzględnić wszystkie ustawienia narodowe, ale można pracować tylko z jednym lub większą liczbą określonych ustawień regionalnych wykonujących import dla każdego języka
stackdave
6

DLA UŻYTKOWNIKÓW METEOR:

W chwili, gdy ustawienia narodowe nie są instalowane domyślnie w Meteorze, dostajesz tylko ustawienia narodowe „en” z domyślną instalacją.

Więc używasz kodu pokazanego poprawnie w innych odpowiedziach:

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

ale pozostanie po angielsku, dopóki nie zainstalujesz potrzebnych ustawień regionalnych.

Jest ładny, czysty sposób dodawania poszczególne lokalizacje na chwilę w meteor (dostarczony przez Rzymek ).

Zainstaluj pakiet chwil w zwykły sposób meteorologiczny za pomocą:

meteor add rzymek:moment

Następnie po prostu dodaj potrzebne lokalizacje, np. Dla języka włoskiego:

meteor add rzymek:moment-locale-it

Lub jeśli naprawdę chcesz dodać wszystkie dostępne ustawienia narodowe (dodaje około 30k na swojej stronie):

meteor add rzymek:moment-locales
mwarren
źródło
@AntonAL Dobrze, że przesłałeś mi swój komentarz, właśnie zauważyłem, że pytanie nie dotyczyło meteoru. Jednak moja odpowiedź jest całkiem przydatna. Zredagowałem moją odpowiedź, aby to odzwierciedlić.
mwarren
Dzięki! Dodano rzymek:moment-locale-dei zadziałało :)
nooitaf,
4

Z momentem 2.18.1 i nowszym:

  moment.locale("de");
  var m = moment().format("LLL")
apadana
źródło
2
Musi zawierać pliki ustawień regionalnych, w przeciwnym razie nie będzie działać.
zeleven
2
Zostało to już wspomniane jako niedziałające, chyba że zaimportowany został również powiązany moduł lokalizacji momentu.
Maniaque
@Maniaque Nie zainstalowałem nic specjalnego, po prostu instaluję npm - zachowaj chwilę i działa dobrze
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>

Próbny

Ram Pukar
źródło
3

Kiedy korzystałem z webpacka z gulpem i przyjaciółmi ( ten generator skonfigurował dla mnie wszystko) musiałem zmienić plik bower.json. Musiałem zastąpić domyślny import pakietu chwilowego i wybrać plik dostarczany we wszystkich językach:

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

To jest mój pełny plik 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"
  }
}
GameScripting
źródło
Po tym nadal musisz zadeklarować / ustawić lokalny moment przed wypisaniem daty, prawda?
NikZ
Oczywiście :) To tylko zapewnia, że ​​masz przetłumaczone frazy, abyś mógł przejść do innego języka (w locie)
GameScripting
3

Używam momentu kątowego2, ale użycie musi być podobne.

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

export class AppModule {

  constructor() {
    moment.locale('ru');
  }
}
Dmitry
źródło
3

Zmień język js momentu zgodnie z wersją

Wersja: 2.8+

moment.locale („cześć”);

Wersja: 2.5.1

moment.lang („cześć”);

Anil Nankar
źródło
3

działaj dobrze tak: return moment(status.created_at).locale('es').fromNow();

Claudio Scheuermann
źródło
2
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Badacadabra
3

Nie jestem pewien, co się zmieniło, ale importowanie takiego pliku językowego działało dla mnie

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

Zwróć uwagę na src w instrukcji importu

Taha
źródło
2

dla momentjs 2.12+ wykonaj następujące czynności:

moment.updateLocale('de');

Pamiętaj też, że musisz użyć, moment.updateLocale(localeName, config)aby zmienić istniejące ustawienia narodowe. moment.defineLocale(localeName, config)powinien być używany tylko do tworzenia nowych ustawień regionalnych.

Francisco Costa
źródło
2

Dla mnie są pewne zmiany do wprowadzenia (wer. 2.20)

  1. Ustawiasz ustawienia narodowe za pomocą moment.locale('de')i tworzysz nowy obiekt reprezentujący datę teraz przez moment()(zwróć uwagę na nawias), a następnie format('LLL')go. Nawias jest ważny.

Wiec to znaczy:

moment.locale('de');
var now = moment();
now.format('LLL');
  1. Pamiętaj też o użyciu moment-with-locale.js. Plik zawiera wszystkie informacje o ustawieniach regionalnych i ma większy rozmiar. Pobierz localefolder to za mało. W razie potrzeby zmień nazwę na moment.js. Django po prostu odmawia załadowania moment-with-locale.jsw moim przypadku.

EDYCJA: Okazało się, że zmiana nazwy pliku nie jest konieczna. Właśnie zapomniałem wywołać go na stronie, więc Django nie uważa, aby ładowanie było konieczne, więc moja wina.

WesternGun
źródło
2

Ten działa po prostu przez automatyczne wykrywanie bieżącej lokalizacji użytkownika.

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

// Then use it as you always do. 
moment(yourDate).format("MMMM Do YYYY, h:mm a")
Mussa Charles
źródło
1

Ups, długopis. Rozwiązałbym to: var moment = function(x) { return moment(x).locale('de'); }inne sposoby nie wydają się trzymać / trzymać w określonych warunkach (dla mnie).

Rob Jens
źródło
0

Dla osób pracujących w środowiskach asynchronicznych moment zachowują się nieoczekiwanie podczas ładowania ustawień regionalnych na żądanie.

Zamiast

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

odwrócić kolejność

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

Wygląda na to, że ustawienia narodowe są ładowane do aktualnie wybranych ustawień regionalnych, przesłaniając wcześniej ustawione informacje dotyczące ustawień regionalnych. Dlatego najpierw zmiana ustawień regionalnych, a następnie ładowanie informacji o ustawieniach regionalnych nie powoduje tego problemu.

Yanick Rochon
źródło
0

Po zmaganiach zadziałało to dla mnie w wersji moment2.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>
  );
}

Można przejść się en, frczyes . Jeśli chcesz mieć inny język, musisz zaimportować ustawienia regionalne i dodać je do tablicy.

Jeśli potrzebujesz obsługiwać tylko jeden język, jest to nieco prostsze:

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>
  );
}
Alan P.
źródło