Как я могу изменить язык 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.