templates: Use a common template for error pages.

This commit is contained in:
Aman Agrawal 2024-05-31 05:21:14 +00:00 committed by Tim Abbott
parent 27d2b89412
commit dd70110166
17 changed files with 285 additions and 382 deletions

View File

@ -1,4 +1,4 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Error") }} | Zulip</title>
@ -6,23 +6,17 @@
{% block portico_class_name %}error{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Page not found (404)") }}</h1>
<p>
{% trans %}
If this error is unexpected, you can
<a href="mailto:{{ support_email }}">contact support</a>.
{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Page not found (404)") }}</h1>
<p>
{% trans %}
If this error is unexpected, you can
<a href="mailto:{{ support_email }}">contact support</a>.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,4 +1,4 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Error") }} | Zulip</title>
@ -6,48 +6,42 @@
{% block portico_class_name %}error{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<div class="errorbox">
<div class="errorcontent">
{% if csrf_failure %}
<h1 class="lead">{{ _("Access forbidden (403)") }}</h1>
<p>
{% trans %}
Your request could not be completed because your
browser did not send the credentials required to authenticate
your access. To resolve this issue:
{% endtrans %}
</p>
{% block error_page_content %}
<div class="errorbox">
<div class="errorcontent">
{% if csrf_failure %}
<h1 class="lead">{{ _("Access forbidden (403)") }}</h1>
<p>
{% trans %}
Your request could not be completed because your
browser did not send the credentials required to authenticate
your access. To resolve this issue:
{% endtrans %}
</p>
<ol>
<li>
{% trans %}
Make sure that your browser allows cookies for this site.
{% endtrans %}
</li>
<li>
{% trans %}
Check for any browser privacy settings or extensions
that block Referer headers, and disable them for
this site.
{% endtrans %}
</li>
</ol>
{% elif status_code == 405 %}
<h1 class="lead">{{ _("Method not allowed (405)") }}</h1>
<p>
{% trans %}
If this error is unexpected, you can
<a href="mailto:{{ support_email }}">contact support</a>.
{% endtrans %}
</p>
{% endif %}
</div>
</div>
</div>
<ol>
<li>
{% trans %}
Make sure that your browser allows cookies for this site.
{% endtrans %}
</li>
<li>
{% trans %}
Check for any browser privacy settings or extensions
that block Referer headers, and disable them for
this site.
{% endtrans %}
</li>
</ol>
{% elif status_code == 405 %}
<h1 class="lead">{{ _("Method not allowed (405)") }}</h1>
<p>
{% trans %}
If this error is unexpected, you can
<a href="mailto:{{ support_email }}">contact support</a>.
{% endtrans %}
</p>
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -1,4 +1,4 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Internal server error") }} | Zulip</title>
@ -11,46 +11,39 @@
{% block portico_class_name %}error{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Internal server error") }}</h1>
<p>
{% trans %}
Your Zulip chat cannot be loaded because the server is experiencing technical difficulties.
{% endtrans %}
</p>
<p>
{% trans %}
This page will reload automatically when service is restored.
{% endtrans %}
{% if corporate_enabled %}
{% trans %}
In the meantime, you can <a href="mailto:{{support_email}}">contact Zulip support</a>.
{% endtrans %}
{% else %}
{% trans %}
In the meantime, you can <a href="mailto:{{support_email}}">contact
this server's administrators</a> for support.
{% endtrans %}
{% endif %}
</p>
{% if not corporate_enabled %}
<p>
{% trans troubleshooting_url="https://zulip.readthedocs.io/en/latest/production/troubleshooting.html" %}
If you administer this server, you may want to check out the
<a href="{{troubleshooting_url}}">Zulip server troubleshooting guide</a>.
{% endtrans %}
</p>
{% endif %}
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Internal server error") }}</h1>
<p>
{% trans %}
Your Zulip chat cannot be loaded because the server is experiencing technical difficulties.
{% endtrans %}
</p>
<p>
{% trans %}
This page will reload automatically when service is restored.
{% endtrans %}
{% if corporate_enabled %}
{% trans %}
In the meantime, you can <a href="mailto:{{support_email}}">contact Zulip support</a>.
{% endtrans %}
{% else %}
{% trans %}
In the meantime, you can <a href="mailto:{{support_email}}">contact
this server's administrators</a> for support.
{% endtrans %}
{% endif %}
</p>
{% if not corporate_enabled %}
<p>
{% trans troubleshooting_url="https://zulip.readthedocs.io/en/latest/production/troubleshooting.html" %}
If you administer this server, you may want to check out the
<a href="{{troubleshooting_url}}">Zulip server troubleshooting guide</a>.
{% endtrans %}
</p>
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -1,25 +1,19 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Confirmation link does not exist") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Whoops. We couldn't find your confirmation link in the system.") }}</h1>
<p>
{% trans %}
Anyway, shoot us a line at {{ support_email_html_tag }} and we'll get this resolved shortly.
{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Whoops. We couldn't find your confirmation link in the system.") }}</h1>
<p>
{% trans %}
Anyway, shoot us a line at {{ support_email_html_tag }} and we'll get this resolved shortly.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,21 +1,15 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Confirmation link expired or deactivated") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img class="hourglass-img" src="{{ static('images/errors/timeout_hourglass.png') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Whoops. The confirmation link has expired or been deactivated.") }}</h1>
<p>{{ _("Please contact your organization administrator for a new link.") }}</p>
</div>
</div>
</div>
{% block error_page_content %}
<img class="hourglass-img" src="{{ static('images/errors/timeout_hourglass.png') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Whoops. The confirmation link has expired or been deactivated.") }}</h1>
<p>{{ _("Please contact your organization administrator for a new link.") }}</p>
</div>
</div>
{% endblock %}

View File

@ -1,26 +1,20 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Confirmation link malformed") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Whoops. The confirmation link is malformed.") }}</h1>
<p>{{ _("Make sure you copied the link correctly in to your browser. If you're still encountering this page, it's probably our fault. We're sorry.") }}</p>
<p>
{% trans %}
Anyway, shoot us a line at {{ support_email_html_tag }} and we'll get this resolved shortly.
{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Whoops. The confirmation link is malformed.") }}</h1>
<p>{{ _("Make sure you copied the link correctly in to your browser. If you're still encountering this page, it's probably our fault. We're sorry.") }}</p>
<p>
{% trans %}
Anyway, shoot us a line at {{ support_email_html_tag }} and we'll get this resolved shortly.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,4 +1,4 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Plan management not available") }} | Zulip</title>
@ -6,33 +6,27 @@
{% block portico_class_name %}error{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Plan management not available") }}</h1>
<p>
{% trans %} Plan management is not available for this
organization, because your Zulip server is already on a
{{ server_plan_name }} plan, which covers all
organizations on this server. See the <b>All versions</b> tab of the
<a href="https://zulip.com/help/self-hosted-billing#manage-billing">log
in instructions</a> to administer the plan for your
Zulip server.
{% endtrans %}
</p>
<p>
{% trans %} To move the plan from the server to this
organization, or for other questions, <a href="mailto:{{
support_email }}">contact support</a>.
{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Plan management not available") }}</h1>
<p>
{% trans %} Plan management is not available for this
organization, because your Zulip server is already on a
{{ server_plan_name }} plan, which covers all
organizations on this server. See the <b>All versions</b> tab of the
<a href="https://zulip.com/help/self-hosted-billing#manage-billing">log
in instructions</a> to administer the plan for your
Zulip server.
{% endtrans %}
</p>
<p>
{% trans %} To move the plan from the server to this
organization, or for other questions, <a href="mailto:{{
support_email }}">contact support</a>.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,4 +1,4 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Plan management not available") }} | Zulip</title>
@ -6,29 +6,23 @@
{% block portico_class_name %}error{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Plan management not available") }}</h1>
<p>
{% trans %}
Plan management for this server is not available because at least one organization
hosted on this server already has an active plan.
{% endtrans %}
</p>
<p>
{% trans %}
<a href="https://zulip.com/help/self-hosted-billing#manage-billing">Log in</a> to plan management for your
organization instead, or <a href='mailto:{{ support_email }}'>contact support</a> with any questions.
{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Plan management not available") }}</h1>
<p>
{% trans %}
Plan management for this server is not available because at least one organization
hosted on this server already has an active plan.
{% endtrans %}
</p>
<p>
{% trans %}
<a href="https://zulip.com/help/self-hosted-billing#manage-billing">Log in</a> to plan management for your
organization instead, or <a href='mailto:{{ support_email }}'>contact support</a> with any questions.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,27 +1,19 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Rate limit exceeded") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Rate limit exceeded.") }}</h1>
<p>
{% trans %}Your server has exceeded the limit for how
often this action can be performed.{% endtrans %}
{% trans %}You can try again in {{retry_after}} seconds.{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Rate limit exceeded.") }}</h1>
<p>
{% trans %}Your server has exceeded the limit for how
often this action can be performed.{% endtrans %}
{% trans %}You can try again in {{retry_after}} seconds.{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,31 +1,23 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Authentication subdomain error") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Authentication subdomain") }}</h1>
<p>
{% trans %}
It appears you ended up here by accident. This site
is meant to be an intermediate step in the authentication process
and shouldn't be accessed manually. If you came here directly,
you probably got the address wrong. If you got stuck here while trying
to log in, this is most likely a server bug or misconfiguration.
{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Authentication subdomain") }}</h1>
<p>
{% trans %}
It appears you ended up here by accident. This site
is meant to be an intermediate step in the authentication process
and shouldn't be accessed manually. If you came here directly,
you probably got the address wrong. If you got stuck here while trying
to log in, this is most likely a server bug or misconfiguration.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,44 +1,35 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Update required") }} | Zulip</title>
{% endblock %}
{% block content %}
{% block error_page_content%}
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox config-error">
<div class="errorcontent">
<h1 class="lead">{{ _('Update required') }}</h1>
<p>
{% trans %}
You are using old version of the Zulip desktop
app that is no longer supported.
{% endtrans %}
</p>
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox config-error">
<div class="errorcontent">
<h1 class="lead">{{ _('Update required') }}</h1>
<p>
{% trans %}
You are using old version of the Zulip desktop
app that is no longer supported.
{% endtrans %}
</p>
{% if auto_update_broken %}
<p>
{% trans %}
The auto-update feature in this old version of
Zulip desktop app no longer works.
{% endtrans %}
</p>
{% endif %}
{% if auto_update_broken %}
<p>
{% trans %}
The auto-update feature in this old version of
Zulip desktop app no longer works.
{% endtrans %}
</p>
{% endif %}
<p>
<a href="https://zulip.com/apps/" target="_blank" rel="noopener noreferrer">
{{ _("Download the latest release.") }}
</a>
</p>
</div>
</div>
</div>
<p>
<a href="https://zulip.com/apps/" target="_blank" rel="noopener noreferrer">
{{ _("Download the latest release.") }}
</a>
</p>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends "zerver/portico.html" %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
{% block error_page_content %}
{% endblock %}
</div>
</div>
</div>
{% endblock %}

View File

@ -1,27 +1,19 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Rate limit exceeded") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Rate limit exceeded.") }}</h1>
<p>
{% trans %}You have exceeded the limit for how
often a user can perform this action.{% endtrans %}
{% trans %}You can try again in {{retry_after}} seconds.{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Rate limit exceeded.") }}</h1>
<p>
{% trans %}You have exceeded the limit for how
often a user can perform this action.{% endtrans %}
{% trans %}You can try again in {{retry_after}} seconds.{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,26 +1,20 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Organization creation link required") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Organization creation link required") }}</h1>
<p>
{% trans %}
Creating a new organization on this server requires a valid organization creation link.
Please see <a href="https://zulip.readthedocs.io/en/stable/production/multiple-organizations.html">documentation</a> on creating a new organization for more information.
{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Organization creation link required") }}</h1>
<p>
{% trans %}
Creating a new organization on this server requires a valid organization creation link.
Please see <a href="https://zulip.readthedocs.io/en/stable/production/multiple-organizations.html">documentation</a> on creating a new organization for more information.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,25 +1,19 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Organization creation link expired or invalid") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img class="hourglass-img" src="{{ static('images/errors/timeout_hourglass.png') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Organization creation link expired or invalid") }}</h1>
<p>
{% trans %}
Unfortunately, this is not a valid link for creating an organization. Please <a href="/new/">obtain a new link</a> and try again.
{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img class="hourglass-img" src="{{ static('images/errors/timeout_hourglass.png') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Organization creation link expired or invalid") }}</h1>
<p>
{% trans %}
Unfortunately, this is not a valid link for creating an organization. Please <a href="/new/">obtain a new link</a> and try again.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,4 +1,4 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Error") }} | Zulip</title>
@ -6,26 +6,20 @@
{% block portico_class_name %}error{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Unexpected Zulip server registration") }}</h1>
<p>
{% trans %}
Your Zulip organization is registered as associated with a
different Zulip server installation.
{% block error_page_content %}
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Unexpected Zulip server registration") }}</h1>
<p>
{% trans %}
Your Zulip organization is registered as associated with a
different Zulip server installation.
Please <a href="mailto:{{ support_email }}">contact Zulip support</a>
for assistance in resolving this issue.
{% endtrans %}
</p>
</div>
</div>
</div>
Please <a href="mailto:{{ support_email }}">contact Zulip support</a>
for assistance in resolving this issue.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@ -1,39 +1,30 @@
{% extends "zerver/portico.html" %}
{% extends "zerver/portico_error_page.html" %}
{% block title %}
<title>{{ _("Unsupported browser") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="error_page">
<div class="container">
<div class="row-fluid">
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox config-error">
<div class="errorcontent">
<h1 class="lead">{{ _('Unsupported browser') }}</h1>
<p>
{% trans %}
{{ browser_name }} is not supported by Zulip.
{% endtrans %}
</p>
<p>
{% trans supported_browsers_page_link="/help/supported-browsers" %}
Zulip supports <a href="{{ supported_browsers_page_link }}">modern browsers</a>
like Firefox, Chrome, and Edge.
{% endtrans %}
</p>
<p>
{% trans apps_page_link="https://zulip.com/apps/" %}
You can also use the <a href="{{ apps_page_link }}">Zulip desktop app</a>.
{% endtrans %}
</p>
</div>
</div>
</div>
{% block error_page_content %}
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox config-error">
<div class="errorcontent">
<h1 class="lead">{{ _('Unsupported browser') }}</h1>
<p>
{% trans %}
{{ browser_name }} is not supported by Zulip.
{% endtrans %}
</p>
<p>
{% trans supported_browsers_page_link="/help/supported-browsers" %}
Zulip supports <a href="{{ supported_browsers_page_link }}">modern browsers</a>
like Firefox, Chrome, and Edge.
{% endtrans %}
</p>
<p>
{% trans apps_page_link="https://zulip.com/apps/" %}
You can also use the <a href="{{ apps_page_link }}">Zulip desktop app</a>.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}