Show all strings translated, if available

AI-assistant: Copilot v1.0.7 (Claude Sonnet 4.6)

Signed-off-by: Pablo Zmdl <pablo@nextcloud.com>
This commit is contained in:
Pablo Zmdl
2026-03-13 17:59:13 +01:00
parent 228f785987
commit 021854144b
6 changed files with 287 additions and 277 deletions

View File

@@ -4,27 +4,27 @@
{% if c.GetStartingState().value == 'starting' %}
<span class="status running"></span>
{{ c.displayName }}
(<a href="log?id={{ c.identifier }}" target="_blank">Starting</a>)
(<a href="log?id={{ c.identifier }}" target="_blank">{{ t('Starting') }}</a>)
{% elseif c.GetRunningState().value == 'running' %}
<span class="status success"></span>
{{ c.displayName }}
(<a href="log?id={{ c.identifier }}" target="_blank">Running</a>)
(<a href="log?id={{ c.identifier }}" target="_blank">{{ t('Running') }}</a>)
{% else %}
<span class="status error"></span>
{{ c.displayName }}
(<a href="log?id={{ c.identifier }}" target="_blank">Stopped</a>)
(<a href="log?id={{ c.identifier }}" target="_blank">{{ t('Stopped') }}</a>)
{% endif %}
{% if c.documentation != '' %}
(<a target="_blank" href="{{ c.documentation }}">docs</a>)
(<a target="_blank" href="{{ c.documentation }}">{{ t('docs') }}</a>)
{% endif %}
{% if c.GetUpdateState().value == 'different' %}
⚠️&nbsp;Update&nbsp;available
⚠️&nbsp;{{ t('Update') }}&nbsp;{{ t('available') }}
{% endif %}
</span>
{% if c.GetUiSecret() != '' %}
<details>
<summary>Show password for {{ c.displayName }}</summary>
<summary>{{ t('Show password for') }} {{ c.displayName }}</summary>
<input type="text" value="{{ c.GetUiSecret() }}" readonly>
</details>
{% endif %}
</li>
</li>

View File

@@ -10,7 +10,7 @@
</svg>
<div class="header-controls">
{% if supportedLanguages|length > 1 %}
<select id="language-switcher" class="language-switcher" data-current="{{ currentLanguage }}" aria-label="Select language">
<select id="language-switcher" class="language-switcher" data-current="{{ currentLanguage }}" aria-label="{{ t('Select language') }}">
{% for lang in supportedLanguages %}
<option value="{{ lang }}"{% if lang == currentLanguage %} selected{% endif %}>{{ lang }}</option>
{% endfor %}
@@ -19,7 +19,7 @@
<form method="POST" action="api/auth/logout">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Log out" />
<input type="submit" value="{{ t('Log out') }}" />
</form>
</div>
<script type="text/javascript" src="language-switcher.js"></script>
@@ -28,7 +28,7 @@
<div class="container">
<main>
{% set aio_version = include('includes/aio-version.twig') %}
<h1>Nextcloud AIO v{{ aio_version }}</h1>
<h1>{{ t('Nextcloud AIO v') }}{{ aio_version }}</h1>
{# Add 2nd tab warning #}
<script type="text/javascript" src="second-tab-warning.js"></script>
@@ -75,50 +75,50 @@
{% endfor %}
{% if is_daily_backup_running == true %}
<p><span class="status running"></span> Daily backup currently running. (<a href="log?id=nextcloud-aio-mastercontainer" target="_blank">Mastercontainer logs</a>) (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Borg backup container logs</a>)</p>
<p><span class="status running"></span> {{ t('Daily backup currently running.') }} (<a href="log?id=nextcloud-aio-mastercontainer" target="_blank">{{ t('Mastercontainer logs') }}</a>) (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">{{ t('Borg backup container logs') }}</a>)</p>
{% if automatic_updates == true %}
<p>This will update your containers, the mastercontainer and, on Saturdays, your Nextcloud apps if the backup is successful.</p>
<p>{{ t('This will update your containers, the mastercontainer and, on Saturdays, your Nextcloud apps if the backup is successful.') }}</p>
{% if is_mastercontainer_update_available == true %}
<p>When the mastercontainer is updated it will restart, making it unavailable for a moment. (<a href="log?id=nextcloud-aio-watchtower" target="_blank">Logs</a>)</p>
<p>{{ t('When the mastercontainer is updated it will restart, making it unavailable for a moment.') }} (<a href="log?id=nextcloud-aio-watchtower" target="_blank">{{ t('Logs') }}</a>)</p>
{% endif %}
{% endif %}
{% if has_update_available == false %}
<p>The whole process should not take more than a few minutes.</p>
<p>{{ t('The whole process should not take more than a few minutes.') }}</p>
{% elseif automatic_updates == true %}
<p>The whole process can take a while as your containers will be updated.</p>
<p>{{ t('The whole process can take a while as your containers will be updated.') }}</p>
{% endif %}
<p><a href="" class="button reload">Reload ↻</a></p>
<p>If the daily backup is stuck somehow, you can unstick it by running <strong>sudo docker exec nextcloud-aio-mastercontainer rm /mnt/docker-aio-config/data/daily_backup_running</strong> and afterwards reloading this interface.</p>
<p><a href="" class="button reload">{{ t('Reload ↻') }}</a></p>
<p>{{ t('If the daily backup is stuck somehow, you can unstick it by running') }} <strong>sudo docker exec nextcloud-aio-mastercontainer rm /mnt/docker-aio-config/data/daily_backup_running</strong> {{ t('and afterwards reloading this interface.') }}</p>
{% elseif isWatchtowerRunning == true %}
<p><span class="status running"></span> Mastercontainer update currently running. Once the update is complete the mastercontainer will restart, making it unavailable for a moment. Please wait until it's done. (<a href="log?id=nextcloud-aio-watchtower" target="_blank">Logs</a>)</p>
<p><a href="" class="button reload">Reload ↻</a></p>
<p><span class="status running"></span> {{ t('Mastercontainer update currently running. Once the update is complete the mastercontainer will restart, making it unavailable for a moment. Please wait until it\'s done.') }} (<a href="log?id=nextcloud-aio-watchtower" target="_blank">{{ t('Logs') }}</a>)</p>
<p><a href="" class="button reload">{{ t('Reload ↻') }}</a></p>
{% else %}
{% if is_backup_container_running == false and domain == "" %}
{% if isDomaincheckRunning == false %}
<h2>Domaincheck container is not running</h2>
<p>This is not expected. Most likely this happened because port {{ apache_port }} is already in use on your server. You can check the mastercontainer logs and domaincheck container logs for further clues. You should be able to resolve this by adjusting the APACHE_PORT by following the <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md">reverse proxy documentation</a></strong>. Advice: have a detailed look at the changed docker run command for AIO.</p>
<h2>{{ t('Domaincheck container is not running') }}</h2>
<p>{{ t('This is not expected. Most likely this happened because port') }} {{ apache_port }} {{ t('is already in use on your server. You can check the mastercontainer logs and domaincheck container logs for further clues. You should be able to resolve this by adjusting the APACHE_PORT by following the') }} <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md">{{ t('reverse proxy documentation') }}</a></strong>. {{ t('Advice: have a detailed look at the changed docker run command for AIO.') }}</p>
{% elseif is_mastercontainer_update_available == true %}
<h2>Mastercontainer update</h2>
<p>⚠️ A mastercontainer update is available. Please click on the button below to update it. Afterwards, you will be able to proceed with the setup.</p>
<h2>{{ t('Mastercontainer update') }}</h2>
<p>⚠️ {{ t('A mastercontainer update is available. Please click on the button below to update it. Afterwards, you will be able to proceed with the setup.') }}</p>
<form method="POST" action="api/docker/watchtower" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Update mastercontainer" />
<input type="submit" value="{{ t('Update mastercontainer') }}" />
</form>
{% else %}
{% if not hasBackupLocation %}
<p>The official Nextcloud installation method. Nextcloud All-in-One provides easy deployment and maintenance with most features included in this one Nextcloud instance.</p>
<p>You can either create a new AIO instance or restore a former AIO instance from backup. See the two sections below.</p>
<p>{{ t('The official Nextcloud installation method. Nextcloud All-in-One provides easy deployment and maintenance with most features included in this one Nextcloud instance.') }}</p>
<p>{{ t('You can either create a new AIO instance or restore a former AIO instance from backup. See the two sections below.') }}</p>
{{ include('includes/aio-config.twig') }}
<h2>New AIO instance</h2>
<h2>{{ t('New AIO instance') }}</h2>
{% if apache_port == '443' %}
<p>AIO is currently in "normal mode" which means that it handles the TLS proxying itself. This also means that it cannot be installed behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else). If you want to run AIO behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else), see the <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md">reverse proxy documentation</a></strong>. Advice: have a detailed look at the changed docker run command for AIO.</p>
<p>{{ t('AIO is currently in "normal mode" which means that it handles the TLS proxying itself. This also means that it cannot be installed behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else). If you want to run AIO behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else), see the') }} <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md">{{ t('reverse proxy documentation') }}</a></strong>. {{ t('Advice: have a detailed look at the changed docker run command for AIO.') }}</p>
{% else %}
<p>AIO is currently in "reverse proxy mode" which means that it can be installed behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else) and does not do the TLS proxying itself.</p>
<p>{{ t('AIO is currently in "reverse proxy mode" which means that it can be installed behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else) and does not do the TLS proxying itself.') }}</p>
{% endif %}
<p>Please type in the domain that will be used for Nextcloud and submit it.</p>
<p>{{ t('Please type in the domain that will be used for Nextcloud and submit it.') }}</p>
{% if skip_domain_validation == true %}
<p><strong>Please note:</strong> The domain validation is disabled so any domain will be accepted here! Make sure you do not make a typo here as you will not be able to change it afterwards!</p>
<p><strong>{{ t('Please note:') }}</strong> {{ t('The domain validation is disabled so any domain will be accepted here! Make sure you do not make a typo here as you will not be able to change it afterwards!') }}</p>
{% endif %}
<form method="POST" action="api/configuration" class="xhr">
<input type="text" id="domain" name="domain" value="{{ domain }}" placeholder="nextcloud.yourdomain.com"/>
@@ -127,58 +127,60 @@
{% if skip_domain_validation == true %}
<input type="hidden" name="skip_domain_validation" value="{{skip_domain_validation}}">
{% endif %}
<input type="submit" value="Submit domain" />
<input type="submit" value="{{ t('Submit domain') }}" />
</form>
{% if skip_domain_validation == false %}
<p>Make sure that this server is reachable on port 443 (port 443/tcp is open/forwarded in your firewall/router and 443/udp as well if you want to enable http3) and that you've correctly set up the DNS config for the domain that you enter (set the A record to your public ipv4-address and if you need ipv6, set the AAAA record to your public ipv6-address. A CNAME record is, of course, also possible). You should see hints on what went wrong in the top right corner if your domain is not accepted.</p>
<p>{{ t('Make sure that this server is reachable on port 443 (port 443/tcp is open/forwarded in your firewall/router and 443/udp as well if you want to enable http3) and that you\'ve correctly set up the DNS config for the domain that you enter (set the A record to your public ipv4-address and if you need ipv6, set the AAAA record to your public ipv6-address. A CNAME record is, of course, also possible). You should see hints on what went wrong in the top right corner if your domain is not accepted.') }}</p>
<details>
<summary>Click here for further hints</summary>
<p>If you do not have a domain yet, you can get one for free e.g. from duckdns.org and others. Recommended is to use <a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/6817">Tailscale</a></p>
<p>If you have a dynamic public IP-address, you can use e.g. <a target="_blank" href="https://ddclient.net/">DDclient</a> with a compatible domain provider for DNS updates.</p>
<p>If you only want to install AIO locally without exposing it to the public internet or if you cannot do so, feel free to follow <a target="_blank" href="https://github.com/nextcloud/all-in-one/blob/main/local-instance.md">this documentation</a>.</p>
<p>If you should be using Cloudflare Proxy for your domain, make sure to disable the Proxy feature temporarily as it might block the domain validation attempts.</p>
<summary>{{ t('Click here for further hints') }}</summary>
<p>{{ t('If you do not have a domain yet, you can get one for free e.g. from duckdns.org and others. Recommended is to use') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/6817">Tailscale</a></p>
<p>{{ t('If you have a dynamic public IP-address, you can use e.g.') }} <a target="_blank" href="https://ddclient.net/">DDclient</a> {{ t('with a compatible domain provider for DNS updates.') }}</p>
<p>{{ t('If you only want to install AIO locally without exposing it to the public internet or if you cannot do so, feel free to follow') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one/blob/main/local-instance.md">{{ t('this documentation') }}</a>.</p>
<p>{{ t('If you should be using Cloudflare Proxy for your domain, make sure to disable the Proxy feature temporarily as it might block the domain validation attempts.') }}</p>
{% if apache_port != '443' %}
<p>If you run into issues with your domain being accepted, see <a target="_blank" href="https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md#how-to-debug">these steps</a> for how to debug things.</p>
<p>{{ t('If you run into issues with your domain being accepted, see') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md#how-to-debug">{{ t('these steps') }}</a> {{ t('for how to debug things.') }}</p>
{% endif %}
<p><strong>Hint:</strong> If the domain validation fails but you are completely sure that you've configured everything correctly, you may skip the domain validation by following <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-skip-the-domain-validation">this documentation</a>.</p>
<p><strong>{{ t('Hint:') }}</strong> {{ t('If the domain validation fails but you are completely sure that you\'ve configured everything correctly, you may skip the domain validation by following') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-skip-the-domain-validation">{{ t('this documentation') }}</a>.</p>
</details>
{% endif %}
<h2>Restore former AIO instance from backup</h2>
<p>You can alternatively restore a former AIO instance from backup.</p>
<h2>{{ t('Restore former AIO instance from backup') }}</h2>
<p>{{ t('You can alternatively restore a former AIO instance from backup.') }}</p>
{% endif %}
{% if is_instance_restore_attempt == false %}
{% if hasBackupLocation %}
{% if borg_backup_mode in ['test', 'check'] %}
{% if backup_exit_code > 0 %}
<p><span class="status error"></span> Last {{ borg_backup_mode }} failed! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status error"></span> {{ t('Last') }} {{ borg_backup_mode }} {{ t('failed!') }} (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">{{ t('Logs') }}</a>)</p>
{% if borg_backup_mode == 'test' %}
<p>Please adjust the path and/or the encryption password in order to make it work!</p>
<p>{{ t('Please adjust the path and/or the encryption password in order to make it work!') }}</p>
{% elseif borg_backup_mode == 'check' %}
<p>The backup archive seems to be corrupt. Please try to use a different intact backup archive or try to fix it by following <a target="_blank" href="https://borgbackup.readthedocs.io/en/stable/faq.html#i-get-an-integrityerror-or-similar-what-now"><strong>this documentation</strong></a></p>
<p>{{ t('The backup archive seems to be corrupt. Please try to use a different intact backup archive or try to fix it by following') }} <a target="_blank" href="https://borgbackup.readthedocs.io/en/stable/faq.html#i-get-an-integrityerror-or-similar-what-now"><strong>{{ t('this documentation') }}</strong></a></p>
<details>
<summary>Reveal repair option</summary>
<p>Below is the option to repair the integrity of your backup. <strong>Please note:</strong> Please only use this after you have read the documentation above! (It will run the command 'borg check --repair' for you.)</p>
<summary>{{ t('Reveal repair option') }}</summary>
<p>{{ t('Below is the option to repair the integrity of your backup.') }} <strong>{{ t('Please note:') }}</strong> {{ t('Please only use this after you have read the documentation above! (It will run the command \'borg check --repair\' for you.)') }}</p>
{% set confirmRepair = t('Check and repair backup integrity? Are you sure that you want to check and repair the backup integrity? This should only be done after reading the mentioned documentation.') %}
<form method="POST" action="api/docker/backup-check-repair" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Check and repair backup integrity" onclick="return confirm('Check and repair backup integrity? Are you sure that you want to check and repair the backup integrity? This should only be done after reading the mentioned documentation.')"/>
<input type="submit" value="{{ t('Check and repair backup integrity') }}" onclick="return confirm('{{ confirmRepair|e('js') }}')"/>
</form>
</details>
{% endif %}
{% elseif backup_exit_code == 0 %}
<p><span class="status success"></span> Last {{ borg_backup_mode }} successful! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status success"></span> {{ t('Last') }} {{ borg_backup_mode }} {{ t('successful!') }} (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">{{ t('Logs') }}</a>)</p>
{% if borg_backup_mode == 'test' %}
<p>Feel free to check the integrity of the backup archive below before starting the restore process in order to make ensure that the restore will work. This can take a long time though depending on the size of the backup archive and is thus not required.</p>
<p>{{ t('Feel free to check the integrity of the backup archive below before starting the restore process in order to make ensure that the restore will work. This can take a long time though depending on the size of the backup archive and is thus not required.') }}</p>
<form method="POST" action="api/docker/backup-check" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Check backup integrity"/>
<input type="submit" value="{{ t('Check backup integrity') }}"/>
</form>
{% endif %}
<p>Choose the backup that you want to restore and click on the button below to restore the selected backup. This will restore the whole AIO instance. Please note that the current AIO passphrase will be kept and the previous AIO passphrase will not be restored from backup!</p>
<p><strong>Important:</strong> If the backup that you want to restore contained any <a target="_blank" href="https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers">community container</a>, you need to restore the same backup a second time after this attempt so that the community container data is also correctly restored.</p>
<p>{{ t('Choose the backup that you want to restore and click on the button below to restore the selected backup. This will restore the whole AIO instance. Please note that the current AIO passphrase will be kept and the previous AIO passphrase will not be restored from backup!') }}</p>
<p><strong>{{ t('Important:') }}</strong> {{ t('If the backup that you want to restore contained any') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one/tree/main/community-containers#community-containers">{{ t('community container') }}</a>, {{ t('you need to restore the same backup a second time after this attempt so that the community container data is also correctly restored.') }}</p>
{% set confirmRestore = t('⚠️ Important: If the backup that you want to restore contained any community container, you need to restore the same backup a second time after this attempt so that the community container data is also correctly restored.') %}
<form method="POST" action="api/docker/restore" target="overlay-log" id="restore_selection">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
@@ -187,14 +189,14 @@
<option value="{{ restore_time }}">{{ restore_time }} UTC</option>
{% endfor %}
</select><br>
<input type="checkbox" id="restore-exclude-previews" name="restore-exclude-previews"><label for="restore-exclude-previews">Exclude previews from restore which will speed up the restore process but will trigger a scan of the preview folder as soon as the Nextcloud container starts the next time</label><br>
<input type="submit" value="Restore selected backup" onclick="return confirm('⚠️ Important: If the backup that you want to restore contained any community container, you need to restore the same backup a second time after this attempt so that the community container data is also correctly restored.')"/>
<input type="checkbox" id="restore-exclude-previews" name="restore-exclude-previews"><label for="restore-exclude-previews">{{ t('Exclude previews from restore which will speed up the restore process but will trigger a scan of the preview folder as soon as the Nextcloud container starts the next time') }}</label><br>
<input type="submit" value="{{ t('Restore selected backup') }}" onclick="return confirm('{{ confirmRestore|e('js') }}')"/>
</form>
{% endif %}
{% elseif borg_backup_mode == 'restore' %}
{% if backup_exit_code > 0 %}
<p><span class="status error"></span> Last restore failed! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p>The restore process has unexpectedly failed! Please adjust the path and encryption password, test it and try to restore again!</p>
<p><span class="status error"></span> {{ t('Last restore failed!') }} (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">{{ t('Logs') }}</a>)</p>
<p>{{ t('The restore process has unexpectedly failed! Please adjust the path and encryption password, test it and try to restore again!') }}</p>
{% endif %}
{% endif %}
{% endif %}
@@ -202,51 +204,51 @@
{% if not hasBackupLocation or borg_backup_mode not in ['test', 'check', ''] or backup_exit_code > 0 %}
{% if borg_remote_repo and backup_exit_code > 0 %}
<p>
You may still need to authorize this pubkey on your borg remote:<br><strong>{{ borg_public_key }}</strong><br>
To try again, resubmit your location and rerun the test.
{{ t('You may still need to authorize this pubkey on your borg remote:') }}<br><strong>{{ borg_public_key }}</strong><br>
{{ t('To try again, resubmit your location and rerun the test.') }}
</p>
{% endif %}
<p>
Please enter the location of the backup archive on your host or a
<a target="_blank" href="https://borgbackup.readthedocs.io/en/stable/usage/general.html#repository-urls">remote borg repo url</a>
if stored remotely; and the encryption password of the backup archive below and submit all values:
{{ t('Please enter the location of the backup archive on your host or a') }}
<a target="_blank" href="https://borgbackup.readthedocs.io/en/stable/usage/general.html#repository-urls">{{ t('remote borg repo url') }}</a>
{{ t('if stored remotely; and the encryption password of the backup archive below and submit all values:') }}
</p>
<form method="POST" action="api/configuration" class="xhr">
<label>Local backup location</label> <input type="text" id="borg_restore_host_location" name="borg_restore_host_location" value="{{borg_backup_host_location}}" placeholder="/mnt/backup"/><br>
<label>Remote borg repo</label> <input type="text" name="borg_restore_remote_repo" value="{{borg_remote_repo}}" placeholder="ssh://user@host:port/path/to/repo"/><br>
<label>Borg passphrase</label> <input type="text" id="borg_restore_password" name="borg_restore_password" value="{{borg_restore_password}}" placeholder="encryption password"/><br>
<label>{{ t('Local backup location') }}</label> <input type="text" id="borg_restore_host_location" name="borg_restore_host_location" value="{{borg_backup_host_location}}" placeholder="/mnt/backup"/><br>
<label>{{ t('Remote borg repo') }}</label> <input type="text" name="borg_restore_remote_repo" value="{{borg_remote_repo}}" placeholder="ssh://user@host:port/path/to/repo"/><br>
<label>{{ t('Borg passphrase') }}</label> <input type="text" id="borg_restore_password" name="borg_restore_password" value="{{borg_restore_password}}" placeholder="{{ t('encryption password') }}"/><br>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Submit location and encryption password" />
<input type="submit" value="{{ t('Submit location and encryption password') }}" />
</form>
{{ include('includes/backup-dirs.twig') }}
<p>⚠️ Please note that the backup archive must be located in a subfolder of the folder that you enter here and the subfolder which contains the archive must be named 'borg', or the backup container will not be able to find the backup archive!</p>
<p>⚠️ {{ t('Please note that the backup archive must be located in a subfolder of the folder that you enter here and the subfolder which contains the archive must be named \'borg\', or the backup container will not be able to find the backup archive!') }}</p>
{% endif %}
{% else %}
<p><strong>Everything set!</strong> Click on the button below to test the path and encryption password:</p>
<p><strong>{{ t('Everything set!') }}</strong> {{ t('Click on the button below to test the path and encryption password:') }}</p>
<form method="POST" action="api/docker/backup-test" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Test path and encryption password"/>
<input type="submit" value="{{ t('Test path and encryption password') }}"/>
</form>
{% endif %}
{% endif %}
<h2>How to reset the AIO instance?</h2>
<p>If something should be going wrong, for example during the initial installation, you can reset the instance by following <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-properly-reset-the-instance">this documentation</a>.</p>
<h2>{{ t('How to reset the AIO instance?') }}</h2>
<p>{{ t('If something should be going wrong, for example during the initial installation, you can reset the instance by following') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-properly-reset-the-instance">{{ t('this documentation') }}</a>.</p>
{% endif %}
{% if was_start_button_clicked == true %}
{% if current_channel starts with 'latest' or current_channel starts with 'beta' or current_channel starts with 'develop' %}
<p>You are running the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-switch-the-channel"><strong>{{ current_channel }}</strong></a> channel. (<a href="log?id=nextcloud-aio-mastercontainer" target="_blank">Logs</a>)</p>
<p>{{ t('You are running the') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-switch-the-channel"><strong>{{ current_channel }}</strong></a> {{ t('channel.') }} (<a href="log?id=nextcloud-aio-mastercontainer" target="_blank">{{ t('Logs') }}</a>)</p>
{% else %}
<p>No channel was found. This means that AIO is not able to update itself and its component and will also not be able to report about updates. Updates need to be done externally.</p>
<p>{{ t('No channel was found. This means that AIO is not able to update itself and its component and will also not be able to report about updates. Updates need to be done externally.') }}</p>
{% endif %}
{% endif %}
{% if is_backup_container_running == true %}
<p><span class="status running"></span> Backup container is currently running: {{ borg_backup_mode }} (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><a href="" class="button reload">Reload ↻</a></p>
<p><span class="status running"></span> {{ t('Backup container is currently running:') }} {{ borg_backup_mode }} (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">{{ t('Logs') }}</a>)</p>
<p><a href="" class="button reload">{{ t('Reload ↻') }}</a></p>
{% endif %}
{% if domain != "" %}
@@ -254,30 +256,30 @@
{% if isApacheStarting != true %}
{% if hasBackupLocation %}
<details>
<summary>Click here to reveal the initial Nextcloud credentials</summary>
<summary>{{ t('Click here to reveal the initial Nextcloud credentials') }}</summary>
{% endif %}
<p>Initial Nextcloud username: <strong>admin</strong></p>
<p>{{ t('Initial Nextcloud username:') }} <strong>admin</strong></p>
{% if hasBackupLocation %}
{# nextcloud_password needs to be duplicated due to a bug in Firefox. See https://github.com/nextcloud/all-in-one/issues/638. #}
<p>Initial Nextcloud password: <strong id="initial-nextcloud-password">{{ nextcloud_password }}</strong></p></details>
<p>{{ t('Initial Nextcloud password:') }} <strong id="initial-nextcloud-password">{{ nextcloud_password }}</strong></p></details>
{% else %}
<p>Initial Nextcloud password: <strong id="initial-nextcloud-password">{{ nextcloud_password }}</strong></p>
<p>{{ t('Initial Nextcloud password:') }} <strong id="initial-nextcloud-password">{{ nextcloud_password }}</strong></p>
{% endif %}
<p><a href="https://{{ domain }}" class="button" target="_blank">Open your Nextcloud ↗</a></p>
<p><a href="https://{{ domain }}" class="button" target="_blank">{{ t('Open your Nextcloud ↗') }}</a></p>
{% if not hasBackupLocation %}
<p>If your Nextcloud does not open when clicking the button above, see <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/2105">this documentation</a></strong></p>
<p>{{ t('If your Nextcloud does not open when clicking the button above, see') }} <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/2105">{{ t('this documentation') }}</a></strong></p>
{% endif %}
{% else %}
{% if isAnyRestarting == false %}
<p><span class="status running"></span> Containers are currently starting. You might inspect the container logs by clicking on <strong>Starting</strong> next to each container for further details.</p>
<p><a href="" class="button reload">Reload ↻</a></p>
<p><span class="status running"></span> {{ t('Containers are currently starting. You might inspect the container logs by clicking on') }} <strong>{{ t('Starting') }}</strong> {{ t('next to each container for further details.') }}</p>
<p><a href="" class="button reload">{{ t('Reload ↻') }}</a></p>
{% else %}
<p>It seems at least one container was not able to start correctly and is currently restarting.</p>
<p>To break this endless loop, you can stop the containers below and investigate the issue in the container logs before starting the containers again.</p>
<p>{{ t('It seems at least one container was not able to start correctly and is currently restarting.') }}</p>
<p>{{ t('To break this endless loop, you can stop the containers below and investigate the issue in the container logs before starting the containers again.') }}</p>
<form method="POST" action="api/docker/stop" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Stop containers" />
<input type="submit" value="{{ t('Stop containers') }}" />
</form>
{% endif %}
{% endif %}
@@ -288,7 +290,7 @@
{% endif %}
{% if was_start_button_clicked == true %}
<h2>Containers</h2>
<h2>{{ t('Containers') }}</h2>
<ul>
{# @var containers \AIO\Container\Container[] #}
{% for container in containers %}
@@ -300,15 +302,15 @@
{% if has_update_available == true %}
{% if is_mastercontainer_update_available == false %}
<p>⚠️ Container updates are available. Click on <strong>Stop containers</strong> and <strong>Start and update containers</strong> to update them. You should consider creating a backup first.</p>
<p>⚠️ {{ t('Container updates are available. Click on') }} <strong>{{ t('Stop containers') }}</strong> {{ t('and') }} <strong>{{ t('Start and update containers') }}</strong> {{ t('to update them. You should consider creating a backup first.') }}</p>
{% endif %}
{% else %}
{% if is_mastercontainer_update_available == false %}
<p>Your containers are up-to-date.</p>
<p>{{ t('Your containers are up-to-date.') }}</p>
{% if newMajorVersionString != '' and isAnyRunning == true and isApacheStarting != true %}
<details>
<summary>Note about <strong>Nextcloud Hub {{ newMajorVersionString }}</strong></summary>
<p>If you haven't upgraded to Nextcloud Hub {{ newMajorVersionString }} yet and want to do that now, feel free to follow <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/7523">this documentation</a></strong></p>
<summary>{{ t('Note about') }} <strong>Nextcloud Hub {{ newMajorVersionString }}</strong></summary>
<p>{{ t('If you haven\'t upgraded to Nextcloud Hub') }} {{ newMajorVersionString }} {{ t('yet and want to do that now, feel free to follow') }} <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/7523">{{ t('this documentation') }}</a></strong></p>
</details>
{% endif %}
{% endif %}
@@ -318,34 +320,34 @@
{% if isAnyRunning == true %}
{% if isApacheStarting != true %}
{% if is_mastercontainer_update_available == true %}
<p>⚠️ A mastercontainer update is available. Please click on the button below to stop your containers in order to update the mastercontainer.</p>
<p>⚠️ {{ t('A mastercontainer update is available. Please click on the button below to stop your containers in order to update the mastercontainer.') }}</p>
{% if current_channel starts with 'latest' %}
<p>You can find the changelog <a target="_blank" href="https://github.com/nextcloud/all-in-one/releases/latest"><strong>here</strong></a></p>
<p>{{ t('You can find the changelog') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one/releases/latest"><strong>{{ t('here') }}</strong></a></p>
{% elseif current_channel starts with 'beta' %}
<p>You can find the changelog <a target="_blank" href="https://github.com/nextcloud/all-in-one/releases"><strong>here</strong></a></p>
<p>{{ t('You can find the changelog') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one/releases"><strong>{{ t('here') }}</strong></a></p>
{% elseif current_channel starts with 'develop' %}
<p>You can find all changes <a target="_blank" href="https://github.com/nextcloud-releases/all-in-one/commits/main"><strong>here</strong></a></p>
<p>{{ t('You can find all changes') }} <a target="_blank" href="https://github.com/nextcloud-releases/all-in-one/commits/main"><strong>{{ t('here') }}</strong></a></p>
{% endif %}
{% endif %}
<form method="POST" action="api/docker/stop" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Stop containers" />
<input type="submit" value="{{ t('Stop containers') }}" />
</form>
{% endif %}
{% else %}
{% if isBackupOrRestoreRunning == true %}
<p>Restore or Backup currently running. Cannot start the containers until Restore or Backup is complete.</p>
<p>{{ t('Restore or Backup currently running. Cannot start the containers until Restore or Backup is complete.') }}</p>
{% else %}
{% if was_start_button_clicked == false %}
<p>Clicking on the button below will download all docker containers and start them. This can take a long time depending on your internet connection. Since the overall size is a few GB, this can take around 5-10 min or more. Please be patient!</p>
<p>{{ t('Clicking on the button below will download all docker containers and start them. This can take a long time depending on your internet connection. Since the overall size is a few GB, this can take around 5-10 min or more. Please be patient!') }}</p>
{% endif %}
{% if is_mastercontainer_update_available == true %}
<p>⚠️ A mastercontainer update is available. Please click on the button below to update it.</p>
<p>⚠️ {{ t('A mastercontainer update is available. Please click on the button below to update it.') }}</p>
<form method="POST" action="api/docker/watchtower" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Update mastercontainer" />
<input type="submit" value="{{ t('Update mastercontainer') }}" />
</form>
{% else %}
{% if was_start_button_clicked == false %}
@@ -354,9 +356,9 @@
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input id="base_path" type="hidden" name="base_path" value="">
{% if newMajorVersionString != '' %}
<input type="checkbox" id="install_latest_major" name="install_latest_major"><label for="install_latest_major">Install Nextcloud Hub {{ newMajorVersionString }} (if unchecked, Nextcloud Hub {{ oldMajorVersionString }} will get installed)</label><br>
<input type="checkbox" id="install_latest_major" name="install_latest_major"><label for="install_latest_major">{{ t('Install Nextcloud Hub') }} {{ newMajorVersionString }} {{ t('(if unchecked, Nextcloud Hub') }} {{ oldMajorVersionString }} {{ t('will get installed)') }}</label><br>
{% endif %}
<input type="submit" value="Download and start containers" />
<input type="submit" value="{{ t('Download and start containers') }}" />
</form>
{% elseif has_update_available == false %}
<form method="POST" action="api/docker/start" target="overlay-log">
@@ -366,9 +368,10 @@
{% if bypass_container_update == true %}
<input type="hidden" name="bypass_container_update" value="true">
{% endif %}
<input type="submit" value="Start containers" />
<input type="submit" value="{{ t('Start containers') }}" />
</form>
{% else %}
{% set confirmStartUpdate = t('Start and update containers? You should consider creating a backup first.') %}
<form method="POST" action="api/docker/start" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
@@ -376,7 +379,7 @@
{% if bypass_container_update == true %}
<input type="hidden" name="bypass_container_update" value="true">
{% endif %}
<input class="button " type="submit" value="Start and update containers" onclick="return confirm('Start and update containers? You should consider creating a backup first.')" />
<input class="button " type="submit" value="{{ t('Start and update containers') }}" onclick="return confirm('{{ confirmStartUpdate|e('js') }}')" />
</form>
{% endif %}
{% endif %}
@@ -386,23 +389,23 @@
{% if was_start_button_clicked == true %}
{% if is_backup_section_enabled == false %}
<h2>Backup and restore</h2>
<p>The backup section is disabled via environmental variable.</p>
<h2>{{ t('Backup and restore') }}</h2>
<p>{{ t('The backup section is disabled via environmental variable.') }}</p>
{% else %}
{% if is_backup_container_running == false and not hasBackupLocation and isApacheStarting != true %}
<h2>Backup and restore</h2>
<p>Please enter the directory path below where backups will be created on the host system and submit it. It's best to choose a location on a separate drive and not on your root drive.</p>
<h2>{{ t('Backup and restore') }}</h2>
<p>{{ t('Please enter the directory path below where backups will be created on the host system and submit it. It\'s best to choose a location on a separate drive and not on your root drive.') }}</p>
<p>
To store backups remotely instead, fill in the
<a target="_blank" href="https://borgbackup.readthedocs.io/en/stable/usage/general.html#repository-urls">remote borg repo url and submit it</a>.
You will be provided with an SSH public key for authorization at the remote afterwards.
{{ t('To store backups remotely instead, fill in the') }}
<a target="_blank" href="https://borgbackup.readthedocs.io/en/stable/usage/general.html#repository-urls">{{ t('remote borg repo url and submit it') }}</a>.
{{ t('You will be provided with an SSH public key for authorization at the remote afterwards.') }}
</p>
<form method="POST" action="api/configuration" class="xhr">
<label>Local backup location</label> <input type="text" id="borg_backup_host_location" name="borg_backup_host_location" placeholder="/mnt/backup"/><br>
<label>Remote borg repo</label> <input type="text" name="borg_remote_repo" placeholder="ssh://user@host:port/path/to/repo"/><br>
<label>{{ t('Local backup location') }}</label> <input type="text" id="borg_backup_host_location" name="borg_backup_host_location" placeholder="/mnt/backup"/><br>
<label>{{ t('Remote borg repo') }}</label> <input type="text" name="borg_remote_repo" placeholder="ssh://user@host:port/path/to/repo"/><br>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Submit backup location" />
<input type="submit" value="{{ t('Submit backup location') }}" />
</form>
{{ include('includes/backup-dirs.twig') }}
{% endif %}
@@ -412,45 +415,46 @@
{% if hasBackupLocation %}
{% if is_backup_container_running == false %}
<h2>Backup and restore</h2>
<h2>{{ t('Backup and restore') }}</h2>
{% if backup_exit_code > 0 %}
<p><span class="status error"></span> Last {{ borg_backup_mode }} failed! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status error"></span> {{ t('Last') }} {{ borg_backup_mode }} {{ t('failed!') }} (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">{{ t('Logs') }}</a>)</p>
{% if borg_backup_mode == "check" %}
<p>The backup check was not successful. This might indicate a corrupt archive (look at the logs). If that should be the case, you can try to fix it by following <a target="_blank" href="https://borgbackup.readthedocs.io/en/stable/faq.html#i-get-an-integrityerror-or-similar-what-now"><strong>this documentation</strong></a></p>
<p>{{ t('The backup check was not successful. This might indicate a corrupt archive (look at the logs). If that should be the case, you can try to fix it by following') }} <a target="_blank" href="https://borgbackup.readthedocs.io/en/stable/faq.html#i-get-an-integrityerror-or-similar-what-now"><strong>{{ t('this documentation') }}</strong></a></p>
<details>
<summary>Reveal repair option</summary>
<p>Below is the option to repair the integrity of your backup. <strong>Please note:</strong> Please only use this after you have read the documentation above! (It will run the command 'borg check --repair' for you.)</p>
<summary>{{ t('Reveal repair option') }}</summary>
<p>{{ t('Below is the option to repair the integrity of your backup.') }} <strong>{{ t('Please note:') }}</strong> {{ t('Please only use this after you have read the documentation above! (It will run the command \'borg check --repair\' for you.)') }}</p>
{% set confirmRepair = t('Check and repair backup integrity? Are you sure that you want to check and repair the backup integrity? This should only be done after reading the mentioned documentation.') %}
<form method="POST" action="api/docker/backup-check-repair" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Check and repair backup integrity" onclick="return confirm('Check and repair backup integrity? Are you sure that you want to check and repair the backup integrity? This should only be done after reading the mentioned documentation.')"/>
<input type="submit" value="{{ t('Check and repair backup integrity') }}" onclick="return confirm('{{ confirmRepair|e('js') }}')"/>
</form>
</details>
{% endif %}
{% if has_backup_run_once == false %}
<p>The initial backup was not successful.</p>
<p>{{ t('The initial backup was not successful.') }}</p>
{% if borg_remote_repo %}
<p>
You may still need to authorize this pubkey on your borg remote:<br><strong>{{ borg_public_key }}</strong><br>
To try again, click <strong>Create backup</strong>.
{{ t('You may still need to authorize this pubkey on your borg remote:') }}<br><strong>{{ borg_public_key }}</strong><br>
{{ t('To try again, click') }} <strong>{{ t('Create backup') }}</strong>.
</p>
{% endif %}
<p>You may change the backup path again since the initial backup was not successful. After submitting the new value, you need to click on <strong>Create Backup</strong> to test the new value.</p>
<p>{{ t('You may change the backup path again since the initial backup was not successful. After submitting the new value, you need to click on') }} <strong>{{ t('Create Backup') }}</strong> {{ t('to test the new value.') }}</p>
<form method="POST" action="api/configuration" class="xhr">
<label>Local backup location</label> <input type="text" name="borg_backup_host_location" placeholder="/mnt/backup"/><br>
<label>Remote borg repo</label> <input type="text" name="borg_remote_repo" placeholder="ssh://user@host:port/path/to/repo"/><br>
<label>{{ t('Local backup location') }}</label> <input type="text" name="borg_backup_host_location" placeholder="/mnt/backup"/><br>
<label>{{ t('Remote borg repo') }}</label> <input type="text" name="borg_remote_repo" placeholder="ssh://user@host:port/path/to/repo"/><br>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Set backup location again" />
<input type="submit" value="{{ t('Set backup location again') }}" />
</form>
{% endif %}
{% elseif backup_exit_code == 0 %}
{% if borg_backup_mode == "backup" %}
<p><span class="status success"></span> Last {{ borg_backup_mode }} successful on {{ last_backup_time }} UTC! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status success"></span> {{ t('Last') }} {{ borg_backup_mode }} {{ t('successful on') }} {{ last_backup_time }} UTC! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">{{ t('Logs') }}</a>)</p>
{% else %}
<p><span class="status success"></span> Last {{ borg_backup_mode }} successful! (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">Logs</a>)</p>
<p><span class="status success"></span> {{ t('Last') }} {{ borg_backup_mode }} {{ t('successful!') }} (<a href="log?id=nextcloud-aio-borgbackup" target="_blank">{{ t('Logs') }}</a>)</p>
{% endif %}
{% endif %}
{% endif %}
@@ -458,53 +462,56 @@
{% if is_backup_container_running == false and isApacheStarting == false %}
{% if has_backup_run_once == true %}
<details>
<summary>Click here to reveal all backup options (including an option for automatic updates)</summary>
<summary>{{ t('Click here to reveal all backup options (including an option for automatic updates)') }}</summary>
{% endif %}
<h3>Backup information</h3>
<p>This is your encryption password for backups: <strong id="borg-backup-password">{{ borgbackup_password }}</strong></p>
<p>Please save this password in a safe place. You won't be able to restore from backup if you lose this password!</p>
<p>All important data from your Nextcloud AIO instance such as the database, your files and the mastercontainer's configuration files, will be backed up.</p>
<p>The backup uses a tool called <a target="_blank" href="https://github.com/borgbackup/borg#what-is-borgbackup"><strong>BorgBackup</strong></a>, a well-known server backup tool that efficiently backs up your files and encrypts them on the fly.</p>
<p>By using this tool, backups are incremental, differential, compressed and encrypted so only the first backup will take a while. Further backups should be fast as only changes are taken into account.</p>
<h3>{{ t('Backup information') }}</h3>
<p>{{ t('This is your encryption password for backups:') }} <strong id="borg-backup-password">{{ borgbackup_password }}</strong></p>
<p>{{ t('Please save this password in a safe place. You won\'t be able to restore from backup if you lose this password!') }}</p>
<p>{{ t('All important data from your Nextcloud AIO instance such as the database, your files and the mastercontainer\'s configuration files, will be backed up.') }}</p>
<p>{{ t('The backup uses a tool called') }} <a target="_blank" href="https://github.com/borgbackup/borg#what-is-borgbackup"><strong>BorgBackup</strong></a>, {{ t('a well-known server backup tool that efficiently backs up your files and encrypts them on the fly.') }}</p>
<p>{{ t('By using this tool, backups are incremental, differential, compressed and encrypted so only the first backup will take a while. Further backups should be fast as only changes are taken into account.') }}</p>
{% if borg_remote_repo != '' %}
<p>
Backups get created remotely at:<br>
{{ t('Backups get created remotely at:') }}<br>
<strong>{{ borg_remote_repo }}</strong>
{% if has_backup_run_once == true %}
<br/>Your borg ssh public key is:<br><strong>{{ borg_public_key }}</strong>
<br/>{{ t('Your borg ssh public key is:') }}<br><strong>{{ borg_public_key }}</strong>
{% endif %}
</p>
{% else %}
<p>Backups will be created in the following directory on the host: <strong>{{ borg_backup_host_location }}/borg</strong></p>
<p>{{ t('Backups will be created in the following directory on the host:') }} <strong>{{ borg_backup_host_location }}/borg</strong></p>
{% endif %}
<p>Be aware that this solution does not backup files and folders that are mounted into Nextcloud using the external storage app, but you can add further Docker volumes and host paths that you want to back up after the initial backup is done.</p>
<p>For information about backup retention, see <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-adjust-borgs-retention-policy">this</a></strong>.</p>
<p>Daily backups can be enabled after the initial backup is done. Enabling this also allows you to enable an option to update all containers, Nextcloud, and its apps automatically.</p>
<p>For further documentation and options on this backup solution refer to <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one#backup">this section</a></strong> and below.</p>
<p>{{ t('Be aware that this solution does not backup files and folders that are mounted into Nextcloud using the external storage app, but you can add further Docker volumes and host paths that you want to back up after the initial backup is done.') }}</p>
<p>{{ t('For information about backup retention, see') }} <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-adjust-borgs-retention-policy">{{ t('this') }}</a></strong>.</p>
<p>{{ t('Daily backups can be enabled after the initial backup is done. Enabling this also allows you to enable an option to update all containers, Nextcloud, and its apps automatically.') }}</p>
<p>{{ t('For further documentation and options on this backup solution refer to') }} <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one#backup">{{ t('this section') }}</a></strong> {{ t('and below.') }}</p>
{% if isApacheStarting != true %}
<h3>Backup creation</h3>
<p>Clicking on the button below will create a backup.</p>
<h3>{{ t('Backup creation') }}</h3>
<p>{{ t('Clicking on the button below will create a backup.') }}</p>
{% set confirmBackup = t('Create backup? Are you sure that you want to create a backup? This will stop all running containers and create the backup.') %}
<form method="POST" action="api/docker/backup" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Create backup" onclick="return confirm('Create backup? Are you sure that you want to create a backup? This will stop all running containers and create the backup.')" />
<input type="submit" value="{{ t('Create backup') }}" onclick="return confirm('{{ confirmBackup|e('js') }}')" />
</form>
{% if has_backup_run_once == true %}
<h3>Backup Viewer</h3>
<p>There is now a community container that allows to access your backups in a web session. See <a target="_blank" href="https://github.com/nextcloud/all-in-one/tree/main/community-containers/borgbackup-viewer"><strong>this documentation</strong></a>.</p>
<h3>{{ t('Backup Viewer') }}</h3>
<p>{{ t('There is now a community container that allows to access your backups in a web session. See') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one/tree/main/community-containers/borgbackup-viewer"><strong>{{ t('this documentation') }}</strong></a>.</p>
<h3>Backup check</h3>
<p>Click on the button below to perform a backup integrity check. This is an option that verifies that your backup is intact. It shouldn't be needed in most situations.</p>
<h3>{{ t('Backup check') }}</h3>
<p>{{ t('Click on the button below to perform a backup integrity check. This is an option that verifies that your backup is intact. It shouldn\'t be needed in most situations.') }}</p>
{% set confirmCheck = t('Check backup integrity? Are you sure that you want to check the backup? This can take a long time depending on the size of your backup.') %}
<form method="POST" action="api/docker/backup-check" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Check backup integrity" onclick="return confirm('Check backup integrity? Are you sure that you want to check the backup? This can take a long time depending on the size of your backup.')" />
<input type="submit" value="{{ t('Check backup integrity') }}" onclick="return confirm('{{ confirmCheck|e('js') }}')" />
</form>
<h3>Backup restore</h3>
<p>Choose the backup that you want to restore and click on the button below to restore the selected backup. This will overwrite all your files with the chosen backup so you should consider creating a backup first. You can run an integrity check before restoring your files but this shouldn't be needed in most situations. Please note that this will not restore additionally chosen backup directories! The restore process should be pretty fast as rsync, which only transfers changed files, is used to restore the chosen backup.</p>
<h3>{{ t('Backup restore') }}</h3>
<p>{{ t('Choose the backup that you want to restore and click on the button below to restore the selected backup. This will overwrite all your files with the chosen backup so you should consider creating a backup first. You can run an integrity check before restoring your files but this shouldn\'t be needed in most situations. Please note that this will not restore additionally chosen backup directories! The restore process should be pretty fast as rsync, which only transfers changed files, is used to restore the chosen backup.') }}</p>
{% set confirmRestoreSelected = t('Restore the selected backup? Are you sure that you want to restore the selected backup? This will stop all running containers and restore the selected backup. It is recommended to create a backup first. You might also want to check the backup integrity.') %}
<form method="POST" action="api/docker/restore" target="overlay-log" id="restore_selection">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
@@ -513,74 +520,75 @@
<option value="{{ restore_time }}">{{ restore_time }} UTC</option>
{% endfor %}
</select>
<input type="submit" value="Restore selected backup" onclick="return confirm('Restore the selected backup? Are you sure that you want to restore the selected backup? This will stop all running containers and restore the selected backup. It is recommended to create a backup first. You might also want to check the backup integrity.')" />
<input type="submit" value="{{ t('Restore selected backup') }}" onclick="return confirm('{{ confirmRestoreSelected|e('js') }}')" />
</form>
<h3>Update backup list</h3>
<h3>{{ t('Update backup list') }}</h3>
<details>
<summary>Click here to reveal this option</summary>
<p>If you use an external snapshot tool to restore the server that runs AIO, you might run into a problem that the above listed available backups are not up-to-date to restore your server from. You can click the button below to update this list.</p>
<summary>{{ t('Click here to reveal this option') }}</summary>
<p>{{ t('If you use an external snapshot tool to restore the server that runs AIO, you might run into a problem that the above listed available backups are not up-to-date to restore your server from. You can click the button below to update this list.') }}</p>
<form method="POST" action="api/docker/backup-list" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Update backup list" />
<input type="submit" value="{{ t('Update backup list') }}" />
</form>
</details>
<h3>Daily backup and automatic updates</h3>
<h3>{{ t('Daily backup and automatic updates') }}</h3>
{% if daily_backup_time == "" %}
<p>By entering a time below and submitting it, you can enable daily backups. It will create them at the entered time in 24h format. E.g. <strong>04:00</strong> will create backups at 4 am UTC and <strong>16:00</strong> at 4 pm UTC. When creating the backup, containers will be stopped and restarted after the backup is complete.</p>
<p>{{ t('By entering a time below and submitting it, you can enable daily backups. It will create them at the entered time in 24h format. E.g.') }} <strong>04:00</strong> {{ t('will create backups at 4 am UTC and') }} <strong>16:00</strong> {{ t('at 4 pm UTC. When creating the backup, containers will be stopped and restarted after the backup is complete.') }}</p>
<form method="POST" action="api/configuration" class="xhr">
<input type="text" name="daily_backup_time" placeholder="04:00"/>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Submit daily backup time and settings" /><br>
<input type="checkbox" id="automatic_updates" name="automatic_updates" checked="checked"><label for="automatic_updates">Automatically update all containers, the mastercontainer and on saturdays your Nextcloud apps</label><br>
<input type="checkbox" id="success_notification" name="success_notification" checked="checked"><label for="success_notification">Send notifications about successful backups (notifications about unsuccessful backups will always be sent)</label>
<input type="submit" value="{{ t('Submit daily backup time and settings') }}" /><br>
<input type="checkbox" id="automatic_updates" name="automatic_updates" checked="checked"><label for="automatic_updates">{{ t('Automatically update all containers, the mastercontainer and on saturdays your Nextcloud apps') }}</label><br>
<input type="checkbox" id="success_notification" name="success_notification" checked="checked"><label for="success_notification">{{ t('Send notifications about successful backups (notifications about unsuccessful backups will always be sent)') }}</label>
</form>
{% else %}
<p>Daily backups will be created at <strong>{{ daily_backup_time }} UTC</strong>. A notification about the result of the backup will be sent.</p>
<p>{{ t('Daily backups will be created at') }} <strong>{{ daily_backup_time }} UTC</strong>. {{ t('A notification about the result of the backup will be sent.') }}</p>
{% if automatic_updates == true %}
Also your containers, the mastercontainer and, on Saturdays, your Nextcloud apps will be automatically updated.
{{ t('Also your containers, the mastercontainer and, on Saturdays, your Nextcloud apps will be automatically updated.') }}
{% endif %}
<p>To change your backup time first disable Daily Backups, then enter your new backup time, and then re-enable them.</p>
<p>{{ t('To change your backup time first disable Daily Backups, then enter your new backup time, and then re-enable them.') }}</p>
<form method="POST" action="api/configuration" class="xhr">
<input type="hidden" name="delete_daily_backup_time" value="yes"/>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Disable or change daily backup settings" />
<input type="submit" value="{{ t('Disable or change daily backup settings') }}" />
</form>
{% endif %}
<h3>Back up additional directories and docker volumes of your host</h3>
<p>Below you can enter directories and docker volumes of your host that will be backed up into the same borg backup archive. Make sure to press the submit button after changing anything.</p>
<h3>{{ t('Back up additional directories and docker volumes of your host') }}</h3>
<p>{{ t('Below you can enter directories and docker volumes of your host that will be backed up into the same borg backup archive. Make sure to press the submit button after changing anything.') }}</p>
<form method="POST" action="api/configuration" class="xhr">
<textarea id="additional_backup_directories" name="additional_backup_directories" rows="4" cols="50" placeholder="/directory/on/the/host&#10;my_custom_docker_volume">{{ additional_backup_directories }}</textarea>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Submit additional backup locations" />
<input type="submit" value="{{ t('Submit additional backup locations') }}" />
</form>
<p>Each line and entry needs to start with a slash or letter/digit. Only <strong>a-z</strong>, <strong>A-Z</strong>, <strong>.</strong>, <strong>0-9</strong>, <strong>_</strong>, <strong>-</strong>, and <strong>/</strong> are allowed. If the entry begins with a letter/digit slashes are not supported. Two valid entries are <strong>/directory/on/the/host</strong> and <strong>my_custom_docker_volume</strong>. You need to make sure that all given directories exist or the backup container will fail to start!</p>
<p>Be sure to individually specify all storage that you want to back up as storage will not be mounted recursively. E.g. providing <strong>/</strong> as additional backup directory will only back up files and folders that are stored on the root partition and not on the EFI partition or any other. Excluded by the backup will be caches and a few other directories. If you want to back up the root partition you should make sure to stop all services before the backup so it can run correctly. For automating this see <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-stopstartupdate-containers-or-trigger-the-daily-backup-from-a-script-externally">this documentation</a></p>
<p>Please note that the chosen directories/volumes will not be restored when you restore your instance, so this would need to be done manually.</p>
<p>{{ t('Each line and entry needs to start with a slash or letter/digit. Only') }} <strong>a-z</strong>, <strong>A-Z</strong>, <strong>.</strong>, <strong>0-9</strong>, <strong>_</strong>, <strong>-</strong>, {{ t('and') }} <strong>/</strong> {{ t('are allowed. If the entry begins with a letter/digit slashes are not supported. Two valid entries are') }} <strong>/directory/on/the/host</strong> {{ t('and') }} <strong>my_custom_docker_volume</strong>. {{ t('You need to make sure that all given directories exist or the backup container will fail to start!') }}</p>
<p>{{ t('Be sure to individually specify all storage that you want to back up as storage will not be mounted recursively. E.g. providing') }} <strong>/</strong> {{ t('as additional backup directory will only back up files and folders that are stored on the root partition and not on the EFI partition or any other. Excluded by the backup will be caches and a few other directories. If you want to back up the root partition you should make sure to stop all services before the backup so it can run correctly. For automating this see') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-stopstartupdate-containers-or-trigger-the-daily-backup-from-a-script-externally">{{ t('this documentation') }}</a></p>
<p>{{ t('Please note that the chosen directories/volumes will not be restored when you restore your instance, so this would need to be done manually.') }}</p>
{% if additional_backup_directories != "" %}
<p>This option is currently set. You can disable it again by clearing the field and submitting your changes.</p>
<p>{{ t('This option is currently set. You can disable it again by clearing the field and submitting your changes.') }}</p>
{% endif %}
{% endif %}
<h3>Reset backup location</h3>
<h3>{{ t('Reset backup location') }}</h3>
<p>
If the configured backup host location <strong>{{ borg_backup_host_location }}</strong>
{{ t('If the configured backup host location') }} <strong>{{ borg_backup_host_location }}</strong>
{% if borg_remote_repo %}
or the remote repo <strong>{{ borg_remote_repo }}</strong>
{{ t('or the remote repo') }} <strong>{{ borg_remote_repo }}</strong>
{% endif %}
is wrong or if you want to reset the backup location due to other reasons, you can do so by clicking on the button below.
{{ t('is wrong or if you want to reset the backup location due to other reasons, you can do so by clicking on the button below.') }}
</p>
{% set confirmResetLocation = t('Are you sure that you want to reset the backup location?') %}
<form method="POST" action="api/configuration" class="xhr">
<input type="hidden" name="delete_borg_backup_location_vars" value="yes"/>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Reset backup location" onclick="return confirm('Are you sure that you want to reset the backup location?')" />
<input type="submit" value="{{ t('Reset backup location') }}" onclick="return confirm('{{ confirmResetLocation|e('js') }}')" />
</form>
{% endif %}
{% if has_backup_run_once == true %}
@@ -592,18 +600,18 @@
{% if is_backup_container_running == false %}
{% if isApacheStarting == false %}
<h2>AIO passphrase change</h2>
<h2>{{ t('AIO passphrase change') }}</h2>
<details>
<summary>Click here to change your AIO passphrase</summary>
<p>You can change your AIO passphrase below:</p>
<summary>{{ t('Click here to change your AIO passphrase') }}</summary>
<p>{{ t('You can change your AIO passphrase below:') }}</p>
<form method="POST" action="api/configuration" class="xhr">
<input type="password" autocomplete="current-password" name="current-master-password" placeholder="Your current AIO passphrase" id="current-master-password" oninput="showPassword('current-master-password')">
<input type="password" autocomplete="new-password" name="new-master-password" placeholder="Your new AIO passphrase" id="new-master-password" oninput="showPassword('new-master-password')">
<input type="password" autocomplete="current-password" name="current-master-password" placeholder="{{ t('Your current AIO passphrase') }}" id="current-master-password" oninput="showPassword('current-master-password')">
<input type="password" autocomplete="new-password" name="new-master-password" placeholder="{{ t('Your new AIO passphrase') }}" id="new-master-password" oninput="showPassword('new-master-password')">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Submit passphrase change" />
<input type="submit" value="{{ t('Submit passphrase change') }}" />
</form>
<p>The new passphrase needs to be at least 24 characters long. Allowed characters are the <a target="_blank" href="https://en.wikipedia.org/wiki/Latin_alphabet#/media/File:Abecedarium.png"><strong>latin characters</strong></a> <strong>a-z</strong>, <strong>A-Z</strong>, <strong>0-9</strong> and <strong>spaces</strong>.</p>
<p>{{ t('The new passphrase needs to be at least 24 characters long. Allowed characters are the') }} <a target="_blank" href="https://en.wikipedia.org/wiki/Latin_alphabet#/media/File:Abecedarium.png"><strong>{{ t('latin characters') }}</strong></a> <strong>a-z</strong>, <strong>A-Z</strong>, <strong>0-9</strong> {{ t('and spaces.') }}</p>
</details>
{% endif %}
{% endif %}
@@ -612,30 +620,31 @@
{{ include('includes/optional-containers.twig') }}
<h2>Timezone change</h2>
<h2>{{ t('Timezone change') }}</h2>
{% if isAnyRunning == true %}
{% if timezone != "" %}
<p>The timezone for Nextcloud is currently set to <strong>{{ timezone }}</strong>.</p>
<p>{{ t('The timezone for Nextcloud is currently set to') }} <strong>{{ timezone }}</strong>.</p>
{% endif %}
<p><strong>Please note:</strong> You can change the timezone when your containers are stopped.</p>
<p><strong>{{ t('Please note:') }}</strong> {{ t('You can change the timezone when your containers are stopped.') }}</p>
{% else %}
{% if timezone == "" %}
<p>To get the correct time values for certain Nextcloud features, set the timezone for Nextcloud to the one that your users mainly use. Please note that this setting does not apply to the mastercontainer and any backup option.</p>
<p>You can configure the timezone for Nextcloud below (Do not forget to submit the value!):</p>
<p>{{ t('To get the correct time values for certain Nextcloud features, set the timezone for Nextcloud to the one that your users mainly use. Please note that this setting does not apply to the mastercontainer and any backup option.') }}</p>
<p>{{ t('You can configure the timezone for Nextcloud below (Do not forget to submit the value!):') }}</p>
{% set confirmTimezone = t('Are you sure that this is a valid timezone? Please double check by following the wikipedia article and checking the correct column. If the timezone is not valid, it will break the startup since the database will not be correctly initialized and you will end up in a startup loop.') %}
<form method="POST" action="api/configuration" class="xhr">
<input type="text" id="timezone" name="timezone" placeholder="Europe/Berlin" />
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Submit timezone" onclick="return confirm('Are you sure that this is a valid timezone? Please double check by following the wikipedia article and checking the correct column. If the timezone is not valid, it will break the startup since the database will not be correctly initialized and you will end up in a startup loop.')" />
<input type="submit" value="{{ t('Submit timezone') }}" onclick="return confirm('{{ confirmTimezone|e('js') }}')" />
</form>
<p>You need to make sure that the timezone that you enter is valid. An example is <strong>Europe/Berlin</strong>. You can get valid values by looking at the 'TZ identifier' column of this list: <a target="_blank" href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List"><strong>click here</strong></a>. The default is <strong>Etc/UTC</strong> if nothing is entered.</p>
<p>{{ t('You need to make sure that the timezone that you enter is valid. An example is') }} <strong>Europe/Berlin</strong>. {{ t('You can get valid values by looking at the \'TZ identifier\' column of this list:') }} <a target="_blank" href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List"><strong>{{ t('click here') }}</strong></a>. {{ t('The default is') }} <strong>Etc/UTC</strong> {{ t('if nothing is entered.') }}</p>
{% else %}
<p>The timezone for Nextcloud is currently set to <strong>{{ timezone }}</strong>. You can change the timezone by clicking on the button below.</p>
<p>{{ t('The timezone for Nextcloud is currently set to') }} <strong>{{ timezone }}</strong>. {{ t('You can change the timezone by clicking on the button below.') }}</p>
<form method="POST" action="api/configuration" class="xhr">
<input type="hidden" name="delete_timezone" value="yes"/>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Reset the timezone" />
<input type="submit" value="{{ t('Reset the timezone') }}" />
</form>
{% endif %}
{% endif %}

View File

@@ -1,44 +1,44 @@
<details>
<summary>Click here to view the current AIO config and documentation links</summary>
<summary>{{ t('Click here to view the current AIO config and documentation links') }}</summary>
{% if was_start_button_clicked == true %}
<p>Nextcloud's config.php file is stored in the nextcloud_aio_nextcloud Docker volume and can be edited by following the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-edit-nextclouds-configphp-file-with-a-texteditor">config.php documentation</a>.</p>
<p>You can run Nextcloud's usual occ commands by following the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-run-occ-commands">occ documentation</a></strong>.</p>
<p>{{ t('Nextcloud\'s config.php file is stored in the nextcloud_aio_nextcloud Docker volume and can be edited by following the') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-edit-nextclouds-configphp-file-with-a-texteditor">{{ t('config.php documentation') }}</a>.</p>
<p>{{ t('You can run Nextcloud\'s usual occ commands by following the') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-run-occ-commands">{{ t('occ documentation') }}</a>.</p>
{% endif %}
<p>
{% if nextcloud_datadir starts with '/' %}
Nextcloud's datadir is getting stored in the {{ nextcloud_datadir }} directory.
{{ t('Nextcloud\'s datadir is getting stored in the') }} {{ nextcloud_datadir }} {{ t('directory.') }}
{% else %}
Nextcloud's datadir is getting stored in the {{ nextcloud_datadir }} Docker volume.
{{ t('Nextcloud\'s datadir is getting stored in the') }} {{ nextcloud_datadir }} {{ t('Docker volume.') }}
{% endif %}
See the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-change-the-default-location-of-nextclouds-datadir">NEXTCLOUD_DATADIR documentation</a> on how to change this.
{{ t('See the') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-change-the-default-location-of-nextclouds-datadir">{{ t('NEXTCLOUD_DATADIR documentation') }}</a> {{ t('on how to change this.') }}
</p>
<p>
{% if nextcloud_mount == '' %}
The Nextcloud container is confined and local external storage in Nextcloud is disabled.
{{ t('The Nextcloud container is confined and local external storage in Nextcloud is disabled.') }}
{% else %}
The Nextcloud container is getting access to the {{ nextcloud_mount }} directory and local external storage in Nextcloud is enabled.
{{ t('The Nextcloud container is getting access to the') }} {{ nextcloud_mount }} {{ t('directory and local external storage in Nextcloud is enabled.') }}
{% endif %}
See the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-allow-the-nextcloud-container-to-access-directories-on-the-host">NEXTCLOUD_MOUNT documentation</a> on how to change this.</p>
{{ t('See the') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-allow-the-nextcloud-container-to-access-directories-on-the-host">{{ t('NEXTCLOUD_MOUNT documentation') }}</a> {{ t('on how to change this.') }}</p>
<p>Nextcloud has an upload limit of {{ nextcloud_upload_limit }} configured (for public link uploads. Bigger uploads are always possible when users are logged in). See the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-adjust-the-upload-limit-for-nextcloud">NEXTCLOUD_UPLOAD_LIMIT documentation</a> on how to change this.</p>
<p>{{ t('Nextcloud has an upload limit of') }} {{ nextcloud_upload_limit }} {{ t('configured (for public link uploads. Bigger uploads are always possible when users are logged in). See the') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-adjust-the-upload-limit-for-nextcloud">{{ t('NEXTCLOUD_UPLOAD_LIMIT documentation') }}</a> {{ t('on how to change this.') }}</p>
<p>For Nextcloud, a memory limit of {{ nextcloud_memory_limit }} per PHP process is configured. See the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-adjust-the-php-memory-limit-for-nextcloud">NEXTCLOUD_MEMORY_LIMIT documentation</a> on how to change this.</p>
<p>{{ t('For Nextcloud, a memory limit of') }} {{ nextcloud_memory_limit }} {{ t('per PHP process is configured. See the') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-adjust-the-php-memory-limit-for-nextcloud">{{ t('NEXTCLOUD_MEMORY_LIMIT documentation') }}</a> {{ t('on how to change this.') }}</p>
<p>Nextcloud has a timeout of {{ nextcloud_max_time }} seconds configured (important for big file uploads). See the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-adjust-the-max-execution-time-for-nextcloud">NEXTCLOUD_MAX_TIME documentation</a> on how to change this.</p>
<p>{{ t('Nextcloud has a timeout of') }} {{ nextcloud_max_time }} {{ t('seconds configured (important for big file uploads). See the') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-adjust-the-max-execution-time-for-nextcloud">{{ t('NEXTCLOUD_MAX_TIME documentation') }}</a> {{ t('on how to change this.') }}</p>
<p>
{% if is_dri_device_enabled == true and is_nvidia_gpu_enabled == true %}
Hardware acceleration is enabled with the /dev/dri device and the Nvidia runtime.
{{ t('Hardware acceleration is enabled with the /dev/dri device and the Nvidia runtime.') }}
{% elseif is_dri_device_enabled == true %}
Hardware acceleration is enabled with the /dev/dri device.
{{ t('Hardware acceleration is enabled with the /dev/dri device.') }}
{% elseif is_nvidia_gpu_enabled == true %}
Hardware acceleration is enabled with the Nvidia runtime.
{{ t('Hardware acceleration is enabled with the Nvidia runtime.') }}
{% else %}
Hardware acceleration is not enabled. It's recommended to enable hardware transcoding for better performance.
{{ t('Hardware acceleration is not enabled. It\'s recommended to enable hardware transcoding for better performance.') }}
{% endif %}
See the <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-enable-hardware-acceleration-for-nextcloud">hardware acceleration documentation</a> on how to change this.</p>
{{ t('See the') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-enable-hardware-acceleration-for-nextcloud">{{ t('hardware acceleration documentation') }}</a> {{ t('on how to change this.') }}</p>
<p>For further documentation on AIO, refer to <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one#nextcloud-all-in-one">this page</a></strong>. You can use the browser search [CTRL]+[F] to search through the documentation. Additional documentation can be found <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/categories/wiki">here</a></strong>.</p>
</details>
<p>{{ t('For further documentation on AIO, refer to') }} <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one#nextcloud-all-in-one">{{ t('this page') }}</a></strong>. {{ t('You can use the browser search [CTRL]+[F] to search through the documentation. Additional documentation can be found') }} <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/categories/wiki">{{ t('here') }}</a></strong>.</p>
</details>

View File

@@ -1,6 +1,6 @@
<p>The folder path that you enter must start with <strong>/</strong> and must <strong>not</strong> end with <strong>/</strong>.</p>
<p>An example for Linux is <strong>/mnt/backup</strong>.</p>
<p>On Synology it could be <strong>/volume1/docker/nextcloud/backup</strong>.</p>
<p>For macOS it may be <strong>/var/backup</strong>.</p>
<p>On Windows it might be <strong>/run/desktop/mnt/host/c/backup</strong>. (This path is equivalent to 'C:\backup' on your Windows host so you need to translate the path accordingly. Hint: the path that you enter needs to start with '/run/desktop/mnt/host/'. Append to that the exact location on your windows host, e.g. 'c/backup' which is equivalent to 'C:\backup'.) ⚠️ <strong>Please note</strong>: This does not work with external drives like USB or network drives and only with internal drives like SATA or NVME drives.</p>
<p>Another option is to enter a specific volume name here: <strong>nextcloud_aio_backupdir</strong>. This volume needs to be created beforehand manually by you in order to be able to use it. See <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-create-the-backup-volume-on-windows">this documentation</a> for an example.</p>
<p>{{ t('The folder path that you enter must start with') }} <strong>/</strong> {{ t('and must') }} <strong>{{ t('not') }}</strong> {{ t('end with') }} <strong>/</strong>.</p>
<p>{{ t('An example for Linux is') }} <strong>/mnt/backup</strong>.</p>
<p>{{ t('On Synology it could be') }} <strong>/volume1/docker/nextcloud/backup</strong>.</p>
<p>{{ t('For macOS it may be') }} <strong>/var/backup</strong>.</p>
<p>{{ t('On Windows it might be') }} <strong>/run/desktop/mnt/host/c/backup</strong>. ({{ t('This path is equivalent to \'C:\\backup\' on your Windows host so you need to translate the path accordingly. Hint: the path that you enter needs to start with \'/run/desktop/mnt/host/\'. Append to that the exact location on your windows host, e.g. \'c/backup\' which is equivalent to \'C:\\backup\'.') }}) ⚠️ <strong>{{ t('Please note') }}</strong>: {{ t('This does not work with external drives like USB or network drives and only with internal drives like SATA or NVME drives.') }}</p>
<p>{{ t('Another option is to enter a specific volume name here:') }} <strong>nextcloud_aio_backupdir</strong>. {{ t('This volume needs to be created beforehand manually by you in order to be able to use it. See') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one#how-to-create-the-backup-volume-on-windows">{{ t('this documentation') }}</a> {{ t('for an example.') }}</p>

View File

@@ -1,13 +1,13 @@
<h2>Community Containers</h2>
<p>In this section you can enable or disable optional Community Containers that are not included by default in the main installation. These containers are provided by the community and can be useful for various purposes and are automatically integrated in AIOs backup solution and update mechanisms.</p>
<p><strong>⚠️ Caution: </strong>Community Containers are maintained by the community and not officially by Nextcloud. Some containers may not be compatible with your system, may not work as expected or may discontinue. Use them at your own risk. Please read the documentation for each container first before adding any as some are also incompatible between each other! Never add all of them at the same time!</p>
<h2>{{ t('Community Containers') }}</h2>
<p>{{ t('In this section you can enable or disable optional Community Containers that are not included by default in the main installation. These containers are provided by the community and can be useful for various purposes and are automatically integrated in AIOs backup solution and update mechanisms.') }}</p>
<p><strong>⚠️ {{ t('Caution:') }} </strong>{{ t('Community Containers are maintained by the community and not officially by Nextcloud. Some containers may not be compatible with your system, may not work as expected or may discontinue. Use them at your own risk. Please read the documentation for each container first before adding any as some are also incompatible between each other! Never add all of them at the same time!') }}</p>
{% if isAnyRunning == true %}
<p><strong>Please note:</strong> You can enable or disable the options below only when your containers are stopped.</p>
<p><strong>{{ t('Please note:') }}</strong> {{ t('You can enable or disable the options below only when your containers are stopped.') }}</p>
{% else %}
<p><strong>Please note:</strong> Make sure to save your changes by clicking <strong>Save changes</strong> below the list of Community Containers. The changes will not be auto-saved.</p>
<p><strong>{{ t('Please note:') }}</strong> {{ t('Make sure to save your changes by clicking') }} <strong>{{ t('Save changes') }}</strong> {{ t('below the list of Community Containers. The changes will not be auto-saved.') }}</p>
{% endif %}
<details>
<summary>Show/Hide available Community Containers</summary>
<summary>{{ t('Show/Hide available Community Containers') }}</summary>
<form id="community-form" method="POST" action="api/configuration" class="xhr">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
@@ -31,12 +31,13 @@
>
<label for="{{ cc.id }}">{{ cc.name }}
{% if cc.documentation != '' %}
<a href="{{ cc.documentation }}" target="_blank">(Documentation)</a>
<a href="{{ cc.documentation }}" target="_blank">({{ t('Documentation') }})</a>
{% endif %}
</label>
</p>
{% endfor %}
<input id="community-form-submit" type="submit" value="Save changes" onclick="return confirm('Are you sure that you read the documentation of all community containers that you enabled? If no, please do not continue as this might break your instance!')" />
{% set confirmCommunity = t('Are you sure that you read the documentation of all community containers that you enabled? If no, please do not continue as this might break your instance!') %}
<input id="community-form-submit" type="submit" value="{{ t('Save changes') }}" onclick="return confirm('{{ confirmCommunity|e('js') }}')" />
</form>
</details>
</details>

View File

@@ -1,17 +1,17 @@
<h2>Optional containers</h2>
<p>In this section you can enable or disable optional containers.</p>
<h2>{{ t('Optional containers') }}</h2>
<p>{{ t('In this section you can enable or disable optional containers.') }}</p>
{% if isAnyRunning == true %}
<p><strong>Please note:</strong> You can enable or disable the options below only when your containers are stopped.</p>
<p><strong>{{ t('Please note:') }}</strong> {{ t('You can enable or disable the options below only when your containers are stopped.') }}</p>
{% else %}
<p><strong>Please note:</strong> Make sure to save your changes by clicking <strong>Save changes</strong> below the list of optional containers. The changes will not be auto-saved.</p>
<p><strong>{{ t('Please note:') }}</strong> {{ t('Make sure to save your changes by clicking') }} <strong>{{ t('Save changes') }}</strong> {{ t('below the list of optional containers. The changes will not be auto-saved.') }}</p>
{% endif %}
<form id="options-form" method="POST" action="api/configuration" class="xhr">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="hidden" name="options-form" value="options-form">
<h3>Office Suite</h3>
<h3>{{ t('Office Suite') }}</h3>
{% if isAnyRunning == false %}
<p>Choose your preferred office suite. Only one can be enabled at a time.</p>
<p>{{ t('Choose your preferred office suite. Only one can be enabled at a time.') }}</p>
{% endif %}
<div class="office-suite-cards">
<input
@@ -26,23 +26,23 @@
>
<label class="office-card{{ isAnyRunning ? ' office-card-disabled' : '' }}" for="office-collabora">
<div class="office-card-header">
<h4>Nextcloud Office</h4>
<h4>{{ t('Nextcloud Office') }}</h4>
<svg class="office-checkmark" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="var(--color-nextcloud-blue)"/>
<path d="M7 12L10.5 15.5L17 9" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<ul class="office-features">
<li>Best Nextcloud integration</li>
<li>Open source</li>
<li>Good performance</li>
<li>Best security: documents never leave your server</li>
<li>Best ODF compatibility</li>
<li>Best support for legacy files</li>
<li>{{ t('Best Nextcloud integration') }}</li>
<li>{{ t('Open source') }}</li>
<li>{{ t('Good performance') }}</li>
<li>{{ t('Best security: documents never leave your server') }}</li>
<li>{{ t('Best ODF compatibility') }}</li>
<li>{{ t('Best support for legacy files') }}</li>
</ul>
{% if isAnyRunning == false %}
<a href="https://www.collaboraoffice.com/code/" target="_blank" class="office-learn-more" onclick="event.stopPropagation();">
Learn more
{{ t('Learn more') }}
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" style="vertical-align: middle; margin-left: 4px;">
<path d="M6 12L10 8L6 4" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
@@ -62,22 +62,22 @@
>
<label class="office-card{{ isAnyRunning ? ' office-card-disabled' : '' }}" for="office-onlyoffice">
<div class="office-card-header">
<h4>OnlyOffice</h4>
<h4>{{ t('OnlyOffice') }}</h4>
<svg class="office-checkmark" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="var(--color-nextcloud-blue)"/>
<path d="M7 12L10.5 15.5L17 9" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<ul class="office-features">
<li>Good Nextcloud integration</li>
<li>Open core</li>
<li>Best performance</li>
<li>Best Microsoft compatibility</li>
<li>Limited ODF compatibility</li>
<li>{{ t('Good Nextcloud integration') }}</li>
<li>{{ t('Open core') }}</li>
<li>{{ t('Best performance') }}</li>
<li>{{ t('Best Microsoft compatibility') }}</li>
<li>{{ t('Limited ODF compatibility') }}</li>
</ul>
{% if isAnyRunning == false %}
<a href="https://www.onlyoffice.com/" target="_blank" class="office-learn-more" onclick="event.stopPropagation();">
Learn more
{{ t('Learn more') }}
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" style="vertical-align: middle; margin-left: 4px;">
<path d="M6 12L10 8L6 4" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
@@ -102,12 +102,12 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" style="vertical-align: middle; margin-right: 6px;">
<path d="M2 2L14 14M2 14L14 2" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>
Disable office suite
{{ t('Disable office suite') }}
</label>
</div>
{% endif %}
<input class="options-form-submit" type="submit" value="Save changes" />
<h3>Additional Optional Containers</h3>
<input class="options-form-submit" type="submit" value="{{ t('Save changes') }}" />
<h3>{{ t('Additional Optional Containers') }}</h3>
<p>
<input
type="checkbox"
@@ -120,7 +120,7 @@
data-initial-state="false"
{% endif %}
>
<label for="clamav">ClamAV (Antivirus backend for Nextcloud, needs ~1GB additional RAM)</label>
<label for="clamav">{{ t('ClamAV (Antivirus backend for Nextcloud, needs ~1GB additional RAM)') }}</label>
</p>
<p>
<input
@@ -135,9 +135,9 @@
{% endif %}
>
<label for="fulltextsearch">
Fulltextsearch (needs ~1GB additional RAM, <a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/5768">does not work on Kernels without Seccomp</a>)
{{ t('Fulltextsearch (needs ~1GB additional RAM,') }} <a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/5768">{{ t('does not work on Kernels without Seccomp') }}</a>)
{% if is_fulltextsearch_enabled == false %}
. <strong>Please note:</strong> the initial indexing can take a long time during which Nextcloud will be unavailable
. <strong>{{ t('Please note:') }}</strong> {{ t('the initial indexing can take a long time during which Nextcloud will be unavailable') }}
{% endif %}
</label>
</p>
@@ -153,7 +153,7 @@
data-initial-state="false"
{% endif %}
>
<label for="imaginary">Imaginary (for previews of heic, heif, illustrator, pdf, svg, tiff and webp. Imaginary is currently <a target="_blank" href="https://github.com/nextcloud/server/issues/34262">incompatible with server-side-encryption</a>)</label>
<label for="imaginary">{{ t('Imaginary (for previews of heic, heif, illustrator, pdf, svg, tiff and webp. Imaginary is currently') }} <a target="_blank" href="https://github.com/nextcloud/server/issues/34262">{{ t('incompatible with server-side-encryption') }}</a>)</label>
</p>
<p>
<input
@@ -167,7 +167,7 @@
data-initial-state="false"
{% endif %}
>
<label for="talk">Nextcloud Talk (needs ports {{ talk_port }}/TCP and {{ talk_port }}/UDP open/forwarded in your firewall/router)</label>
<label for="talk">{{ t('Nextcloud Talk (needs ports') }} {{ talk_port }}/TCP {{ t('and') }} {{ talk_port }}/UDP {{ t('open/forwarded in your firewall/router)') }}</label>
</p>
<p>
<input
@@ -181,7 +181,7 @@
data-initial-state="false"
{% endif %}
>
<label for="talk-recording">Nextcloud Talk Recording-server (needs Nextcloud Talk being enabled and ~1GB additional RAM and ~2 additional vCPUs)</label>
<label for="talk-recording">{{ t('Nextcloud Talk Recording-server (needs Nextcloud Talk being enabled and ~1GB additional RAM and ~2 additional vCPUs)') }}</label>
</p>
<p>
@@ -196,7 +196,7 @@
data-initial-state="false"
{% endif %}
>
<label for="docker-socket-proxy">Docker Socket Proxy (needed for <a target="_blank" href="https://github.com/cloud-py-api/app_api#nextcloud-appapi">Nextcloud App API</a>) ⚠️ The docker socket proxy container is deprecated. Please use the HaRP (High-availability Reverse Proxy for Nextcloud ExApps) instead!</label>
<label for="docker-socket-proxy">{{ t('Docker Socket Proxy (needed for') }} <a target="_blank" href="https://github.com/cloud-py-api/app_api#nextcloud-appapi">{{ t('Nextcloud App API') }}</a>) ⚠️ {{ t('The docker socket proxy container is deprecated. Please use the HaRP (High-availability Reverse Proxy for Nextcloud ExApps) instead!') }}</label>
</p>
{#
<p>
@@ -226,11 +226,11 @@
data-initial-state="false"
{% endif %}
>
<label for="whiteboard">Whiteboard</label>
<label for="whiteboard">{{ t('Whiteboard') }}</label>
</p>
<input class="options-form-submit" type="submit" value="Save changes" />
<input class="options-form-submit" type="submit" value="{{ t('Save changes') }}" />
</form>
<p><strong>Minimal system requirements:</strong> When any optional container is enabled, at least 2GB RAM, a dual-core CPU and 40GB system storage are required. When enabling ClamAV, Nextcloud Talk Recording-server or Fulltextsearch, at least 3GB RAM are required. For Talk Recording-server additional 2 vCPUs are required. When enabling everything, at least 5GB RAM and a quad-core CPU are required. Recommended are at least 1GB more RAM than the minimal requirement. For further advice and recommendations see <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/1335">this documentation</a></strong></p>
<p><strong>{{ t('Minimal system requirements:') }}</strong> {{ t('When any optional container is enabled, at least 2GB RAM, a dual-core CPU and 40GB system storage are required. When enabling ClamAV, Nextcloud Talk Recording-server or Fulltextsearch, at least 3GB RAM are required. For Talk Recording-server additional 2 vCPUs are required. When enabling everything, at least 5GB RAM and a quad-core CPU are required. Recommended are at least 1GB more RAM than the minimal requirement. For further advice and recommendations see') }} <strong><a target="_blank" href="https://github.com/nextcloud/all-in-one/discussions/1335">{{ t('this documentation') }}</a></strong></p>
{% if isAnyRunning == true %}
<script type="text/javascript" src="disable-clamav.js"></script>
<script type="text/javascript" src="disable-docker-socket-proxy.js"></script>
@@ -245,46 +245,46 @@
{% endif %}
{% if is_collabora_enabled == true and isAnyRunning == false and was_start_button_clicked == true %}
<h3>Nextcloud Office dictionaries</h3>
<h3>{{ t('Nextcloud Office dictionaries') }}</h3>
{% if collabora_dictionaries == "" %}
<p>In order to get the correct dictionaries in Nextcloud Office, you may configure the dictionaries below:</p>
<p>{{ t('In order to get the correct dictionaries in Nextcloud Office, you may configure the dictionaries below:') }}</p>
<form method="POST" action="api/configuration" class="xhr">
<input type="text" name="collabora_dictionaries" placeholder="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru" />
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Submit Nextcloud Office dictionaries" />
<input type="submit" value="{{ t('Submit Nextcloud Office dictionaries') }}" />
</form>
<p>You need to make sure that the dictionaries that you enter are valid. An example is <strong>de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</strong>.</p>
<p>{{ t('You need to make sure that the dictionaries that you enter are valid. An example is') }} <strong>de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</strong>.</p>
{% else %}
<p>The dictionaries for Nextcloud Office are currently set to <strong>{{ collabora_dictionaries }}</strong>. You can reset them again by clicking on the button below.</p>
<p>{{ t('The dictionaries for Nextcloud Office are currently set to') }} <strong>{{ collabora_dictionaries }}</strong>. {{ t('You can reset them again by clicking on the button below.') }}</p>
<form method="POST" action="api/configuration" class="xhr">
<input type="hidden" name="delete_collabora_dictionaries" value="yes"/>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Reset Nextcloud Office dictionaries" />
<input type="submit" value="{{ t('Reset Nextcloud Office dictionaries') }}" />
</form>
{% endif %}
<h3>Additional Nextcloud Office options</h3>
<h3>{{ t('Additional Nextcloud Office options') }}</h3>
{% if collabora_additional_options == "" %}
<p>You can configure additional options for Nextcloud Office below.</p>
<p>(This can be used for configuring the net.content_security_policy and more. Make sure to submit the value!)</p>
<p>{{ t('You can configure additional options for Nextcloud Office below.') }}</p>
<p>({{ t('This can be used for configuring the net.content_security_policy and more. Make sure to submit the value!') }})</p>
<form method="POST" action="api/configuration" class="xhr">
<input type="text" name="collabora_additional_options" />
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Submit additional Nextcloud Office options" />
<input type="submit" value="{{ t('Submit additional Nextcloud Office options') }}" />
</form>
<p>You need to make sure that the options that you enter are valid. An example is <strong>--o:net.content_security_policy=frame-ancestors *.example.com:*;</strong>.</p>
<p>{{ t('You need to make sure that the options that you enter are valid. An example is') }} <strong>--o:net.content_security_policy=frame-ancestors *.example.com:*;</strong>.</p>
{% else %}
<p>The additioinal options for Nextcloud Office are currently set to <strong>{{ collabora_additional_options }}</strong>. You can reset them again by clicking on the button below.</p>
<p>{{ t('The additional options for Nextcloud Office are currently set to') }} <strong>{{ collabora_additional_options }}</strong>. {{ t('You can reset them again by clicking on the button below.') }}</p>
<form method="POST" action="api/configuration" class="xhr">
<input type="hidden" name="delete_collabora_additional_options" value="yes"/>
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Reset additional Nextcloud Office options" />
<input type="submit" value="{{ t('Reset additional Nextcloud Office options') }}" />
</form>
{% endif %}
{% endif %}
{% endif %}