Як змінити мову moment.js?


198

Я намагаюся змінити мову дати, яку встановлює moment.js. За замовчуванням - англійська, але я хочу встановити німецьку мову. Ось що я спробував:

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

Це дає NaN.

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

Це навіть не реагує.

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

Без змін: це все ще дає результат англійською мовою.

Як це можливо?


Відповіді:


305

Вам потрібен 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замість моменту у своєму сценарії.
kalley

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

Дякую, саме те, що мені потрібно
Девід П.

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шляху, якщо ви завантажили стиль moment.js 1990ies за допомогою правої кнопки миші, що як і раніше працює добре у більшості сценаріїв.


2
Це має бути правильна відповідь. Просто зв’яжіть потрібний локальний з <script src="/bower_components/moment/locale/de.js"></script>. Він працює для мене прямо зараз.
mles

8
"Більше не потрібно буде робити момент.locale (" de "). Або moment.lang (" de "). У вихідному коді." Я думаю, що це все ще корисно для динамічних додатків, які змінюють локаль. Як ви теоретично можете теоретично змінити локальний додаток у моєму додатку через падіння lang / country у моєму кутовому додатку, і тоді момент повинен динамічно змінювати формати, які я б зробив, я думаю, що з moment.locale ($ lang)
armyofda12mnkeys

Звичайно, але вам все ж потрібно завантажити мої тести в файл index.html у мої тести. Це все ще проблема в травні 2017 року, можливо, момент повинен включити це у свої документи.
Стів K

37

З momentjs 2.8+ зробіть наступне:

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

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


Це має працювати; чи можете ви навести приклад того, де це не працює, а також як ви використовуєте момент (ви встановили його через npm тощо)?
omninonsense

4
З останніми моментами (я тестував у 2.18.1) використовуйте це: moment.locale ("de"); var m = moment (). формат ("LLL")
apadana

1
apadana вірно: ви встановлюєте locale з 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');
Ентоні Кал

Це коректно, просто не забудьте імпортувати локаль, який ви хочете використовувати (див. Відповідь Агу Дондо).
Jeroen Crevits

13

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

А також потрібно додати кожну локальну країну, яку ви хочете відобразити: наприклад, для GB або FR, вам потрібно додати цей формат локалі у бібліотеці moment.js. Приклад такого формату доступний у документації на momentjs. Якщо ви не додаєте цей формат у 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 так, якщо ви хочете включити всі локалі, але можна працювати лише з одним або кількома конкретними
локалями,

6

ДЛЯ КОРИСТУВАЧІВ МЕТЕ:

моменти локалів не встановлені за замовчуванням у метеорі, ви отримуєте локальну локальність 'en' лише при встановленні за замовчуванням.

Отже, ви використовуєте код, як правильно показано в інших відповідях:

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

але він залишатиметься англійською мовою, поки ви не встановите потрібну вам мову.

Існує приємний, чистий спосіб додавання окремих локальних локальних даних на момент метеору (надається rzymek ).

Встановіть момент пакет в звичайному метеорного шляху з:

meteor add rzymek:moment

Потім просто додайте потрібні локалі, наприклад для італійської мови:

meteor add rzymek:moment-locale-it

Або якщо ви дійсно хочете додати всі доступні локалі (додає приблизно 30 к на вашу сторінку):

meteor add rzymek:moment-locales

@AntonAL Добре, що ти надіслав мені свій коментар, я щойно помітив, що питання насправді не стосується метеора. Однак моя відповідь є досить корисною, я вважаю. Я відредагував свою відповідь, щоб це відобразити.
mwarren

Дякую! Додано rzymek:moment-locale-deі це спрацювало :)
nooitaf

4

З моменту 2.18.1 і далі:

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

2
Потрібно включити локальні файли, інакше це не працюватиме.
зелевен

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

Оскільки я використовував webpack з 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-moment, але використання має бути подібним.

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

export class AppModule {

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

3

Змініть мову js моменту відповідно до версії

Версія: 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

для 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. Джанго просто відмовляється завантажувати moment-with-locale.jsв моєму випадку.

EDIT: Виявилося, що перейменувати файл не потрібно. Я просто забув викликати його на сторінці, щоб Джанго не вважав, що завантажувати її потрібно, тому я винен.


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.