将moment.js与lang文件和require.js一起使用

时间:2013-04-23 09:02:49

标签: javascript requirejs momentjs

我目前正在尝试使用带有require.js的moment.js库,但我仍然无法理解这样一个项目的正确设置。以下是我在main.js文件中的操作:

requirejs.config({
    baseUrl: 'app',

        paths: {
            // ... more parameters (all Backbone related)
            'moment': 'lib/moment',
            'moment_de': 'lib/lang/de',
        },

    shim: {
        'moment' : {
            deps: [],
        },

        'moment_de': {
            deps: ['moment'],
        },

        // ... more parameters (all Backbone related)
    }
});

我正在使用单独的模块进行配置。该模块如下所示:

define(['moment', 'moment_de'], function(moment, de) {

    moment.lang('de');

    var configuration = {}
    // ...    
    return configuration;
});

如您所见,我正在尝试更改此文件中moment对象的全局语言,但我遇到以下错误消息:

Uncaught Error: Module name "../moment" has not been loaded yet for context: _. Use require([])

后来:

Uncaught TypeError: Cannot call method 'preparse' of undefined 

第一条错误消息是正在加载的语言模块,尽管它应该在当前模块之后加载(如果我正确的话)。第二个是从尝试切换到尚未加载的语言模块的时刻模块。

有人可以就这个问题发表一些看法。提前谢谢。

编辑:我使用缩小语言版本修复了问题(例如this one)。显然,缩小版本使用AMD格式,这样可以更容易地包含在require.js项目中。

我仍然不太明白为什么不能使用shim配置包含语言。也许有人可以试着解释一下。

2 个答案:

答案 0 :(得分:4)

另一种解决方案(2015年):

此示例旨在演示如何将moment.js翻译与navigator.language属性一起使用,通常是用户的首选语言。

配置中单独定义moment.js和语言文件,如下所示:

require.config({
  config: {
    'moment': {
      noGlobal: true
    }
  },
  paths: {
    ...
    'moment': '../vendor/moment/moment',
    'moment_de': '../vendor/moment/locale/de',
    'moment_pl': '../vendor/moment/locale/pl'
    ...
  },
  ...
});

创建一个小模块,例如lib/moment.js并指定您的语言配置(您可以找到RFC 4646语言标记列表here):

define(function(require) {
  'use strict';

  var moment = require('moment'), locale;

  switch(navigator.language) {
    case 'de':
    case 'de-at':
    case 'de-de':
    case 'de-li':
    case 'de-lu':
    case 'de-ch':
      locale = 'moment_de';
    break;

    case 'pl':
      locale = 'moment_pl';
    break;

    ...
  }

  if (locale) {
    require([locale]);
  }

  return moment;
});

请注意:moment.js默认支持英语。


视图类(或任何其他类/普通脚本等)中,使用它如下:

define([
  'chaplin'
  'lib/moment'
], function(Chaplin, moment) {
  'use strict';

  var MyView = Chaplin.View.extend({

    ...

    parse: function() {
      ...
      console.log(moment().format('LLL'));
      ...
    }

    ...

  });

  return MyView;
});

答案 1 :(得分:3)

require({
    paths: {
        'moment': '//cdnjs.cloudflare.com/ajax/libs/moment.js/2.0.0/moment.min',
        'moment_de': '//cdnjs.cloudflare.com/ajax/libs/moment.js/2.0.0/lang/de.min'
    }
}, ['moment', 'moment_de'], function(moment){
    moment.lang('de');
    alert(moment(1316116057189).fromNow());
});

你应该不需要对模块进行填充,因为moment.js支持AMD。 http://jsfiddle.net/moderndegree/xYXUC/