Локализация проверки jquery с asp.net MVC 3
Я использую Asp.Net Mvc3 и ненавязчивую проверку jquery. Я хотел бы, чтобы моя валидация дат была локализована, я имею в виду, jquery проверяет мою дату как MM/dd/yyyy, но я бы хотел, чтобы она была dd/MM/yyyy.
Я пытаюсь использовать плагин jQuery Globalize ( http://github.com/jquery/globalize). Я добавил ссылки на скрипты globalize.js и globalize.culture.pt-BR.js, и когда моя страница загружается, я запускаю следующий скрипт:
(function() {
$(function() {
$.datepicker.setDefaults($.datepicker.regional['pt-BR']);
Globalize.culture("pt-BR");
});
}).call(this);
Плагин jQuery UI работает как шарм, а проверка - нет. Что еще мне не хватает?
Редактировать:
Используя ссылки в ответе ниже, я решил проблему с помощью плагина Globalize:
Конечно, мне пришлось добавить ссылку на плагин Globalize на странице, а также ссылку на культуру, которую я хотел использовать (все доступно на сайте плагина). После этого это всего лишь небольшой фрагмент кода JavaScript.
Globalize.culture("pt-BR");
$.validator.methods.date = function(value, element) {
return this.optional(element) || Globalize.parseDate(value);
};
3 ответа
Если вы работаете с интернационализацией и ASP.NET MVC, я настоятельно рекомендую прочитать эти два превосходных поста Надима Афаны.
- ASP.NET MVC 3 Интернационализация
- Интернационализация ASP.NET MVC 3 - часть 2 (демонстрация NerdDinner)
Во втором посте он подробно описывает использование средства выбора даты jQuery UI и обсуждает проблемы с локализацией.
В своем примере он упоминает следующее
@* Unfortunately, the datepicker only supports Neutral cultures, so we need to adjust date and time format to the specific culture *@
$("#EventDate").change(function(){
$(this).val(Globalize.format($(this).datetimepicker('getDate'), Globalize.culture().calendar.patterns.d + " " + Globalize.culture().calendar.patterns.t)); /*d t*/
});
Я также рекомендую загрузить демонстрацию интернационализации Nerd Dinner, размещенную на его сайте.
Я сам делал подобное недавно. Я начал с того, что следовал совету в блоге Скотта Хансельмана на эту тему - вы можете прочитать об этом здесь:
Мне пришлось внести некоторые изменения, чтобы использовать Globalize вместо jQuery Global (сейчас jQuery Global мертв). Я написал это в следующем сообщении в блоге на случай, если это будет полезно:
http://icanmakethiswork.blogspot.co.uk/2012/09/globalize-and-jquery-validate.html
В моем блоге есть ссылка на этот скрипт jquery.validate.globalize.js, который заставляет jQuery Validate использовать Globalize для анализа числа / даты / диапазона. Эта часть даты, вероятно, должна решить вашу проблему:
/// <reference path="jquery-1.7.2.js" />
/// <reference path="jquery.validate.js" />
/// <reference path="globalize.js" />
/*!
* Monkey patch for jquery.validate.js to make use of Globalize.js number and date parsing
*/
$(document).ready(function () {
var currentCulture = $("meta[name='accept-language']").prop("content");
// Set Globalize to the current culture driven by the meta tag (if any)
if (currentCulture) {
Globalize.culture(currentCulture);
}
//Tell the validator that we want numbers parsed using Globalize.js
$.validator.methods.number = function (value, element) {
if (Globalize.parseFloat(value)) {
return true;
}
return false;
}
//Tell the validator that we want dates parsed using Globalize.js
$.validator.methods.date = function (value, element) {
if (Globalize.parseDate(value)) {
return true;
}
return false;
}
//Fix the range to use globalized methods
jQuery.extend(jQuery.validator.methods, {
range: function (value, element, param) {
//Use the Globalization plugin to parse the value
var val = Globalize.parseFloat(value);
return this.optional(element) || (val >= param[0] && val <= param[1]);
}
});
});
Маленькая поправка от ответа Джонни Рейли:
$.validator.methods.number = function (value, element) {
if (Globalize.parseFloat(value)) {
return true;
}
return false;
}
должен быть заменен на
$.validator.methods.number = function (value, element) {
return !isNaN(Globalize.parseFloat(value));
}
для правильного разбора нулевой строки ("0").
Итак, весь код:
/// <reference path="jquery-1.7.2.js" />
/// <reference path="jquery.validate.js" />
/// <reference path="globalize.js" />
/*!
* Monkey patch for jquery.validate.js to make use of Globalize.js number and date parsing
*/
$(document).ready(function () {
var currentCulture = $("meta[name='accept-language']").prop("content");
// Set Globalize to the current culture driven by the meta tag (if any)
if (currentCulture) {
Globalize.culture(currentCulture);
}
//Tell the validator that we want numbers parsed using Globalize.js
$.validator.methods.number = function (value, element) {
return !isNaN(Globalize.parseFloat(value));
}
//Tell the validator that we want dates parsed using Globalize.js
$.validator.methods.date = function (value, element) {
if (Globalize.parseDate(value)) {
return true;
}
return false;
}
//Fix the range to use globalized methods
jQuery.extend(jQuery.validator.methods, {
range: function (value, element, param) {
//Use the Globalization plugin to parse the value
var val = Globalize.parseFloat(value);
return this.optional(element) || (val >= param[0] && val <= param[1]);
}
});
});