ฉันจะเปลี่ยนภาษาของ 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

คุณต้องการโมฆะ ( คำเตือน : lang()เลิกใช้แล้วตั้งแต่ชั่วครู่2.8.0ใช้locale()แทน):

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

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


ในฐานะของ v2.8.1, moment.locale('de')ชุดแปล 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ใช้อินสแตนซ์ให้ตั้งค่าสำหรับอินสแตนซ์นั้นและส่งคืนอินสแตนซ์นั้น

ตามที่ Shiv กล่าวไว้ในความคิดเห็นตรวจสอบให้แน่ใจว่าคุณใช้ "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'
Artem Solovev

4
ใช่นี่คือคำตอบที่ถูกต้อง ... ขอบคุณฉันดึงผมออกมาสงสัยว่าทำไมมันไม่ทำงาน แต่นี่เป็นความเจ็บปวดอย่างยิ่งที่ต้องนำเข้าสำหรับภาษาทุกประเภทที่อาจใช้งาน จะต้องมีวิธีที่ดีกว่า
Maniaque

1
ขอขอบคุณที่อธิบายการนำเข้าสถานที่เฉพาะ
Fernando León

ตามเอกสารหากใครต้องการตำแหน่งที่ตั้งทั้งหมดที่จะรวมแล้วเขา / เธอสามารถใช้require("moment/min/locales.min");หรือใช้นำเข้าimport 'moment/min/locales.min'
Kamran

ขอบคุณสิ่งที่ฉันต้องการ
Davide P.

54

วิธีที่เร็วที่สุด: ติดตั้งด้วย Bower

ฉันเพิ่งติดตั้งช่วงเวลาที่มีความสุขและเชื่อมโยงde.jsเป็นทรัพยากรจาวาสคริปต์ในโครงการ html ของฉัน

bower install moment --save

นอกจากนี้คุณยังสามารถด้วยตนเองดาวน์โหลดและmoment.jsde.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-1990 ในรูปแบบผ่านการคลิกขวาซึ่งยังคงใช้งานได้ดีในสถานการณ์ส่วนใหญ่


2
นี่ควรเป็นคำตอบที่ถูกต้อง เพียงเชื่อมโยงท้องถิ่นที่ต้องการด้วยใช้<script src="/bower_components/moment/locale/de.js"></script>งานได้สำหรับฉันตอนนี้
mles

8
"ไม่จำเป็นต้องทำอีกต่อไปแล้วในช่วงเวลา. local (" de "). หรือ moment.lang (" de "). ในซอร์สโค้ด". ฉันคิดว่านี่ยังคงมีประโยชน์สำหรับแอพแบบไดนามิกที่เปลี่ยนสถานที่ เช่นเดียวกับคุณในทางทฤษฎีสามารถเปลี่ยนสถานที่เกิดเหตุใน app ของฉันผ่าน lang / ประเทศแบบเลื่อนลงใน app เชิงมุมของฉันแล้วช่วงเวลาที่ควรเปลี่ยนรูปแบบไดนามิกซึ่งผมจะทำผมคิดว่ามี moment.locale ($ lang)
armyofda12mnkeys

แน่นอน แต่คุณยังคงต้องโหลดไฟล์จาวาสคริปต์ใน index.html ของคุณในการทดสอบของฉัน นี่ยังคงเป็นปัญหาในเดือนพฤษภาคม 2017 อาจจะมีสักครู่ที่ควรรวมไว้ในเอกสารของพวกเขา
Steve 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 = สักครู่ (). รูปแบบ ("LLL")
apadana

1
apadana ถูกต้อง: คุณตั้งค่าภาษาด้วยmoment.locale('de')และคุณสร้างวัตถุใหม่ที่แสดงวันที่ในขณะนี้โดยmoment()(หมายเหตุวงเล็บ) แล้วformat('LLL')มัน วงเล็บเป็นสิ่งสำคัญ ทดสอบใน 2.20 นอกจากนี้อย่าลืมที่จะใช้และหากจำเป็นต้องเปลี่ยนชื่อให้เป็นmoment-with-locale.js moment.jsDjango เพียงแค่ปฏิเสธที่จะโหลดmoment-with-locale.jsในกรณีของฉัน
WesternGun

1
ถ้าอันนี้ไม่ทำงานลองอันนี้: moment().locale('de').format('LLL');
Anthony Kal

อันนี้เป็นที่พักพิงเพียงอย่าลืมนำเข้าสถานที่ที่คุณต้องการใช้ (คำตอบของ cfr. Agu Dondo)
Jeroen Crevits

13

คุณจะต้องเพิ่มmoment.lang(navigator.language)ในสคริปต์ของคุณ

และต้องเพิ่มสถานที่แต่ละประเทศที่คุณต้องการแสดงด้วยเช่นสำหรับ GB หรือ FR คุณต้องเพิ่มรูปแบบของสถานที่นั้นในไลบรารี moment.js ตัวอย่างของรูปแบบดังกล่าวมีอยู่ในเอกสาร momentjs หากคุณไม่ได้เพิ่มรูปแบบนี้ใน moment.js แสดงว่าเป็นไปได้ที่จะรับโลแคลสหรัฐฯเนื่องจากเป็นรูปแบบเดียวที่ฉันเห็นอยู่ในปัจจุบัน


เกิดอะไรขึ้นถ้าเบราว์เซอร์ของพวกเขาอยู่ใน 'en' และพวกเขากำลังอ่านใน 'es' มันจะแสดงเวลาใน 'en' เท่านั้น
Peter the Russian

12

สิ้นสุด 2017/2018: คำตอบของ anothers มีรหัสเก่าเกินกว่าจะแก้ไขได้ดังนั้นที่นี่คำตอบที่ชัดเจนของฉัน:

ด้วยต้องการ

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

สำหรับผู้ใช้อุกกาบาต:

สถานที่ตั้งช่วงเวลาที่ไม่ได้ติดตั้งโดยค่าเริ่มต้นในอุกกาบาตคุณจะได้รับสถานที่ 'en' ด้วยการติดตั้งเริ่มต้น

ดังนั้นคุณใช้รหัสตามที่แสดงอย่างถูกต้องในคำตอบอื่น ๆ :

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

แต่มันจะยังคงเป็นภาษาอังกฤษจนกว่าคุณจะติดตั้งสถานที่ที่คุณต้องการ

มีวิธีที่ดีและสะอาดในการเพิ่มสถานที่แต่ละแห่งสำหรับช่วงเวลาในดาวตก (จัดทำโดยrzymek )

ติดตั้งแพ็คเกจเดี๋ยวตามวิธีปกติของดาวตกด้วย:

meteor add rzymek:moment

จากนั้นเพิ่มสถานที่ที่คุณต้องการเช่นภาษาอิตาลี:

meteor add rzymek:moment-locale-it

หรือถ้าคุณต้องการเพิ่มสถานที่ที่มีอยู่ทั้งหมด (เพิ่มประมาณ 30k ลงในหน้าของคุณ):

meteor add rzymek:moment-locales

@ ทันใดนั้นสิ่งที่ดีที่คุณส่งความคิดเห็นของคุณให้ฉันฉันเพิ่งสังเกตเห็นว่าคำถามไม่ได้สำหรับดาวตก อย่างไรก็ตามคำตอบของฉันมีประโยชน์มากฉันคิดว่า ฉันได้แก้ไขคำตอบของฉันเพื่อสะท้อนสิ่งนี้
mwarren

ขอบคุณ! เพิ่มrzymek:moment-locale-deและใช้งานได้ :)
nooitaf

4

ด้วยช่วงเวลา 2.18.1 ขึ้นไป:

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

2
ต้องรวมไฟล์โลแคลมิฉะนั้นจะไม่สามารถใช้งานได้
เซเลเวน

2
สิ่งนี้ได้ถูกกล่าวถึงแล้วว่าไม่ทำงานยกเว้นว่าจะมีการนำเข้าโมดูลสถานที่ช่วงเวลาเฉพาะที่เกี่ยวข้องเช่นกัน
Maniaque

@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 กับอึกและเพื่อน ๆ (เครื่องมือสร้างนี้ตั้งค่าทุกอย่างให้ฉัน) ฉันต้องทำการเปลี่ยนแปลงไฟล์ 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

ฉันกำลังใช้งานเชิงมุม 2 ช่วงเวลา แต่การใช้งานต้องเหมือนกัน

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
ในขณะที่รหัสนี้อาจตอบคำถามให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือทำไมมันแก้ปัญหาจะปรับปรุงค่าระยะยาวของคำตอบ
Badacadabra

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หากจำเป็นต้องเปลี่ยนชื่อเป็น Django แค่ปฏิเสธที่จะโหลด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>
  );
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.