From 919930ed10544a14cdcf4a59b60d7ad18458b986 Mon Sep 17 00:00:00 2001 From: Peddn Date: Sun, 31 Aug 2025 12:11:08 +0200 Subject: [PATCH 1/2] basic translation --- .../base_systems/ingame_reports/menu.py | 92 ++- evennia/locale/de/LC_MESSAGES/django.mo | Bin 17991 -> 19145 bytes evennia/locale/de/LC_MESSAGES/django.po | 747 ++++++++++++++++-- 3 files changed, 738 insertions(+), 101 deletions(-) diff --git a/evennia/contrib/base_systems/ingame_reports/menu.py b/evennia/contrib/base_systems/ingame_reports/menu.py index 7759f4992b..044065e84c 100644 --- a/evennia/contrib/base_systems/ingame_reports/menu.py +++ b/evennia/contrib/base_systems/ingame_reports/menu.py @@ -3,6 +3,7 @@ The report-management menu module. """ from django.conf import settings +from django.utils.translation import gettext as _ from evennia.comms.models import Msg from evennia.utils import logger @@ -11,7 +12,10 @@ from evennia.utils.utils import crop, datetime_format, is_iter, iter_to_str # the number of reports displayed on each page _REPORTS_PER_PAGE = 10 -_REPORT_STATUS_TAGS = ("closed", "in progress") +_REPORT_STATUS_TAGS = ("in progress", "rejected") +# the tag, used to mark a report as 'closed' +_REPORT_STATUS_CLOSED_TAG = _("closed") + if hasattr(settings, "INGAME_REPORT_STATUS_TAGS"): if is_iter(settings.INGAME_REPORT_STATUS_TAGS): _REPORT_STATUS_TAGS = settings.INGAME_REPORT_STATUS_TAGS @@ -19,35 +23,43 @@ if hasattr(settings, "INGAME_REPORT_STATUS_TAGS"): logger.log_warn( "The 'INGAME_REPORT_STATUS_TAGS' setting must be an iterable of strings; falling back to defaults." ) +# add the tag to the tag tupel +_REPORT_STATUS_TAGS = _REPORT_STATUS_TAGS + (_REPORT_STATUS_CLOSED_TAG,) def menunode_list_reports(caller, raw_string, **kwargs): """Paginates and lists out reports for the provided hub""" hub = caller.ndb._evmenu.hub - hub_name = " ".join(hub.key.split("_")).title() - text = f"Managing {hub_name}" + hub_name = hub.key.split("_")[0].title() + " " + hub_name += _("Reports") + text = _("Managing {hub_name}").format(hub_name=hub_name) if not (report_list := getattr(caller.ndb._evmenu, "report_list", None)): report_list = Msg.objects.search_message(receiver=hub).order_by("db_date_created") caller.ndb._evmenu.report_list = report_list # allow the menu to filter print-outs by status - if kwargs.get("status"): + status = kwargs.get("status") + if status: new_report_list = report_list.filter(db_tags__db_key=kwargs["status"]) # we don't filter reports if there are no reports under that filter if not new_report_list: - text = f"(No {kwargs['status']} reports)\n{text}" + text = _( + "(No {status} reports)\n" + "{text}" + ).format(status=status, text=text) else: report_list = new_report_list - text = f"Managing {kwargs['status']} {hub_name}" + text = _("Managing {status} {hub_name}").format(status=status, hub_name=hub_name) else: - report_list = report_list.exclude(db_tags__db_key="closed") + # use the 'closed' tag lowered, to be sure, the translation included no upper case chars + report_list = report_list.exclude(db_tags__db_key=_REPORT_STATUS_CLOSED_TAG.lower()) # filter by lock access report_list = [msg for msg in report_list if msg.access(caller, "read")] # this will catch both no reports filed and no permissions if not report_list: - return "There is nothing there for you to manage.", {} + return _("No open {hub_name} at the moment.").format(hub_name=hub_name), {} page = kwargs.get("page", 0) start = page * _REPORTS_PER_PAGE @@ -63,14 +75,19 @@ def menunode_list_reports(caller, raw_string, **kwargs): ] options.append( { - "key": ("|uF|nilter by status", "filter", "status", "f"), + "key": (_("|uF|nilter by status"), "filter", "status", "f"), "goto": "menunode_choose_filter", } ) if start > 0: options.append( { - "key": (f"|uP|nrevious {_REPORTS_PER_PAGE}", "previous", "prev", "p"), + "key": ( + _("|uP|nrevious {_REPORTS_PER_PAGE}").format(_REPORTS_PER_PAGE, _REPORTS_PER_PAGE), + _("previous"), + _("prev"), + _("p") + ), "goto": ( "menunode_list_reports", {"page": max(start - _REPORTS_PER_PAGE, 0) // _REPORTS_PER_PAGE}, @@ -80,7 +97,11 @@ def menunode_list_reports(caller, raw_string, **kwargs): if end < len(report_list): options.append( { - "key": (f"|uN|next {_REPORTS_PER_PAGE}", "next", "n"), + "key": ( + _("|uN|next {_REPORTS_PER_PAGE}").format(_REPORTS_PER_PAGE=_REPORTS_PER_PAGE), + _("next"), + _("n") + ), "goto": ( "menunode_list_reports", {"page": (start + _REPORTS_PER_PAGE) // _REPORTS_PER_PAGE}, @@ -92,14 +113,14 @@ def menunode_list_reports(caller, raw_string, **kwargs): def menunode_choose_filter(caller, raw_string, **kwargs): """apply or clear a status filter to the main report view""" - text = "View which reports?" + text = _("View which reports?") # options for all the possible statuses options = [ {"desc": status, "goto": ("menunode_list_reports", {"status": status})} for status in _REPORT_STATUS_TAGS ] # no filter - options.append({"desc": "All open reports", "goto": "menunode_list_reports"}) + options.append({"desc": _("All open reports"), "goto": "menunode_list_reports"}) return text, options @@ -117,18 +138,41 @@ def menunode_manage_report(caller, raw_string, report, **kwargs): Read out the full report text and targets, and allow for changing the report's status. """ receivers = [r for r in report.receivers if r != caller.ndb._evmenu.hub] - text = f"""\ -{report.message} -{datetime_format(report.date_created)} by {iter_to_str(report.senders)}{' about '+iter_to_str(r.get_display_name(caller) for r in receivers) if receivers else ''} -{iter_to_str(report.tags.all())}""" + + message = report.message + timestamp = datetime_format(report.date_created) + senders_str = iter_to_str(report.senders) + tags_str = iter_to_str(report.tags.all()) + if receivers: + receivers_str = iter_to_str(r.get_display_name(caller) for r in receivers) + about_clause = _(" about {receivers}").format(receivers=receivers_str) + else: + about_clause = "" + + text = _( + "{message}\n" + "{timestamp} by {senders}{about_clause}\n" + "{tags}" + ).format( + message=message, + timestamp=timestamp, + senders=senders_str, + about_clause=about_clause, + tags=tags_str + ) options = [] for tag in _REPORT_STATUS_TAGS: - options.append( - { - "desc": f"{'Unmark' if tag in report.tags.all() else 'Mark' } as {tag}", - "goto": (_report_toggle_tag, {"report": report, "tag": tag}), - } - ) - options.append({"desc": f"Manage another report", "goto": "menunode_list_reports"}) + if tag in report.tags.all(): + if tag in report.tags.all(): + desc = _("Unmark as {tag}").format(tag=tag) + else: + desc = _("Mark as {tag}").format(tag=tag) + options.append( + { + "desc": desc, + "goto": (_report_toggle_tag, {"report": report, "tag": tag}), + } + ) + options.append({"desc": _("Manage another report"), "goto": "menunode_list_reports"}) return text, options diff --git a/evennia/locale/de/LC_MESSAGES/django.mo b/evennia/locale/de/LC_MESSAGES/django.mo index 2778006df1f201142bdc0b7f9195b93384275e27..d2370b7cfc38d317cd45322ac5af5090719b57fe 100644 GIT binary patch delta 4176 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 R=M|hWa%S8N^0ybw{SReQVS@kw diff --git a/evennia/locale/de/LC_MESSAGES/django.po b/evennia/locale/de/LC_MESSAGES/django.po index 3896b24afb..c9dd9a743a 100644 --- a/evennia/locale/de/LC_MESSAGES/django.po +++ b/evennia/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-28 08:12+0000\n" +"POT-Creation-Date: 2025-08-31 09:56+0000\n" "PO-Revision-Date: 2025-03-28 10:21+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,52 +18,52 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.4\n" -#: accounts/accounts.py:474 +#: accounts/accounts.py:481 msgid "You are already puppeting this object." msgstr "Du steuerst dieses Objekt bereits." -#: accounts/accounts.py:478 +#: accounts/accounts.py:485 #, python-brace-format msgid "You don't have permission to puppet '{key}'." msgstr "Du hast nicht die Berechtigung '{key}' zu steuern." -#: accounts/accounts.py:487 +#: accounts/accounts.py:494 #, python-brace-format msgid "Sharing |c{name}|n with another of your sessions." msgstr "Teile |c{name}|n mit einer deiner anderen Sitzungen." -#: accounts/accounts.py:491 +#: accounts/accounts.py:498 #, python-brace-format msgid "|c{name}|n|G is now shared from another of your sessions.|n" msgstr "|c{name}|n|G wird nun von einer deiner anderen Sitzungen gesteuert.|n" -#: accounts/accounts.py:496 +#: accounts/accounts.py:503 #, python-brace-format msgid "Taking over |c{name}|n from another of your sessions." msgstr "Übernehme |c{name}|n von einer deiner anderen Sitzungen." -#: accounts/accounts.py:500 +#: accounts/accounts.py:507 #, python-brace-format msgid "|c{name}|n|R is now acted from another of your sessions.|n" msgstr "|c{name}|n|R wird nun von einer deiner anderen Sitzungen gesteuert.|n" -#: accounts/accounts.py:507 +#: accounts/accounts.py:514 #, python-brace-format msgid "|c{key}|R is already puppeted by another Account." msgstr "|c{key}|R wird schon von einem anderen Account gesteuert." -#: accounts/accounts.py:527 +#: accounts/accounts.py:534 #, python-brace-format msgid "You cannot control any more puppets (max {max_puppets})" msgstr "Du kannst nicht noch mehr 'Puppen' steuern (max {max_puppets})" -#: accounts/accounts.py:722 +#: accounts/accounts.py:729 msgid "Too many login failures; please try again in a few minutes." msgstr "" "Zu viele fehlgeschlagene Loginversuche. Bitte versuche es in ein paar " "Minuten erneut." -#: accounts/accounts.py:735 accounts/accounts.py:1062 +#: accounts/accounts.py:742 accounts/accounts.py:1069 msgid "" "|rYou have been banned and cannot continue from here.\n" "If you feel this ban is in error, please email an admin.|x" @@ -72,22 +72,22 @@ msgstr "" "Wenn du der Meinung bist, dass diese Sperre zu Unrecht erfolgt ist, sende " "bitte eine E-Mail an einen Administrator.|x" -#: accounts/accounts.py:747 +#: accounts/accounts.py:754 msgid "Username and/or password is incorrect." msgstr "Benutzername und/oder Passwort ist falsch." -#: accounts/accounts.py:754 +#: accounts/accounts.py:761 msgid "Too many authentication failures." msgstr "Zu viele fehlgeschlagene Authentifizierungen." -#: accounts/accounts.py:1033 +#: accounts/accounts.py:1040 msgid "" "You are creating too many accounts. Please log into an existing account." msgstr "" "Sie erstellen zu viele Konten. Bitte melden Sie sich bei einem bestehenden " "Konto an." -#: accounts/accounts.py:1079 +#: accounts/accounts.py:1086 msgid "" "There was an error creating the Account. If this problem persists, contact " "an admin." @@ -95,35 +95,35 @@ msgstr "" "Beim Erstellen des Kontos ist ein Fehler aufgetreten. Wenn dieses Problem " "weiterhin besteht, wenden Sie sich an einen Administrator." -#: accounts/accounts.py:1123 accounts/accounts.py:2048 +#: accounts/accounts.py:1130 accounts/accounts.py:2055 msgid "An error occurred. Please e-mail an admin if the problem persists." msgstr "" "Es ist ein Fehler aufgetreten. Bitte senden Sie eine E-Mail an einen " "Administrator, wenn das Problem weiterhin besteht." -#: accounts/accounts.py:1156 +#: accounts/accounts.py:1163 msgid "Account being deleted." msgstr "Account wird gelöscht." -#: accounts/accounts.py:1727 accounts/accounts.py:2066 +#: accounts/accounts.py:1734 accounts/accounts.py:2073 #, python-brace-format msgid "|G{key} connected|n" msgstr "|G{key} verbunden|n" -#: accounts/accounts.py:1733 +#: accounts/accounts.py:1740 msgid "The Character does not exist." msgstr "Der Charakter existiert nicht." -#: accounts/accounts.py:1767 +#: accounts/accounts.py:1774 #, python-brace-format msgid "|R{key} disconnected{reason}|n" msgstr "|R{key} getrennt {reason}|n" -#: accounts/accounts.py:2001 +#: accounts/accounts.py:2008 msgid "Guest accounts are not enabled on this server." msgstr "Gastkonten sind auf diesem Server nicht aktiviert." -#: accounts/accounts.py:2011 +#: accounts/accounts.py:2018 msgid "All guest accounts are in use. Please try again later." msgstr "" "Alle Gastaccounts sind bereits in Benutzung. Bitte versuche es später " @@ -236,25 +236,25 @@ msgstr "" "{errmsg}\n" "(Traceback wurde protokolliert {timestamp})" -#: commands/cmdhandler.py:708 +#: commands/cmdhandler.py:709 msgid "There were multiple matches." msgstr "Es gab mehrere Treffer." -#: commands/cmdhandler.py:733 +#: commands/cmdhandler.py:734 #, python-brace-format msgid "Command '{command}' is not available." msgstr "Der Befehl '{command}' ist nicht verfügbar." -#: commands/cmdhandler.py:743 +#: commands/cmdhandler.py:744 #, python-brace-format msgid " Maybe you meant {command}?" msgstr " Meintest du vielleicht {command}?" -#: commands/cmdhandler.py:745 +#: commands/cmdhandler.py:746 msgid "or" msgstr "oder" -#: commands/cmdhandler.py:749 +#: commands/cmdhandler.py:750 msgid " Type \"help\" for help." msgstr " Gib \"help\" für Hilfe ein." @@ -335,6 +335,109 @@ msgstr "Selbsterstellter {mergetype} in cmdset '{cmdset}'" msgid "Only CmdSets can be added to the cmdsethandler!" msgstr "Es können nur CmdSets zum cmdsethandler hinzugefügt werden!" +#: contrib/base_systems/ingame_reports/menu.py:17 +msgid "closed" +msgstr "geschlossen" + +#: contrib/base_systems/ingame_reports/menu.py:34 +msgid "Reports" +msgstr "Berichte" + +#: contrib/base_systems/ingame_reports/menu.py:35 +#, python-brace-format +msgid "Managing {hub_name}" +msgstr "{hub_name} verwalten" + +#: contrib/base_systems/ingame_reports/menu.py:47 +#, python-brace-format +msgid "" +"(No {status} reports)\n" +"{text}" +msgstr "Keine {status} Berichte" +"{text}" + +#: contrib/base_systems/ingame_reports/menu.py:52 +#, python-brace-format +msgid "Managing {status} {hub_name}" +msgstr "{status} {hub_name} verwalten" + +#: contrib/base_systems/ingame_reports/menu.py:62 +#, python-brace-format +msgid "No open {hub_name} at the moment." +msgstr "Keine offenen {hub_name} im Moment." + +#: contrib/base_systems/ingame_reports/menu.py:78 +msgid "|uF|nilter by status" +msgstr "nach Status |uf|niltern" + +#: contrib/base_systems/ingame_reports/menu.py:86 +#, python-brace-format +msgid "|uP|nrevious {_REPORTS_PER_PAGE}" +msgstr "|uV|norherige {_REPORTS_PER_PAGE}" + +#: contrib/base_systems/ingame_reports/menu.py:87 +msgid "previous" +msgstr "vorherige" + +#: contrib/base_systems/ingame_reports/menu.py:88 +msgid "prev" +msgstr "vorh" + +#: contrib/base_systems/ingame_reports/menu.py:89 +msgid "p" +msgstr "v" + +#: contrib/base_systems/ingame_reports/menu.py:101 +#, python-brace-format +msgid "|uN|next {_REPORTS_PER_PAGE}" +msgstr "|uN|nächste {_REPORTS_PER_PAGE}" + +#: contrib/base_systems/ingame_reports/menu.py:102 +msgid "next" +msgstr "nächste" + +#: contrib/base_systems/ingame_reports/menu.py:103 +msgid "n" +msgstr "n" + +#: contrib/base_systems/ingame_reports/menu.py:116 +msgid "View which reports?" +msgstr "" + +#: contrib/base_systems/ingame_reports/menu.py:123 +msgid "All open reports" +msgstr "Alle offenen Berichte" + +#: contrib/base_systems/ingame_reports/menu.py:148 +#, python-brace-format +msgid " about {receivers}" +msgstr "über {receivers}" + +#: contrib/base_systems/ingame_reports/menu.py:153 +#, python-brace-format +msgid "" +"{message}\n" +"{timestamp} by {senders}{about_clause}\n" +"{tags}" +msgstr "" +"{message}\n" +"{timestamp} von {senders}{about_clause}\n" +"{tags}" + +#: contrib/base_systems/ingame_reports/menu.py:168 +#, python-brace-format +msgid "Unmark as {tag}" +msgstr "Markierung als {tag} entfernen" + +#: contrib/base_systems/ingame_reports/menu.py:170 +#, python-brace-format +msgid "Mark as {tag}" +msgstr "Als {tag} markieren" + +#: contrib/base_systems/ingame_reports/menu.py:177 +msgid "Manage another report" +msgstr "Einen anderen Bericht verwalten." + #: locks/lockhandler.py:242 #, python-brace-format msgid "Lock: lock-function '{lockfunc}' is not available." @@ -402,36 +505,127 @@ msgstr "" "Etwas ist schief gelaufen! Du bist im Nirgendwo gelandet. Wende dich an " "einen Administrator." +#: objects/objects.py:1386 +#, python-brace-format +msgid "Your current location has ceased to exist, moving you to (#{dbid})." +msgstr "" + +#: objects/objects.py:1391 +msgid "This place should not exist ... contact an admin." +msgstr "" + #: objects/objects.py:1557 #, python-brace-format msgid "Your character {key} has been destroyed." msgstr "Dein Charakter {key} wurde entfernt." -#: objects/objects.py:2378 +#: objects/objects.py:1796 objects/objects.py:1815 objects/objects.py:1844 +msgid ", and" +msgstr "" + +#: objects/objects.py:1797 +msgid "Exits" +msgstr "" + +#: objects/objects.py:1817 +msgid "Characters" +msgstr "" + +#: objects/objects.py:1845 +msgid "You see" +msgstr "" + +#: objects/objects.py:2145 +#, fuzzy, python-brace-format +#| msgid "" +#| "\n" +#| "You become |c{name}|n.\n" +msgid "You become |w{key}|n." +msgstr "" +"\n" +"Du wirst zu |c{name}|n.\n" + +#: objects/objects.py:2324 +#, fuzzy, python-brace-format +#| msgid "{object} arrives to {destination}." +msgid "{object} is leaving {origin}, heading for {destination}." +msgstr "{object} kommt in {destination} an." + +#: objects/objects.py:2336 objects/objects.py:2409 +msgid "somewhere" +msgstr "" + +#: objects/objects.py:2337 objects/objects.py:2338 objects/objects.py:2410 +#: objects/objects.py:2411 +msgid "nowhere" +msgstr "" + +#: objects/objects.py:2379 #, python-brace-format msgid "You now have {name} in your possession." msgstr "Du hast nun {name} in deinem Besitz." -#: objects/objects.py:2388 +#: objects/objects.py:2389 #, python-brace-format msgid "{object} arrives to {destination} from {origin}." msgstr "{object} kommt aus {origin} in {destination} an." -#: objects/objects.py:2390 +#: objects/objects.py:2391 #, python-brace-format msgid "{object} arrives to {destination}." msgstr "{object} kommt in {destination} an." -#: objects/objects.py:3031 +#: objects/objects.py:2675 objects/objects.py:2679 +#, fuzzy, python-brace-format +#| msgid "Could not find '{query}'." +msgid "Could not view '{target_name}'." +msgstr "Kann '{query}' nicht finden." + +#: objects/objects.py:2804 +#, fuzzy, python-brace-format +#| msgid "You cannot go there." +msgid "You cannot drop {obj}" +msgstr "Du kannst da nicht hingehen." + +#: objects/objects.py:2916 +#, python-brace-format +msgid "{self} whisper to {all_receivers}, \"|n{speech}|n\"" +msgstr "" + +#: objects/objects.py:2920 +#, python-brace-format +msgid "{object} whispers: \"|n{speech}|n\"" +msgstr "" + +#: objects/objects.py:2923 +#, python-brace-format +msgid "{self} say, \"|n{speech}|n\"" +msgstr "" + +#: objects/objects.py:2924 +#, python-brace-format +msgid "{object} says, \"{speech}\"" +msgstr "" + +#: objects/objects.py:2933 objects/objects.py:2949 objects/objects.py:2976 +msgid "You" +msgstr "" + +#: objects/objects.py:3034 msgid "This is a character." msgstr "Dies ist ein Charakter." -#: objects/objects.py:3255 +#: objects/objects.py:3201 +#, python-brace-format +msgid "|rA character named '|w{name}|r' already exists.|n" +msgstr "" + +#: objects/objects.py:3258 #, python-brace-format msgid "|r{obj} has no location and no home is set.|n" msgstr "|r{obj} hat keinen Standort und es ist kein Zuhause gesetzt.|n" -#: objects/objects.py:3274 +#: objects/objects.py:3277 #, python-brace-format msgid "" "\n" @@ -440,61 +634,67 @@ msgstr "" "\n" "Du wirst zu |c{name}|n.\n" -#: objects/objects.py:3279 +#: objects/objects.py:3282 #, python-brace-format msgid "{name} has entered the game." msgstr "{name} hat das Spiel betreten." -#: objects/objects.py:3309 +#: objects/objects.py:3312 #, python-brace-format msgid "{name} has left the game{reason}." msgstr "{name} hat das Spiel verlassen{reason}." -#: objects/objects.py:3360 +#: objects/objects.py:3363 msgid "This is a room." msgstr "Dies ist ein Raum." -#: objects/objects.py:3528 +#: objects/objects.py:3505 +#, fuzzy, python-brace-format +#| msgid "{object} arrives to {destination}." +msgid " (exit to {destination})" +msgstr "{object} kommt in {destination} an." + +#: objects/objects.py:3533 msgid "This is an exit." msgstr "Dies ist ein Ausgang." -#: objects/objects.py:3748 +#: objects/objects.py:3753 msgid "You cannot go there." msgstr "Du kannst da nicht hingehen." -#: prototypes/prototypes.py:55 +#: prototypes/prototypes.py:56 msgid "Error" msgstr "Fehler" -#: prototypes/prototypes.py:56 +#: prototypes/prototypes.py:57 msgid "Warning" msgstr "Warnung" -#: prototypes/prototypes.py:422 +#: prototypes/prototypes.py:423 msgid "Prototype requires a prototype_key" msgstr "Prototype erfordert einen prototype_key" -#: prototypes/prototypes.py:430 prototypes/prototypes.py:500 -#: prototypes/prototypes.py:1162 +#: prototypes/prototypes.py:431 prototypes/prototypes.py:501 +#: prototypes/prototypes.py:1163 #, python-brace-format msgid "{protkey} is a read-only prototype (defined as code in {module})." msgstr "" "{protkey} ist ein schreibgeschützter Prototyp (definiert als Code in " "{module})." -#: prototypes/prototypes.py:432 prototypes/prototypes.py:502 -#: prototypes/prototypes.py:1164 +#: prototypes/prototypes.py:433 prototypes/prototypes.py:503 +#: prototypes/prototypes.py:1165 #, python-brace-format msgid "{protkey} is a read-only prototype (passed directly as a dict)." msgstr "" "{protkey} ist ein schreibgeschützter Prototyp (direkt als dict übergeben)" -#: prototypes/prototypes.py:509 +#: prototypes/prototypes.py:510 #, python-brace-format msgid "Prototype {prototype_key} was not found." msgstr "Prototyp {prototype_key} wurde nicht gefunden." -#: prototypes/prototypes.py:517 +#: prototypes/prototypes.py:518 #, python-brace-format msgid "" "{caller} needs explicit 'edit' permissions to delete prototype " @@ -503,26 +703,21 @@ msgstr "" "{caller} benötigt explizite 'edit'-Berechtigungen, um den Prototyp " "{prototype_key} zu löschen." -#: prototypes/prototypes.py:670 -#, python-brace-format -msgid "Found {num} matching prototypes." -msgstr "{num} passende Prototypen gefunden." - -#: prototypes/prototypes.py:827 +#: prototypes/prototypes.py:828 msgid "No prototypes found." msgstr "Keine Prototypen gefunden." -#: prototypes/prototypes.py:874 +#: prototypes/prototypes.py:875 msgid "Prototype lacks a 'prototype_key'." msgstr "Dem Prototyp fehlt ein 'prototype_key'." -#: prototypes/prototypes.py:883 +#: prototypes/prototypes.py:884 #, python-brace-format msgid "Prototype {protkey} requires `typeclass` or 'prototype_parent'." msgstr "" "Prototyp {protkey} erfordert eine `typeclass` oder ein 'prototype_parent'." -#: prototypes/prototypes.py:890 +#: prototypes/prototypes.py:891 #, python-brace-format msgid "" "Prototype {protkey} can only be used as a mixin since it lacks 'typeclass' " @@ -531,7 +726,7 @@ msgstr "" "Prototyp {protkey} kann nur als Mixin verwendet werden, da er keine " "'typeclass' oder 'prototype_parent' hat." -#: prototypes/prototypes.py:901 +#: prototypes/prototypes.py:902 #, python-brace-format msgid "" "{err}: Prototype {protkey} is based on typeclass {typeclass}, which could " @@ -540,12 +735,12 @@ msgstr "" "{err}: Prototyp {protkey} basiert auf typeclass {typeclass}, die nicht " "importiert werden konnte!" -#: prototypes/prototypes.py:920 +#: prototypes/prototypes.py:921 #, python-brace-format msgid "Prototype {protkey} tries to parent itself." msgstr "Prototyp {protkey} versucht von sich selbst zu erben." -#: prototypes/prototypes.py:932 +#: prototypes/prototypes.py:933 #, python-brace-format msgid "" "Prototype {protkey}'s `prototype_parent` (named '{parent}') was not found." @@ -553,12 +748,12 @@ msgstr "" "Der `prototype_parent` (namens '{parent}') des Prototyps {protkey} wurde " "nicht gefunden." -#: prototypes/prototypes.py:940 +#: prototypes/prototypes.py:941 #, python-brace-format msgid "{protkey} has infinite nesting of prototypes." msgstr "{protkey} hat unendlich Verschachtelte Prototypen." -#: prototypes/prototypes.py:969 +#: prototypes/prototypes.py:970 #, python-brace-format msgid "" "Prototype {protkey} has no `typeclass` defined anywhere in its parent\n" @@ -579,7 +774,7 @@ msgstr "" "Diff enthält non-dicts, die nicht in der Form (old, new, action_to_take) " "sind: {diffpart}" -#: scripts/scripthandler.py:50 +#: scripts/scripthandler.py:51 #, python-brace-format msgid "" "\n" @@ -588,7 +783,7 @@ msgstr "" "\n" " '{key}' ({next_repeat}/{interval}, {repeats} Wiederholungen): {desc}" -#: scripts/scripts.py:348 +#: scripts/scripts.py:349 #, python-brace-format msgid "Script {key}(#{dbid}) of type '{name}': at_repeat() error '{err}'." msgstr "Script {key}(#{dbid}) vom Typ '{name}': at_repeat() Fehler '{err}'." @@ -606,8 +801,8 @@ msgid "" "play the demo game.\n" msgstr "" "\n" -"Willkommen bei deinem neuen Spiel auf |wEvennia|n-Basis! Besuche http://www." -"evennia.com, wenn \n" +"Willkommen bei deinem neuen Spiel auf |wEvennia|n-Basis! Besuche http://" +"www.evennia.com, wenn \n" "du Hilfe brauchst, etwas beitragen, Probleme melden oder einfach der " "Community beitreten willst.\n" "\n" @@ -632,11 +827,11 @@ msgstr "" "{servername}-DoS-Schutz ist aktiv. Du stehst in der Warteschlange, um in " "{num} Sekunden eine Verbindung herzustellen ..." -#: server/service.py:121 +#: server/service.py:122 msgid " (connection lost)" msgstr " (Verbindung verloren)" -#: server/service.py:131 +#: server/service.py:132 msgid "idle timeout exceeded" msgstr "Idle-Timeout überschritten" @@ -671,6 +866,297 @@ msgstr "Dieser Benutzername ist reserviert." msgid "Sorry, that username is already taken." msgstr "Dieser Benutzername ist bereits vergeben." +#: typeclasses/models.py:896 +msgid " (carried)" +msgstr "" + +#: utils/eveditor.py:113 +msgid "" +"\n" +" Legend:\n" +" - line number, like '5' or range, like '3:7'.\n" +" - a single word, or multiple words with quotes around them.\n" +" - longer string, usually not needing quotes.\n" +msgstr "" + +#: utils/eveditor.py:122 +msgid "" +"\n" +" :! - Execute code buffer without saving\n" +" :< - Decrease the level of automatic indentation for the next lines\n" +" :> - Increase the level of automatic indentation for the next lines\n" +" := - Switch automatic indentation on/off\n" +msgstr "" + +#: utils/eveditor.py:133 +#, python-brace-format +msgid "" +"\n" +"{error}\n" +"\n" +"|rBuffer load function error. Could not load initial data.|n\n" +msgstr "" + +#: utils/eveditor.py:141 +#, python-brace-format +msgid "" +"\n" +"{error}\n" +"\n" +"|rSave function returned an error. Buffer not saved.|n\n" +msgstr "" + +#: utils/eveditor.py:148 +msgid "|rNo save function defined. Buffer cannot be saved.|n" +msgstr "" + +#: utils/eveditor.py:150 +msgid "No changes need saving" +msgstr "" + +#: utils/eveditor.py:151 +#, fuzzy +#| msgid "|xExited pager.|n" +msgid "Exited editor." +msgstr "|xPager verlassen.|n" + +#: utils/eveditor.py:154 +#, python-brace-format +msgid "" +"\n" +"{error}\n" +"\n" +"|rQuit function gave an error. Skipping.|n\n" +msgstr "" + +#: utils/eveditor.py:162 +#, python-brace-format +msgid "" +"\n" +"{error}\n" +"\n" +"|rThe editor state could not be saved for persistent mode. Switching\n" +"to non-persistent mode (which means the editor session won't survive\n" +"an eventual server reload - so save often!)|n\n" +msgstr "" + +#: utils/eveditor.py:172 +msgid "" +"EvEditor persistent-mode error. Commonly, this is because one or more of the " +"EvEditor callbacks could not be pickled, for example because it's a class " +"method or is defined inside another function." +msgstr "" + +#: utils/eveditor.py:178 +msgid "Nothing to undo." +msgstr "" + +#: utils/eveditor.py:179 +msgid "Nothing to redo." +msgstr "" + +#: utils/eveditor.py:180 +msgid "Undid one step." +msgstr "" + +#: utils/eveditor.py:181 +msgid "Redid one step." +msgstr "" + +#: utils/eveditor.py:508 +msgid "Single ':' added to buffer." +msgstr "" + +#: utils/eveditor.py:523 +msgid "Save before quitting?" +msgstr "" + +#: utils/eveditor.py:538 +msgid "Reverted all changes to the buffer back to original state." +msgstr "" + +#: utils/eveditor.py:543 +#, python-brace-format +msgid "Deleted {string}." +msgstr "" + +#: utils/eveditor.py:548 +msgid "You must give a search word to delete." +msgstr "" + +#: utils/eveditor.py:554 +#, python-brace-format +msgid "Removed {arg1} for lines {l1}-{l2}." +msgstr "" + +#: utils/eveditor.py:560 +#, python-brace-format +msgid "Removed {arg1} for {line}." +msgstr "" + +#: utils/eveditor.py:576 +#, python-brace-format +msgid "Cleared {nlines} lines from buffer." +msgstr "" + +#: utils/eveditor.py:581 +#, python-brace-format +msgid "{line}, {cbuf} yanked." +msgstr "" + +#: utils/eveditor.py:588 +#, python-brace-format +msgid "{line}, {cbuf} cut." +msgstr "" + +#: utils/eveditor.py:592 +msgid "Copy buffer is empty." +msgstr "" + +#: utils/eveditor.py:597 +#, python-brace-format +msgid "Pasted buffer {cbuf} to {line}." +msgstr "" + +#: utils/eveditor.py:605 +msgid "You need to enter a new line and where to insert it." +msgstr "" + +#: utils/eveditor.py:610 +#, python-brace-format +msgid "Inserted {num} new line(s) at {line}." +msgstr "" + +#: utils/eveditor.py:618 +msgid "You need to enter a replacement string." +msgstr "" + +#: utils/eveditor.py:623 +#, python-brace-format +msgid "Replaced {num} line(s) at {line}." +msgstr "" + +#: utils/eveditor.py:630 +msgid "You need to enter text to insert." +msgstr "" + +#: utils/eveditor.py:638 +#, python-brace-format +msgid "Inserted text at beginning of {line}." +msgstr "" + +#: utils/eveditor.py:642 +msgid "You need to enter text to append." +msgstr "" + +#: utils/eveditor.py:650 +#, python-brace-format +msgid "Appended text to end of {line}." +msgstr "" + +#: utils/eveditor.py:655 +msgid "You must give a search word and something to replace it with." +msgstr "" + +#: utils/eveditor.py:674 +msgid "Invalid regular expression." +msgstr "" + +#: utils/eveditor.py:678 +#, python-brace-format +msgid "Search-replaced {arg1} -> {arg2} for lines {l1}-{l2}." +msgstr "" + +#: utils/eveditor.py:684 +#, python-brace-format +msgid "Search-replaced {arg1} -> {arg2} for {line}." +msgstr "" + +#: utils/eveditor.py:703 +#, python-brace-format +msgid "Flood filled lines {l1}-{l2}." +msgstr "" + +#: utils/eveditor.py:705 +#, python-brace-format +msgid "Flood filled {line}." +msgstr "" + +#: utils/eveditor.py:730 +msgid "Valid justifications are" +msgstr "" + +#: utils/eveditor.py:746 +#, python-brace-format +msgid "{align}-justified lines {l1}-{l2}." +msgstr "" + +#: utils/eveditor.py:752 +#, python-brace-format +msgid "{align}-justified {line}." +msgstr "" + +#: utils/eveditor.py:764 +#, python-brace-format +msgid "Indented lines {l1}-{l2}." +msgstr "" + +#: utils/eveditor.py:766 +#, python-brace-format +msgid "Indented {line}." +msgstr "" + +#: utils/eveditor.py:776 +#, python-brace-format +msgid "Removed left margin (dedented) lines {l1}-{l2}." +msgstr "" + +#: utils/eveditor.py:781 +#, python-brace-format +msgid "Removed left margin (dedented) {line}." +msgstr "" + +#: utils/eveditor.py:789 +#, python-brace-format +msgid "Echo mode set to {mode}" +msgstr "" + +#: utils/eveditor.py:794 utils/eveditor.py:809 utils/eveditor.py:824 +#: utils/eveditor.py:835 +msgid "This command is only available in code editor mode." +msgstr "" + +#: utils/eveditor.py:802 +#, python-brace-format +msgid "Decreased indentation: new indentation is {indent}." +msgstr "" + +#: utils/eveditor.py:807 utils/eveditor.py:822 +msgid "|rManual indentation is OFF.|n Use := to turn it on." +msgstr "" + +#: utils/eveditor.py:817 +#, python-brace-format +msgid "Increased indentation: new indentation is {indent}." +msgstr "" + +#: utils/eveditor.py:831 +msgid "Auto-indentation turned on." +msgstr "" + +#: utils/eveditor.py:833 +msgid "Auto-indentation turned off." +msgstr "" + +#: utils/eveditor.py:1133 +#, python-brace-format +msgid "Line Editor [{name}]" +msgstr "" + +#: utils/eveditor.py:1141 +msgid "(:h for help)" +msgstr "" + #: utils/evmenu.py:310 #, python-brace-format msgid "" @@ -706,7 +1192,7 @@ msgstr "Befehle: help, quit" msgid "Commands: help" msgstr "Befehle: help" -#: utils/evmenu.py:319 utils/evmenu.py:1828 +#: utils/evmenu.py:319 utils/evmenu.py:1834 msgid "Choose an option or try 'help'." msgstr "Wähle eine Option oder versuche 'help‘." @@ -722,15 +1208,15 @@ msgstr "|Waktuell|n" msgid "|wp|Wrevious page|n" msgstr "|wp|Wrevious (vorherige) Seite|n" -#: utils/evmenu.py:1430 +#: utils/evmenu.py:1433 msgid "|wn|Wext page|n" msgstr "|wn|Wächste Seite|n" -#: utils/evmenu.py:1667 +#: utils/evmenu.py:1673 msgid "Aborted." msgstr "Abgebrochen." -#: utils/evmenu.py:1690 +#: utils/evmenu.py:1696 msgid "|rError in ask_yes_no. Choice not confirmed (report to admin)|n" msgstr "" "|rFehler in ask_yes_no. Auswahl nicht bestätigt (bitte an Administrator " @@ -756,7 +1242,7 @@ msgstr "Es gab mehrere Treffer:" msgid "Please be more specific." msgstr "Bitte sei spezifischer." -#: utils/utils.py:2227 +#: utils/utils.py:2237 #, python-brace-format msgid "" "{obj}.{handlername} is a handler and can't be set directly. To add values, " @@ -765,26 +1251,129 @@ msgstr "" "{obj}.{handlername} ist ein 'handler' und kann nicht direkt gesetzt werden. " "Um Werte hinzuzufügen, verwende stattdessen `{obj}.{handlername}.add()`." -#: utils/utils.py:2237 +#: utils/utils.py:2247 #, python-brace-format msgid "" "{obj}.{handlername} is a handler and can't be deleted directly. To remove " "values, use `{obj}.{handlername}.remove()` instead." msgstr "" "{obj}.{handlername} ist ein 'handler' und kann nicht direkt gelöscht werden. " -"Um Werte zu entfernen, verwenden Sie stattdessen `{obj}.{handlername}." -"remove()`." +"Um Werte zu entfernen, verwenden Sie stattdessen `{obj}." +"{handlername}.remove()`." -#: utils/utils.py:2389 +#: utils/utils.py:2399 #, python-brace-format msgid "Could not find '{query}'." msgstr "Kann '{query}' nicht finden." -#: utils/utils.py:2396 +#: utils/utils.py:2406 #, python-brace-format msgid "More than one match for '{query}' (please narrow target):\n" msgstr "Mehr als ein Treffer für ‚{query}‘ (Bitte das Ziel präzisieren):\n" +#: utils/validatorfuncs.py:28 +#, python-brace-format +msgid "Input could not be converted to text ({err})" +msgstr "" + +#: utils/validatorfuncs.py:37 +#, python-brace-format +msgid "Nothing entered for a {option_key}!" +msgstr "" + +#: utils/validatorfuncs.py:41 +#, python-brace-format +msgid "'{entry}' is not a valid {option_key}." +msgstr "" + +#: utils/validatorfuncs.py:66 utils/validatorfuncs.py:239 +#, python-brace-format +msgid "No {option_key} entered!" +msgstr "" + +#: utils/validatorfuncs.py:75 +#, python-brace-format +msgid "Timezone string '{acct_tz}' is not a valid timezone ({err})" +msgstr "" + +#: utils/validatorfuncs.py:92 utils/validatorfuncs.py:100 +#, python-brace-format +msgid "{option_key} must be entered in a 24-hour format such as: {timeformat}" +msgstr "" + +#: utils/validatorfuncs.py:144 +#, python-brace-format +msgid "Could not convert section '{interval}' to a {option_key}." +msgstr "" + +#: utils/validatorfuncs.py:156 +#, python-brace-format +msgid "That {option_key} is in the past! Must give a Future datetime!" +msgstr "" + +#: utils/validatorfuncs.py:166 +#, python-brace-format +msgid "Must enter a whole number for {option_key}!" +msgstr "" + +#: utils/validatorfuncs.py:172 +#, python-brace-format +msgid "Could not convert '{entry}' to a whole number for {option_key}!" +msgstr "" + +#: utils/validatorfuncs.py:183 +#, python-brace-format +msgid "Must enter a whole number greater than 0 for {option_key}!" +msgstr "" + +#: utils/validatorfuncs.py:194 +#, python-brace-format +msgid "{option_key} must be a whole number greater than or equal to 0!" +msgstr "" + +#: utils/validatorfuncs.py:213 +#, python-brace-format +msgid "Must enter a true/false input for {option_key}. Accepts {alternatives}." +msgstr "" + +#: utils/validatorfuncs.py:243 +#, fuzzy, python-brace-format +#| msgid "Please be more specific." +msgid "That matched: {matches}. Please be more specific!" +msgstr "Bitte sei spezifischer." + +#: utils/validatorfuncs.py:250 +#, python-brace-format +msgid "Could not find timezone '{entry}' for {option_key}!" +msgstr "" + +#: utils/validatorfuncs.py:258 +msgid "Email address field empty!" +msgstr "" + +#: utils/validatorfuncs.py:261 +#, python-brace-format +msgid "That isn't a valid {option_key}!" +msgstr "" + +#: utils/validatorfuncs.py:268 +#, python-brace-format +msgid "No {option_key} entered to set!" +msgstr "" + +#: utils/validatorfuncs.py:272 +msgid "Must enter an access type!" +msgstr "" + +#: utils/validatorfuncs.py:276 +#, python-brace-format +msgid "Access type must be one of: {alternatives}" +msgstr "" + +#: utils/validatorfuncs.py:281 +msgid "Lock func not entered." +msgstr "" + #: web/templates/admin/app_list.html:19 msgid "Add" msgstr "Hinzufügen" @@ -801,6 +1390,10 @@ msgstr "Ändern" msgid "You don’t have permission to view or edit anything." msgstr "Du hast nicht die Berechtigung etwas anzuschauen oder zu ändern." +#, python-brace-format +#~ msgid "Found {num} matching prototypes." +#~ msgstr "{num} passende Prototypen gefunden." + #, python-brace-format #~ msgid "{target} has no in-game appearance." #~ msgstr "{target} hat im Spiel keine Präsenz." From 990ba95f5ed852306cca16c14e0f41dff4a654a0 Mon Sep 17 00:00:00 2001 From: Peddn Date: Sun, 31 Aug 2025 13:51:12 +0200 Subject: [PATCH 2/2] =?UTF-8?q?The=20tag=20=E2=80=9Cclosed=E2=80=9D=20or?= =?UTF-8?q?=20its=20translated=20version=20is=20now=20automatically=20adde?= =?UTF-8?q?d=20to=20the=20tag=20tuple=20if=20it=20has=20not=20already=20be?= =?UTF-8?q?en=20specified=20in=20=E2=80=9Csettings.py=E2=80=9D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Current behavior: If the tag 'closed' is not set in INGAME_REPORT_STATUS_TAGS, reports can no longer be closed, which seems like a bug to me. An alternative solution would be another setting in ‘settings.py’, such as ‘INGAME_REPORT_STATUS_CLOSED_TAG’. This would also eliminate the need for internationalization, as the tag could be set in the desired language. --- .../base_systems/ingame_reports/menu.py | 25 +++++++++--------- evennia/locale/de/LC_MESSAGES/django.mo | Bin 19145 -> 19146 bytes evennia/locale/de/LC_MESSAGES/django.po | 13 +++++---- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/evennia/contrib/base_systems/ingame_reports/menu.py b/evennia/contrib/base_systems/ingame_reports/menu.py index 044065e84c..fb25e55bb0 100644 --- a/evennia/contrib/base_systems/ingame_reports/menu.py +++ b/evennia/contrib/base_systems/ingame_reports/menu.py @@ -12,6 +12,7 @@ from evennia.utils.utils import crop, datetime_format, is_iter, iter_to_str # the number of reports displayed on each page _REPORTS_PER_PAGE = 10 +# the fallback standard tags _REPORT_STATUS_TAGS = ("in progress", "rejected") # the tag, used to mark a report as 'closed' _REPORT_STATUS_CLOSED_TAG = _("closed") @@ -23,8 +24,9 @@ if hasattr(settings, "INGAME_REPORT_STATUS_TAGS"): logger.log_warn( "The 'INGAME_REPORT_STATUS_TAGS' setting must be an iterable of strings; falling back to defaults." ) -# add the tag to the tag tupel -_REPORT_STATUS_TAGS = _REPORT_STATUS_TAGS + (_REPORT_STATUS_CLOSED_TAG,) +# add the 'closed' tag to the tupel of tags +if _REPORT_STATUS_CLOSED_TAG not in _REPORT_STATUS_TAGS: + _REPORT_STATUS_TAGS = _REPORT_STATUS_TAGS + (_REPORT_STATUS_CLOSED_TAG,) def menunode_list_reports(caller, raw_string, **kwargs): @@ -164,15 +166,14 @@ def menunode_manage_report(caller, raw_string, report, **kwargs): options = [] for tag in _REPORT_STATUS_TAGS: if tag in report.tags.all(): - if tag in report.tags.all(): - desc = _("Unmark as {tag}").format(tag=tag) - else: - desc = _("Mark as {tag}").format(tag=tag) - options.append( - { - "desc": desc, - "goto": (_report_toggle_tag, {"report": report, "tag": tag}), - } - ) + desc = _("Unmark as {tag}").format(tag=tag) + else: + desc = _("Mark as {tag}").format(tag=tag) + options.append( + { + "desc": desc, + "goto": (_report_toggle_tag, {"report": report, "tag": tag}), + } + ) options.append({"desc": _("Manage another report"), "goto": "menunode_list_reports"}) return text, options diff --git a/evennia/locale/de/LC_MESSAGES/django.mo b/evennia/locale/de/LC_MESSAGES/django.mo index d2370b7cfc38d317cd45322ac5af5090719b57fe..f898842d8249340110ce47745be76325ddb1e8c8 100644 GIT binary patch delta 1075 zcmXZbPe@cz6vy%3Bc0MRNXx-#l(8{}Y7+mHj;S@8<&;EbGa0EM5m6xRqCu#)5h{YP zKLeG}q9olF3}TBm(jpRCSh)xxB6U%;YFPw*kMFHM_n!OboqO+j?{m(4&UuwCbW0^o z)=8B(i<@u}gZLdc;vYPTfqH2hp22H4g6nYwcjGUNW3Yia*o9%7z#aG+OK=Ix@JEB( zwF&piegbp27b}{j2zKLEyo7c`*U>Vcz(@EJyD`PCK^#XLpGHgg4TkU=w&P#i zf-PiKjy*07TX-I0IO_WhN9fPvM{MSLj$<*$<`Bx@S-gX_xPlw7tW7$MVYCwt;~?g6 z7yd>|EKD|REjLM{ipD5b;A0%aJX&IjgWj9>qV+FgDcFd1nq5Su>*f%4aVu%_$jph6{Jk`0IgWxA$6!v zxE%{SB?qg~ZYYWc7+;IKO!fnfXc;DO7(0ERBhRJ+?zIZr(Vl7$`7tzxQJlf2_yu#A z?eY$=`H0j@zXN;lK4$SNUgi7hKPnC32fToLsHh~4qZQKv+DTT?PUxh(zoi7(Ln+_8 z*hl{}TG7UiQHa=vcC)K!Pgp}CMJ$e$)ij1^*aFudco@U>AMSce-EQW#sX5HF(L&~>!Thj0+zUmNSY!0Cep2GXM9hYz&7Bq0}7(zSY8SKHQ zSdG8Y5(|+HTgz#rQ9+|0gE)w{@f})XiT&=Ix1;qhU;*Cn;t$boYy`V;4m&W~=U3#9IRc5J7nqwVrUsA@GLfazC@l)tGU+-Y(RUeZsf<%EsWqeKF6<^ z#oj~i0rC!$Ed3^I!$;VM3wVw1tFuKqjbHFQ)})w>18BuGjdqe{v=i!x`?usGdno1k z0Mqnm(TaBKQRy`%(QbAb?Fl0kQrO~HzKKQ;4O?*28+hXN$Hy)Ol2v2F(JiI_0a_1% AasU7T diff --git a/evennia/locale/de/LC_MESSAGES/django.po b/evennia/locale/de/LC_MESSAGES/django.po index c9dd9a743a..1bf7ff9e56 100644 --- a/evennia/locale/de/LC_MESSAGES/django.po +++ b/evennia/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-08-31 09:56+0000\n" +"POT-Creation-Date: 2025-08-31 10:23+0000\n" "PO-Revision-Date: 2025-03-28 10:21+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -353,8 +353,7 @@ msgstr "{hub_name} verwalten" msgid "" "(No {status} reports)\n" "{text}" -msgstr "Keine {status} Berichte" -"{text}" +msgstr "Keine {status} Berichte{text}" #: contrib/base_systems/ingame_reports/menu.py:52 #, python-brace-format @@ -411,7 +410,7 @@ msgstr "Alle offenen Berichte" #: contrib/base_systems/ingame_reports/menu.py:148 #, python-brace-format msgid " about {receivers}" -msgstr "über {receivers}" +msgstr " über {receivers}" #: contrib/base_systems/ingame_reports/menu.py:153 #, python-brace-format @@ -424,17 +423,17 @@ msgstr "" "{timestamp} von {senders}{about_clause}\n" "{tags}" -#: contrib/base_systems/ingame_reports/menu.py:168 +#: contrib/base_systems/ingame_reports/menu.py:167 #, python-brace-format msgid "Unmark as {tag}" msgstr "Markierung als {tag} entfernen" -#: contrib/base_systems/ingame_reports/menu.py:170 +#: contrib/base_systems/ingame_reports/menu.py:169 #, python-brace-format msgid "Mark as {tag}" msgstr "Als {tag} markieren" -#: contrib/base_systems/ingame_reports/menu.py:177 +#: contrib/base_systems/ingame_reports/menu.py:176 msgid "Manage another report" msgstr "Einen anderen Bericht verwalten."