Skip to content

Commit c1019a5

Browse files
authored
Merge branch 'master' into i2h3/edit-locally
2 parents 7ba61dd + 8f3188c commit c1019a5

13 files changed

Lines changed: 1058 additions & 32 deletions

File tree

.github/workflows/deploy-docs.yml

Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -178,26 +178,75 @@ jobs:
178178
# Cleanup empty directories
179179
find . -type d -empty -delete
180180
181-
# Check for meaningful changes, ignoring:
182-
# - lastupdated date lines in HTML (Sphinx build-time timestamps)
183-
# - epub/pdf binaries (they regenerate automatically alongside HTML)
184-
meaningful_html=$(git diff HEAD -- '*.html' | grep -E '^[+-]' | grep -v '^[+-]{3}' | grep -ivE 'lastupdated|Last updated on' | wc -l)
185-
other_changes=$(git diff --name-only HEAD | grep -cvE '\.(html|epub|pdf)$' || true)
181+
# Strip noindex from stable docs BEFORE pruning. Sphinx always emits a
182+
# noindex robots meta, but the deployed stable pages have it stripped
183+
# (they are the canonical, indexed version). If we pruned first, every
184+
# rebuilt stable file would still carry that meta and so differ from
185+
# HEAD by a "real" line — defeating the prune and leaving timestamp-only
186+
# files in the PR. Stripping first makes noise-only stable pages match
187+
# HEAD, so the prune below can revert them.
188+
if [ -d server/stable ]; then
189+
find server/stable -name '*.html' -print0 | \
190+
xargs -0 perl -pi -e 's{<meta name="robots" content="noindex, follow" />\n?}{}g'
191+
fi
192+
193+
# ----------------------------------------------------------------
194+
# Prune build-only noise so the PR carries exclusively real content
195+
# changes. A rebuilt page differs every night even when its content
196+
# is identical, because of:
197+
# - Sphinx build-time timestamps (lastupdated / "Last updated on")
198+
# - mermaid diagram zoom ids (random UUID regenerated each build)
199+
# Files whose ENTIRE diff is noise are reverted to HEAD; files with a
200+
# real change are kept untouched (noise lines ride along, harmless).
201+
# ----------------------------------------------------------------
202+
NOISE='lastupdated|Last updated on|data-zoom-id'
203+
204+
# Read-only diffs must not take .git/index.lock: a `git diff` that
205+
# refreshes the index while a `git checkout` writes it races on the
206+
# lock. GIT_OPTIONAL_LOCKS=0 suppresses the refresh write; we also
207+
# materialise each file list fully before running any checkout, and
208+
# batch the reverts into a single checkout call.
209+
export GIT_OPTIONAL_LOCKS=0
210+
211+
# 1) Collect HTML files whose only changes are noise, then revert them.
212+
: > /tmp/revert-html.txt
213+
git diff --name-only HEAD -- '*.html' > /tmp/changed-html.txt
214+
while IFS= read -r f; do
215+
[ -n "$f" ] || continue
216+
real=$(git diff HEAD -- "$f" | grep -E '^[+-]' | grep -vE '^[+-]{3}' | grep -ivE "$NOISE" | wc -l)
217+
[ "$real" -eq 0 ] && printf '%s\n' "$f" >> /tmp/revert-html.txt
218+
done < /tmp/changed-html.txt
219+
if [ -s /tmp/revert-html.txt ]; then
220+
xargs -a /tmp/revert-html.txt -r git checkout HEAD --
221+
fi
222+
223+
# 2) PDF/ePub binaries regenerate every build with no content change.
224+
# Keep them only for a version folder that still has a real HTML
225+
# change after step 1; otherwise revert them too. Runs after the
226+
# HTML revert so the per-folder check sees the pruned tree.
227+
: > /tmp/revert-bin.txt
228+
git diff --name-only HEAD -- '*.pdf' '*.epub' > /tmp/changed-bin.txt
229+
while IFS= read -r f; do
230+
[ -n "$f" ] || continue
231+
case "$f" in
232+
server/*)
233+
vdir="server/$(printf '%s' "${f#server/}" | cut -d/ -f1)"
234+
remaining=$(git diff --name-only HEAD -- "$vdir" | grep -vE '\.(epub|pdf)$' | wc -l)
235+
[ "$remaining" -eq 0 ] && printf '%s\n' "$f" >> /tmp/revert-bin.txt
236+
;;
237+
*) printf '%s\n' "$f" >> /tmp/revert-bin.txt ;;
238+
esac
239+
done < /tmp/changed-bin.txt
240+
if [ -s /tmp/revert-bin.txt ]; then
241+
xargs -a /tmp/revert-bin.txt -r git checkout HEAD --
242+
fi
186243
187-
if [ "$meaningful_html" -gt 0 ] || [ "$other_changes" -gt 0 ]; then
244+
# Anything real left to deploy? (tracked diffs or brand-new files)
245+
if [ -n "$(git status --porcelain)" ]; then
188246
echo "has_changes=true" >> $GITHUB_OUTPUT
189247
else
190248
echo "has_changes=false" >> $GITHUB_OUTPUT
191-
echo "::notice::Skipping deploy PR: only lastupdated timestamps or epub/pdf binaries changed"
192-
fi
193-
194-
- name: Strip noindex from stable docs
195-
if: steps.apply.outputs.has_changes == 'true'
196-
run: |
197-
# Strip noindex from stable docs – these are the canonical pages we want indexed
198-
if [ -d server/stable ]; then
199-
find server/stable -name '*.html' -print0 | \
200-
xargs -0 perl -pi -e 's{<meta name="robots" content="noindex, follow" />\n?}{}g'
249+
echo "::notice::Skipping deploy PR: only build noise (timestamps, mermaid ids, binaries) changed"
201250
fi
202251
203252
- name: Write robots.txt

developer_manual/basics/translations.rst

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,26 @@ Especially translations strings that only contain a single word often result in
283283
The most famous example in the Nextcloud code base is ``Share`` which can which can be the verb and action ``To share something`` or the noun ``A share``.
284284
The added hints will be shown in the Transifex web-interface:
285285

286+
.. warning::
287+
288+
A ``// TRANSLATORS`` comment is only associated with the **first** translation string on the following line.
289+
If a single line of code contains two or more translation strings, the comment applies to the first one only,
290+
and the remaining strings will have no context hint. Refactor the code so that each line holds a single
291+
translation call, placing its own ``// TRANSLATORS`` comment on the line above.
292+
293+
.. code-block:: php
294+
295+
// BAD: only "Save" gets the context hint, "Cancel" has none
296+
// TRANSLATORS Confirm or discard the current changes
297+
return [$l->t('Save'), $l->t('Cancel')];
298+
299+
// GOOD: one translation per line, each with its own hint
300+
// TRANSLATORS Confirm the current changes
301+
$save = $l->t('Save');
302+
// TRANSLATORS Discard the current changes
303+
$cancel = $l->t('Cancel');
304+
return [$save, $cancel];
305+
286306
PHP
287307
"""
288308

developer_manual/client_apis/WebDAV/basic.rst

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -160,15 +160,15 @@ It is usual to declare prefixes for those namespace in the ``d:propfind`` elemen
160160
161161
Here is the list of available namespace:
162162
163-
========================================= ======
164-
URI Prefix
165-
========================================= ======
166-
DAV: d
167-
http://owncloud.org/ns oc
168-
http://nextcloud.org/ns nc
169-
http://open-collaboration-services.org/ns ocs
170-
http://open-cloud-mesh.org/ns ocm
171-
========================================= ======
163+
============================================= ======
164+
URI Prefix
165+
============================================= ======
166+
``DAV:`` ``d``
167+
``http://owncloud.org/ns`` ``oc``
168+
``http://nextcloud.org/ns`` ``nc``
169+
``http://open-collaboration-services.org/ns`` ``ocs``
170+
``http://open-cloud-mesh.org/ns`` ``ocm``
171+
============================================= ======
172172
173173
And here is how it should look in your DAV request:
174174
@@ -240,8 +240,17 @@ Supported properties
240240
+-------------------------------+-------------------------------------------------+--------------------------------------------------------------------------------------+
241241
| <oc:fileid /> | The unique id for the file within the instance. | ``7`` |
242242
+-------------------------------+-------------------------------------------------+--------------------------------------------------------------------------------------+
243-
| <oc:downloadURL /> | | A URL to directly download the file from a | |
244-
| | | storage. No storage implements that yet. | |
243+
| <oc:downloadURL /> | | A temporary URL to download the file directly | ``https://s3.example.com/bucket/key?X-Amz-Algorithm=...`` |
244+
| | | from the underlying storage backend (e.g. S3 | |
245+
| | | object storage with pre-signed URLs). May be | |
246+
| | | unavailable depending on permissions, server | |
247+
| | | configuration, feature interactions (e.g. | |
248+
| | | server-side encryption, sharing), or backend | |
249+
| | | support. | |
250+
+-------------------------------+-------------------------------------------------+--------------------------------------------------------------------------------------+
251+
| <nc:download-url-expiration />| | Expiration time of ``oc:downloadURL``, if one | ``1733749200`` |
252+
| | | has been generated. The value is a Unix | |
253+
| | | timestamp. | |
245254
+-------------------------------+-------------------------------------------------+--------------------------------------------------------------------------------------+
246255
| <oc:permissions /> | | The permissions that the user has over the | | ``S``: Shared |
247256
| | | file or folder. The value is a string | | ``R``: Shareable |
@@ -403,9 +412,6 @@ Supported properties
403412
| <nc:metadata_etag /> | | An etag covering the file's metadata. Changes | |
404413
| | | when metadata (not content), is updated. | |
405414
+-------------------------------+-------------------------------------------------+--------------------------------------------------------------------------------------+
406-
| <nc:download-url-expiration />| | Expiration date/time of a direct download | |
407-
| | | URL (if one has been generated). | |
408-
+-------------------------------+-------------------------------------------------+--------------------------------------------------------------------------------------+
409415
410416
.. note::
411417
Properties prefixed with ``nc:metadata-`` (e.g. ``nc:metadata-blurhash``) are dynamic, app-registered

developer_manual/digging_deeper/task_processing.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ The following built-in task types are available:
100100
* ``input``: ``Audio``
101101
* Output shape:
102102
* ``output``: ``Text``
103-
* ``'core:audio2text:subtitles'``: This task type is for transcribing audio to a subtitles file. It is implemented by ``\OCP\TaskProcessing\TaskTypes\AudioToTextSubtitles``
103+
* ``'core:audio2text:subtitles'``: This task type is for transcribing audio or video to a subtitles file. It is implemented by ``\OCP\TaskProcessing\TaskTypes\AudioToTextSubtitles``
104104
* Input shape:
105-
* ``input``: ``Audio``
105+
* ``input``: ``File``
106106
* Output shape:
107107
* ``output``: ``File``
108108
* ``'core:text2image'``: This task type is for generating images from text prompts. It is implemented by ``\OCP\TaskProcessing\TaskTypes\TextToImage``

user_manual/groupware/calendar.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,21 @@ Calendars may be shared with write access or read-only. When sharing a calendar
120120
Calendar delegation
121121
~~~~~~~~~~~~~~~~~~~
122122

123+
.. versionadded:: 34.0.0
124+
123125
In the app settings, you can delegate your calendars to other users so they can manage them for you.
124126
You can grant read access if they should only view the calendar, or write access if they should create,
125127
edit and delete events.
126128

127129
Calendar delegation also works with other clients that support calendar delegation.
128130

131+
By default, delegatees are not added as attendees of events that they create for a delegator, the delegator
132+
remains the organizer of the event. If the event has a Talk conversation attached, both the delegator and the
133+
delegatee are moderators of that conversation.
134+
135+
.. note:: Currently, delegating your account delegates all of your calendars. Delegating individual
136+
calendars is not yet supported.
137+
129138
Federated calendar sharing
130139
~~~~~~~~~~~~~~~~~~~~~~~~~~
131140

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
# SOME DESCRIPTIVE TITLE.
2+
# Copyright (C) 2016-2026 Nextcloud GmbH and Nextcloud contributors
3+
# This file is distributed under the same license as the Nextcloud latest User Manual package.
4+
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5+
#
6+
# Translators:
7+
# T P, 2026
8+
#
9+
#, fuzzy
10+
msgid ""
11+
msgstr ""
12+
"Project-Id-Version: Nextcloud latest User Manual latest\n"
13+
"Report-Msgid-Bugs-To: \n"
14+
"POT-Creation-Date: 2026-04-02 09:19+0000\n"
15+
"PO-Revision-Date: 2026-04-02 09:48+0000\n"
16+
"Last-Translator: T P, 2026\n"
17+
"Language-Team: French (https://app.transifex.com/nextcloud/teams/64236/fr/)\n"
18+
"MIME-Version: 1.0\n"
19+
"Content-Type: text/plain; charset=UTF-8\n"
20+
"Content-Transfer-Encoding: 8bit\n"
21+
"Language: fr\n"
22+
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
23+
24+
#: ../../talk/attachments.rst:3
25+
msgid "Attachments"
26+
msgstr "Pièces jointes"
27+
28+
#: ../../talk/attachments.rst:6
29+
msgid "Sharing files in a chat"
30+
msgstr "Partage de fichiers dans une discussion"
31+
32+
#: ../../talk/attachments.rst:8
33+
msgid "You can share files in a chat in three ways."
34+
msgstr ""
35+
"Le partage de fichiers dans une discussion peut se faire de trois manières."
36+
37+
#: ../../talk/attachments.rst:10
38+
msgid "First, you can simply drag'n'drop them on the chat."
39+
msgstr ""
40+
"La première consiste à faire un simple glisser-déplacer des fichiers dans la"
41+
" discussion."
42+
43+
#: ../../talk/attachments.rst:15
44+
msgid ""
45+
"Second, you can select a file from your Nextcloud Files or a file manager by"
46+
" choosing the little paperclip and selecting where you'd like to pick the "
47+
"file from."
48+
msgstr ""
49+
"La deuxième consiste à récupérer le fichier dans vos fichiers Nextcloud ou "
50+
"dans votre gestionnaire de fichiers. Pour cela, cliquez sur le petit "
51+
"trombone , puis sélectionnez l’emplacement du fichier à partager."
52+
53+
#: ../../talk/attachments.rst:23
54+
msgid ""
55+
"You can add more files until you are done and decide to share the files. You"
56+
" can also add a text caption to your shared files, providing a brief "
57+
"description or context."
58+
msgstr ""
59+
"Vous pouvez ensuite ajouter d’autres fichiers à partager. Vous pouvez "
60+
"également ajouter une légende sous forme de texte à chaque fichier que vous "
61+
"partagez, pour en fournir une petite description ou en expliquer le "
62+
"contexte."
63+
64+
#: ../../talk/attachments.rst:28
65+
msgid ""
66+
"All users will be able to click the files to view, edit or download them, "
67+
"irrespective of them having a user account. Users with an account will have "
68+
"the file automatically shared with them while external guest users will get "
69+
"them shared as a public link."
70+
msgstr ""
71+
"Tous les utilisateurs pourront cliquer sur les fichiers pour les consulter, "
72+
"les modifier ou les télécharger, peu importe qu’ils aient ou non un compte "
73+
"utilisateur. Les fichiers seront automatiquement partagés avec les "
74+
"utilisateurs disposant d’un compte et seront accessibles via un lien public "
75+
"pour les utilisateurs invités externes."
76+
77+
#: ../../talk/attachments.rst:34
78+
msgid "Polls in chat"
79+
msgstr "Sondages dans les discussions"
80+
81+
#: ../../talk/attachments.rst:36
82+
msgid ""
83+
"You can create a poll in groups chats from the new message additional "
84+
"actions."
85+
msgstr ""
86+
"Vous pouvez créer un sondage dans les discussions de groupe via les "
87+
"nouvelles actions supplémentaires sur les messages."
88+
89+
#: ../../talk/attachments.rst:41
90+
msgid "A poll has two settings:"
91+
msgstr "Chaque sondage comporte deux paramètres :"
92+
93+
#: ../../talk/attachments.rst:43
94+
msgid ""
95+
"**Anonymous polls**: Participants cannot see who voted for which option."
96+
msgstr ""
97+
"**Sondage anonyme** : les participants ne peuvent pas voir qui a voté pour "
98+
"quel choix."
99+
100+
#: ../../talk/attachments.rst:44
101+
msgid ""
102+
"**Allow multiple choices**: Participants can select more than one option."
103+
msgstr ""
104+
"**Réponses multiples** : les participants peuvent sélectionner plusieurs "
105+
"choix."
106+
107+
#: ../../talk/attachments.rst:46
108+
msgid ""
109+
"You can also import polls for auto-fill and export polls as JSON files to "
110+
"save them locally."
111+
msgstr ""
112+
"Vous pouvez également importer des sondages pour les remplir automatiquement"
113+
" et exporter les sondages sous forme de fichiers JSON et les enregistrer en "
114+
"local."
115+
116+
#: ../../talk/attachments.rst:51
117+
msgid "You can close a poll from the poll dialog."
118+
msgstr ""
119+
"Vous pouvez fermer un sondage à partir de la boîte de dialogue du sondage."
120+
121+
#: ../../talk/attachments.rst:56
122+
msgid ""
123+
"As a moderator, you can create the poll directly or you can save it as a "
124+
"draft to edit it later."
125+
msgstr ""
126+
"En tant que modérateur, vous pouvez directement créer le sondage ou bien "
127+
"l’enregistrer en brouillon pour le modifier plus tard."
128+
129+
#: ../../talk/attachments.rst:61
130+
msgid ""
131+
"You can find poll drafts in ``Shared items`` tab or next to the poll title "
132+
"input field."
133+
msgstr ""
134+
"Vous pouvez retrouver les brouillons de sondages dans l’onglet ``Éléments "
135+
"partagés`` ou à côté du champ de saisie du titre du sondage."

0 commit comments

Comments
 (0)