summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Roach <greg@subaqua.co.uk>2021-01-05 13:15:00 +0000
committerGreg Roach <greg@subaqua.co.uk>2021-01-05 13:29:40 +0000
commita5fd6d7cefb90e939e45a6756d784bfd74ff8830 (patch)
tree7a3ec622fe577ff276356f443fea657f4298acef
parent5d7ac01841c200d265671e82d6c805b85db90364 (diff)
downloadwebtrees-a5fd6d7cefb90e939e45a6756d784bfd74ff8830.tar.gz
webtrees-a5fd6d7cefb90e939e45a6756d784bfd74ff8830.tar.bz2
webtrees-a5fd6d7cefb90e939e45a6756d784bfd74ff8830.zip
Fix: #3479 - need gender-specific translations for 'aged %s'
-rw-r--r--app/Age.php20
-rw-r--r--app/Functions/FunctionsPrint.php47
-rw-r--r--app/Http/RequestHandlers/IndividualPage.php55
-rw-r--r--resources/views/modules/timeline-chart/chart.phtml6
-rw-r--r--tests/app/AgeTest.php99
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);
}
}