diff --git a/src/contracts/Repository/LanguageResolver.php b/src/contracts/Repository/LanguageResolver.php index 4fc92bb298..302d8db0ed 100644 --- a/src/contracts/Repository/LanguageResolver.php +++ b/src/contracts/Repository/LanguageResolver.php @@ -34,6 +34,15 @@ public function setContextLanguage(?string $contextLanguage): void; */ public function getPrioritizedLanguages(?array $forcedLanguages = null): array; + /** + * Get first prioritized language taking into account forced, context, and configured languages. + * + * @param array|null $forcedLanguages Optional, typically arguments provided to API, will be used first if set. + * + * @throws \Ibexa\Contracts\Core\Repository\Exceptions\OutOfBoundsException If no prioritized language is found. + */ + public function getFirstPrioritizedLanguage(?array $forcedLanguages = null): string; + /** * Get currently set UseAlwaysAvailable. * diff --git a/src/lib/Repository/SiteAccessAware/Language/AbstractLanguageResolver.php b/src/lib/Repository/SiteAccessAware/Language/AbstractLanguageResolver.php index 27ac737c61..04d3bad1fc 100644 --- a/src/lib/Repository/SiteAccessAware/Language/AbstractLanguageResolver.php +++ b/src/lib/Repository/SiteAccessAware/Language/AbstractLanguageResolver.php @@ -8,6 +8,7 @@ namespace Ibexa\Core\Repository\SiteAccessAware\Language; +use Ibexa\Contracts\Core\Repository\Exceptions\OutOfBoundsException; use Ibexa\Contracts\Core\Repository\LanguageResolver as APILanguageResolver; use Ibexa\Contracts\Core\Repository\Values\Content\Language; @@ -108,6 +109,18 @@ final public function getPrioritizedLanguages(?array $forcedLanguages = null): a return array_values(array_unique(array_merge($languages, $this->getConfiguredLanguages()))); } + public function getFirstPrioritizedLanguage(?array $forcedLanguages = null): string + { + $languages = $this->getPrioritizedLanguages(); + + $firstLanguage = reset($languages); + if ($firstLanguage === false) { + throw new OutOfBoundsException('No prioritized language found.'); + } + + return $firstLanguage; + } + /** * For use by event listening to config resolver scope changes (or other event changing configured languages). * diff --git a/tests/lib/Repository/SiteAccessAware/Language/LanguageResolverTest.php b/tests/lib/Repository/SiteAccessAware/Language/LanguageResolverTest.php index 9832182548..27d3fa730c 100644 --- a/tests/lib/Repository/SiteAccessAware/Language/LanguageResolverTest.php +++ b/tests/lib/Repository/SiteAccessAware/Language/LanguageResolverTest.php @@ -8,6 +8,7 @@ namespace Ibexa\Tests\Core\Repository\SiteAccessAware\Language; +use Ibexa\Contracts\Core\Repository\Exceptions\OutOfBoundsException; use Ibexa\Core\Repository\SiteAccessAware\Language\LanguageResolver; use PHPUnit\Framework\TestCase; @@ -50,6 +51,29 @@ public function testGetPrioritizedLanguages( ); } + public function testGetFirstPrioritizedLanguage(): void + { + $languageResolver = new LanguageResolver( + configLanguages: ['pol-PL', 'eng-GB'], + defaultUseAlwaysAvailable: true, + defaultShowAllTranslations: false + ); + + self::assertEquals('eng-GB', $languageResolver->getFirstPrioritizedLanguage()); + } + + public function testGetFirstPrioritizedLanguageThrowsExceptionWhenNoLanguageFound(): void + { + $this->expectException(OutOfBoundsException::class); + + $languageResolver = new LanguageResolver( + configLanguages: [], + defaultUseAlwaysAvailable: true, + defaultShowAllTranslations: false + ); + $languageResolver->getFirstPrioritizedLanguage(); + } + /** * Data provider for testGetPrioritizedLanguages. *