Quelltext des aktuellen Standes
<?php
declare(strict_types=1);
use OpenNIT\Assets\AssetHistory;
/**
* Deckt ab, dass der Lebenslauf eines Geräts der Oberflächensprache folgt.
*
* Seine Beschriftungen entstehen im Quelltext und werden dort schon mit Daten
* verbunden – der Katalog-Abgleich der Vorlagen sieht sie deshalb nicht. Diese
* Tests treten an seine Stelle.
*/
return static function (): void {
/** Liest eine private Konstante der Klasse. */
$konstante = static function (string $name): array {
$c = new \ReflectionClass(AssetHistory::class);
/** @var array<string,mixed> $wert */
$wert = $c->getConstant($name);
return $wert;
};
/** @var array<string,string> $katalog */
$katalog = require dirname(__DIR__) . '/lang/en.php';
test('Jede Herkunft im Filter ist übersetzt', function () use ($katalog) {
foreach (AssetHistory::ARTEN as $beschriftung) {
assertTrue(isset($katalog[$beschriftung]), $beschriftung . ' fehlt im englischen Katalog');
}
});
test('Jede Aktion des Verlaufs ist übersetzt', function () use ($katalog, $konstante) {
foreach ($konstante('AKTIONEN') as $eintrag) {
$titel = (string)$eintrag[0];
assertTrue(isset($katalog[$titel]), $titel . ' fehlt im englischen Katalog');
}
});
test('Jede Feldbeschriftung des Verlaufs ist übersetzt', function () use ($katalog, $konstante) {
foreach ($konstante('FELDER') as $beschriftung) {
assertTrue(isset($katalog[$beschriftung]), $beschriftung . ' fehlt im englischen Katalog');
}
});
test('Jeder Protokollstatus ist übersetzt', function () use ($katalog, $konstante) {
foreach ($konstante('PROTOKOLL_STATUS') as $eintrag) {
$beschriftung = (string)$eintrag[0];
assertTrue(isset($katalog[$beschriftung]), $beschriftung . ' fehlt im englischen Katalog');
}
});
test('Die zusammengesetzten Sätze sind übersetzt', function () use ($katalog) {
foreach ([
'an {person}',
'von {person}',
"herkunft\u{241F}von {person}",
'Unterschrift erhalten',
'ohne Unterschrift',
'Keine Feldänderung aufgezeichnet.',
'Änderung',
] as $text) {
assertTrue(isset($katalog[$text]), str_replace("\u{241F}", ' | ', $text) . ' fehlt im englischen Katalog');
}
});
test('„von" trennt Urheber und Herkunft', function () use ($katalog) {
// Im Kopf einer Zeile steht, wer gehandelt hat; im Detail einer
// Rücknahme, von wem das Gerät zurückkam. Englisch braucht dafür zwei
// Wörter.
assertSame('by {person}', $katalog['von {person}']);
assertSame('from {person}', $katalog["herkunft\u{241F}von {person}"]);
});
test('Ohne gesetzte Übersetzung bleiben die Beschriftungen deutsch', function () {
AssetHistory::setTranslator(null);
$eintraege = AssetHistory::build([], [[
'type' => 'handout',
'person_name' => 'Beispielperson',
'created_at' => '2026-01-02 03:04:05',
]]);
assertSame('Ausgegeben', $eintraege[0]['title']);
assertSame('an Beispielperson · ohne Unterschrift', $eintraege[0]['detail']);
});
test('Mit Übersetzung greift sie auch auf zusammengesetzte Sätze', function () {
AssetHistory::setTranslator(
static fn (string $text, array $werte = [], string $kontext = ''): string
=> strtr(($kontext !== '' ? $kontext . ':' : '') . '[' . $text . ']', array_combine(
array_map(static fn ($n) => '{' . $n . '}', array_keys($werte)),
array_map('strval', array_values($werte))
))
);
$eintraege = AssetHistory::build([], [[
'type' => 'return',
'person_name' => 'Beispielperson',
'created_at' => '2026-01-02 03:04:05',
]]);
assertSame('[Zurückgenommen]', $eintraege[0]['title']);
assertSame('herkunft:[von Beispielperson]', $eintraege[0]['detail']);
AssetHistory::setTranslator(null);
});
};