~homeworkprod/byceps

d1dff0da024404aba983f83a2505094d392690c7 — Jochen Kupperschmidt 8 months ago e6f5deb
Translate flash messages to English
38 files changed, 252 insertions(+), 318 deletions(-)

M byceps/blueprints/admin/authentication/login/views.py
M byceps/blueprints/admin/board/views.py
M byceps/blueprints/admin/brand/views.py
M byceps/blueprints/admin/news/views.py
M byceps/blueprints/admin/orga/views.py
M byceps/blueprints/admin/orga_team/views.py
M byceps/blueprints/admin/party/views.py
M byceps/blueprints/admin/shop/article/views.py
M byceps/blueprints/admin/shop/order/views.py
M byceps/blueprints/admin/shop/shop/views.py
M byceps/blueprints/admin/shop/storefront/views.py
M byceps/blueprints/admin/site/views.py
M byceps/blueprints/admin/snippet/views.py
M byceps/blueprints/admin/ticketing/checkin/views.py
M byceps/blueprints/admin/ticketing/views.py
M byceps/blueprints/admin/tourney/category/views.py
M byceps/blueprints/admin/tourney/tourney/views.py
M byceps/blueprints/admin/user/views.py
M byceps/blueprints/admin/user_badge/views.py
M byceps/blueprints/admin/webhook/views.py
M byceps/blueprints/common/authentication/password/views.py
M byceps/blueprints/site/authentication/login/views.py
M byceps/blueprints/site/board/views_category.py
M byceps/blueprints/site/board/views_posting.py
M byceps/blueprints/site/board/views_topic.py
M byceps/blueprints/site/consent/views.py
M byceps/blueprints/site/newsletter/views.py
M byceps/blueprints/site/seating/views.py
M byceps/blueprints/site/shop/order/views.py
M byceps/blueprints/site/shop/orders/views.py
M byceps/blueprints/site/ticketing/views.py
M byceps/blueprints/site/user/avatar/views.py
M byceps/blueprints/site/user/creation/views.py
M byceps/blueprints/site/user/email_address/views.py
M byceps/blueprints/site/user/settings/views.py
M byceps/blueprints/site/user_group/views.py
M byceps/blueprints/site/user_message/views.py
M byceps/util/views.py
M byceps/blueprints/admin/authentication/login/views.py => byceps/blueprints/admin/authentication/login/views.py +3 -3
@@ 35,7 35,7 @@ def login_form():
    if g.user.is_active:
        flash_notice(
            gettext(
                'Du bist bereits als Benutzer "%(screen_name)s" angemeldet.',
                'You are already logged in as "%(screen_name)s".',
                screen_name=g.user.screen_name,
            )
        )


@@ 74,7 74,7 @@ def login():
    user_session.start(user.id, auth_token, permanent=permanent)
    flash_success(
        gettext(
            'Erfolgreich eingeloggt als %(screen_name)s.',
            'Successfully logged in as %(screen_name)s.',
            screen_name=user.screen_name,
        )
    )


@@ 93,4 93,4 @@ def _require_admin_access_permission(user_id: UserID) -> None:
def logout():
    """Log out user by deleting the corresponding cookie."""
    user_session.end()
    flash_success(gettext('Erfolgreich ausgeloggt.'))
    flash_success(gettext('Successfully logged out.'))

M byceps/blueprints/admin/board/views.py => byceps/blueprints/admin/board/views.py +11 -11
@@ 126,7 126,7 @@ def board_create(brand_id):

    flash_success(
        gettext(
            'Das Forum mit der ID "%(board_id)s" wurde angelegt.',
            'Board with ID "%(board_id)s" has been created.',
            board_id=board.id,
        )
    )


@@ 175,7 175,7 @@ def category_create(board_id):

    flash_success(
        gettext(
            'Die Kategorie "%(category_title)s" wurde angelegt.',
            'Category "%(category_title)s" has been created.',
            category_title=category.title,
        )
    )


@@ 223,7 223,7 @@ def category_update(category_id):

    flash_success(
        gettext(
            'Die Kategorie "%(category_title)s" wurde aktualisiert.',
            'Category "%(category_title)s" has been updated.',
            category_title=category.title,
        )
    )


@@ 243,7 243,7 @@ def category_hide(category_id):

    flash_success(
        gettext(
            'Die Kategorie "%(category_title)s" wurde versteckt.',
            'Category "%(category_title)s" has been hidden.',
            category_title=category.title,
        )
    )


@@ 262,7 262,7 @@ def category_unhide(category_id):

    flash_success(
        gettext(
            'Die Kategorie "%(category_title)s" wurde sichtbar gemacht.',
            'Category "%(category_title)s" has been made visible.',
            category_title=category.title,
        )
    )


@@ 280,14 280,14 @@ def category_move_up(category_id):
    except ValueError:
        flash_error(
            gettext(
                'Die Kategorie "%(category_title)s" befindet sich bereits ganz oben.',
                'Category "%(category_title)s" is already at the top.',
                category_title=category.title,
            )
        )
    else:
        flash_success(
            gettext(
                'Die Kategorie "%(category_title)s" wurde eine Position nach oben verschoben.',
                'Category "%(category_title)s" has been moved upwards by one position.',
                category_title=category.title,
            )
        )


@@ 305,14 305,14 @@ def category_move_down(category_id):
    except ValueError:
        flash_error(
            gettext(
                'Die Kategorie "%(category_title)s" befindet sich bereits ganz unten.',
                'Category "%(category_title)s" is already at the bottom.',
                category_title=category.title,
            )
        )
    else:
        flash_success(
            gettext(
                'Die Kategorie "%(category_title)s" wurde eine Position nach unten verschoben.',
                'Category "%(category_title)s" has been moved downwards by one position.',
                category_title=category.title,
            )
        )


@@ 330,14 330,14 @@ def category_delete(category_id):
    except Exception:
        flash_error(
            gettext(
                'Die Kategorie "%(category_title)s" konnte nicht gelöscht werden.',
                'Category "%(category_title)s" could not be deleted.',
                category_title=category.title,
            )
        )
    else:
        flash_success(
            gettext(
                'Die Kategorie "%(category_title)s" wurde gelöscht.',
                'Category "%(category_title)s" has been deleted.',
                category_title=category.title,
            )
        )

M byceps/blueprints/admin/brand/views.py => byceps/blueprints/admin/brand/views.py +3 -3
@@ 101,7 101,7 @@ def create():
    )

    flash_success(
        gettext('Die Marke "%(title)s" wurde angelegt.', title=brand.title)
        gettext('Brand "%(title)s" has been created.', title=brand.title)
    )
    return redirect_to('.index')



@@ 139,7 139,7 @@ def update(brand_id):
    )

    flash_success(
        gettext('Die Marke "%(title)s" wurde aktualisiert.', title=brand.title)
        gettext('Brand "%(title)s" has been updated.', title=brand.title)
    )
    return redirect_to('.view', brand_id=brand_id)



@@ 194,7 194,7 @@ def email_config_update(brand_id):
        config.brand_id, sender_address, sender_name, contact_address
    )

    flash_success(gettext('Die E-Mail-Konfiguration wurde aktualisiert.'))
    flash_success(gettext('Email configuration has been updated.'))
    return redirect_to('.view', brand_id=brand.id)



M byceps/blueprints/admin/news/views.py => byceps/blueprints/admin/news/views.py +7 -7
@@ 104,7 104,7 @@ def channel_create(brand_id):

    flash_success(
        gettext(
            'Der News-Kanal mit der ID "%(channel_id)s" wurde angelegt.',
            'News channel with ID "%(channel_id)s" has been created.',
            channel_id=channel.id,
        )
    )


@@ 199,7 199,7 @@ def image_create(item_id):

    flash_success(
        gettext(
            'Das Newsbild #%(image_number)s wurde hinzugefügt.',
            'News image #%(image_number)s has been created.',
            image_number=image.number,
        )
    )


@@ 244,7 244,7 @@ def image_update(image_id):

    flash_success(
        gettext(
            'Das Newsbild #%(image_number)s wurde aktualisiert.',
            'News image #%(image_number)s has been updated.',
            image_number=image.number,
        )
    )


@@ 403,7 403,7 @@ def item_create(channel_id):
    )

    flash_success(
        gettext('Die News "%(title)s" wurde angelegt.', title=item.title)
        gettext('News item "%(title)s" has been created.', title=item.title)
    )

    return redirect_to('.item_view', item_id=item.id)


@@ 451,7 451,7 @@ def item_update(item_id):
    )

    flash_success(
        gettext('Die News "%(title)s" wurde aktualisiert.', title=item.title)
        gettext('News item "%(title)s" has been updated.', title=item.title)
    )

    return redirect_to('.item_view', item_id=item.id)


@@ 494,7 494,7 @@ def item_publish_later(item_id):

    flash_success(
        gettext(
            'Die News "%(title)s" wird später veröffentlicht.', title=item.title
            'News item "%(title)s" will be published later.', title=item.title
        )
    )



@@ 513,7 513,7 @@ def item_publish_now(item_id):
    news_signals.item_published.send(None, event=event)

    flash_success(
        gettext('Die News "%(title)s" wurde veröffentlicht.', title=item.title)
        gettext('News item "%(title)s" has been published.', title=item.title)
    )



M byceps/blueprints/admin/orga/views.py => byceps/blueprints/admin/orga/views.py +4 -4
@@ 101,8 101,8 @@ def create_orgaflag(brand_id):

    flash_success(
        gettext(
            '%(screen_name)s wurde das Orga-Flag '
            'für die Marke %(brand_title)s gegeben.',
            '%(screen_name)s has received the orga flag '
            'for brand %(brand_title)s.',
            screen_name=orga_flag.user.screen_name,
            brand_title=orga_flag.brand.title,
        )


@@ 128,8 128,8 @@ def remove_orgaflag(brand_id, user_id):

    flash_success(
        gettext(
            '%(screen_name)s wurde das Orga-Flag '
            'für die Marke %(brand_title)s entzogen.',
            '%(screen_name)s has lost the orga flag '
            'for brand %(brand_title)s.',
            screen_name=user.screen_name,
            brand_title=brand.title,
        )

M byceps/blueprints/admin/orga_team/views.py => byceps/blueprints/admin/orga_team/views.py +11 -14
@@ 96,8 96,7 @@ def team_create(party_id):

    flash_success(
        gettext(
            'Das Team "%(team_title)s" wurde '
            'für die Party "%(party_title)s" erstellt.',
            'Team "%(team_title)s" for party "%(party_title)s" has been created.',
            team_title=team.title,
            party_title=party.title,
        )


@@ 115,7 114,7 @@ def team_delete(team_id):
    if orga_team_service.has_team_memberships(team.id):
        flash_error(
            gettext(
                'Orga team "%(team_title)s" cannot be deleted because it has members.',
                'Team "%(team_title)s" cannot be deleted because it has members.',
                team_title=team.title,
            )
        )


@@ 125,7 124,7 @@ def team_delete(team_id):

    orga_team_service.delete_team(team.id)

    flash_success(gettext('Das Team "%(title)s" wurde gelöscht.', title=title))
    flash_success(gettext('Team "%(title)s" has been deleted.', title=title))


@blueprint.route('/teams/<target_party_id>/copy')


@@ 139,7 138,7 @@ def teams_copy_form(target_party_id, erroneous_form=None):
    if team_count:
        flash_error(
            gettext(
                'Diese Party hat bereits Orga-Teams. Es können keine weiteren hinzu kopiert werden.'
                'This party already has teams. No additional teams can be copied to it.'
            )
        )
        return redirect_to('.teams_for_party', party_id=target_party.id)


@@ 157,9 156,7 @@ def teams_copy_form(target_party_id, erroneous_form=None):

    if not parties:
        flash_error(
            gettext(
                'Es sind keine anderen Partys vorhanden, von denen Orga-Teams kopiert werden können.'
            )
            gettext('No other parties exist from which teams could be copied.')
        )
        return redirect_to('.teams_for_party', party_id=target_party.id)



@@ 184,7 181,7 @@ def teams_copy(target_party_id):
    if target_team_count:
        flash_error(
            gettext(
                'Diese Party hat bereits Orga-Teams. Es können keine weiteren hinzu kopiert werden.'
                'This party already has teams. No additional teams can be copied to it.'
            )
        )
        return redirect_to('.teams_for_party', party_id=target_party.id)


@@ 204,8 201,8 @@ def teams_copy(target_party_id):

    flash_success(
        gettext(
            '%(copied_teams_count)s Team(s) wurde(n) von Party '
            '"%(source_party_title)s" zu Party "%(target_party_title)s" kopiert.',
            '%(copied_teams_count)s team(s) has/have been copied from party '
            '"%(source_party_title)s" to party "%(target_party_title)s".',
            copied_teams_count=copied_teams_count,
            source_party_title=source_party.title,
            target_party_title=target_party.title,


@@ 277,7 274,7 @@ def membership_create(team_id):

    flash_success(
        gettext(
            '%(screen_name)s wurde in das Team "%(team_title)s" aufgenommen.',
            '%(screen_name)s has been added to team "%(team_title)s".',
            screen_name=user.screen_name,
            team_title=team.title,
        )


@@ 339,7 336,7 @@ def membership_update(membership_id):

    flash_success(
        gettext(
            'Die Teammitgliedschaft von %(screen_name)s wurde aktualisiert.',
            'Membership of %(screen_name)s has been updated.',
            screen_name=user.screen_name,
        )
    )


@@ 360,7 357,7 @@ def membership_remove(membership_id):

    flash_success(
        gettext(
            '%(screen_name)s wurde aus dem Team "%(team_title)s" entfernt.',
            '%(screen_name)s has been removed from team "%(team_title)s".',
            screen_name=user.screen_name,
            team_title=team.title,
        )

M byceps/blueprints/admin/party/views.py => byceps/blueprints/admin/party/views.py +2 -2
@@ 166,7 166,7 @@ def create(brand_id):
    )

    flash_success(
        gettext('Die Party "%(title)s" wurde angelegt.', title=party.title)
        gettext('Party "%(title)s" has been created.', title=party.title)
    )

    return redirect_to('.index_for_brand', brand_id=brand.id)


@@ 230,7 230,7 @@ def update(party_id):
        abort(404, f'Unknown party ID "{party_id}".')

    flash_success(
        gettext('Die Party "%(title)s" wurde aktualisiert.', title=party.title)
        gettext('Party "%(title)s" has been updated.', title=party.title)
    )

    return redirect_to('.view', party_id=party.id)

M byceps/blueprints/admin/shop/article/views.py => byceps/blueprints/admin/shop/article/views.py +10 -15
@@ 194,9 194,7 @@ def create(shop_id):
    )
    if not article_number_sequences:
        flash_error(
            gettext(
                'Für diesen Shop sind keine Artikelnummer-Sequenzen definiert.'
            )
            gettext('No article number sequences are defined for this shop.')
        )
        return create_form(shop_id, form)



@@ 206,9 204,7 @@ def create(shop_id):

    article_number_sequence_id = form.article_number_sequence_id.data
    if not article_number_sequence_id:
        flash_error(
            gettext('Es wurde keine gültige Artikelnummer-Sequenz angegeben.')
        )
        flash_error(gettext('No valid article number sequence was specified.'))
        return create_form(shop_id, form)

    article_number_sequence = (


@@ 219,9 215,7 @@ def create(shop_id):
    if (article_number_sequence is None) or (
        article_number_sequence.shop_id != shop.id
    ):
        flash_error(
            gettext('Es wurde keine gültige Artikelnummer-Sequenz angegeben.')
        )
        flash_error(gettext('No valid article number sequence was specified.'))
        return create_form(shop_id, form)

    try:


@@ 250,7 244,7 @@ def create(shop_id):

    flash_success(
        gettext(
            'Der Artikel "%(item_number)s" wurde angelegt.',
            'Article "%(item_number)s" has been created.',
            item_number=article.item_number,
        )
    )


@@ 330,7 324,7 @@ def update(article_id):

    flash_success(
        gettext(
            'Der Artikel "%(description)s" wurde aktualisiert.',
            'Article "%(description)s" has been updated.',
            description=article.description,
        )
    )


@@ 393,7 387,7 @@ def attachment_create(article_id):

    flash_success(
        gettext(
            'Der Artikel "%(article_to_attach_item_number)s" wurde %(quantity)s mal an den Artikel "%(article_item_number)s" angehängt.',
            'Article "%(article_to_attach_item_number)s" has been attached %(quantity)s times to article "%(article_item_number)s".',
            article_to_attach_item_number=article_to_attach.item_number,
            quantity=quantity,
            article_item_number=article.item_number,


@@ 419,7 413,7 @@ def attachment_remove(article_id):

    flash_success(
        gettext(
            'Artikel "%(article_item_number)s" ist nun nicht mehr an Artikel "%(attached_to_article_item_number)s" angehängt.',
            'Article "%(article_item_number)s" is no longer attached to article "%(attached_to_article_item_number)s".',
            article_item_number=article.item_number,
            attached_to_article_item_number=attached_to_article.item_number,
        )


@@ 468,7 462,8 @@ def create_number_sequence(shop_id):
    if sequence_id is None:
        flash_error(
            gettext(
                'Die Artikelnummer-Sequenz konnte nicht angelegt werden. Ist das Präfix "%(prefix)s" bereits definiert?',
                'Article number sequence could not be created. '
                'Is prefix "%(prefix)s" already defined?',
                prefix=prefix,
            )
        )


@@ 476,7 471,7 @@ def create_number_sequence(shop_id):

    flash_success(
        gettext(
            'Die Artikelnummer-Sequenz mit dem Präfix "%(prefix)s" wurde angelegt.',
            'Article number sequence with prefix "%(prefix)s" has been created.',
            prefix=prefix,
        )
    )

M byceps/blueprints/admin/shop/order/views.py => byceps/blueprints/admin/shop/order/views.py +18 -22
@@ 164,7 164,7 @@ def set_invoiced_flag(order_id):

    flash_success(
        gettext(
            'Bestellung %(order_number)s wurde als in Rechnung gestellt markiert.',
            'Order %(order_number)s has been marked as invoiced.',
            order_number=order.order_number,
        )
    )


@@ 182,7 182,7 @@ def unset_invoiced_flag(order_id):

    flash_success(
        gettext(
            'Bestellung %(order_number)s wurde als nicht in Rechnung gestellt markiert.',
            'Order %(order_number)s has been marked as not invoiced.',
            order_number=order.order_number,
        )
    )


@@ 200,7 200,7 @@ def set_shipped_flag(order_id):

    flash_success(
        gettext(
            'Bestellung %(order_number)s wurde als verschickt markiert.',
            'Order %(order_number)s has been marked as shipped.',
            order_number=order.order_number,
        )
    )


@@ 218,7 218,7 @@ def unset_shipped_flag(order_id):

    flash_success(
        gettext(
            'Bestellung %(order_number)s wurde als nicht verschickt markiert.',
            'Order %(order_number)s has been marked as not shipped.',
            order_number=order.order_number,
        )
    )


@@ 238,7 238,8 @@ def cancel_form(order_id, erroneous_form=None):
    if order.is_canceled:
        flash_error(
            gettext(
                'Die Bestellung ist bereits storniert worden; der Bezahlstatus kann nicht mehr geändert werden.'
                'The order has already been canceled. '
                'The payment status cannot be changed anymore.'
            )
        )
        return redirect_to('.view', order_id=order.id)


@@ 277,25 278,23 @@ def cancel(order_id):
    except order_service.OrderAlreadyCanceled:
        flash_error(
            gettext(
                'Die Bestellung ist bereits storniert worden; der Bezahlstatus kann nicht mehr geändert werden.'
                'The order has already been canceled. '
                'The payment status cannot be changed anymore.'
            )
        )
        return redirect_to('.view', order_id=order.id)

    flash_success(
        gettext(
            'Die Bestellung wurde als storniert markiert und die betroffenen Artikel in den entsprechenden Stückzahlen wieder zur Bestellung freigegeben.'
            'The order has been canceled and the corresponding articles '
            'have been made available again.'
        )
    )

    if send_email:
        order_email_service.send_email_for_canceled_order_to_orderer(order.id)
    else:
        flash_notice(
            gettext(
                'Es wurde keine E-Mail an den/die Auftraggeber/in versendet.'
            )
        )
        flash_notice(gettext('No email has been sent to the orderer.'))

    shop_signals.order_canceled.send(None, event=event)



@@ 314,9 313,7 @@ def mark_as_paid_form(order_id, erroneous_form=None):
    order = _get_order_or_404(order_id)

    if order.is_paid:
        flash_error(
            gettext('Die Bestellung ist bereits als bezahlt markiert worden.')
        )
        flash_error(gettext('Order is already marked as paid.'))
        return redirect_to('.view', order_id=order.id)

    shop = shop_service.get_shop(order.shop_id)


@@ 351,12 348,10 @@ def mark_as_paid(order_id):
            order.id, payment_method, updated_by_id
        )
    except order_service.OrderAlreadyMarkedAsPaid:
        flash_error(
            gettext('Die Bestellung ist bereits als bezahlt markiert worden.')
        )
        flash_error(gettext('Order is already marked as paid.'))
        return redirect_to('.view', order_id=order.id)

    flash_success(gettext('Die Bestellung wurde als bezahlt markiert.'))
    flash_success(gettext('Order has been marked as paid.'))

    order_email_service.send_email_for_paid_order_to_orderer(order.id)



@@ 391,7 386,7 @@ def resend_email_for_incoming_order_to_orderer(order_id):
    )

    flash_success(
        gettext('Die E-Mail-Eingangsbestätigung wurde erneut versendet.')
        gettext('Email confirmation for placed order has been sent again.')
    )




@@ 435,7 430,8 @@ def create_number_sequence(shop_id):
    if sequence_id is None:
        flash_error(
            gettext(
                'Die Bestellnummer-Sequenz konnte nicht angelegt werden. Ist das Präfix "%(prefix)s" bereits definiert?',
                'Order number sequence could not be created. '
                'Is the prefix "%(prefix)s" already defined?',
                prefix=prefix,
            )
        )


@@ 443,7 439,7 @@ def create_number_sequence(shop_id):

    flash_success(
        gettext(
            'Die Bestellnummer-Sequenz mit dem Präfix "%(prefix)s" wurde angelegt.',
            'Order number sequence with prefix "%(prefix)s" has been created.',
            prefix=prefix,
        )
    )

M byceps/blueprints/admin/shop/shop/views.py => byceps/blueprints/admin/shop/shop/views.py +1 -1
@@ 87,7 87,7 @@ def create(brand_id):

    shop = shop_service.create_shop(shop_id, brand.id, title)

    flash_success(gettext('Der Shop wurde angelegt.'))
    flash_success(gettext('Shop has been created.'))
    return url_for('.view', shop_id=shop.id)



M byceps/blueprints/admin/shop/storefront/views.py => byceps/blueprints/admin/shop/storefront/views.py +5 -11
@@ 124,9 124,7 @@ def create(shop_id):
    )
    if not order_number_sequences:
        flash_error(
            gettext(
                'Für diesen Shop sind keine Bestellnummer-Sequenzen definiert.'
            )
            gettext('No order number sequences are defined for this shop.')
        )
        return create_form(shop_id, form)



@@ 140,9 138,7 @@ def create(shop_id):
    order_number_sequence_id = form.order_number_sequence_id.data

    if not order_number_sequence_id:
        flash_error(
            gettext('Es wurde keine gültige Bestellnummer-Sequenz angegeben.')
        )
        flash_error(gettext('No valid order number sequence was specified.'))
        return create_form(shop_id, form)

    order_number_sequence = order_sequence_service.find_order_number_sequence(


@@ 151,9 147,7 @@ def create(shop_id):
    if (order_number_sequence is None) or (
        order_number_sequence.shop_id != shop.id
    ):
        flash_error(
            gettext('Es wurde keine gültige Bestellnummer-Sequenz angegeben.')
        )
        flash_error(gettext('No valid order number sequence was specified.'))
        return create_form(shop_id, form)

    try:


@@ 173,7 167,7 @@ def create(shop_id):

    flash_success(
        gettext(
            'Storefront "%(storefront_id)s" wurde angelegt.',
            'Storefront "%(storefront_id)s" has been created.',
            storefront_id=storefront.id,
        )
    )


@@ 241,7 235,7 @@ def update(storefront_id):

    flash_success(
        gettext(
            'Storefront "%(storefront_id)s" wurde aktualisiert.',
            'Storefront "%(storefront_id)s" has been updated.',
            storefront_id=storefront.id,
        )
    )

M byceps/blueprints/admin/site/views.py => byceps/blueprints/admin/site/views.py +4 -4
@@ 206,7 206,7 @@ def create(brand_id):
        if not party:
            flash_error(
                gettext(
                    'Die Party-ID "%(party_id)s" ist unbekannt.',
                    'Party ID "%(party_id)s" is unknown.',
                    party_id=party_id,
                )
            )


@@ 229,7 229,7 @@ def create(brand_id):
    )

    flash_success(
        gettext('Die Site "%(title)s" wurde angelegt.', title=site.title)
        gettext('Site "%(title)s" has been created.', title=site.title)
    )

    return redirect_to('.view', site_id=site.id)


@@ 282,7 282,7 @@ def update(site_id):
        if not party:
            flash_error(
                gettext(
                    'Die Party-ID "%(party_id)s" ist unbekannt.',
                    'Party ID "%(party_id)s" is unknown.',
                    party_id=party_id,
                )
            )


@@ 309,7 309,7 @@ def update(site_id):
        abort(404, f'Unknown site ID "{site_id}".')

    flash_success(
        gettext('Die Site "%(title)s" wurde aktualisiert.', title=site.title)
        gettext('Site "%(title)s" has been updated.', title=site.title)
    )

    return redirect_to('.view', site_id=site.id)

M byceps/blueprints/admin/snippet/views.py => byceps/blueprints/admin/snippet/views.py +8 -8
@@ 195,7 195,7 @@ def create_document(scope_type, scope_name):

    flash_success(
        gettext(
            'Das Dokument "%(name)s" wurde angelegt.', name=version.snippet.name
            'Document "%(name)s" has been created.', name=version.snippet.name
        )
    )



@@ 253,7 253,7 @@ def update_document(snippet_id):

    flash_success(
        gettext(
            'Das Dokument "%(name)s" wurde aktualisiert.',
            'Document "%(name)s" has been updated.',
            name=version.snippet.name,
        )
    )


@@ 343,7 343,7 @@ def create_fragment(scope_type, scope_name):

    flash_success(
        gettext(
            'Das Fragment "%(name)s" wurde angelegt.', name=version.snippet.name
            'Fragment "%(name)s" has been created.', name=version.snippet.name
        )
    )



@@ 393,7 393,7 @@ def update_fragment(snippet_id):

    flash_success(
        gettext(
            'Das Fragment "%(name)s" wurde aktualisiert.',
            'Fragment "%(name)s" has been updated.',
            name=version.snippet.name,
        )
    )


@@ 452,14 452,14 @@ def delete_snippet(snippet_id):
    if not success:
        flash_error(
            gettext(
                'Das Snippet "%(snippet_name)s" konnte nicht gelöscht werden. Ist es noch gemountet?',
                'Snippet "%(snippet_name)s" could not be deleted. Is it still mounted?',
                snippet_name=snippet_name,
            )
        )
        return url_for('.view_current_version', snippet_id=snippet.id)

    flash_success(
        gettext('Das Snippet "%(name)s" wurde gelöscht.', name=snippet_name)
        gettext('Snippet "%(name)s" has been deleted.', name=snippet_name)
    )
    snippet_signals.snippet_deleted.send(None, event=event)
    return url_for(


@@ 540,7 540,7 @@ def create_mountpoint(snippet_id):

    flash_success(
        gettext(
            'Der Mountpoint für "%(url_path)s" wurde angelegt.',
            'Mountpoint for "%(url_path)s" has been created.',
            url_path=mountpoint.url_path,
        )
    )


@@ 563,7 563,7 @@ def delete_mountpoint(mountpoint_id):

    flash_success(
        gettext(
            'Der Mountpoint für "%(url_path)s" wurde entfernt.',
            'Mountpoint for "%(url_path)s" has been deleted.',
            url_path=url_path,
        )
    )

M byceps/blueprints/admin/ticketing/checkin/views.py => byceps/blueprints/admin/ticketing/checkin/views.py +5 -5
@@ 123,14 123,14 @@ def check_in_user(party_id, ticket_id):
    except ticket_exceptions.UserAccountDeleted:
        flash_error(
            gettext(
                'Das dem Ticket zugewiesene Benutzerkonto ist gelöscht worden. Der Check-In ist nicht erlaubt.'
                'The user account assigned to this ticket has been deleted. Check-in denied.'
            )
        )
        return
    except ticket_exceptions.UserAccountSuspended:
        flash_error(
            gettext(
                'Das dem Ticket zugewiesene Benutzerkonto ist gesperrt. Der Check-In ist nicht erlaubt.'
                'The user account assigned to this ticket has been suspended. Check-in denied.'
            )
        )
        return


@@ 141,7 141,7 @@ def check_in_user(party_id, ticket_id):

    flash_success(
        gettext(
            'Benutzer <em>%(screen_name)s</em> wurde mit Ticket <a href="%(ticket_url)s">%(ticket_code)s</a> eingecheckt.',
            'User <em>%(screen_name)s</em> has been checked in with ticket <a href="%(ticket_url)s">%(ticket_code)s</a>.',
            screen_name=ticket.used_by.screen_name,
            ticket_url=ticket_url,
            ticket_code=ticket.code,


@@ 153,7 153,7 @@ def check_in_user(party_id, ticket_id):
    if not occupies_seat:
        flash_notice(
            gettext(
                'Ticket <a href="%(ticket_url)s">%(ticket_code)s</a> belegt noch keinen Sitzplatz.',
                'Ticket <a href="%(ticket_url)s">%(ticket_code)s</a> does not occupy a seat.',
                ticket_url=ticket_url,
                ticket_code=ticket.code,
            ),


@@ 175,7 175,7 @@ def revert_user_check_in(ticket_id):

    ticket_user_checkin_service.revert_user_check_in(ticket.id, initiator_id)

    flash_success(gettext('Der Check-In wurde rückgängig gemacht.'))
    flash_success(gettext('Check-in has been reverted.'))


def _get_party_or_404(party_id):

M byceps/blueprints/admin/ticketing/views.py => byceps/blueprints/admin/ticketing/views.py +4 -5
@@ 100,7 100,7 @@ def update_code_form(ticket_id, erroneous_form=None):
    if ticket.user_checked_in:
        flash_error(
            gettext(
                'Der Code kann nicht geändert werden, da bereits jemand mit diesem Ticket eingecheckt worden ist.'
                'Code cannot be changed as somebody has already been checked in with this ticket.'
            )
        )
        return redirect_to('.view_ticket', ticket_id=ticket.id)


@@ 125,7 125,7 @@ def update_code(ticket_id):
    if ticket.user_checked_in:
        flash_error(
            gettext(
                'Der Code kann nicht geändert werden, da bereits jemand mit diesem Ticket eingecheckt worden ist.'
                'Code cannot be changed as somebody has already been checked in with this ticket.'
            )
        )
        return redirect_to('.view_ticket', ticket_id=ticket.id)


@@ 141,7 141,7 @@ def update_code(ticket_id):

    flash_success(
        gettext(
            'Der Code von Ticket %(ticket_code)s wurde geändert.',
            'Code for ticket %(ticket_code)s has been updated.',
            ticket_code=ticket.code,
        )
    )


@@ 187,8 187,7 @@ def appoint_user(ticket_id):

    flash_success(
        gettext(
            '%(screen_name)s wurde als Nutzer/in '
            'von Ticket %(ticket_code)s eingetragen.',
            '%(screen_name)s has been assigned as user of ticket %(ticket_code)s.',
            screen_name=user.screen_name,
            ticket_code=ticket.code,
        )

M byceps/blueprints/admin/tourney/category/views.py => byceps/blueprints/admin/tourney/category/views.py +6 -6
@@ 74,7 74,7 @@ def create(party_id):

    flash_success(
        gettext(
            'Die Kategorie "%(category_title)s" wurde angelegt.',
            'Category "%(category_title)s" has been created.',
            category_title=category.title,
        )
    )


@@ 117,7 117,7 @@ def update(category_id):

    flash_success(
        gettext(
            'Die Kategorie "%(category_title)s" wurde aktualisiert.',
            'Category "%(category_title)s" has been updated.',
            category_title=category.title,
        )
    )


@@ 136,14 136,14 @@ def move_up(category_id):
    except ValueError:
        flash_error(
            gettext(
                'Die Kategorie "%(category_title)s" befindet sich bereits ganz oben.',
                'Category "%(category_title)s" is already at the top.',
                category_title=category.title,
            )
        )
    else:
        flash_success(
            gettext(
                'Die Kategorie "%(category_title)s" wurde eine Position nach oben verschoben.'
                'Category "%(category_title)s" has been moved upwards by one position.'
            )
        )



@@ 160,14 160,14 @@ def move_down(category_id):
    except ValueError:
        flash_error(
            gettext(
                'Die Kategorie "%(category_title)s" befindet sich bereits ganz unten.',
                'Category "%(category_title)s" is already at the bottom.',
                category_title=category.title,
            )
        )
    else:
        flash_success(
            gettext(
                'Die Kategorie "%(category_title)s" wurde eine Position nach unten verschoben.'
                'Category "%(category_title)s" has been moved downwards by one position.'
            )
        )


M byceps/blueprints/admin/tourney/tourney/views.py => byceps/blueprints/admin/tourney/tourney/views.py +2 -4
@@ 95,7 95,7 @@ def create(party_id):
    )

    flash_success(
        gettext('Das Turnier "%(title)s" wurde angelegt.', title=tourney.title)
        gettext('Tourney "%(title)s" has been created.', title=tourney.title)
    )

    return redirect_to('.index', party_id=tourney.party_id)


@@ 165,9 165,7 @@ def update(tourney_id):
    )

    flash_success(
        gettext(
            'Das Turnier "%(title)s" wurde aktualisiert.', title=tourney.title
        )
        gettext('Tourney "%(title)s" has been updated.', title=tourney.title)
    )

    return redirect_to('.index', party_id=tourney.party_id)

M byceps/blueprints/admin/user/views.py => byceps/blueprints/admin/user/views.py +20 -28
@@ 178,19 178,11 @@ def create_account():
        site = None

    if user_service.is_screen_name_already_assigned(screen_name):
        flash_error(
            gettext(
                'Dieser Benutzername ist bereits einem Benutzerkonto zugeordnet.'
            )
        )
        flash_error(gettext('This username cannot be used.'))
        return create_account_form(form)

    if user_service.is_email_address_already_assigned(email_address):
        flash_error(
            gettext(
                'Diese E-Mail-Adresse ist bereits einem Benutzerkonto zugeordnet.'
            )
        )
        flash_error(gettext('This email address cannot be used.'))
        return create_account_form(form)

    initiator_id = g.user.id


@@ 207,7 199,7 @@ def create_account():
    except user_creation_service.UserCreationFailed:
        flash_error(
            gettext(
                'Das Benutzerkonto für "%(screen_name)s" konnte nicht angelegt werden.',
                'User "%(screen_name)s" could not be created.',
                screen_name=screen_name,
            )
        )


@@ 215,7 207,7 @@ def create_account():

    flash_success(
        gettext(
            'Das Benutzerkonto "%(screen_name)s" wurde angelegt.',
            'User "%(screen_name)s" has been created.',
            screen_name=user.screen_name,
        )
    )


@@ 225,7 217,7 @@ def create_account():
            user, email_address, site_id
        )
        flash_success(
            gettext('Eine E-Mail wurde an die hinterlegte Adresse versendet.'),
            gettext('An email has been sent to the corresponding address.'),
            icon='email',
        )



@@ 266,7 258,7 @@ def set_password(user_id):

    flash_success(
        gettext(
            "Für Benutzerkonto '%(screen_name)s' wurde ein neues Passwort gesetzt.",
            "New password has been set for user '%(screen_name)s'.",
            screen_name=user.screen_name,
        )
    )


@@ 287,7 279,7 @@ def initialize_account(user_id):

    flash_success(
        gettext(
            "Das Benutzerkonto '%(screen_name)s' wurde initialisiert.",
            "User '%(screen_name)s' has been initialized.",
            screen_name=user.screen_name,
        )
    )


@@ 303,7 295,7 @@ def suspend_account_form(user_id, erroneous_form=None):
    if user.suspended:
        flash_error(
            gettext(
                "Das Benutzerkonto '%(screen_name)s' ist bereits gesperrt.",
                "User '%(screen_name)s' is already suspended.",
                screen_name=user.screen_name,
            )
        )


@@ 326,7 318,7 @@ def suspend_account(user_id):
    if user.suspended:
        flash_error(
            gettext(
                "Das Benutzerkonto '%(screen_name)s' ist bereits gesperrt.",
                "User '%(screen_name)s' is already suspended.",
                screen_name=user.screen_name,
            )
        )


@@ 345,7 337,7 @@ def suspend_account(user_id):

    flash_success(
        gettext(
            "Das Benutzerkonto '%(screen_name)s' wurde gesperrt.",
            "User '%(screen_name)s' has been suspended.",
            screen_name=user.screen_name,
        )
    )


@@ 362,7 354,7 @@ def unsuspend_account_form(user_id, erroneous_form=None):
    if not user.suspended:
        flash_error(
            gettext(
                "Das Benutzerkonto '%(screen_name)s' ist bereits entsperrt.",
                "User '%(screen_name)s' is not suspended.",
                screen_name=user.screen_name,
            )
        )


@@ 385,7 377,7 @@ def unsuspend_account(user_id):
    if not user.suspended:
        flash_error(
            gettext(
                "Das Benutzerkonto '%(screen_name)s' ist bereits entsperrt.",
                "User '%(screen_name)s' is not suspended.",
                screen_name=user.screen_name,
            )
        )


@@ 406,7 398,7 @@ def unsuspend_account(user_id):

    flash_success(
        gettext(
            "Das Benutzerkonto '%(screen_name)s' wurde entsperrt.",
            "User '%(screen_name)s' has been unsuspended.",
            screen_name=user.screen_name,
        )
    )


@@ 423,7 415,7 @@ def delete_account_form(user_id, erroneous_form=None):
    if user.deleted:
        flash_error(
            gettext(
                f"Das Benutzerkonto '%(user.screen_name)s' ist bereits gelöscht worden.",
                "User '%(screen_name)s' has already been deleted.",
                screen_name=user.screen_name,
            )
        )


@@ 446,7 438,7 @@ def delete_account(user_id):
    if user.deleted:
        flash_error(
            gettext(
                "Das Benutzerkonto '%(user.screen_name)s' ist bereits gelöscht worden.",
                "User '%(screen_name)s' has already been deleted.",
                screen_name=user.screen_name,
            )
        )


@@ 465,7 457,7 @@ def delete_account(user_id):

    flash_success(
        gettext(
            "Das Benutzerkonto '%(screen_name)s' wurde gelöscht.",
            "User '%(screen_name)s' has been deleted.",
            screen_name=user.screen_name,
        )
    )


@@ 510,7 502,7 @@ def change_email_address(user_id):

    flash_success(
        gettext(
            "Die E-Mail-Adresse des Benutzerkontos '%(screen_name)s' wurde geändert.",
            "Email address for user '%(screen_name)s' has been updated.",
            screen_name=user.screen_name,
        )
    )


@@ 555,7 547,7 @@ def change_screen_name(user_id):

    flash_success(
        gettext(
            "Das Benutzerkonto '%(old_screen_name)s' wurde umbenannt in '%(new_screen_name)s'.",
            "User '%(old_screen_name)s' has been renamed to '%(new_screen_name)s'.",
            old_screen_name=old_screen_name,
            new_screen_name=new_screen_name,
        )


@@ 615,7 607,7 @@ def role_assign(user_id, role_id):

    flash_success(
        gettext(
            '%(screen_name)s wurde die Rolle "%(role_title)s" zugewiesen.',
            '%(role_title)s has been assigned to "%(screen_name)s".',
            screen_name=user.screen_name,
            role_title=role.title,
        )


@@ 637,7 629,7 @@ def role_deassign(user_id, role_id):

    flash_success(
        gettext(
            '%(screen_name)s wurde die Rolle "%(role_title)s" genommen.',
            '%(role_title)s has been withdrawn from "%(screen_name)s".',
            screen_name=user.screen_name,
            role_title=role.title,
        )

M byceps/blueprints/admin/user_badge/views.py => byceps/blueprints/admin/user_badge/views.py +3 -3
@@ 140,7 140,7 @@ def create():

    flash_success(
        gettext(
            'Das Abzeichen "%(badge_label)s" wurde angelegt.',
            'Badge "%(badge_label)s" has been created.',
            badge_label=badge.label,
        )
    )


@@ 187,7 187,7 @@ def update(badge_id):

    flash_success(
        gettext(
            'Das Abzeichen "%(badge_label)s" wurde aktualisiert.',
            'Badge "%(badge_label)s" has been updated.',
            badge_label=badge.label,
        )
    )


@@ 249,7 249,7 @@ def award(user_id):

    flash_success(
        gettext(
            'Das Abzeichen "%(badge_label)s" wurde an %(screen_name)s verliehen.',
            'Badge "%(badge_label)s" has been awarded to %(screen_name)s.',
            badge_label=badge.label,
            screen_name=user.screen_name,
        )

M byceps/blueprints/admin/webhook/views.py => byceps/blueprints/admin/webhook/views.py +2 -2
@@ 53,11 53,11 @@ def test(webhook_id):
    try:
        call_webhook(webhook, text)
        flash_success(
            gettext('Der Webhook-Aufruf war erfolgreich.'), icon='success'
            gettext('Webhook call has been successful.'), icon='success'
        )
    except Exception as e:
        flash_error(
            gettext('Der Webhook-Aufruf ist fehlgeschlagen:')
            gettext('Webhook call failed:')
            + f'<br><pre style="white-space: pre-wrap;">{e}</pre>',
            icon='warning',
            text_is_safe=True,

M byceps/blueprints/common/authentication/password/views.py => byceps/blueprints/common/authentication/password/views.py +10 -12
@@ 64,9 64,7 @@ def update():

    password_service.update_password_hash(user.id, password, user.id)

    flash_success(
        gettext('Dein Passwort wurde geändert. Bitte melde dich erneut an.')
    )
    flash_success(gettext('Password has been updated. Please log in again.'))

    if get_app_mode().is_admin():
        return redirect_to('authentication.login_admin.login_form')


@@ 102,7 100,7 @@ def request_reset():
    if (user is None) or user.deleted:
        flash_error(
            gettext(
                'Der Benutzername "%(screen_name)s" ist unbekannt.',
                'User name "%(screen_name)s" is unknown.',
                screen_name=screen_name,
            )
        )


@@ 111,7 109,7 @@ def request_reset():
    if user.email_address is None:
        flash_error(
            gettext(
                'Für das Benutzerkonto "%(screen_name)s" ist keine E-Mail-Adresse hinterlegt.',
                'No email address is set for user "%(screen_name)s".',
                screen_name=screen_name,
            )
        )


@@ 120,7 118,7 @@ def request_reset():
    if not user.email_address_verified:
        flash_error(
            gettext(
                'Die E-Mail-Adresse für das Benutzerkonto "%(screen_name)s" wurde noch nicht bestätigt.',
                'The email address for user "%(screen_name)s" has not been verified.',
                screen_name=screen_name,
            )
        )


@@ 129,7 127,7 @@ def request_reset():
    if user.suspended:
        flash_error(
            gettext(
                'Das Benutzerkonto "%(screen_name)s" ist gesperrt.',
                'User "%(screen_name)s" has been suspended.',
                screen_name=screen_name,
            )
        )


@@ 143,8 141,8 @@ def request_reset():

    flash_success(
        gettext(
            'Ein Link zum Setzen eines neuen Passworts für den Benutzernamen '
            '"%(screen_name)s" wurde an die hinterlegte E-Mail-Adresse versendet.',
            'A link to set a new password for user "%(screen_name)s" '
            'has been sent to the corresponding email address.',
            screen_name=user.screen_name,
        )
    )


@@ 187,7 185,7 @@ def reset(token):

    password_reset_service.reset_password(verification_token, password)

    flash_success(gettext('Das Passwort wurde geändert.'))
    flash_success(gettext('Password has been updated.'))
    return redirect_to('authentication.login.login_form')




@@ 199,7 197,7 @@ def _verify_reset_token(token: str) -> VerificationToken:
    if not _is_verification_token_valid(verification_token):
        flash_error(
            gettext(
                'Es wurde kein gültiges Token angegeben. Ein Token ist nur %(hours)s Stunden lang gültig.',
                'Invalid token. A token expires after %(hours)s hours.',
                hours=24,
            )
        )


@@ 207,7 205,7 @@ def _verify_reset_token(token: str) -> VerificationToken:

    user = user_service.find_active_user(verification_token.user_id)
    if user is None:
        flash_error(gettext('Es wurde kein gültiges Token angegeben.'))
        flash_error(gettext('No valid token specified.'))
        abort(404)

    return verification_token

M byceps/blueprints/site/authentication/login/views.py => byceps/blueprints/site/authentication/login/views.py +3 -3
@@ 45,7 45,7 @@ def login_form():
    if g.user.is_active:
        flash_notice(
            gettext(
                'Du bist bereits als Benutzer "%(screen_name)s" angemeldet.',
                'You are already logged in as "%(screen_name)s".',
                screen_name=g.user.screen_name,
            )
        )


@@ 107,7 107,7 @@ def login():
    user_session.start(user.id, auth_token, permanent=permanent)
    flash_success(
        gettext(
            'Erfolgreich eingeloggt als %(screen_name)s.',
            'Successfully logged in as %(screen_name)s.',
            screen_name=user.screen_name,
        )
    )


@@ 130,7 130,7 @@ def _is_consent_required(user_id: UserID) -> bool:
def logout():
    """Log out user by deleting the corresponding cookie."""
    user_session.end()
    flash_success(gettext('Erfolgreich ausgeloggt.'))
    flash_success(gettext('Successfully logged out.'))


# helpers

M byceps/blueprints/site/board/views_category.py => byceps/blueprints/site/board/views_category.py +1 -1
@@ 96,7 96,7 @@ def mark_all_topics_in_category_as_viewed(category_id):
    )

    flash_success(
        gettext('Alle Themen in dieser Kategorie wurden als gelesen markiert.')
        gettext('All topics in this category have been marked as read.')
    )

    return url_for('.category_view', slug=category.slug)

M byceps/blueprints/site/board/views_posting.py => byceps/blueprints/site/board/views_posting.py +15 -17
@@ 70,7 70,7 @@ def quote_posting_as_bbcode():

    posting = board_posting_query_service.find_posting_by_id(posting_id)
    if posting is None:
        flash_error(gettext('Der zu zitierende Beitrag wurde nicht gefunden.'))
        flash_error(gettext('The posting to quote has not been found.'))
        return

    creator = user_service.get_user(posting.creator_id)


@@ 93,9 93,7 @@ def posting_create(topic_id):

    if topic.locked:
        flash_error(
            gettext(
                'Das Thema ist geschlossen. Es können keine Beiträge mehr hinzugefügt werden.'
            ),
            gettext('This topic is locked. It cannot be replied to.'),
            icon='lock',
        )
        return redirect(h.build_url_for_topic(topic.id))


@@ 104,9 102,7 @@ def posting_create(topic_id):
        BoardPermission.announce
    ):
        flash_error(
            gettext(
                'In diesem Thema dürfen nur Moderatoren Beiträge hinzufügen.'
            ),
            gettext('Only moderators are allowed to reply in this topic.'),
            icon='announce',
        )
        return redirect(h.build_url_for_topic(topic.id))


@@ 120,7 116,7 @@ def posting_create(topic_id):
            topic.category.id, g.user.id
        )

    flash_success(gettext('Deine Antwort wurde hinzugefügt.'))
    flash_success(gettext('Your reply has been added.'))

    event = dataclasses.replace(
        event, url=h.build_external_url_for_posting(posting.id)


@@ 148,17 144,18 @@ def posting_update_form(posting_id, erroneous_form=None):
    if posting.topic.locked and not user_may_update:
        flash_error(
            gettext(
                'Der Beitrag darf nicht bearbeitet werden weil das Thema, zu dem dieser Beitrag gehört, gesperrt ist.'
                'The posting must not be edited because '
                'the topic it belongs to is locked.'
            )
        )
        return redirect(url)

    if posting.topic.hidden or posting.hidden:
        flash_error(gettext('Der Beitrag darf nicht bearbeitet werden.'))
        flash_error(gettext('The posting must not be edited.'))
        return redirect(url)

    if not user_may_update:
        flash_error(gettext('Du darfst diesen Beitrag nicht bearbeiten.'))
        flash_error(gettext('You are not allowed to edit this posting.'))
        return redirect(url)

    form = erroneous_form if erroneous_form else PostingUpdateForm(obj=posting)


@@ 184,17 181,18 @@ def posting_update(posting_id):
    if posting.topic.locked and not user_may_update:
        flash_error(
            gettext(
                'Der Beitrag darf nicht bearbeitet werden weil das Thema, zu dem dieser Beitrag gehört, gesperrt ist.'
                'The posting must not be edited because '
                'the topic it belongs to is locked.'
            )
        )
        return redirect(url)

    if posting.topic.hidden or posting.hidden:
        flash_error(gettext('Der Beitrag darf nicht bearbeitet werden.'))
        flash_error(gettext('The posting must not be edited.'))
        return redirect(url)

    if not user_may_update:
        flash_error(gettext('Du darfst diesen Beitrag nicht bearbeiten.'))
        flash_error(gettext('You are not allowed to edit this posting.'))
        return redirect(url)

    form = PostingUpdateForm(request.form)


@@ 205,7 203,7 @@ def posting_update(posting_id):
        posting.id, g.user.id, form.body.data
    )

    flash_success(gettext('Der Beitrag wurde aktualisiert.'))
    flash_success(gettext('The posting has been updated.'))

    event = dataclasses.replace(
        event, url=h.build_external_url_for_posting(posting.id)


@@ 241,7 239,7 @@ def posting_hide(posting_id):

    page = service.calculate_posting_page_number(posting, g.user)

    flash_success(gettext('Der Beitrag wurde versteckt.'), icon='hidden')
    flash_success(gettext('The posting has been hidden.'), icon='hidden')

    event = dataclasses.replace(
        event, url=h.build_external_url_for_posting(posting.id)


@@ 266,7 264,7 @@ def posting_unhide(posting_id):
    page = service.calculate_posting_page_number(posting, g.user)

    flash_success(
        gettext('Der Beitrag wurde wieder sichtbar gemacht.'), icon='view'
        gettext('The posting has been made visible again.'), icon='view'
    )

    event = dataclasses.replace(

M byceps/blueprints/site/board/views_topic.py => byceps/blueprints/site/board/views_topic.py +18 -25
@@ 162,7 162,7 @@ def topic_create(category_id):
    topic_url = h.build_external_url_for_topic(topic.id)

    flash_success(
        gettext('Das Thema "%(title)s" wurde hinzugefügt.', title=topic.title)
        gettext('Topic "%(title)s" has been created.', title=topic.title)
    )

    event = dataclasses.replace(event, url=topic_url)


@@ 183,18 183,16 @@ def topic_update_form(topic_id, erroneous_form=None):

    if topic.locked and not user_may_update:
        flash_error(
            gettext(
                'Das Thema darf nicht bearbeitet werden weil es gesperrt ist.'
            )
            gettext('The topic must not be updated because it is locked.')
        )
        return redirect(url)

    if topic.hidden:
        flash_error(gettext('Das Thema darf nicht bearbeitet werden.'))
        flash_error(gettext('The topic must not be updated.'))
        return redirect(url)

    if not user_may_update:
        flash_error(gettext('Du darfst dieses Thema nicht bearbeiten.'))
        flash_error(gettext('You are not allowed to update this topic.'))
        return redirect(url)

    form = (


@@ 221,18 219,16 @@ def topic_update(topic_id):

    if topic.locked and not user_may_update:
        flash_error(
            gettext(
                'Das Thema darf nicht bearbeitet werden weil es gesperrt ist.'
            )
            gettext('The topic must not be updated because it is locked.')
        )
        return redirect(url)

    if topic.hidden:
        flash_error(gettext('Das Thema darf nicht bearbeitet werden.'))
        flash_error(gettext('The topic must not be updated.'))
        return redirect(url)

    if not user_may_update:
        flash_error(gettext('Du darfst dieses Thema nicht bearbeiten.'))
        flash_error(gettext('You are not allowed to update this topic.'))
        return redirect(url)

    form = TopicUpdateForm(request.form)


@@ 244,7 240,7 @@ def topic_update(topic_id):
    )

    flash_success(
        gettext('Das Thema "%(title)s" wurde aktualisiert.', title=topic.title)
        gettext('Topic "%(title)s" has been updated.', title=topic.title)
    )
    return redirect(url)



@@ 280,7 276,7 @@ def topic_hide(topic_id):
    event = board_topic_command_service.hide_topic(topic.id, moderator_id)

    flash_success(
        gettext('Das Thema "%(title)s" wurde versteckt.', title=topic.title),
        gettext('Topic "%(title)s" has been hidden.', title=topic.title),
        icon='hidden',
    )



@@ 304,7 300,7 @@ def topic_unhide(topic_id):

    flash_success(
        gettext(
            'Das Thema "%(title)s" wurde wieder sichtbar gemacht.',
            'Topic "%(title)s" has been made visible again.',
            title=topic.title,
        ),
        icon='view',


@@ 329,7 325,7 @@ def topic_lock(topic_id):
    event = board_topic_command_service.lock_topic(topic.id, moderator_id)

    flash_success(
        gettext('Das Thema "%(title)s" wurde geschlossen.', title=topic.title),
        gettext('Topic "%(title)s" has been locked.', title=topic.title),
        icon='lock',
    )



@@ 352,9 348,7 @@ def topic_unlock(topic_id):
    event = board_topic_command_service.unlock_topic(topic.id, moderator_id)

    flash_success(
        gettext(
            'Das Thema "%(title)s" wurde wieder geöffnet.', title=topic.title
        ),
        gettext('Topic "%(title)s" has been unlocked.', title=topic.title),
        icon='unlock',
    )



@@ 377,7 371,7 @@ def topic_pin(topic_id):
    event = board_topic_command_service.pin_topic(topic.id, moderator_id)

    flash_success(
        gettext('Das Thema "%(title)s" wurde angepinnt.', title=topic.title),
        gettext('Topic "%(title)s" has been pinned.', title=topic.title),
        icon='pin',
    )



@@ 400,7 394,7 @@ def topic_unpin(topic_id):
    event = board_topic_command_service.unpin_topic(topic.id, moderator_id)

    flash_success(
        gettext('Das Thema "%(title)s" wurde wieder gelöst.', title=topic.title)
        gettext('Topic "%(title)s" has been unpinned.', title=topic.title)
    )

    event = dataclasses.replace(


@@ 432,9 426,8 @@ def topic_move(topic_id):

    flash_success(
        gettext(
            'Das Thema "%(topic_title)s" wurde '
            'aus der Kategorie "%(old_category_title)s" '
            'in die Kategorie "%(new_category_title)s" verschoben.',
            'Topic "%(topic_title)s" has been moved from category '
            '"%(old_category_title)s" to category "%(new_category_title)s".',
            topic_title=topic.title,
            old_category_title=old_category.title,
            new_category_title=new_category.title,


@@ 463,7 456,7 @@ def topic_limit_to_announcements(topic_id):

    flash_success(
        gettext(
            'Das Thema "%(title)s" wurde auf Ankündigungen beschränkt.',
            'Topic "%(title)s" has been limited to announcements.',
            title=topic.title,
        ),
        icon='announce',


@@ 485,7 478,7 @@ def topic_remove_limit_to_announcements(topic_id):

    flash_success(
        gettext(
            'Das Thema "%(title)s" wurde für normale Beiträge geöffnet.',
            'Topic "%(title)s" has been reopened for regular replies.',
            title=topic.title,
        )
    )

M byceps/blueprints/site/consent/views.py => byceps/blueprints/site/consent/views.py +3 -5
@@ 76,7 76,7 @@ def consent(token):
    try:
        subject_service.get_subjects(subject_ids_from_form)
    except subject_service.UnknownSubjectId:
        flash_error(gettext('Unbekanntes Zustimmungsthema'))
        flash_error(gettext('Unknown consent subject'))
        return consent_form(token, erroneous_form=form)

    expressed_at = datetime.utcnow()


@@ 84,9 84,7 @@ def consent(token):
        subject_ids_from_form, expressed_at, verification_token
    )

    flash_success(
        gettext('Vielen Dank für deine Zustimmung. Bitte melde dich erneut an.')
    )
    flash_success(gettext('Thank you for your consent. Please log in again.'))
    return redirect_to('authentication.login.login_form')




@@ 108,7 106,7 @@ def _get_verification_token_or_404(token_value):
    )

    if verification_token is None:
        flash_error(gettext('Unbekannter Bestätigungscode'))
        flash_error(gettext('Invalid verification token'))
        abort(404)

    return verification_token

M byceps/blueprints/site/newsletter/views.py => byceps/blueprints/site/newsletter/views.py +2 -2
@@ 31,7 31,7 @@ def subscribe(list_id):

    flash_success(
        gettext(
            'Du hast dich zum Newsletter "%(title)s" angemeldet.',
            'You have subscribed to newsletter "%(title)s".',
            title=list_.title,
        )
    )


@@ 48,7 48,7 @@ def unsubscribe(list_id):

    flash_success(
        gettext(
            'Du hast dich vom Newsletter "%(title)s" abgemeldet.',
            'You have unsubscribed from newsletter "%(title)s".',
            title=list_.title,
        )
    )

M byceps/blueprints/site/seating/views.py => byceps/blueprints/site/seating/views.py +15 -19
@@ 88,9 88,7 @@ def manage_seats_in_area(slug):
    """Manage seats for assigned tickets in area."""
    if not _is_seat_management_enabled():
        flash_error(
            gettext(
                'Sitzplatzreservierungen können derzeit nicht verändert werden.'
            )
            gettext('Seat reservations cannot be changed at this time.')
        )
        return redirect_to('.view_area', slug=slug)



@@ 162,7 160,7 @@ def _get_selected_ticket():
    if (selected_ticket is not None) and selected_ticket.revoked:
        flash_error(
            gettext(
                'Ticket "%(selected_ticket_code)s" wurde widerrufen.',
                'Ticket "%(selected_ticket_code)s" is revoked.',
                selected_ticket_code=selected_ticket.code,
            )
        )


@@ 180,9 178,7 @@ def occupy_seat(ticket_id, seat_id):
    """Use ticket to occupy seat."""
    if not _is_seat_management_enabled():
        flash_error(
            gettext(
                'Sitzplatzreservierungen können derzeit nicht verändert werden.'
            )
            gettext('Seat reservations cannot be changed at this time.')
        )
        return



@@ 195,7 191,7 @@ def occupy_seat(ticket_id, seat_id):
    ):
        flash_error(
            gettext(
                'Du bist nicht berechtigt, den Sitzplatz für Ticket %(ticket_code)s zu verwalten.',
                'You are not authorized to manage the seat for ticket %(ticket_code)s.',
                ticket_code=ticket.code,
            )
        )


@@ 205,7 201,9 @@ def occupy_seat(ticket_id, seat_id):

    if seat.is_occupied:
        flash_error(
            gettext('%(seat_label)s ist bereits belegt.', seat_label=seat.label)
            gettext(
                '%(seat_label)s is already occupied.', seat_label=seat.label
            )
        )
        return



@@ 216,7 214,7 @@ def occupy_seat(ticket_id, seat_id):
    except ticket_exceptions.SeatChangeDeniedForBundledTicket:
        flash_error(
            gettext(
                'Ticket %(ticket_code)s gehört zu einem Paket und kann nicht einzeln verwaltet werden.',
                'Ticket %(ticket_code)s belongs to a bundle and cannot be managed separately.',
                ticket_code=ticket.code,
            )
        )


@@ 224,7 222,7 @@ def occupy_seat(ticket_id, seat_id):
    except ticket_exceptions.TicketCategoryMismatch:
        flash_error(
            gettext(
                'Ticket %(ticket_code)s und %(seat_label)s haben unterschiedliche Kategorien.',
                'Ticket %(ticket_code)s and seat "%(seat_label)s" belong to different categories.',
                ticket_code=ticket.code,
                seat_label=seat.label,
            )


@@ 235,7 233,7 @@ def occupy_seat(ticket_id, seat_id):

    flash_success(
        gettext(
            '%(seat_label)s wurde mit Ticket %(ticket_code)s reserviert.',
            '%(seat_label)s has been occupied with ticket %(ticket_code)s.',
            seat_label=seat.label,
            ticket_code=ticket.code,
        )


@@ 249,9 247,7 @@ def release_seat(ticket_id):
    """Release the seat."""
    if not _is_seat_management_enabled():
        flash_error(
            gettext(
                'Sitzplatzreservierungen können derzeit nicht verändert werden.'
            )
            gettext('Seat reservations cannot be changed at this time.')
        )
        return



@@ 260,7 256,7 @@ def release_seat(ticket_id):
    if not ticket.occupied_seat:
        flash_error(
            gettext(
                'Ticket %(ticket_code)s belegt keinen Sitzplatz.',
                'Ticket %(ticket_code)s occupies no seat.',
                ticket_code=ticket.code,
            )
        )


@@ 273,7 269,7 @@ def release_seat(ticket_id):
    ):
        flash_error(
            gettext(
                'Du bist nicht berechtigt, den Sitzplatz für Ticket %(ticket_code)s zu verwalten.',
                'You are not authorized to manage the seat for ticket %(ticket_code)s.',
                ticket_code=ticket.code,
            )
        )


@@ 286,14 282,14 @@ def release_seat(ticket_id):
    except ticket_exceptions.SeatChangeDeniedForBundledTicket:
        flash_error(
            gettext(
                'Ticket %(ticket_code)s gehört zu einem Paket und kann nicht einzeln verwaltet werden.',
                'Ticket %(ticket_code)s belongs to a bundle and cannot be managed separately.',
                ticket_code=ticket.code,
            )
        )
        return

    flash_success(
        gettext('%(seat_label)s wurde freigegeben.', seat_label=seat.label)
        gettext('%(seat_label)s has been released.', seat_label=seat.label)
    )



M byceps/blueprints/site/shop/order/views.py => byceps/blueprints/site/shop/order/views.py +17 -18
@@ 49,7 49,7 @@ def order_form(erroneous_form=None):
    shop = shop_service.get_shop(storefront.shop_id)

    if storefront.closed:
        flash_notice(gettext('Der Shop ist derzeit geschlossen.'))
        flash_notice(gettext('The shop is closed.'))
        return {'article_compilation': None}

    article_compilation = article_service.get_article_compilation_for_orderable_articles(


@@ 57,7 57,7 @@ def order_form(erroneous_form=None):
    )

    if article_compilation.is_empty():
        flash_error(gettext('Es sind keine Artikel verfügbar.'))
        flash_error(gettext('No articles are available.'))
        return {'article_compilation': None}

    is_logged_in = g.user.is_active


@@ 98,7 98,7 @@ def order():
    shop = shop_service.get_shop(storefront.shop_id)

    if storefront.closed:
        flash_notice(gettext('Der Shop ist derzeit geschlossen.'))
        flash_notice(gettext('The shop is closed.'))
        return order_form()

    article_compilation = article_service.get_article_compilation_for_orderable_articles(


@@ 106,7 106,7 @@ def order():
    )

    if article_compilation.is_empty():
        flash_error(gettext('Es sind keine Artikel verfügbar.'))
        flash_error(gettext('No articles are available.'))
        return order_form()

    ArticlesOrderForm = assemble_articles_order_form(article_compilation)


@@ 118,7 118,7 @@ def order():
    cart = form.get_cart(article_compilation)

    if cart.is_empty():
        flash_error(gettext('Es wurden keine Artikel ausgewählt.'))
        flash_error(gettext('No articles have been selected.'))
        return order_form(form)

    orderer = form.get_orderer(g.user.id)


@@ 126,7 126,7 @@ def order():
    try:
        order = _place_order(storefront.id, orderer, cart)
    except order_service.OrderFailed:
        flash_error(gettext('Die Bestellung ist fehlgeschlagen.'))
        flash_error(gettext('Placing the order has failed.'))
        return order_form(form)

    _flash_order_success(order)


@@ 149,7 149,7 @@ def order_single_form(article_id, erroneous_form=None):
    form = erroneous_form if erroneous_form else OrderForm(obj=user.detail)

    if storefront.closed:
        flash_notice(gettext('Der Shop ist derzeit geschlossen.'))
        flash_notice(gettext('The shop is closed.'))
        return {
            'form': form,
            'article': None,


@@ 162,14 162,14 @@ def order_single_form(article_id, erroneous_form=None):
    country_names = country_service.get_country_names()

    if article.not_directly_orderable:
        flash_error(gettext('Der Artikel kann nicht direkt bestellt werden.'))
        flash_error(gettext('The article cannot be ordered directly.'))
        return {
            'form': form,
            'article': None,
        }

    if order_service.has_user_placed_orders(user.id, shop.id):
        flash_error(gettext('Du kannst keine weitere Bestellung aufgeben.'))
        flash_error(gettext('You cannot place another order.'))
        return {
            'form': form,
            'article': None,


@@ 178,7 178,7 @@ def order_single_form(article_id, erroneous_form=None):
    if article.quantity < 1 or not article_service.is_article_available_now(
        article
    ):
        flash_error(gettext('Der Artikel ist nicht verfügbar.'))
        flash_error(gettext('The article is not available.'))
        return {
            'form': form,
            'article': None,


@@ 203,11 203,11 @@ def order_single(article_id):
    shop = shop_service.get_shop(storefront.shop_id)

    if storefront.closed:
        flash_notice(gettext('Der Shop ist derzeit geschlossen.'))
        flash_notice(gettext('The shop is closed.'))
        return order_single_form(article.id)

    if article.not_directly_orderable:
        flash_error(gettext('Der Artikel kann nicht direkt bestellt werden.'))
        flash_error(gettext('The article cannot be ordered directly.'))
        return order_single_form(article.id)

    article_compilation = article_service.get_article_compilation_for_single_article(


@@ 217,13 217,13 @@ def order_single(article_id):
    user = g.user

    if order_service.has_user_placed_orders(user.id, shop.id):
        flash_error(gettext('Du kannst keine weitere Bestellung aufgeben.'))
        flash_error(gettext('You cannot place another order.'))
        return order_single_form(article.id)

    if article.quantity < 1 or not article_service.is_article_available_now(
        article
    ):
        flash_error(gettext('Der Artikel ist nicht verfügbar.'))
        flash_error(gettext('The article is not available.'))
        return order_single_form(article.id)

    form = OrderForm(request.form)


@@ 237,7 237,7 @@ def order_single(article_id):
    try:
        order = _place_order(storefront.id, orderer, cart)
    except order_service.OrderFailed:
        flash_error(gettext('Die Bestellung ist fehlgeschlagen.'))
        flash_error(gettext('Placing the order has failed.'))
        return order_form(form)

    _flash_order_success(order)


@@ 287,9 287,8 @@ def _place_order(storefront_id, orderer, cart):
def _flash_order_success(order):
    flash_success(
        gettext(
            'Deine Bestellung mit der '
            'Bestellnummer <strong>%(order_number)s</strong> '
            'wurde entgegengenommen. Vielen Dank!',
            'Your order <strong>%(order_number)s</strong> has been placed. '
            'Thank you!',
            order_number=order.order_number,
        ),
        text_is_safe=True,

M byceps/blueprints/site/shop/orders/views.py => byceps/blueprints/site/shop/orders/views.py +6 -6
@@ 108,13 108,13 @@ def cancel_form(order_id, erroneous_form=None):
    order = _get_order_by_current_user_or_404(order_id)

    if order.is_canceled:
        flash_error(gettext('Die Bestellung ist bereits storniert worden.'))
        flash_error(gettext('The order has already been canceled.'))
        return redirect_to('.view', order_id=order.id)

    if order.is_paid:
        flash_error(
            gettext(
                'Die Bestellung ist bereits bezahlt worden. Du kannst sie nicht mehr selbst stornieren.'
                'The order has already been paid. You cannot cancel it yourself anymore.'
            )
        )
        return redirect_to('.view', order_id=order.id)


@@ 136,13 136,13 @@ def cancel(order_id):
    order = _get_order_by_current_user_or_404(order_id)

    if order.is_canceled:
        flash_error(gettext('Die Bestellung ist bereits storniert worden.'))
        flash_error(gettext('The order has already been canceled.'))
        return redirect_to('.view', order_id=order.id)

    if order.is_paid:
        flash_error(
            gettext(
                'Die Bestellung ist bereits bezahlt worden. Du kannst sie nicht mehr selbst stornieren.'
                'The order has already been paid. You cannot cancel it yourself anymore.'
            )
        )
        return redirect_to('.view', order_id=order.id)


@@ 158,12 158,12 @@ def cancel(order_id):
    except order_service.OrderAlreadyCanceled:
        flash_error(
            gettext(
                'Die Bestellung ist bereits storniert worden; der Bezahlstatus kann nicht mehr geändert werden.'
                'The order has already been canceled. The payment state cannot be changed anymore.'
            )
        )
        return redirect_to('.view', order_id=order.id)

    flash_success(gettext('Die Bestellung wurde storniert.'))
    flash_success(gettext('Order has been canceled.'))

    order_email_service.send_email_for_canceled_order_to_orderer(order.id)


M byceps/blueprints/site/ticketing/views.py => byceps/blueprints/site/ticketing/views.py +10 -13
@@ 152,8 152,7 @@ def appoint_user(ticket_id):

    flash_success(
        gettext(
            '%(screen_name)s wurde als Nutzer/in '
            'von Ticket %(ticket_code)s eingetragen.',
            '%(screen_name)s has been assigned as user of ticket %(ticket_code)s.',
            screen_name=user.screen_name,
            ticket_code=ticket.code,
        )


@@ 185,7 184,7 @@ def withdraw_user(ticket_id):

    flash_success(
        gettext(
            'Du wurdest als Nutzer/in von Ticket %(ticket_code)s eingetragen.',
            'You have been assigned as user of ticket %(ticket_code)s.',
            ticket_code=ticket.code,
        )
    )


@@ 245,8 244,8 @@ def appoint_user_manager(ticket_id):

    flash_success(
        gettext(
            '%(screen_name)s wurde als Nutzer-Verwalter/in '
            'von Ticket %(ticket_code)s eingetragen.',
            '%(screen_name)s has been assigned as user manager '
            'of ticket %(ticket_code)s.',
            screen_name=user.screen_name,
            ticket_code=ticket.code,
        )


@@ 278,7 277,7 @@ def withdraw_user_manager(ticket_id):

    flash_success(
        gettext(
            'Der Nutzer-Verwalter von Ticket %(ticket_code)s wurde entfernt.',
            'User manager of ticket %(ticket_code)s has been removed.',
            ticket_code=ticket.code,
        )
    )


@@ 336,8 335,8 @@ def appoint_seat_manager(ticket_id):

    flash_success(
        gettext(
            '%(screen_name)s wurde als Sitzplatz-Verwalter/in '
            'von Ticket %(ticket_code)s eingetragen.',
            '%(screen_name)s has been assigned as seat manager '
            'of ticket %(ticket_code)s.',
            screen_name=user.screen_name,
            ticket_code=ticket.code,
        )


@@ 367,7 366,7 @@ def withdraw_seat_manager(ticket_id):

    flash_success(
        gettext(
            'Der Sitzplatz-Verwalter von Ticket %(ticket_code)s wurde entfernt.',
            'Seat manager of ticket %(ticket_code)s has been removed.',
            ticket_code=ticket.code,
        )
    )


@@ 380,7 379,7 @@ def withdraw_seat_manager(ticket_id):

def _abort_if_ticket_management_disabled():
    if not _is_ticket_management_enabled():
        flash_error(gettext('Tickets können derzeit nicht verändert werden.'))
        flash_error(gettext('Tickets cannot be updated at this time.'))
        abort(403)




@@ 407,9 406,7 @@ def _get_ticket_or_404(ticket_id):
def _abort_if_ticket_user_checked_in(ticket):
    if ticket.user_checked_in:
        flash_error(
            gettext(
                'Es ist bereits jemand mit diesem Ticket eingecheckt worden.'
            )
            gettext('Somebody has already been checked in with this ticket.')
        )
        abort(403)


M byceps/blueprints/site/user/avatar/views.py => byceps/blueprints/site/user/avatar/views.py +3 -7
@@ 67,7 67,7 @@ def update():

    _update(user.id, image)

    flash_success(gettext('Dein Avatarbild wurde aktualisiert.'), icon='upload')
    flash_success(gettext('Avatar image has been updated.'), icon='upload')
    user_avatar_signals.avatar_updated.send(None, user_id=user.id)

    return redirect_to('user_settings.view')


@@ 100,13 100,9 @@ def delete():
    except ValueError:
        # No avatar selected.
        # But that's ok, deletions should be idempotent.
        flash_notice(
            gettext(
                'Es ist kein Avatarbild gesetzt, das entfernt werden könnte.'
            )
        )
        flash_notice(gettext('No avatar image is set that could be removed.'))
    else:
        flash_success(gettext('Dein Avatarbild wurde entfernt.'))
        flash_success(gettext('Avatar image has been removed.'))


def _get_current_user_or_404():

M byceps/blueprints/site/user/creation/views.py => byceps/blueprints/site/user/creation/views.py +4 -7
@@ 116,7 116,7 @@ def create():
    except user_creation_service.UserCreationFailed:
        flash_error(
            gettext(
                'Das Benutzerkonto für "%(screen_name)s" konnte nicht angelegt werden.',
                'User "%(screen_name)s" could not be created.',
                screen_name=screen_name,
            )
        )


@@ 124,9 124,8 @@ def create():

    flash_success(
        gettext(
            'Das Benutzerkonto für "%(screen_name)s" wurde angelegt. '
            'Bevor du dich damit anmelden kannst, muss zunächst der Link in der '
            'an die angegebene Adresse verschickten E-Mail besucht werden.',
            'User "%(screen_name)s" has been created. Before you can log in, '
            'please visit the link emailed to you to verify your email address.',
            screen_name=user.screen_name,
        )
    )


@@ 146,9 145,7 @@ def create():
def _abort_if_user_account_creation_disabled():
    site = site_service.get_site(g.site_id)
    if not site.user_account_creation_enabled:
        flash_error(
            gettext('Das Erstellen von Benutzerkonten ist deaktiviert.')
        )
        flash_error(gettext('User account creation is disabled.'))
        abort(403)



M byceps/blueprints/site/user/email_address/views.py => byceps/blueprints/site/user/email_address/views.py +9 -10
@@ 56,7 56,7 @@ def request_confirmation_email():
    if (user is None) or user.deleted:
        flash_error(
            gettext(
                'Der Benutzername "%(screen_name)s" ist unbekannt.',
                'Username "%(screen_name)s" is unknown.',
                screen_name=screen_name,
            )
        )


@@ 65,7 65,7 @@ def request_confirmation_email():
    if user.email_address is None:
        flash_error(
            gettext(
                'Für das Benutzerkonto "%(screen_name)s" ist keine E-Mail-Adresse hinterlegt.',
                'No email address is set for user "%(screen_name)s".',
                screen_name=screen_name,
            )
        )


@@ 74,7 74,7 @@ def request_confirmation_email():
    if user.email_address_verified:
        flash_notice(
            gettext(
                'Die E-Mail-Adresse für den Benutzernamen "%(screen_name)s" wurde bereits bestätigt.',
                'The email address for user "%(screen_name)s" has already been verified.',
                screen_name=user.screen_name,
            )
        )


@@ 83,7 83,7 @@ def request_confirmation_email():
    if user.suspended:
        flash_error(
            gettext(
                'Das Benutzerkonto "%(screen_name)s" ist gesperrt.',
                'User "%(screen_name)s" has been suspended.',
                screen_name=screen_name,
            )
        )


@@ 95,9 95,8 @@ def request_confirmation_email():

    flash_success(
        gettext(
            'Der Link zur Bestätigung der für den Benutzernamen '
            '"%(screen_name)s" hinterlegten E-Mail-Adresse '
            'wurde erneut versendet.',
            'The link to verify the email address for user "%(screen_name)s" '
            'has been sent again.',
            screen_name=user.screen_name,
        )
    )


@@ 120,19 119,19 @@ def confirm(token):

    user = user_service.get_db_user(verification_token.user_id)
    if (user is None) or user.suspended or user.deleted:
        flash_error(gettext('Es wurde kein gültiges Token angegeben.'))
        flash_error(gettext('No valid token specified.'))
        abort(404)

    event = email_address_verification_service.confirm_email_address(
        verification_token
    )
    flash_success(gettext('Die E-Mail-Adresse wurde bestätigt.'))
    flash_success(gettext('Email address has been verified.'))

    if not user.initialized:
        user_command_service.initialize_account(user.id)
        flash_success(
            gettext(
                'Das Benutzerkonto "%(screen_name)s" wurde aktiviert.',
                'User "%(screen_name)s" has been activated.',
                screen_name=user.screen_name,
            )
        )

M byceps/blueprints/site/user/settings/views.py => byceps/blueprints/site/user/settings/views.py +2 -2
@@ 93,7 93,7 @@ def change_screen_name():

    flash_success(
        gettext(
            'Dein Benutzername wurde zu "%(new_screen_name)s" geändert.',
            'Your username has been changed to "%(new_screen_name)s".',
            new_screen_name=new_screen_name,
        )
    )


@@ 150,7 150,7 @@ def details_update():
        current_user.id,  # initiator_id
    )

    flash_success(gettext('Deine Daten wurden gespeichert.'))
    flash_success(gettext('Your data has been saved.'))

    user_signals.details_updated.send(None, event=event)


M byceps/blueprints/site/user_group/views.py => byceps/blueprints/site/user_group/views.py +3 -11
@@ 37,11 37,7 @@ def index():
def create_form(erroneous_form=None):
    """Show a form to create a group."""
    if not g.user.is_active:
        flash_error(
            gettext(
                'Du musst angemeldet sein, um eine Benutzergruppe erstellen zu können.'
            )
        )
        flash_error(gettext('You have to be logged in to create a user group.'))
        return redirect_to('.index')

    form = erroneous_form if erroneous_form else CreateForm()


@@ 55,11 51,7 @@ def create_form(erroneous_form=None):
def create():
    """Create a group."""
    if not g.user.is_active:
        flash_error(
            gettext(
                'Du musst angemeldet sein, um eine Benutzergruppe erstellen zu können.'
            )
        )
        flash_error(gettext('You have to be logged in to create a user group.'))
        return redirect_to('.index')

    form = CreateForm(request.form)


@@ 72,7 64,7 @@ def create():

    flash_success(
        gettext(
            'Die Gruppe "%(group_title)s" wurde erstellt.',
            'Group "%(group_title)s" has been created.',
            group_title=group.title,
        )
    )

M byceps/blueprints/site/user_message/views.py => byceps/blueprints/site/user_message/views.py +1 -1
@@ 61,7 61,7 @@ def create(recipient_id):

    flash_success(
        gettext(
            'Deine Nachricht an %(screen_name)s wurde versendet.',
            'Your message to %(screen_name)s has been sent.',
            screen_name=recipient.screen_name,
        )
    )

M byceps/util/views.py => byceps/util/views.py +1 -1
@@ 30,7 30,7 @@ def login_required(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if not g.user.is_active:
            flash_notice(gettext('Bitte melde dich an.'))
            flash_notice(gettext('Please log in.'))
            return redirect_to('authentication.login.login_form')
        return func(*args, **kwargs)