diff options
| author | Greg Roach <greg@subaqua.co.uk> | 2021-01-05 13:15:00 +0000 |
|---|---|---|
| committer | Greg Roach <greg@subaqua.co.uk> | 2021-01-05 13:29:40 +0000 |
| commit | a5fd6d7cefb90e939e45a6756d784bfd74ff8830 (patch) | |
| tree | 7a3ec622fe577ff276356f443fea657f4298acef | |
| parent | 5d7ac01841c200d265671e82d6c805b85db90364 (diff) | |
| download | webtrees-a5fd6d7cefb90e939e45a6756d784bfd74ff8830.tar.gz webtrees-a5fd6d7cefb90e939e45a6756d784bfd74ff8830.tar.bz2 webtrees-a5fd6d7cefb90e939e45a6756d784bfd74ff8830.zip | |
Fix: #3479 - need gender-specific translations for 'aged %s'
| -rw-r--r-- | app/Age.php | 20 | ||||
| -rw-r--r-- | app/Functions/FunctionsPrint.php | 47 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/IndividualPage.php | 55 | ||||
| -rw-r--r-- | resources/views/modules/timeline-chart/chart.phtml | 6 | ||||
| -rw-r--r-- | tests/app/AgeTest.php | 99 |
5 files changed, 119 insertions, 108 deletions
diff --git a/app/Age.php b/app/Age.php index 03d9b31b93..46f066b9e6 100644 --- a/app/Age.php +++ b/app/Age.php @@ -83,9 +83,23 @@ class Age * Show zero ages without any units. * * @return string + * @deprecated - will be removed in 2.1.0 */ public function ageString(): string { + return $this->__toString(); + } + + /** + * Show an age in a human-friendly form, such as "34 years", "8 months", "20 days". + * Show an empty string for invalid/missing dates. + * Show a warning icon for negative ages. + * Show zero ages without any units. + * + * @return string + */ + public function __toString(): string + { if (!$this->is_valid) { return ''; } @@ -163,10 +177,11 @@ class Age * @param bool $living * * @return string + * @deprecated - will be removed in 2.1.0 */ public function ageAtEvent(bool $living): string { - $age = $this->ageString(); + $age = (string) $this; if ($age === '') { return ''; @@ -185,6 +200,7 @@ class Age * Similar to ageAtEvent, but for events such as burial, cremation, etc. * * @return string + * @deprecated - will be removed in 2.1.0 */ public function timeAfterDeath(): string { @@ -200,6 +216,6 @@ class Age return ''; } - return I18N::translate('(%s after death)', $this->ageString()); + return I18N::translate('(%s after death)', (string) $this); } } diff --git a/app/Functions/FunctionsPrint.php b/app/Functions/FunctionsPrint.php index 4f683c2c95..ee122f4b5c 100644 --- a/app/Functions/FunctionsPrint.php +++ b/app/Functions/FunctionsPrint.php @@ -286,7 +286,7 @@ class FunctionsPrint * * @return string */ - public static function formatFactDate(Fact $event, GedcomRecord $record, $anchor, $time): string + public static function formatFactDate(Fact $event, GedcomRecord $record, bool $anchor, bool $time): string { $factrec = $event->gedcom(); $html = ''; @@ -336,23 +336,46 @@ class FunctionsPrint $ageText = ''; if ($fact === 'DEAT' || Date::compare($date, $death_date) <= 0 || !$record->isDead()) { // Before death, print age - $age = (new Age($birth_date, $date))->ageAtEvent(false); + $age = (string) new Age($birth_date, $date); + // Only show calculated age if it differs from recorded age if ($age !== '') { - if ($fact_age !== '' && $fact_age !== $age) { - $ageText = $age; - } elseif ($fact_age === '' && $husb_age === '' && $wife_age === '') { - $ageText = $age; - } elseif ($husb_age !== '' && $husb_age !== $age && $record->sex() === 'M') { - $ageText = $age; - } elseif ($wife_age !== '' && $wife_age !== $age && $record->sex() === 'F') { - $ageText = $age; + if ( + $fact_age !== '' && $fact_age !== $age || + $fact_age === '' && $husb_age === '' && $wife_age === '' || + $husb_age !== '' && $husb_age !== $age && $record->sex() === 'M' || + $wife_age !== '' && $wife_age !== $age && $record->sex() === 'F' + ) { + switch ($record->sex()) { + case 'M': + /* I18N: The age of an individual at a given date */ + $ageText = I18N::translateContext('Male', '(aged %s)', $age); + break; + case 'F': + /* I18N: The age of an individual at a given date */ + $ageText = I18N::translateContext('Female', '(aged %s)', $age); + break; + default: + /* I18N: The age of an individual at a given date */ + $ageText = I18N::translate('(aged %s)', $age); + break; + } } } } if ($fact !== 'DEAT' && $death_date->isOK() && Date::compare($death_date, $date) < 0) { - // After death, print time since death - $ageText = (new Age($death_date, $date))->timeAfterDeath(); + $death_day = $death_date->minimumDate()->day(); + $event_day = $date->minimumDate()->day(); + if ($death_day !== 0 && $event_day !== 0 && $death_day === $event_day) { + // On the exact date of death? + // NOTE: this path is never reached. Keep the code (translation) in case + // we decide to re-introduce it. + $ageText = I18N::translate('(on the date of death)'); + } else { + // After death + $age = (string) new Age($death_date, $date); + $ageText = I18N::translate('(%s after death)', $age); + } // Family events which occur after death are probably errors if ($event->record() instanceof Family) { $ageText .= view('icons/warning'); diff --git a/app/Http/RequestHandlers/IndividualPage.php b/app/Http/RequestHandlers/IndividualPage.php index 6ee8046ce4..0927fea580 100644 --- a/app/Http/RequestHandlers/IndividualPage.php +++ b/app/Http/RequestHandlers/IndividualPage.php @@ -105,19 +105,6 @@ class IndividualPage implements RequestHandlerInterface return redirect($individual->url(), StatusCodeInterface::STATUS_MOVED_PERMANENTLY); } - // What is (was) the age of the individual - $bdate = $individual->getBirthDate(); - $ddate = $individual->getDeathDate(); - - if ($individual->isDead()) { - // If dead, show age at death - $age = (new Age($bdate, $ddate))->ageAtEvent(false); - } else { - // If living, show age today - $today = strtoupper(date('d M Y')); - $age = (new Age($bdate, new Date($today)))->ageAtEvent(true); - } - // What images are linked to this individual $individual_media = new Collection(); foreach ($individual->facts(['OBJE']) as $fact) { @@ -148,7 +135,7 @@ class IndividualPage implements RequestHandlerInterface } return $this->viewResponse('individual-page', [ - 'age' => $age, + 'age' => $this->ageString($individual), 'clipboard_facts' => $this->clipboard_service->pastableFacts($individual, new Collection()), 'individual' => $individual, 'individual_media' => $individual_media, @@ -170,6 +157,46 @@ class IndividualPage implements RequestHandlerInterface * * @return string */ + private function ageString(Individual $individual): string + { + if ($individual->isDead()) { + // If dead, show age at death + $age = (string) new Age($individual->getBirthDate(), $individual->getDeathDate()); + + if ($age === '') { + return ''; + } + + switch ($individual->sex()) { + case 'M': + /* I18N: The age of an individual at a given date */ + return I18N::translateContext('Male', '(aged %s)', $age); + case 'F': + /* I18N: The age of an individual at a given date */ + return I18N::translateContext('Female', '(aged %s)', $age); + default: + /* I18N: The age of an individual at a given date */ + return I18N::translate('(aged %s)', $age); + } + } + + // If living, show age today + $today = new Date(strtoupper(date('d M Y'))); + $age = (string) new Age($individual->getBirthDate(), $today); + + if ($age === '') { + return ''; + } + + /* I18N: The current age of a living individual */ + return I18N::translate('(age %s)', $age); + } + + /** + * @param Individual $individual + * + * @return string + */ private function metaDescription(Individual $individual): string { $meta_facts = []; diff --git a/resources/views/modules/timeline-chart/chart.phtml b/resources/views/modules/timeline-chart/chart.phtml index f8141555d3..19c0db02bd 100644 --- a/resources/views/modules/timeline-chart/chart.phtml +++ b/resources/views/modules/timeline-chart/chart.phtml @@ -346,11 +346,11 @@ use Fisharebest\Webtrees\Individual; foreach ($record->spouses() as $spouse) { if ($spouse->getBirthDate()->isOK()) { - $age = new Age($spouse->getBirthDate(), $gdate); + $age = (string) new Age($spouse->getBirthDate(), $gdate); if ($spouse->sex() === 'F') { - echo '<span class="age"> ', I18N::translate('Wife’s age'), ' ', $age->ageString(), '</span>'; + echo '<span class="age"> ', I18N::translate('Wife’s age'), ' ', $age, '</span>'; } else { - echo '<span class="age"> ', I18N::translate('Husband’s age'), ' ', $age->ageString(), '</span>'; + echo '<span class="age"> ', I18N::translate('Husband’s age'), ' ', $age, '</span>'; } } } diff --git a/tests/app/AgeTest.php b/tests/app/AgeTest.php index 5f1fe3e560..c634f7d1ba 100644 --- a/tests/app/AgeTest.php +++ b/tests/app/AgeTest.php @@ -31,9 +31,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -46,10 +44,7 @@ class AgeTest extends TestCase self::assertSame(0, $age->ageDays()); self::assertSame(0, $age->ageYears()); self::assertSame('0', $age->ageYearsString()); - self::assertSame('0 days', $age->ageString()); - self::assertSame('(aged 0 days)', $age->ageAtEvent(false)); - self::assertSame('(age 0 days)', $age->ageAtEvent(true)); - self::assertSame('(on the date of death)', $age->timeAfterDeath()); + self::assertSame('0 days', (string) $age); } /** @@ -57,9 +52,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -72,10 +65,7 @@ class AgeTest extends TestCase self::assertSame(0, $age->ageDays()); self::assertSame(0, $age->ageYears()); self::assertSame('0', $age->ageYearsString()); - self::assertSame('0', $age->ageString()); - self::assertSame('(aged 0)', $age->ageAtEvent(false)); - self::assertSame('(age 0)', $age->ageAtEvent(true)); - self::assertSame('', $age->timeAfterDeath()); + self::assertSame('0', (string) $age); } /** @@ -83,9 +73,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -98,10 +86,7 @@ class AgeTest extends TestCase self::assertSame(0, $age->ageDays()); self::assertSame(0, $age->ageYears()); self::assertSame('0', $age->ageYearsString()); - self::assertSame('0', $age->ageString()); - self::assertSame('(aged 0)', $age->ageAtEvent(false)); - self::assertSame('(age 0)', $age->ageAtEvent(true)); - self::assertSame('', $age->timeAfterDeath()); + self::assertSame('0', (string) $age); } /** @@ -109,9 +94,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -124,10 +107,7 @@ class AgeTest extends TestCase self::assertSame(-37, $age->ageDays()); self::assertSame(-1, $age->ageYears()); self::assertSame(view('icons/warning'), $age->ageYearsString()); - self::assertSame(view('icons/warning'), $age->ageString()); - self::assertSame('(aged ' . view('icons/warning') . ')', $age->ageAtEvent(false)); - self::assertSame('(age ' . view('icons/warning') . ')', $age->ageAtEvent(true)); - self::assertSame('(' . view('icons/warning') . ' after death)', $age->timeAfterDeath()); + self::assertSame(view('icons/warning'), (string) $age); } /** @@ -135,9 +115,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -150,10 +128,7 @@ class AgeTest extends TestCase self::assertSame(-1, $age->ageDays()); self::assertSame(-1, $age->ageYears()); self::assertSame('', $age->ageYearsString()); - self::assertSame('', $age->ageString()); - self::assertSame('', $age->ageAtEvent(false)); - self::assertSame('', $age->ageAtEvent(true)); - self::assertSame('', $age->timeAfterDeath()); + self::assertSame('', (string) $age); } /** @@ -161,9 +136,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -176,10 +149,7 @@ class AgeTest extends TestCase self::assertSame(-1, $age->ageDays()); self::assertSame(-1, $age->ageYears()); self::assertSame('', $age->ageYearsString()); - self::assertSame('', $age->ageString()); - self::assertSame('', $age->ageAtEvent(false)); - self::assertSame('', $age->ageAtEvent(true)); - self::assertSame('', $age->timeAfterDeath()); + self::assertSame('', (string) $age); } /** @@ -187,9 +157,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -202,10 +170,7 @@ class AgeTest extends TestCase self::assertSame(-6, $age->ageDays()); self::assertSame(0, $age->ageYears()); self::assertSame('0', $age->ageYearsString()); - self::assertSame('0', $age->ageString()); - self::assertSame('(aged 0)', $age->ageAtEvent(false)); - self::assertSame('(age 0)', $age->ageAtEvent(true)); - self::assertSame('', $age->timeAfterDeath()); + self::assertSame('0', (string) $age); } /** @@ -213,9 +178,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -228,10 +191,7 @@ class AgeTest extends TestCase self::assertSame(6, $age->ageDays()); self::assertSame(0, $age->ageYears()); self::assertSame('0', $age->ageYearsString()); - self::assertSame('0', $age->ageString()); - self::assertSame('(aged 0)', $age->ageAtEvent(false)); - self::assertSame('(age 0)', $age->ageAtEvent(true)); - self::assertSame('', $age->timeAfterDeath()); + self::assertSame('0', (string) $age); } /** @@ -239,9 +199,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -254,10 +212,7 @@ class AgeTest extends TestCase self::assertSame(14, $age->ageDays()); self::assertSame(0, $age->ageYears()); self::assertSame('0', $age->ageYearsString()); - self::assertSame('14 days', $age->ageString()); - self::assertSame('(aged 14 days)', $age->ageAtEvent(false)); - self::assertSame('(age 14 days)', $age->ageAtEvent(true)); - self::assertSame('(14 days after death)', $age->timeAfterDeath()); + self::assertSame('14 days', (string) $age); } /** @@ -265,9 +220,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -280,10 +233,7 @@ class AgeTest extends TestCase self::assertSame(75, $age->ageDays()); self::assertSame(0, $age->ageYears()); self::assertSame('0', $age->ageYearsString()); - self::assertSame('2 months', $age->ageString()); - self::assertSame('(aged 2 months)', $age->ageAtEvent(false)); - self::assertSame('(age 2 months)', $age->ageAtEvent(true)); - self::assertSame('(2 months after death)', $age->timeAfterDeath()); + self::assertSame('2 months', (string) $age); } /** @@ -291,9 +241,7 @@ class AgeTest extends TestCase * @covers \Fisharebest\Webtrees\Age::ageDays * @covers \Fisharebest\Webtrees\Age::ageYears * @covers \Fisharebest\Webtrees\Age::ageYearsString - * @covers \Fisharebest\Webtrees\Age::ageString - * @covers \Fisharebest\Webtrees\Age::ageAtEvent - * @covers \Fisharebest\Webtrees\Age::timeAfterDeath + * @covers \Fisharebest\Webtrees\Age::__toString * * @return void */ @@ -306,9 +254,6 @@ class AgeTest extends TestCase self::assertSame(2631, $age->ageDays()); self::assertSame(7, $age->ageYears()); self::assertSame('7', $age->ageYearsString()); - self::assertSame('7 years', $age->ageString()); - self::assertSame('(aged 7 years)', $age->ageAtEvent(false)); - self::assertSame('(age 7 years)', $age->ageAtEvent(true)); - self::assertSame('(7 years after death)', $age->timeAfterDeath()); + self::assertSame('7 years', (string) $age); } } |
