Wer kennt es nicht: Wir wollen eine „/go/shop“-Weiterleitung haben. Nun ist die Quelle aber mehrsprachig. Selbst wenn man ein „/go/shop-en“ und „/go/shop-de“ macht, ist es schwer über die Page-Link-Wizard im Backend einen Link mit einer Sprache zu verknüpfen. Grund genug dies cool zu lösen…
Vor ca. 2 Monaten habe ich die neue Language Detection EXT:language_detection veröffentlicht (Blog-Eintrag bei HDNET). Diese habe ich heute mit der Version 1.3.0 um einen „RespectLanguageLinkDetailsTrait“ erweitert, welcher LinkDetails entsprechend der Language Detection um eine Sprache erweitern kann. Dabei wird geprüft ob die Language Detection in der „Site“ der Ziel-pageuid aktiviert ist. Im Anschluss wird der gleiche Spracherkennungs-Prozess durchlaufen, der auch in der EXT:language_detection Middleware integriert und konfiguriert ist. Ein Beispiel für diesen Trait:
# Input:
$input = [
'type' => 'page',
'pageuid' => 99,
];
# Putput:
# Benutzung des Traits hier...
# Output:
$output = [
'type' => 'page',
'pageuid' => 99,
'parameters' => 'L=4'
];
Das soweit zur Language Detection. Nun muss dies nur noch mit EXT:redirect verknüpft werden. Dies ist nicht Teil der EXT:language_detection selbst, sondern Teil einer eigenen Extension für die Webseite. Dies bzgl. braucht man nun nur noch eine Anpassung der Services.yml, um den Redirect Service auszutauschen:
services:
TYPO3\CMS\Redirects\Http\Middleware\RedirectHandler:
arguments:
$redirectService: '@YOURNAMESPACE\Site\Service\RedirectService'
… und einen eigenen Redirect Service, welche den neuen Trait benutzt:
<?php
declare(strict_types=1);
namespace YOURNAMESPACE\Site\Service;
use LD\LanguageDetection\Service\RespectLanguageLinkDetailsTrait;
use Psr\EventDispatcher\EventDispatcherInterface;
use TYPO3\CMS\Core\LinkHandling\LinkService;
use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Redirects\Service\RedirectCacheService;
class RedirectService extends \TYPO3\CMS\Redirects\Service\RedirectService
{
use RespectLanguageLinkDetailsTrait;
public function __construct(RedirectCacheService $redirectCacheService, LinkService $linkService, SiteFinder $siteFinder, EventDispatcherInterface $eventDispatcher)
{
parent::__construct($redirectCacheService, $linkService, $siteFinder);
$this->languageEventDispatcher = $eventDispatcher;
$this->languageSiteFinder = $this->siteFinder;
}
/**
* Call parent and integrate language detection features
*
* @return array the link details from the linkService
*/
protected function resolveLinkDetailsFromLinkTarget(string $redirectTarget): array
{
return $this->addLanguageParameterByDetection(parent::resolveLinkDetailsFromLinkTarget($redirectTarget));
}
}
… und fertig. Geht nun ein Benutzer auf „/go/shop“ wird die komplett Language Detection geprüft. Der Benutzer landet auf der Ziel-Seite in der passenden Sprache seines Browsers. Sehr cool!! Praktisch dafür ist die Event-basiert Struktur von EXT:language_detection, sodass sich einzelne Teile der Extension sehr einfach wiederverwenden lassen.
Habt ihr weitere Ideen um die Spracherkennung von TYPO3 noch besser zu machen? Wo kann man diese ebenfalls noch integrieren?