Neu Anbindung DeepL über Workflow mit DotLiquid

CaptainFrost

Sehr aktives Mitglied
29. März 2019
101
54
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

Thomas_S

Sehr aktives Mitglied
2. Oktober 2012
725
122
50226 Frechern
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
54
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
185
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
185
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
185
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
92
7
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 Anbindung JTL Wawi an Speditionen Dienstleistung, Jobs und Ähnliches 0
Neu Night Star Express Anbindung JTL-ShippingLabels - Ideen, Lob und Kritik 10
Neu Anbindung von JTL zu Metro (Rechnungen werden nicht zu Metro übertragen) User helfen Usern - Fragen zu JTL-Wawi 1
Neu Anbindung der POS funktioniert nicht unter WAWI2.0.0 mit EcomData Hosting JTL-Wawi 2.0 7
Seit Update keine zweite POS-Anbindung mehr möglich JTL-Wawi 2.0 10
Neu Anbindung JTL <---> Greyhound via API funktioniert nicht sauber User helfen Usern - Fragen zu JTL-Wawi 0
Neu Anbindung eines zweiten Amazon Accounts Amazon-Anbindung - Fehler und Bugs 1
Neu JTL Pos Anbindung Button existiert nicht Einrichtung / Updates von JTL-POS 1
Neu Der-Kurier anbindung an JTL JTL-ShippingLabels - Ideen, Lob und Kritik 3
Dropshipping-Labeldruck beim Lieferanten über JTL-Wawi (Versandstandorte / Workflows) JTL-Wawi 1.10 0
Workflow Trigger bei Angebot-Import über Ameise JTL-Wawi 1.9 0
Neu Etikettendruck über Remotedesktop Fehler Arbeitsabläufe in JTL-Wawi 0
Neu JTL Shipping Fehler bei DHL Versand über WMS ? User helfen Usern - Fragen zu JTL-Wawi 2
Neu Kundenkonto über Mein-Konto nicht möglich JTL-Shop - Fehler und Bugs 4
Neu Weitere Marktplätze über Sellercentral international Listing Amazon-Anbindung - Fehler und Bugs 1
Kunde kauft über Amazon und dann über Ebay - Mailversand JTL-Wawi 1.10 10
Neu Teillieferung nur mit Rechnung über ganzen Auftrag oder ohne Rückstandsmeldung möglich Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 1
Neu Artikel Rücknahme über Kassenbon von letzter Woche in JTL-Pos JTL-POS - Ideen, Lob und Kritik 2
Neu Amazon Abgleich - seit heute 12:26Uhr keine Übernahme der Bestellungen über Worker Amazon-Anbindung - Fehler und Bugs 9
Neu welche Sync Benutzer Daten in Shop und WAWI bei neu-Hosting über JTL Allgemeine Fragen zu JTL-Shop 0
Neu PrestaShop 9 Kompatibilität des Connectors – seit über 8 Monaten keine Lösung PrestaShop-Connector 0
welche Sync Benutzer Daten in Shop und WAWI bei neu-Hosting über JTL JTL-Wawi 1.11 0
Preise lassen sich nicht importieren über Ameise JTL-Wawi 1.10 4

Ähnliche Themen