"""apply_review.py RAW JAHR -> wendet die Durchsicht (translations/review/r_*.py) auf translations/.json an und schreibt die Aenderungsliste translations/review/aenderungen_.txt (Wiki-Syntax). R[fid] = (Titel, Text, [Aenderungen]) ersetzt die Fassung; None = geprueft, keine inhaltliche Aenderung.""" import json, csv, sys, re, glob, importlib, collections from pathlib import Path sys.path.insert(0, 'translations/review') R_ = Path(sys.argv[1]); y = int(sys.argv[2]) idx = [r for r in csv.DictReader(open(R_ / 'index.csv', encoding='utf-8'), delimiter=';') if int(r['date'][:4]) == y] byday = collections.defaultdict(list) for r in idx: byday[r['date'][:10]].append(r['frontier_id']) PID = {} for d, fids in byday.items(): for n, f in enumerate(sorted(fids), 1): PID[f] = f"news:galnet:{d[:4]}:{d[5:7]}:{d[8:10]}_{n:02d}" DATE = {r['frontier_id']: r['date'][:10] for r in idx} P = f'translations/{y}.json' T = json.load(open(P, encoding='utf-8')) R = {} for f in sorted(glob.glob(f'translations/review/r{y}_*.py')): R.update(importlib.import_module(Path(f).stem).R) orig = {k: v['body'] for k, v in T.items()} MISS = [] # Glossar (ki:galnet:glossar): einheitliche Begriffe nach Frontier-DE ab 3306, auf jede geprüfte Meldung angewandt ART = {'der': 'der Föderalen Flotte', 'die': 'die Föderale Flotte', 'Der': 'Der Föderalen Flotte', 'Die': 'Die Föderale Flotte'} def _cmdr(m): # Singular vor Namen oder nach der/ein/jeder, sonst Plural (deutsch „die Commander“) if m[1] or m[2]: return (m[1] or '') + 'Kommandant' return 'Kommandanten' GLOSS = [ # Behörden wie Frontier-DE: IISS = Imperialer Interner Sicherheitsdienst, FIA = Föderaler Nachrichtendienst, FSS = Föderaler Sicherheitsdienst (r'\b(der|Der) Imperial Internal Security Service\b', r'\1 Imperiale Interne Sicherheitsdienst'), (r'\bdes Imperial Internal Security Service\b', 'des Imperialen Internen Sicherheitsdienstes'), (r'\b(dem|Dem|vom|Vom|zum|beim|den|Den) Imperial Internal Security Service\b', r'\1 Imperialen Internen Sicherheitsdienst'), (r'\bImperial Internal Security Service\b', 'Imperialer Interner Sicherheitsdienst'), (r'\b(?:des|der) Internen Imperialen Sicherheitsdienst(?:es|s)?\b', 'des Imperialen Internen Sicherheitsdienstes'), (r'\bImperiale(\w*) Innere(\w*) Sicherheitsdienst', r'Imperiale\1 Interne\2 Sicherheitsdienst'), (r'\b(der|Der) Geheimdienst der Föderation\b', r'\1 Föderale Nachrichtendienst'), (r'\b(dem|Dem|vom|Vom|zum|beim|den|Den) Geheimdienst der Föderation\b', r'\1 Föderalen Nachrichtendienst'), (r'\bdes [Ff]öderalen Geheimdienst(?:es|s)?\b', 'des Föderalen Nachrichtendienstes'), (r'\b[Ff]öderale(n|r)? Geheimdienst(es|s)?\b', lambda m: 'Föderale' + (m[1] or '') + ' Nachrichtendienst' + (m[2] or '')), (r'\bProfessor (Katrien )?Rook\b', lambda m: 'Professorin ' + (m[1] or '') + 'Rook'), (r'\bFabrikatoren\b', 'Autofabrikatoren'), (r'\bCobalt\b', 'Kobalt'), (r'\b(der|Der) Federal Security Service\b', r'\1 Föderale Sicherheitsdienst'), (r'\b(dem|Dem|vom|Vom|zum|beim|den|Den) Federal Security Service\b', r'\1 Föderalen Sicherheitsdienst'), (r"\b(?:Imperial Dawn|Imperatorendämmerung|(?:Imperialen?|Imperatorischen?) Morgen(?:röte|dämmerung))\b", "Emperor's Dawn"), (r"\b(gegen|über|für|an) die Emperor's Dawn\b", r"\1 Emperor's Dawn"), (r'^(?:Galaktische Nachrichten|Galactic News):', 'Galaktische News:'), (r'^(?:Freelancer Report|Freelance Report|Freiberuflicher Bericht|Freelancer-Bericht):', 'Freelancer-Report:'), (r'^(?:Community Goal|Gemeinschaftsziel):', 'Community-Ziel:'), (r'^(?:Powerplay|Machtspiele): (?:Wöchentlicher Bericht|Wochenbericht)$', 'Machtspiele: Wochenbericht'), (r'^Powerplay:', 'Machtspiele:'), (r'\bKumo-Besatzung\b', 'Kumo Crew'), (r'\bThargoid Raumpocken-', 'Thargoiden-Barnacle-'), (r'\bRaumpocken-', 'Barnacle-'), (r'\bRaumpocken\b', 'Barnacles'), (r'\bRaumpocke\b', 'Barnacle'), (r'\bWitch Head Nebel', 'Witch-Head-Nebel'), (r'\bInterstellaren? Landwirtschafts-Gesellschaft\b', 'Interstellar Association for Agriculture'), (r'\bILG\b', 'IAA'), (r'\bIISD\b', 'IISS'), (r'\bProfessor (Alba )?Tesreau\b', lambda m: 'Professorin ' + (m[1] or '') + 'Tesreau'), (r'\bOcellus-Sphäre-Sternenhafen\b', 'Ocellus-Sternenhäfen'), (r'\bBarnaklen-', 'Barnacle-'), (r'\b(?:Barnaklen|Baranklen)\b', 'Barnacles'), (r'\bSeepocken\b', 'Barnacles'), (r'\bSeepocke\b', 'Barnacle'), (r'\bPiraten-Lords?\b', lambda m: 'Piratenfürst' + ('en' if m[0].endswith('s') else '')), (r'\bImperatorin(?= Arissa)', 'Imperator'), (r'\bPiratenlords\b', 'Piratenfürsten'), (r'\bPiratenlord\b', 'Piratenfürst'), (r"\b(?:Entdecker|Forscher)vereinigung\b", "Explorers' Association"), (r"\bExplorer's Association\b", "Explorers' Association"), (r'\bSterne?nflughafen(s)?\b', r'Sternenhafen\1'), (r'\bSterne?nflughäfen\b', 'Sternenhäfen'), (r'\bKumo-Crew\b', 'Kumo Crew'), (r'\bSchild(?:es)? der Gerechtigkeit\b', 'Shield of Justice'), (r'\bKorrigendum\b', 'Corrigendum'), (r'\bLibertas-Kooperative\b', 'Libertas Cooperative'), (r'\bDefence Force of Amitrite\b', 'Defence Force of Amitrite'), (r'\bCerberus-(?:Seuche|Pest)\b', 'Cerberus-Plage'), (r'\bZerberus-?[Pp]est\b', 'Cerberus-Plage'), (r'\bRaumschiff Eins\b', 'Starship One'), (r'\bRaumhafen(s)?\b', r'Sternenhafen\1'), (r'\bRaumhäfen\b', 'Sternenhäfen'), (r'\bAdmiral(s)? der Flotte\b', lambda m: 'Flottenadmiral' + (m[1] or '')), (r'\bSternhäfen\b', 'Sternenhäfen'), (r'\b(der|die|Der|Die) (?:Föderationsmarine|Bundesmarine|[Ff]öderalen? Marine|Federal Navy|Föderalen? Navy|Föderal Navy)\b', lambda m: f"{m[1]} {'Föderalen' if m[1].lower() == 'der' else 'Föderale'} Flotte"), (r'\b(?:Föderationsmarine|Bundesmarine|[Ff]öderale Marine|Föderal Navy)\b', 'Föderale Flotte'), (r'\b(der|die|Der|Die) (?:[Ii]mperialen? Marine)\b', lambda m: f"{m[1]} {'Imperialen' if m[1].lower() == 'der' else 'Imperiale'} Flotte"), (r'\b[Ii]mperiale Marine\b', 'Imperiale Flotte'), (r'\bKommandeur(?:s)?\b', 'Kommandant'), (r'\bKommandeure(?:n)?\b', 'Kommandanten'), (r'(?