Re: Asking for help: Update German translation of NR using LLM

Tina Petzel <[email protected]> Thu, 23 Jul 2026 13:32:09 +0200
Newsgroups gmane.comp.gnu.lilypond.devel,gmane.comp.gnu.lilypond.general
Message-ID <[email protected]>
--nextPartC8WVDt_AS1yEBChqaf6lEQ
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"; protected-headers="v1"
From: Tina Petzel <[email protected]>
To: [email protected], [email protected]
Cc: Werner LEMBERG <[email protected]>
Subject: Re: Asking for help: Update German translation of NR using LLM
Date: Thu, 23 Jul 2026 13:32:09 +0200
Message-ID: <[email protected]>
In-Reply-To: <[email protected]>
References: <[email protected]>
MIME-Version: 1.0

Hello Werner,

> While you can press a button in most web browsers to translate English
> pages on the fly, due to the many musical and LilyPond-specific
> technical terms there are inevitably flaws, that make the results
> misleading.  Such online translations also don't give you translated
> PDF manuals.
>=20
> I thus wonder whether a guy with LLM experience could help with
> updating the German translation of the Notation Reference =E2=80=93 or ra=
ther,
> generating a complete translation from scratch, since the German
> translation is severely outdated.  Today, websites like Google
> Translate provide translations (both German-to-English and
> English-to-German) that are nearly perfect even for quite complicated
> grammatical structures, which still amazes me.
>=20
> This is intended as an experiment that could start with a few
> chapters, say, to find out whether such an approach is feasible.  Of
> course, we would have to discuss the conditions for the LLM to get a
> good result.  In spite of the grammatical quality I expect that a lot
> of technical terms will be mistranslated; we thus have to proofread
> the results (I volunteer for that).
>=20
> What do you think?

I don=E2=80=99t thinks this solves the underlying problem. I think the prob=
lem here stems
from having individual independent documentation files, which induces a mas=
sive
workload to contributors and translators for keeping up with changes and sy=
nc them to translations.

And I think even if we were to use LLMs to automatically translate the docu=
mentation =E2=80=94 we=E2=80=98ll still need
to keep documentation synced, so someone would need to realize: Translation=
 is not up to date, so
trigger the LLM, check output, update translation. I suppose if LLMs were 1=
00% reliable we could get
rid of the localisations in the first place and translate docs on the fly, =
which would solve this. But
that is not realistic.

But then, the Documentations are filled with texts that are more or less tr=
ivial to translate, where
probably the effort of updating the translation is not more than checking t=
he output of the LLM
and potentially correcting that. The main issue in translation is keeping a=
ll changes synced up.

It would rather be thinkable have the english documentation as a master doc=
ument
and use automated tooling to create the localizations from diffs =E2=80=94 =
recognizing outdated blocks on the
fly and potentially falling back to the original English text, as is done i=
n pretty much any concept of
software localization out there.

And this would be fairly easy: Our documentation is naturally made up of no=
des looking like

```
@node Title
=2E.. content ...
```

Rather than replicating this for translations we could translate things by =
node, that is to say,
have a script collect all nodes in the main documentation, looking at the t=
ranslation pool for a
translation for the same node which would have a fingerprint of the origina=
l node annotated,
check the fingerprint, and if it matches replace the content of the node, e=
lse issue a warning
and use the original node.

E.g. for

```
@node Text
@chapter Text

@lilypondfile[quote]{snippets/text-headword.ly}

This section explains how to include text (with various
formatting) in music scores.


@node Writing text
@section Writing text

This section introduces different ways of adding text to a score.

@cindex text, other languages
@warning{To write accented and special text (such as characters
from other languages), simply insert the characters directly into
the LilyPond file.  The file must be saved as UTF-8.  For more
information, see @ref{Text encoding}.}
```

the translation could specify

```
@ignore
    source-commit: e5a609e373eae846857f9a6d70a402a3d42b7d94
    source-sha256: c746ad20e3ba4ddde5e132499c2e85a432fe0dadb875bee03b0a3980=
782a0edc
@end ignore
@node Text
@chapter Text

@lilypondfile[quote]{snippets/text-headword.ly}

Dieser Abschnitt erkl=C3=A4rt, wie man Text (mit vielf=C3=A4ltiger
=46ormatierung) in Partituren einf=C3=BCgt.

@noindent
Einige Textelemente, die hier nicht behandelt werden, finden sich
in anderen Abschnitten: @ref{Vocal music}, @ref{Titles and headers}.


@ignore
    source-commit: e5a609e373eae846857f9a6d70a402a3d42b7d94
    source-sha256: bb4896a713969c135ecd1eda8a477dcb2582291e47742cd50def8455=
d58c552b
@end ignore
@node Writing text
@section Text eingeben

Dieser Abschnitt zeigt verschiedene Arten, wie Text in die Partitur
eingef=C3=BCgt werden kann.

@cindex Text, andere Sprachen

@warning{Wenn man Zeichen mit Akzenten und Umlaute oder besondere
Zeichen (wie etwa Text mit anderen Alphabeten) eingeben m=C3=B6chte,
kann man die Zeichen einfach direkt in die Datei einf=C3=BCgen.  Die
Datei muss als UTF-8 gespeichert werden.  F=C3=BCr mehr Information
siehe @ref{Text encoding}.}
```

So now a script would take the node =E2=80=9CText=E2=80=9D in the original,=
 find the translation node =E2=80=9CText=E2=80=9D,
would check if the hash matches, and if so replace the original node by the=
 translation node.

If the translation node does not exist it would issue a warning: "Translati=
on of node `xyz` does not exists",
similar if the hash does not match it would issue a warning: "Translation o=
f node `xyz` is outdated".
Additionally the script could identify translation nodes that are no longer=
 needed.

Then the translators would get a precise pinpoint where they need to update=
 things and at any
point (even if parts of the translation are outdated) the content of the tr=
anslation is up to date.

At least for me this would make translation much easier. The biggest blocke=
r for me to just invest
a bit of time to fix up the German docs is that my brain is completely over=
whelmed by syncing
the structure.

Not saying LLMs cannot be helpful in assisting translation, especially when=
 you don=E2=80=99t speak
a language perfectly and have issues finding the right words.

Cheers,
Tina

P.S.: Translating this small part of the notation reference via chatGPT giv=
es

```
@node Text
@chapter Text

@lilypondfile[quote]{snippets/text-headword.ly}

In diesem Abschnitt wird erl=C3=A4utert, wie Text (mit verschiedenen
=46ormatierungen) in Notens=C3=A4tze eingef=C3=BCgt werden kann.

@node Text schreiben
@section Text schreiben

Dieser Abschnitt stellt verschiedene M=C3=B6glichkeiten vor, Text zu einem
Notensatz hinzuzuf=C3=BCgen.

@cindex Text, andere Sprachen
@warning{Um Zeichen mit Akzenten oder andere Sonderzeichen (z. B.
Zeichen aus anderen Sprachen) zu schreiben, f=C3=BCgen Sie diese einfach
direkt in die LilyPond-Datei ein. Die Datei muss im UTF-8-Format
gespeichert werden. Weitere Informationen finden Sie unter
@ref{Textkodierung}.}
```

which is ... well, okay, but not very well written German. Yes, by addition=
al prompt we could
get it to be more idiomatic. But still this shows that the output from some=
thing like chatGPT
is just a machine translation.
--nextPartC8WVDt_AS1yEBChqaf6lEQ
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part.
Content-Transfer-Encoding: 7Bit

-----BEGIN PGP SIGNATURE-----

iHUEABYKAB0WIQS0sdUK2Lu8of48K2+FHhaCPe7BywUCamH7uQAKCRCFHhaCPe7B
y6rvAQDl/HuVGVh90YTY31CpK/OW9brjxKYAsEdm4GuKpJ2fBwD+PzbkaaSHpjEJ
RTPdefb6IZFAULBWXicptSI0hLOTXQw=
=E8p1
-----END PGP SIGNATURE-----

--nextPartC8WVDt_AS1yEBChqaf6lEQ--