werlitz
I'm new here

Sprachumschaltung bei gefilterten Content-Projektionen

Wir möchten eine Sprachumschaltung auf Detail-Seiten (ein Datensatz pro Seite) einer Content-Projektion bereitstellen.

Dabei muss berücksichtigt werden, dass ein Datensatz sprachabhängige Parameter besitzt, die steuern, ob dieser Datensatz als Seite generiert wird. Wir nutzen also sprachabhängige Queries zur Einschränkung der Content-Projektion. Dies funktioniert soweit gut, so dass für ein Datensatz, der in einer Sprache nicht vorliegt, auch keine Seite in der jeweiligen Sprache erzeugt wird und diese in der Sitemap nicht auftaucht.

Bei der Sprachumschaltung wird mit den Standardmitteln die Beschränkung der Datensätze pro Sprache aber nicht berücksichtigt:

  • otherlang.shouldGenerate == true
  • #global.page.isTranslated(otherlang.abbreviation.upperCase) == true
  • CMS_REF(#global.ref, lang: otherlang, abs:2)$ liefert auch eine URL, die aber nicht generiert wird

Wie kann man möglichst effizient und generisch erkennen (möglichst ohne extra datensatzspezfisiche Query), dass die Sprachumschaltung für einen Datensatz nicht angeboten werden darf, da dieser durch die Projektions-Regeln nicht generiert wird?

0 Kudos
8 Replies
rbitdd
Returning Responder

Hallo Mathias,

Ihr habt doch sicher je Datensatz einen Wert (z.B. Radio-Button), der euch sagt, ob der Datensatz übersetzt ist oder nicht. Wenn ich das richtig sehe, dann müsste doch "nur noch" dieser in der Abfrage auch überprüft werden, oder übersehe ich was?

Liebe Grüße

Diana

0 Kudos

Hallo Diana,

ja genau. In den Queries (Query in der Struktur für die Content-Projektion) wird dieser Schalter ja bereits berücksichtigt und das funktioniert auch bei der Generierung und in der Sitemap.

Wenn jetzt der Datensatz nur in deutsch aber nicht in englisch vorliegt, wird mit den Standard-Mitteln  der Link auf der deutschen Seite auch zur Sprachumschaltung auf die englische Seite erzeugt. Diese wird aber gar nicht generiert. Auf der Seite entsteht also ein fehlerhafter Link.

Ich könnte auf der Projektionsseite den Schalter im Datensatz explizit prüfen und dann die Sprachumschaltung nicht zulassen, dann muss ich diese Logik aber für alle Datenquellen individuell schreiben.

Möglicherweise gibt es ja aber einen generischen Weg, da die Datensätze, für die tatsächlich eine Seite pro Sprache generiert wird, im System ja bereits bekannt sind (z.B. Sitemap)?

0 Kudos

Hallo Mathias,

ich glaube an dem von dir beschriebenen Weg kommst du nicht vorbei (Also Sprachumschaltung nur zulassen, wenn Ziel Sprache durch Radio-Button als übersetzt makiert ist).

Was ich nicht ganz verstehe, ist was du mit "Logik aber für alle Datenquellen individuell schreiben" meinst?

Oder spricht was dagegen die Logik in eine Formatvorlage zu packen?

Grüße

Jan

0 Kudos

Hallo Jan,

ich meine damit, dass wenn ich dann im Template auf ein ganz bestimmtes Feld zurückgreifen muss bzw. die Logik des Filters/Query im Template noch einmal nachimplementieren muss. Wenn jetzt in verschiedenen Tabellen andere Felder eine Rolle spielen, muss das eben individuell umgesetzt werden.

Ich hatte gehofft, da die Projektions-Queries in der Struktur diese Logik als SQL-Statements bereits enthalten und diese ja auch bei der Projektion und der Sitemap Anwendung finden, diese Regeln im Template nicht noch einmal schreiben zu müssen.

Hintergrund: wir verwendet im Projekt für alle Seitentypen/Seitentemplates ein zentrales Render-Template für den Seitenheader in dem auch die Sprachumschaltung integriert ist.

0 Kudos

Hallo Mathias,

könntest du vielleicht die Logik posten, die bei der Projektion und der Sitemap verwendet wird?

Grüße

Jan

0 Kudos

Die Projektion wird über eine Query gesteuert:

<QUERY entityType="newshub_entries">

    <AND>

        <OR>

            <IS_NULL attribute="is_press_release"/>

            <NEQ attribute="is_press_release" datatype="java.lang.Boolean" value="true"/>

        </OR>

        <EQ attribute="publish_%lang%" datatype="java.lang.Boolean" value="true"/>

        <OR>

            <IS_NULL attribute="time_from"/>

            <LTE attribute="time_from" datatype="de.espirit.common.Now" value="1455540411802"/>

        </OR>

        <OR>

            <IS_NULL attribute="time_to"/>

            <GTE attribute="time_to" datatype="de.espirit.common.Now" value="1455540411802"/>

        </OR>

    </AND>

    <ORDERCRITERIA attribute="date_%lang%" descending="1"/>

</QUERY>                                                                                                              

Die Sitemap wird über die Navigation-Funktion generiert:

 <CMS_FUNCTION name="Navigation" resultname="googleSitemap">

  <CMS_PARAM name="expansionVisibility" value="all"/>

  <CMS_PARAM name="wholePathSelected" value="0"/>

  <CMS_PARAM name="siteMap" value="1"/>

  <CMS_PARAM name="multiPages" value="1"/>

  <CMS_ARRAY_PARAM name="pageRefRendering">

   <CMS_ARRAY_ELEMENT index="0..14"><![CDATA[

   $-- Content Projektions-Seiten durch CMS_PARAM name="siteMap" mit berücksichtigen:

       Alle normalen Seiten (isFirst), EINZEL-Detail-Seiten aus Content-Projektion (entitiesPerPage == 1) und ERSTE-Paginations-Übersichts-Seiten (isFirst) berücksichtigen; Paginierungsseiten werden nicht ausgegeben --$

   $CMS_IF(#nav.ref.pageParams.isFirst || #nav.ref.node.getMultiPageParams(#global.language,#global.templateSet).entitiesPerPage == 1)$

    <url>

      <loc>$CMS_VALUE(pt_content_server,default:"")$$CMS_RENDER(template:"render_internal_link", pageref:#nav.ref)$</loc>

    </url>

   $CMS_END_IF$

   ]]></CMS_ARRAY_ELEMENT>

  </CMS_ARRAY_PARAM>

</CMS_FUNCTION>

Ich habe inzwischen eine Tabellenspezifische Lösung implementiert, da ich keine andere Lösung gefunden habe. Diese funktioniert in etwa so:

Normale Seiten:

$CMS_SET(#global.pageContext["pc_translatedLanguages"], [])$

$CMS_FOR(for_lang, #global.project.languages)$

    $CMS_SET(void, if(for_lang.shouldGenerate && #global.page.isTranslated(for_lang.abbreviation.upperCase),pc_translatedLanguages.add(for_lang)))$

$CMS_END_FOR$

Content-Projektionsseite für die Tabelle mit Logik des Queries (siehe oben):

$CMS_SET(#global.pageContext["pc_translatedLanguages"], [])$

$CMS_FOR(for_lang, #global.project.languages)$

    $CMS_SET(void, if((set_newshub_entry.getValue("publish_"   + for_lang.abbreviation) == true) &&

                         (set_newshub_entry.time_from == null || #global.now.after(set_newshub_entry.time_from)) &&

                         (set_newshub_entry.time_to   == null || #global.now.before(set_newshub_entry.time_to)),

                         pc_translatedLanguages.add(for_lang)))$

$CMS_END_FOR$

Hallo Mathias,

ein Vorschlag wäre an der Stelle, wo der Link generiert wird folgendes einzubauen

#global.dataset.getFormData().tt_languageChannel.filter(x -> x.getValue().equals(for_lang.getAbbreviation)).isEmpty)$

Wobei tt_languageChannel ein CMS_INPUT_CHECKBOX ist, in der angegeben wird, welche Sprache übersetzt ist.

So wie ich dich verstanden habe, ist das aber nicht so weit von deinem Ansatz entfernt. Der eigentlich Wunsch, dass ganze ohne spezielle Behandlung für Datensätze zu machen ist mir nicht bekannt.

Grüße

Jan

Hallo Jan-Philipp,

danke für deine Unterstützung. Wichtig war mir die Bestätigung, dass dir auch keine Variante ohne spezielle Behandlung für Datensätze bekannt ist.

Viele Grüße,

Mathias

0 Kudos