Vorwort/Hinweis
Ich muss im folgenden Beitrag meine URL-Beispiele leider mit domain[Punkt]de angeben, da ich im Forum nicht mehr als 2 Links einfügen kann. Ich entschuldige mich dafür, dass es vermutlich die Lesbarkeit erschwert…
Konfiguration
Wir haben einen Test-Shop mit SW 6.4.8.2 eingerichtet mit einer einzigen Storefront, welche die Shopware-Standard-Sprachen „Deutsch“ und „Englisch“ enthält, sowie die Sprachen „Tschechisch“ und „Portugiesisch“ aus dem Sprachpaket. Für die deutsche Sprache ist die ganz normale Domain ohne Zusatz zugeordnet (domain[Punkt]de), für Englisch domain[Punkt]de/e, für Tschechisch domain[Punkt]de/cz und für Portugiesisch domain[Punkt]de/pt (jeweils mit https:// davor). Standard-Sprache / Standard-System-Sprache für den Shop ist Deutsch.
Problem
Der Language-Switch wird im Shop korrekt angezeigt. Für die Sprachen aus dem Sprachpaket (Tschechisch, Portugiesisch) funktioniert der Language-Switch auch auf jeder Seite korrekt (man landet auf der Korrekten Seite in der korrekten Sprache). Für die Shopware-Standard-Sprache Englisch funktioniert der Language-Switch teilweise nicht. Auf verschiedenen Seiten wird beim Switch zu Englisch versucht die Domain ohne / danach aufzurufen - statt domain[Punkt]de/e/meine-kategorie wird domain[Punkt]dee/meine-kategorie aufgerufen, was logischerweise zu einem Fehler führt, Wenn ich den / manuell in der URL ergänze, wird mir die korrekte englische Seite angezeigt.
Betroffene Stellen
Soweit wir das getestet haben, tritt dieses Verhalten an folgenden Stellen auf:
- Inhalts-Seiten (Erlebniswelten > Shopseiten)
- Kategorie-Seiten
- Produkt-Seiten
Nicht betroffene Stellen
An folgenden Stellen funktioniert der Language-Switch zu Englisch hingegen korrekt (soweit wir das getestet haben):
- Startseite
- Account-Seiten
- Registrierung
- Suche
- Merkzettel
- Warenkorb
Zusätzlicher Hinweis
Wenn ich über die Startseite zu englisch wechsel, kann ich mich problemlos zu den englischen Inhalts-, Kategorie- und Produkt-Seiten navigieren. Die URLs dorthin werden also korrekt erstellt. Das Problem scheint also irgendwo in der Logik des Language-Switch direkt zu liegen.
Das Problem tritt sowohl in der Version SW 6.4.8.1 auf als auch in der Version SW 6.4.8.2.
Ist dieses Verhalten ein Fehler von Shopware oder könnte es durch eine falsche Konfiguration entstanden sein? Wie können wir das Problem beheben?
Hinweis: Das Problem besteht auch weiterhin in SW 6.4.10
Die URLs in den Verkaufskanälen sind alle entweder mit oder ohne / am Ende eingetragen?
Bei den Kategorie und Produktseiten funktioniert es bei mir, noch nie einen Fehler gehabt.
Englisch, Spanisch, Französisch, Deutsch.
Die Domain-URLs sind alle ohne / am Ende. Shopware entfernt im Bearbeitungs-Formular für die URL-Domains automatisch einen /, wenn er am Ende der Domain gesetzt wurde. Es ist somit gar nicht möglich einen / am Ende der Domain-URLs einzutragen. Der Fehler passiert bei mir - wie gesagt - nur für Englisch. Die anderen Sprachen funktionieren. Welche Shopware Version hast du denn im Einsatz? Vielleicht kam der Fehler erst mit einer neueren Version.
Doch, kann man. Mann muss nur hartnäckig sein und ein paar /// hintereinander schreiben. Es ist ein JavaScript, welches das / automatisch entfernt.
Üblicherweise versuche ich nicht die Software zu „hacken“ um mein Ziel zu erreichen Wäre auch etwas umständlich alle JS-EventListener zu entfernen, um den / da rein zu bekommen. Selbst wenn ich es schaffe den / im Formular am Ende bestehen zu lassen, indem ich das Event entferne, wird mir der abschließende / just beim Speichern wieder entfernt. Daher haben die Domain-URLs bei mir keinen / am Ende Vom Bauchgefühl her glaube ich auch nicht, dass die Domain-URL Einstellung das Problem ist, da einige Seiten-Typen nicht betroffen sind. Wäre die URL-Einstellung das Problem, müsste das Verhalten ja theoretisch bei allen Seiten-Typen gleich sein.
Individuelles Theme, bei dem der Programmierer ggf. unsauber gearbeitet hat?
Es handelt sich um eine relativ jungfräuliche Shopware Installation zum Testen mit den Shopware Demodaten und dem Shopware Sprachpaket. Ich wollte mich erstmal mit dem Adminbereich und dem Standard-Shopware-Verhalten vertraut machen und damit, wie man einen mehrsprachigen Shop bei Shopware einrichtet. Bisher wurde bzgl. Theme-Anpassung oder Extensions noch gar nichts gemacht - es wurde nichts installiert (von den oben genannten Sachen abgesehen), nichts erweitert und auch nichts bearbeitet oder überschrieben. An der Einstellung der SEO-URL-Erstellung im Adminbereich habe ich etwas herumgetestet, aber das Zurücksetzen auf die Standardwerte dort hat auch nichts am Verhalten geändert (Caches und Indizes habe ich immer geleert vor der Prüfung). Ich werde wohl nochmal eine neue Installation wagen und die Sache erneut testen. Ich gebe dann nochmal Bescheid, ob es sich bei der neuen Installation bei mir auch so verhält. Wird allerdings nicht mehr heute.
Hab aber vielen Dank für deine bisherige Hilfe
So, ich habe noch einmal ein frisches Shopware 6.4.10 installiert (System-Sprache Deutsch) inkl. Sprachpaket und Demo-Daten. Ich habe
- die Sprachen „Portugiesisch“ und „Tschechisch“ aktiviert,
- Deutsch, Englisch Portugiesisch und Tschechisch als erlaubte Sprachen hinzugefügt
- und die Domain-URLs für alle Sprachen angelegt (genau so wie in dem Test-Shop vorher).
Mehr habe ich nicht geändert
Als ich nun den Shop getestet habe bzgl. Language-Switch hat alles prima funktioniert.
ABER:
Ich habe danach im Adminbereich über „Einstellungen > SEO“ die URL-Templates angepasst, damit die URLs nach meinen Wünschen aufgebaut werden. Diese wurden wie folgt angepasst:
-
Produktdetailseite: {{ product.name|lower }}.html
-
Landing Page: {{ landingPage.translated.url }}
-
Kategorieseite: {% for part in category.seoBreadcrumb %}{{ part|lower }}{% if 0==loop.last %}/{% endif %}{% endfor %}.html
Danach habe ich den Cache geleert und die Indizes neu erstellen lassen.
Und siehe da: Der Langauge-Switch hat sich wieder genau so verhalten, wie in meinem ursprünglichen Post beschrieben.
Ich habe danach die URL-Templates wieder zurück auf die ursprünglichen Werte von Shopware geändert (ich hatte mir diese vorher extra rauskopiert, weil ich schon wusste, dass es nachträglich sonst keine Möglichkeit mehr gibt, die Standard-Werte wieder von Shopware einfügen zu lassen > zumindest habe ich keine gefunden). Die Werte lautet nun also:
-
Produktdetailseite: {{ product.translated.name }}/{{ product.productNumber }}
-
Landing Page: {{ landingPage.translated.url }}
-
Kategorieseite: {% for part in category.seoBreadcrumb %}{{ part }}/{% endfor %}
Danach habe ich wieder den Cache geleert und die Indizes neu erstellen lassen.
Leider mit dem selben Problem. Zwar wird die ursprüngliche URL-Regel angewendet (die URLs sehen also wieder so aus wie vor meiner Anpassung der SEO-URLs), aber der Language-Switcher verhält sich immer noch falsch.
Nun ist die Frage: Was nun? Sowohl die originalen als auch die angepassten SEO-URLs funktionieren in allen Sprachen außer in Englisch (wenn ich sie einmal angepasst habe). Das Zurückändern der SEO-URLs behebt den Fehler nicht (davon abgesehen möchte ich die SEO-URLs ja eigentlich auch anpassen).
Der Language-Switcher scheint also m.E. ein Problem mit dem Rendern der SEO-URLs für Englisch zu haben (in den im 1. Post genannten Seiten-Typen), wenn man einmal die SEO-URL geändert hatte.
Kann das jemand bestätigen? Wenn ja, müsste geprüft werden, warum sich gerade bei „Englisch“ der Language-Switcher so verhält.
Die Sache hat mir jetzt keine Ruhe gelassen und meinen Jagdinstinkt geweckt
Und siehe da: Ich habe die „Fehlerquelle“ gefunden!
Der Code, der dieses Verhalten verursacht ist in der Datei
vendor\shopware\storefront\Framework\Routing\RequestTransformer.php > Zeile 223.
Die if-Abfrage fügt vor den baseUrlPath einen / ein, wenn der baseUrlPath länger als 1 Zeichen ist und nicht mit einem / beginnt. Und genau hier liegt das Problem. Denn das Sprachkürzel für meine englische Domain-URL lautet „e“ und ist damit nur 1 Zeichen lang (alle anderen Sprachkürzel waren bei mir 2 Zeichen lang). Deshalb springt das Programm hier nicht in die if-Abfrage rein und deshalb fehlt auch der / vor dem Pfad. Wenn ich den Code ändere, so dass >= 1 steht statt nur > 1, geht es wunderbar:
# if (\strlen($baseUrlPath) > 1 && strpos($baseUrlPath, '/') !== 0) {
if (\strlen($baseUrlPath) >= 1 && strpos($baseUrlPath, '/') !== 0) {
$baseUrlPath = '/' . $baseUrlPath;
}
Ich weiß allerdings nicht, warum sich der Entwickler dort für das > 1 entschieden hat - ob es eine bewusste Entscheidung war oder ob er das = nur vergessen hat. Soweit ich grob getestet habe, scheint eine Änderung in >= keine Probleme zu bereiten (ich habe aber mich aber wirklich nur grob durchgeklickt).
Warum der Language-Switch nur bei bestimmten Seiten-Typen nicht funktioniert hat liegt übrigens daran, dass dort das Programm nicht in die if-Abfrage in Zeile 216 springt:
if (isset($resolved['canonicalPathInfo'])) {
Wenn es sich um einen Fehler im Code handelt, könnte dieser also ggf. mit einem = behoben werden. Das müssten die Entwickler mal prüfen.
Wenn es einen Grund hat, warum es > und nicht >= heißt, sollte bei der Eingabe der Domain-URL im Adminbereich von Shopware erzwungen werden, dass der URL-Teil hinter dem letzten / aus mindestens 2 Zeichen besteht inkl. einem Hinweis, damit niemand mehr in dieses Problem rennt.
Hallo,
da dies ja ein Community Forum ist und kein Servicekanal, sollte dieser Featurewunsch oder die Meldung des Fehlers, je nachdem, was es ist, eher hier rein, wenn es sich Shopware mal ansehen soll: https://issues.shopware.com .
Grüße
Sebastian
Danke für den Hinweis. Du hast natürlich Recht. Ich hab ein Ticket dazu angelegt: Shopware Issuetracker