puzzle / decidim-zuerich

Mitwirkungsportal für die Stadt Zürich, basierend auf Decidim
https://mitwirken.stadt-zuerich.ch
GNU Affero General Public License v3.0
7 stars 2 forks source link

Automatische Übersetzungen #331

Closed innosmith closed 1 year ago

innosmith commented 2 years ago

Wir hätten gerne eine Aufwandsschätzung, um für die beiden Zürcher Tenants Texteingaben automatisch nach DE/EN übersetzen zu lassen. Ev. zukünftig weitere Sprachen, wenn sich dieses Erweiterung bewährt.

Automatische Übersetzungen mittels APIhttps://docs.decidim.org/en/develop/machine_translationshttps://meta.decidim.org/processes/roadmap/f/122/proposals/12306

Wichtiges • Bedingt vordefinierte Sprachen pro Tenant (DE/EN), welche dann zur Laufzeit übersetzt werden • Kann pro Org im Backend als Admin konfiguriert werden • Texte werden übersetzt, sobald kreiert (Google Translate im Browser übersetzt erst nach Aufruf einer Seite) • Deepl API als Bsp. https://www.deepl.com/de/pro-api?cta=header-pro-api/

Kostenpunkt (Annahmen) • Wenige Tage Entwicklung inkl. Testing basierend auf bestehender Implementation von jemand anderem, bspw. OpenSourcePolitics • Allenfalls laufende Kosten zur Nutzung des Übersetzungs-Service (siehe Bsp. Deepl)

Beispielehttps://futureu.europa.eu/https://www.participate.nyc.gov/https://meta.decidim.org/processes/roadmap/f/122/proposals/16402

Technische Linkshttps://github.com/OpenSourcePolitics/decidim-nyc (New York City) • https://github.com/search?q=org%3AOpenSourcePolitics+TranslatableResource&type=code

@larsUE bei Bedarf bitte ergänzen, ist so mit Werner abgesprochen. Vermutlich dann über die Mitwirkungsplattform umsetzen.

bsantschi commented 2 years ago

Aufwandschätzung:

carlobeltrame commented 1 year ago

Aufwandschätzung: 2 - 3 PT, hauptsächlich wegen Anbindung eines bisher noch unbekannten Drittsystems.

Achtung: Es kann pro decidim-Instanz nur ein Übersetzungs-Service konfiguriert werden, der dann pro Tenant ein- oder ausgeschaltet werden kann. Also wenn meinquartier.zuerich Deepl einbauen will, dann kann mitwirken.stadt-zuerich.ch nur dieselbe Deepl-Anbindung nutzen oder gar keine. Für unterschiedliche API-Keys (für separate Abrechnung der Kosten bei Deepl) oder gar unterschiedliche Übersetzungs-Services müssten wir extra Aufwand betreiben. Ich berechne hier mal nur den Aufwand für separate API-Keys pro Tenant mit ein.

Anmerkung: Die bestehenden Texte auf der Plattform werden mit dieser Anbindung nicht automatisch im Hintergrund übersetzt. Nur beim Speichern eines Inhalts wird der Übersetzungs-Mechanismus angekickt. Gemäss Anthony könnte man auch von Hand durchgehen und alle Inhalte einmal speichern. Es könnte aber sein dass einzelne Inhalte (z.B. Vorschläge in einer Vorschlags-Komponente) nicht einfach so editierbar / neu speicherbar sind.

Zur Info: Die verlinkte Dokuseite ist nicht mehr verfügbar, und ich finde sie auch nicht in der Navigation... der Text kann hier nachgelesen werden, aber sind wir sicher dass das nicht demnächst aus Decidim ausgelagert wird?

Die machine translation wurde in https://github.com/decidim/decidim/pull/6127 zu Decidim hinzugefügt.

Tech spec:

larsUE commented 1 year ago

Danke für die Aufwandschätzung! Bitte mit diesem starten, nachdem #246 durchgeführt wurde.

larsUE commented 1 year ago

Hier gibt es nun eine kleine Änderung: Aus internen Gründen sollten wir die Anbindung mit Microsoft Translator (WebsiteRuby API) statt DeepL durchführen, um langfristige Kompabilität mit den übrigen städtischen Seiten garantieren zu können.

carlobeltrame commented 1 year ago

Okay, dann haben wir leider kein 1:1 Beispiel mehr wie man das umsetzen kann. Es könnte dadurch um bis zu 1PT aufwändiger werden. Ich hoffe nicht, aber es kommt halt mehr Unsicherheit dazu, wobei ja schon in der ursprünglichen Aufwandschätzung eine gewisse Unsicherheit drin war. Ausserdem gilt, wie oben beschrieben, die Wahl des Übersetzungs-Services für alle Tenants auf einer Plattform. Das heisst MeinQuartier und die Mitwirken-Plattform müssen sich geschlossen für Microsoft Translator entscheiden, sonst gibts nochmals mehr Aufwand das tenantspezifisch umzusetzen.

larsUE commented 1 year ago

Ich schaue noch, ob ich ein 1:1 Beispiel finde. Für uns ist es ok, dass beide Tenants denselben Dienst verwenden.

larsUE commented 1 year ago

To-Do Lars: API Keys generieren/organisieren

larsUE commented 1 year ago

Keys wurden an Carlo übergeben.

carlobeltrame commented 1 year ago

Aktueller Stand: Ich habe den Code in erster Version soweit ready. Zuerst wollte ich mit https://github.com/ikayzo/microsoft_translator arbeiten, aber das verwendet wies aussieht eine veraltete API. Stattdessen machen wirs jetzt mit direkten HTTP Requests, ähnlich wie bei ASPSMS. Ein von Hand gemachter curl-Request mit dem secret key 1 und der Container-Domain war erfolgreich. Was ich noch nicht hingekriegt habe, ist dass Decidim eigentlich im System Dashboard pro Tenant die Option anbieten müsste, Machine Translations zu aktivieren. Ich habe eine entsprechende Einstellung im Code gemacht, aber irgendwie werden bei mir die zusätzlichen Settings im Systems Dashboard nicht angezeigt. So oder so müssen wir das aber erst mal auf die Testumgebung deployen, um es zu testen, weil die Machine Translations stark auf Hintergrundjobs basieren, und ich bei mir lokal im Setup zur Zeit keine Hintergrundjobs laufen lassen kann (hatte noch nie Zeit das zu debuggen).

Ich würde vorschlagen dass @Kagemaru mal den Stand vom Branch ms-translator auf die Testumgebung einspielt und dann schauen wir von da aus weiter. Vielleicht funktioniert dann auch die Tenant-Einstellung, falls irgendwas an meinem lokalen Setup falsch ist. Die Keys und den API Endpoint welche als neue Env Variabeln eingerichtet werden müssen habe ich im Cryptopus abgelegt.

larsUE commented 1 year ago

@carlobeltrame super, danke! Mit diesem API gehts nicht, das ist wohl das aktuelle: https://github.com/MicrosoftTranslator/Text-Translation-API-V3-Ruby

Dann assigne ich jetzt @Kagemaru

carlobeltrame commented 1 year ago

Beim Deployen ist die WAF in ein Problem gelaufen, das ich nicht lösen kann, nur @Kagemaru.

Dafür bin ich beim Einschalten des Features noch weitergekommen: Es ist nicht im System Dashboard sondern im normalen Admin Dashboard bei den Einstellungen wo man einen Haken setzen können sollte. Sobald die WAF wieder läuft müsste das auf INT testbar sein.

larsUE commented 1 year ago

Ok, cool! Im Moment sehe ich die Änderungen im Backend und den Hinweis im Frontend, aber es wird noch nichts übersetzt.

carlobeltrame commented 1 year ago

Ah, my bad, ich hatte noch vergessen die Credentials komplett bis in den Hintergrundjob durchzureichen. Kannst du es jetzt nochmals probieren? Ich weiss leider selber nicht, wie das Feature aus User-Sicht funktioniert.

larsUE commented 1 year ago

Könnte ich, aber die INT ist gerade offline :)

larsUE commented 1 year ago

Hmm @carlobeltrame ich habe jetzt versucht, etwas user-generated content zu erzeugen, konnte aber noch keine Übersetzung irgendwo bewirken. Irgendwas scheint da noch nicht zu laufen.

carlobeltrame commented 1 year ago

Merci, ich schaue dann nochmals inunser Fehlerprotokoll rein. Sorry, wie gesagt kann ich das nicht wirklich auf meinem Computer testen, weil die Hintergrundjobs dort nicht funktionieren.

larsUE commented 1 year ago

Kein Problem! Ich habe noch in die Microsoft-Account Settings geblickt. Es wurden noch keine Begriffe durch den translator übersetzt, d.h. der Fehler liegt bereits irgendwo davor.

Gibt es etwas, wobei ich dich unterstützen könnte?

carlobeltrame commented 1 year ago

So, ich habe nochmals ein paar Dinge ausgemerzt. Kannst du nochmals testen?

larsUE commented 1 year ago

Das scheint zu klappen (Beispiel hier: Original auf DE, Übersetzung auf EN), juhui danke! Ich teste dann morgen noch ausführlicher. Was mir noch auffällt: Der Banner, dass Inhalte automatisch übersetzt werden, erscheint immer, auch dann, wenn nichts übersetzt wurde (z.B. in der Ursprungssprache). Könnten wir es so haben, dass dieses Banner nur dann angezeigt wird, wenn auf der Seite etwas automatisch übersetzt wurde?

Bildschirm­foto 2023-02-27 um 16 19 12
carlobeltrame commented 1 year ago

Dazu ist nichts dokumentiert, und ich bin auch nicht sicher ob Decidim sich das überhaupt irgendwie merkt... Kann aber mal im Code graben wenn du das möchtest.

innosmith commented 1 year ago

Ich habe auf INT MeinQuartier ein paar Tests gemacht, bislang aber noch keine Texte übersetzt bekommen. In den Einstellungen ist die entsprechende Option "Enable machine translations" aktiviert. Any ideas?

carlobeltrame commented 1 year ago

@larsUE ich habe glaube ich eine Lösung gefunden, und schalte diese mal auf Integration auf. Das Banner müsste dann nur noch angezeigt werden, wenn für ein Feld des angezeigten Objekts (z.B. das Feld "Titel" eines Vorschlags-Objekts) in der Datenbank irgendwelche Machine Translations vorhanden sind. Es wird aber aktuell noch nicht berücksichtigt, ob etwas in die aktuelle Sprache übersetzt wurde. Wenn der Originaltext deutsch ist und auf englisch übersetzt wurde, wird das Banner momentan also noch angezeigt, egal ob ich die Seite auf englisch oder deutsch betrachte. Wir können das noch verfeinern wenn ihr wollt, aber ich wollte mal den ersten Stand aufschalten und ausprobieren. EDIT: Das funktioniert noch nicht korrekt, jetzt wird das Banner gar nicht mehr angezeigt. Ich rolle das mal zurück.

@innosmith es werden keine Inhalte rückwirkend übersetzt. Siehe meine Anmerkung in obigem Kommentar:

Anmerkung: Die bestehenden Texte auf der Plattform werden mit dieser Anbindung nicht automatisch im Hintergrund übersetzt. Nur beim Speichern eines Inhalts wird der Übersetzungs-Mechanismus angekickt. Gemäss Anthony könnte man auch von Hand durchgehen und alle Inhalte einmal speichern. Es könnte aber sein dass einzelne Inhalte (z.B. Vorschläge in einer Vorschlags-Komponente) nicht einfach so editierbar / neu speicherbar sind.

Ich habe aber einen neuen Vorschlag erstellt, und dieser wurde übersetzt: https://test.meinquartier.zuerich/assemblies/testmqz/f/281/proposals/280?&locale=en&toggle_translations=true

carlobeltrame commented 1 year ago

Nach einigem Herumprobieren habe ich herausgefunden, was nicht funktioniert: Während Decidim das Banner anzeigt, hat es selber keinen Überblick, welche Proposals und anderen Dinge auf der Seite angezeigt werden. Um zu entscheiden, ob das Banner angezeigt werden soll, habe ich nur die Einstellung auf dem Tenant zu Verfügung. Der Tenant heisst an dieser Stelle verwirrenderweise model, was normalerweise ein allgemeiner Begriff für sämtliche Objekte in der Datenbank ist. In diesem Fall ist model aber immer der Tenant. Somit kann ich nicht einfach anhand des aktuell angezeigten Objekts entscheiden, ob gerade Machine Translations auf der Seite erscheinen oder nicht.

Es ist auch nicht immer nur ein Objekt relevant für diese Entscheidung: Auf Listen von Proposals z.B. können einige der Proposals Machine Translations haben, andere nicht. Eine verallgemeinerte Möglichkeit, alle angezeigten Datenbankobjekte auf der aktuellen Seite aufzulisten, gibt es meines Wissens nicht. Und ich kann daher nicht einmal entscheiden ob keine Objekte mit Machine Translations auf der Seite sind. Das erklärt auch, warum Decidim das nicht schon von Haus aus besser macht.

Ich sehe also leider keine Möglichkeit mehr, das Banner je nach Inhalt anzuzeigen oder nicht. Jedenfalls keine Möglichkeit, welche wenig von Decidim überschreiben müsste und bei Decidim-Updates nicht jedes Mal von Grund auf neu durchdacht werden müsste.

bsantschi commented 1 year ago

Wie wäre es, nicht mit einem Banner zu arbeiten, sondern im Text selber beim Übersetzen einen textuellen Hinweis (z.B. "automatically translated") am Ende des Textes zu speichern/anzuzeigen?

carlobeltrame commented 1 year ago

Das wäre möglich, aber es würde dann auch in kürzeren übersetzten Texten wie Vorschlagstiteln etc. greifen, nicht nur einmal pro Seite.

larsUE commented 1 year ago

Danke für die Abklärung @carlobeltrame . @bsantschi das wäre möglich für städtische Texte, wenn auch etwas aufwändig. Für User-generated content wäre das aber wohl nicht umsetzbar (z.B. bei Kommentaren)

Wäre es möglich, das Banner allgemein auf dem deutschen Sprachfile auszublenden (z.B. per CSS, obwohl ich keine sprachabhängige Klassen habe)? Dann wäre es immer da auf Englisch (aber die Chance ist sehr hoch, dass auch etwas automatisch übersetzt wurde, und immer weg auf Deutsch, wo es die user wohl eher verwirren würde.

carlobeltrame commented 1 year ago

So wie ich den Vorschlag von Bruno verstehe, würden wir diesen Hinweis automatisch hinzufügen. Der Translation Code den wir kontrollieren muss als Output ja die übersetzte Variante ausgeben. Der Vorschlag wäre, dass wir an dieser Stelle noch einen Hinweis àla " - dieser Text wurde automatisch übersetzt und könnte nicht zu 100% korrekt sein" an den maschinell übersetzten Text anhängen. Das wäre kein manueller Prozess durch euch oder die User.

Das Banner immer auszublenden wenn die ausgewählte UI-Sprache deutsch ist, geht aber auch, ja.

larsUE commented 1 year ago

Ach so, das wäre natürlich cool! Mit Blick aufs Budget: was würden die beiden Varianten aufwandsmässig bedeuten?

carlobeltrame commented 1 year ago

Automatisch Hinweis anhängen, den ihr via Term Customizer anpassen könnt: 3h Bei UI-Sprache das Banner immer verstecken: 3h

carlobeltrame commented 1 year ago

Darin eingerechnet sind jetzt aber nur diese beschriebene Iteration des Features. Wenn ihr später z.B. herausfindet, dass es einen separaten automatischen Hinweis für kürzere oder einzeilige Texte braucht (z.B. für die Vorschlagstitel will man nur "automatisch übersetzt" anhängen, statt dem längeren Satz "dieser Text wurde automatisch übersetzt und könnte nicht zu 100% korrekt sein" der dafür bei Vorschlags-Beschreibungen mehr Kontext geben könnte), kommt das dann vom Aufwand her noch dazu.

carlobeltrame commented 1 year ago

Ich habe das implementiert und auf Integration ausgerollt. Translation Key ist decidim_zuerich.translator.notice. Standard-Übersetzungen sind - automatically translated bzw. - automatisch übersetzt. Ein Leerzeichen plus dieser Text wird jetzt an alle maschinell übersetzten Texte angehängt.

larsUE commented 1 year ago

Hoi Carlo. Irgendwie klappt das noch nicht. Ich habe neue Textfelder generiert, die auch richtig übersetzt werden. Der Hinweis sehe ich jedoch noch nicht. Beispiel: https://mitwirken.integ.stadt-zuerich.ch/processes/testlars

carlobeltrame commented 1 year ago

Doch doch, hat alles geklappt. Der deutsche Originaltext wurde nicht durch den Translator angefasst. Aber die maschinelle englische Übersetzung hat den Anhang "- automatically translated" bekommen: https://mitwirken.integ.stadt-zuerich.ch/processes/testlars?locale=en Was noch nicht so schön ist, ist dass du (oder irgendwas automatisches) offenbar eine leere Zeile am Schluss angehängt hast, wodurch das "- automatically translated" relativ weit nach unten rutscht. Ich habe im Code bereits versucht, vorige Leerzeichen und Zeilenumbrüche zwischen Text und Hinweis zu entfernen, aber in diesem spezifischen Textfeld wird HTML gespeichert, und die Leerzeile besteht darum nicht aus Whitespace, sondern aus <p><br></p>, was ich nicht einfach so mit Bordmitteln wegkürzen kann.

larsUE commented 1 year ago

Hmm ja, das ist tatsächlich nicht so schön. Ich habe keinen Zeilenabstand eingefügt, das wird wohl an der Stelle zu Decidim dazugehören -> ev. kann ich das per CSS ansteuern :). Merkwürdig ist, dass das übersetzte Label im Stil des Folgetexts erscheint und nicht dem des eigentlichen Abschnitts. Zusätzlich ist mir noch aufgefallen, dass der Hinweis in der Sprache erscheint, in der ich als Admin die Plattform eingestellt habe, wenn ich den Text abschicke. Eigentlich müsste es sich doch an der Sprache der Übersetzung orientieren? Beispiel im Link oben: Der Text wurde auf Englisch übersetzt, die Hinweise erscheinen nun aber auf Deutsch

carlobeltrame commented 1 year ago

Merkwürdig ist, dass das übersetzte Label im Stil des Folgetexts erscheint und nicht dem des eigentlichen Abschnitts.

Das übersetzte Label ist einfach als einziger Teil des Textes nicht in <p> Tags eingefasst, und das CSS-Styling des Textes bezieht sich nur auf <p> Texte. Das könnte man aber mit CSS sicher hinkriegen.

Zusätzlich ist mir noch aufgefallen, dass der Hinweis in der Sprache erscheint, in der ich als Admin die Plattform eingestellt habe, wenn ich den Text abschicke. Eigentlich müsste es sich doch an der Sprache der Übersetzung orientieren? Beispiel im Link oben: Der Text wurde auf Englisch übersetzt, die Hinweise erscheinen nun aber auf Deutsch

Oh, guter Hinweis, danke. Ich habe das jetzt gefixt. Neue Texte müssten den Hinweis in der korrekten Sprache bekommen.

larsUE commented 1 year ago

Das scheint noch nicht zu funktionieren. Vielleicht hat da das Update dazwischengefunkt? Siehe: https://mitwirken.integ.stadt-zuerich.ch/processes/testlars/f/393/surveys/93?locale=en

larsUE commented 1 year ago

Wir haben nun das OK, die automatischen Übersetzungen in Betrieb zu nehmen. Die Hürden sind viel tiefer als erwartet und wir müssen auch nicht speziell auf automatisch übersetzte Beiträge hinweisen. Deshalb für die finale Umsetzung folgendes machen:

carlobeltrame commented 1 year ago

Ist auf Integration so umgesetzt.

larsUE commented 1 year ago

Wunderbar, danke! Ist getestet und kann bei Gelegenheit auf die Prod.

carlobeltrame commented 1 year ago

Ist auf Produktion ausgerollt.