xref: /webtrees/app/Date/HijriDate.php (revision 20ac4041ff6d2c96733f4df91b821d1c039e0259)
1<?php
2/**
3 * webtrees: online genealogy
4 * Copyright (C) 2018 webtrees development team
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16namespace Fisharebest\Webtrees\Date;
17
18use Fisharebest\ExtCalendar\ArabicCalendar;
19use Fisharebest\Webtrees\I18N;
20
21/**
22 * Definitions for the Hijri calendar.
23 *
24 * Note that these are "theoretical" dates.
25 * "True" dates are based on local lunar observations, and can be a +/- one day.
26 */
27class HijriDate extends CalendarDate
28{
29    /** @var int[] Convert GEDCOM month names to month numbers */
30    public static $MONTH_ABBREV = [
31        ''      => 0,
32        'MUHAR' => 1,
33        'SAFAR' => 2,
34        'RABIA' => 3,
35        'RABIT' => 4,
36        'JUMAA' => 5,
37        'JUMAT' => 6,
38        'RAJAB' => 7,
39        'SHAAB' => 8,
40        'RAMAD' => 9,
41        'SHAWW' => 10,
42        'DHUAQ' => 11,
43        'DHUAH' => 12,
44    ];
45
46    /**
47     * Create a date from either:
48     * a Julian day number
49     * day/month/year strings from a GEDCOM date
50     * another CalendarDate object
51     *
52     * @param array|int|CalendarDate $date
53     */
54    public function __construct($date)
55    {
56        $this->calendar = new ArabicCalendar();
57        parent::__construct($date);
58    }
59
60    /**
61     * Full month name in nominative case.
62     *
63     * @param int  $month_number
64     * @param bool $leap_year Some calendars use leap months
65     *
66     * @return string
67     */
68    public static function monthNameNominativeCase(int $month_number, bool $leap_year): string
69    {
70        static $translated_month_names;
71
72        if ($translated_month_names === null) {
73            $translated_month_names = [
74                0  => '',
75                /* I18N: http://en.wikipedia.org/wiki/Muharram */
76                1  => I18N::translateContext('NOMINATIVE', 'Muharram'),
77                /* I18N: http://en.wikipedia.org/wiki/Safar */
78                2  => I18N::translateContext('NOMINATIVE', 'Safar'),
79                /* I18N: http://en.wikipedia.org/wiki/Rabi%27_al-awwal */
80                3  => I18N::translateContext('NOMINATIVE', 'Rabi’ al-awwal'),
81                /* I18N: http://en.wikipedia.org/wiki/Rabi%27_al-thani */
82                4  => I18N::translateContext('NOMINATIVE', 'Rabi’ al-thani'),
83                /* I18N: http://en.wikipedia.org/wiki/Jumada_al-awwal */
84                5  => I18N::translateContext('NOMINATIVE', 'Jumada al-awwal'),
85                /* I18N: http://en.wikipedia.org/wiki/Jumada_al-thani */
86                6  => I18N::translateContext('NOMINATIVE', 'Jumada al-thani'),
87                /* I18N: http://en.wikipedia.org/wiki/Rajab */
88                7  => I18N::translateContext('NOMINATIVE', 'Rajab'),
89                /* I18N: http://en.wikipedia.org/wiki/Sha%27aban */
90                8  => I18N::translateContext('NOMINATIVE', 'Sha’aban'),
91                /* I18N: http://en.wikipedia.org/wiki/Ramadan_%28calendar_month%29 */
92                9  => I18N::translateContext('NOMINATIVE', 'Ramadan'),
93                /* I18N: http://en.wikipedia.org/wiki/Shawwal */
94                10 => I18N::translateContext('NOMINATIVE', 'Shawwal'),
95                /* I18N: http://en.wikipedia.org/wiki/Dhu_al-Qi%27dah */
96                11 => I18N::translateContext('NOMINATIVE', 'Dhu al-Qi’dah'),
97                /* I18N: http://en.wikipedia.org/wiki/Dhu_al-Hijjah */
98                12 => I18N::translateContext('NOMINATIVE', 'Dhu al-Hijjah'),
99            ];
100        }
101
102        return $translated_month_names[$month_number];
103    }
104
105    /**
106     * Full month name in genitive case.
107     *
108     * @param int  $month_number
109     * @param bool $leap_year Some calendars use leap months
110     *
111     * @return string
112     */
113    protected function monthNameGenitiveCase(int $month_number, bool $leap_year): string
114    {
115        static $translated_month_names;
116
117        if ($translated_month_names === null) {
118            $translated_month_names = [
119                0  => '',
120                /* I18N: http://en.wikipedia.org/wiki/Muharram */
121                1  => I18N::translateContext('GENITIVE', 'Muharram'),
122                /* I18N: http://en.wikipedia.org/wiki/Safar */
123                2  => I18N::translateContext('GENITIVE', 'Safar'),
124                /* I18N: http://en.wikipedia.org/wiki/Rabi%27_al-awwal */
125                3  => I18N::translateContext('GENITIVE', 'Rabi’ al-awwal'),
126                /* I18N: http://en.wikipedia.org/wiki/Rabi%27_al-thani */
127                4  => I18N::translateContext('GENITIVE', 'Rabi’ al-thani'),
128                /* I18N: http://en.wikipedia.org/wiki/Jumada_al-awwal */
129                5  => I18N::translateContext('GENITIVE', 'Jumada al-awwal'),
130                /* I18N: http://en.wikipedia.org/wiki/Jumada_al-thani */
131                6  => I18N::translateContext('GENITIVE', 'Jumada al-thani'),
132                /* I18N: http://en.wikipedia.org/wiki/Rajab */
133                7  => I18N::translateContext('GENITIVE', 'Rajab'),
134                /* I18N: http://en.wikipedia.org/wiki/Sha%27aban */
135                8  => I18N::translateContext('GENITIVE', 'Sha’aban'),
136                /* I18N: http://en.wikipedia.org/wiki/Ramadan_%28calendar_month%29 */
137                9  => I18N::translateContext('GENITIVE', 'Ramadan'),
138                /* I18N: http://en.wikipedia.org/wiki/Shawwal */
139                10 => I18N::translateContext('GENITIVE', 'Shawwal'),
140                /* I18N: http://en.wikipedia.org/wiki/Dhu_al-Qi%27dah */
141                11 => I18N::translateContext('GENITIVE', 'Dhu al-Qi’dah'),
142                /* I18N: http://en.wikipedia.org/wiki/Dhu_al-Hijjah */
143                12 => I18N::translateContext('GENITIVE', 'Dhu al-Hijjah'),
144            ];
145        }
146
147        return $translated_month_names[$month_number];
148    }
149
150    /**
151     * Full month name in locative case.
152     *
153     * @param int  $month_number
154     * @param bool $leap_year Some calendars use leap months
155     *
156     * @return string
157     */
158    protected function monthNameLocativeCase(int $month_number, bool $leap_year): string
159    {
160        static $translated_month_names;
161
162        if ($translated_month_names === null) {
163            $translated_month_names = [
164                0  => '',
165                /* I18N: http://en.wikipedia.org/wiki/Muharram */
166                1  => I18N::translateContext('LOCATIVE', 'Muharram'),
167                /* I18N: http://en.wikipedia.org/wiki/Safar */
168                2  => I18N::translateContext('LOCATIVE', 'Safar'),
169                /* I18N: http://en.wikipedia.org/wiki/Rabi%27_al-awwal */
170                3  => I18N::translateContext('LOCATIVE', 'Rabi’ al-awwal'),
171                /* I18N: http://en.wikipedia.org/wiki/Rabi%27_al-thani */
172                4  => I18N::translateContext('LOCATIVE', 'Rabi’ al-thani'),
173                /* I18N: http://en.wikipedia.org/wiki/Jumada_al-awwal */
174                5  => I18N::translateContext('LOCATIVE', 'Jumada al-awwal'),
175                /* I18N: http://en.wikipedia.org/wiki/Jumada_al-thani */
176                6  => I18N::translateContext('LOCATIVE', 'Jumada al-thani'),
177                /* I18N: http://en.wikipedia.org/wiki/Rajab */
178                7  => I18N::translateContext('LOCATIVE', 'Rajab'),
179                /* I18N: http://en.wikipedia.org/wiki/Sha%27aban */
180                8  => I18N::translateContext('LOCATIVE', 'Sha’aban'),
181                /* I18N: http://en.wikipedia.org/wiki/Ramadan_%28calendar_month%29 */
182                9  => I18N::translateContext('LOCATIVE', 'Ramadan'),
183                /* I18N: http://en.wikipedia.org/wiki/Shawwal */
184                10 => I18N::translateContext('LOCATIVE', 'Shawwal'),
185                /* I18N: http://en.wikipedia.org/wiki/Dhu_al-Qi%27dah */
186                11 => I18N::translateContext('LOCATIVE', 'Dhu al-Qi’dah'),
187                /* I18N: http://en.wikipedia.org/wiki/Dhu_al-Hijjah */
188                12 => I18N::translateContext('LOCATIVE', 'Dhu al-Hijjah'),
189            ];
190        }
191
192        return $translated_month_names[$month_number];
193    }
194
195    /**
196     * Full month name in instrumental case.
197     *
198     * @param int  $month_number
199     * @param bool $leap_year Some calendars use leap months
200     *
201     * @return string
202     */
203    protected function monthNameInstrumentalCase(int $month_number, bool $leap_year): string
204    {
205        static $translated_month_names;
206
207        if ($translated_month_names === null) {
208            $translated_month_names = [
209                0  => '',
210                /* I18N: http://en.wikipedia.org/wiki/Muharram */
211                1  => I18N::translateContext('INSTRUMENTAL', 'Muharram'),
212                /* I18N: http://en.wikipedia.org/wiki/Safar */
213                2  => I18N::translateContext('INSTRUMENTAL', 'Safar'),
214                /* I18N: http://en.wikipedia.org/wiki/Rabi%27_al-awwal */
215                3  => I18N::translateContext('INSTRUMENTAL', 'Rabi’ al-awwal'),
216                /* I18N: http://en.wikipedia.org/wiki/Rabi%27_al-thani */
217                4  => I18N::translateContext('INSTRUMENTAL', 'Rabi’ al-thani'),
218                /* I18N: http://en.wikipedia.org/wiki/Jumada_al-awwal */
219                5  => I18N::translateContext('INSTRUMENTAL', 'Jumada al-awwal'),
220                /* I18N: http://en.wikipedia.org/wiki/Jumada_al-thani */
221                6  => I18N::translateContext('INSTRUMENTAL', 'Jumada al-thani'),
222                /* I18N: http://en.wikipedia.org/wiki/Rajab */
223                7  => I18N::translateContext('INSTRUMENTAL', 'Rajab'),
224                /* I18N: http://en.wikipedia.org/wiki/Sha%27aban */
225                8  => I18N::translateContext('INSTRUMENTAL', 'Sha’aban'),
226                /* I18N: http://en.wikipedia.org/wiki/Ramadan_%28calendar_month%29 */
227                9  => I18N::translateContext('INSTRUMENTAL', 'Ramadan'),
228                /* I18N: http://en.wikipedia.org/wiki/Shawwal */
229                10 => I18N::translateContext('INSTRUMENTAL', 'Shawwal'),
230                /* I18N: http://en.wikipedia.org/wiki/Dhu_al-Qi%27dah */
231                11 => I18N::translateContext('INSTRUMENTAL', 'Dhu al-Qi’dah'),
232                /* I18N: http://en.wikipedia.org/wiki/Dhu_al-Hijjah */
233                12 => I18N::translateContext('INSTRUMENTAL', 'Dhu al-Hijjah'),
234            ];
235        }
236
237        return $translated_month_names[$month_number];
238    }
239
240    /**
241     * Abbreviated month name
242     *
243     * @param int  $month_number
244     * @param bool $leap_year Some calendars use leap months
245     *
246     * @return string
247     */
248    protected function monthNameAbbreviated(int $month_number, bool $leap_year): string
249    {
250        return self::monthNameNominativeCase($month_number, $leap_year);
251    }
252}
253