【问题标题】:How do I change the language of moment.js?如何更改 moment.js 的语言?
【发布时间】:2013-07-03 19:38:04
【问题描述】:

我正在尝试更改由 moment.js 设置的日期的语言。默认是英语,但我想设置德语。这些是我尝试过的:

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

它正在给NaN。

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

这甚至没有反应。

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

没有变化:这仍然会产生英文结果。

这怎么可能?

【问题讨论】:

标签: javascript momentjs


【解决方案1】:

要使用 moment(2.8.0 之后的版本)更改区域设置,请执行以下步骤。

  1. 在 index.html 中加载时刻语言环境文件,如下所示 <script src="../node_modules/moment/locale/it.js"></script>

  2. 根据需要设置区域设置 - moment.locale('it');

  3. 现在moment.locale() 将返回“它”

  4. 您可以将 moment 与任何语言一起使用 - JavaScript、Angular、node 等。

【讨论】:

    【解决方案2】:

    First Call , p5.js 和 moment-with-locales.js 然后执行下面的代码,你会得到你的结果。

    在这个结果中,我用不同的语言显示了月份名称:)

    请检查代码:

         var monthNameEnglish = moment().locale('en-gb').format('MMMM');
        document.getElementById('monthNameEnglish').innerHTML =  monthNameEnglish;
        
        
             var monthNameGerman = moment().locale('de').format('MMMM');
        document.getElementById('monthNameGerman').innerHTML =  monthNameGerman;
    <!DOCTYPE html>
    <html>
        <head>
            <title>P5.js and Moment.js</title>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.16/p5.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.4/moment-with-locales.js"></script>
        
        <h3>English Version Month Name</h3>
        
        <p id="monthNameEnglish"></p>
        
        <h3> German Version Month Name</h3>
        
        <p id="monthNameGerman"></p>
            
        </head>
        <body>
        </body>
    </html>

    【讨论】:

    • 导入p5.js是什么原因?我不认为这是相关的
    • @Andra 为什么你认为它不相关?请回答?
    • @Andra,你给了差评,但连你自己都不知道答案?
    【解决方案3】:

    经过努力,这对我有用 moment v2.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>
      );
    }
    

    【讨论】:

      【解决方案4】:

      我不确定发生了什么变化,但像这样导入语言文件对我有用

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

      注意import语句中的src

      【讨论】:

      • 你错过了单引号('fr) -> ('fr')
      【解决方案5】:

      对于那些在异步环境中工作的人,moment 在按需加载语言环境时会出现意外行为。

      代替

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

      颠倒顺序

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

      似乎区域设置已加载到当前选定的区域设置中,覆盖了任何先前设置的区域设置信息。所以先切换语言环境,再加载语言环境信息不会导致这个问题。

      【讨论】:

        【解决方案6】:

        这只是通过自动检测当前用户位置来工作。

        import moment from "moment/min/moment-with-locales";
        
        // Then use it as you always do. 
        moment(yourDate).format("MMMM Do YYYY, h:mm a")
        

        【讨论】:

          【解决方案7】:

          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 是的,如果您想包含所有语言环境,但可以仅使用一个或多个特定语言环境为每种语言进行导入
          【解决方案8】:

          您需要 moment.lang(警告:lang() 已被弃用,因为 moment 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'
          

          总而言之,在全局 moment 上调用 locale 会为所有未来的 moment 实例设置区域设置,但不会返回 moment 的实例。在实例上调用locale,为该实例设置它并返回该实例。

          另外,正如 Shiv 在 cmets 中所说,请确保使用“moment-with-locales.min.js”而不是“moment.min.js”,否则将无法正常工作。

          【讨论】:

          • 在文档中,您可以通过这样做创建特定于语言的时刻实例。如果您先格式化,语言将无法处理。或者,您可以执行var deMoment = moment(); deMoment.lang('de') 之类的操作并在整个脚本中重复使用deMoment 而不是时刻。
          • 如果你使用“moment.min.js”它不会工作;你需要“moment-with-locales.min.js”
          • 更新:Deprecation warning: moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages. Arguments: fr
          • 你需要导入想要的语言,否则这将不起作用:import moment from 'moment'; import localization from 'moment/locale/de'moment().locale("de", localization).format('LLL')
          • 从'moment/min/moment-with-locales'导入时刻;
          【解决方案9】:

          我还必须导入语言:

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

          然后像往常一样使用时刻

          alert(moment(date).fromNow())
          

          【讨论】:

          • 您的回答比其他回答更有帮助,因为您提到了import 'moment/locale/es'
          • 是的,这是正确的答案...谢谢,我正在拔头发,想知道为什么它不起作用。但这对于任何可能使用的语言类型都必须导入,这是一个真正的痛苦。必须有更好的方法。
          • 感谢您解释特定语言环境的导入。
          • 根据文档,如果有人希望包含所有语言环境,那么他/她可以使用 require("moment/min/locales.min"); 或使用 import import 'moment/min/locales.min'
          • 谢谢,正是我需要的
          【解决方案10】:

          对我来说,需要做一些更改(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 认为没有必要加载它,所以是我的错。

          【讨论】:

            【解决方案11】:

            从 2.18.1 开始:

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

            【讨论】:

            • 必须包含语言环境文件,否则将不起作用。
            • 这已经被提及为不起作用,除非相关的特定时刻语言环境模块也被导入。
            • @Maniaque 我没有安装任何特别的东西,只是 npm install --save 时刻,它工作正常
            【解决方案12】:

            像这样工作正常:return moment(status.created_at).locale('es').fromNow();

            【讨论】:

            • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
            【解决方案13】:

            根据版本更改时刻js语言

            版本:2.8+

            moment.locale('hi');

            版本:2.5.1

            moment.lang('hi');

            【讨论】:

              【解决方案14】:

              我使用的是 angular2-moment,但用法必须类似。

              import { MomentModule } from "angular2-moment";
              import moment = require("moment");
              
              export class AppModule {
              
                constructor() {
                  moment.locale('ru');
                }
              }
              

              【讨论】:

                【解决方案15】:

                当我在 gulp 和朋友中使用 webpack 时(this generator 为我设置了一切),我不得不对 bower.json 文件进行更改。我必须覆盖 moment 包的默认导入并选择所有语言附带的文件:

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

                【讨论】:

                • 在此之后,您仍然需要在输出日期之前声明/设置时刻区域设置,对吧?
                • 当然 :) 这只是确保您有可用的翻译短语,以便您可以切换到另一种语言(即时)
                【解决方案16】:
                <!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

                【讨论】:

                  【解决方案17】:

                  对于流星用户:

                  moment 语言环境默认不安装在流星中,您只能通过默认安装获得“en”语言环境。

                  所以你使用其他答案中正确显示的代码:

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

                  但在您安装所需的语言环境之前,它将保持为英文。

                  有一种很好、干净的方法可以在流星中为 moment 添加单独的语言环境(由 rzymek 提供)。

                  以通常的流星方式安装 moment 包:

                  meteor add rzymek:moment
                  

                  然后只需添加您需要的语言环境,例如意大利语:

                  meteor add rzymek:moment-locale-it
                  

                  或者,如果您真的想添加所有可用的语言环境(向您的页面添加大约 30k):

                  meteor add rzymek:moment-locales
                  

                  【讨论】:

                  • @AntonAL 还好你给我发了你的评论,我刚刚注意到这个问题实际上并不是针对流星的。但是我认为我的回答非常有用。我已经编辑了我的答案以反映这一点。
                  • 谢谢!添加了rzymek:moment-locale-de,它起作用了:)
                  【解决方案18】:

                  对于 momentjs 2.12+,请执行以下操作:

                  moment.updateLocale('de');
                  

                  另请注意,您必须使用moment.updateLocale(localeName, config) 更改现有语言环境。 moment.defineLocale(localeName, config) 只能用于创建新的语言环境。

                  【讨论】:

                    【解决方案19】:

                    哎呀,笔滑了。我会解决这个问题: var moment = function(x) { return moment(x).locale('de'); } 在某些条件下(对我而言),其他方式似乎并没有真正坚持/保持。

                    【讨论】:

                      【解决方案20】:

                      您需要在脚本中添加moment.lang(navigator.language)。

                      还必须添加您要显示的每个国家/地区区域设置:例如对于 GB 或 FR,您需要在 moment.js 库中添加该区域设置格式。 momentjs 文档中提供了这种格式的示例。如果您不在 moment.js 中添加这种格式,那么它总是会选择美国语言环境,因为这是我目前看到的唯一一种。

                      【讨论】:

                      • 如果他们的浏览器在 'en' 并且他们正在阅读 'es' 那么它只会显示 'en' 中的时间
                      【解决方案21】:

                      最快的方法:使用 Bower 安装

                      我刚刚在我的 html 项目中安装了带有 bower 的时刻并将 de.js 链接为 javascript 资源。

                      bower install moment --save

                      您也可以手动下载moment.js 和de.js。

                      在您的项目中链接“de.js”

                      在我的主项目文件中链接 de.js 会自动更改所有访问 moment 类及其方法的语言环境。

                      将不再需要发送moment.locale("de"). 或 moment.lang("de"). 在源代码中。

                      只需像这样链接您想要的语言环境:

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

                      如果您通过右键单击下载了 moment.js 1990ies-style,或者您可以链接没有 bower_components 路径的库,这在大多数情况下仍然可以正常工作。

                      【讨论】:

                      • 这应该是正确的答案。只需将所需的本地链接与&lt;script src="/bower_components/moment/locale/de.js"&gt;&lt;/script&gt;。它现在对我有用。
                      • "将不再需要在源代码中执行 moment.locale("de"). 或 moment.lang("de").。".我认为这对于更改语言环境的动态应用程序仍然有用。就像理论上您可以通过我的 Angular 应用程序中的语言/国家下拉菜单更改我的应用程序中的语言环境,然后 moment 应该动态更改格式,我认为 moment.locale($lang)
                      • 当然可以,但您仍然需要在我的测试中将 javascript 文件加载到 index.html 中。这在 2017 年 5 月仍然是一个问题,也许应该在他们的文档中包含这个问题。
                      【解决方案22】:

                      使用 momentjs 2.8+,执行以下操作:

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

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

                      【讨论】:

                      • 它应该工作;你能提供一个例子说明它在哪里不起作用,你是如何使用 moment 的(你是通过 npm 等安装的)吗?
                      • 最近的时刻(我在 2.18.1 中测试过)使用这个:moment.locale("de"); var m = moment().format("LLL")
                      • apadana 是对的:您使用moment.locale('de') 设置区域设置,然后通过moment()(注意括号)和format('LLL') 创建一个表示现在日期的新对象。括号很重要。在 2.20 中测试。另外,请记住使用moment-with-locale.js,如有必要,请将名称更改为moment.js。就我而言,Django 只是拒绝加载 moment-with-locale.js。
                      • 如果这个不行,试试这个:moment().locale('de').format('LLL');
                      • 这个是正确的,只是不要忘记导入您要使用的语言环境(cfr. Agu Dondo 的回答)。
                      猜你喜欢
                      • 2018-06-09
                      • 2018-09-22
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-09-28
                      • 2015-01-19
                      相关资源
                      最近更新 更多