¿Cómo cambio el lenguaje de moment.js?

196

Estoy tratando de cambiar el idioma de la fecha establecida por moment.js. El predeterminado es el inglés, pero quiero configurar el idioma alemán. Esto es lo que probé:

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

Está dando NaN.

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

Esto ni siquiera está reaccionando.

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

Sin cambios: esto sigue produciendo un resultado en inglés.

¿Cómo es esto posible?

doniyor
fuente

Respuestas:

305

Necesita moment.lang ( ADVERTENCIA : lang()está en desuso desde el momento 2.8.0, use locale()en su lugar):

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

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


A partir de v2.8.1, moment.locale('de')establece la localización, pero no devuelve a moment. Algunos ejemplos:

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'

En resumen, llamar localeal global momentestablece la configuración regional para todas las momentinstancias futuras , pero no devuelve una instancia de moment. Al llamar localea una instancia, la establece para esa instancia Y devuelve esa instancia.

Además, como dijo Shiv en los comentarios, asegúrese de usar "moment-with-locales.min.js" y no "moment.min.js", de lo contrario no funcionará.

kalley
fuente
1
En los documentos, puede crear instancias de momento específicas del idioma haciendo eso. Si formatea primero, el idioma no se procesará. Alternativamente, podría hacer algo así var deMoment = moment(); deMoment.lang('de')como reutilizar en deMomentlugar de un momento a lo largo de su secuencia de comandos.
kalley
32
Si usa "moment.min.js" no funcionará; necesitas "moment-with-locales.min.js"
Shiv
2
actualización: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
necesita importar el idioma deseado de otra manera esto no funcionará: import moment from 'moment'; import localization from 'moment/locale/de' moment().locale("de", localization).format('LLL')
Blue Bot
2
importar momento desde 'moment / min / moment-with-locales';
leojnxs
167

Tuve que importar también el idioma:

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

Luego usa el momento como lo harías normalmente

alert(moment(date).fromNow())
Agu Dondo
fuente
15
Su respuesta es más útil que otra porque ha mencionado sobreimport 'moment/locale/es'
Artem Solovev
44
Sí, esta es la respuesta correcta ... gracias, me estaba sacando el pelo preguntándome por qué no estaba funcionando. Pero esto es un verdadero dolor tener que importar cualquier tipo de idioma que pueda usarse. Tiene que haber una mejor manera.
Maniaque
1
Gracias por explicar la importación de la configuración regional específica.
Fernando León el
de acuerdo con la documentación, si alguien quiere que se incluyan todas las configuraciones regionales, entonces él / ella puede usar esto require("moment/min/locales.min");o usar importimport 'moment/min/locales.min'
kamran
Gracias, exactamente lo que necesito
Davide P.
55

Método más rápido: instalar con Bower

Acabo de instalar moment con bower y lo vinculé de.jscomo recurso de JavaScript en mi proyecto html.

bower install moment --save

También puede descargar manualmente el moment.jsy de.js.

Enlace 'de.js' en su proyecto

Al vincular el de.jsarchivo de mi proyecto principal, se cambió automáticamente la configuración regional para todos los accesos a la clase de momento y sus métodos.

Ya no será necesario hacer una moment.locale("de").o moment.lang("de"). en el código fuente.

Simplemente vincule la configuración regional deseada de esta manera:

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

O puede vincular las bibliotecas sin la bower_componentsruta, si descargó el estilo de los años 90 de moment.js haciendo clic con el botón derecho, que todavía funciona bien en la mayoría de los escenarios.

Steve K
fuente
2
Esta debería ser la respuesta correcta. Simplemente vincule el local deseado con <script src="/bower_components/moment/locale/de.js"></script>. Funciona para mí en este momento.
mles
8
"Ya no será necesario hacer un moment.locale (" de "). O moment.lang (" de "). En el código fuente". Creo que esto sigue siendo útil para aplicaciones dinámicas que cambian la configuración regional. Como teóricamente, puede cambiar la configuración regional en mi aplicación a través de un menú desplegable lang / country en mi aplicación angular y luego el momento debería cambiar los formatos dinámicamente, lo que haría, creo que con moment.locale ($ lang)
armyofda12mnkeys
Claro, pero aún necesita cargar el archivo javascript en su index.html en mis pruebas. Esto sigue siendo un problema en mayo de 2017, tal vez el momento debería incluir esto en sus documentos.
Steve K
37

Con momentjs 2.8+, haga lo siguiente:

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

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

Nashenas
fuente
Se debe trabajar; ¿Puede proporcionar un ejemplo de dónde no funciona, también cómo está usando moment (lo instaló a través de npm, etc.)?
omninonsense
44
Con momentos recientes (probé en 2.18.1) use esto: moment.locale ("de"); var m = moment (). format ("LLL")
apadana
1
Apadana tiene razón: establece la configuración regional con moment.locale('de'), y crea un nuevo objeto que representa la fecha de ahora por moment()(observe el paréntesis) y luego format('LLL'). El paréntesis es importante. Probado en 2.20. Además, recuerde usar moment-with-locale.jsy, si es necesario, cambie el nombre para que sea moment.js. Django simplemente se niega a cargar moment-with-locale.jsen mi caso.
WesternGun
1
si este no funciona, pruebe este: moment().locale('de').format('LLL');
Anthony Kal
Este es coherente, solo no se olvide de importar el entorno local que desea utilizar (vea la respuesta de Agu Dondo).
Jeroen Crevits
13

Tendría que agregar moment.lang(navigator.language)su script.

Y también debe agregar la configuración regional de cada país en el que desea mostrar: por ejemplo, para GB o FR, debe agregar ese formato de configuración regional en la biblioteca moment.js. Un ejemplo de dicho formato está disponible en la documentación de momentjs. Si no agrega este formato en moment.js, SIEMPRE seleccionaría la configuración regional de EE. UU., Ya que es la única que veo actualmente.

Codificador inteligente
fuente
¿Qué pasa si su navegador está en 'en' y están leyendo en 'es'? Entonces solo mostrará la hora en 'en'
Peter the Russian
12

finales de 2017/2018: las otras respuestas tienen demasiado código antiguo para editar, así que aquí mi respuesta limpia alternativa:

con requieren

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

con importaciones

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

Utilizar:

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

con zona horaria

*exigir:

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

*importar:

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

zonas de uso:

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

función para formatear fecha

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
fuente
Lo único que funcionó para mí fue cambiar el momento de importación a:import moment from 'moment/min/moment-with-locales';
leojnxs
@leojnxs sí, si desea incluir todas las configuraciones regionales, pero es posible trabajar solo con una o más configuraciones regionales específicas que importan para cada idioma
stackdave
6

PARA USUARIOS DE METEOR:

los locales de momento no se instalan de forma predeterminada en meteor, solo obtiene el entorno local 'en' con la instalación predeterminada.

Entonces usa el código como se muestra correctamente en otras respuestas:

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

pero permanecerá en inglés hasta que instale la configuración regional que necesita.

Hay una manera agradable y limpia de agregar configuraciones regionales individuales por un momento en meteorito (suministrado por rzymek ).

Instale el paquete de momento de la forma habitual de meteorito con:

meteor add rzymek:moment

Luego, simplemente agregue las configuraciones regionales que necesita, por ejemplo, para italiano:

meteor add rzymek:moment-locale-it

O si realmente desea agregar todas las configuraciones regionales disponibles (agrega aproximadamente 30k a su página):

meteor add rzymek:moment-locales
mwarren
fuente
@AntonAL Lo bueno es que me enviaste tu comentario, me acabo de dar cuenta de que la pregunta no era realmente para meteorito. Sin embargo, mi respuesta es bastante útil, creo. He editado mi respuesta para reflejar esto.
mwarren
¡Gracias! Añadido rzymek:moment-locale-dey funcionó :)
nooitaf
4

Con el momento 2.18.1 y en adelante:

  moment.locale("de");
  var m = moment().format("LLL")
apadana
fuente
2
Debe incluir los archivos locales, de lo contrario no funcionará.
zeleven
2
Esto ya se mencionó como no funciona a menos que también se haya importado el módulo local de momento específico asociado.
Maniaque
@Maniaque No instalé nada especial solo npm install - ahorre un momento y funciona bien
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>

Manifestación

Ram Pukar
fuente
3

Como estaba usando webpack con trago y amigos ( este generador configuró todo para mí) tuve que hacer un cambio en el archivo bower.json. Tuve que anular la importación predeterminada para el paquete de momento y seleccionar el archivo que viene con todos los idiomas:

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

Este es mi archivo bower.json completo:

{
  "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"
  }
}
GameScripting
fuente
Después de esto, aún tiene que declarar / establecer la configuración regional del momento antes de generar una fecha, ¿verdad?
NikZ 01 de
Por supuesto :) Esto solo garantiza que tenga las frases traducidas disponibles para que pueda cambiar a otro idioma (sobre la marcha)
GameScripting
3

Estoy usando angular2-moment, pero el uso debe ser similar.

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

export class AppModule {

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

Cambie el momento js idioma según la versión

Versión: 2.8+

moment.locale ('hola');

Versión: 2.5.1

moment.lang ('hola');

Anil Nankar
fuente
3

funciona bien así: return moment(status.created_at).locale('es').fromNow();

Claudio Scheuermann
fuente
2
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
Badacadabra
3

No estoy seguro de qué cambió, pero importar el archivo de idioma como este funcionó para mí

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

Observe el src en la declaración de importación

Taha
fuente
2

para momentjs 2.12+ , haga lo siguiente:

moment.updateLocale('de');

También tenga en cuenta que debe usar moment.updateLocale(localeName, config)para cambiar una configuración regional existente. moment.defineLocale(localeName, config)solo debe usarse para crear una nueva configuración regional.

Francisco Costa
fuente
2

Para mí, hay algunos cambios que hacer (ver. 2.20)

  1. Establece la configuración regional con moment.locale('de'), y crea un nuevo objeto que representa la fecha de ahora por moment()(observe el paréntesis) y luego format('LLL'). El paréntesis es importante.

Entonces eso significa:

moment.locale('de');
var now = moment();
now.format('LLL');
  1. Además, recuerde usar moment-with-locale.js. El archivo contiene toda la información local y tiene un tamaño de archivo más grande. Descargar la localecarpeta no es suficiente. Si es necesario, cambie el nombre para ser moment.js. Django simplemente se niega a cargar moment-with-locale.jsen mi caso.

EDITAR: Resultó que cambiar el nombre del archivo no es necesario. Simplemente olvidé invocarlo en la página, así que Django no cree que sea necesario cargarlo, así que es mi culpa.

WesternGun
fuente
2

Este solo funciona mediante la detección automática de la ubicación actual del usuario.

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
fuente
1

Vaya resbalón de la pluma. Solucionaría esto: las var moment = function(x) { return moment(x).locale('de'); }otras formas realmente no parecen pegarse / mantenerse bajo condiciones (para mí).

Rob Jens
fuente
0

Para aquellos que trabajan en entornos asíncronos, se momentcomporta de forma inesperada al cargar configuraciones regionales a pedido.

En vez de

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

invertir el orden

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

Parece que las configuraciones regionales se cargan en la configuración regional seleccionada actual, anulando cualquier información de configuración regional previamente establecida. Entonces, cambiar la configuración regional primero y luego cargar la información de la configuración regional no causa este problema.

Yanick Rochon
fuente
0

Después de luchar, esto funcionó para mí para 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>
  );
}

Puedes pasar en, froes . Si quisieras otro idioma, deberías importar la configuración regional y agregarla a la matriz.

Si solo necesita admitir un idioma, es un poco más simple:

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.
fuente