Neu Anbindung DeepL über Workflow mit DotLiquid

CaptainFrost

Sehr aktives Mitglied
29. März 2019
101
53
Hallo,

ich bin eben dabei DeepL anzubinden um den Prozess des Übersetzen in alle Sprachen zu vereinfachen. Das funktioniert über die API mittels Webrequest.

Das anbinden war kein Problem. Getestet habe ich es mit den Artikelnamen. Der Artikelname wird übersetzt. Das Problem ist das es so ausgegeben wird:

Code:
{"translations":[{"detected_source_language":"DE","text":"Test article, size 10mm, blue"}]}

Jetzt möchte ich über Werte setzen mit DotLiquid alles entfernen außer den eigentlich übersetzten Text.

Den Ansatz habe ich von @Heinz Schrot aus einem anderen Thread, der funktioniert aber nur bedingt bei meinem Problem. Kann mir jemand helfen der sich besser mit DotLiquid auskennt?

Code:
{% assign Positionen = (Vorgang.Beschreibung.Global.Artikelname.Englisch | Split: ',') %}
{% assign Artikel = Positionen | Map: 'text' %}
{% for artikel in Artikel %}
    {% if artikel contains 'text' %}
        {% assign token = (artikel | Remove: 'text' | Replace: ' ', '' | Replace:':','' | Replace:'"','' | Trim) %}            
    {% endif %}
{% endfor %}
{{token | StripNewlines | Replace: ' ';''}}

Das wird augegeben: (vor dem Testarticle stehen dann auch immer noch viele Zeilenumbrüche und Leerzeichen?!)
Code:
Testarticle

LG
David
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: aadursun

tom10

Sehr aktives Mitglied
2. Oktober 2012
720
122
06774 Muldestausee
Wenn das Muster des übersetzten Artikelnamens immer gleich ist, sollte Folgendes funktionieren:
Code:
{%- assign aRawArtNameEng = '{"translations":[{"detected_source_language":"DE","text":"Test article, size 10mm, blue"}]}' | Split: ':' -%}

{%- assign sRawArtNameEng = aRawArtNameEng.last | Replace:  '"', '' -%}
{%- assign iArtNameEngLenght = sRawArtNameEng | Size | Minus: 3 -%}
{%- assign sArtNameEng = sRawArtNameEng | Truncate: iArtNameEngLenght, '' -%}

{{- sArtNameEng -}}

String am ":" splitten, dabei entsteht ein Array.
Das letzte Element im Array (aRawArtNameEng.last) enthält den Artikelnamen in Anführungszeichen plus der drei Klammern.
Jetzt die Anführungszeichen (die um den Artikelnamen) entfernen und ermitteln wie lang der gesamte String ist. Davon 3 abziehen (die Klammern am Ende).
Am Ende den um 3 Zeichen gekürzten String ausgeben.

oder so:
Code:
{%- assign aRawArtNameEng = '{"translations":[{"detected_source_language":"DE","text":"Test article, size 10mm, blue"}]}' | Split: ':' -%}

{%- assign aRawArtNameEng = aRawArtNameEng.last | Split: '"' -%}
{%- assign sArtNameEng = aRawArtNameEng.first -%}

{{- sArtNameEng -}}

String am ":" splitten, dabei entsteht ein Array.
Das letzte Element im Array (aRawArtNameEng.last) enthält den Artikelnamen in Anführungszeichen plus der drei Klammern.
Jetzt können wir uns zunutze machen, das der Artikelname in Anführungszeichen steht und das zum erneuten splitten nutzen. Dabei entsteht wieder ein Array das im ersten Element (aRawArtNameEng.first) nur den Artikelnamen enthält.

Welche der beiden Varianten du nimmst, spielt keine Rolle. Sollte allerdings der Artikelname ein Anführungszeichen enthalten, funktionieren beide nicht mehr.

Noch die erste Zeile in den Beispielen durch die "Richtige" ersetzen:
Code:
{%- assign aRawArtNameEng = Vorgang.Beschreibung.Global.Artikelname.Englisch | Split: ':' -%}

Die vielen Leerzeilen bekommst du mit Bindestrichen am Anfang und Ende von Funktionen und Ausgaben mehr oder weniger in den Griff:

{%- irgendwas -%}
{{- irgendwas -}}

Edit:
Bessere erste Variante, die auch mit Anführungszeichen im Artikelnamen funktioniert. So ist das mit dem vorher Überlegen .... 😄

Code:
{%- assign aRawArtNameEng = '{"translations":[{"detected_source_language":"DE","text":"Test article, size 10mm, blue "with yellow stripes""}]}' | Split: ':' -%}

{%- assign iRawArtNameEngLenght = aRawArtNameEng.last | Size | Minus: 3 -%}
{%- assign sRawArtNameEng = aRawArtNameEng.last | Truncate: iRawArtNameEngLenght, '' -%}
{%- assign sArtNameEng = sRawArtNameEng | RemoveFirst: '"' | Append: '#' | Remove: '"#' -%}

{{- sArtNameEng -}}

String am ":" splitten, dabei entsteht ein Array.
Das letzte Element im Array (aRawArtNameEng.last) enthält den Artikelnamen in Anführungszeichen plus der drei Klammern.
Jetzt ermitteln wie lang der gesamte String ist. Davon 3 abziehen (die Klammern am Ende).
Den String um 3 Zeichen kürzen.
Das erste Anführungszeichen entfernen, an den String eine '#' anhängen um dann noch das letzte Anführungszeichen ("#) zu finden und zu löschen.

Jetzt habe ich fertig ...
 
Zuletzt bearbeitet:

Xantiva

Sehr aktives Mitglied
28. August 2016
1.795
316
Düsseldorf
Wir kommst Du an den String von dem WebRequest? Das ist ein JSON-String, wenn man den deserialisieren könnte, dann könnte man das Ergebnisobjekt einer Variable zuweisen und dann direkt auf den Inhalt zugreifen.
 
  • Gefällt mir
Reaktionen: CaptainFrost

CaptainFrost

Sehr aktives Mitglied
29. März 2019
101
53
Wenn das Muster des übersetzten Artikelnamens immer gleich ist, sollte Folgendes funktionieren:
Code:
{%- assign aRawArtNameEng = '{"translations":[{"detected_source_language":"DE","text":"Test article, size 10mm, blue"}]}' | Split: ':' -%}

{%- assign sRawArtNameEng = aRawArtNameEng.last | Replace:  '"', '' -%}
{%- assign iArtNameEngLenght = sRawArtNameEng | Size | Minus: 3 -%}
{%- assign sArtNameEng = sRawArtNameEng | Truncate: iArtNameEngLenght, '' -%}

{{- sArtNameEng -}}

String am ":" splitten, dabei entsteht ein Array.
Das letzte Element im Array (aRawArtNameEng.last) enthält den Artikelnamen in Anführungszeichen plus der drei Klammern.
Jetzt die Anführungszeichen (die um den Artikelnamen) entfernen und ermitteln wie lang der gesamte String ist. Davon 3 abziehen (die Klammern am Ende).
Am Ende den um 3 Zeichen gekürzten String ausgeben.

oder so:
Code:
{%- assign aRawArtNameEng = '{"translations":[{"detected_source_language":"DE","text":"Test article, size 10mm, blue"}]}' | Split: ':' -%}

{%- assign aRawArtNameEng = aRawArtNameEng.last | Split: '"' -%}
{%- assign sArtNameEng = aRawArtNameEng.first -%}

{{- sArtNameEng -}}

String am ":" splitten, dabei entsteht ein Array.
Das letzte Element im Array (aRawArtNameEng.last) enthält den Artikelnamen in Anführungszeichen plus der drei Klammern.
Jetzt können wir uns zunutze machen, das der Artikelname in Anführungszeichen steht und das zum erneuten splitten nutzen. Dabei entsteht wieder ein Array das im ersten Element (aRawArtNameEng.first) nur den Artikelnamen enthält.

Welche der beiden Varianten du nimmst, spielt keine Rolle. Sollte allerdings der Artikelname ein Anführungszeichen enthalten, funktionieren beide nicht mehr.

Noch die erste Zeile in den Beispielen durch die "Richtige" ersetzen:
Code:
{%- assign aRawArtNameEng = Vorgang.Beschreibung.Global.Artikelname.Englisch | Split: ':' -%}

Die vielen Leerzeilen bekommst du mit Bindestrichen am Anfang und Ende von Funktionen und Ausgaben mehr oder weniger in den Griff:

{%- irgendwas -%}
{{- irgendwas -}}

Edit:
Bessere erste Variante, die auch mit Anführungszeichen im Artikelnamen funktioniert. So ist das mit dem vorher Überlegen .... 😄

Code:
{%- assign aRawArtNameEng = '{"translations":[{"detected_source_language":"DE","text":"Test article, size 10mm, blue "with yellow stripes""}]}' | Split: ':' -%}

{%- assign iRawArtNameEngLenght = aRawArtNameEng.last | Size | Minus: 3 -%}
{%- assign sRawArtNameEng = aRawArtNameEng.last | Truncate: iRawArtNameEngLenght, '' -%}
{%- assign sArtNameEng = sRawArtNameEng | RemoveFirst: '"' | Append: '#' | Remove: '"#' -%}

{{- sArtNameEng -}}

String am ":" splitten, dabei entsteht ein Array.
Das letzte Element im Array (aRawArtNameEng.last) enthält den Artikelnamen in Anführungszeichen plus der drei Klammern.
Jetzt ermitteln wie lang der gesamte String ist. Davon 3 abziehen (die Klammern am Ende).
Den String um 3 Zeichen kürzen.
Das erste Anführungszeichen entfernen, an den String eine '#' anhängen um dann noch das letzte Anführungszeichen ("#) zu finden und zu löschen.

Jetzt habe ich fertig ...
Hey Tom10,

du bist mein Held. Das funktioniert spitze. Danke für die Mühe!
Da habe ich gleich noch etwas gelernt durch deine guten Beschreibungen.


@Xantiva

Der Code des Webrequests ist folgender. Wenn das geht klingt das natürlich auch nicht schlecht.

EDIT: Habe eine Antwort vom DeepL Support. Die Antwort vom Server ist immer im JSON Format. Im Wert des Attributs 'text' , ist die Übersetzung zu finden.
Das klingt nach einer besseren und fehlerlosen Variante. Kannst du mir dabei helfen?


Code:
https://api-free.deepl.com/v2/translate?auth_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX&source_lang=DE&text={{ Vorgang.Beschreibung.Global.Artikelname.Deutsch }}&target_lang=EN-US&preserve_formatting=1
 
Zuletzt bearbeitet:

GBK

Sehr aktives Mitglied
21. Oktober 2019
184
39
Lüdinghausen
Ist zwar schon etwas älter hier, aber würde gerne meine aktuellen Erfahrungen hier einfach mal anhängen.

Der JSON String ist immer gleich, daher habe ich das Extrahieren des Textes sehr stumpf gemacht, indem ich alles bis zum Anfang des Textes per Remove entferne und anschließend den hinteren Teil per Split getrennt und den ersten Teil ausgegeben. Solange man das Splitzeichen nicht im Titel nutzt, ist das auch kein Problem. Funktioniert ganz gut:
{%- assign str = Vorgang.Sonstiges.Anmerkung | Remove: '{"translations":[{"detected_source_language":"DE","text":"' | Split: '"' -%}
{{ str[0] }}

Ja, ich weiß, das ist so natürlich sehr anfällig, aber für den Titel reicht es so aus.

Zur Kenntnis. Den hinteren Teil kann man leider nicht per Remove entfernen. Wenn } dabei sind, funktioniert der Befehl scheinbar nicht.

Nun, hier kommt jetzt das richtige Problem. Vielleicht hat ja wer Rat. Die Beschreibungen von Artikeln, gespickt mit HTML. Da geht mein Ansatz natürlich gar nicht. Wie könnte es gehen?

href="" <- blöd
&nbsp; <- blöd

Marco
 

GBK

Sehr aktives Mitglied
21. Oktober 2019
184
39
Lüdinghausen
Danke Xantiva, aber ich möchte die Elemente nicht entfernen. Die sollen lediglich für die Übersetzung ignoriert werden. Das & scheint hier das Hauptproblem zu sein, da bricht die Übersetzung bereits ab.
 

Xantiva

Sehr aktives Mitglied
28. August 2016
1.795
316
Düsseldorf
Ok, Du darfst den Text nicht einfach so in der URL verwenden. Das "&" ist ein besonderes Zeichen in einer URL. Wenn das in Deinem Text vorkommt, musst Du ein URL encode durchführen. Dabei werden die Zeichen umgewandelt / maskiert.

Ich finde aber keinen passenden Filter im JTL Guide 😢 : https://www.google.com/search?client=firefox-b-d&q=site:jtl-software.de+liquid+url+encode

Normalerweise wäre das richtig: https://shopify.github.io/liquid/filters/url_encode/

Wenn es nur das "&" ist, dann könntest Du versuchen, dass mit Suchen und Ersetzen "%26" zu umgehen.
 
  • Ich liebe es
Reaktionen: GBK

GBK

Sehr aktives Mitglied
21. Oktober 2019
184
39
Lüdinghausen
Danke, Xantiva. Das ist ein guter Hinweis. Wie konnte ich das nur übersehen :eek:

Ja, das url_encode funktioniert leider nicht. Hab's einfach mal ausprobiert. Aber die Idee mit dem Replace hat super funktioniert! Muss jetzt nur noch das Ergebnis ein wenig anpassen, dann ist's so, wie ich's brauche :D
 

mobile61

Aktives Mitglied
13. Oktober 2016
89
6
kann mir jemand diese Deepl Anbindung in meinem System ans Laufen bringen.
Aktuell noch Version 1,6.40 wird aber bald auf die 1.7.40 umgestellt.
 

TT24

Aktives Mitglied
8. Februar 2022
96
8
Wir hätten das jetzt so in

{%- assign Positionen = (Vorgang.Beschreibung.Global.Artikelname.Englisch | Split: ',') -%}
{%- assign Artikel = Positionen | Map: 'text' -%}
{%- for artikel in Artikel -%}
{%- if artikel contains 'text' -%}
{%- assign token = (artikel | Remove: 'text' | Replace:':','' | Replace:'"','' | Remove: '}]}' | Trim) -%}
{%- endif -%}
{%- endfor -%}
{{-token | StripNewlines | Replace: '';''-}}
Die Ausgabe hat ein Zeilenumbruch zu viel 62 Zeichen soll 60 Zeichen

Apple Watch 42/44/45mm Silicone Sports Strap - Cyprus Green

Hätte einer eine Idee?

Vielen Dank!
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu SUCHE Freelancer für JTL WAWI Anbindung an WooCommerce und Einrichtung Dienstleistung, Jobs und Ähnliches 2
Amazon Anbindung: Auftragsübernahme im Gange JTL-Wawi 1.11 1
Problem mit API Anbindung JTL-Wawi 1.11 2
Neu Temu-Anbindung mit JTL / Fehlermeldung beim Hochladen Onlineshop-Anbindung 1
Neu Shopify Verkaufskanal inaktiv nach Anbindung mit Shopify App Shopify-Connector 4
Neu UPS Anbindung OAuth funktioniert nicht JTL-ShippingLabels - Fehler und Bugs 0
Neu JTL mit Shopify für Etsy anstatt JTL mit Unicorn2 - hat das jemand gemacht? Anbindung, bestehende Artikel mappen? Multishop? Shopify-Connector 2
Neu OPI Anbindung bei Wireguardtunnel Allgemeine Fragen zu JTL-POS 0
Keine Datensicherung über ODBC möglich JTL-Wawi 1.10 0
Neu Kartonagen nicht mehr über Workflow auswählbar nach Update auf 1.11.3 JTL-Workflows - Ideen, Lob und Kritik 0
Neu Materialeinsatz Berechnung über EKNetto JTL Ameise - Eigene Exporte 1
Neu Übergabe Versandlaber an Fulfiller möglich über FFN standallone aber nicht über FFN mit angebundeener JTL-WAWI Arbeitsabläufe in JTL-Wawi 0
Neu Staffelpreise Variantenartikel über alle Varianten User helfen Usern - Fragen zu JTL-Wawi 0
Sammelbuchung bei Zahlungsausgang über das Zahlungsmodul JTL-Wawi 1.10 0
Überverkäufe über Workflow setzen JTL-Wawi 1.10 2
Neu Shop über verschieden Domains in gewünschter Sprache aufrufen ? Betrieb / Pflege von JTL-Shop 5
Ausliefern Workflow über API JTL-Wawi 1.9 6
Neu JTL-Shop Admin Bereich und Shop nur noch 504 Gateway Time-out ( Hosting über JTL ) User helfen Usern - Fragen zu JTL-Wawi 4
Probleme mit dem Einstellen von Artikeln auf Amazon über JTL Wawi mit dem Lister 2.0 Amazon-Lister - Fehler und Bugs 6
Neu Auftrag über WaWi versenden Arbeitsabläufe in JTL-Wawi 3
Über 100 Bestellungen von SCX nicht importiert kaufland.de - Anbindung (SCX) 1
Neu Probleme mit der Email über jtl hosting (plesk) User helfen Usern 2
Neu Fehlermeldungen beim Hochladen von Artikel über Amazon Lister 2.0 Amazon-Lister - Fehler und Bugs 1
Neu Registrierung über amazonpay nicht möglich Plugins für JTL-Shop 0
Statistik über Zahlungsmoral der Kunden / Zahlungsverzug möglich? JTL-Wawi 1.9 4
Merkmalfilter als Leiste über Artikelliste möglich??? Einrichtung JTL-Shop5 3
Neu Kein CN22 über DHL JTL-ShippingLabels - Fehler und Bugs 4
Defekt-Artikel nach Retoure über WMS nicht mehr in JTL-Wawi sichtbar JTL-Wawi 1.10 2
In Bearbeitung Kompakte Kasse gesucht mit der auch Kartenzahlung über 50 € funktioniert? JTL-POS - Fragen zu Hardware 5
Neu Zahlungsimport über CSV ... Ausgangszahlung ? JTL-Wawi - Fehler und Bugs 0
Datenbank ist über 800gb groß Hilfe !!! JTL-Wawi 1.9 23

Ähnliche Themen