Bagaimana cara mengubah bahasa moment.js?

196

Saya mencoba mengubah bahasa tanggal yang disetel oleh moment.js. Yang standar adalah bahasa Inggris, tetapi saya ingin mengatur bahasa Jerman. Inilah yang saya coba:

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

Itu memberi NaN.

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

Ini bahkan tidak bereaksi.

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

Tidak ada perubahan: ini masih menghasilkan hasil dalam bahasa Inggris.

Bagaimana ini mungkin?

doniyor
sumber

Jawaban:

303

Anda memerlukan moment.lang ( PERINGATAN : lang()sudah ditinggalkan sejak saat itu 2.8.0, gunakan locale()sebagai gantinya):

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

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


Pada v2.8.1, moment.locale('de')set lokalisasi, tetapi tidak mengembalikan a moment. Beberapa contoh:

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'

Singkatnya, memanggil localeglobal momentmenetapkan lokal untuk semua momentinstance di masa mendatang , tetapi tidak mengembalikan instance dari moment. Memanggil localesebuah instance, set itu untuk instance DAN mengembalikan instance itu.

Juga, seperti yang dikatakan Shiv dalam komentar, pastikan Anda menggunakan "moment-with-locales.min.js" dan bukan "moment.min.js", jika tidak, itu tidak akan berfungsi.

kalley
sumber
1
Dalam dokumen, Anda dapat membuat contoh momen khusus bahasa dengan melakukan itu. Jika Anda memformat terlebih dahulu, bahasa tidak akan diproses. Atau, Anda bisa melakukan sesuatu seperti var deMoment = moment(); deMoment.lang('de')dan menggunakan kembali deMomentalih-alih momen di seluruh skrip Anda.
kalley
32
Jika Anda menggunakan "moment.min.js" itu tidak akan berfungsi; Anda memerlukan "momen-dengan-locales.min.js"
Shiv
2
pembaruan: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
Anda perlu mengimpor bahasa yang diinginkan selain ini tidak akan berhasil: import moment from 'moment'; import localization from 'moment/locale/de' moment().locale("de", localization).format('LLL')
Blue Bot
2
mengimpor momen dari 'moment / min / moment-with-locales';
leojnxs
166

Saya juga harus mengimpor bahasa:

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

Kemudian gunakan momen seperti biasanya

alert(moment(date).fromNow())
Agu Dondo
sumber
15
Jawaban Anda lebih bermanfaat daripada yang lain karena Anda telah menyebutkan tentangimport 'moment/locale/es'
Artem Solovev
4
Ya ini jawaban yang benar ... terima kasih, aku mencabut rambutku bertanya-tanya mengapa itu tidak berhasil. Tetapi ini adalah rasa sakit yang nyata karena harus mengimpor untuk jenis bahasa apa pun yang mungkin digunakan. Harus ada cara yang lebih baik.
Maniaque
1
Terima kasih telah menjelaskan impor lokal tertentu.
Fernando León
menurut dokumentasi jika seseorang ingin semua lokal dimasukkan maka dia dapat menggunakan ini require("moment/min/locales.min");atau menggunakan imporimport 'moment/min/locales.min'
kamran
Terima kasih, persis apa yang saya butuhkan
Davide P.
55

Metode tercepat: Instal dengan Bower

Saya baru saja menginstal momen dengan bower dan terhubung de.jssebagai sumber javascript dalam proyek html saya.

bower install moment --save

Anda juga dapat mengunduh moment.jsdan de.js.

Tautkan 'de.js' di proyek Anda

Menautkan de.jsfile proyek utama saya secara otomatis mengubah lokal untuk semua akses ke kelas momen dan metodenya.

Tidak perlu lagi melakukan moment.locale("de").atau moment.lang("de"). dalam kode sumber.

Tautkan lokal yang Anda inginkan seperti ini:

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

Atau Anda dapat menautkan pustaka tanpa bower_componentsjalur, jika Anda mengunduh gaya 1990-an moment.js melalui klik kanan, yang masih berfungsi dengan baik di sebagian besar skenario.

Steve K.
sumber
2
Ini seharusnya jawaban yang benar. Cukup tautkan lokal yang diinginkan dengan <script src="/bower_components/moment/locale/de.js"></script>. Ini berfungsi untuk saya sekarang.
mles
8
"Tidak perlu lagi melakukan moment.locale (" de "). Atau moment.lang (" de "). Dalam kode sumber." Saya pikir ini masih berguna untuk aplikasi dinamis yang mengubah lokal. Seperti Anda secara teoritis dapat mengubah lokal di aplikasi saya melalui drop / lang negara di aplikasi sudut saya dan kemudian momen harus mengubah format secara dinamis yang akan saya lakukan saya pikir dengan moment.locale ($ lang)
armyofda12mnkeys
Tentu, tetapi Anda masih perlu memuat file javascript di index.html Anda dalam pengujian saya. Ini masih menjadi masalah pada Mei 2017, mungkin saat ini harus memasukkan ini dalam dokumen mereka.
Steve K
37

Dengan momentjs 2.8+, lakukan hal berikut:

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

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

Nashenas
sumber
Itu harus bekerja; dapatkah Anda memberikan contoh di mana itu tidak bekerja, juga bagaimana Anda menggunakan momen (apakah Anda menginstalnya melalui npm, dll)?
omninonsense
4
Dengan momen terkini (saya uji pada 2.18.1) gunakan ini: moment.locale ("de"); var m = moment (). format ("LLL")
apadana
1
apadana benar: Anda menetapkan lokal dengan moment.locale('de'), dan Anda membuat objek baru yang mewakili tanggal sekarang dengan moment()(perhatikan tanda kurung) dan kemudian format('LLL'). Tanda kurung itu penting. Diuji dalam 2.20. Juga, ingatlah untuk menggunakan moment-with-locale.jsdan jika perlu, ubah nama menjadi moment.js. Django hanya menolak untuk memuat moment-with-locale.jsdalam kasus saya.
WesternGun
1
jika yang ini tidak berhasil, coba yang ini: moment().locale('de').format('LLL');
Anthony Kal
Yang ini benar, hanya jangan lupa untuk mengimpor lokal yang ingin Anda gunakan (cfr. Agu Dondo jawaban).
Jeroen Crevits
13

Anda harus menambahkan moment.lang(navigator.language)skrip Anda.

Dan juga harus menambahkan setiap lokal negara yang ingin Anda tampilkan: misalnya untuk GB atau FR, Anda perlu menambahkan format lokal itu di perpustakaan moment.js. Contoh format tersebut tersedia dalam dokumentasi momentjs. Jika Anda tidak menambahkan format ini di moment.js maka SELALU akan mengambil lokal AS karena hanya itu yang saya lihat saat ini.

Smart Coder
sumber
bagaimana jika browser mereka ada di 'en' dan mereka membaca di 'es' maka itu hanya akan menunjukkan waktu dalam 'en'
Peter the Russian
12

akhir 2017/2018: jawaban lain memiliki terlalu banyak kode lama untuk diedit, jadi di sini alternatif bersih saya jawab:

dengan membutuhkan

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

dengan impor

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

Menggunakan:

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

dengan zona waktu

*memerlukan:

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

*impor:

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

gunakan zona:

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

berfungsi untuk memformat tanggal

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
  }  
};
stackdave
sumber
Satu-satunya hal yang berhasil bagi saya adalah perubahan saat impor ke:import moment from 'moment/min/moment-with-locales';
leojnxs
@leojnxs ya, jika Anda ingin menyertakan semua lokal, tetapi dimungkinkan untuk bekerja hanya dengan satu atau lebih lokal tertentu yang melakukan impor untuk setiap bahasa
stackdave
6

UNTUK PENGGUNA METEOR:

saat lokal tidak diinstal secara default di meteor, Anda hanya mendapatkan lokal 'en' dengan instalasi default.

Jadi, Anda menggunakan kode seperti yang ditunjukkan dengan benar dalam jawaban lain:

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

tetapi akan tetap dalam bahasa Inggris sampai Anda menginstal lokal yang Anda butuhkan.

Ada cara yang bagus dan bersih untuk menambahkan masing-masing lokal untuk saat ini dalam meteor (disediakan oleh rzymek ).

Instal paket momen dengan cara meteor biasa dengan:

meteor add rzymek:moment

Kemudian tambahkan saja lokal yang Anda butuhkan, misalnya untuk Italia:

meteor add rzymek:moment-locale-it

Atau jika Anda benar-benar ingin menambahkan semua lokal yang tersedia (tambahkan sekitar 30rb ke halaman Anda):

meteor add rzymek:moment-locales
mwarren
sumber
@AntonAL Untung Anda mengirimi saya komentar Anda, saya baru memperhatikan bahwa pertanyaannya sebenarnya bukan untuk meteor. Namun saya kira jawaban saya cukup berguna. Saya telah mengedit jawaban saya untuk mencerminkan hal ini.
mwarren
Terima kasih! Ditambahkan rzymek:moment-locale-dedan berhasil :)
nooitaf
4

Dengan momen 2.18.1 dan selanjutnya:

  moment.locale("de");
  var m = moment().format("LLL")
apadana
sumber
2
Harus menyertakan file lokal, jika tidak maka tidak akan berfungsi.
zeleven
2
Ini sudah disebutkan tidak berfungsi kecuali modul lokal momen spesifik terkait juga diimpor.
Maniaque
@Maniaque Saya tidak menginstal apa-apa khusus hanya menginstal npm - simpan saat dan berfungsi dengan baik
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>

Demo

Ram Pukar
sumber
3

Karena saya menggunakan webpack dengan gulp dan teman-teman ( generator ini mengatur segalanya untuk saya), saya harus melakukan perubahan pada file bower.json. Saya harus mengganti impor default untuk paket saat ini dan memilih file yang datang dengan semua bahasa:

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

Ini adalah file bower.json lengkap saya:

{
  "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"
  }
}
Script Game
sumber
Setelah ini, Anda masih harus mendeklarasikan / mengatur lokal saat sebelum mengeluarkan tanggal, kan?
NikZ
Tentu saja :) Ini hanya memastikan Anda memiliki frasa terjemahan yang tersedia sehingga Anda dapat beralih ke bahasa lain (on the fly)
GameScripting
3

Saya menggunakan angular2-moment, tetapi penggunaannya harus serupa.

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

export class AppModule {

  constructor() {
    moment.locale('ru');
  }
}
Dmitry
sumber
3

Ubah bahasa js saat sesuai Versi

Versi: 2.8+

moment.locale ('hai');

Versi: 2.5.1

moment.lang ('hai');

Anil Nankar
sumber
3

berfungsi dengan baik seperti itu: return moment(status.created_at).locale('es').fromNow();

Claudio Scheuermann
sumber
2
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Badacadabra
3

Saya tidak yakin apa yang berubah tetapi mengimpor file bahasa seperti ini berhasil untuk saya

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

Perhatikan src dalam pernyataan impor

Taha
sumber
2

untuk momentjs 2.12+ , lakukan hal berikut:

moment.updateLocale('de');

Perhatikan juga bahwa Anda harus menggunakan moment.updateLocale(localeName, config)untuk mengubah lokal yang ada. moment.defineLocale(localeName, config)seharusnya hanya digunakan untuk membuat lokal baru.

Francisco Costa
sumber
2

Bagi saya, ada beberapa perubahan yang harus dilakukan (ver. 2.20)

  1. Anda mengatur lokal dengan moment.locale('de'), dan Anda membuat objek baru yang mewakili tanggal sekarang dengan moment()(perhatikan tanda kurung) dan kemudian format('LLL')itu. Tanda kurung itu penting.

Jadi itu berarti:

moment.locale('de');
var now = moment();
now.format('LLL');
  1. Juga, ingatlah untuk menggunakannya moment-with-locale.js. File berisi semua info lokal dan memiliki ukuran file yang lebih besar. Unduh localefolder tidak cukup. Jika perlu, ubah nama menjadi moment.js. Django hanya menolak untuk memuat moment-with-locale.jsdalam kasus saya.

EDIT: Ternyata mengganti nama file tidak perlu. Saya hanya lupa memohonnya di halaman sehingga Django tidak berpikir memuat itu perlu, jadi salah saya.

WesternGun
sumber
2

Yang ini hanya berfungsi dengan secara otomatis mendeteksi lokasi pengguna saat ini.

import moment from "moment/min/moment-with-locales";

// Then use it as you always do. 
moment(yourDate).format("MMMM Do YYYY, h:mm a")
Mussa Charles
sumber
1

Selipkan pena. Saya akan memecahkan ini: var moment = function(x) { return moment(x).locale('de'); }Cara-cara lain tampaknya tidak benar-benar menempel / bertahan dalam kondisi (bagi saya).

Rob Jens
sumber
0

Bagi mereka yang bekerja di lingkungan asinkron, momentberperilaku tak terduga saat memuat lokal berdasarkan permintaan.

Dari pada

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

membalikkan urutan

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

Sepertinya lokal dimuat ke lokal yang dipilih saat ini, mengesampingkan informasi lokal yang ditetapkan sebelumnya. Jadi beralih lokal terlebih dahulu, lalu memuat informasi lokal tidak menyebabkan masalah ini.

Yanick Rochon
sumber
0

Setelah berjuang, ini bekerja untuk saya untuk 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>
  );
}

Anda bisa lewat en, fratau es. Jika Anda ingin bahasa lain, Anda harus mengimpor lokal dan menambahkannya ke array.

Jika Anda hanya perlu mendukung satu bahasa, itu sedikit lebih sederhana:

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>
  );
}
Alan P.
sumber