weekly.py

Deutsche Fassung der GalNet-Wochenberichte (Listen kleiner Fraktionen) nach festen Satzmustern; unbekannte Sätze brechen mit Fehler ab.

Ablage beim Arbeiten: translations/src/weekly.py. Herunterladen: auf den Dateinamen über dem Code klicken.

weekly.py
"""weekly.py – deutsche Fassung der GalNet-Wochenberichte (Listen kleiner Fraktionen) nach festen Satzmustern.
Unbekannte Saetze -> ValueError (dann von Hand uebersetzen). Listeneintraege (Fraktionsnamen) bleiben englisch."""
import re
def n(x): return x.replace(',', '.')
P = [
 (r"Data is correct at time of publishing\.?", "Die Daten entsprechen dem Stand bei Veröffentlichung."),
 (r"\* Data is correct at time of publishing\.?", "* Die Daten entsprechen dem Stand bei Veröffentlichung."),
 (r"Expansion occurs when a minor faction reaches a sufficient influence rating and there is a populated system within striking distance\. The act of expansion is a costly one,? and the wealth and development rating suffers during the period of expansion\.",
  "Zu einer Expansion kommt es, wenn eine kleinere Fraktion genug Einfluss gewonnen hat und sich ein bewohntes System in Reichweite befindet. Eine Expansion ist kostspielig; Wohlstand und Entwicklungsstand leiden während dieser Zeit."),
 (r"In the early hours of tomorrow morning \(([\d.]+)am GMT ?\),? the GalNet monitoring of powers' activities will go offline for a short period (?:while the latest data is assembled|to assemble the latest data)\.",
  lambda m: f"Morgen früh um {m[1].replace('.', ':')} Uhr (GMT) geht die GalNet-Beobachtung der Aktivitäten der Mächte kurzzeitig offline, während die neuesten Daten zusammengestellt werden."),
 (r"Any pilots who operate for (?:one|any) of the powers (?:must|should ensure that they) deliver any cargo or vouchers before this time (?:to ensure|for) their activities (?:are|to be) registered\.",
  "Piloten, die für eine der Mächte tätig sind, sollten ihre Fracht oder Gutscheine vorher abliefern, damit ihre Aktivitäten erfasst werden."),
 (r"This weekly roundup highlights some of the minor factions pursuing the dream of democratic freedom by holding elections\.",
  "Diese wöchentliche Übersicht stellt einige der kleineren Fraktionen vor, die mit Wahlen den Traum von demokratischer Freiheit verfolgen."),
 (r"Here are (\d+) of the ([\d,]+) minor factions holding elections:", lambda m: f"Hier sind {m[1]} der {n(m[2])} kleineren Fraktionen, die Wahlen abhalten:"),
 (r"Elections occur when two minor factions of a similar political structure resolve a conflict over ownership and influence within a system\.",
  "Wahlen finden statt, wenn zwei kleinere Fraktionen mit ähnlicher politischer Ausrichtung einen Konflikt um Besitz und Einfluss in einem System austragen."),
 (r"In this weekly digest, the latest GalNet data is compiled to show the economic state of a short list of minor factions and the star systems they inhabit\.",
  "In diesem wöchentlichen Überblick werden die neuesten GalNet-Daten zusammengestellt, um die wirtschaftliche Lage einer kleinen Auswahl kleinerer Fraktionen und ihrer Sternsysteme zu zeigen."),
 (r"Here are (\d+) of the ([\d,]+) minor factions currently enjoying an economic boom:", lambda m: f"Hier sind {m[1]} der {n(m[2])} kleineren Fraktionen, die derzeit einen Wirtschaftsboom erleben:"),
 (r"When in boom, the wealth of a system is increased for the duration and all trade missions have double the effect on influence\. Boom can also positively increase a minor faction's influence\. Boom can be entered by consistent trade profits and completed trade contracts\. Booms tend to last until they naturally expire or until some other indicator takes precedence, such as famine\.",
  "Während eines Booms steigt der Wohlstand eines Systems, und alle Handelsmissionen wirken sich doppelt auf den Einfluss aus. Ein Boom kann auch den Einfluss einer kleineren Fraktion stärken. Zu einem Boom kommt es durch beständige Handelsgewinne und erfüllte Handelsaufträge. Ein Boom dauert in der Regel, bis er von selbst ausläuft oder ein anderer Zustand Vorrang erhält, etwa eine Hungersnot."),
 (r"Here are (\d+) of the ([\d,]+) factions currently experiencing economic bust:", lambda m: f"Hier sind {m[1]} der {n(m[2])} Fraktionen, die derzeit eine Rezession erleben:"),
 (r"The wealth of a system diminishes while in bust and the minor faction's influence is also lessened\. The effect of trade contracts and actions do not contribute to boom while a bust is active\. A bust generally has to run its course before ending\.",
  "Während einer Rezession sinkt der Wohlstand eines Systems, und auch der Einfluss der kleineren Fraktion nimmt ab. Handelsaufträge und -aktivitäten tragen in dieser Zeit nicht zu einem Boom bei. Eine Rezession muss in der Regel ihren Lauf nehmen, bevor sie endet."),
 (r"In this weekly report, the latest GalNet data is assembled to present ten minor factions experiencing civil unrest or lockdown in their systems(?: \(\*\))?\.(?: \(\*\)\.?)?",
  "In diesem wöchentlichen Bericht werden die neuesten GalNet-Daten zusammengestellt, um zehn kleinere Fraktionen vorzustellen, in deren Systemen Unruhen oder eine Abriegelung herrschen."),
 (r"Here are (\d+) of the ([\d,]+) minor factions in lockdown:", lambda m: f"Hier sind {m[1]} der {n(m[2])} kleineren Fraktionen im Ausnahmezustand:"),
 (r"Lockdowns increase the security rating for a system but also have a negative effect on the system's wealth\. Increased bounty hunting activity can shorten the lockdown period\.",
  "Eine Abriegelung erhöht die Sicherheit eines Systems, wirkt sich aber negativ auf seinen Wohlstand aus. Verstärkte Kopfgeldjagd kann die Abriegelung verkürzen."),
 (r"Here are (\d+) of the ([\d,]+) minor factions experiencing civil unrest:", lambda m: f"Hier sind {m[1]} der {n(m[2])} kleineren Fraktionen, in deren Systemen Unruhen herrschen:"),
 (r"Civil unrest is caused by illegal activity within the system as well completing contracts from more nefarious sources\. The wealth rating and standard of living will suffer when a system contains civil unrest\. Combat missions and activities can be utilised to end civil unrest\.",
  "Unruhen entstehen durch illegale Aktivitäten im System und durch Aufträge aus zwielichtigen Quellen. Wohlstand und Lebensstandard leiden, solange Unruhen herrschen. Kampfmissionen und -aktivitäten können die Unruhen beenden."),
 (r"Each week,? GalN[ae]t presents a (?:short )?list of (\d+) of the ([\d,]+) minor factions currently expanding into new systems(?: \(\*\))?\.?",
  lambda m: f"Jede Woche stellt GalNet {m[1]} der {n(m[2])} kleineren Fraktionen vor, die sich derzeit in neue Systeme ausbreiten."),
 (r"This weekly report typically covers some of the minor factions experiencing significant health issues, such as famine and outbreaks\. At the time of writing, however, outbreaks have not been reported among any minor factions\.",
  "Dieser wöchentliche Bericht stellt normalerweise kleinere Fraktionen mit ernsten gesundheitlichen Problemen wie Hungersnöten oder Seuchenausbrüchen vor. Zum Zeitpunkt der Veröffentlichung wurden jedoch bei keiner kleineren Fraktion Ausbrüche gemeldet."),
 (r"This weekly transmission (?:lists|takes the latest GalNet data and lists) some of the systems currently in conflict around the galaxy(?:, based on the latest data)?\.(?: \(\*\)\.?)?",
  "Diese wöchentliche Übertragung nennt einige der Systeme, in denen derzeit Konflikte herrschen – auf Grundlage der neuesten Daten."),
 (r"(?:Here|These) are (\d+) of the ([\d,]+) minor factions involved in a civil war:", lambda m: f"Hier sind {m[1]} der {n(m[2])} kleineren Fraktionen, die in einen Bürgerkrieg verwickelt sind:"),
 (r"Civil wars (?:involve conflict|take place) between minor factions in the same system over ownership of major assets (?:such as|like) starports\. During civil wars,? only combat missions and activities help bring the conflict to a resolution\. Security, development level and standard of living indicators all drop for the duration of the civil war\.",
  "Bürgerkriege sind Konflikte zwischen kleineren Fraktionen desselben Systems um wichtige Besitztümer wie Sternenhäfen. Während eines Bürgerkriegs tragen nur Kampfmissionen und -aktivitäten zu seinem Ende bei. Sicherheit, Entwicklungsstand und Lebensstandard sinken für die Dauer des Bürgerkriegs."),
 (r"(?:Here are|The following are) (\d+) of the ([\d,]+) +minor factions at war:", lambda m: f"Hier sind {m[1]} der {n(m[2])} kleineren Fraktionen, die sich im Krieg befinden:"),
 (r"Wars occur when a minor faction invades another star system\. For the duration of the conflict,? (?:wealth, security and standard of living|standard of living, wealth and security) are all severely impacted\. Combat missions and activities determine who wins the war\. If no winner emerges,? (?:then )?the war (?:will )?ends? in a ceasefire\.",
  "Kriege entstehen, wenn eine kleinere Fraktion in ein anderes Sternsystem einfällt. Für die Dauer des Konflikts leiden Wohlstand, Sicherheit und Lebensstandard schwer. Kampfmissionen und -aktivitäten entscheiden, wer den Krieg gewinnt. Gibt es keinen Sieger, endet der Krieg mit einem Waffenstillstand."),
]
TITLES = {'GalNet Weekly Conflict Report': 'GalNet: Wöchentlicher Konfliktreport', 'GalNet Weekly Expansion List': 'GalNet: Wöchentliche Expansionsliste',
          'GalNet Weekly Economic Report': 'GalNet: Wöchentlicher Wirtschaftsreport', 'GalNet Weekly Security Digest': 'GalNet: Wöchentlicher Sicherheitsüberblick',
          'GalNet Focus on Democracy': 'GalNet: Demokratie im Fokus', 'GalNet Weekly Health Hotspots': 'GalNet: Wöchentliche Gesundheits-Brennpunkte',
          'GalNet Weekly Powers Update Incoming': 'GalNet: Wöchentliches Update der Mächte steht bevor'}
def translate(body, extra=None):
    out = []
    for line in body.split('\n'):
        l = line.strip()
        if not l: continue
        for pat, de in P + list((extra or {}).items()):
            m = re.fullmatch(pat, l)
            if m:
                out.append(de(m) if callable(de) else de); break
        else:
            if len(l.split()) <= 7 and (not l.endswith('.') or re.search(r'\b(Corp|Ltd|Inc|Co|Ind)\.$', l)):
                out.append('• ' + l)          # Fraktionsname
            else:
                raise ValueError(l)
    return '\n'.join(out)