xref: /webtrees/app/Date/AbstractGregorianJulianDate.php (revision 16d6367af0fc87302889bd9d5831cab67c1a54f0)
1<?php
2/**
3 * webtrees: online genealogy
4 * Copyright (C) 2019 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 */
16declare(strict_types=1);
17
18namespace Fisharebest\Webtrees\Date;
19
20use Fisharebest\Webtrees\I18N;
21
22/**
23 * Common definitions for Gregorian and Julian dates.
24 */
25abstract class AbstractGregorianJulianDate extends AbstractCalendarDate
26{
27    // Convert GEDCOM month names to month numbers
28    protected const MONTH_ABBREVIATIONS = [
29        ''    => 0,
30        'JAN' => 1,
31        'FEB' => 2,
32        'MAR' => 3,
33        'APR' => 4,
34        'MAY' => 5,
35        'JUN' => 6,
36        'JUL' => 7,
37        'AUG' => 8,
38        'SEP' => 9,
39        'OCT' => 10,
40        'NOV' => 11,
41        'DEC' => 12,
42    ];
43
44    /**
45     * Full month name in nominative case.
46     *
47     * We put these in the base class, to save duplicating it in the Julian and Gregorian calendars.
48     *
49     * @param int  $month
50     * @param bool $leap_year Some calendars use leap months
51     *
52     * @return string
53     */
54    protected function monthNameNominativeCase(int $month, bool $leap_year): string
55    {
56        static $translated_month_names;
57
58        if ($translated_month_names === null) {
59            $translated_month_names = [
60                0  => '',
61                1  => I18N::translateContext('NOMINATIVE', 'January'),
62                2  => I18N::translateContext('NOMINATIVE', 'February'),
63                3  => I18N::translateContext('NOMINATIVE', 'March'),
64                4  => I18N::translateContext('NOMINATIVE', 'April'),
65                5  => I18N::translateContext('NOMINATIVE', 'May'),
66                6  => I18N::translateContext('NOMINATIVE', 'June'),
67                7  => I18N::translateContext('NOMINATIVE', 'July'),
68                8  => I18N::translateContext('NOMINATIVE', 'August'),
69                9  => I18N::translateContext('NOMINATIVE', 'September'),
70                10 => I18N::translateContext('NOMINATIVE', 'October'),
71                11 => I18N::translateContext('NOMINATIVE', 'November'),
72                12 => I18N::translateContext('NOMINATIVE', 'December'),
73            ];
74        }
75
76        return $translated_month_names[$month];
77    }
78
79    /**
80     * Full month name in genitive case.
81     *
82     * We put these in the base class, to save duplicating it in the Julian and Gregorian calendars.
83     *
84     * @param int  $month
85     * @param bool $leap_year Some calendars use leap months
86     *
87     * @return string
88     */
89    protected function monthNameGenitiveCase(int $month, bool $leap_year): string
90    {
91        static $translated_month_names;
92
93        if ($translated_month_names === null) {
94            $translated_month_names = [
95                0  => '',
96                1  => I18N::translateContext('GENITIVE', 'January'),
97                2  => I18N::translateContext('GENITIVE', 'February'),
98                3  => I18N::translateContext('GENITIVE', 'March'),
99                4  => I18N::translateContext('GENITIVE', 'April'),
100                5  => I18N::translateContext('GENITIVE', 'May'),
101                6  => I18N::translateContext('GENITIVE', 'June'),
102                7  => I18N::translateContext('GENITIVE', 'July'),
103                8  => I18N::translateContext('GENITIVE', 'August'),
104                9  => I18N::translateContext('GENITIVE', 'September'),
105                10 => I18N::translateContext('GENITIVE', 'October'),
106                11 => I18N::translateContext('GENITIVE', 'November'),
107                12 => I18N::translateContext('GENITIVE', 'December'),
108            ];
109        }
110
111        return $translated_month_names[$month];
112    }
113
114    /**
115     * Full month name in locative case.
116     *
117     * We put these in the base class, to save duplicating it in the Julian and Gregorian calendars.
118     *
119     * @param int  $month
120     * @param bool $leap_year Some calendars use leap months
121     *
122     * @return string
123     */
124    protected function monthNameLocativeCase(int $month, bool $leap_year): string
125    {
126        static $translated_month_names;
127
128        if ($translated_month_names === null) {
129            $translated_month_names = [
130                0  => '',
131                1  => I18N::translateContext('LOCATIVE', 'January'),
132                2  => I18N::translateContext('LOCATIVE', 'February'),
133                3  => I18N::translateContext('LOCATIVE', 'March'),
134                4  => I18N::translateContext('LOCATIVE', 'April'),
135                5  => I18N::translateContext('LOCATIVE', 'May'),
136                6  => I18N::translateContext('LOCATIVE', 'June'),
137                7  => I18N::translateContext('LOCATIVE', 'July'),
138                8  => I18N::translateContext('LOCATIVE', 'August'),
139                9  => I18N::translateContext('LOCATIVE', 'September'),
140                10 => I18N::translateContext('LOCATIVE', 'October'),
141                11 => I18N::translateContext('LOCATIVE', 'November'),
142                12 => I18N::translateContext('LOCATIVE', 'December'),
143            ];
144        }
145
146        return $translated_month_names[$month];
147    }
148
149    /**
150     * Full month name in instrumental case.
151     *
152     * We put these in the base class, to save duplicating it in the Julian and Gregorian calendars.
153     *
154     * @param int  $month
155     * @param bool $leap_year Some calendars use leap months
156     *
157     * @return string
158     */
159    protected function monthNameInstrumentalCase(int $month, bool $leap_year): string
160    {
161        static $translated_month_names;
162
163        if ($translated_month_names === null) {
164            $translated_month_names = [
165                0  => '',
166                1  => I18N::translateContext('INSTRUMENTAL', 'January'),
167                2  => I18N::translateContext('INSTRUMENTAL', 'February'),
168                3  => I18N::translateContext('INSTRUMENTAL', 'March'),
169                4  => I18N::translateContext('INSTRUMENTAL', 'April'),
170                5  => I18N::translateContext('INSTRUMENTAL', 'May'),
171                6  => I18N::translateContext('INSTRUMENTAL', 'June'),
172                7  => I18N::translateContext('INSTRUMENTAL', 'July'),
173                8  => I18N::translateContext('INSTRUMENTAL', 'August'),
174                9  => I18N::translateContext('INSTRUMENTAL', 'September'),
175                10 => I18N::translateContext('INSTRUMENTAL', 'October'),
176                11 => I18N::translateContext('INSTRUMENTAL', 'November'),
177                12 => I18N::translateContext('INSTRUMENTAL', 'December'),
178            ];
179        }
180
181        return $translated_month_names[$month];
182    }
183
184    /**
185     * Abbreviated month name
186     *
187     * @param int  $month
188     * @param bool $leap_year Some calendars use leap months
189     *
190     * @return string
191     */
192    protected function monthNameAbbreviated(int $month, bool $leap_year): string
193    {
194        static $translated_month_names;
195
196        if ($translated_month_names === null) {
197            $translated_month_names = [
198                0  => '',
199                1  => I18N::translateContext('Abbreviation for January', 'Jan'),
200                2  => I18N::translateContext('Abbreviation for February', 'Feb'),
201                3  => I18N::translateContext('Abbreviation for March', 'Mar'),
202                4  => I18N::translateContext('Abbreviation for April', 'Apr'),
203                5  => I18N::translateContext('Abbreviation for May', 'May'),
204                6  => I18N::translateContext('Abbreviation for June', 'Jun'),
205                7  => I18N::translateContext('Abbreviation for July', 'Jul'),
206                8  => I18N::translateContext('Abbreviation for August', 'Aug'),
207                9  => I18N::translateContext('Abbreviation for September', 'Sep'),
208                10 => I18N::translateContext('Abbreviation for October', 'Oct'),
209                11 => I18N::translateContext('Abbreviation for November', 'Nov'),
210                12 => I18N::translateContext('Abbreviation for December', 'Dec'),
211            ];
212        }
213
214        return $translated_month_names[$month];
215    }
216}
217