Как я могу изменить язык moment.js?


198

Я пытаюсь изменить язык даты, которая устанавливается моментом. По умолчанию используется английский, но я хочу установить немецкий язык. Вот что я попробовал:

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

Это дает NaN.

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

Это даже не реагирует.

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

Без изменений: это все еще дает результат на английском языке.

Как это возможно?


Ответы:


306

Вам нужен moment.lang ( ВНИМАНИЕ : lang()устарел с момента 2.8.0, используйте locale()вместо):

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

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


Начиная с v2.8.1, moment.locale('de')устанавливает локализацию, но не возвращает a 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экземпляров, но не возвращает экземпляр moment. Вызов localeэкземпляра, установка его для этого экземпляра и возврат этого экземпляра.

Также, как сказал Шив в комментариях, убедитесь, что вы используете «moment-with-locales.min.js», а не «moment.min.js», иначе это не будет работать.


1
Делая это, вы можете создавать специфичные для языка экземпляры момента. Если вы сначала отформатируете, язык не будет обрабатываться. В качестве альтернативы, вы можете сделать что-то подобное var deMoment = moment(); deMoment.lang('de')и использовать deMomentвместо момента в течение всего сценария.
— Калли

34
Если вы используете «moment.min.js», он не будет работать; вам нужен момент-с-locales.min.js
— Шив

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

8
вам нужно импортировать нужный язык, иначе это не сработает: import moment from 'moment'; import localization from 'moment/locale/de' moment().locale("de", localization).format('LLL')
— Blue Bot

2
импортировать момент из 'момента / минуты / момента с местами';
— leojnxs

169

Мне пришлось импортировать также язык:

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'
— Артем Соловьев

4
Да, это правильный ответ ... спасибо, я вырывал свои волосы, удивляясь, почему это не работает. Но это настоящая боль при импорте для любого типа языка, который может быть использован. Там должен быть лучший способ.
— Маньяк

1
Спасибо за объяснение импорта конкретной локали.
— Фернандо Леон

согласно документации, если кто-то хочет, чтобы все локали были включены, он может использовать это require("moment/min/locales.min");или использовать импортimport 'moment/min/locales.min'
— kamran

Спасибо, именно то, что мне нужно
— Davide P.

54

Самый быстрый метод: установка с Bower

Я только что установил момент с bower и связал de.jsкак ресурс javascript в моем html-проекте.

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пути, если вы загрузили моментальный стиль в стиле 1990-х через щелчок правой кнопкой мыши, который по-прежнему хорошо работает в большинстве сценариев.


2
Это должен быть правильный ответ. Просто свяжите желаемый местный с. <script src="/bower_components/moment/locale/de.js"></script>Это работает для меня прямо сейчас.
— mles

8
Msgstr "Больше не нужно будет делать в исходном коде moment.locale (" de "). Или moment.lang (" de ")." " Я думаю, что это все еще полезно для динамических приложений, которые меняют язык. Как вы можете теоретически изменить локаль в моем приложении через выпадающий список lang / country в моем угловом приложении, а затем момент должен динамически менять форматы, что я бы сделал, я думаю, с помощью moment.locale ($ lang)
— armyofda12mnkeys

Конечно, но вы все равно должны загрузить файл javascript в ваш index.html в моих тестах. Это все еще проблема в мае 2017 года, может быть, момент должен включить это в свои документы.
— Стив К

37

С моментом 2.8+ сделайте следующее:

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

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


Это должно работать; Можете ли вы привести пример, где он не работает, а также как вы используете момент (вы установили его через npm и т. д.)?
— omninonsense

4
С недавними моментами (я проверял в 2.18.1) используйте это: moment.locale ("de"); вар т = момент () формат ( "LLL").
— Apadana

1
apadana прав: вы устанавливаете языковой стандарт с помощью moment.locale('de'), и вы создаете новый объект, представляющий текущую дату moment()(обратите внимание на круглые скобки), а затем format('LLL')ее. Скобка важна. Проверено в 2.20. Кроме того, не забудьте использовать moment-with-locale.jsи при необходимости изменить имя на moment.js. Джанго просто отказывается загружаться moment-with-locale.jsв моем случае.
— WesternGun

1
если этот не работает, попробуйте этот: moment().locale('de').format('LLL');
— Энтони Кэл

Это правильно, просто не забудьте импортировать локаль, которую вы хотите использовать (см. Ответ Агу Дондо).
— Йерун Кревиц

13

Вам нужно добавить moment.lang(navigator.language)в свой сценарий.

Также необходимо добавить каждую локаль страны, в которой вы хотите отобразить: например, для ГБ или FR, вам нужно добавить этот формат локали в библиотеку moment.js. Пример такого формата доступен в документации моментов. Если вы не добавите этот формат в moment.js, то он ВСЕГДА выберет локали США, так как это единственный, который я сейчас вижу.


Что, если их браузер находится в «en», а они читают в «es», тогда он будет показывать только время в «en»
— Петр Русский

12

Конец 2017/2018: в чужих ответах слишком много старого кода для редактирования, поэтому вот мой альтернативный чистый ответ:

с требованием

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

@leojnxs да, если вы хотите включить все локали, но возможно работать только с одним или несколькими конкретными локалями, выполняющими импорт для каждого языка
— stackdave

6

ДЛЯ ПОЛЬЗОВАТЕЛЕЙ METEOR:

в то время как локали не установлены по умолчанию в метеоре, вы получаете только локаль 'en' с установкой по умолчанию.

Таким образом, вы используете код, как показано правильно в других ответах:

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

но он останется на английском, пока вы не установите нужный язык.

Есть хороший, чистый способ добавления отдельных локалей для момента в метеоре (предоставлен rzymek ).

Установите моментальный пакет обычным способом:

meteor add rzymek:moment

Затем просто добавьте нужные вам локали, например, для итальянского:

meteor add rzymek:moment-locale-it

Или, если вы действительно хотите добавить все доступные локали (добавляет около 30 Кб на вашу страницу):

meteor add rzymek:moment-locales

@AntonAL Хорошо, что вы прислали мне свой комментарий, я только что заметил, что вопрос на самом деле не был для метеора. Однако мой ответ довольно полезен, я считаю. Я отредактировал свой ответ, чтобы отразить это.
— Мваррен

Спасибо! Добавил rzymek:moment-locale-deи все
— заработало

4

С момента 2.18.1 и далее:

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

2
Необходимо включить файлы локали, иначе это не будет работать.
— Zeleven

2
Это уже упоминалось как не работающее, если только не был импортирован соответствующий модуль локали конкретного момента.
— Маньяк

@Maniaque Я не установил ничего особенного, просто установил npm - сохраните момент, и он отлично работает
— 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 и друзьями ( этот генератор настроил все для меня), мне пришлось внести изменения в файл bower.json. Мне пришлось переопределить импорт по умолчанию для пакета момента и выбрать файл, который поставляется со всеми языками:

"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

Конечно :) Это просто гарантирует, что у вас есть переведенные фразы, чтобы вы могли переключиться на другой язык (на лету)
— GameScripting

3

Я использую angular2-момент, но использование должно быть похожим.

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

export class AppModule {

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

3

Измените язык языка в соответствии с версией

Версия: 2.8+

moment.locale ( 'Привет');

Версия: 2.5.1

moment.lang ( 'Привет');


3

нормально работать так: return moment(status.created_at).locale('es').fromNow();


2
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
— Бадакадабра

3

Я не уверен, что изменилось, но импорт языкового файла, как это сработало для меня

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

Обратите внимание на src в операторе импорта


2

для момента 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. Джанго просто отказывается загружаться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>
  );
}

Вы можете пройти en, frилиes . Если вам нужен другой язык, вам нужно будет импортировать локаль и добавить ее в массив.

Если вам нужно поддерживать только один язык, это немного проще:

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>
  );
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.