Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
94.74% covered (success)
94.74%
18 / 19
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
FromFileTranslator
94.74% covered (success)
94.74%
18 / 19
66.67% covered (warning)
66.67%
2 / 3
10.01
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 createFallback
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getGeneralTranslation
94.12% covered (success)
94.12%
16 / 17
0.00% covered (danger)
0.00%
0 / 1
8.01
1<?php
2namespace Apie\Core\Translator;
3
4use Apie\Core\Context\ApieContext;
5use Apie\Core\ContextConstants;
6use Apie\Core\Identifiers\KebabCaseSlug;
7use Apie\Core\Identifiers\SnakeCaseSlug;
8use Apie\Core\Translator\Lists\TranslationStringSet;
9use Apie\Core\Translator\ValueObjects\AbstractTranslation;
10use Apie\Core\ValueObjects\Exceptions\InvalidStringForValueObjectException;
11use Apie\Core\ValueObjects\Utils;
12
13class FromFileTranslator implements ApieTranslatorInterface
14{
15    public function __construct(private readonly string $translationPath)
16    {
17    }
18
19    public static function createFallback(): self
20    {
21        return new self(__DIR__ . '/../../lang/');
22    }
23
24    public function getGeneralTranslation(ApieContext $context, AbstractTranslation|TranslationStringSet $translations): ?string
25    {
26        if ($translations instanceof AbstractTranslation) {
27            $translations = [$translations, ...$translations->getSimplifications()];
28        }
29        $language = Utils::toString($context->getContext(ContextConstants::LOCALE, false) ?? 'en');
30        try {
31            SnakeCaseSlug::validate($language);
32        } catch (InvalidStringForValueObjectException) {
33            try {
34                KebabCaseSlug::validate($language);
35            } catch (InvalidStringForValueObjectException) {
36                $language = 'en';
37            }
38        }
39
40        $languages = [$language];
41        if (str_contains($language, '_')) {
42            $languages[] = strstr($language, '_', true);
43        }
44        
45        foreach ($translations as $translation) {
46            foreach ($languages as $language) {
47                $fullPath = $translation->toPath(rtrim($this->translationPath, '/') . '/' . $language) . '.php';
48                if (file_exists($fullPath)) {
49                    return include $fullPath;
50                }
51            }
52        }
53        return null;
54    }
55}