Использование moment.js с lang файлом и require.js
В настоящее время я пытаюсь использовать библиотеку moment.js с require.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;
});
Как вы можете видеть, я пытаюсь изменить глобальный язык объекта момента в этом файле, но у меня возникают следующие сообщения об ошибках:
Uncaught Error: Module name "../moment" has not been loaded yet for context: _. Use require([])
И позже:
Uncaught TypeError: Cannot call method 'preparse' of undefined
Первое сообщение об ошибке - это языковой модуль, который загружается, хотя он должен быть загружен ПОСЛЕ моменту (если я делаю это правильно). Второй - это модуль момента, который пытается переключиться на языковой модуль, который не был загружен.
Неужели кто-то может прояснить этот вопрос. Спасибо заранее.
РЕДАКТИРОВАТЬ: я исправил проблему, используя версии с ограниченным языком (например, этот). По-видимому, миниатюрные версии используют формат AMD, что позволяет легче включать в проекты require.js).
Я все еще не совсем понимаю, почему невозможно включить языки, используя конфигурацию shim. Может быть, кто-то может попытаться объяснить это.
Ответы
Ответ 1
Другое решение (2015):
В этом примере показано, как использовать переводы moment.js
со свойством navigator.language
, обычно предпочтительным языком пользователя.
Определите moment.js
и языковые файлы отдельно в requirejs, например:
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 здесь):
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
поддерживает английский по умолчанию.
В chaplinjs класс просмотра ( или любой другой mvc class/plain script и т.д.), используйте его следующим образом:
define([
'chaplin'
'lib/moment'
], function(Chaplin, moment) {
'use strict';
var MyView = Chaplin.View.extend({
...
parse: function() {
...
console.log(moment().format('LLL'));
...
}
...
});
return MyView;
});
Ответ 2
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/