Làm cách nào để thay đổi ngôn ngữ của Moment.js?


196

Tôi đang cố gắng thay đổi ngôn ngữ của ngày đang được đặt bởi khoảnh khắc.js. Mặc định là tiếng Anh, nhưng tôi muốn đặt tiếng Đức. Đây là những gì tôi đã thử:

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

Đó là cho NaN.

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

Điều này thậm chí không phản ứng.

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

Không thay đổi: điều này vẫn tạo ra một kết quả bằng tiếng Anh.

Sao có thể như thế được?


Câu trả lời:


303

Bạn cần khoảnh khắc.lang ( CẢNH BÁO : lang()không được dùng nữa 2.8.0, locale()thay vào đó , hãy sử dụng ):

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

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


Kể từ v2.8.1, moment.locale('de')đặt nội địa hóa, nhưng không trả về a moment. Vài ví dụ:

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'

Tóm lại, kêu gọi localetoàn cầu momentđặt miền địa phương cho tất cả các momenttrường hợp trong tương lai , nhưng không trả về một thể hiện của moment. Gọi localemột thể hiện, đặt nó cho thể hiện đó VÀ trả về thể hiện đó.

Ngoài ra, như Shiv đã nói trong các nhận xét, hãy đảm bảo bạn sử dụng "khoảnh khắc với địa phương.min.js" chứ không phải "khoảnh khắc.min.js", nếu không nó sẽ không hoạt động.


1
Trong các tài liệu, bạn có thể tạo các phiên bản cụ thể của ngôn ngữ bằng cách thực hiện điều đó. Nếu bạn định dạng đầu tiên, ngôn ngữ sẽ không xử lý. Ngoài ra, bạn có thể làm một cái gì đó như var deMoment = moment(); deMoment.lang('de')và tái sử dụng deMomentthay vì khoảnh khắc trong suốt kịch bản của bạn.
kalley

32
Nếu bạn sử dụng "khoảnh khắc.min.js" thì nó sẽ không hoạt động; bạn cần "khoảnh khắc với địa phương.min.js"
Shiv

2
cập nhật: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
bạn cần nhập ngôn ngữ mong muốn khác, điều này sẽ không hiệu quả: import moment from 'moment'; import localization from 'moment/locale/de' moment().locale("de", localization).format('LLL')
Blue Bot

2
nhập khoảnh khắc từ 'khoảnh khắc / phút / khoảnh khắc với địa phương';
leojnxs

166

Tôi cũng phải nhập ngôn ngữ:

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

Sau đó sử dụng khoảnh khắc như bạn thường làm

alert(moment(date).fromNow())

15
Câu trả lời của bạn hữu ích hơn những câu hỏi khác vì bạn đã đề cập đếnimport 'moment/locale/es'
Artem Solovev

4
Vâng, đây là câu trả lời đúng ... cảm ơn, tôi đã nhổ tóc tự hỏi tại sao nó không hoạt động. Nhưng đây là một nỗi đau thực sự khi phải nhập khẩu cho bất kỳ loại ngôn ngữ nào có thể được sử dụng. Có phải là một cách tốt hơn.
Maniaque

1
Cảm ơn đã giải thích nhập khẩu của địa phương cụ thể.
Fernando León

theo tài liệu nếu ai đó muốn bao gồm tất cả các địa phương thì anh ấy / cô ấy có thể sử dụng require("moment/min/locales.min");hoặc nhập khẩuimport 'moment/min/locales.min'
kamran

Cảm ơn, chính xác những gì tôi cần
Davide P.

55

Phương pháp nhanh nhất: Cài đặt với Bower

Tôi vừa cài đặt khoảnh khắc với bower và được liên kết de.jsdưới dạng tài nguyên javascript trong dự án html của mình.

bower install moment --save

Bạn cũng có thể tự tải xuống moment.jsde.js.

Liên kết 'de.js' trong dự án của bạn

Liên kết de.jstrong tệp dự án chính của tôi tự động thay đổi ngôn ngữ cho tất cả các truy cập vào lớp khoảnh khắc và các phương thức của nó.

Sẽ có không cần nữa để làm một moment.locale("de").hoặc moment.lang("de"). trong mã nguồn.

Chỉ cần liên kết miền địa phương mong muốn của bạn như thế này:

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

Hoặc bạn có thể liên kết các thư viện mà không cần bower_componentsđường dẫn, nếu bạn đã tải xuống kiểu style.js 1990ies bằng cách nhấp chuột phải, vẫn hoạt động tốt trong hầu hết các tình huống.


2
Đây phải là câu trả lời chính xác. Chỉ cần liên kết địa phương mong muốn với <script src="/bower_components/moment/locale/de.js"></script>. Nó hoạt động cho tôi ngay bây giờ.
mles 15/1/2015

8
"Sẽ không còn cần phải thực hiện một khoảnh khắc.locale (" de "). Hoặc khoảnh khắc.lang (" de "). Trong mã nguồn.". Tôi nghĩ rằng điều này vẫn hữu ích cho các ứng dụng động thay đổi ngôn ngữ. Giống như bạn về mặt lý thuyết có thể thay đổi ngôn ngữ trong ứng dụng của tôi thông qua trình đơn thả xuống lang / quốc gia trong ứng dụng góc cạnh của tôi và sau đó khoảnh khắc sẽ thay đổi định dạng một cách linh hoạt mà tôi nghĩ với khoảnh khắc.locale ($ lang)
armyofda12mnkeys

Chắc chắn, nhưng bạn vẫn cần tải tệp javascript trong index.html trong các thử nghiệm của tôi. Đây vẫn là một vấn đề vào tháng 5 năm 2017, có lẽ thời điểm nên bao gồm điều này trong tài liệu của họ.
Steve K

37

Với khoảnh khắc 2.8+, hãy làm như sau:

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

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


nên hoạt động; bạn có thể cung cấp một ví dụ về nơi nó không hoạt động không, bạn cũng đang sử dụng khoảnh khắc như thế nào (bạn đã cài đặt nó qua npm, v.v.) chưa?
omninonsense

4
Với những khoảnh khắc gần đây (tôi đã thử nghiệm trong 2.18.1), hãy sử dụng: khoảnh khắc.locale ("de"); var m = khoảnh khắc (). định dạng ("LLL")
apadana

1
apadana đã đúng: bạn đặt ngôn ngữ với moment.locale('de')và bạn tạo một đối tượng mới biểu thị ngày của bây giờ bằng cách moment()(lưu ý dấu ngoặc đơn) và sau đó là format('LLL')nó. Dấu ngoặc là quan trọng. Đã thử nghiệm trong 2.20. Ngoài ra, hãy nhớ sử dụng moment-with-locale.jsvà nếu cần, thay đổi tên thành moment.js. Django chỉ từ chối tải moment-with-locale.jstrong trường hợp của tôi.
WesternGun

1
nếu cái này không hoạt động, hãy thử cái này: moment().locale('de').format('LLL');
Anthony Kal

Đây là một sự kết hợp, đừng quên nhập địa phương bạn muốn sử dụng (câu trả lời của Agu Dondo).
Jeroen Crevits

13

Bạn cần thêm moment.lang(navigator.language)vào tập lệnh của mình.

Và cũng phải thêm từng ngôn ngữ quốc gia bạn muốn hiển thị: ví dụ: đối với GB hoặc FR, bạn cần thêm định dạng ngôn ngữ đó trong thư viện khoảnh khắc. Một ví dụ về định dạng như vậy có sẵn trong tài liệu khoảnh khắc. Nếu bạn không thêm định dạng này trong khoảnh khắc.js thì LUÔN LUÔN chọn địa điểm Hoa Kỳ vì đó là địa điểm duy nhất tôi hiện thấy.


Điều gì xảy ra nếu trình duyệt của họ ở trạng thái 'en' và họ đang đọc trong 'es' thì nó sẽ chỉ hiển thị thời gian trong 'en'
Peter the Russian

12

cuối 2017/2018: câu trả lời của các bà mẹ có quá nhiều mã cũ để chỉnh sửa, vì vậy đây là câu trả lời rõ ràng thay thế của tôi:

với yêu cầu

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

với hàng nhập khẩu

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

Sử dụng:

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

với múi giờ

* yêu cầu:

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

* nhập:

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

sử dụng vùng:

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

chức năng định dạng ngày

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

Điều duy nhất làm việc với tôi là thay đổi thời điểm nhập vào:import moment from 'moment/min/moment-with-locales';
leojnxs

@leojnxs có, nếu bạn muốn bao gồm tất cả các địa phương, nhưng chỉ có thể hoạt động với một hoặc nhiều địa điểm cụ thể thực hiện nhập cho mọi ngôn ngữ
stackdave

6

DÀNH CHO NGƯỜI SỬ DỤNG METEOR:

địa điểm khoảnh khắc không được cài đặt theo mặc định trong sao băng, bạn chỉ nhận được ngôn ngữ 'en' với cài đặt mặc định.

Vì vậy, bạn sử dụng mã như được hiển thị chính xác trong các câu trả lời khác:

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

nhưng nó sẽ vẫn còn trong tiếng Anh cho đến khi bạn cài đặt ngôn ngữ bạn cần.

Có một cách tốt đẹp, sạch sẽ để thêm các địa điểm riêng lẻ trong khoảnh khắc trong thiên thạch (được cung cấp bởi rzymek ).

Cài đặt gói khoảnh khắc theo cách sao băng thông thường với:

meteor add rzymek:moment

Sau đó, chỉ cần thêm các địa điểm mà bạn cần, ví dụ cho tiếng Ý:

meteor add rzymek:moment-locale-it

Hoặc nếu bạn thực sự muốn thêm tất cả các địa điểm có sẵn (thêm khoảng 30k vào trang của bạn):

meteor add rzymek:moment-locales

@AntonAL Điều tốt là bạn đã gửi cho tôi bình luận của bạn, tôi vừa nhận thấy rằng câu hỏi không thực sự dành cho sao băng. Tuy nhiên câu trả lời của tôi khá hữu ích, tôi nghĩ. Tôi đã chỉnh sửa câu trả lời của mình để phản ánh điều này.
mwarren

Cảm ơn! Đã thêm rzymek:moment-locale-devà nó hoạt động :)
nooitaf

4

Với thời điểm 2.18.1 trở đi:

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

2
Phải bao gồm các tệp miền địa phương, nếu không nó sẽ không hoạt động.
zeleven

2
Điều này đã được đề cập là không hoạt động trừ khi mô-đun miền địa phương cụ thể liên quan cũng được nhập.
Maniaque

@Maniaque Tôi không cài đặt gì đặc biệt chỉ là cài đặt npm - khoảnh khắc lưu lại và nó hoạt động tốt
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>

Bản giới thiệu


3

Khi tôi đang sử dụng webpack với gulp và bạn bè ( trình tạo này thiết lập mọi thứ cho tôi), tôi đã phải thay đổi tệp bower.json. Tôi đã phải ghi đè nhập mặc định cho gói khoảnh khắc và chọn tệp đi kèm với tất cả các ngôn ngữ:

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

Đây là tệp bower.json đầy đủ của tôi:

{
  "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"
  }
}

Sau này, bạn vẫn phải khai báo / thiết lập ngôn ngữ thời điểm trước khi xuất ngày, phải không?
NikZ

Tất nhiên :) Điều này chỉ đảm bảo bạn có sẵn các cụm từ được dịch để bạn có thể chuyển sang ngôn ngữ khác (đang di chuyển)
GameScripting

3

Tôi đang sử dụng angular2-khoảnh khắc, nhưng cách sử dụng phải tương tự nhau.

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

export class AppModule {

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

3

Thay đổi thời điểm ngôn ngữ js theo Phiên bản

Phiên bản: 2.8 trở lên

khoảnh khắc.locale ('hi');

Phiên bản: 2.5.1

khoảnh khắc.lang ('hi');


3

làm việc tốt như thế: return moment(status.created_at).locale('es').fromNow();


2
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Badacadabra

3

Tôi không chắc điều gì đã thay đổi nhưng việc nhập tệp ngôn ngữ như thế này có hiệu quả với tôi

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

Lưu ý src trong câu lệnh nhập


2

trong thời điểm 2.12+ , hãy làm như sau:

moment.updateLocale('de');

Cũng lưu ý rằng bạn phải sử dụng moment.updateLocale(localeName, config)để thay đổi ngôn ngữ hiện có. moment.defineLocale(localeName, config)chỉ nên được sử dụng để tạo một miền địa phương mới.


2

Đối với tôi, có một số thay đổi để thực hiện (câu 2.20)

  1. Bạn đặt ngôn ngữ với moment.locale('de')và bạn tạo một đối tượng mới biểu thị ngày bây giờ bằng cách moment()(lưu ý dấu ngoặc đơn) và sau đó là format('LLL')nó. Dấu ngoặc là quan trọng.

Vậy điều đó có nghĩa là:

moment.locale('de');
var now = moment();
now.format('LLL');
  1. Ngoài ra, hãy nhớ sử dụng moment-with-locale.js. Tệp chứa tất cả thông tin miền địa phương và có kích thước tệp lớn hơn. Tải về localethư mục là không đủ. Nếu cần thiết, thay đổi tên thành moment.js. Django chỉ từ chối tải moment-with-locale.jstrong trường hợp của tôi.

EDIT: Hóa ra việc đổi tên tập tin là không cần thiết. Tôi chỉ quên gọi nó trong trang để Django không nghĩ tải nó là cần thiết, vì vậy lỗi của tôi.


2

Điều này chỉ hoạt động bằng cách tự động phát hiện vị trí người dùng hiện tại.

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

Rất tiếc trượt bút. Tôi sẽ giải quyết điều này: var moment = function(x) { return moment(x).locale('de'); }Những cách khác dường như không thực sự gắn bó / giữ trong các điều kiện (đối với tôi).


0

Đối với những người làm việc trong môi trường không đồng bộ, hãy momentcư xử bất ngờ khi tải các địa điểm theo yêu cầu.

Thay vì

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

đảo ngược trật tự

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

Có vẻ như các địa phương được tải vào miền địa phương đã chọn hiện tại, ghi đè bất kỳ thông tin địa phương nào được đặt trước đó. Vì vậy, chuyển đổi miền địa phương trước, sau đó tải thông tin miền địa phương không gây ra vấn đề này.


0

Sau khi vật lộn, điều này làm việc cho tôi cho 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>
  );
}

Bạn có thể vượt qua en, frhoặc es. Nếu bạn muốn một ngôn ngữ khác, bạn phải nhập ngôn ngữ và thêm ngôn ngữ đó vào mảng.

Nếu bạn chỉ cần hỗ trợ một ngôn ngữ thì đơn giản hơn một chút:

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>
  );
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.