kdelibs/kdecore/date/kcalendarsystemindiannational.cpp
2014-11-13 01:04:59 +02:00

549 lines
20 KiB
C++

/*
Copyright 2009, 2010 John Layt <john@layt.net>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "kcalendarsystemindiannational_p.h"
#include "kcalendarsystemprivate_p.h"
#include "kdebug.h"
#include "klocale.h"
#include <QtCore/QDate>
#include <QtCore/QCharRef>
class KCalendarSystemIndianNationalPrivate : public KCalendarSystemPrivate
{
public:
explicit KCalendarSystemIndianNationalPrivate(KCalendarSystemIndianNational *q);
virtual ~KCalendarSystemIndianNationalPrivate();
// Virtual methods each calendar system must re-implement
virtual KLocale::CalendarSystem calendarSystem() const;
virtual void loadDefaultEraList();
virtual int monthsInYear(int year) const;
virtual int daysInMonth(int year, int month) const;
virtual int daysInYear(int year) const;
virtual int daysInWeek() const;
virtual bool isLeapYear(int year) const;
virtual bool hasLeapMonths() const;
virtual bool hasYearZero() const;
virtual int maxDaysInWeek() const;
virtual int maxMonthsInYear() const;
virtual int earliestValidYear() const;
virtual int latestValidYear() const;
virtual QString monthName(int month, int year, KLocale::DateTimeComponentFormat format, bool possessive) const;
virtual QString weekDayName(int weekDay, KLocale::DateTimeComponentFormat format) const;
};
// Shared d pointer base class definitions
KCalendarSystemIndianNationalPrivate::KCalendarSystemIndianNationalPrivate(KCalendarSystemIndianNational *q)
: KCalendarSystemPrivate(q)
{
}
KCalendarSystemIndianNationalPrivate::~KCalendarSystemIndianNationalPrivate()
{
}
KLocale::CalendarSystem KCalendarSystemIndianNationalPrivate::calendarSystem() const
{
return KLocale::IndianNationalCalendar;
}
void KCalendarSystemIndianNationalPrivate::loadDefaultEraList()
{
QString name, shortName, format;
// Saka Era
name = i18nc("Calendar Era: Indian National Saka Era, years > 0, LongFormat", "Saka Era");
shortName = i18nc("Calendar Era: Indian National Saka Era, years > 0, ShortFormat", "SE");
format = i18nc("(kdedt-format) Indian National, SE, full era year format used for %EY, e.g. 2000 SE", "%Ey %EC");
addEra('+', 1, q->epoch(), 1, q->latestValidDate(), name, shortName, format);
}
int KCalendarSystemIndianNationalPrivate::monthsInYear(int year) const
{
Q_UNUSED(year)
return 12;
}
int KCalendarSystemIndianNationalPrivate::daysInMonth(int year, int month) const
{
if (month == 1) {
if (isLeapYear(year)) {
return 31;
} else {
return 30;
}
}
if (month >= 2 && month <= 6) {
return 31;
}
return 30;
}
int KCalendarSystemIndianNationalPrivate::daysInYear(int year) const
{
if (isLeapYear(year)) {
return 366;
} else {
return 365;
}
}
int KCalendarSystemIndianNationalPrivate::daysInWeek() const
{
return 7;
}
bool KCalendarSystemIndianNationalPrivate::isLeapYear(int year) const
{
//Uses same rule as Gregorian, and is explicitly synchronized to Gregorian
//so add 78 years to get Gregorian year and apply Gregorian calculation
year = year + 78;
if (!hasYearZero() && year < 1) {
year = year + 1;
}
if (year % 4 == 0) {
if (year % 100 != 0) {
return true;
} else if (year % 400 == 0) {
return true;
}
}
return false;
}
bool KCalendarSystemIndianNationalPrivate::hasLeapMonths() const
{
return false;
}
bool KCalendarSystemIndianNationalPrivate::hasYearZero() const
{
return true;
}
int KCalendarSystemIndianNationalPrivate::maxDaysInWeek() const
{
return 7;
}
int KCalendarSystemIndianNationalPrivate::maxMonthsInYear() const
{
return 12;
}
int KCalendarSystemIndianNationalPrivate::earliestValidYear() const
{
return 0;
}
int KCalendarSystemIndianNationalPrivate::latestValidYear() const
{
return 9999;
}
QString KCalendarSystemIndianNationalPrivate::monthName(int month, int year, KLocale::DateTimeComponentFormat format, bool possessive) const
{
Q_UNUSED(year);
if (format == KLocale::NarrowName) {
switch (month) {
case 1:
return ki18nc("Indian National month 1 - KLocale::NarrowName", "C").toString(locale());
case 2:
return ki18nc("Indian National month 2 - KLocale::NarrowName", "V").toString(locale());
case 3:
return ki18nc("Indian National month 3 - KLocale::NarrowName", "J").toString(locale());
case 4:
return ki18nc("Indian National month 4 - KLocale::NarrowName", "Ā").toString(locale());
case 5:
return ki18nc("Indian National month 5 - KLocale::NarrowName", "S").toString(locale());
case 6:
return ki18nc("Indian National month 6 - KLocale::NarrowName", "B").toString(locale());
case 7:
return ki18nc("Indian National month 7 - KLocale::NarrowName", "Ā").toString(locale());
case 8:
return ki18nc("Indian National month 8 - KLocale::NarrowName", "K").toString(locale());
case 9:
return ki18nc("Indian National month 9 - KLocale::NarrowName", "A").toString(locale());
case 10:
return ki18nc("Indian National month 10 - KLocale::NarrowName", "P").toString(locale());
case 11:
return ki18nc("Indian National month 11 - KLocale::NarrowName", "M").toString(locale());
case 12:
return ki18nc("Indian National month 12 - KLocale::NarrowName", "P").toString(locale());
default:
return QString();
}
}
if (format == KLocale::ShortName && possessive) {
switch (month) {
case 1:
return ki18nc("Indian National month 1 - KLocale::ShortName Possessive", "of Cha").toString(locale());
case 2:
return ki18nc("Indian National month 2 - KLocale::ShortName Possessive", "of Vai").toString(locale());
case 3:
return ki18nc("Indian National month 3 - KLocale::ShortName Possessive", "of Jya").toString(locale());
case 4:
return ki18nc("Indian National month 4 - KLocale::ShortName Possessive", "of Āsh").toString(locale());
case 5:
return ki18nc("Indian National month 5 - KLocale::ShortName Possessive", "of Shr").toString(locale());
case 6:
return ki18nc("Indian National month 6 - KLocale::ShortName Possessive", "of Bhā").toString(locale());
case 7:
return ki18nc("Indian National month 7 - KLocale::ShortName Possessive", "of Āsw").toString(locale());
case 8:
return ki18nc("Indian National month 8 - KLocale::ShortName Possessive", "of Kār").toString(locale());
case 9:
return ki18nc("Indian National month 9 - KLocale::ShortName Possessive", "of Agr").toString(locale());
case 10:
return ki18nc("Indian National month 10 - KLocale::ShortName Possessive", "of Pau").toString(locale());
case 11:
return ki18nc("Indian National month 11 - KLocale::ShortName Possessive", "of Māg").toString(locale());
case 12:
return ki18nc("Indian National month 12 - KLocale::ShortName Possessive", "of Phā").toString(locale());
default:
return QString();
}
}
if (format == KLocale::ShortName && !possessive) {
switch (month) {
case 1:
return ki18nc("Indian National month 1 - KLocale::ShortName", "Cha").toString(locale());
case 2:
return ki18nc("Indian National month 2 - KLocale::ShortName", "Vai").toString(locale());
case 3:
return ki18nc("Indian National month 3 - KLocale::ShortName", "Jya").toString(locale());
case 4:
return ki18nc("Indian National month 4 - KLocale::ShortName", "Āsh").toString(locale());
case 5:
return ki18nc("Indian National month 5 - KLocale::ShortName", "Shr").toString(locale());
case 6:
return ki18nc("Indian National month 6 - KLocale::ShortName", "Bhā").toString(locale());
case 7:
return ki18nc("Indian National month 7 - KLocale::ShortName", "Āsw").toString(locale());
case 8:
return ki18nc("Indian National month 8 - KLocale::ShortName", "Kār").toString(locale());
case 9:
return ki18nc("Indian National month 9 - KLocale::ShortName", "Agr").toString(locale());
case 10:
return ki18nc("Indian National month 10 - KLocale::ShortName", "Pau").toString(locale());
case 11:
return ki18nc("Indian National month 11 - KLocale::ShortName", "Māg").toString(locale());
case 12:
return ki18nc("Indian National month 12 - KLocale::ShortName", "Phā").toString(locale());
default:
return QString();
}
}
if (format == KLocale::LongName && possessive) {
switch (month) {
case 1:
return ki18nc("Indian National month 1 - KLocale::LongName Possessive", "of Chaitra").toString(locale());
case 2:
return ki18nc("Indian National month 2 - KLocale::LongName Possessive", "of Vaishākh").toString(locale());
case 3:
return ki18nc("Indian National month 3 - KLocale::LongName Possessive", "of Jyaishtha").toString(locale());
case 4:
return ki18nc("Indian National month 4 - KLocale::LongName Possessive", "of Āshādha").toString(locale());
case 5:
return ki18nc("Indian National month 5 - KLocale::LongName Possessive", "of Shrāvana").toString(locale());
case 6:
return ki18nc("Indian National month 6 - KLocale::LongName Possessive", "of Bhādrapad").toString(locale());
case 7:
return ki18nc("Indian National month 7 - KLocale::LongName Possessive", "of Āshwin").toString(locale());
case 8:
return ki18nc("Indian National month 8 - KLocale::LongName Possessive", "of Kārtik").toString(locale());
case 9:
return ki18nc("Indian National month 9 - KLocale::LongName Possessive", "of Agrahayana").toString(locale());
case 10:
return ki18nc("Indian National month 10 - KLocale::LongName Possessive", "of Paush").toString(locale());
case 11:
return ki18nc("Indian National month 11 - KLocale::LongName Possessive", "of Māgh").toString(locale());
case 12:
return ki18nc("Indian National month 12 - KLocale::LongName Possessive", "of Phālgun").toString(locale());
default:
return QString();
}
}
// Default to LongName
switch (month) {
case 1:
return ki18nc("Indian National month 1 - KLocale::LongName", "Chaitra").toString(locale());
case 2:
return ki18nc("Indian National month 2 - KLocale::LongName", "Vaishākh").toString(locale());
case 3:
return ki18nc("Indian National month 3 - KLocale::LongName", "Jyaishtha").toString(locale());
case 4:
return ki18nc("Indian National month 4 - KLocale::LongName", "Āshādha").toString(locale());
case 5:
return ki18nc("Indian National month 5 - KLocale::LongName", "Shrāvana").toString(locale());
case 6:
return ki18nc("Indian National month 6 - KLocale::LongName", "Bhādrapad").toString(locale());
case 7:
return ki18nc("Indian National month 7 - KLocale::LongName", "Āshwin").toString(locale());
case 8:
return ki18nc("Indian National month 8 - KLocale::LongName", "Kārtik").toString(locale());
case 9:
return ki18nc("Indian National month 9 - KLocale::LongName", "Agrahayana").toString(locale());
case 10:
return ki18nc("Indian National month 10 - KLocale::LongName", "Paush").toString(locale());
case 11:
return ki18nc("Indian National month 11 - KLocale::LongName", "Māgh").toString(locale());
case 12:
return ki18nc("Indian National month 12 - KLocale::LongName", "Phālgun").toString(locale());
default:
return QString();
}
}
QString KCalendarSystemIndianNationalPrivate::weekDayName(int weekDay, KLocale::DateTimeComponentFormat format) const
{
if (format == KLocale::NarrowName) {
switch (weekDay) {
case 1:
return ki18nc("Indian National weekday 1 - KLocale::NarrowName ", "S").toString(locale());
case 2:
return ki18nc("Indian National weekday 2 - KLocale::NarrowName ", "M").toString(locale());
case 3:
return ki18nc("Indian National weekday 3 - KLocale::NarrowName ", "B").toString(locale());
case 4:
return ki18nc("Indian National weekday 4 - KLocale::NarrowName ", "G").toString(locale());
case 5:
return ki18nc("Indian National weekday 5 - KLocale::NarrowName ", "S").toString(locale());
case 6:
return ki18nc("Indian National weekday 6 - KLocale::NarrowName ", "S").toString(locale());
case 7:
return ki18nc("Indian National weekday 7 - KLocale::NarrowName ", "R").toString(locale());
default:
return QString();
}
}
if (format == KLocale::ShortName || format == KLocale:: ShortNumber) {
switch (weekDay) {
case 1:
return ki18nc("Indian National weekday 1 - KLocale::ShortName", "Som").toString(locale());
case 2:
return ki18nc("Indian National weekday 2 - KLocale::ShortName", "Mañ").toString(locale());
case 3:
return ki18nc("Indian National weekday 3 - KLocale::ShortName", "Bud").toString(locale());
case 4:
return ki18nc("Indian National weekday 4 - KLocale::ShortName", "Gur").toString(locale());
case 5:
return ki18nc("Indian National weekday 5 - KLocale::ShortName", "Suk").toString(locale());
case 6:
return ki18nc("Indian National weekday 6 - KLocale::ShortName", "San").toString(locale());
case 7:
return ki18nc("Indian National weekday 7 - KLocale::ShortName", "Rav").toString(locale());
default: return QString();
}
}
switch (weekDay) {
case 1:
return ki18nc("Indian National weekday 1 - KLocale::LongName", "Somavãra").toString(locale());
case 2:
return ki18nc("Indian National weekday 2 - KLocale::LongName", "Mañgalvã").toString(locale());
case 3:
return ki18nc("Indian National weekday 3 - KLocale::LongName", "Budhavãra").toString(locale());
case 4:
return ki18nc("Indian National weekday 4 - KLocale::LongName", "Guruvãra").toString(locale());
case 5:
return ki18nc("Indian National weekday 5 - KLocale::LongName", "Sukravãra").toString(locale());
case 6:
return ki18nc("Indian National weekday 6 - KLocale::LongName", "Sanivãra").toString(locale());
case 7:
return ki18nc("Indian National weekday 7 - KLocale::LongName", "Raviãra").toString(locale());
default:
return QString();
}
}
KCalendarSystemIndianNational::KCalendarSystemIndianNational(const KLocale *locale)
: KCalendarSystem(*new KCalendarSystemIndianNationalPrivate(this), KSharedConfig::Ptr(), locale)
{
d_ptr->loadConfig(calendarType());
}
KCalendarSystemIndianNational::KCalendarSystemIndianNational(const KSharedConfig::Ptr config, const KLocale *locale)
: KCalendarSystem(*new KCalendarSystemIndianNationalPrivate(this), config, locale)
{
d_ptr->loadConfig(calendarType());
}
KCalendarSystemIndianNational::KCalendarSystemIndianNational(KCalendarSystemIndianNationalPrivate &dd,
const KSharedConfig::Ptr config,
const KLocale *locale)
: KCalendarSystem(dd, config, locale)
{
d_ptr->loadConfig(calendarType());
}
KCalendarSystemIndianNational::~KCalendarSystemIndianNational()
{
}
QString KCalendarSystemIndianNational::calendarType() const
{
return QLatin1String("indian-national");
}
QDate KCalendarSystemIndianNational::epoch() const
{
//0000-01-01, has Year 0.
//0078-03-22 AD Gregorian / 0078-03-24 AD Julian
return QDate::fromJulianDay(1749994);
}
QDate KCalendarSystemIndianNational::earliestValidDate() const
{
//0000-01-01, has Year 0.
//0078-03-22 AD Gregorian / 0078-03-24 AD Julian
//Don't do proleptic yet, need to check
return QDate::fromJulianDay(1749630);
}
QDate KCalendarSystemIndianNational::latestValidDate() const
{
// Set to last day of year 9999 until confirm date formats & widgets support > 9999
//9999-12-30
//10078-03-21 AD Gregorian
return QDate::fromJulianDay(5402054);
}
bool KCalendarSystemIndianNational::isValid(int year, int month, int day) const
{
return KCalendarSystem::isValid(year, month, day);
}
bool KCalendarSystemIndianNational::isValid(const QDate &date) const
{
return KCalendarSystem::isValid(date);
}
bool KCalendarSystemIndianNational::isLeapYear(int year) const
{
return KCalendarSystem::isLeapYear(year);
}
bool KCalendarSystemIndianNational::isLeapYear(const QDate &date) const
{
return KCalendarSystem::isLeapYear(date);
}
QString KCalendarSystemIndianNational::monthName(int month, int year, MonthNameFormat format) const
{
return KCalendarSystem::monthName(month, year, format);
}
QString KCalendarSystemIndianNational::monthName(const QDate &date, MonthNameFormat format) const
{
return KCalendarSystem::monthName(date, format);
}
QString KCalendarSystemIndianNational::weekDayName(int weekDay, WeekDayNameFormat format) const
{
return KCalendarSystem::weekDayName(weekDay, format);
}
QString KCalendarSystemIndianNational::weekDayName(const QDate &date, WeekDayNameFormat format) const
{
return KCalendarSystem::weekDayName(date, format);
}
int KCalendarSystemIndianNational::weekDayOfPray() const
{
return 7; // JPL ???
}
bool KCalendarSystemIndianNational::isLunar() const
{
return false;
}
bool KCalendarSystemIndianNational::isLunisolar() const
{
return true;
}
bool KCalendarSystemIndianNational::isSolar() const
{
return false;
}
bool KCalendarSystemIndianNational::isProleptic() const
{
return false;
}
bool KCalendarSystemIndianNational::julianDayToDate(int jd, int &year, int &month, int &day) const
{
int L, N, I, J, D, M, Y;
// "Explanatory Supplement to the Astronomical Almanac" 2006 section 12.94 pp 605-606
// Originally from "Report of the Calendar Reform Committee" 1955
L = jd + 68518;
N = (4 * L) / 146097;
L = L - (146097 * N + 3) / 4;
I = (4000 * (L + 1)) / 1461001;
L = L - (1461 * I) / 4 + 1;
J = ((L - 1) / 31) * (1 - L / 185) + (L / 185) * ((L - 156) / 30 + 5) - L / 366;
D = L - 31 * J + ((J + 2) / 8) * (J - 5);
L = J / 11;
M = J + 2 - 12 * L;
Y = 100 * (N - 49) + L + I - 78;
day = D;
month = M;
year = Y;
return true;
}
bool KCalendarSystemIndianNational::dateToJulianDay(int year, int month, int day, int &jd) const
{
int Y = year;
int M = month;
int D = day;
// "Explanatory Supplement to the Astronomical Almanac" 2006 section 12.94 pp 605-606
// Originally from "Report of the Calendar Reform Committee" 1955
jd = 365 * Y
+ (Y + 78 - 1 / M) / 4
+ 31 * M
- (M + 9) / 11
- (M / 7) * (M - 7)
- (3 * ((Y + 78 - 1 / M) / 100 + 1)) / 4
+ D
+ 1749579;
return true;
}