OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

AssetHistoryLanguageTest.php

4 KB
<?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);
    });
};