Ich konnte mir inzwischen von diesem Thread inspiriert eine Lösung selberprogrammieren.
Achtung:
- ist nur für meinen Fall getestet
- ich verwende URLs ohne .html-Endung, kann mir aber vorstellen dass es mit auch problemlos funktionieren kann
- es gibt ziemlich sicher Fälle die durch diese Lösung nicht abgedeckt sind
- ich hoffe sie ist jemandem Inspiration für eigene Lösungen
PHP-Code:
//*** z_myproject/config/config.php
// hook
$GLOBALS['TL_HOOKS']['translateUrlParameters'][] = array('MySpace\TranslatorHelper', 'translateMMUrls');
//*** z_myproject/classes/TranslatorHelper
namespace MySpace;
class TranslatorHelper extends \Frontend
{
/***
* Hook callback for changelanguage extension to support language switching on product reader page
****/
public function translateMMUrls($arrParams, $strLanguage, $arrRootPage) {
$uri = $_SERVER["REQUEST_URI"];
$websitePath = $GLOBALS['TL_CONFIG']['websitePath'];
// remove website path from uri
if( strpos($uri, $websitePath) === 0){
$uri = substr($uri, strlen($websitePath)+1);
}
// remove index.php fragment from uri
if(strlen($uri) > 0){
if( strpos($uri, 'index.php') === 0){
$uri = substr($uri, strlen('index.php/'));
}
}
// handle remaining arguments, and do that only if there are more than one // no handling if there are three
$uri = explode('/', $uri);
if(count($uri) == 2){ // 1. Teil ist Alias des MM, 2. Teil ist Alias des MM-Objektes
\Database::getInstance();
// the last part of query prevents uppercase/lowercase mixing, compare here: http://stackoverflow.com/a/4853844/603569
$objData = \Database::getInstance()->prepare('SELECT att_id, item_id FROM tl_metamodel_translatedtext WHERE value = ? and langcode = ? AND value COLLATE UTF8_BIN = LOWER(value COLLATE UTF8_BIN)')
->execute($uri[1], $GLOBALS['TL_LANGUAGE']);
$data = $objData->fetchAllAssoc();
if(count($data[0]) == 2){
$objData = \Database::getInstance()->prepare('SELECT value FROM tl_metamodel_translatedtext WHERE att_id = ? AND item_id =? AND langcode =?')
->execute($data[0][att_id], $data[0][item_id], $strLanguage);
$data = $objData->fetchAllAssoc();
$value = $data[0][value];
// compare: https://github.com/terminal42/contao-changelanguage/blob/master/ModuleChangeLanguage.php Z207 ff.
$GLOBALS['TL_AUTO_ITEM'][] = $value;
$arrParams['url'][$value] = $value;
}
}
return $arrParams;
}
}
Erläuterungen
[changelanguage] bietet einen Hook mit dessen Hilfe man eigene URI-parts beisteuern kann.
In obiger Funktion werden die Argumente aus der URI extrahiert. Wenn ein Alias eines Metamodels und ein Alias eines Metamodel-Objektes vorhanden sind, werden die passenden Übersetzungen aus der Datenbank geholt und an [changelanguage] übergeben.
Lesezeichen