Opened 8 years ago

Closed 8 years ago

#7775 closed feature (wontfix)

Good news i found a way to make datepicker globalization

Reported by: Omid Owned by:
Priority: minor Milestone: 1.9.0
Component: ui.datepicker Version: 1.8.16
Keywords: Cc:
Blocked by: Blocking:

Description

there is some algorithms for calendars in world so you can find them here: http://keith-wood.name/calendars.html like (Persian(jalili), Arabic(Shamsi), Tahi, Chinese, Hebri, ...) some of them is working with Sun algorithm and the others is working with Moon.

for make a real localization datepicker we have to choose a algorithm like this:

    $.datepicker.regional['fa'] = {
        calendar: JalaliDate, //Here we can do it. (Persian Calendar) ******
        closeText: 'قبول',
        prevText: 'قبل',
        nextText: 'بعد',
        currentText: 'امروز',
        monthNames: ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'],
        monthNamesShort: ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'],
        dayNames: ['یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],
        dayNamesShort: ['یک', 'دو', 'سه', 'چهار', 'پنج', 'جمعه', 'شنبه'],
        dayNamesMin: ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],
        dateFormat: 'dd MM yy', firstDay: 6,
        isRTL: true
    };


//sample of persian calendar
function JalaliDate(p0, p1, p2) {
    var georgianDate;
    var jalaliDate;
    var isJalali = true;

    if (!p0) {
        setFullDate();
    } else if (typeof (p0) == 'boolean') {
        isJalali = p0;
        setFullDate();
    } else if (typeof (p0 == 'number')) {
        var y = parseInt(p0, 10);
        var m = parseInt(p1, 10);
        var d = parseInt(p2, 10);
        y += div(m, 12);
        m = remainder(m, 12);
        var g = jalali_to_gregorian([y, m, d]);
        setFullDate(new Date(g[0], g[1], g[2]));
    } else if (p0 instanceof Array) {
        throw new "JalaliDate(Array) is not implemented yet!";
    } else {
        setFullDate(p0);
    }

    function setFullDate(date) {
        if (date instanceof JalaliDate) {
            date = date.getGeorgianDate();
        }
        georgianDate = new Date(date);
        if (!georgianDate || georgianDate == 'Invalid Date' || isNaN(georgianDate || !georgianDate.getDate())) {
            georgianDate = new Date();
        }
        jalaliDate = gregorian_to_jalali([
            georgianDate.getFullYear(),
            georgianDate.getMonth(),
            georgianDate.getDate()]);
        return this;
    }
    this.getGeorgianDate = function () { return georgianDate; }

    this.setFullDate = setFullDate;

    this.setDate = function (e) {
        jalaliDate[2] = e;
        var g = jalali_to_gregorian(jalaliDate);
        georgianDate = new Date(g[0], g[1], g[2]);
        jalaliDate = gregorian_to_jalali([g[0], g[1], g[2]]);
    };

    this.getFullYear = function () { return jalaliDate[0]; };
    this.getMonth = function () { return jalaliDate[1]; };
    this.getDate = function () { return jalaliDate[2]; };
    this.toString = function () { return jalaliDate.join(',').toString(); };
    this.getDay = function () { return georgianDate.getDay(); };
    this.getHours = function () { return georgianDate.getHours(); };
    this.getMinutes = function () { return georgianDate.getMinutes(); };
    this.getSeconds = function () { return georgianDate.getSeconds(); };
    this.getTime = function () { return georgianDate.getTime(); };
    this.getTimeZoneOffset = function () { return georgianDate.getTimeZoneOffset(); };
    this.getYear = function () { return JalaliDate[0] % 100; };

    this.setHours = function (e) { georgianDate.setHours(e) };
    this.setMinutes = function (e) { georgianDate.setMinutes(e) };
    this.setSeconds = function (e) { georgianDate.setSeconds(e) };
    this.setMilliseconds = function (e) { georgianDate.setMilliseconds(e) };
}
g_days_in_month = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); j_days_in_month = new Array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29); function div(a, b) { return Math.floor(a / b) } function remainder(a, b) { return a - div(a, b) * b } function gregorian_to_jalali(g) { var gy, gm, gd; var jy, jm, jd; var g_day_no, j_day_no; var j_np; var i; gy = g[0] - 1600; gm = g[1]; gd = g[2] - 1; g_day_no = 365 * gy + div((gy + 3), 4) - div((gy + 99), 100) + div((gy + 399), 400); for (i = 0; i < gm; ++i) g_day_no += g_days_in_month[i]; if (gm > 1 && ((gy % 4 == 0 && gy % 100 != 0) || (gy % 400 == 0))) ++g_day_no; g_day_no += gd; j_day_no = g_day_no - 79; j_np = div(j_day_no, 12053); j_day_no = remainder(j_day_no, 12053); jy = 979 + 33 * j_np + 4 * div(j_day_no, 1461); j_day_no = remainder(j_day_no, 1461); if (j_day_no >= 366) { jy += div((j_day_no - 1), 365); j_day_no = remainder((j_day_no - 1), 365) } for (i = 0; i < 11 && j_day_no >= j_days_in_month[i]; ++i) { j_day_no -= j_days_in_month[i] } jm = i; jd = j_day_no + 1; return new Array(jy, jm, jd) } function jalali_to_gregorian(j) { var gy, gm, gd; var jy, jm, jd; var g_day_no, j_day_no; var leap; var i; jy = j[0] - 979; jm = j[1]; jd = j[2] - 1; j_day_no = 365 * jy + div(jy, 33) * 8 + div((remainder(jy, 33) + 3), 4); for (i = 0; i < jm; ++i) j_day_no += j_days_in_month[i]; j_day_no += jd; g_day_no = j_day_no + 79; gy = 1600 + 400 * div(g_day_no, 146097); g_day_no = remainder(g_day_no, 146097); leap = 1; if (g_day_no >= 36525) { g_day_no--; gy += 100 * div(g_day_no, 36524); g_day_no = remainder(g_day_no, 36524); if (g_day_no >= 365) g_day_no++; else leap = 0 } gy += 4 * div(g_day_no, 1461); g_day_no = remainder(g_day_no, 1461); if (g_day_no >= 366) { leap = 0; g_day_no--; gy += div(g_day_no, 365); g_day_no = remainder(g_day_no, 365) } for (i = 0; g_day_no >= g_days_in_month[i] + (i == 1 && leap); i++) g_day_no -= g_days_in_month[i] + (i == 1 && leap); gm = i; gd = g_day_no + 1; return new Array(gy, gm, gd) } function jalali_today() { Today = new Date(); j = gregorian_to_jalali(new Array(Today.getFullYear(), Today.getMonth() + 1, Today.getDate())); return j[2] + "/" + j[1] + "/" + j[0] }


OK. we need some changes in the "jquery.ui.datepicker.js" first we have to add a calendar to default type.

        this._defaults = { // Global defaults for all the date picker instances
	    calendar: Date, // 'calendar' for make date time picker globalization
            .....

then we have to make a alias of the calendar to class to make it easier. on the end of constructor and the setDefault method we add this code:

this.Date=this._defaults.calendar; // end of constructor


	setDefaults: function(settings) {
		extendRemove(this._defaults, settings || {});
		this.Date=this._defaults.calendar;
		return this;
	}, 

then we have to replace all of the "new Date" to "new this.Date" in the code. but NOT AT THE END OF CODE :::: "$.datepicker.uuid = new Date().getTime(); leave it to new Date".

OK we DONE. i hope to see this feature at the next version. Thanks a lot.

Change History (1)

comment:1 Changed 8 years ago by Scott González

Resolution: wontfix
Status: newclosed

Datepicker is being rewritten from scratch. The new datepicker will handle this.

Note: See TracTickets for help on using tickets.