Skip to content

Commit 087781b

Browse files
committed
sync 3.14 with 3.15: fill lost translations, sync tooling
1 parent 8001fd2 commit 087781b

32 files changed

Lines changed: 16771 additions & 16720 deletions

‎.github/workflows/po-check.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ jobs:
1414

1515
steps:
1616
- name: Checkout Code
17-
uses: actions/checkout@v4
17+
uses: actions/checkout@v5
1818
with:
1919
fetch-depth: 0
2020

2121
- name: Set up Python
22-
uses: actions/setup-python@v5
22+
uses: actions/setup-python@v6
2323
with:
2424
python-version: "3.x"
2525

@@ -33,7 +33,7 @@ jobs:
3333
find . -name "*.po" -exec powrap --quiet {} +
3434
3535
- name: Commit & Push formatted PO files
36-
uses: stefanzweifel/git-auto-commit-action@v5
36+
uses: stefanzweifel/git-auto-commit-action@v6
3737
with:
3838
commit_message: "Auto-format PO files to 80 chars [skip ci]"
3939
file_pattern: "*.po"

‎.github/workflows/po-lint.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: Linting Workflow
2-
2+
# changed to 3.14, 3.15
33
on:
44
schedule:
55
- cron: '0 0 * * *'
@@ -14,7 +14,7 @@ jobs:
1414
strategy:
1515
fail-fast: false
1616
matrix:
17-
version: [ '3.14' ]
17+
version: [ '3.15' ] # version: [ '3.15', '3.14' ]
1818
continue-on-error: true
1919
steps:
2020
- uses: actions/setup-python@master

‎.github/workflows/test-build.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535
- run: git pull
3636
working-directory: ./Doc/locales/de/LC_MESSAGES
3737
- uses: sphinx-doc/github-problem-matcher@v1.1
38-
- run: make -e SPHINXOPTS="--color -D language='de' -D suppress_warnings=i18n.inconsistent_references -W --keep-going" ${{ matrix.format }}
38+
- run: make -e SPHINXOPTS="--color -D language='de' -W --keep-going" ${{ matrix.format }}
3939
working-directory: ./Doc
4040
- uses: actions/upload-artifact@master
4141
if: success() || failure()

‎.gitignore‎

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
1+
# Editor- und Systemdateien
12
*.po~
2-
# Editor und Betriebssystem
33
.DS_Store
4-
/.idea/
5-
*.po~
64

7-
# Claude-Agent
8-
/.claude/
5+
# IDE
6+
.idea/
97

10-
# Python-Umgebung
11-
/.venv/
8+
# Python
129
__pycache__/
10+
*.py[cod]
11+
.venv/
12+
13+
# Kompilierte Kataloge (werden beim Build erzeugt)
14+
*.mo
15+
16+
# Lokale Berichte unserer Werkzeuge
17+
markup_bericht.md
18+
branch_diff.md
19+
branch_diff.csv

‎CLAUDE.md‎

Lines changed: 43 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,43 @@
1-
# Übersetzungsregeln python-docs-de
2-
3-
## Sprache
4-
- Konsequent "Du"-Form
5-
- msgid (Englisch) NIE verändern, nur msgstr bearbeiten
6-
7-
## Sphinx/reST-Syntax
8-
- `:ref:`Anzeigetext <ziel>`` → nur Anzeigetext übersetzen, Ziel bleibt Englisch
9-
- `:class:`/:func:`/:meth:`/:attr:`/:mod:`/:exc:`/:const:`/:keyword:`/:program:`/:pep:`/:kbd:`X`` ohne <...> → X bleibt unverändert
10-
- `~`-Präfix (z.B. `:meth:`~object.__lt__``) → kompletter Ausdruck inkl. ~ unverändert
11-
- `!`-Präfix (z.B. `:mod:`!string``) → nur Verlinkung unterdrückt, Bezeichner unverändert
12-
- Backticks sauber schließen, kein Leerzeichen davor
13-
- `::` am Satzende (leitet Codeblock ein) bleibt stehen
14-
- Zitierte Originaltitel aus externen Standards (z.B. Unicode Standard "Default Case Folding") bleiben unübersetzt in Anführungszeichen
15-
- Platzhalter/Makros (%s, {0}, <TRANSLATION_REPO_>) unverändert
16-
17-
## Code-/REPL-Beispiele
18-
- Reiner Code, Ausgaben, Tracebacks: unverändert
19-
- NUR `#`-Kommentare darin übersetzen
20-
- msgstr immer identisch zu msgid befüllen, NIE leer lassen (auch bei reinem Code)
21-
22-
## Fuzzy-Flags
23-
- Nach Prüfung/Übersetzung entfernen
24-
- Datei-Header-fuzzy (über leerem msgid "") ist reine Altlast, ohne Prüfung löschbar
25-
26-
## Terminologie (unübersetzt lassen)
27-
Dictionary, Tuple, List Comprehension, Sentinel, Lazy Import, Property,
28-
Slice, Type Hints, f-string/f-String, t-string/T-String, Whitespace (Singular),
29-
Subclassing, API, Repository, Wheel
30-
31-
## Terminologie (feste Übersetzung)
32-
- frozen... → unveränderlich (NICHT "eingefroren")
33-
- picklable → picklebar
34-
- I/O (NICHT E/A)
35-
- locale → Ländereinstellung
36-
- presentation type → Darstellungstyp
37-
- String (als Datentyp) → Zeichenkette
38-
- Debug/Conversion/Format specifier → Debug-/Konvertierungs-/Formatbezeichner
39-
- rich comparisons → erweiterte Vergleichsoperationen
40-
- generic over → "Typparameter" bei mehreren festen Parametern (z.B. dict: zwei),
41-
"hinsichtlich des Typs" bei genau einem Parameter (list/set/frozenset/memoryview),
42-
Plural "Typen" bei variabler Anzahl (tuple)
43-
44-
## PO-Datei-Struktur
45-
- Genau ein leerer msgid ""-Header mit charset=UTF-8 pro Datei
46-
- Zeilenlänge ~80 Zeichen (powrap via CI erledigt das automatisch bei Push)
47-
- Vor Push immer lokal prüfen: find . -name "*.po" -not -path "./c-api/*" -exec msgfmt --check {} -o /dev/null \;
48-
49-
## Core-Dateien (Pflicht für Sprachschalter-Aufnahme)
50-
Nur: bugs.po, library/functions.po, tutorial/*.po
1+
# Übersetzungsregeln für python-docs-de
2+
3+
Dieses Repository enthält die deutsche Übersetzung der Python-Dokumentation
4+
als Gettext-Dateien (`.po`). Übersetzt wird ausschließlich der `msgstr`.
5+
6+
## Sprache und Terminologie
7+
- Durchgehend „Du"-Form, niemals „Sie"
8+
- „Built-in" → „integriert"
9+
- „dictionary" → „Dictionary" (nicht „Wörterbuch")
10+
- „string" → „Zeichenkette" (nicht „String" oder „Zeichenfolge")
11+
- „iterable" → „iterierbares Objekt"
12+
- Funktionsbeschreibungen in der 3. Person: „Gibt … zurück"
13+
- Deutsche Anführungszeichen „…“, nie um Rollen oder Code herum
14+
- „unraisable exception" → „nicht weiterleitbare Ausnahme
15+
(unraisable exception)" beim ersten Vorkommen, danach kurz
16+
- „free-threaded build" → „Build mit freien Threads" (laut Glossar)
17+
- Bei Fachbegriffen ist `glossary.po` maßgeblich. Im Zweifel dort
18+
nachschlagen, bevor ein Begriff neu übersetzt wird.
19+
20+
## reST- und PO-Syntax
21+
- `msgid` NIEMALS ändern, auch nicht bei Tippfehlern im Original
22+
- Rollen (`:func:`, `:class:`, `:ref:`, `:term:`, `:meth:`, `:exc:`)
23+
exakt übernehmen; Anzahl und Reihenfolge müssen msgid und msgstr
24+
entsprechen
25+
- Bei `:term:` und `:ref:` mit deutschem Anzeigetext immer das Ziel
26+
angeben: `:term:`Sequenz <sequence>``
27+
- Parameternamen zwischen Sternchen bleiben englisch: *maxsplit*
28+
- Nach `` ` `` oder `*` nie direkt ein Buchstabe oder Bindestrich
29+
(kein `*m*s`, kein `:class:`X`-Instanz`)
30+
- Vor einer Rolle immer ein Leerzeichen
31+
- Code-Literale, Programmausgaben und `::` am Zeilenende unverändert
32+
- `#, fuzzy` nach dem Übersetzen entfernen
33+
34+
## Prüfungen nach jedem Abschnitt
35+
powrap <datei>
36+
msgfmt --check -o /dev/null <datei>
37+
sphinx-lint <datei>
38+
python3 check_roles.py <datei>
39+
40+
Gemeldete Fehler beheben und die Prüfungen erneut ausführen –
41+
höchstens drei Versuche. Bleiben danach Fehler bestehen: nicht
42+
committen, sondern die betroffenen Einträge und die Fehlermeldungen
43+
auflisten und auf Rückmeldung warten.

‎TRANSIFEX-TRANSLATION.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,7 @@ msgstr ""
101101
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
102102
```
103103

104+
Die Zeilen `msgid ""` und `msgstr ""` gehören zwingend dazu – fehlen sie,
105+
bricht `msgcat` mit einem Syntaxfehler ab. Und es darf genau **einen** solchen
106+
Kopfblock pro Datei geben; das PyCharm-Gettext-Plugin hat schon mehrfach
107+
weitere ans Dateiende angehängt.

‎check_roles.py‎

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import re
1010
import sys
1111
from pathlib import Path
12-
from collections import Counter
1312

1413
ROLE_RE = re.compile(r":([a-zA-Z][\w-]*):`([^`]+)`")
1514

@@ -88,23 +87,15 @@ def check_file(path: Path) -> list[str]:
8887
continue
8988
orig_roles = extract_roles(msgid)
9089
trans_roles = extract_roles(msgstr)
91-
anzahl_quelle = Counter(orig_roles)
92-
anzahl_ziel = Counter(trans_roles)
93-
if anzahl_quelle != anzahl_ziel:
90+
if orig_roles != trans_roles:
91+
missing = [r for r in orig_roles if r not in trans_roles]
92+
extra = [r for r in trans_roles if r not in orig_roles]
9493
parts = []
95-
for rolle in anzahl_quelle:
96-
if anzahl_quelle[rolle] > anzahl_ziel[rolle]:
97-
parts.append(
98-
f"fehlt: {rolle} "
99-
f"({anzahl_quelle[rolle]}x im msgid, {anzahl_ziel[rolle]}x im msgstr)"
100-
)
101-
for rolle in anzahl_ziel:
102-
if anzahl_ziel[rolle] > anzahl_quelle[rolle]:
103-
parts.append(
104-
f"zusätzlich/falsch: {rolle} "
105-
f"({anzahl_ziel[rolle]}x im msgstr, {anzahl_quelle[rolle]}x im msgid)"
106-
)
107-
findings.append(f" Zeile ~{lineno}: " + "; ".join(parts))
94+
if missing:
95+
parts.append(f"fehlt: {missing}")
96+
if extra:
97+
parts.append(f"zusätzlich/falsch: {extra}")
98+
findings.append(f" Zeile ~{lineno}: {', '.join(parts)}")
10899
return findings
109100

110101

0 commit comments

Comments
 (0)