mirror of
https://github.com/zulip/zulip.git
synced 2025-10-24 08:33:43 +00:00
Compare commits
437 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4174047f64 | ||
|
|
adbee935f7 | ||
|
|
ebed224395 | ||
|
|
738429cf77 | ||
|
|
2f91471e98 | ||
|
|
8f9807176e | ||
|
|
217f5731fe | ||
|
|
ca0fd7f797 | ||
|
|
da4c4f74f2 | ||
|
|
b2068222e0 | ||
|
|
2dfc0463bd | ||
|
|
92c538c862 | ||
|
|
2e03e1b6ee | ||
|
|
0ac81a1b77 | ||
|
|
92e840efd1 | ||
|
|
f1a8c402d1 | ||
|
|
8878fee6d6 | ||
|
|
783f3fac3b | ||
|
|
5f397e5fa8 | ||
|
|
8ff2684d61 | ||
|
|
016f53711d | ||
|
|
e921c7dafe | ||
|
|
9b950f9c6a | ||
|
|
aab515feb9 | ||
|
|
b178bb7c59 | ||
|
|
8a783c448f | ||
|
|
f4f8d091a9 | ||
|
|
67157ec2b8 | ||
|
|
4bf4c8a040 | ||
|
|
08a844153c | ||
|
|
69e04c20f9 | ||
|
|
ec8d341cae | ||
|
|
3ee59df091 | ||
|
|
dd940d2eac | ||
|
|
e3f0c28528 | ||
|
|
b44ee89245 | ||
|
|
ee2654c4ee | ||
|
|
c12f8de80b | ||
|
|
94437ab5be | ||
|
|
a9a30ad5b4 | ||
|
|
e9f0ef4c15 | ||
|
|
2e16e27265 | ||
|
|
f5e2a2a38f | ||
|
|
5a177bff3a | ||
|
|
fabb5ffe94 | ||
|
|
5b4a673bbd | ||
|
|
afeb73e12a | ||
|
|
d5a39a6564 | ||
|
|
a4b5ee41ea | ||
|
|
884a8d5628 | ||
|
|
8c9e521f57 | ||
|
|
2f04875ad3 | ||
|
|
9dcf1944ad | ||
|
|
6b895d1622 | ||
|
|
1a65e8a538 | ||
|
|
3240a513f1 | ||
|
|
b00ce1bad1 | ||
|
|
383bffb88b | ||
|
|
073ba23fae | ||
|
|
abfaba0a42 | ||
|
|
9a6529f86a | ||
|
|
adb30c4d18 | ||
|
|
8212dccc91 | ||
|
|
679591ccce | ||
|
|
5b07bf767b | ||
|
|
bca7683f58 | ||
|
|
b0b3230917 | ||
|
|
634a771a37 | ||
|
|
3c60e538f9 | ||
|
|
1c84f02f57 | ||
|
|
ddd174af36 | ||
|
|
660ccccf68 | ||
|
|
38c8c374d5 | ||
|
|
d058188fa8 | ||
|
|
9ca4574fae | ||
|
|
a47d204ca0 | ||
|
|
173e5389af | ||
|
|
086db7621c | ||
|
|
839af9ed8d | ||
|
|
7706d64530 | ||
|
|
0f4bccd107 | ||
|
|
43b83588c9 | ||
|
|
e2ac125a6d | ||
|
|
d720ce4b4e | ||
|
|
892c5f48f7 | ||
|
|
f45a6a6d99 | ||
|
|
54590e67f2 | ||
|
|
2d6e6369f3 | ||
|
|
dcb163bbe3 | ||
|
|
56463ce921 | ||
|
|
0b19d5cd5e | ||
|
|
30b7da34e0 | ||
|
|
dc158b18f2 | ||
|
|
e3e2691124 | ||
|
|
1af16642d9 | ||
|
|
3ca131743b | ||
|
|
5f7727888c | ||
|
|
00accdc86b | ||
|
|
5e7d61464d | ||
|
|
a143d6b62c | ||
|
|
200d43d4cd | ||
|
|
7f4f905ec8 | ||
|
|
457ff73082 | ||
|
|
6ca8e853df | ||
|
|
7a5d3e164e | ||
|
|
e26f9180c1 | ||
|
|
4bfbec48dd | ||
|
|
a164173acf | ||
|
|
10d679d41d | ||
|
|
caf6506811 | ||
|
|
dce4a3c98e | ||
|
|
ecc1433d02 | ||
|
|
f3aeabaeec | ||
|
|
51a7c94b9c | ||
|
|
230b3f075b | ||
|
|
4724d45abd | ||
|
|
3ca20e3ea8 | ||
|
|
ea9992d853 | ||
|
|
db26f2b2fc | ||
|
|
9c2ffaf1b3 | ||
|
|
a1ba41ce66 | ||
|
|
1f8b3fd09a | ||
|
|
c97deb6be2 | ||
|
|
db7a7d589c | ||
|
|
f46f557109 | ||
|
|
e54f920549 | ||
|
|
8654f839b5 | ||
|
|
0457f6807c | ||
|
|
d03e72bc0e | ||
|
|
46a4964633 | ||
|
|
2c8a5ac751 | ||
|
|
299d13646e | ||
|
|
122bd3fcc1 | ||
|
|
d89933b885 | ||
|
|
052e6655b5 | ||
|
|
067ce35fb1 | ||
|
|
6a5cfd2c05 | ||
|
|
66501a8eae | ||
|
|
9797de52a0 | ||
|
|
0c09a4fffe | ||
|
|
957382253a | ||
|
|
154af5bb6b | ||
|
|
7af5ceb1c5 | ||
|
|
61f7ede43c | ||
|
|
2f196bff19 | ||
|
|
0d1b7f0d6e | ||
|
|
bb735460e5 | ||
|
|
389e45625a | ||
|
|
8c7e18fd75 | ||
|
|
ee58910f1a | ||
|
|
7a4565e833 | ||
|
|
526fd7f24b | ||
|
|
58a64b33c9 | ||
|
|
87e9482672 | ||
|
|
6b77499286 | ||
|
|
a55c1ab2da | ||
|
|
03a0a7abc6 | ||
|
|
c95773118e | ||
|
|
f9649d1f45 | ||
|
|
199567228a | ||
|
|
38dd1de5b2 | ||
|
|
48e99657ad | ||
|
|
932bbac04c | ||
|
|
060c95dda6 | ||
|
|
42e0d72b67 | ||
|
|
4df04f1032 | ||
|
|
13d92acdb3 | ||
|
|
fc0f73c1db | ||
|
|
1456691d56 | ||
|
|
afc016c0f0 | ||
|
|
f079dec525 | ||
|
|
2c606ed99e | ||
|
|
e41c235657 | ||
|
|
856329bb45 | ||
|
|
07a6a85cf8 | ||
|
|
0e1b0939f5 | ||
|
|
dc81858829 | ||
|
|
54fae321aa | ||
|
|
95f8b3a618 | ||
|
|
77f2562cbb | ||
|
|
26c63abe18 | ||
|
|
dc04b0e171 | ||
|
|
a78dc4a2bd | ||
|
|
cae02dbca4 | ||
|
|
3e2d5b3c86 | ||
|
|
807b9ae081 | ||
|
|
084331010c | ||
|
|
9ee584f206 | ||
|
|
7551d96e1c | ||
|
|
84fb9ab817 | ||
|
|
30782f7aa4 | ||
|
|
04656bf16f | ||
|
|
ee7b6f476d | ||
|
|
fe1b7a9bb3 | ||
|
|
735618b9db | ||
|
|
3fd621b608 | ||
|
|
3443e1d479 | ||
|
|
bb78c21fda | ||
|
|
5ff853fa71 | ||
|
|
72b16e2fe7 | ||
|
|
761ae28551 | ||
|
|
827dd22fe1 | ||
|
|
c7c9322651 | ||
|
|
72e628ffdf | ||
|
|
d221cb92c6 | ||
|
|
920a5eac1a | ||
|
|
094c3da965 | ||
|
|
1beebb9fa1 | ||
|
|
7c68a30363 | ||
|
|
263ee4cb86 | ||
|
|
a3d6c47b7d | ||
|
|
47c107faa5 | ||
|
|
b3196e5310 | ||
|
|
557d80965c | ||
|
|
c486588360 | ||
|
|
fea0ae1a2b | ||
|
|
45e3626bd2 | ||
|
|
c9fb55dd20 | ||
|
|
22cd8a28d2 | ||
|
|
dcbcb05655 | ||
|
|
04f5358a76 | ||
|
|
8fb0fe96c6 | ||
|
|
5dd4dcdebb | ||
|
|
3f55c10685 | ||
|
|
e8f3b87b17 | ||
|
|
0bb0220ebb | ||
|
|
dda4603f94 | ||
|
|
01498add9b | ||
|
|
903090c582 | ||
|
|
8a128ba81e | ||
|
|
9427fb7230 | ||
|
|
eba83b9d87 | ||
|
|
8ec9abe00d | ||
|
|
e4ae8b79c3 | ||
|
|
0e9c34a975 | ||
|
|
295b37bceb | ||
|
|
c8ad693e41 | ||
|
|
96eaadda71 | ||
|
|
a62a863f67 | ||
|
|
599ad856b2 | ||
|
|
f7b27e6fea | ||
|
|
8719594c51 | ||
|
|
d8c8de5f27 | ||
|
|
3f57672e15 | ||
|
|
385d30b285 | ||
|
|
33df97a3d9 | ||
|
|
7627f346a3 | ||
|
|
5d484a8794 | ||
|
|
8ca8745c0e | ||
|
|
286f47468d | ||
|
|
b08ba862e6 | ||
|
|
dc6099d656 | ||
|
|
df8a434424 | ||
|
|
0935d388f0 | ||
|
|
2baa4fc0ca | ||
|
|
c4cc27cd20 | ||
|
|
0c8fef2fc8 | ||
|
|
ab94bcb21b | ||
|
|
36c5df7663 | ||
|
|
ffbd0cb316 | ||
|
|
a5ac19e93a | ||
|
|
6f009c5e65 | ||
|
|
6d6a335e32 | ||
|
|
fd02648b0e | ||
|
|
9f99235368 | ||
|
|
eeea5c1713 | ||
|
|
67ff421194 | ||
|
|
c415944e55 | ||
|
|
888d6d8037 | ||
|
|
f04ae8acd3 | ||
|
|
7346ce98f3 | ||
|
|
d9716bc189 | ||
|
|
8c6f9b3f95 | ||
|
|
68722e7d3c | ||
|
|
68c37c9d7b | ||
|
|
9ca00a1eff | ||
|
|
4be5ce97cb | ||
|
|
d7528f6bbe | ||
|
|
1171862bfd | ||
|
|
ca21eb7141 | ||
|
|
bbd5431e18 | ||
|
|
e6b1384a05 | ||
|
|
7ac891a6b9 | ||
|
|
12db83b011 | ||
|
|
c2f6167c01 | ||
|
|
9aa9f9b3c8 | ||
|
|
ef3289b73b | ||
|
|
9c09edd7af | ||
|
|
3cb6c9aea9 | ||
|
|
03a2c2da6a | ||
|
|
4c4caa7be4 | ||
|
|
a23b077b79 | ||
|
|
3ed2a30e01 | ||
|
|
28c5c64b8d | ||
|
|
6e3e8c9ede | ||
|
|
b55adbef3d | ||
|
|
c978bfaa32 | ||
|
|
27bc36b7d6 | ||
|
|
145d6915c1 | ||
|
|
a4db19f9aa | ||
|
|
18578cc5da | ||
|
|
b312a86ada | ||
|
|
19eb98a74a | ||
|
|
650cdc474d | ||
|
|
0407abc788 | ||
|
|
44ae67d426 | ||
|
|
3acd7b8f47 | ||
|
|
a95b796a91 | ||
|
|
7fc474c7a6 | ||
|
|
55127b6178 | ||
|
|
5802f7775f | ||
|
|
1184bdc934 | ||
|
|
12310189ed | ||
|
|
16dedb08fd | ||
|
|
4b19863065 | ||
|
|
480a2e2d64 | ||
|
|
83c0ed2a9d | ||
|
|
a2db6df826 | ||
|
|
0216eb8915 | ||
|
|
2f96b1756e | ||
|
|
656a31d38d | ||
|
|
3023091caa | ||
|
|
67e1889817 | ||
|
|
a2a50e1408 | ||
|
|
1ad0ad8ece | ||
|
|
a3f46957bc | ||
|
|
271df2c98e | ||
|
|
ac3acc941f | ||
|
|
6fb16f3598 | ||
|
|
b1c801847b | ||
|
|
a208da9c4d | ||
|
|
8f4de3afc0 | ||
|
|
24c3e25f86 | ||
|
|
724de9cd49 | ||
|
|
34394cec9a | ||
|
|
3160c3cce0 | ||
|
|
7811e99548 | ||
|
|
4a43856ba7 | ||
|
|
5eeb616666 | ||
|
|
362177b788 | ||
|
|
9f231322c9 | ||
|
|
5329fed387 | ||
|
|
8d8b5935ac | ||
|
|
007a51f277 | ||
|
|
7f01b3fb63 | ||
|
|
f58e3d2cf6 | ||
|
|
8ca060531f | ||
|
|
ff3233fdf1 | ||
|
|
859903648b | ||
|
|
2b7877bcb4 | ||
|
|
632e856240 | ||
|
|
386d87635e | ||
|
|
e6c7363613 | ||
|
|
29880a4a1e | ||
|
|
c84681c69c | ||
|
|
2a98968846 | ||
|
|
3f4deedba1 | ||
|
|
9f5b7ba9b0 | ||
|
|
c96de330b0 | ||
|
|
8d06fa7e38 | ||
|
|
8962565154 | ||
|
|
239458a173 | ||
|
|
63d51e8114 | ||
|
|
09ab1be34f | ||
|
|
c43ea96c06 | ||
|
|
4fcb243769 | ||
|
|
17bdf22521 | ||
|
|
17ec4f1e06 | ||
|
|
cb00fbc42f | ||
|
|
ee88bb5187 | ||
|
|
231888b5a5 | ||
|
|
3876171df1 | ||
|
|
ffaccb8af2 | ||
|
|
62553f8303 | ||
|
|
eec7dedc17 | ||
|
|
be14ec2cab | ||
|
|
505eec4bac | ||
|
|
ca2ca030d2 | ||
|
|
74e6367455 | ||
|
|
584b11af2d | ||
|
|
d556b73084 | ||
|
|
b852da6eed | ||
|
|
ceec61ba10 | ||
|
|
a4c7be68cc | ||
|
|
067a7a3a0f | ||
|
|
cb69413301 | ||
|
|
fa112adcb7 | ||
|
|
e64e5f2413 | ||
|
|
f2e627ba51 | ||
|
|
35c23d0269 | ||
|
|
0117d751c2 | ||
|
|
6cb570f3f0 | ||
|
|
e0c05825ed | ||
|
|
ae02a93d35 | ||
|
|
c375d36c9e | ||
|
|
1bffdda59f | ||
|
|
06cbe95583 | ||
|
|
c2145a8993 | ||
|
|
4dd32a4d85 | ||
|
|
fad5c88aa9 | ||
|
|
cab3a992c0 | ||
|
|
9e1b4dafc0 | ||
|
|
fc22b86eb6 | ||
|
|
105acc8495 | ||
|
|
eda1ee555b | ||
|
|
2a6146110c | ||
|
|
a47569bf47 | ||
|
|
16aa7c0923 | ||
|
|
cf8ae46291 | ||
|
|
614ab533dc | ||
|
|
f26ac80ea1 | ||
|
|
2d3d3f6072 | ||
|
|
daf6fb17bf | ||
|
|
f66dde4a33 | ||
|
|
254ea4b0c8 | ||
|
|
af9d1a7dfb | ||
|
|
90cc2716f0 | ||
|
|
c7c67c01ce | ||
|
|
cc648a2c19 | ||
|
|
b20aeadcb8 | ||
|
|
6a3f97ba80 | ||
|
|
9912b4c815 | ||
|
|
683ed6322d | ||
|
|
a2ed0302ce | ||
|
|
0da62e7cda | ||
|
|
b8f53ab6e8 | ||
|
|
2b2ee686f3 | ||
|
|
f1db7c1d72 | ||
|
|
e8498fd857 | ||
|
|
a5ff3d7e59 | ||
|
|
dd73f7272d | ||
|
|
0738dfd126 | ||
|
|
81dfaa0602 | ||
|
|
461d935463 | ||
|
|
3e6a212ace | ||
|
|
ea28083ba4 | ||
|
|
54f90e41c0 |
@@ -51,7 +51,7 @@
|
||||
"import/first": "error",
|
||||
"import/newline-after-import": "error",
|
||||
"import/no-self-import": "error",
|
||||
"import/no-unresolved": ["error", {"ignore": ["^date-fns-tz$|^js-cookie$|^katex$"]}],
|
||||
"import/no-unresolved": "off",
|
||||
"import/no-useless-path-segments": "error",
|
||||
"import/order": ["error", {"alphabetize": {"order": "asc"}, "newlines-between": "always"}],
|
||||
"import/unambiguous": "error",
|
||||
@@ -266,7 +266,8 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
"unicorn/prefer-string-replace-all": "off"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
10
.github/ISSUE_TEMPLATE/1_discussed_on_czo.md
vendored
Normal file
10
.github/ISSUE_TEMPLATE/1_discussed_on_czo.md
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
name: Issue discussed in the Zulip development community
|
||||
about: Bug report, feature or improvement already discussed on chat.zulip.org.
|
||||
---
|
||||
|
||||
<!-- Issue description -->
|
||||
|
||||
<!-- Link to a message in the chat.zulip.org discussion. Message links will still work even if the topic is renamed or resolved. Link back to this issue from the chat.zulip.org thread. -->
|
||||
|
||||
CZO thread
|
||||
17
.github/ISSUE_TEMPLATE/2_bug_report.md
vendored
Normal file
17
.github/ISSUE_TEMPLATE/2_bug_report.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: A concrete bug report with steps to reproduce the behavior. (See also "Possible bug" below.)
|
||||
labels: ["bug"]
|
||||
---
|
||||
|
||||
<!-- Describe what you were expecting to see, what you saw instead, and steps to take in order to reproduce the buggy behavior. Screenshots can be helpful. -->
|
||||
|
||||
<!-- Check the box for the version of Zulip you are using (see https://zulip.com/help/view-zulip-version).-->
|
||||
|
||||
**Zulip Server and web app version:**
|
||||
|
||||
- [ ] Zulip Cloud (`*.zulipchat.com`)
|
||||
- [ ] Zulip Server 7.0+
|
||||
- [ ] Zulip Server 6.0+
|
||||
- [ ] Zulip Server 5.0 or older
|
||||
- [ ] Other or not sure
|
||||
6
.github/ISSUE_TEMPLATE/3_feature_request.md
vendored
Normal file
6
.github/ISSUE_TEMPLATE/3_feature_request.md
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
name: Feature or improvement request
|
||||
about: A specific proposal for a new feature of improvement. (See also "Feature suggestion or feedback" below.)
|
||||
---
|
||||
|
||||
<!-- Describe the proposal, including how it would help you or your organization. -->
|
||||
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
blank_issues_enabled: true
|
||||
contact_links:
|
||||
- name: Possible bug
|
||||
url: https://zulip.readthedocs.io/en/latest/contributing/reporting-bugs.html
|
||||
about: Report unexpected behavior that may be a bug.
|
||||
- name: Feature suggestion or feedback
|
||||
url: https://zulip.readthedocs.io/en/latest/contributing/suggesting-features.html
|
||||
about: Start a discussion about your idea for improving Zulip.
|
||||
- name: Issue with running or upgrading a Zulip server
|
||||
url: https://zulip.readthedocs.io/en/latest/production/troubleshooting.html
|
||||
about: We provide free, interactive support for the vast majority of questions about running a Zulip server.
|
||||
- name: Other support requests and sales questions
|
||||
url: https://zulip.com/help/contact-support
|
||||
about: Contact us — we're happy to help!
|
||||
5
.github/workflows/production-suite.yml
vendored
5
.github/workflows/production-suite.yml
vendored
@@ -144,6 +144,11 @@ jobs:
|
||||
os: bullseye
|
||||
extra-args: --test-custom-db
|
||||
|
||||
- docker_image: zulip/ci:bookworm
|
||||
name: Debian 12 production install
|
||||
os: bookworm
|
||||
extra-args: ""
|
||||
|
||||
name: ${{ matrix.name }}
|
||||
container:
|
||||
image: ${{ matrix.docker_image }}
|
||||
|
||||
12
.github/workflows/zulip-ci.yml
vendored
12
.github/workflows/zulip-ci.yml
vendored
@@ -27,8 +27,6 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include_documentation_tests: [false]
|
||||
include_frontend_tests: [false]
|
||||
include:
|
||||
# Base images are built using `tools/ci/Dockerfile.prod.template`.
|
||||
# The comments at the top explain how to build and upload these images.
|
||||
@@ -36,16 +34,26 @@ jobs:
|
||||
- docker_image: zulip/ci:focal
|
||||
name: Ubuntu 20.04 (Python 3.8, backend + frontend)
|
||||
os: focal
|
||||
include_documentation_tests: false
|
||||
include_frontend_tests: true
|
||||
# Debian 11 ships with Python 3.9.2.
|
||||
- docker_image: zulip/ci:bullseye
|
||||
name: Debian 11 (Python 3.9, backend + documentation)
|
||||
os: bullseye
|
||||
include_documentation_tests: true
|
||||
include_frontend_tests: false
|
||||
# Ubuntu 22.04 ships with Python 3.10.4.
|
||||
- docker_image: zulip/ci:jammy
|
||||
name: Ubuntu 22.04 (Python 3.10, backend)
|
||||
os: jammy
|
||||
include_documentation_tests: false
|
||||
include_frontend_tests: false
|
||||
# Debian 12 ships with Python 3.11.2.
|
||||
- docker_image: zulip/ci:bookworm
|
||||
name: Debian 12 (Python 3.11, backend)
|
||||
os: bookworm
|
||||
include_documentation_tests: false
|
||||
include_frontend_tests: false
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
name: ${{ matrix.name }}
|
||||
|
||||
7
.mailmap
7
.mailmap
@@ -17,6 +17,7 @@ acrefoot <acrefoot@zulip.com> <acrefoot@dropbox.com>
|
||||
acrefoot <acrefoot@zulip.com> <acrefoot@alum.mit.edu>
|
||||
Adam Benesh <Adam.Benesh@gmail.com> <Adam-Daniel.Benesh@t-systems.com>
|
||||
Adam Benesh <Adam.Benesh@gmail.com>
|
||||
Adarsh Tiwari <xoldyckk@gmail.com>
|
||||
Alex Vandiver <alexmv@zulip.com> <alex@chmrr.net>
|
||||
Alex Vandiver <alexmv@zulip.com> <github@chmrr.net>
|
||||
Allen Rabinovich <allenrabinovich@yahoo.com> <allenr@humbughq.com>
|
||||
@@ -32,6 +33,7 @@ aparna-bhatt <aparnabhatt2001@gmail.com> <86338542+aparna-bhatt@users.noreply.gi
|
||||
Ashwat Kumar Singh <ashwat.kumarsingh.met20@itbhu.ac.in>
|
||||
Austin Riba <austin@zulip.com> <austin@m51.io>
|
||||
BIKI DAS <bikid475@gmail.com>
|
||||
Brijmohan Siyag <brijsiyag@gmail.com>
|
||||
Brock Whittaker <brock@zulipchat.com> <bjwhitta@asu.edu>
|
||||
Brock Whittaker <brock@zulipchat.com> <brockwhittaker@Brocks-MacBook.local>
|
||||
Brock Whittaker <brock@zulipchat.com> <brock@zulipchat.org>
|
||||
@@ -42,6 +44,8 @@ Dinesh <chdinesh1089@gmail.com>
|
||||
Dinesh <chdinesh1089@gmail.com> <chdinesh1089>
|
||||
Eeshan Garg <eeshan@zulip.com> <jerryguitarist@gmail.com>
|
||||
Eric Smith <erwsmith@gmail.com> <99841919+erwsmith@users.noreply.github.com>
|
||||
Evy Kassirer <evy.kassirer@gmail.com>
|
||||
Evy Kassirer <evy.kassirer@gmail.com> <evykassirer@users.noreply.github.com>
|
||||
Ganesh Pawar <pawarg256@gmail.com> <58626718+ganpa3@users.noreply.github.com>
|
||||
Greg Price <greg@zulip.com> <gnprice@gmail.com>
|
||||
Greg Price <greg@zulip.com> <greg@zulipchat.com>
|
||||
@@ -59,6 +63,7 @@ Karl Stolley <karl@zulip.com> <karl@stolley.dev>
|
||||
Kevin Mehall <km@kevinmehall.net> <kevin@humbughq.com>
|
||||
Kevin Mehall <km@kevinmehall.net> <kevin@zulip.com>
|
||||
Kevin Scott <kevin.scott.98@gmail.com>
|
||||
Lalit Kumar Singh <lalitkumarsingh3716@gmail.com>
|
||||
Lauryn Menard <lauryn@zulip.com> <lauryn.menard@gmail.com>
|
||||
Lauryn Menard <lauryn@zulip.com> <63245456+laurynmm@users.noreply.github.com>
|
||||
Mateusz Mandera <mateusz.mandera@zulip.com> <mateusz.mandera@protonmail.com>
|
||||
@@ -67,6 +72,7 @@ Matt Keller <matt@zulip.com> <m@cognusion.com>
|
||||
m-e-l-u-h-a-n <purushottam.tiwari.cd.cse19@itbhu.ac.in>
|
||||
m-e-l-u-h-a-n <purushottam.tiwari.cd.cse19@itbhu.ac.in> <pururshottam.tiwari.cd.cse19@itbhu.ac.in>
|
||||
Noble Mittal <noblemittal@outlook.com> <62551163+beingnoble03@users.noreply.github.com>
|
||||
nzai <nzaih18@gmail.com> <70953556+nzaih1999@users.noreply.github.com>
|
||||
Palash Baderia <palash.baderia@outlook.com>
|
||||
Palash Baderia <palash.baderia@outlook.com> <66828942+palashb01@users.noreply.github.com>
|
||||
Palash Raghuwanshi <singhpalash0@gmail.com>
|
||||
@@ -96,6 +102,7 @@ Steve Howell <showell@zulip.com> <showell@zulipchat.com>
|
||||
Steve Howell <showell@zulip.com> <steve@humbughq.com>
|
||||
Steve Howell <showell@zulip.com> <steve@zulip.com>
|
||||
strifel <info@strifel.de>
|
||||
Tim Abbott <tabbott@zulip.com>
|
||||
Tim Abbott <tabbott@zulip.com> <tabbott@dropbox.com>
|
||||
Tim Abbott <tabbott@zulip.com> <tabbott@humbughq.com>
|
||||
Tim Abbott <tabbott@zulip.com> <tabbott@mit.edu>
|
||||
|
||||
130
CONTRIBUTING.md
130
CONTRIBUTING.md
@@ -55,8 +55,10 @@ needs doing:
|
||||
**Non-code contributions**: Some of the most valuable ways to contribute
|
||||
don't require touching the codebase at all. For example, you can:
|
||||
|
||||
- [Report issues](#reporting-issues), including both feature requests and
|
||||
bug reports.
|
||||
- Report issues, including both [feature
|
||||
requests](https://zulip.readthedocs.io/en/latest/contributing/suggesting-features.html)
|
||||
and [bug
|
||||
reports](https://zulip.readthedocs.io/en/latest/contributing/reporting-bugs.html).
|
||||
- [Give feedback](#user-feedback) if you are evaluating or using Zulip.
|
||||
- [Participate
|
||||
thoughtfully](https://zulip.readthedocs.io/en/latest/contributing/design-discussions.html)
|
||||
@@ -208,101 +210,16 @@ stream](https://chat.zulip.org/#narrow/stream/101-design) in the [Zulip
|
||||
development community](https://zulip.com/development-community/)
|
||||
|
||||
For more advice, see [What makes a great Zulip
|
||||
contributor?](#what-makes-a-great-zulip-contributor)
|
||||
below.
|
||||
contributor?](#what-makes-a-great-zulip-contributor) below. It's OK if your
|
||||
first issue takes you a while; that's normal! You'll be able to work a lot
|
||||
faster as you build experience.
|
||||
|
||||
### Submitting a pull request
|
||||
|
||||
When you believe your code is ready, follow the [guide on how to review
|
||||
code](https://zulip.readthedocs.io/en/latest/contributing/code-reviewing.html#how-to-review-code)
|
||||
to review your own work. You can often find things you missed by taking a step
|
||||
back to look over your work before asking others to do so. Catching mistakes
|
||||
yourself will help your PRs be merged faster, and folks will appreciate the
|
||||
quality and professionalism of your work.
|
||||
|
||||
Then, submit your changes. Carefully reading our [Git guide][git-guide], and in
|
||||
particular the section on [making a pull request][git-guide-make-pr], will help
|
||||
avoid many common mistakes. If any part of your contribution is from someone
|
||||
else (code snippets, images, sounds, or any other copyrightable work, modified
|
||||
or unmodified), be sure to review the instructions on how to [properly
|
||||
attribute][licensing] the work.
|
||||
|
||||
[licensing]: https://zulip.readthedocs.io/en/latest/contributing/licensing.html#contributing-someone-else-s-work
|
||||
|
||||
Once you are satisfied with the quality of your PR, follow the
|
||||
[guidelines on asking for a code
|
||||
review](https://zulip.readthedocs.io/en/latest/contributing/code-reviewing.html#asking-for-a-code-review)
|
||||
to request a review. If you are not sure what's best, simply post a
|
||||
comment on the main GitHub thread for your PR clearly indicating that
|
||||
it is ready for review, and the project maintainers will take a look
|
||||
and follow up with next steps.
|
||||
|
||||
It's OK if your first issue takes you a while; that's normal! You'll be
|
||||
able to work a lot faster as you build experience.
|
||||
|
||||
If it helps your workflow, you can submit your pull request marked as
|
||||
a [draft][github-help-draft-pr] while you're still working on it, and
|
||||
then mark it ready when you think it's time for someone else to review
|
||||
your work.
|
||||
|
||||
[git-guide]: https://zulip.readthedocs.io/en/latest/git/
|
||||
[git-guide-make-pr]: https://zulip.readthedocs.io/en/latest/git/pull-requests.html
|
||||
[github-help-draft-pr]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests
|
||||
|
||||
### Stages of a pull request
|
||||
|
||||
Your pull request will likely go through several stages of review.
|
||||
|
||||
1. If your PR makes user-facing changes, the UI and user experience may be
|
||||
reviewed early on, without reference to the code. You will get feedback on
|
||||
any user-facing bugs in the implementation. To minimize the number of review
|
||||
round-trips, make sure to [thoroughly
|
||||
test](https://zulip.readthedocs.io/en/latest/contributing/code-reviewing.html#manual-testing)
|
||||
your own PR prior to asking for review.
|
||||
2. There may be choices made in the implementation that the reviewer
|
||||
will ask you to revisit. This process will go more smoothly if you
|
||||
specifically call attention to the decisions you made while
|
||||
drafting the PR and any points about which you are uncertain. The
|
||||
PR description and comments on your own PR are good ways to do this.
|
||||
3. Oftentimes, seeing an initial implementation will make it clear that the
|
||||
product design for a feature needs to be revised, or that additional changes
|
||||
are needed. The reviewer may therefore ask you to amend or change the
|
||||
implementation. Some changes may be blockers for getting the PR merged, while
|
||||
others may be improvements that can happen afterwards. Feel free to ask if
|
||||
it's unclear which type of feedback you're getting. (Follow-ups can be a
|
||||
great next issue to work on!)
|
||||
4. In addition to any UI/user experience review, all PRs will go through one or
|
||||
more rounds of code review. Your code may initially be [reviewed by other
|
||||
contributors](https://zulip.readthedocs.io/en/latest/contributing/code-reviewing.html).
|
||||
This helps us make good use of project maintainers' time, and helps you make
|
||||
progress on the PR by getting more frequent feedback. A project maintainer
|
||||
may leave a comment asking someone with expertise in the area you're working
|
||||
on to review your work.
|
||||
5. Final code review and integration for server and web app PRs is generally done
|
||||
by `@timabbott`.
|
||||
|
||||
#### How to help move the review process forward
|
||||
|
||||
The key to keeping your review moving through the review process is to:
|
||||
|
||||
- Address _all_ the feedback to the best of your ability.
|
||||
- Make it clear when the requested changes have been made
|
||||
and you believe it's time for another look.
|
||||
- Make it as easy as possible to review the changes you made.
|
||||
|
||||
In order to do this, when you believe you have addressed the previous round of
|
||||
feedback on your PR as best you can, post a comment asking reviewers to take
|
||||
another look. Your comment should make it easy to understand what has been done
|
||||
and what remains by:
|
||||
|
||||
- Summarizing the changes made since the last review you received.
|
||||
- Highlighting remaining questions or decisions, with links to any relevant
|
||||
chat.zulip.org threads.
|
||||
- Providing updated screenshots and information on manual testing if
|
||||
appropriate.
|
||||
|
||||
The easier it is to review your work, the more likely you are to receive quick
|
||||
feedback.
|
||||
See the [pull request review
|
||||
process](https://zulip.readthedocs.io/en/latest/contributing/review-process.html)
|
||||
guide for detailed instructions on how to submit a pull request, and information
|
||||
on the stages of review your PR will go through.
|
||||
|
||||
### Beyond the first issue
|
||||
|
||||
@@ -349,7 +266,7 @@ labels.
|
||||
on [Git commit
|
||||
discipline](https://zulip.readthedocs.io/en/latest/contributing/commit-discipline.html).
|
||||
2. If all the feedback has been addressed, did you [leave a
|
||||
comment](#how-to-help-move-the-review-process-forward)
|
||||
comment](https://zulip.readthedocs.io/en/latest/contributing/review-process.html#how-to-help-move-the-review-process-forward)
|
||||
explaining that you have done so and **requesting another review**? If not,
|
||||
it may not be clear to project maintainers or reviewers that your PR is
|
||||
ready for another look.
|
||||
@@ -399,29 +316,6 @@ experience, these are the best predictors of success:
|
||||
|
||||
[great-questions]: https://zulip.readthedocs.io/en/latest/contributing/asking-great-questions.html
|
||||
|
||||
## Reporting issues
|
||||
|
||||
If you find an easily reproducible bug and/or are experienced in reporting
|
||||
bugs, feel free to just open an issue on the relevant project on GitHub.
|
||||
|
||||
If you have a feature request or are not yet sure what the underlying bug
|
||||
is, the best place to post issues is
|
||||
[#issues](https://chat.zulip.org/#narrow/stream/9-issues) (or
|
||||
[#mobile](https://chat.zulip.org/#narrow/stream/48-mobile) or
|
||||
[#desktop](https://chat.zulip.org/#narrow/stream/16-desktop)) on the
|
||||
[Zulip community server](https://zulip.com/development-community/).
|
||||
This allows us to interactively figure out what is going on, let you know if
|
||||
a similar issue has already been opened, and collect any other information
|
||||
we need. Choose a 2-4 word topic that describes the issue, explain the issue
|
||||
and how to reproduce it if known, your browser/OS if relevant, and a
|
||||
[screenshot or screenGIF](https://zulip.readthedocs.io/en/latest/tutorials/screenshot-and-gif-software.html)
|
||||
if appropriate.
|
||||
|
||||
**Reporting security issues**. Please do not report security issues
|
||||
publicly, including on public streams on chat.zulip.org. You can
|
||||
email [security@zulip.com](mailto:security@zulip.com). We create a CVE for every
|
||||
security issue in our released software.
|
||||
|
||||
## User feedback
|
||||
|
||||
Nearly every feature we develop starts with a user request. If you are part
|
||||
|
||||
@@ -24,7 +24,16 @@ from zerver.lib.storage import static_path
|
||||
from zerver.lib.stream_color import STREAM_ASSIGNMENT_COLORS
|
||||
from zerver.lib.timestamp import floor_to_day
|
||||
from zerver.lib.upload import upload_message_attachment_from_request
|
||||
from zerver.models import Client, Realm, Recipient, Stream, Subscription, UserGroup, UserProfile
|
||||
from zerver.models import (
|
||||
Client,
|
||||
Realm,
|
||||
RealmAuditLog,
|
||||
Recipient,
|
||||
Stream,
|
||||
Subscription,
|
||||
UserGroup,
|
||||
UserProfile,
|
||||
)
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
@@ -116,16 +125,20 @@ class Command(BaseCommand):
|
||||
stream.save(update_fields=["recipient"])
|
||||
|
||||
# Subscribe shylock to the stream to avoid invariant failures.
|
||||
# TODO: This should use subscribe_users_to_streams from populate_db.
|
||||
subs = [
|
||||
Subscription(
|
||||
recipient=recipient,
|
||||
user_profile=shylock,
|
||||
is_user_active=shylock.is_active,
|
||||
color=STREAM_ASSIGNMENT_COLORS[0],
|
||||
),
|
||||
]
|
||||
Subscription.objects.bulk_create(subs)
|
||||
Subscription.objects.create(
|
||||
recipient=recipient,
|
||||
user_profile=shylock,
|
||||
is_user_active=shylock.is_active,
|
||||
color=STREAM_ASSIGNMENT_COLORS[0],
|
||||
)
|
||||
RealmAuditLog.objects.create(
|
||||
realm=realm,
|
||||
modified_user=shylock,
|
||||
modified_stream=stream,
|
||||
event_last_message_id=0,
|
||||
event_type=RealmAuditLog.SUBSCRIPTION_CREATED,
|
||||
event_time=installation_time,
|
||||
)
|
||||
|
||||
# Create an attachment in the database for set_storage_space_used_statistic.
|
||||
IMAGE_FILE_PATH = static_path("images/test-images/checkbox.png")
|
||||
|
||||
@@ -249,6 +249,12 @@ class TestSupportEndpoint(ZulipTestCase):
|
||||
check_hamlet_user_query_result(result)
|
||||
check_zulip_realm_query_result(result)
|
||||
|
||||
# Search should be case-insensitive:
|
||||
assert self.example_email("hamlet") != self.example_email("hamlet").upper()
|
||||
result = get_check_query_result(self.example_email("hamlet").upper(), 1)
|
||||
check_hamlet_user_query_result(result)
|
||||
check_zulip_realm_query_result(result)
|
||||
|
||||
result = get_check_query_result(lear_user.email, 1)
|
||||
check_lear_user_query_result(result)
|
||||
check_lear_realm_query_result(result)
|
||||
@@ -702,3 +708,26 @@ class TestSupportEndpoint(ZulipTestCase):
|
||||
result = self.client_post("/activity/support", {"realm_id": f"{lear_realm.id}"})
|
||||
self.assert_json_error(result, "Invalid parameters")
|
||||
m.assert_not_called()
|
||||
|
||||
def test_delete_user(self) -> None:
|
||||
cordelia = self.example_user("cordelia")
|
||||
hamlet = self.example_user("hamlet")
|
||||
hamlet_email = hamlet.delivery_email
|
||||
realm = get_realm("zulip")
|
||||
self.login_user(cordelia)
|
||||
|
||||
result = self.client_post(
|
||||
"/activity/support", {"realm_id": f"{realm.id}", "delete_user_by_id": hamlet.id}
|
||||
)
|
||||
self.assertEqual(result.status_code, 302)
|
||||
self.assertEqual(result["Location"], "/login/")
|
||||
|
||||
self.login("iago")
|
||||
|
||||
with mock.patch("analytics.views.support.do_delete_user_preserving_messages") as m:
|
||||
result = self.client_post(
|
||||
"/activity/support",
|
||||
{"realm_id": f"{realm.id}", "delete_user_by_id": hamlet.id},
|
||||
)
|
||||
m.assert_called_once_with(hamlet)
|
||||
self.assert_in_success_response([f"{hamlet_email} in zulip deleted"], result)
|
||||
|
||||
@@ -9,6 +9,7 @@ from urllib.parse import urlencode
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.core.validators import URLValidator
|
||||
from django.db.models import Q
|
||||
from django.http import HttpRequest, HttpResponse, HttpResponseRedirect
|
||||
from django.shortcuts import render
|
||||
from django.urls import reverse
|
||||
@@ -26,6 +27,7 @@ from zerver.actions.realm_settings import (
|
||||
do_scrub_realm,
|
||||
do_send_realm_reactivation_email,
|
||||
)
|
||||
from zerver.actions.users import do_delete_user_preserving_messages
|
||||
from zerver.decorator import require_server_admin
|
||||
from zerver.forms import check_subdomain_available
|
||||
from zerver.lib.exceptions import JsonableError
|
||||
@@ -42,6 +44,7 @@ from zerver.models import (
|
||||
UserProfile,
|
||||
get_org_type_display_name,
|
||||
get_realm,
|
||||
get_user_profile_by_id,
|
||||
)
|
||||
from zerver.views.invite import get_invitee_emails_set
|
||||
|
||||
@@ -166,6 +169,7 @@ def support(
|
||||
default=None, str_validator=check_string_in(VALID_MODIFY_PLAN_METHODS)
|
||||
),
|
||||
scrub_realm: bool = REQ(default=False, json_validator=check_bool),
|
||||
delete_user_by_id: Optional[int] = REQ(default=None, converter=to_non_negative_int),
|
||||
query: Optional[str] = REQ("q", default=None),
|
||||
org_type: Optional[int] = REQ(default=None, converter=to_non_negative_int),
|
||||
) -> HttpResponse:
|
||||
@@ -276,11 +280,20 @@ def support(
|
||||
elif scrub_realm:
|
||||
do_scrub_realm(realm, acting_user=acting_user)
|
||||
context["success_message"] = f"{realm.string_id} scrubbed."
|
||||
elif delete_user_by_id:
|
||||
user_profile_for_deletion = get_user_profile_by_id(delete_user_by_id)
|
||||
user_email = user_profile_for_deletion.delivery_email
|
||||
assert user_profile_for_deletion.realm == realm
|
||||
do_delete_user_preserving_messages(user_profile_for_deletion)
|
||||
context["success_message"] = f"{user_email} in {realm.subdomain} deleted."
|
||||
|
||||
if query:
|
||||
key_words = get_invitee_emails_set(query)
|
||||
|
||||
users = set(UserProfile.objects.filter(delivery_email__in=key_words))
|
||||
case_insensitive_users_q = Q()
|
||||
for key_word in key_words:
|
||||
case_insensitive_users_q |= Q(delivery_email__iexact=key_word)
|
||||
users = set(UserProfile.objects.filter(case_insensitive_users_q))
|
||||
realms = set(Realm.objects.filter(string_id__in=key_words))
|
||||
|
||||
for key_word in key_words:
|
||||
|
||||
@@ -20,17 +20,58 @@ format used by the Zulip server that they are interacting with.
|
||||
|
||||
## Changes in Zulip 7.0
|
||||
|
||||
**Feature level 185**
|
||||
|
||||
No changes; feature level used for Zulip 7.0 release.
|
||||
|
||||
**Feature level 184**
|
||||
|
||||
* [`PATCH /scheduled_messages/<int:scheduled_message_id>`](/api/update-scheduled-message):
|
||||
Added new endpoint for editing an existing scheduled message.
|
||||
* [`POST /scheduled_messages`](/api/create-scheduled-message):
|
||||
Removed optional `scheduled_message_id` parameter, which had
|
||||
been a previous way for clients to support editing an existing
|
||||
scheduled message.
|
||||
|
||||
**Feature level 183**
|
||||
|
||||
* [`POST /register`](/api/register-queue): Removed the
|
||||
`realm_community_topic_editing_limit_seconds` property, which was no
|
||||
longer in use. The time limit for editing topics is controlled by the
|
||||
realm setting `move_messages_within_stream_limit_seconds`, see feature
|
||||
level 162.
|
||||
* [`GET /events`](/api/get-events): Removed the `community_topic_editing_limit_seconds`
|
||||
property from realm `update_dict` event documentation, because it was
|
||||
never returned as a changed property in this event and was only ever
|
||||
returned in the [`POST /register`](/api/register-queue) response.
|
||||
|
||||
**Feature level 182**
|
||||
|
||||
* `POST /export/realm`: This endpoint now returns the ID of the data
|
||||
export object created by the request.
|
||||
|
||||
**Feature level 181**
|
||||
|
||||
* [`GET /scheduled_messages`](/api/get-scheduled-messages), [`GET
|
||||
/events`](/api/get-events), [`POST /register`](/api/register-queue):
|
||||
Added `failed` boolean field to scheduled message objects to
|
||||
indicate if the server tried to send the scheduled message and was
|
||||
unsuccessful. Clients that support unscheduling and editing
|
||||
scheduled messages should use this field to indicate to the user
|
||||
when a scheduled message failed to send at the appointed time.
|
||||
|
||||
**Feature level 180**
|
||||
|
||||
* `POST /invites`: Added support for invitations specifying the empty
|
||||
list as the user's initial stream subscriptions. Previously, this
|
||||
returned an error.
|
||||
returned an error. This change was also backported to Zulip 6.2, and
|
||||
is available at feature levels 157-158 as well.
|
||||
|
||||
**Feature level 179**:
|
||||
**Feature level 179**
|
||||
|
||||
* [`POST /scheduled_messages`](/api/create-or-update-scheduled-message):
|
||||
* [`POST /scheduled_messages`](/api/create-scheduled-message):
|
||||
Added new endpoint to create and edit scheduled messages.
|
||||
* [`GET /events`](/api/get-events)
|
||||
* [`GET /events`](/api/get-events):
|
||||
Added `scheduled_messages` events sent to clients when a user creates,
|
||||
edits or deletes scheduled messages.
|
||||
* [`POST /register`](/api/register-queue):
|
||||
@@ -39,11 +80,14 @@ format used by the Zulip server that they are interacting with.
|
||||
|
||||
**Feature level 178**
|
||||
|
||||
* `POST users/me/presence`, [`POST /register`](/api/register-queue),
|
||||
[`GET /events`](/api/get-events), `GET /realm/presence`, `GET
|
||||
/users/<user_id_or_email>/presence`: The server no longer stores
|
||||
which client submitted presence data, and presence responses from
|
||||
the server will always contain the `aggregated` and `website` keys.
|
||||
* `POST users/me/presence`,
|
||||
[`GET /users/<user_id_or_email>/presence`](/api/get-user-presence),
|
||||
[`GET /realm/presence`](/api/get-presence),
|
||||
[`POST /register`](/api/register-queue),
|
||||
[`GET /events`](/api/get-events):
|
||||
The server no longer stores which client submitted presence data,
|
||||
and presence responses from the server will always contain the
|
||||
`"aggregated"` and `"website"` keys.
|
||||
|
||||
**Feature level 177**
|
||||
|
||||
@@ -61,25 +105,30 @@ format used by the Zulip server that they are interacting with.
|
||||
|
||||
**Feature level 176**
|
||||
|
||||
* [`POST /realm/filters`](/api/add-linkifier), [`realm/filters/<int:filter_id>`](/api/update-linkifier):
|
||||
The parameter `url_format_string` is replaced by `url_template`.
|
||||
The linkifiers now accept only [RFC 6570][rfc6570] compliant URL Templates.
|
||||
The old URL format strings are no longer supported.
|
||||
* [`POST /realm/filters`](/api/add-linkifier),
|
||||
[`PATCH realm/filters/<int:filter_id>`](/api/update-linkifier):
|
||||
The `url_format_string` parameter is replaced by `url_template`.
|
||||
[Linkifiers](/help/add-a-custom-linkifier) now only accept
|
||||
[RFC 6570][rfc6570] compliant URL templates. The old URL format
|
||||
strings are no longer supported.
|
||||
* [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue):
|
||||
The key `url_format_string` is replaced by `url_template` for the `realm_linkifiers`
|
||||
event type. For backwards-compatibility, clients that do not support the
|
||||
`linkifier_url_template`
|
||||
The `url_format_string` key in `realm_linkifiers` objects is replaced
|
||||
by `url_template`. For backwards-compatibility, clients that do not
|
||||
support the `linkifier_url_template`
|
||||
[client capability](/api/register-queue#parameter-client_capabilities)
|
||||
will get an empty list in the response of `/register` and not receive `realm_linkifiers`
|
||||
events. Unconditionally, the deprecated event type `realm_filters` gives an empty list in the
|
||||
response of `/register` and is no longer sent the clients otherwise.
|
||||
will receive an empty `realm_linkifiers` array in the `/register`
|
||||
response and not receive `realm_linkifiers` events. Unconditionally,
|
||||
the deprecated `realm_filters` event type returns an empty array in
|
||||
the `/register` response and these events are no longer sent to
|
||||
clients.
|
||||
|
||||
**Feature level 175**
|
||||
|
||||
* [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings),
|
||||
[`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults):
|
||||
Added new user setting `web_mark_read_on_scroll_policy` . This determines whether to mark
|
||||
messages as read or not as the client scrolls through their feed.
|
||||
Added new user setting `web_mark_read_on_scroll_policy`. Clients may use this to
|
||||
determine the user's preference on whether to mark messages as read or not when
|
||||
scrolling through their message feed.
|
||||
|
||||
**Feature level 174**:
|
||||
|
||||
@@ -98,12 +147,15 @@ format used by the Zulip server that they are interacting with.
|
||||
|
||||
**Feature level 172**
|
||||
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): Topic editing
|
||||
restrictions now apply to messages without a topic as well.
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): The endpoint
|
||||
now returns an error when users, other than organization administrators
|
||||
and moderators, try to move messages that have passed the time limit
|
||||
using `change_all` value for `propagate_mode` parameter.
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message):
|
||||
[Topic editing restrictions](/help/restrict-moving-messages) now apply
|
||||
to stream messages without a topic.
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): When users, other
|
||||
than organization administrators and moderators, use
|
||||
`"propagate_mode": "change_all"` to move messages that have passed the
|
||||
organization's time limit for updating a message's topic and/or stream,
|
||||
this endpoint now returns an error response
|
||||
(`"code": "MOVE_MESSAGES_TIME_LIMIT_EXCEEDED"`).
|
||||
|
||||
**Feature level 171**:
|
||||
|
||||
@@ -114,8 +166,14 @@ format used by the Zulip server that they are interacting with.
|
||||
|
||||
**Feature level 170**
|
||||
|
||||
* [`POST /user_topics`](/api/update-user-topic):
|
||||
Added a new endpoint to update the personal preferences for a topic.
|
||||
* [`POST /user_topics`](/api/update-user-topic): Added a new endpoint to
|
||||
update a user's personal preferences for a topic, which deprecates the
|
||||
[`PATCH /users/me/subscriptions/muted_topics`](/api/mute-topic) endpoint.
|
||||
The deprecated endpoint is maintained for backwards-compatibility but may be
|
||||
removed in a future release.
|
||||
* [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events):
|
||||
Unmuted added as a visibility policy option to the objects sent in response
|
||||
to the `user_topic` event.
|
||||
|
||||
**Feature level 169**
|
||||
|
||||
@@ -126,10 +184,10 @@ format used by the Zulip server that they are interacting with.
|
||||
|
||||
**Feature level 168**
|
||||
|
||||
* [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults),
|
||||
[`POST /register`](/api/register-queue),
|
||||
[`PATCH /settings`](/api/update-settings): Replaced the `realm_name_in_notifications`
|
||||
boolean field with an integer field `realm_name_in_email_notifications_policy`.
|
||||
* [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings),
|
||||
[`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults):
|
||||
Replaced the boolean user setting `realm_name_in_notifications`
|
||||
with an integer `realm_name_in_email_notifications_policy`.
|
||||
|
||||
**Feature level 167**
|
||||
|
||||
@@ -157,76 +215,95 @@ format used by the Zulip server that they are interacting with.
|
||||
**Feature level 164**
|
||||
|
||||
* [`POST /register`](/api/register-queue): Added the
|
||||
`server_presence_ping_interval_seconds` and `server_presence_offline_threshold_seconds`
|
||||
attributes.
|
||||
`server_presence_ping_interval_seconds` and
|
||||
`server_presence_offline_threshold_seconds` fields for clients
|
||||
to use when implementing the [presence](/api/get-presence) system.
|
||||
|
||||
**Feature level 163**
|
||||
|
||||
* [`GET /users`](/api/get-users), [`GET /users/{user_id}`](/api/get-user),
|
||||
[`GET /users/{email}`](/api/get-user-by-email),
|
||||
[`GET /users/me`](/api/get-own-user) and [`GET /events`](/api/get-events):
|
||||
The `delivery_email` field is always present in user objects, including the case
|
||||
when `email_address_visibility` is set to `EMAIL_ADDRESS_VISIBILITY_EVERYONE`,
|
||||
with the value being `None` if the requestor does not have access to the user's
|
||||
real email. For bot users, the `delivery_email` field is always set to the real email.
|
||||
* [`GET /events`](/api/get-events): Event for updating `delivery_email` is now sent to
|
||||
all users who have access to it and is also sent when `email_address_visibility` setting
|
||||
changes.
|
||||
* [`POST /register`](/api/register-queue), [`PATCH
|
||||
/settings`](/api/update-settings), [`PATCH
|
||||
/realm/user_settings_defaults`](/api/update-realm-user-settings-defaults): Added
|
||||
user setting `email_address_visibility` which will replace the existing realm
|
||||
[`GET /users/me`](/api/get-own-user), [`GET /events`](/api/get-events):
|
||||
The `delivery_email` field is always present in user objects, including
|
||||
the case when a user's `email_address_visibility` is set to everyone.
|
||||
The value will be `null` if the requestor does not have access to the
|
||||
user's real email. For bot users, the `delivery_email` field is always
|
||||
set to the bot user's real email.
|
||||
* [`GET /events`](/api/get-events): Event for updating a user's
|
||||
`delivery_email` is now sent to all users who have access to it, and
|
||||
is also sent when a user's `email_address_visibility` setting changes.
|
||||
* [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue)
|
||||
[`GET /users`](/api/get-users), [`GET /users/{user_id}`](/api/get-user),
|
||||
[`GET /users/{email}`](/api/get-user-by-email),
|
||||
[`GET /users/me`](/api/get-own-user), [`GET /messages`](/api/get-messages),
|
||||
[`GET /messages/{message_id}`](/api/get-message): Whether the `avatar_url`
|
||||
field in message and user objects returned by these endpoints can be `null`
|
||||
now depends on if the current user has access to the other user's real
|
||||
email address based on the other user's `email_address_visibility` policy.
|
||||
* [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings),
|
||||
[`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults):
|
||||
Added user setting `email_address_visibility`, to replace the
|
||||
realm setting `email_address_visibility`.
|
||||
* [`POST /register`](/api/register-queue), `PATCH /realm`: Removed realm
|
||||
setting `email_address_visibility`.
|
||||
* [`POST /register`](/api/register-queue), `PATCH /realm`: Removed realm-level
|
||||
`email_address_visibility` setting.
|
||||
|
||||
**Feature level 162**
|
||||
|
||||
* [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events),
|
||||
`PATCH /realm`: Added new `move_messages_within_stream_limit_seconds` setting.
|
||||
* [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events),
|
||||
`PATCH /realm`: Added new `move_messages_between_streams_limit_seconds` setting.
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): Time limit to edit
|
||||
topics, for users other than administrators and moderators, can now be
|
||||
configured using `move_messages_within_stream_limit_seconds` setting.
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): Time limit to move
|
||||
messages between streams, for users other than administrators and moderators,
|
||||
can now be configured using `move_messages_between_streams_limit_seconds` setting.
|
||||
* `PATCH /realm`, [`POST /register`](/api/register-queue),
|
||||
[`GET /events`](/api/get-events): Added two new realm settings
|
||||
`move_messages_within_stream_limit_seconds` and
|
||||
`move_messages_between_streams_limit_seconds` for organizations to
|
||||
configure time limits for editing topics and moving messages between streams.
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): For users other than
|
||||
administrators and moderators, the time limit for editing topics is now
|
||||
controlled via the realm setting `move_messages_within_stream_limit_seconds`
|
||||
and the time limit for moving messages between streams is now controlled by
|
||||
the realm setting `move_messages_between_streams_limit_seconds`.
|
||||
|
||||
**Feature level 161**
|
||||
|
||||
* [`PATCH /streams/{stream_id}`](/api/update-stream): Added
|
||||
`can_remove_subscribers_group_id` parameter to support
|
||||
changing `can_remove_subscribers_group` setting.
|
||||
* [`POST /users/me/subscriptions`](/api/subscribe): Added
|
||||
`can_remove_subscribers_group_id` parameter to set
|
||||
`can_remove_subscribers_group` setting while creating
|
||||
streams.
|
||||
* [`POST /users/me/subscriptions`](/api/subscribe),
|
||||
[`PATCH /streams/{stream_id}`](/api/update-stream): Added
|
||||
`can_remove_subscribers_group_id` parameter to support setting and
|
||||
changing the user group whose members can remove other subscribers
|
||||
from the specified stream.
|
||||
* [`DELETE /users/me/subscriptions`](/api/unsubscribe): Expanded the
|
||||
situations where users can use this endpoint to unsubscribe other
|
||||
users from a stream to include the case where the current user has
|
||||
access to the stream and is a member of the user group specified by
|
||||
the `can_remove_subscribers_group_id` for the stream.
|
||||
|
||||
**Feature level 160**
|
||||
|
||||
* `POST /api/v1/jwt/fetch_api_key`: New API endpoint to fetch API
|
||||
* `POST /api/v1/jwt/fetch_api_key`: Added new endpoint to fetch API
|
||||
keys using JSON Web Token (JWT) authentication.
|
||||
* `accounts/login/jwt/`: Adjusted format of requests to this
|
||||
previously undocumented, optional endpoint for
|
||||
JWT authentication log in support.
|
||||
* `accounts/login/jwt/`: Adjusted format of requests to undocumented,
|
||||
optional endpoint for JWT authentication log in support.
|
||||
|
||||
**Feature level 159**
|
||||
|
||||
* [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events),
|
||||
`PATCH /realm`: Nobody added as an option for the realm setting
|
||||
`edit_topic_policy`.
|
||||
* [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events),
|
||||
`PATCH /realm`: Nobody added as an option for the realm setting
|
||||
`move_messages_between_streams_policy`.
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): Permission to edit stream
|
||||
and topic of messages do not depend on `allow_message_editing` setting now.
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): Message senders are not
|
||||
allowed to edit topics indefinitely now.
|
||||
* `PATCH /realm`, [`POST /register`](/api/register-queue),
|
||||
[`GET /events`](/api/get-events):
|
||||
Nobody added as an option for the realm settings `edit_topic_policy`
|
||||
and `move_messages_between_streams_policy`.
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): Permission
|
||||
to edit the stream and/or topic of messages no longer depends on the
|
||||
realm setting `allow_message_editing`.
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): The user who
|
||||
sent the message can no longer edit the message's topic indefinitely.
|
||||
|
||||
Feature levels 157-158 are reserved for future use in 6.x maintenance
|
||||
Feature level 158 is reserved for future use in 6.x maintenance
|
||||
releases.
|
||||
|
||||
## Changes in Zulip 6.2
|
||||
|
||||
**Feature level 157**
|
||||
|
||||
* `POST /invites`: Added support for invitations specifying the empty
|
||||
list as the user's initial stream subscriptions. Previously, this
|
||||
returned an error. This change was backported from the Zulip 7.0
|
||||
branch, and thus is available at feature levels 157-158 and 180+.
|
||||
|
||||
## Changes in Zulip 6.0
|
||||
|
||||
**Feature level 156**
|
||||
@@ -521,7 +598,8 @@ No changes; feature level used for Zulip 5.0 release.
|
||||
/events`](/api/get-events): Improved the format of the
|
||||
`edit_history` object within message objects. Entries for stream
|
||||
edits now include a both a `prev_stream` and `stream` field to
|
||||
indicate the previous and current stream IDs. Entries for topic
|
||||
indicate the previous and current stream IDs. Prior to this feature
|
||||
level, only the `prev_stream` field was present. Entries for topic
|
||||
edits now include both a `prev_topic` and `topic` field to indicate
|
||||
the previous and current topic, replacing the `prev_subject`
|
||||
field. These changes substantially simplify client complexity for
|
||||
@@ -1383,11 +1461,12 @@ No changes; feature level used for Zulip 3.0 release.
|
||||
`POST /register` to make them accessible to all the clients;
|
||||
they were only internally available to Zulip's web app prior to this.
|
||||
|
||||
**Feature level 3**:
|
||||
**Feature level 3**
|
||||
|
||||
* `zulip_version` and `zulip_feature_level` are always returned
|
||||
in `POST /register`; previously they were only returned if `event_types`
|
||||
included `zulip_version`.
|
||||
* [`POST /register`](/api/register-queue): `zulip_version` and
|
||||
`zulip_feature_level` are always returned in the endpoint response.
|
||||
Previously, they were only present if `event_types` included
|
||||
`zulip_version`.
|
||||
* Added new `presence_enabled` user notification setting; previously
|
||||
[presence](/help/status-and-availability) was always enabled.
|
||||
|
||||
@@ -1404,6 +1483,15 @@ No changes; feature level used for Zulip 3.0 release.
|
||||
|
||||
**Feature level 1**:
|
||||
|
||||
* [`PATCH /messages/{message_id}`](/api/update-message): Added the
|
||||
`stream_id` parameter to support moving messages between streams.
|
||||
* [`GET /messages`](/api/get-messages), [`GET /events`](/api/get-events):
|
||||
Added `prev_stream` as a potential property of the `edit_history` object
|
||||
within message objects to indicate when a message was moved to another
|
||||
stream.
|
||||
* [`GET messages/{message_id}/history`](/api/get-message-history):
|
||||
`prev_stream` is present in `snapshot` objects within `message_history`
|
||||
object when a message was moved to another stream.
|
||||
* [`GET /server_settings`](/api/get-server-settings): Added
|
||||
`zulip_feature_level`, which can be used by clients to detect which
|
||||
of the features described in this changelog are supported.
|
||||
@@ -1450,6 +1538,8 @@ No changes; feature level used for Zulip 3.0 release.
|
||||
|
||||
## Changes in Zulip 2.1
|
||||
|
||||
* [`POST /register`](/api/register-queue): Added
|
||||
`realm_default_external_accounts` to endpoint response.
|
||||
* [`GET /messages`](/api/get-messages): Added support for
|
||||
[search/narrow options](/api/construct-narrow) that use stream/user
|
||||
IDs to specify a message's sender, its stream, and/or its recipient(s).
|
||||
|
||||
@@ -17,35 +17,17 @@ curl -X POST {{ api_url }}/v1/scheduled_messages \
|
||||
--data-urlencode type=stream \
|
||||
--data-urlencode to=9 \
|
||||
--data-urlencode topic=Hello \
|
||||
--data-urlencode 'content=Thank you for' \
|
||||
--data-urlencode 'content=Nice to meet everyone!' \
|
||||
--data-urlencode scheduled_delivery_timestamp=3165826990
|
||||
|
||||
# Update a scheduled stream message
|
||||
curl -X POST {{ api_url }}/v1/scheduled_messages \
|
||||
-u BOT_EMAIL_ADDRESS:BOT_API_KEY \
|
||||
--data-urlencode type=stream \
|
||||
--data-urlencode to=9 \
|
||||
--data-urlencode 'topic=Welcome aboard' \
|
||||
--data-urlencode 'content=Thank you for the help!' \
|
||||
--data-urlencode scheduled_delivery_timestamp=3165856990 \
|
||||
--data-urlencode scheduled_message_id=1
|
||||
|
||||
# Create a scheduled direct message
|
||||
curl -X POST {{ api_url }}/v1/messages \
|
||||
-u BOT_EMAIL_ADDRESS:BOT_API_KEY \
|
||||
--data-urlencode type=direct \
|
||||
--data-urlencode 'to=[9, 10]' \
|
||||
--data-urlencode 'content=Can we meet tomorrow?' \
|
||||
--data-urlencode 'content=Can we meet on Monday?' \
|
||||
--data-urlencode scheduled_delivery_timestamp=3165826990
|
||||
|
||||
# Update a scheduled direct message
|
||||
curl -X POST {{ api_url }}/v1/messages \
|
||||
-u BOT_EMAIL_ADDRESS:BOT_API_KEY \
|
||||
--data-urlencode type=direct \
|
||||
--data-urlencode 'to=[9, 10, 11]' \
|
||||
--data-urlencode 'content=Can we meet tomorrow?' \
|
||||
--data-urlencode scheduled_delivery_timestamp=3165856990 \
|
||||
--data-urlencode scheduled_message_id=2
|
||||
```
|
||||
|
||||
{end_tabs}
|
||||
@@ -20,7 +20,8 @@
|
||||
#### Scheduled messages
|
||||
|
||||
* [Get scheduled messages](/api/get-scheduled-messages)
|
||||
* [Create or edit a scheduled message](/api/create-or-update-scheduled-message)
|
||||
* [Create a scheduled message](/api/create-scheduled-message)
|
||||
* [Edit a scheduled message](/api/update-scheduled-message)
|
||||
* [Delete a scheduled message](/api/delete-scheduled-message)
|
||||
|
||||
#### Drafts
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
# Bug report guidelines
|
||||
|
||||
Please include these elements in your bug report to make it easier for us to help you.
|
||||
|
||||
- A brief title
|
||||
|
||||
- An explanation of what you were expecting vs. the actual result
|
||||
|
||||
- Steps to take in order to reproduce the buggy behavior
|
||||
|
||||
- Whether you are using Zulip in production or in the development
|
||||
environment, and whether these are old versions
|
||||
|
||||
- Whether you are using the web app, a desktop app or a mobile device
|
||||
to access Zulip
|
||||
|
||||
- Any additional information that would help: screenshots, GIFs, a
|
||||
pastebin of the error log
|
||||
|
||||
Further reading:
|
||||
|
||||
- [How to write a bug report that will make your engineers love you](https://testlio.com/blog/the-ideal-bug-report/)
|
||||
- [How to Report Bugs Effectively](https://www.chiark.greenend.org.uk/~sgtatham/bugs.html)
|
||||
@@ -1,7 +1,9 @@
|
||||
# Reviewing Zulip code
|
||||
|
||||
Code review is a key part of how Zulip does development. It's an essential aspect
|
||||
of our process to build a high-quality product with a maintainable code base.
|
||||
Code review is a key part of how Zulip does development. It's an essential
|
||||
aspect of our process to build a high-quality product with a maintainable
|
||||
codebase. See the [pull request review process](../contributing/review-process.md)
|
||||
guide for a detailed overview of Zulip's PR review process.
|
||||
|
||||
## Principles of code review
|
||||
|
||||
@@ -283,12 +285,15 @@ Some scenarios to consider:
|
||||
|
||||
### Asking for a code review
|
||||
|
||||
There are a few good ways to ask for a code review:
|
||||
The [pull request review process](../contributing/review-process.md) guide
|
||||
provides a detailed overview of Zulip's PR review process. Your reviewers and
|
||||
Zulip's maintainers will help shepherd your PR through the process. There are
|
||||
also some additional ways to ask for a code review:
|
||||
|
||||
- Are there folks who have been working on similar things, or a loosely related
|
||||
area? If so, they might be a good person to review your PR. `@`-mention them
|
||||
with something like "`@person`, would you be up for reviewing this?" If
|
||||
you're not sure whether they are familiar with the code review process, you
|
||||
you're not sure whether they are familiar with how Zulip code reviews work, you
|
||||
can also include a link to this guide.
|
||||
|
||||
- If you're not sure who to ask, you can post a message in
|
||||
@@ -296,19 +301,11 @@ There are a few good ways to ask for a code review:
|
||||
development community server](https://zulip.com/development-community/) to reach
|
||||
out to a wider group of potential reviewers.
|
||||
|
||||
- If you would like feedback on user-facing changes, you can `@`-mention `@alya`
|
||||
on your PR. She can also help find someone to review the code once the PR is
|
||||
ready from a product perspective.
|
||||
|
||||
- Finally, if you are not sure who should review the PR, just indicate clearly
|
||||
that it is ready for review, and the project maintainers will take a look and
|
||||
follow up with next steps.
|
||||
|
||||
With any of these approaches, please be patient and mindful of the fact that it
|
||||
isn't always possible to provide a quick reply. Going though the [review
|
||||
process](#how-to-review-code) described above for your own PR will make your
|
||||
code easier and faster to review, which makes it much more likely that it will
|
||||
be reviewed quickly and require fewer review cycles.
|
||||
Please be patient and mindful of the fact that it isn't always possible to
|
||||
provide a quick reply. Going though the [review process](#how-to-review-code)
|
||||
described above for your own PR will make your code easier and faster to review,
|
||||
which makes it much more likely that it will be reviewed quickly and require
|
||||
fewer review cycles.
|
||||
|
||||
### Reviewing someone else's code
|
||||
|
||||
|
||||
@@ -1,28 +1,44 @@
|
||||
# Code style and conventions
|
||||
|
||||
One can summarize Zulip's coding philosophy as a relentless focus on
|
||||
making the codebase easy to understand and difficult to make dangerous
|
||||
mistakes in. The majority of work in any large software development
|
||||
project is understanding the existing code so one can debug or modify
|
||||
it, and investments in code readability usually end up paying for
|
||||
themselves when someone inevitably needs to debug or improve the code.
|
||||
|
||||
When there's something subtle or complex to explain or ensure in the
|
||||
implementation, we try hard to make it clear, through a combination of
|
||||
clean and intuitive interfaces, well-named variables and functions,
|
||||
comments/docstrings, and commit messages (roughly in order of priority
|
||||
-- if you can make something clear with a good interface, that's a lot
|
||||
better than writing a comment explaining how the bad interface works).
|
||||
|
||||
This page documents code style policies that every Zulip developer
|
||||
should understand. We aim for this document to be short and focused
|
||||
only on details that cannot be easily enforced another way (e.g.
|
||||
through linters, automated tests, subsystem design that makes classes
|
||||
of mistakes unlikely, etc.). This approach minimizes the cognitive
|
||||
only on details that cannot be easily enforced another way (e.g.,
|
||||
through linters, automated tests, or subsystem design that makes classes
|
||||
of mistakes unlikely). This approach minimizes the cognitive
|
||||
load of ensuring a consistent coding style for both contributors and
|
||||
maintainers.
|
||||
|
||||
## Be consistent!
|
||||
One can summarize Zulip's coding philosophy as a relentless focus on
|
||||
making the codebase easy to understand and difficult to make dangerous
|
||||
mistakes in (see the sections on [dangerous constructs](#dangerous-constructs-in-django)
|
||||
at the end of this page). The majority of work in any large software
|
||||
development project is understanding the existing code so one can debug
|
||||
or modify it, and investments in code readability usually end up paying
|
||||
for themselves when someone inevitably needs to debug or improve the code.
|
||||
|
||||
When there's something subtle or complex to explain or ensure in the
|
||||
implementation, we try hard to make it clear through a combination of
|
||||
clean and intuitive interfaces, well-named variables and functions,
|
||||
comments/docstrings, and commit messages (roughly in that order of
|
||||
priority -- if you can make something clear with a good interface,
|
||||
that's a lot better than writing a comment explaining how the bad
|
||||
interface works).
|
||||
|
||||
After an introduction to our lint tools and test suites, this document
|
||||
outlines some general
|
||||
[conventions and practices](#follow-zulip-conventions-and-practices)
|
||||
applicable to all languages used in the codebase, as well as specific
|
||||
guidance on [Python](#python-specific-conventions-and-practices) and
|
||||
[JavaScript and TypeScript](#javascript-and-typescript-conventions-and-practices).
|
||||
([HTML and CSS](../subsystems/html-css.md) are outlined in their own
|
||||
documentation.)
|
||||
|
||||
At the end of the document, you can read about
|
||||
[dangerous constructs in Django](#dangerous-constructs-in-django) and
|
||||
[JavaScript and TypeScript](#dangerous-constructs-in-javascript-and-typescript)
|
||||
that you should absolutely avoid.
|
||||
|
||||
## Be consistent with existing code
|
||||
|
||||
Look at the surrounding code, or a similar part of the project, and try
|
||||
to do the same thing. If you think the other code has actively bad
|
||||
@@ -31,23 +47,16 @@ style, fix it (in a separate commit).
|
||||
When in doubt, ask in
|
||||
[#development help](https://chat.zulip.org/#narrow/stream/49-development-help).
|
||||
|
||||
## Lint tools
|
||||
### Use the linters
|
||||
|
||||
You can run them all at once with
|
||||
You can run all of the linters at once:
|
||||
|
||||
```bash
|
||||
./tools/lint
|
||||
$ ./tools/lint
|
||||
```
|
||||
|
||||
You can set this up as a local Git commit hook with
|
||||
|
||||
```bash
|
||||
tools/setup-git-repo
|
||||
```
|
||||
|
||||
The Vagrant setup process runs this for you.
|
||||
|
||||
`lint` runs many lint checks in parallel, including
|
||||
Note that that takes a little time. `./tools/lint` runs many
|
||||
lint checks in parallel, including:
|
||||
|
||||
- JavaScript ([ESLint](https://eslint.org/),
|
||||
[Prettier](https://prettier.io/))
|
||||
@@ -57,17 +66,172 @@ The Vagrant setup process runs this for you.
|
||||
[isort](https://pycqa.github.io/isort/))
|
||||
- templates
|
||||
- Puppet configuration
|
||||
- custom checks (e.g. trailing whitespace and spaces-not-tabs)
|
||||
- custom checks (e.g., trailing whitespace and spaces-not-tabs)
|
||||
|
||||
## Secrets
|
||||
To speed things up, you can [pass specific files or directories
|
||||
to the linter](../testing/linters.md):
|
||||
|
||||
```
|
||||
$ ./tools/lint web/src/compose.js
|
||||
```
|
||||
|
||||
If you'd like, you can also set up a local Git commit hook that
|
||||
will lint only your changed files each time you commit:
|
||||
|
||||
```bash
|
||||
$ ./tools/setup-git-repo
|
||||
```
|
||||
|
||||
### Use tests to verify your logic
|
||||
|
||||
Clear, readable code is important for [tests](../testing/testing.md);
|
||||
familiarize yourself with our
|
||||
[testing frameworks](../testing/testing.md#major-test-suites) and
|
||||
[testing philosophy](../testing/philosophy.md) so that you can write
|
||||
clean, readable tests. In-test comments about anything subtle that is
|
||||
being verified are appreciated.
|
||||
|
||||
You can run all of the tests like this:
|
||||
|
||||
```
|
||||
$ ./tools/test-all
|
||||
```
|
||||
|
||||
But consult [our documentation on running tests](../testing/testing.md#running-tests),
|
||||
which covers more targeted approaches to commanding the test-runners.
|
||||
|
||||
## Follow Zulip conventions and practices
|
||||
|
||||
What follows is language-neutral advice that is beyond the bounds of
|
||||
linters and automated tests.
|
||||
|
||||
### Observe a reasonable line length
|
||||
|
||||
We have an absolute hard limit on line length only for some files, but
|
||||
we should still avoid extremely long lines. A general guideline is:
|
||||
refactor stuff to get it under 85 characters, unless that makes the
|
||||
code a lot uglier, in which case it's fine to go up to 120 or so.
|
||||
|
||||
### Tag user-facing strings for translation
|
||||
|
||||
Remember to
|
||||
[tag all user-facing strings for translation](../translating/translating.md),
|
||||
whether the strings are in HTML templates or output by JavaScript/TypeScript
|
||||
that injects or modifies HTML (e.g., error messages).
|
||||
|
||||
### Correctly prepare paths destined for state or log files
|
||||
|
||||
When writing out state or log files, always pass an absolute path
|
||||
through `zulip_path` (found in `zproject/computed_settings.py`), which
|
||||
will do the right thing in both development and production.
|
||||
|
||||
### Never include secrets inline with code
|
||||
|
||||
Please don't put any passwords, secret access keys, etc. inline in the
|
||||
code. Instead, use the `get_secret` function or the `get_mandatory_secret`
|
||||
function in `zproject/config.py` to read secrets from `/etc/zulip/secrets.conf`.
|
||||
|
||||
## Dangerous constructs
|
||||
### Familiarize yourself with rules about third-party code
|
||||
|
||||
### Too many database queries
|
||||
See [our docs on dependencies](../subsystems/dependencies.md) for discussion of
|
||||
rules about integrating third-party projects.
|
||||
|
||||
## Python-specific conventions and practices
|
||||
|
||||
- Our Python code is formatted with
|
||||
[Black](https://github.com/psf/black) and
|
||||
[isort](https://pycqa.github.io/isort/). The [linter
|
||||
tool](../testing/linters.md) enforces this by running Black and
|
||||
isort in check mode, or in write mode with
|
||||
`tools/lint --only=black,isort --fix`. You may find it helpful to
|
||||
[integrate Black](https://black.readthedocs.io/en/stable/integrations/editors.html)
|
||||
and
|
||||
[isort](https://pycqa.github.io/isort/#installing-isorts-for-your-preferred-text-editor)
|
||||
with your editor.
|
||||
- Don't put a shebang line on a Python file unless it's meaningful to
|
||||
run it as a script. (Some libraries can also be run as scripts, e.g.,
|
||||
to run a test suite.)
|
||||
- Scripts should be executed directly (`./script.py`), so that the
|
||||
interpreter is implicitly found from the shebang line, rather than
|
||||
explicitly overridden (`python script.py`).
|
||||
- Put all imports together at the top of the file, absent a compelling
|
||||
reason to do otherwise.
|
||||
- Unpacking sequences doesn't require list brackets:
|
||||
```python
|
||||
[x, y] = xs # unnecessary
|
||||
x, y = xs # better
|
||||
```
|
||||
- For string formatting, use `x % (y,)` rather than `x % y`, to avoid
|
||||
ambiguity if `y` happens to be a tuple.
|
||||
|
||||
## JavaScript and TypeScript conventions and practices
|
||||
|
||||
Our JavaScript and TypeScript code is formatted with
|
||||
[Prettier](https://prettier.io/). You can ask Prettier to reformat
|
||||
all code via our [linter tool](../testing/linters.md) with
|
||||
`tools/lint --only=prettier --fix`. You can also [integrate it with your
|
||||
editor](https://prettier.io/docs/en/editors.html).
|
||||
|
||||
### Build DOM elements in Handlebars
|
||||
|
||||
The best way to build complicated DOM elements is a Handlebars template
|
||||
like `web/templates/message_reactions.hbs`. For simpler things you can
|
||||
use jQuery DOM-building APIs like this:
|
||||
|
||||
```js
|
||||
const $new_tr = $('<tr />').attr('id', object.id);
|
||||
```
|
||||
|
||||
### Attach behaviors to event listeners
|
||||
|
||||
Attach callback functions to events using jQuery code. For example:
|
||||
|
||||
```js
|
||||
$("body").on("click", ".move_message_button", function (e) {
|
||||
// message-moving UI logic
|
||||
}
|
||||
```
|
||||
|
||||
That approach has multiple benefits:
|
||||
|
||||
- Potential huge performance gains by using delegated events where
|
||||
possible
|
||||
- When calling a function from an `onclick` attribute, `this` is not
|
||||
bound to the element like you might think
|
||||
- jQuery does event normalization
|
||||
|
||||
Do not use `onclick` attributes in the HTML.
|
||||
|
||||
### Declare variables using `const` and `let`
|
||||
|
||||
Always declare JavaScript variables using `const` or `let` rather than
|
||||
`var`.
|
||||
|
||||
### Manipulate objects and arrays with modern methods
|
||||
|
||||
For functions that operate on arrays or JavaScript objects, you should
|
||||
generally use modern
|
||||
[ECMAScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Language_Resources)
|
||||
primitives such as [`for … of`
|
||||
loops](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of),
|
||||
[`Array.prototype.{entries, every, filter, find, indexOf, map, some}`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array),
|
||||
[`Object.{assign, entries, keys, values}`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object),
|
||||
[spread
|
||||
syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax),
|
||||
and so on. Our Babel configuration automatically transpiles and
|
||||
polyfills these using [`core-js`](https://github.com/zloirock/core-js)
|
||||
when necessary. We used to use the
|
||||
[Underscore](https://underscorejs.org/) library, but that should be
|
||||
avoided in new code.
|
||||
|
||||
## HTML and CSS
|
||||
|
||||
See the documentation on [HTML and CSS](../subsystems/html-css.md)
|
||||
for guidance on conventions in those language.
|
||||
|
||||
## Dangerous constructs in Django
|
||||
|
||||
### Avoid excessive database queries
|
||||
|
||||
Look out for Django code like this:
|
||||
|
||||
@@ -87,7 +251,7 @@ for bar in bars:
|
||||
# Make use of foo
|
||||
```
|
||||
|
||||
...which makes a database query for every Bar. While this may be fast
|
||||
...which makes a database query for every `Bar`. While this may be fast
|
||||
locally in development, it may be quite slow in production! Instead,
|
||||
tell Django's [QuerySet
|
||||
API](https://docs.djangoproject.com/en/dev/ref/models/querysets/) to
|
||||
@@ -105,7 +269,7 @@ is wrong with the database schema. So don't defer this optimization when
|
||||
performing schema changes, or else you may later find that it's
|
||||
impossible.
|
||||
|
||||
### UserProfile.objects.get() / Client.objects.get() / etc.
|
||||
### Never do direct database queries (`UserProfile.objects.get()`, `Client.objects.get()`, etc.)
|
||||
|
||||
In our Django code, never do direct `UserProfile.objects.get(email=foo)`
|
||||
database queries. Instead always use `get_user_profile_by_{email,id}`.
|
||||
@@ -114,14 +278,15 @@ There are 3 reasons for this:
|
||||
1. It's guaranteed to correctly do a case-inexact lookup
|
||||
2. It fetches the user object from remote cache, which is faster
|
||||
3. It always fetches a UserProfile object which has been queried
|
||||
using `.select_related()` (see above!), and thus will perform well
|
||||
when one later accesses related models like the Realm.
|
||||
using `.select_related()` ([see above](#avoid-excessive-database-queries)!),
|
||||
and thus will perform well when one later accesses related models
|
||||
like the Realm.
|
||||
|
||||
Similarly we have `get_client` and `access_stream_by_id` /
|
||||
`access_stream_by_name` functions to fetch those commonly accessed
|
||||
objects via remote cache.
|
||||
|
||||
### Using Django model objects as keys in sets/dicts
|
||||
### Don't use Django model objects as keys in sets/dicts
|
||||
|
||||
Don't use Django model objects as keys in sets/dictionaries -- you will
|
||||
get unexpected behavior when dealing with objects obtained from
|
||||
@@ -144,29 +309,29 @@ some_objs = UserProfile.objects.get(id=17)
|
||||
assert obj.id in set([o.id for o in some_objs])
|
||||
```
|
||||
|
||||
### user_profile.save()
|
||||
### Don't call user_profile.save() without `update_fields`
|
||||
|
||||
You should always pass the update_fields keyword argument to .save()
|
||||
when modifying an existing Django model object. By default, .save() will
|
||||
You should always pass the `update_fields` keyword argument to `.save()`
|
||||
when modifying an existing Django model object. By default, `.save()` will
|
||||
overwrite every value in the column, which results in lots of race
|
||||
conditions where unrelated changes made by one thread can be
|
||||
accidentally overwritten by another thread that fetched its UserProfile
|
||||
accidentally overwritten by another thread that fetched its `UserProfile`
|
||||
object before the first thread wrote out its change.
|
||||
|
||||
### Using raw saves to update important model objects
|
||||
### Don't update important model objects with raw saves
|
||||
|
||||
In most cases, we already have a function in `zerver.actions` with
|
||||
a name like do_activate_user that will correctly handle lookups,
|
||||
a name like `do_activate_user` that will correctly handle lookups,
|
||||
caching, and notifying running browsers via the event system about your
|
||||
change. So please check whether such a function exists before writing
|
||||
new code to modify a model object, since your new code has a good chance
|
||||
of getting at least one of these things wrong.
|
||||
|
||||
### Naive datetime objects
|
||||
### Don't use naive datetime objects
|
||||
|
||||
Python allows datetime objects to not have an associated time zone, which can
|
||||
cause time-related bugs that are hard to catch with a test suite, or bugs
|
||||
that only show up during daylight savings time.
|
||||
that only show up during daylight saving time.
|
||||
|
||||
Good ways to make time-zone-aware datetimes are below. We import time zone
|
||||
libraries as `from datetime import datetime, timezone` and
|
||||
@@ -198,174 +363,12 @@ Additional notes:
|
||||
- All datetimes on the backend should be in UTC, unless there is a good
|
||||
reason to do otherwise.
|
||||
|
||||
### `x.attr('zid')` vs. `rows.id(x)`
|
||||
## Dangerous constructs in JavaScript and TypeScript
|
||||
|
||||
Our message row DOM elements have a custom attribute `zid` which
|
||||
contains the numerical message ID. **Don't access this directly as**
|
||||
`x.attr('zid')` ! The result will be a string and comparisons (e.g. with
|
||||
`<=`) will give the wrong result, occasionally, just enough to make a
|
||||
bug that's impossible to track down.
|
||||
|
||||
You should instead use the `id` function from the `rows` module, as in
|
||||
`rows.id(x)`. This returns a number. Even in cases where you do want a
|
||||
string, use the `id` function, as it will simplify future code changes.
|
||||
In most contexts in JavaScript where a string is needed, you can pass a
|
||||
number without any explicit conversion.
|
||||
|
||||
### JavaScript `const` and `let`
|
||||
|
||||
Always declare JavaScript variables using `const` or `let` rather than
|
||||
`var`.
|
||||
|
||||
### JavaScript and TypeScript `for (i in myArray)`
|
||||
### Do not use `for...in` statements to traverse arrays
|
||||
|
||||
That construct pulls in properties inherited from the prototype chain.
|
||||
Don't use it:
|
||||
[[1]](https://stackoverflow.com/questions/500504/javascript-for-in-with-arrays),
|
||||
[[2]](https://google.github.io/styleguide/javascriptguide.xml#for-in_loop),
|
||||
[[3]](https://www.jslint.com/help.html#forin)
|
||||
|
||||
### Translation tags
|
||||
|
||||
Remember to
|
||||
[tag all user-facing strings for translation](../translating/translating.md), whether
|
||||
they are in HTML templates or JavaScript/TypeScript editing the HTML (e.g. error
|
||||
messages).
|
||||
|
||||
### Paths to state or log files
|
||||
|
||||
When writing out state or log files, always pass an absolute path
|
||||
through `zulip_path` (found in `zproject/computed_settings.py`), which
|
||||
will do the right thing in both development and production.
|
||||
|
||||
## JS array/object manipulation
|
||||
|
||||
For functions that operate on arrays or JavaScript objects, you should
|
||||
generally use modern
|
||||
[ECMAScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Language_Resources)
|
||||
primitives such as [`for … of`
|
||||
loops](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of),
|
||||
[`Array.prototype.{entries, every, filter, find, indexOf, map, some}`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array),
|
||||
[`Object.{assign, entries, keys, values}`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object),
|
||||
[spread
|
||||
syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax),
|
||||
and so on. Our Babel configuration automatically transpiles and
|
||||
polyfills these using [`core-js`](https://github.com/zloirock/core-js)
|
||||
when necessary. We used to use the
|
||||
[Underscore](https://underscorejs.org/) library, but that should be
|
||||
avoided in new code.
|
||||
|
||||
## More arbitrary style things
|
||||
|
||||
### Line length
|
||||
|
||||
We have an absolute hard limit on line length only for some files, but
|
||||
we should still avoid extremely long lines. A general guideline is:
|
||||
refactor stuff to get it under 85 characters, unless that makes the
|
||||
code a lot uglier, in which case it's fine to go up to 120 or so.
|
||||
|
||||
### JavaScript and TypeScript
|
||||
|
||||
Our JavaScript and TypeScript code is formatted with
|
||||
[Prettier](https://prettier.io/). You can ask Prettier to reformat
|
||||
all code via our [linter tool](../testing/linters.md) with
|
||||
`tools/lint --only=prettier --fix`. You can also [integrate it with your
|
||||
editor](https://prettier.io/docs/en/editors.html).
|
||||
|
||||
Combine adjacent on-ready functions, if they are logically related.
|
||||
|
||||
The best way to build complicated DOM elements is a Handlebars template
|
||||
like `web/templates/message_reactions.hbs`. For simpler things
|
||||
you can use jQuery DOM building APIs like so:
|
||||
|
||||
```js
|
||||
var new_tr = $('<tr />').attr('id', object.id);
|
||||
```
|
||||
|
||||
Passing a HTML string to jQuery is fine for simple hardcoded things
|
||||
that don't need internationalization:
|
||||
|
||||
```js
|
||||
foo.append('<p id="selected">/</p>');
|
||||
```
|
||||
|
||||
but avoid programmatically building complicated strings.
|
||||
|
||||
We used to favor attaching behaviors in templates like so:
|
||||
|
||||
```js
|
||||
<p onclick="select_zerver({{id}})">
|
||||
```
|
||||
|
||||
but there are some reasons to prefer attaching events using jQuery code:
|
||||
|
||||
- Potential huge performance gains by using delegated events where
|
||||
possible
|
||||
- When calling a function from an `onclick` attribute, `this` is not
|
||||
bound to the element like you might think
|
||||
- jQuery does event normalization
|
||||
|
||||
Either way, avoid complicated JavaScript code inside HTML attributes;
|
||||
call a helper function instead.
|
||||
|
||||
### HTML / CSS
|
||||
|
||||
Our CSS is formatted with [Prettier](https://prettier.io/). You can
|
||||
ask Prettier to reformat all code via our [linter
|
||||
tool](../testing/linters.md) with `tools/lint --only=prettier --fix`.
|
||||
You can also [integrate it with your
|
||||
editor](https://prettier.io/docs/en/editors.html).
|
||||
|
||||
Avoid using the `style=` attribute unless the styling is actually
|
||||
dynamic. Instead, define logical classes and put your styles in
|
||||
external CSS files such as `zulip.css`.
|
||||
|
||||
Don't use the tag name in a selector unless you have to. In other words,
|
||||
use `.foo` instead of `span.foo`. We shouldn't have to care if the tag
|
||||
type changes in the future.
|
||||
|
||||
Additionally, multi-word class and ID values should be hyphenated,
|
||||
also known as _kebab case_. In HTML, opt for `class="my-multiword-class"`,
|
||||
with its corresponding CSS selector as `.my-multiword-class`.
|
||||
|
||||
### Python
|
||||
|
||||
- Our Python code is formatted with
|
||||
[Black](https://github.com/psf/black) and
|
||||
[isort](https://pycqa.github.io/isort/). The [linter
|
||||
tool](../testing/linters.md) enforces this by running Black and
|
||||
isort in check mode, or in write mode with
|
||||
`tools/lint --only=black,isort --fix`. You may find it helpful to
|
||||
[integrate
|
||||
Black](https://black.readthedocs.io/en/stable/integrations/editors.html)
|
||||
and
|
||||
[isort](https://pycqa.github.io/isort/#installing-isorts-for-your-preferred-text-editor)
|
||||
with your editor.
|
||||
- Don't put a shebang line on a Python file unless it's meaningful to
|
||||
run it as a script. (Some libraries can also be run as scripts, e.g.
|
||||
to run a test suite.)
|
||||
- Scripts should be executed directly (`./script.py`), so that the
|
||||
interpreter is implicitly found from the shebang line, rather than
|
||||
explicitly overridden (`python script.py`).
|
||||
- Put all imports together at the top of the file, absent a compelling
|
||||
reason to do otherwise.
|
||||
- Unpacking sequences doesn't require list brackets:
|
||||
|
||||
```python
|
||||
[x, y] = xs # unnecessary
|
||||
x, y = xs # better
|
||||
```
|
||||
|
||||
- For string formatting, use `x % (y,)` rather than `x % y`, to avoid
|
||||
ambiguity if `y` happens to be a tuple.
|
||||
|
||||
### Tests
|
||||
|
||||
Clear, readable code is important for [tests](../testing/testing.md);
|
||||
familiarize yourself with our testing frameworks so that you can write
|
||||
clean, readable tests. Comments about anything subtle about what is
|
||||
being verified are appreciated.
|
||||
|
||||
### Third party code
|
||||
|
||||
See [our docs on dependencies](../subsystems/dependencies.md) for discussion of
|
||||
rules about integrating third-party projects.
|
||||
|
||||
@@ -7,7 +7,7 @@ makes the commit history a much more useful resource for developers
|
||||
trying to understand why the code works the way it does, which also
|
||||
helps a lot in preventing bugs.
|
||||
|
||||
Commits must be coherent:
|
||||
## Each commit must be coherent
|
||||
|
||||
- It should pass tests (so test updates needed by a change should be
|
||||
in the same commit as the original change, not a separate "fix the
|
||||
@@ -22,7 +22,7 @@ Commits must be coherent:
|
||||
- TODO comments should be in the commit that introduces the issue or
|
||||
the functionality with further work required.
|
||||
|
||||
Commits should generally be minimal:
|
||||
## Commits should generally be minimal
|
||||
|
||||
- Significant refactorings should be done in a separate commit from
|
||||
functional changes.
|
||||
@@ -34,7 +34,7 @@ Commits should generally be minimal:
|
||||
of somewhat dissimilar things that you did, you probably should have
|
||||
just done multiple commits.
|
||||
|
||||
When not to be overly minimal:
|
||||
### When not to be overly minimal
|
||||
|
||||
- For completely new features, you don't necessarily need to split out
|
||||
new commits for each little subfeature of the new feature. E.g., if
|
||||
@@ -46,7 +46,7 @@ When not to be overly minimal:
|
||||
- Don't bother to split backend commits from frontend commits, even
|
||||
though the backend can often be coherent on its own.
|
||||
|
||||
Other considerations:
|
||||
## Write a clean commit history
|
||||
|
||||
- Overly fine commits are easy to squash later, but not vice versa.
|
||||
So err toward small commits, and the code reviewer can advise on
|
||||
@@ -94,7 +94,7 @@ Commit messages have two parts:
|
||||
|
||||
In Zulip, commit summaries have a two-part structure:
|
||||
|
||||
1. A one or two word description of the part of the code base changed
|
||||
1. A one or two word description of the part of the codebase changed
|
||||
by the commit.
|
||||
2. A short sentence summarizing your changes.
|
||||
|
||||
@@ -148,7 +148,7 @@ scan commit messages to find what they need.
|
||||
Additional tips:
|
||||
|
||||
- Use lowercase (e.g., "settings", not "Settings").
|
||||
- If it's hard to find a 1-2 word description of the part of the code base
|
||||
- If it's hard to find a 1-2 word description of the part of the codebase
|
||||
affected by your commit, consider again whether you have structured your
|
||||
commits well.
|
||||
- Never use a generic term like "bug", "fix", or "refactor".
|
||||
@@ -167,7 +167,7 @@ a few rules to keep in mind:
|
||||
update tests/docs," would be better written as just, "Change X," since (as
|
||||
discussed above) _every_ commit is expected to update tests and documentation
|
||||
as needed.
|
||||
- Make it readable to someone who is familiar with Zulip's code base, but hasn't
|
||||
- Make it readable to someone who is familiar with Zulip's codebase, but hasn't
|
||||
been involved with the effort you're working on.
|
||||
- Use no more than 72 characters for the entire commit summary (parts 1 and 2).
|
||||
|
||||
@@ -279,6 +279,23 @@ might worry about it breaking.
|
||||
you developed this commit or pull request, like "First I tried X" or
|
||||
"I changed Y".
|
||||
|
||||
#### Mentioning other contributors
|
||||
|
||||
You can
|
||||
[credit](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors)
|
||||
co-authors on a commit by adding a `Co-authored-by:` line after a blank line at
|
||||
the end of your commit message:
|
||||
|
||||
Co-authored-by: Greg Price <greg@zulip.com>
|
||||
|
||||
You can also add other notes, such as `Reported-by:`, `Debugged-by:`, or
|
||||
`Suggested-by:`, but we don't typically do so.
|
||||
|
||||
**Never @-mention a contributor in a commit message**, as GitHub will turn this into
|
||||
a notification for the person every time a version of the commit is rebased and
|
||||
pushed somewhere. If you want to send someone a notification about a change,
|
||||
@-mention them in the PR thread.
|
||||
|
||||
#### Formatting guidelines
|
||||
|
||||
There are a few specific formatting guidelines to keep in mind:
|
||||
|
||||
@@ -14,7 +14,9 @@ commit-discipline
|
||||
code-style
|
||||
reviewable-prs
|
||||
code-reviewing
|
||||
review-process
|
||||
zulipbot-usage
|
||||
bug-reports
|
||||
reporting-bugs
|
||||
suggesting-features
|
||||
licensing
|
||||
```
|
||||
|
||||
155
docs/contributing/reporting-bugs.md
Normal file
155
docs/contributing/reporting-bugs.md
Normal file
@@ -0,0 +1,155 @@
|
||||
# Reporting bugs
|
||||
|
||||
The are several ways to report bugs (or possible bugs) you encounter in Zulip.
|
||||
|
||||
- If you have a concrete bug report with steps to reproduce the behavior, [file an
|
||||
issue](#filing-a-github-issue) in the appropriate GitHub repository.
|
||||
- If you are not sure whether the issue you encountered is a bug, or how to
|
||||
reproduce it, [start a
|
||||
conversation](#starting-a-conversation-about-a-possible-bug) in the Zulip
|
||||
development community.
|
||||
- To report a possible security issue, contact Zulip's security team at
|
||||
[security@zulip.com](mailto:security@zulip.com). _Do not_ report security issues
|
||||
publicly (in GitHub or in the Zulip development community). We create a CVE for
|
||||
every security issue in our released software.
|
||||
- If reporting a bug requires sharing private details about your
|
||||
organization, email [support@zulip.com](mailto:support@zulip.com).
|
||||
|
||||
No matter where you report the bug, please follow the instructions below for
|
||||
what to include in a bug report.
|
||||
|
||||
## What to include in a bug report
|
||||
|
||||
1. **Describe** what you were expecting to see, what you saw instead, and steps
|
||||
that may help others reproduce the surprising behavior you experienced.
|
||||
Include screenshots and/or screen captures (see [recommended
|
||||
tools](../tutorials/screenshot-and-gif-software.md)) if they help
|
||||
communicate what you are describing, but avoid posting long videos.
|
||||
1. Indicate the **[version](https://zulip.com/help/view-zulip-version)** of the
|
||||
Zulip app where you encountered the bug. It may also be helpful to note your
|
||||
operating system, whether you are using the web app or the desktop app, and
|
||||
your browser if using the web app.
|
||||
|
||||
## Filing a GitHub issue
|
||||
|
||||
Filing a GitHub issue works best when:
|
||||
|
||||
- You are confident that the behavior you encountered is a bug, not some quirk
|
||||
of how a feature works that may turn out to be intentional.
|
||||
- You can describe clearly what you were expecting to see, and what you saw instead.
|
||||
- You can provide steps for someone else to reproduce the issue you encountered.
|
||||
This is important for developers to be able to fix the bug, and test that
|
||||
their fix worked.
|
||||
|
||||
If all of the above accurately describe your situation, please file an issue!
|
||||
Otherwise, we recommend [starting a
|
||||
conversation](#starting-a-conversation-about-a-possible-bug) in the Zulip
|
||||
development community, so that the problem you encountered can be discussed
|
||||
interactively.
|
||||
|
||||
Steps and best practices for filing an issue:
|
||||
|
||||
1. Report the issue in the **appropriate [Zulip
|
||||
repository](https://github.com/zulip)**. The most commonly used repositories
|
||||
are:
|
||||
- [zulip/zulip](https://github.com/zulip/zulip/issues) for issues with the
|
||||
Zulip web app or server. A good default if you aren't sure which repository
|
||||
to use.
|
||||
- [zulip/zulip-mobile](https://github.com/zulip/zulip-mobile/issues) for
|
||||
issues with the mobile apps.
|
||||
- [zulip/zulip-desktop](https://github.com/zulip/zulip-desktop/issues) for
|
||||
issues that are specific to the Zulip desktop app, and _do not_ occur in
|
||||
the web app.
|
||||
- [zulip/zulip-terminal](https://github.com/zulip/zulip-terminal/issues) for
|
||||
issues with the terminal app.
|
||||
2. Do a **quick search** of the repository to see if your issue has already
|
||||
been filed. If it has, you can add a comment if that seems helpful.
|
||||
3. If you are aware of a related discussion in the Zulip development community,
|
||||
please **cross-link** between the issue and the discussion thread. [Link to a
|
||||
specific
|
||||
message](https://zulip.com/help/link-to-a-message-or-conversation#get-a-link-to-a-specific-message)
|
||||
in the discussion thread, as message links will still work even if the topic is
|
||||
renamed or resolved.
|
||||
|
||||
To encourage prompt attention and discussion for a bug report you have filed,
|
||||
you can send a message in the Zulip development community with the key points
|
||||
from your report. Be sure to [link to the GitHub
|
||||
issue](https://zulip.com/development-community/#linking-to-github-issues-and-pull-requests).
|
||||
See the following section for advice on where and how to start the conversation.
|
||||
|
||||
## Starting a conversation about a possible bug
|
||||
|
||||
If you are not sure whether the issue you encountered is a bug, or how to
|
||||
reproduce it, we highly recommend reporting it in the [Zulip development
|
||||
community](https://zulip.com/development-community/). It's the best place to
|
||||
interactively discuss your problem.
|
||||
|
||||
Steps and best practices for starting a conversation:
|
||||
|
||||
1. [**Join** the Zulip development
|
||||
community](https://zulip.com/development-community/) if you don't already
|
||||
have an account.
|
||||
2. Pick an **appropriate stream** to report your issue:
|
||||
- [#issues](https://chat.zulip.org/#narrow/stream/9-issues) for issues with
|
||||
the Zulip web app or server. A good default if you aren't sure which stream
|
||||
to use.
|
||||
- [#mobile](https://chat.zulip.org/#narrow/stream/48-mobile) for issues with
|
||||
the mobile apps.
|
||||
- [#desktop](https://chat.zulip.org/#narrow/stream/16-desktop) for issues
|
||||
that are specific to the Zulip desktop app, and _do not_ occur in the web
|
||||
app.
|
||||
- [#zulip-terminal](https://chat.zulip.org/#narrow/stream/206-zulip-terminal)
|
||||
for issues with the terminal app.
|
||||
- [#production
|
||||
help](https://chat.zulip.org/#narrow/stream/31-production-help) for issues
|
||||
related to self-hosting Zulip. See the [troubleshooting
|
||||
guide](../production/troubleshooting.md) for additional details.
|
||||
3. **[Start a new topic](https://zulip.com/help/starting-a-new-topic)** for
|
||||
discussing your issue, using a brief summary of the issue as the name of the topic.
|
||||
|
||||
If you aren't sure where to post or how to name your topic, don't worry!
|
||||
Moderators can always rename the topic, or move the thread to another stream.
|
||||
|
||||
Once a possible bug is reported, members of the development community will jump
|
||||
in to discuss whether the report constitutes a bug, how to reproduce it, and how
|
||||
it can be resolved. The initial reporter can help by monitoring the discussion,
|
||||
and replying to any follow-up questions. If the report is determined to be a
|
||||
reproducible bug, a GitHub issue will be filed to keep track of it (see below).
|
||||
|
||||
## Managing bug reports
|
||||
|
||||
This section describes our bug management process. All community members are
|
||||
encouraged to help make sure things run smoothly, whether or not they originally
|
||||
reported the bug.
|
||||
|
||||
Whenever a bug is tracked in GitHub and also discussed in the development
|
||||
community, be sure to cross-link between the issue and the conversation. [Link
|
||||
to a specific
|
||||
message](https://zulip.com/help/link-to-a-message-or-conversation#get-a-link-to-a-specific-message)
|
||||
in the discussion thread, as message links will still work even if the topic is
|
||||
renamed or resolved.
|
||||
|
||||
- If you encounter a definite bug with a clear reproducer and significant user
|
||||
impact, it is best to both file a GitHub issue, and immediately start a
|
||||
discussion in the development community. This helps us address important
|
||||
issues as quickly as possible.
|
||||
- For minor bugs (e.g., a visual glitch in a settings menu for very long stream
|
||||
names), filing a GitHub issue is sufficient.
|
||||
- If a potential bug discussed in the development community is confirmed to be
|
||||
an actual, reproducible bug, anyone can help out by filing a GitHub issue to
|
||||
track it:
|
||||
- In some cases, especially if we're planning to fix the issue right away, the
|
||||
issue description can be a quote from a message with a link to the
|
||||
discussion -- no need to stress over making it perfect.
|
||||
- [Use Zulipbot](../contributing/zulipbot-usage.md) to add the appropriate
|
||||
labels, including “bug” and at least one area label; leave a comment if you
|
||||
don't know what area labels to use.
|
||||
- You can add the “help wanted” label (and claim the issue if you like) if
|
||||
that is appropriate based on the discussion. Note that sometimes we won't
|
||||
mark a reproducible bug as “help wanted”, e.g., if we want a core
|
||||
contributor to take it on, if the fix will happen as part of a larger
|
||||
project, etc.
|
||||
- Don't forget to cross-link between the issue and the discussion.
|
||||
- If a bug report in GitHub is not sufficiently clear, Zulip maintainers will
|
||||
often encourage the reporter to discuss it interactively in the development
|
||||
community.
|
||||
178
docs/contributing/review-process.md
Normal file
178
docs/contributing/review-process.md
Normal file
@@ -0,0 +1,178 @@
|
||||
# Pull request review process
|
||||
|
||||
Pull requests submitted to Zulip go through a rigorous review process, which is
|
||||
designed to ensure that we are building a high-quality product with a
|
||||
maintainable codebase. This page describes the stages of review your pull
|
||||
request may go through, and offers guidance on how you can help keep your pull
|
||||
request moving along.
|
||||
|
||||
## Prepare your pull request
|
||||
|
||||
Beyond writing the code, you will need to prepare your work to make it as easy
|
||||
as possible for others to review. When you believe your code is ready, follow the [guide on how to review
|
||||
code](../contributing/code-reviewing.md#how-to-review-code)
|
||||
to review your own work. You can often find things you missed by taking a step
|
||||
back to look over your work before asking others to do so. Catching mistakes
|
||||
yourself will help your PRs be merged faster, and folks will appreciate the
|
||||
quality and professionalism of your work.
|
||||
|
||||
Be sure to take a careful look at your commit structure and commit messages, and
|
||||
do your best to follow Zulip's [commit
|
||||
guidelines](../contributing/commit-discipline.md). This makes it much easier for
|
||||
code reviewers to spot bugs, so if your PR does not follow the guidelines,
|
||||
reviewers will ask you to restructure it prior to going through the code.
|
||||
|
||||
## Submit your pull request for review
|
||||
|
||||
If you are new to Git, see our guide on [making a pull
|
||||
request][git-guide-make-pr] for detailed technical instructions on how to submit
|
||||
a pull request. When submitting your PR, you will need to:
|
||||
|
||||
- Clearly describe the work you are submitting. Make sure the pull request
|
||||
template is filled out correctly, and that all the relevant points on the
|
||||
self-review checklist (if the repository has one) have been addressed. See the
|
||||
[reviewable pull requests](../contributing/reviewable-prs.md) guide for
|
||||
advice.
|
||||
|
||||
- If you have a question that you expect to be resolved during the review
|
||||
process, put it in a PR comment attached to a relevant part of the changes.
|
||||
The review process will go a lot more smoothly if points of uncertainty
|
||||
are explicitly laid out.
|
||||
|
||||
- Make sure that the pull request passes all CI tests. You can sometimes
|
||||
request initial feedback if there are open questions that will impact how
|
||||
you update the tests. But in general, maintainers will wait for your PR to
|
||||
pass tests before reviewing your work.
|
||||
|
||||
If any part of your contribution is from someone else (code
|
||||
snippets, images, sounds, or any other copyrightable work, modified or
|
||||
unmodified), be sure to review the instructions on how to [properly
|
||||
attribute][licensing] the work.
|
||||
|
||||
If your PR was not ready for review when
|
||||
you first posted it (e.g., because it was failing tests, or you
|
||||
weren't done working through the self-review checklist), notify maintainers when
|
||||
you'd like them to take a look by posting a quick "Ready for review!" comment on
|
||||
the main GitHub thread for your PR.
|
||||
|
||||
[git-guide-make-pr]: ../git/pull-requests.md
|
||||
[licensing]: ../contributing/licensing.md
|
||||
|
||||
### Draft pull requests
|
||||
|
||||
If it helps your workflow, you can submit your pull request marked as
|
||||
a [draft][github-help-draft-pr] while you're still working on it. When ready for
|
||||
review:
|
||||
|
||||
1. Make sure your PR is no longer marked as a [draft][github-help-draft-pr], and
|
||||
doesn't have "WIP" in the title.
|
||||
|
||||
1. Post a quick "Ready for review!" comment on the main GitHub thread for your
|
||||
PR.
|
||||
|
||||
[github-help-draft-pr]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests
|
||||
|
||||
## Labels for managing the stages of pull request review
|
||||
|
||||
In the Zulip server/web app repository
|
||||
([`zulip/zulip`](https://github.com/zulip/zulip/)), we use GitHub labels to help
|
||||
everyone understand where a pull request is in the review process. These labels
|
||||
are noted below, alongside their corresponding pull-request stage. Each label is
|
||||
removed by the reviewer for that stage when they have no more feedback on the PR
|
||||
and consider it ready for the next stage of review.
|
||||
|
||||
Sometimes, a label may also be removed because significant changes by
|
||||
the contributor are required before the PR ready to be reviewed again. In that
|
||||
case, the contributor should post a comment mentioning the reviewer when the
|
||||
changes have been completed, unless the reviewer requested some other action.
|
||||
|
||||
## Stages of a pull request review
|
||||
|
||||
This section describes the stages of the pull request review process. Each stage
|
||||
may require several rounds of iteration. Don't feel daunted! Not every PR will
|
||||
require all the stages described, and the process often goes quite quickly for
|
||||
smaller changes that are clearly explained.
|
||||
|
||||
1. **Product review.** Oftentimes, seeing an initial implementation will make it
|
||||
clear that the product design for a feature needs to be revised, or that
|
||||
additional changes are needed. The reviewer may therefore ask you to amend or
|
||||
change the implementation. Some changes may be blockers for getting the PR
|
||||
merged, while others may be improvements that can happen afterwards. Feel
|
||||
free to ask if it's unclear which type of feedback you're getting.
|
||||
(Follow-ups can be a great next issue to work on!)
|
||||
|
||||
Your PR might be assigned the [product
|
||||
review](https://github.com/zulip/zulip/pulls?q=is%3Aopen+is%3Apr+label%3A%22product+review%22)
|
||||
label at this stage, or later in the review process as questions come up. You
|
||||
can also add this label yourself if appropriate. If doing so, be sure to
|
||||
clearly outline the product questions that need to be addressed.
|
||||
|
||||
2. **QA.** If your PR makes user-facing changes, it may get a round of testing
|
||||
without reference to the code. You will get feedback on any user-facing bugs
|
||||
in the implementation. To minimize the number of review round-trips, make
|
||||
sure to [thoroughly test](../contributing/code-reviewing.md#manual-testing)
|
||||
your own PR prior to asking for review.
|
||||
|
||||
Your PR might be assigned the [QA
|
||||
needed](https://github.com/zulip/zulip/pulls?q=is%3Aopen+is%3Apr+label%3A%22QA+needed%22)
|
||||
label at this stage, or later on if re-testing is required.
|
||||
|
||||
3. **Initial code review.** All PRs will go through one or more rounds of code
|
||||
review. Your code may initially be [reviewed by other
|
||||
contributors](../contributing/code-reviewing.md). This helps us make good use
|
||||
of project maintainers' time, and helps you make progress on the PR by
|
||||
getting quick feedback. A project maintainer may leave a comment asking
|
||||
someone with expertise in the area you're working on to review your work.
|
||||
|
||||
4. **Maintainer code review.** In this phase, a Zulip maintainer will do a
|
||||
thorough review of your proposed code changes. Your PR may be assigned the
|
||||
[maintainer
|
||||
review](https://github.com/zulip/zulip/pulls?q=is%3Aopen+is%3Apr+label%3A%22maintainer+review%22)
|
||||
label at this stage.
|
||||
|
||||
5. **Documentation review.** If your PR includes documentation changes, those
|
||||
changes will require review. This generally happens fairly late in the review
|
||||
process, once the UI and the code are unlikely to undergo major changes.
|
||||
Maintainers may indicate that a PR is ready for documentation review by
|
||||
adding a [help center
|
||||
review](https://github.com/zulip/zulip/pulls?q=is%3Aopen+is%3Apr+label%3A%22help+center+review%22)
|
||||
and/or [api docs
|
||||
review](https://github.com/zulip/zulip/pulls?q=is%3Aopen+is%3Apr+label%3A%22api+docs+review%22)
|
||||
label, and mentioning a documentation maintainer in the comments.
|
||||
|
||||
6. **Integration review**. This is the final round of the review process,
|
||||
generally done by `@timabbott` for server and web app PRs. A maintainer will
|
||||
usually assign the [integration
|
||||
review](https://github.com/zulip/zulip/pulls?q=is%3Aopen+is%3Apr+label%3A%22integration+review%22)
|
||||
label when the PR is ready for this phase.
|
||||
|
||||
## How to help move the review process forward
|
||||
|
||||
If there are no comments on your PR for a week after you submit it, you can
|
||||
check again to make sure that it's ready for review, and then post a quick
|
||||
comment to remind Zulip's maintainers to take a look at your work. Consider also
|
||||
[asking for a
|
||||
review](../contributing/code-reviewing.md#asking-for-a-code-review) in the Zulip
|
||||
development community.
|
||||
|
||||
After that, the key to keeping your review moving through the review process is to:
|
||||
|
||||
- Address _all_ the feedback to the best of your ability.
|
||||
- Make it clear when the requested changes have been made
|
||||
and you believe it's time for another look.
|
||||
- Make it as easy as possible to review the changes you made.
|
||||
|
||||
In order to do this, when you believe you have addressed the previous round of
|
||||
feedback on your PR as best you can, post a comment asking reviewers to take
|
||||
another look. Your comment should make it easy to understand what has been done
|
||||
and what remains by:
|
||||
|
||||
- Summarizing the changes made since the last review you received.
|
||||
- Highlighting remaining questions or decisions, with links to any relevant
|
||||
threads in the [Zulip development
|
||||
community](https://zulip.com/development-community/).
|
||||
- Providing updated screenshots and information on manual testing if
|
||||
appropriate.
|
||||
|
||||
The easier it is to review your work, the more likely you are to receive quick
|
||||
feedback.
|
||||
@@ -3,7 +3,9 @@
|
||||
This page offers some tips for making your pull requests easy to review.
|
||||
Following this advice will help the whole Zulip project move more quickly by
|
||||
saving maintainers time when they review your code. It will also make a big
|
||||
difference for getting your work integrated without delay.
|
||||
difference for getting your work integrated without delay. For a detailed
|
||||
overview of Zulip's PR review process, see the [pull request review
|
||||
process](../contributing/review-process.md) guide.
|
||||
|
||||
## Posting a pull request
|
||||
|
||||
|
||||
87
docs/contributing/suggesting-features.md
Normal file
87
docs/contributing/suggesting-features.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# Suggesting features and improvements
|
||||
|
||||
If you have ideas for how to make Zulip better, we'd love to hear from you! Many
|
||||
improvements start with a user's suggestion. The best way to suggest a feature
|
||||
or an improvement is by starting a conversation in the [Zulip development
|
||||
community](https://zulip.com/development-community/). It's a great way to engage
|
||||
interactively with members of the community, and explore how best to improve
|
||||
Zulip for you and other users.
|
||||
|
||||
Usually, if the discussion leads to a concrete proposal, Zulip's product team
|
||||
will follow up by filing a GitHub issue to track the idea. Many conversations do
|
||||
not immediately lead to a GitHub issue, and that's OK! Sometimes the time is not
|
||||
right to pin down a plan, or more ideas need to come in before a great proposal
|
||||
emerges. Regardless of whether a discussion results in immediate action, we
|
||||
appreciate the time everyone takes to make suggestions and brainstorm ideas.
|
||||
|
||||
## What to include in your proposal
|
||||
|
||||
- Describe your idea. It's absolutely fine to bring up a problem without
|
||||
suggesting a concrete solution.
|
||||
- Provide context on how the change you are proposing would help you or your
|
||||
organization. It is often helpful to describe how you are using Zulip (e.g.,
|
||||
"I work at a small startup", or "I'm teaching a class"). This lets us combine
|
||||
our Zulip expertise with your requirements to come up with a great design for
|
||||
a feature.
|
||||
- If you are aware of a related issue in GitHub or a prior conversation in the
|
||||
development community, please include a link.
|
||||
|
||||
## Starting a conversation about a suggested feature or improvement
|
||||
|
||||
Steps and best practices for starting a conversation:
|
||||
|
||||
1. [**Join** the Zulip development
|
||||
community](https://zulip.com/development-community/) if you don't already
|
||||
have an account.
|
||||
2. Pick an **appropriate stream** to report your issue:
|
||||
- [#feedback](https://chat.zulip.org/#narrow/stream/137-feedback) for suggestions for
|
||||
the Zulip web app or server. A good default if you aren't sure which stream
|
||||
to use.
|
||||
- [#mobile](https://chat.zulip.org/#narrow/stream/48-mobile) for suggestions
|
||||
for the mobile apps.
|
||||
- [#desktop](https://chat.zulip.org/#narrow/stream/16-desktop) for suggestions
|
||||
that are specific to the Zulip desktop app.
|
||||
- [#zulip-terminal](https://chat.zulip.org/#narrow/stream/206-zulip-terminal)
|
||||
for suggestions for the terminal app.
|
||||
- [#production
|
||||
help](https://chat.zulip.org/#narrow/stream/31-production-help) for suggestions
|
||||
related to self-hosting Zulip.
|
||||
3. **[Start a new topic](https://zulip.com/help/starting-a-new-topic)** for
|
||||
discussing your suggestions, using a brief summary of the proposal as the
|
||||
name of the topic.
|
||||
|
||||
If you aren't sure where to post or how to name your topic, don't worry!
|
||||
Moderators can always rename the topic, or move the thread to another stream.
|
||||
|
||||
Members of the development community will jump in to discuss your idea. You can
|
||||
help by participating in the discussion, including replying to any follow-up
|
||||
questions, and helping develop the proposal. The discussion may conclude with an
|
||||
issue being filed in GitHub to track the plan that was developed.
|
||||
|
||||
## Filing a GitHub issue
|
||||
|
||||
Filing a GitHub issue can be effective when you have a very specific proposal
|
||||
for a feature or improvement. Steps and best practices for filing an issue:
|
||||
|
||||
1. File the issue in the **appropriate [Zulip
|
||||
repository](https://github.com/zulip)**. The most commonly used repositories
|
||||
are:
|
||||
- [zulip/zulip](https://github.com/zulip/zulip/issues) for suggestions for the
|
||||
Zulip web app or server. A good default if you aren't sure which repository
|
||||
to use.
|
||||
- [zulip/zulip-mobile](https://github.com/zulip/zulip-mobile/issues) for
|
||||
suggestions for the mobile apps.
|
||||
- [zulip/zulip-desktop](https://github.com/zulip/zulip-desktop/issues) for
|
||||
suggestions that are specific to the Zulip desktop app.
|
||||
- [zulip/zulip-terminal](https://github.com/zulip/zulip-terminal/issues) for
|
||||
suggestions for the terminal app.
|
||||
2. Do a **quick search** of the repository to see if there is already a similar
|
||||
request. If there is, add a comment explaining why you would also appreciate
|
||||
the proposed change, and making any additional suggestions. Do not file a new
|
||||
issue.
|
||||
3. If you are aware of a related discussion in the Zulip development community,
|
||||
please **cross-link** between the issue and the discussion thread. [Link to a
|
||||
specific
|
||||
message](https://zulip.com/help/link-to-a-message-or-conversation#get-a-link-to-a-specific-message)
|
||||
in the discussion thread, as message links will still work even if the topic is
|
||||
renamed or resolved.
|
||||
@@ -20,7 +20,7 @@ host by following these instructions. Currently supported platforms
|
||||
are:
|
||||
|
||||
- Ubuntu 20.04, 22.04
|
||||
- Debian 11
|
||||
- Debian 11, 12
|
||||
- CentOS 7 (beta)
|
||||
- Fedora 33 and 34 (beta)
|
||||
- RHEL 7 (beta)
|
||||
|
||||
@@ -51,7 +51,7 @@ a proxy to access the internet.)
|
||||
[GitHub account](#step-0-set-up-git--github).
|
||||
- **macOS**: macOS (10.11 El Capitan or newer recommended)
|
||||
- **Ubuntu LTS**: 20.04 or 22.04
|
||||
- **Debian**: 11
|
||||
- **Debian**: 11 or 12
|
||||
- **Fedora**: tested for 36
|
||||
- **Windows**: Windows 64-bit (Win 10 recommended), hardware
|
||||
virtualization enabled (VT-x or AMD-V), administrator access.
|
||||
|
||||
@@ -66,7 +66,7 @@ Git workflow, or if you'd like a Git refresher.
|
||||
[zulip-rtd-commit-discipline]: ../contributing/commit-discipline.md
|
||||
[zulip-rtd-commit-messages]: ../contributing/commit-discipline.md
|
||||
[zulip-rtd-dev-overview]: ../development/overview.md
|
||||
[zulip-rtd-lint-tools]: ../contributing/code-style.md#lint-tools
|
||||
[zulip-rtd-lint-tools]: ../contributing/code-style.md#use-the-linters
|
||||
[zulip-rtd-mypy]: ../testing/mypy.md
|
||||
[zulip-rtd-testing]: ../testing/testing.md
|
||||
[zulip-rtd-zulip-tools]: zulip-tools.md
|
||||
|
||||
@@ -1,15 +1,69 @@
|
||||
# Version history
|
||||
|
||||
This page the release history for the Zulip server. See also the
|
||||
[Zulip release lifecycle](../overview/release-lifecycle.md).
|
||||
This page contains the release history for the Zulip 7.x stable
|
||||
release series. See the [current Zulip changelog][latest-changelog]
|
||||
for newer release series, or the [commit log][commit-log] for an
|
||||
up-to-date list of all changes.
|
||||
|
||||
## Zulip 7.x series
|
||||
|
||||
### 7.0-beta2 -- 2023-05-11
|
||||
### 7.2 -- 2023-07-05
|
||||
|
||||
This section is an incomplete draft of the release notes for the next
|
||||
major release, and is only updated occasionally. See the [commit
|
||||
log][commit-log] for an up-to-date list of all changes.
|
||||
- Started logging a more accurate, detailed, and actionable error messages when
|
||||
[common reverse proxy mis-configurations][proxies] are detected.
|
||||
|
||||
- Improved [reverse proxy documentation][proxies] to clarify that trust of
|
||||
`X-Fowarded-Proto` is also necessary.
|
||||
|
||||
- Removed [reverse proxy][proxies] nginx configuration files when the
|
||||
[`loadbalancer.ips`](../production/deployment.md#ips)
|
||||
setting has been unset.
|
||||
- Improved error-handling of scheduled emails, so they cannot attempt infinite
|
||||
deliveries of a message with no recipients.
|
||||
- Fixed a bug with the
|
||||
[PGroonga integration](../subsystems/full-text-search.md#multi-language-full-text-search)
|
||||
that would cause the PostgreSQL server to crash when a search was run.
|
||||
- Fixed a bug that would cause some messages not to be marked as read.
|
||||
- Fixed a bug that still shoed file-upload banners after re-opening the compose
|
||||
box.
|
||||
- Fixed a bug that prevented file uploads with very unusual file names.
|
||||
- Adjusted the bot icon to make it more visible on the light theme.
|
||||
- Fixed minor rendering issues on the “press enter to send” indicator.
|
||||
- Fixed the scrollbar behavior on the stream settings page.
|
||||
- Improved error reporting when a Slack token fails to validate during
|
||||
[import](https://zulip.com/help/import-from-slack#export-your-slack-data),
|
||||
such as a token having too few permissions.
|
||||
- Added support for IPv6
|
||||
[nameservers in the nginx configuration](../production/deployment.md#nameserver).
|
||||
- Updated translations.
|
||||
|
||||
[proxies]: ../production/deployment.md#configuring-zulip-to-trust-proxies
|
||||
|
||||
### 7.1 -- 2023-06-13
|
||||
|
||||
- Added checks to check that Zulip is being installed on a
|
||||
[supported CPU and OS architecture](../production/requirements.md).
|
||||
- Improved error-handling around the
|
||||
[`upgrade-postgresql`](../production/upgrade.md#upgrading-postgresql)
|
||||
tool.
|
||||
- Fixed a couple bugs in database migrations as part of the upgrade that could
|
||||
cause the upgrade to fail to complete.
|
||||
- Fixed a bug where
|
||||
[scheduled messages](https://zulip.com/help/schedule-a-message) with `@all`
|
||||
would fail to send.
|
||||
- Fixed a bug which would sometimes cause the `j` and `k` keys to not be able to
|
||||
be typed in the compose box.
|
||||
- Fixed anonymous access to the “download” link on images in
|
||||
[public-access streams](https://zulip.com/help/public-access-option).
|
||||
- Changed the default DNS resolver in nginx’s configuration to match the
|
||||
system’s; this fixes deployments which use the
|
||||
[S3 storage backend](../production/upload-backends.md)
|
||||
and did not run `systemd-resolved`, like Docker and some versions of Debian.
|
||||
- Updated several pieces of documentation.
|
||||
- Updated translations, including new translations for Luri (Bakhtiari),
|
||||
Brazilian Portuguese, and Tagalog.
|
||||
|
||||
### 7.0 -- 2023-05-31
|
||||
|
||||
#### Highlights
|
||||
|
||||
@@ -37,12 +91,15 @@ log][commit-log] for an up-to-date list of all changes.
|
||||
email address should be shared with other users in the organization;
|
||||
previously this was solely controlled by organization
|
||||
administrators. This is presented to the user during account
|
||||
creation.
|
||||
creation, including for users imported from other chat products.
|
||||
- Added support for the upcoming Debian 12 release.
|
||||
|
||||
#### Full feature changelog
|
||||
|
||||
- Added full support for using JWT authentication to integrate Zulip
|
||||
with another application.
|
||||
- Added support for SAML Single-Logout initiated by the Zulip server
|
||||
(SP-initiated Single Logout).
|
||||
- Added new stream setting controlling which users can remove other
|
||||
subscribers from the stream.
|
||||
- Added new setting to control when messages are marked as read when
|
||||
@@ -52,8 +109,6 @@ log][commit-log] for an up-to-date list of all changes.
|
||||
- Added additional confirmation dialogs for actions deserving caution,
|
||||
including marking all messages as read, removing the last user from a
|
||||
private stream, and disabling all notifications for direct messages.
|
||||
- Added support for deployment hooks to be run whenever the Zulip
|
||||
server is upgraded.
|
||||
- Added support for Postgres 15, and removed support for Postgres 11.
|
||||
- Added new `z` keyboard shortcut to view a message in context.
|
||||
- Added new `=` keyboard shortcut to upvote an existing emoji reaction.
|
||||
@@ -65,6 +120,8 @@ log][commit-log] for an up-to-date list of all changes.
|
||||
- Improved left sidebar to show more topics within the current stream,
|
||||
and more private message converations, especially when many are
|
||||
unread.
|
||||
- Reworked the internals of the main message feed scrollbar, fixing
|
||||
several longstanding bugs.
|
||||
- Improved many interaction details in the settings subsystem,
|
||||
including how files are uploaded, hover behaviors, etc.
|
||||
- Improved the logged out experience to suggest logging in to see more
|
||||
@@ -79,6 +136,7 @@ log][commit-log] for an up-to-date list of all changes.
|
||||
- Improved subject lines for email notifications in topics that have
|
||||
been resolved so that email clients will thread them with the
|
||||
pre-resolution topic.
|
||||
- Improved how the Slack data import tool handles Slack threads.
|
||||
- Improved the Slack incoming integration's handling of fancier Slack
|
||||
syntax.
|
||||
- Improved notification format for most Git integrations.
|
||||
@@ -110,6 +168,8 @@ log][commit-log] for an up-to-date list of all changes.
|
||||
files that are no longer used in a message was not running in cron.
|
||||
- Fixed noticeable lag when marking messages as unread in the web app.
|
||||
- Fixed a bug that could cause duplicate mobile push notifications.
|
||||
- Fixed several error handling issues with the data export process.
|
||||
- Fixed several subtle issues affecting certain container runtimes.
|
||||
- Added support for configurable hooks to be run when upgrading the
|
||||
Zulip server.
|
||||
- Added support for using TLS to secure the RabbitMQ connection.
|
||||
@@ -154,9 +214,67 @@ log][commit-log] for an up-to-date list of all changes.
|
||||
- PostgreSQL 11 is no longer supported; if you are currently using it, you will
|
||||
need to [upgrade PostgreSQL](../production/upgrade.md#upgrading-postgresql)
|
||||
before upgrading Zulip.
|
||||
- Installations that deploy Zulip behind a [reverse proxy][reverse-proxy-docs]
|
||||
should make sure the proxy is configured to set the `X-Forwarded-Proto` HTTP
|
||||
header, and that [`loadbalancer.ips` is accurate][loadbalancer-ips] for the
|
||||
reverse proxy's IP; the documentation has updated its example configurations.
|
||||
- Zulip's Twitter preview integration has been disabled due to Twitter
|
||||
desupporting the API that it relied on.
|
||||
|
||||
[reverse-proxy-docs]: ../production/deployment.md#putting-the-zulip-application-behind-a-reverse-proxy
|
||||
[loadbalancer-ips]: ../production/deployment.md#configuring-zulip-to-trust-proxies
|
||||
|
||||
## Zulip 6.x series
|
||||
|
||||
### 6.2 -- 2023-05-19
|
||||
|
||||
- CVE-2023-28623: Fixed a vulnerability that would allow users to sign up for a
|
||||
Zulip Server account with an unauthorized email address, despite the server
|
||||
being configured to require that email addresses be in LDAP. Specifically, if
|
||||
the organization permissions don't require invitations to join, and the only
|
||||
configured authentication backends were `ZulipLDAPAuthBackend` and some other
|
||||
external authentication backend (any aside from `ZulipLDAPAuthBackend` and
|
||||
`EmailAuthBackend`), then an unprivileged remote attacker could have created a
|
||||
new account in the organization with an arbitrary email address in their
|
||||
control that was not in the organization's LDAP directory.
|
||||
- CVE-2023-32677: Fixed a vulnerability which allowed users to invite new users
|
||||
to streams when inviting them to the server, even if they did not have
|
||||
[permission to invite existing users to streams](https://zulip.com/help/configure-who-can-invite-to-streams).
|
||||
This did not allow users to invite others to streams that they themselves were
|
||||
not a member of, and only affected deployments with the rare configuration of
|
||||
a permissive
|
||||
[realm invitation policy](https://zulip.com/help/restrict-account-creation#change-who-can-send-invitations)
|
||||
and a strict
|
||||
[stream invitation policy](https://zulip.com/help/configure-who-can-invite-to-streams).
|
||||
- Fixed a bug that could cause duplicate push notifications when using the
|
||||
mobile push notifications service.
|
||||
- Fixed several bugs in the Zulip server and PostgreSQL version upgrade
|
||||
processes.
|
||||
- Fixed multiple Recent conversations display bugs for private message
|
||||
conversations.
|
||||
- Fixed the left sidebar stream list exiting “more topics” during background
|
||||
re-rendering, and a related rendering bug.
|
||||
- Fixed a bug where uploaded files sent via the email gateway were not correctly
|
||||
associated with the message’s sender.
|
||||
- Improved error handling for certain puppet failures.
|
||||
- Silenced a distracting `caniuse browserlist` warning in install/upgrade
|
||||
output.
|
||||
- Simplified UI for inviting new users to make it easy to select the default
|
||||
streams.
|
||||
- Fixed GPG check error handling for PGroonga apt repository.
|
||||
- Documented how to manage email address changes when using the LDAP backend.
|
||||
- Documented how to use SMTP without authentication.
|
||||
- Documented that the Zulip mobile/desktop apps now only support Zulip Server
|
||||
4.0 and newer (released 22 months ago), following our 18-month support policy.
|
||||
- Extracted the documentation on modifying Zulip to a dedicated page.
|
||||
- Added a new `send_welcome_bot_message` management command, to allow the
|
||||
sysadmin to send Welcome Bot messages manually after a data import.
|
||||
- Added new `RABBITMQ_USE_TLS` and `RABBITMQ_PORT` settings for installations
|
||||
wanting to configure the RabbitMQ connection with a remote RabbitMQ host.
|
||||
- Added a new `timesync` deployment option to allow installations to override
|
||||
Zulip’s default of `chrony` for time synchronization.
|
||||
- Upgraded dependencies for security and bug fixes.
|
||||
|
||||
### 6.1 -- 2023-01-23
|
||||
|
||||
- Fixed a bug that caused the web app to not load on Safari 13 and lower;
|
||||
@@ -3144,7 +3262,7 @@ running a version from before 1.7 should upgrade directly to 1.7.1.
|
||||
This section links to the upgrade notes from past releases, so you can
|
||||
easily read them all when upgrading across multiple releases.
|
||||
|
||||
- [Draft upgrade notes for 7.0](#upgrade-notes-for-70)
|
||||
- [Upgrade notes for 7.0](#upgrade-notes-for-70)
|
||||
- [Upgrade notes for 6.0](#upgrade-notes-for-60)
|
||||
- [Upgrade notes for 5.0](#upgrade-notes-for-50)
|
||||
- [Upgrade notes for 4.0](#upgrade-notes-for-40)
|
||||
|
||||
@@ -60,12 +60,12 @@ the Zulip server itself (E.g. `https://zulip.example.com/help/`).
|
||||
Many Zulip servers run versions from Git that have not been published
|
||||
in a stable release.
|
||||
|
||||
- [Zulip Cloud](https://zulip.com) essentially runs the `main`
|
||||
branch. It is usually a few days behind `main` (with some
|
||||
cherry-picked bug fixes), but can fall up to 2 weeks behind when
|
||||
major UI or internals changes mean we'd like to bake changes longer
|
||||
on chat.zulip.org before exposing them to the full Zulip Cloud
|
||||
userbase.
|
||||
- [Zulip Cloud](https://zulip.com) runs the `zulip-cloud-current`
|
||||
branch; this the `main` branch, with some cherry-picked bug fixes,
|
||||
but delayed somewhat. It is usually one to two weeks behind `main`,
|
||||
depending on the complexity of recent major UI or internals changes
|
||||
that we'd like to bake longer on chat.zulip.org before exposing them
|
||||
to the full Zulip Cloud userbase.
|
||||
- [chat.zulip.org][chat-zulip-org], the bleeding-edge server for the
|
||||
Zulip development community, is upgraded to `main` several times
|
||||
every week. We also often "test deploy" changes not yet in `main`
|
||||
@@ -176,15 +176,15 @@ The Zulip community feels strongly that all the little issues are, in
|
||||
aggregate, just as important as the big things. Most resolved issues
|
||||
do not have any of these priority labels.
|
||||
|
||||
We welcome participation from our user community in influencing the
|
||||
Zulip roadmap. If a bug or missing feature is causing significant
|
||||
pain for you, we'd love to hear from you, either in
|
||||
We welcome participation from our user community in influencing the Zulip
|
||||
roadmap. If a bug or missing feature is causing significant pain for you, we'd
|
||||
love to hear from you, either in
|
||||
[chat.zulip.org](https://zulip.com/development-community/) or on the relevant
|
||||
GitHub issue. Please an include an explanation of your use case: such
|
||||
details can be extremely helpful in designing appropriately general
|
||||
solutions, and also helps us identify cases where an existing solution
|
||||
can solve your problem. See [Reporting
|
||||
issues](../contributing/contributing.md#reporting-issues) for more details.
|
||||
GitHub issue. Please an include an explanation of your use case: such details
|
||||
can be extremely helpful in designing appropriately general solutions, and also
|
||||
helps us identify cases where an existing solution can solve your problem. See
|
||||
our guides for [reporting bugs](../contributing/reporting-bugs.md) and [giving
|
||||
feedback](../contributing/contributing.md#user-feedback) for more details.
|
||||
|
||||
## Client apps
|
||||
|
||||
|
||||
@@ -330,7 +330,7 @@ settings in `/etc/zulip/settings.py`.
|
||||
|
||||
An example configation for Active Directory group restriction can be:
|
||||
|
||||
```
|
||||
```python
|
||||
import django_auth_ldap
|
||||
AUTH_LDAP_GROUP_TYPE = django_auth_ldap.config.ActiveDirectoryGroupType()
|
||||
|
||||
@@ -613,7 +613,7 @@ integration](../production/scim.md).
|
||||
|
||||
Save the certificate in a new `{idp_name}.crt` file constructed as follows:
|
||||
|
||||
```
|
||||
```text
|
||||
-----BEGIN CERTIFICATE-----
|
||||
{Paste the content here}
|
||||
-----END CERTIFICATE-----
|
||||
@@ -653,13 +653,15 @@ integration](../production/scim.md).
|
||||
importing, only the certificate will be displayed (not the private
|
||||
key).
|
||||
|
||||
### IdP-initiated SAML Logout
|
||||
### SAML Single Logout
|
||||
|
||||
Zulip 5.0 introduces beta support for IdP-initiated SAML Logout. The
|
||||
implementation has primarily been tested with Keycloak and these
|
||||
instructions are for that provider; please [contact
|
||||
us](https://zulip.com/help/contact-support) for help using this with
|
||||
another IdP.
|
||||
Zulip supports both IdP-initiated and SP-initiated SAML Single
|
||||
Logout. The implementation has primarily been tested with Keycloak and
|
||||
these instructions are for that provider; please [contact
|
||||
us](https://zulip.com/help/contact-support) if you need help using
|
||||
this with another IdP.
|
||||
|
||||
#### IdP-initated Single Logout
|
||||
|
||||
1. In the KeyCloak configuration for Zulip, enable `Force Name ID Format`
|
||||
and set `Name ID Format` to `email`. Zulip needs to receive
|
||||
@@ -674,7 +676,7 @@ another IdP.
|
||||
`/etc/zulip/settings.py` as `slo_url`. For example it may look like
|
||||
this:
|
||||
|
||||
```
|
||||
```text
|
||||
"your_keycloak_idp_name": {
|
||||
"entity_id": "https://keycloak.example.com/auth/realms/yourrealm",
|
||||
"url": "https://keycloak.example.com/auth/realms/yourrealm/protocol/saml",
|
||||
@@ -698,11 +700,27 @@ another IdP.
|
||||
/home/zulip/deployments/current/manage.py logout_all_users
|
||||
```
|
||||
|
||||
#### SP-initiated Single Logout
|
||||
|
||||
After configuring IdP-initiated Logout, you only need to set
|
||||
`"sp_initiated_logout_enabled": True` in the appropriate IdP
|
||||
configuration dict in `SOCIAL_AUTH_SAML_ENABLED_IDPS` in
|
||||
`/etc/zulip/settings.py` to also enable SP-initiated Logout. When this
|
||||
is active, a user who logged in to Zulip via SAML, upon clicking
|
||||
"Logout" in the Zulip web app will be redirected to the IdP's Single
|
||||
Logout endpoint with a `LogoutRequest`. If a successful
|
||||
`LogoutResponse` is received back, their current Zulip session will be
|
||||
terminated.
|
||||
|
||||
Note that this doesn't work when logging out of the mobile application
|
||||
since the app doesn't use sessions and relies on just having the user's
|
||||
API key.
|
||||
|
||||
#### Caveats
|
||||
|
||||
- This beta doesn't support using `SessionIndex` to limit which
|
||||
sessions are affected; it always terminates all logged-in sessions
|
||||
for the user identified in the `NameID`.
|
||||
- This implementation doesn't support using `SessionIndex` to limit which
|
||||
sessions are affected; in IdP-initiated Logout it always terminates
|
||||
all logged-in sessions for the user identified in the `NameID`.
|
||||
- SAML Logout in a configuration where your IdP handles authentication
|
||||
for multiple organizations is not yet supported.
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ as well as those mentioned in the
|
||||
on the first install.
|
||||
|
||||
- `--postgresql-missing-dictionaries`: Set
|
||||
`postgresql.missing_dictionaries` ([docs][doc-settings]) in the
|
||||
`postgresql.missing_dictionaries` ([docs][missing-dicts]) in the
|
||||
Zulip settings, which omits some configuration needed for full-text
|
||||
indexing. This should be used with [cloud managed databases like
|
||||
RDS](#using-zulip-with-amazon-rds-as-the-database). This option
|
||||
@@ -79,6 +79,8 @@ as well as those mentioned in the
|
||||
- `--no-overwrite-settings`: This option preserves existing
|
||||
`/etc/zulip` configuration files.
|
||||
|
||||
[missing-dicts]: #missing_dictionaries
|
||||
|
||||
## Installing on an existing server
|
||||
|
||||
Zulip's installation process assumes it is the only application
|
||||
@@ -93,7 +95,27 @@ user-configured actions to run before and after an upgrade; see the
|
||||
[upgrading documentation](upgrade.md#deployment-hooks) for details on
|
||||
how to write your own.
|
||||
|
||||
Zulip also provides and optional deploy hook for Sentry.
|
||||
### Zulip message deploy hook
|
||||
|
||||
Zulip can use its deploy hooks to send a message immediately before and after
|
||||
conducting an upgrade. To configure this:
|
||||
|
||||
1. Add `, zulip::hooks::zulip_notify` to the `puppet_classes` line in
|
||||
`/etc/zulip/zulip.conf`
|
||||
1. Add a `[zulip_notify]` section to `/etc/zulip/zulip.conf`:
|
||||
```ini
|
||||
[zulip_notify]
|
||||
bot_email = your-bot@zulip.example.com
|
||||
server = zulip.example.com
|
||||
stream = deployments
|
||||
```
|
||||
1. Add the [api key](https://zulip.com/api/api-keys#get-a-bots-api-key) for the
|
||||
bot user in `/etc/zulip/zulip-secrets.conf` as `zulip_release_api_key`:
|
||||
```ini
|
||||
# Replace with your own bot's token, found in the Zulip UI
|
||||
zulip_release_api_key = abcd1234E6DK0F7pNSqaMSuzd8C5i7Eu
|
||||
```
|
||||
1. As root, run `/home/zulip/deployments/current/scripts/zulip-puppet-apply`.
|
||||
|
||||
### Sentry deploy hook
|
||||
|
||||
@@ -118,7 +140,7 @@ To do so:
|
||||
organization = your-organization-name
|
||||
project = your-project-name
|
||||
```
|
||||
6. Add the [authentication token] for your internal Sentry integration
|
||||
6. Add the [authentication token][sentry-tokens] for your internal Sentry integration
|
||||
to your `/etc/zulip/zulip-secrets.conf`:
|
||||
```ini
|
||||
# Replace with your own token, found in Sentry
|
||||
@@ -385,17 +407,22 @@ requests from a reverse proxy as follows:
|
||||
1. Finally, restart the Zulip server, using
|
||||
`/home/zulip/deployments/current/scripts/restart-server`.
|
||||
|
||||
Note that Zulip must be able to accurately determine if its connection to the
|
||||
client was over HTTPS or not; if you enable `http_only`, it is very important
|
||||
that you correctly configure Zulip to trust the `X-Forwarded-Proto` header from
|
||||
its proxy (see the next section), or clients may see infinite redirects.
|
||||
|
||||
#### Configuring Zulip to trust proxies
|
||||
|
||||
Before placing Zulip behind a reverse proxy, it needs to be configured
|
||||
to trust the client IP addresses that the proxy reports via the
|
||||
`X-Forwarded-For` header. This is important to have accurate IP
|
||||
addresses in server logs, as well as in notification emails which are
|
||||
sent to end users. Zulip doesn't default to trusting all
|
||||
`X-Forwarded-For` headers, because doing so would allow clients to
|
||||
spoof any IP address; we specify which IP addresses are the Zulip
|
||||
server's incoming proxies, so we know how much of the
|
||||
`X-Forwarded-For` header to trust.
|
||||
Before placing Zulip behind a reverse proxy, it needs to be configured to trust
|
||||
the client IP addresses that the proxy reports via the `X-Forwarded-For` header,
|
||||
and the protocol reported by the `X-Forwarded-Proto` header. This is important
|
||||
to have accurate IP addresses in server logs, as well as in notification emails
|
||||
which are sent to end users. Zulip doesn't default to trusting all
|
||||
`X-Forwarded-*` headers, because doing so would allow clients to spoof any IP
|
||||
address, and claim connections were over a secure connection when they were not;
|
||||
we specify which IP addresses are the Zulip server's incoming proxies, so we
|
||||
know which `X-Forwarded-*` headers to trust.
|
||||
|
||||
1. Determine the IP addresses of all reverse proxies you are setting up, as seen
|
||||
from the Zulip host. Depending on your network setup, these may not be the
|
||||
@@ -455,6 +482,7 @@ that your Zulip server sits at `https://10.10.10.10:443`; see
|
||||
|
||||
location / {
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_http_version 1.1;
|
||||
proxy_buffering off;
|
||||
@@ -488,7 +516,7 @@ Apache requires you use the hostname, not the IP address; see
|
||||
|
||||
1. Enable some required Apache modules:
|
||||
|
||||
```
|
||||
```bash
|
||||
a2enmod ssl proxy proxy_http headers rewrite
|
||||
```
|
||||
|
||||
@@ -555,6 +583,8 @@ your Zulip server sits at `https://10.10.10.10:443`see
|
||||
bind *:80
|
||||
bind *:443 ssl crt /etc/ssl/private/zulip-combined.crt
|
||||
http-request redirect scheme https code 301 unless { ssl_fc }
|
||||
http-request set-header X-Forwarded-Proto http unless { ssl_fc }
|
||||
http-request set-header X-Forwarded-Proto https if { ssl_fc }
|
||||
default_backend zulip
|
||||
|
||||
backend zulip
|
||||
@@ -580,6 +610,13 @@ things you need to be careful about when configuring it:
|
||||
has the actual IP addresses of clients, not the IP address of the
|
||||
proxy server.
|
||||
|
||||
1. Configure your reverse proxy (or proxies) to correctly maintain the
|
||||
`X-Forwarded-Proto` HTTP header, which is supposed to contain either `https`
|
||||
or `http` depending on the connection between your browser and your
|
||||
proxy. This will be used by Django to perform CSRF checks regardless of your
|
||||
connection mechanism from your proxy to Zulip. Note that the proxies _must_
|
||||
set the header, overriding any existing values, not add a new header.
|
||||
|
||||
1. Configure your proxy to pass along the `Host:` header as was sent
|
||||
from the client, not the internal hostname as seen by the proxy.
|
||||
If this is not possible, you can set `USE_X_FORWARDED_HOST = True`
|
||||
@@ -760,6 +797,17 @@ once. This decreases the number of 502's served to clients, at the
|
||||
cost of slightly increased memory usage, and the possibility that
|
||||
different requests will be served by different versions of the code.
|
||||
|
||||
#### `service_file_descriptor_limit`
|
||||
|
||||
The number of file descriptors which [Supervisor is configured to allow
|
||||
processes to use][supervisor-minfds]; defaults to 40000. If your Zulip deployment
|
||||
is very large (hundreds of thousands of concurrent users), your Django processes
|
||||
hit this limit and refuse connections to clients. Raising it above this default
|
||||
may require changing system-level limits, particularly if you are using a
|
||||
virtualized environment (e.g. Docker, or Proxmox LXC).
|
||||
|
||||
[supervisor-minfds]: http://supervisord.org/configuration.html?highlight=minfds#supervisord-section-values
|
||||
|
||||
#### `s3_memory_cache_size`
|
||||
|
||||
Used only when the [S3 storage backend][s3-backend] is in use.
|
||||
@@ -781,6 +829,14 @@ immutable, this serves only as a potential additional limit on the
|
||||
size of the contents on disk; `s3_disk_cache_size` is expected to be
|
||||
the primary control for cache sizing.
|
||||
|
||||
#### `nameserver`
|
||||
|
||||
When the [S3 storage backend][s3-backend] is in use, downloads from S3 are
|
||||
proxied from nginx, whose configuration requires an explicit value of a DNS
|
||||
nameserver to resolve the S3 server's hostname. Zulip defaults to using the
|
||||
resolver found in `/etc/resolv.conf`; this setting overrides any value found
|
||||
there.
|
||||
|
||||
[s3-backend]: upload-backends.md
|
||||
|
||||
#### `uwsgi_listen_backlog_limit`
|
||||
@@ -852,6 +908,12 @@ may wish to increase this if you are taking backups on a replica, so can afford
|
||||
to affect other disk I/O, and have an SSD which is good at parallel random
|
||||
reads.
|
||||
|
||||
#### `missing_dictionaries`
|
||||
|
||||
If set to a true value during initial database creation, uses PostgreSQL's
|
||||
standard `pg_catalog.english` text search configuration, rather than Zulip's
|
||||
improved set of stopwords. Has no effect after initial database construction.
|
||||
|
||||
#### `ssl_ca_file`
|
||||
|
||||
Set to the path to the PEM-encoded certificate authority used to
|
||||
@@ -899,8 +961,8 @@ which have more than 20k users.
|
||||
#### `ips`
|
||||
|
||||
Comma-separated list of IP addresses or netmasks of external load balancers
|
||||
whose `X-Forwarded-For` should be respected. These can be individual IP
|
||||
addresses, or CIDR IP address ranges.
|
||||
whose `X-Forwarded-For` and `X-Forwarded-Proto` should be respected. These can
|
||||
be individual IP addresses, or CIDR IP address ranges.
|
||||
|
||||
### `[http_proxy]`
|
||||
|
||||
|
||||
@@ -26,8 +26,8 @@ There are two ways to configure Zulip's email gateway:
|
||||
The local delivery configuration is preferred for production because
|
||||
it supports nicer looking email addresses and has no cron delay. The
|
||||
polling option is convenient for testing/developing this feature
|
||||
because it doesn't require a public IP address or setting up MX
|
||||
records in DNS.
|
||||
because it doesn't require a public IP address, setting up MX
|
||||
records in DNS, or adjusting firewalls.
|
||||
|
||||
:::{note}
|
||||
Incoming emails are rate-limited, with the following limits:
|
||||
@@ -62,6 +62,10 @@ using an [HTTP reverse proxy][reverse-proxy]).
|
||||
1 hostname.example.com
|
||||
```
|
||||
|
||||
1. If you have a network firewall enabled, configure it to allow incoming access
|
||||
to port 25 on the Zulip server from the public internet. Other mail servers
|
||||
will need to use it to deliver emails to Zulip.
|
||||
|
||||
1. Log in to your Zulip server; the remaining steps all happen there.
|
||||
|
||||
1. Add `, zulip::postfix_localmail` to `puppet_classes` in
|
||||
@@ -122,7 +126,7 @@ Congratulations! The integration should be fully operational.
|
||||
1. Test your configuration by sending emails to the target email
|
||||
account and then running the Zulip tool to poll that inbox:
|
||||
|
||||
```
|
||||
```bash
|
||||
su zulip -c '/home/zulip/deployments/current/manage.py email_mirror'
|
||||
```
|
||||
|
||||
|
||||
@@ -240,6 +240,20 @@ with the exception of passwords and API keys.
|
||||
We recommend using the [backup tool](#backups) if your primary goal is
|
||||
backups.
|
||||
|
||||
### Upgrade if exporting for import into Zulip Cloud
|
||||
|
||||
If you are exporting data from a self-hosted version of Zulip for purposes of
|
||||
importing into Zulip Cloud, you should first [upgrade your server to the
|
||||
`zulip-cloud-current` branch][upgrade-zulip-from-git]:
|
||||
|
||||
```bash
|
||||
/home/zulip/deployments/current/scripts/upgrade-zulip-from-git zulip-cloud-current
|
||||
```
|
||||
|
||||
It is not sufficient to be on the latest stable release, as zulip.com runs
|
||||
pre-release versions of Zulip that are often several months of development ahead
|
||||
of the latest release.
|
||||
|
||||
### Preventing changes during the export
|
||||
|
||||
For best results, you'll want to shut down access to the organization
|
||||
@@ -293,12 +307,13 @@ archive of all the organization's uploaded files.
|
||||
- Ensure that the Zulip server you're importing into is running the same
|
||||
version of Zulip as the server you're exporting from.
|
||||
|
||||
- For exports from Zulip Cloud (zulip.com), you need to [upgrade to
|
||||
`main`][upgrade-zulip-from-git], since we run `main` on
|
||||
Zulip Cloud:
|
||||
- For exports created from Zulip Cloud (zulip.com), you need to [upgrade to
|
||||
`zulip-cloud-current`][upgrade-zulip-from-git], which represents the
|
||||
current version that Zulip Cloud is running; this is generally `main`
|
||||
delayed by a week or two. To upgrade to that:
|
||||
|
||||
```bash
|
||||
/home/zulip/deployments/current/scripts/upgrade-zulip-from-git main
|
||||
/home/zulip/deployments/current/scripts/upgrade-zulip-from-git zulip-cloud-current
|
||||
```
|
||||
|
||||
It is not sufficient to be on the latest stable release, as
|
||||
|
||||
@@ -188,13 +188,7 @@ the bottom of `/var/log/zulip/errors.log` for a traceback, and consult
|
||||
the [troubleshooting section](troubleshooting.md) for advice on
|
||||
how to debug.
|
||||
|
||||
**Community.** If the tips above don't help, please visit [#production
|
||||
help][production-help] in the [Zulip development community
|
||||
server][chat-zulip-org] for realtime help, and we'll try to help you
|
||||
out! Please provide details like the full traceback from the bottom
|
||||
of `/var/log/zulip/errors.log` in your report (ideally in a [code
|
||||
block][code-block]).
|
||||
|
||||
[chat-zulip-org]: https://zulip.com/development-community/
|
||||
[production-help]: https://chat.zulip.org/#narrow/stream/31-production-help
|
||||
[code-block]: https://zulip.com/help/code-blocks
|
||||
**Still having trouble?**
|
||||
Please see the [troubleshooting and monitoring
|
||||
guide](../production/troubleshooting.md) for additional advice and ways to get
|
||||
help.
|
||||
|
||||
@@ -7,6 +7,7 @@ To run a Zulip server, you will need:
|
||||
- Ubuntu 20.04
|
||||
- Ubuntu 22.04
|
||||
- Debian 11
|
||||
- Debian 12
|
||||
- A supported CPU architecture:
|
||||
- x86-64
|
||||
- aarch64
|
||||
@@ -36,7 +37,7 @@ on issues you'll encounter](install-existing-server.md).
|
||||
|
||||
#### Operating system
|
||||
|
||||
Ubuntu 20.04, Ubuntu 22.04, and Debian 11
|
||||
Ubuntu 20.04, Ubuntu 22.04, Debian 11, and Debian 12
|
||||
are supported for running Zulip in production. You can also
|
||||
run Zulip on other platforms that support Docker using
|
||||
[docker-zulip][docker-zulip-homepage].
|
||||
@@ -119,7 +120,6 @@ access to incoming port 22 for SSH access for remote access.
|
||||
[ssrf]: https://owasp.org/www-community/attacks/Server_Side_Request_Forgery
|
||||
[smokescreen-proxy]: deployment.md#customizing-the-outgoing-http-proxy
|
||||
[reverse-proxy]: deployment.md#putting-the-zulip-application-behind-a-reverse-proxy
|
||||
[email-mirror-code]: https://github.com/zulip/zulip/blob/main/zerver/management/commands/email_mirror.py
|
||||
|
||||
## Credentials needed
|
||||
|
||||
@@ -153,8 +153,6 @@ certificate documentation](ssl-certificates.md).
|
||||
Once you have met these requirements, see [full instructions for installing
|
||||
Zulip in production](install.md).
|
||||
|
||||
[trusty-eol]: https://wiki.ubuntu.com/Releases
|
||||
|
||||
## Scalability
|
||||
|
||||
This section details some basic guidelines for running a Zulip server
|
||||
|
||||
@@ -23,13 +23,13 @@ The Zulip server-side configuration is straightforward:
|
||||
example, if your organization is hosted on a subdomain
|
||||
(`subdomain.zulip.example.com`):
|
||||
|
||||
```
|
||||
```bash
|
||||
/home/zulip/deployments/current/manage.py add_scim_client okta -r 'subdomain'
|
||||
```
|
||||
|
||||
Or your organization is hosted on the root domain (`zulip.example.com`):
|
||||
|
||||
```
|
||||
```bash
|
||||
/home/zulip/deployments/current/manage.py add_scim_client okta -r ""
|
||||
```
|
||||
|
||||
@@ -39,14 +39,14 @@ The Zulip server-side configuration is straightforward:
|
||||
1. Configure the Zulip server by adding a `SCIM_CONFIG` block to your
|
||||
`/etc/zulip/settings.py`:
|
||||
|
||||
```
|
||||
```python
|
||||
SCIM_CONFIG = {
|
||||
"subdomain": {
|
||||
"bearer_token": "<secret token>",
|
||||
"scim_client_name": "okta",
|
||||
"name_formatted_included": False,
|
||||
}
|
||||
}
|
||||
"subdomain": {
|
||||
"bearer_token": "<secret token>",
|
||||
"scim_client_name": "okta",
|
||||
"name_formatted_included": False,
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The `bearer_token` should contain a secure, secret token that you
|
||||
|
||||
@@ -1,5 +1,43 @@
|
||||
# Troubleshooting and monitoring
|
||||
|
||||
This page offers detailed guidance for troubleshooting and monitoring your Zulip
|
||||
installation. If you suspect that you have encountered a bug, or are otherwise
|
||||
unable to resolve an issue with your Zulip installation, best-effort community
|
||||
support is available in the [Zulip development community ][chat-zulip-org]. We
|
||||
provide free, interactive support for the vast majority of questions about
|
||||
running a Zulip server.
|
||||
|
||||
To report a problem or ask a question, please start a new topic in the
|
||||
[#production help][production-help] stream in the [Zulip development community
|
||||
][chat-zulip-org]:
|
||||
|
||||
- Describe what you are trying to do and any problems you've encountered.
|
||||
- Provide the relevant logs, such as the full traceback from the bottom
|
||||
of `/var/log/zulip/errors.log`, or the installation script logs at
|
||||
`/var/log/zulip/install.log`. Please post logging output using [code
|
||||
blocks][code-block], not screenshots.
|
||||
- Be sure to include what version of Zulip Server you are running, or between
|
||||
which versions you are upgrading.
|
||||
|
||||
[chat-zulip-org]: https://zulip.com/development-community/
|
||||
[production-help]: https://chat.zulip.org/#narrow/stream/31-production-help
|
||||
[code-block]: https://zulip.com/help/code-blocks
|
||||
|
||||
Contact [sales@zulip.com](mailto:sales@zulip.com) if you'd like to
|
||||
learn about paid support options, including phone support from Zulip's
|
||||
core engineering team.
|
||||
|
||||
## Overview and resources
|
||||
|
||||
If you encounter issues while self-hosting Zulip, the first thing to
|
||||
do is look at Zulip's logs, which are located in `/var/log/zulip/`.
|
||||
|
||||
That directory contains one log file for each service, plus
|
||||
`errors.log` (has all errors and the first place you should check),
|
||||
`server.log` (has logs from the Django and Tornado servers), and
|
||||
`workers.log` (has combined logs from the queue workers). Zulip also
|
||||
provides a [tool to search through `server.log`][log-search].
|
||||
|
||||
Zulip uses [Supervisor](http://supervisord.org/index.html) to monitor
|
||||
and control its many Python services. Read the next section, [Using
|
||||
supervisorctl](#using-supervisorctl), to learn how to use the
|
||||
@@ -10,23 +48,10 @@ overview](../overview/architecture-overview.md), particularly the
|
||||
[Components](../overview/architecture-overview.md#components) section. This will help you
|
||||
understand the many services Zulip uses.
|
||||
|
||||
If you encounter issues while running Zulip, take a look at Zulip's
|
||||
logs, which are located in `/var/log/zulip/`. That directory contains
|
||||
one log file for each service, plus `errors.log` (has all errors),
|
||||
`server.log` (has logs from the Django and Tornado servers), and
|
||||
`workers.log` (has combined logs from the queue workers). Zulip also
|
||||
provides a [tool to search through `server.log`][log-search].
|
||||
|
||||
[log-search]: ../subsystems/logging.md#searching-backend-log-files
|
||||
|
||||
The section [troubleshooting services](#troubleshooting-services)
|
||||
on this page includes details about how to fix common issues with Zulip services.
|
||||
|
||||
If you run into additional problems, [please report
|
||||
them](https://github.com/zulip/zulip/issues) so that we can update
|
||||
this page! The Zulip installation scripts logs its full output to
|
||||
`/var/log/zulip/install.log`, so please include the context for any
|
||||
tracebacks from that log.
|
||||
[log-search]: ../subsystems/logging.md#searching-backend-log-files
|
||||
|
||||
## Using supervisorctl
|
||||
|
||||
|
||||
@@ -217,15 +217,40 @@ Zulip's upgrades have a hook system which allows for arbitrary
|
||||
user-configured actions to run before and after an upgrade.
|
||||
|
||||
Files in the `/etc/zulip/pre-deploy.d` and `/etc/zulip/post-deploy.d`
|
||||
directories are inspected for files ending with `.hook`, just before
|
||||
and after the critical period when the server is restarted. Each file
|
||||
is called, sorted in alphabetical order, from the working directory of
|
||||
the new version, with arguments of the old and new Zulip versions. If
|
||||
they exit with non-0 exit code, the upgrade will abort.
|
||||
directories are inspected for files ending with `.hook`, just before and after
|
||||
the critical period when the server is restarted. Each file is called, sorted in
|
||||
alphabetical order, from the working directory of the new version, with
|
||||
environment variables as described below. If any of them exit with non-0 exit
|
||||
code, the upgrade will abort.
|
||||
|
||||
The hook is run with the following environment variables set:
|
||||
|
||||
- `ZULIP_OLD_VERSION`: The version being upgraded from, which may either be a
|
||||
release name (e.g. `7.0` or `7.0-beta3`) or the output from `git describe`
|
||||
(e.g. `7.0-beta3-2-gdc158b18f2`).
|
||||
- `ZULIP_NEW_VERSION`: The version being upgraded to, in the same format as
|
||||
`ZULIP_OLD_VERSION`.
|
||||
|
||||
If the upgrade is upgrading between [versions in `git`][upgrade-from-git], then
|
||||
the following environment variables will also be present:
|
||||
|
||||
- `ZULIP_OLD_COMMIT`: The full commit hash of the version being upgraded from
|
||||
- `ZULIP_NEW_COMMIT`: The full commit hash of the version being upgraded to
|
||||
- `ZULIP_OLD_MERGE_BASE_COMMIT`: The full commit hash of the merge-base of the
|
||||
version being upgraded from, and the public branch in
|
||||
[`zulip/zulip`][zulip/zulip]. This will be the closest commit in standard
|
||||
Zulip Server to the version being upgraded from.
|
||||
- `ZULIP_NEW_MERGE_BASE_COMMIT`: The full commit hash of the merge-base of the
|
||||
version being upgraded to, and the public branch in
|
||||
[`zulip/zulip`][zulip/zulip]. This will be the closest commit in standard
|
||||
Zulip Server to the version being upgraded to.
|
||||
|
||||
See the [deploy documentation](deployment.md#deployment-hooks) for
|
||||
hooks included with Zulip.
|
||||
|
||||
[upgrade-from-git]: #upgrading-from-a-git-repository
|
||||
[zulip/zulip]: https://github.com/zulip/zulip/
|
||||
|
||||
## Preserving local changes to service configuration files
|
||||
|
||||
:::{warning}
|
||||
@@ -484,6 +509,52 @@ instructions for other supported platforms.
|
||||
18.04](#upgrading-from-ubuntu-1604-xenial-to-1804-bionic), so
|
||||
that you are running a supported operating system.
|
||||
|
||||
### Upgrading from Debian 11 to 12
|
||||
|
||||
1. Upgrade your server to the latest `7.x` release.
|
||||
|
||||
2. As the Zulip user, stop the Zulip server and run the following
|
||||
to back up the system:
|
||||
|
||||
```bash
|
||||
/home/zulip/deployments/current/scripts/stop-server
|
||||
/home/zulip/deployments/current/manage.py backup --output=/home/zulip/release-upgrade.backup.tar.gz
|
||||
```
|
||||
|
||||
3. Follow [Debian's instructions to upgrade the OS][bookworm-upgrade].
|
||||
|
||||
[bookworm-upgrade]: https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.html
|
||||
|
||||
When prompted for you how to upgrade configuration
|
||||
files for services that Zulip manages like Redis, PostgreSQL,
|
||||
nginx, and memcached, the best choice is `N` to keep the
|
||||
currently installed version. But it's not important; the next
|
||||
step will re-install Zulip's configuration in any case.
|
||||
|
||||
4. As root, run the following steps to regenerate configurations
|
||||
for services used by Zulip:
|
||||
|
||||
```bash
|
||||
apt remove upstart -y
|
||||
/home/zulip/deployments/current/scripts/zulip-puppet-apply -f
|
||||
```
|
||||
|
||||
5. Reinstall the current version of Zulip, which among other things
|
||||
will recompile Zulip's Python module dependencies for your new
|
||||
version of Python:
|
||||
|
||||
```bash
|
||||
rm -rf /srv/zulip-venv-cache/*
|
||||
/home/zulip/deployments/current/scripts/lib/upgrade-zulip-stage-2 \
|
||||
/home/zulip/deployments/current/ --ignore-static-assets --audit-fts-indexes
|
||||
```
|
||||
|
||||
This will finish by restarting your Zulip server; you should now
|
||||
be able to navigate to its URL and confirm everything is working
|
||||
correctly.
|
||||
|
||||
6. As an additional step, you can also [upgrade the PostgreSQL version](#upgrading-postgresql).
|
||||
|
||||
### Upgrading from Debian 10 to 11
|
||||
|
||||
1. Upgrade your server to the latest `5.x` release. You can only
|
||||
@@ -623,6 +694,16 @@ the version of PostgreSQL are no longer linked to upgrades of the
|
||||
distribution; that is, you may opt to upgrade to PostgreSQL 15 while
|
||||
running Ubuntu 20.04.
|
||||
|
||||
Not all versions of Zulip Server support all versions of PostgreSQL, however:
|
||||
|
||||
| Zulip Server version | Supported versions of PostgreSQL |
|
||||
| -------------------- | -------------------------------- |
|
||||
| 3.x | 9.3, 9.5, 9.6, 10, 11, 12 |
|
||||
| 4.x | 9.3, 9.5, 9.6, 10, 11, 12, 13 |
|
||||
| 5.x | 10, 11, 12, 13, 14 |
|
||||
| 6.x | 11, 12, 13, 14 |
|
||||
| 7.x | 12, 13, 14, 15 |
|
||||
|
||||
To upgrade the version of PostgreSQL on the Zulip server:
|
||||
|
||||
1. Upgrade your server to the latest Zulip release (at least 3.0).
|
||||
|
||||
@@ -85,6 +85,18 @@ You may also wish to increase the cache sizes if the S3 storage (or
|
||||
S3-compatible equivalent) is not closely located to your Zulip server,
|
||||
as cache misses will be more expensive.
|
||||
|
||||
## nginx DNS nameserver configuration
|
||||
|
||||
The S3 cache described above is maintained by nginx. nginx's configuration
|
||||
requires an explicitly-set DNS nameserver to resolve the hostname of the S3
|
||||
servers; Zulip defaults this value to the first nameserver found in
|
||||
`/etc/resolv.conf`, but this resolver can be [adjusted in
|
||||
`/etc/zulip/zulip.conf`][s3-resolver] if needed. If you adjust this value, you
|
||||
will need to run `/home/zulip/deployments/current/scripts/zulip-puppet-apply` to
|
||||
update the nginx configuration for the new value.
|
||||
|
||||
[s3-resolver]: deployment.md#nameserver
|
||||
|
||||
## S3 bucket policy
|
||||
|
||||
The best way to do the S3 integration with Amazon is to create a new IAM user
|
||||
|
||||
@@ -2,27 +2,34 @@
|
||||
|
||||
## Zulip CSS organization
|
||||
|
||||
The Zulip application's CSS can be found in the `web/styles/`
|
||||
directory. Zulip uses [Bootstrap](https://getbootstrap.com/) as its
|
||||
main third-party CSS library.
|
||||
There are two high-level sections of CSS: the "portico" (logged-out
|
||||
pages like `/help/`, `/login/`, etc.), and the app. The Zulip
|
||||
application's CSS can be found in the `web/styles/` directory, while
|
||||
the portico CSS lives under the `web/styles/portico/` subdirectory.
|
||||
|
||||
Zulip uses PostCSS for its CSS files. There are two high-level sections
|
||||
of CSS: the "portico" (logged-out pages like /help/, /login/, etc.),
|
||||
and the app. The portico CSS lives under the `web/styles/portico`
|
||||
subdirectory.
|
||||
To generate its CSS files, Zulip uses [PostCSS](https://postcss.org/)
|
||||
and a number of PostCSS plugins, including
|
||||
[postcss-nesting](https://github.com/csstools/postcss-nesting#readme),
|
||||
whose rules are derived from the [CSS Nesting](https://drafts.csswg.org/css-nesting-1/)
|
||||
specification.
|
||||
|
||||
## Editing Zulip CSS
|
||||
|
||||
If you aren't experienced with doing web development and want to make
|
||||
CSS changes, we recommend reading the excellent [Chrome web inspector
|
||||
guide on editing HTML/CSS](https://developer.chrome.com/devtools/docs/dom-and-styles),
|
||||
especially the [section on
|
||||
CSS](https://developer.chrome.com/devtools/docs/dom-and-styles#styles)
|
||||
CSS changes, we recommend reading the excellent [Chrome developer tools
|
||||
guide to the Elements panel and CSS](https://developer.chrome.com/docs/devtools/overview/#elements),
|
||||
as well as the [section on viewing and editing CSS](https://developer.chrome.com/docs/devtools/css/)
|
||||
to learn about all the great tools that you can use to modify and test
|
||||
changes to CSS interactively in-browser (without even having the
|
||||
reload the page!).
|
||||
|
||||
Zulip's development environment has hot code reloading configured, so
|
||||
Our CSS is formatted with [Prettier](https://prettier.io/). You can
|
||||
ask Prettier to reformat all code via our [linter
|
||||
tool](../testing/linters.md) with `tools/lint --only=prettier --fix`.
|
||||
You can also [integrate it with your
|
||||
editor](https://prettier.io/docs/en/editors.html).
|
||||
|
||||
Zulip's development environment has hot code-reloading configured, so
|
||||
changes made in source files will immediately take effect in open
|
||||
browser windows, either by live-updating the CSS or reloading the
|
||||
browser window (following backend changes).
|
||||
@@ -37,6 +44,22 @@ understand the current styling or modify it. We would very much like
|
||||
to avoid such a fate. So please make an effort to reuse existing
|
||||
styling, clean up now-unused CSS, etc., to keep things maintainable.
|
||||
|
||||
Opt to write CSS in CSS files. Avoid using the `style=` attribute in
|
||||
HTML except for styles that are set dynamically. For example, we set
|
||||
the colors for specific streams (`{{stream_color}}`) on different
|
||||
elements dynamically, in files like `user_stream_list_item.hbs`:
|
||||
|
||||
```html
|
||||
<span
|
||||
class="stream-privacy-original-color-{{stream_id}} stream-privacy filter-icon"
|
||||
style="color: {{stream_color}}">
|
||||
```
|
||||
|
||||
But for most other cases, its preferable to define logical classes and
|
||||
put your styles in external CSS files such as `zulip.css` or a more
|
||||
specific CSS file, if one exists. See the contents of the `web/styles/`
|
||||
directory.
|
||||
|
||||
### Be consistent with existing similar UI
|
||||
|
||||
Ideally, do this by reusing existing CSS declarations, so that any
|
||||
@@ -48,6 +71,14 @@ elements.
|
||||
This makes it much easier to read the code and use `git grep` to find
|
||||
where a particular class is used.
|
||||
|
||||
Don't use the tag name in a selector unless you have to. In other words,
|
||||
use `.foo` instead of `span.foo`. We shouldn't have to care if the tag
|
||||
type changes in the future.
|
||||
|
||||
Additionally, multi-word class and ID values should be hyphenated,
|
||||
also known as _kebab case_. In HTML, opt for `class="my-multiword-class"`,
|
||||
with its corresponding CSS selector as `.my-multiword-class`.
|
||||
|
||||
## Validating CSS
|
||||
|
||||
When changing any part of the Zulip CSS, it's important to check that
|
||||
@@ -281,5 +312,5 @@ function in those scenarios, add it to `zulip_test`. This is also
|
||||
[handlebars]: https://handlebarsjs.com/
|
||||
[trans]: https://jinja.palletsprojects.com/en/3.0.x/extensions/#i18n-extension
|
||||
[jconditionals]: http://jinja.pocoo.org/docs/2.9/templates/#list-of-control-structures
|
||||
[hconditionals]: https://handlebarsjs.com/guide/#block_helpers.html
|
||||
[hconditionals]: https://handlebarsjs.com/guide/block-helpers.html#block-helpers
|
||||
[translation]: ../translating/translating.md
|
||||
|
||||
@@ -66,7 +66,7 @@ hook][sentry-deploy-hook].
|
||||
|
||||
[sentry-project]: https://docs.sentry.io/product/projects/
|
||||
[sentry-dsn]: https://docs.sentry.io/product/sentry-basics/dsn-explainer/
|
||||
[sentry-relase-hook]: ../production/deployment.md#sentry-deploy-hook
|
||||
[sentry-deploy-hook]: ../production/deployment.md#sentry-deploy-hook
|
||||
|
||||
### Backend logging
|
||||
|
||||
|
||||
@@ -46,8 +46,6 @@ preparing a new release.
|
||||
- Add the needed YAML frontmatter.
|
||||
- Move any images into `public` and update their references.
|
||||
- Proofread, especially for formatting.
|
||||
- Tag the post with "Release announcements" _first_, then any other
|
||||
tags (e.g. "Security").
|
||||
- If the draft post should remain secret until release, avoid using
|
||||
a guessable Git branch name for the pull request (the deployment
|
||||
preview URL is based on the branch name).
|
||||
@@ -80,11 +78,13 @@ preparing a new release.
|
||||
- Also tag it with `latest`: `docker build . -t zulip/docker-zulip:latest`
|
||||
- Push those tags: `docker push zulip/docker-zulip:4.11-0; docker push zulip/docker-zulip:latest`
|
||||
- Push the commits to `main`.
|
||||
- Publish the blog post; check the box to "send by email."
|
||||
- Merge the blog post PR.
|
||||
- Announce the release, pointing to the blog post, via:
|
||||
- Email to [zulip-announce](https://groups.google.com/g/zulip-announce)
|
||||
- Email to [zulip-blog-announce](https://groups.google.com/a/zulip.com/g/zulip-blog-announce)
|
||||
- Message in [#announce](https://chat.zulip.org/#narrow/stream/1-announce)
|
||||
- Tweet from [@zulip](https://twitter.com/zulip).
|
||||
- Toot from [fosstodon.org/@zulip](https://fosstodon.org/@zulip)
|
||||
|
||||
### Post-release
|
||||
|
||||
@@ -114,3 +114,11 @@ preparing a new release.
|
||||
release with a `+git` suffix, e.g. `3.2+git`.
|
||||
- On main, update `LATEST_RELEASE_VERSION` with the released
|
||||
version, as well as the changelog changes from the release branch.
|
||||
- _Prereleases only (e.g. 7.0-beta3):_
|
||||
- Atop the prerelease commit (e.g. `7.0-beta3`), make a commit
|
||||
updating `ZULIP_VERSION` to the prerelease version with a `+git`
|
||||
suffix, e.g. `7.0-beta3+git`. Push this to `main`. (If `main` has
|
||||
already diverged from the prerelease, a merge commit will be
|
||||
needed here.)
|
||||
- Delete the prerelease branch (e.g. `7.0-beta3-branch`); it's now
|
||||
an ancestor of `main` and thus unnecessary.
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
# Add or remove users from a stream
|
||||
|
||||
## Add users to a stream
|
||||
|
||||
By default, anyone (other than guests) subscribed to a stream can add
|
||||
users to that stream. Additionally, anyone (other than guests) can add
|
||||
users to a public stream, whether or not they are subscribed to the
|
||||
stream.
|
||||
stream. Anyone can always [unsubscribe themselves from a stream](/help/unsubscribe-from-a-stream).
|
||||
|
||||
Organization administrators can configure which
|
||||
[roles](/help/roles-and-permissions) have access to [add other users
|
||||
to a stream][configure-invites].
|
||||
Organization administrators can also unsubscribe *other* users from any stream,
|
||||
including streams the admin is not subscribed to. They can also configure which
|
||||
[roles](/help/roles-and-permissions) have access to [add other users to a
|
||||
stream][add-users] or [remove other users from a stream][remove-users].
|
||||
|
||||
[add-users]: /help/configure-who-can-invite-to-streams#configure-who-can-add-users
|
||||
[remove-users]: /help/configure-who-can-invite-to-streams#configure-who-can-remove-users
|
||||
|
||||
## Add users to a stream
|
||||
|
||||
{start_tabs}
|
||||
|
||||
@@ -50,13 +54,6 @@ subscribe the user.
|
||||
|
||||
## Remove users from a stream
|
||||
|
||||
{!admin-only.md!}
|
||||
|
||||
Anyone can always [unsubscribe themselves from a stream](/help/unsubscribe-from-a-stream).
|
||||
|
||||
Organization administrators can also unsubscribe *other* users from any stream,
|
||||
including streams the admin is not subscribed to.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{relative|stream|all}
|
||||
@@ -71,8 +68,6 @@ including streams the admin is not subscribed to.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
[configure-invites]: /help/configure-who-can-invite-to-streams
|
||||
|
||||
### From a user's profile (alternate method)
|
||||
|
||||
This method is useful if you need to remove one user from multiple streams.
|
||||
@@ -90,29 +85,6 @@ This method is useful if you need to remove one user from multiple streams.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
## Configure who can remove users
|
||||
|
||||
{!admin-only.md!}
|
||||
|
||||
Organization administrators can configure who can remove other users from a
|
||||
public stream. For private streams, administrators must be subscribed to the
|
||||
stream to configure this setting.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{relative|stream|all}
|
||||
|
||||
1. Select a stream.
|
||||
|
||||
{!select-stream-view-general.md!}
|
||||
|
||||
1. Under **Stream permissions**, configure
|
||||
**Who can unsubscribe others from this stream?**
|
||||
|
||||
{!save-changes.md!}
|
||||
|
||||
{end_tabs}
|
||||
|
||||
## Related articles
|
||||
|
||||
* [Browse and subscribe to streams](/help/browse-and-subscribe-to-streams)
|
||||
|
||||
@@ -12,5 +12,6 @@
|
||||
## Related articles
|
||||
* [Reading strategies](/help/reading-strategies)
|
||||
* [Recent conversations](/help/recent-conversations)
|
||||
* [Inbox](/help/inbox)
|
||||
* [Configure default view](/help/configure-default-view)
|
||||
* [Reading topics](/help/reading-topics)
|
||||
|
||||
@@ -67,3 +67,6 @@ recipients of GIFs from GIPHY.
|
||||
|
||||
[configure-giphy]: https://zulip.readthedocs.io/en/stable/production/giphy-gif-integration.html
|
||||
|
||||
## Related articles
|
||||
|
||||
* [Share and upload files](/help/share-and-upload-files)
|
||||
|
||||
@@ -1,18 +1,37 @@
|
||||
# Restrict stream invitation
|
||||
# Restrict stream membership management
|
||||
|
||||
{!admin-only.md!}
|
||||
|
||||
By default, anyone other than guests can add other users to streams. However,
|
||||
you can restrict the ability to do so to specific
|
||||
[roles](/help/roles-and-permissions).
|
||||
[roles](/help/roles-and-permissions). You can also can configure who can remove
|
||||
other users from a public stream. For private streams, administrators must be
|
||||
subscribed to the stream to configure these settings.
|
||||
|
||||
### Manage who can add users to streams
|
||||
## Configure who can add users
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{settings_tab|organization-permissions}
|
||||
|
||||
2. Under **Stream permissions**, configure **Who can add users to streams**.
|
||||
1. Under **Stream permissions**, configure **Who can add users to streams**.
|
||||
|
||||
{!save-changes.md!}
|
||||
|
||||
{end_tabs}
|
||||
|
||||
## Configure who can remove users
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{relative|stream|all}
|
||||
|
||||
1. Select a stream.
|
||||
|
||||
{!select-stream-view-general.md!}
|
||||
|
||||
1. Under **Stream permissions**, configure
|
||||
**Who can unsubscribe others from this stream?**
|
||||
|
||||
{!save-changes.md!}
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ There are several parameters you can set while creating a stream. All but
|
||||
* **Who can post to the stream?**: See [Stream permissions](/help/stream-permissions).
|
||||
|
||||
* **Who can unsubscribe others from this stream?**: See
|
||||
[Add or remove users from a stream](/help/add-or-remove-users-from-a-stream#configure-who-can-remove-users).
|
||||
[Restrict stream membership management](/help/configure-who-can-invite-to-streams#configure-who-can-remove-users).
|
||||
|
||||
* **Message retention period**: See
|
||||
[Message retention policy](/help/message-retention-policy#configure-message-retention-policy-for-individual-streams).
|
||||
|
||||
@@ -1,31 +1,46 @@
|
||||
# Edit or delete a message
|
||||
|
||||
!!! warn ""
|
||||
Zulip makes it possible to edit the content of your messages, letting you fix
|
||||
typos, clarify your thoughts, etc. You can also delete your messages if this is
|
||||
allowed in your organization.
|
||||
|
||||
**Note:** Editing message topic is discussed in a
|
||||
[separate guide](/help/rename-a-topic).
|
||||
Organization administrators can
|
||||
[configure](/help/restrict-message-editing-and-deletion) who can edit and delete
|
||||
messages, and set time limits for these actions. Administrators can delete other
|
||||
users' messages, but can never edit the content.
|
||||
|
||||
By default, Zulip allows you to edit the content of your messages within 10
|
||||
minutes of when you send them. Organization administrators can
|
||||
[change the time limit](/help/restrict-message-editing-and-deletion),
|
||||
remove the time limit, or remove the ability to edit messages entirely.
|
||||
!!! tip ""
|
||||
|
||||
Administrators can delete other users' messages, but can never edit the
|
||||
content.
|
||||
You can also [edit message topics](/help/rename-a-topic).
|
||||
|
||||
## Edit a message
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{tab|desktop-web}
|
||||
|
||||
{!message-actions.md!}
|
||||
|
||||
1. Click the **pencil** (<i class="fa fa-pencil"></i>) icon.
|
||||
1. Click the **pencil** (<i class="fa fa-pencil"></i>) icon. If you do not see
|
||||
the **pencil** (<i class="fa fa-pencil"></i>) icon, you do not have
|
||||
permission to edit this message.
|
||||
|
||||
1. Edit the message, and click **Save**.
|
||||
1. Edit the content of the message.
|
||||
|
||||
!!! warn ""
|
||||
**Note:** If you don't see the **pencil** (<i class="fa fa-pencil"></i>) icon,
|
||||
you are not permitted to edit this message.
|
||||
1. Click **Save**.
|
||||
|
||||
{tab|mobile}
|
||||
|
||||
{!message-long-press-menu.md!}
|
||||
|
||||
1. Tap **Edit message**. If you do not see the **Edit message** option, you do
|
||||
not have permission to edit this message.
|
||||
|
||||
1. Edit the content of the message.
|
||||
|
||||
1. Approve by tapping the **checkmark**
|
||||
(<img src="/static/images/help/mobile-check-circle-icon.svg" alt="checkmark" class="mobile-icon"/>)
|
||||
button in the bottom right corner of the app.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
@@ -36,60 +51,79 @@ content.
|
||||
[view a message's edit history](/help/view-a-messages-edit-history)
|
||||
if it is [enabled](/help/disable-message-edit-history) in your organization.
|
||||
|
||||
## Delete a message
|
||||
## Delete message content
|
||||
|
||||
Editing a message to delete its content will cause the message to be
|
||||
displayed as **(deleted)**. The original sender and timestamp of the
|
||||
message will still be displayed, and the original content of the
|
||||
message is still accessible via Zulip's [edit
|
||||
history](/help/view-a-messages-edit-history) feature. This can be the
|
||||
least confusing option for other users.
|
||||
|
||||
### Delete a message completely
|
||||
|
||||
For cases where someone accidentally shared secret information publicly
|
||||
(e.g. you posted an employee's salary), it can make sense to delete a
|
||||
message completely.
|
||||
|
||||
By default, only administrators can delete messages, though this can be
|
||||
[configured](/help/restrict-message-editing-and-deletion) by an organization
|
||||
administrator.
|
||||
Editing a message to delete its content will cause the message to be displayed
|
||||
as **(deleted)**. The original sender and timestamp of the message will still
|
||||
be displayed, and the original content of the message is still accessible via
|
||||
Zulip's [edit history](/help/view-a-messages-edit-history) feature. This can be
|
||||
the best option for avoiding confusion if other users have already responded to
|
||||
your message.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{!message-actions-menu.md!}
|
||||
{tab|desktop-web}
|
||||
|
||||
1. Select **Delete message**.
|
||||
{!message-actions.md!}
|
||||
|
||||
1. Approve by clicking **Confirm**.
|
||||
1. Click the **pencil** (<i class="fa fa-pencil"></i>) icon. If you do not see
|
||||
the **pencil** (<i class="fa fa-pencil"></i>) icon, you do not have
|
||||
permission to delete the content of this message.
|
||||
|
||||
1. Delete the content of the message.
|
||||
|
||||
1. Click **Save**.
|
||||
|
||||
{tab|mobile}
|
||||
|
||||
{!message-long-press-menu.md!}
|
||||
|
||||
1. Tap **Delete message** to delete the content of the message. If you do not
|
||||
see the **Delete message** option, you do not have permission to delete the
|
||||
content of this message.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
If you don't see the **Delete message** option, it means you don't have
|
||||
permissions to delete that message.
|
||||
## Delete a message completely
|
||||
|
||||
## How deletion works
|
||||
In some cases, such as when a message accidentally shares secret information, or
|
||||
contains spam or abuse, it makes sense to delete a message completely. Deleted
|
||||
messages will immediately disappear from the UI in all official Zulip clients.
|
||||
|
||||
* Deleted messages will immediately disappear from the UI in all
|
||||
official Zulip clients.
|
||||
* Any uploaded files referenced only by deleted messages will also be
|
||||
immediately inaccessible (An uploaded file shared in multiple
|
||||
messages will not be deleted until all of those messages are
|
||||
deleted).
|
||||
* It's important to understand that anyone who received the message
|
||||
before you deleted it could have made a copy of its content. Even if
|
||||
no one is online when you send the message, users may have received
|
||||
the message via email or mobile notifications. So if you
|
||||
accidentally shared secret information that you can change, like a
|
||||
password, you may want to change that password regardless of whether
|
||||
you also delete the message.
|
||||
* For protection against accidental or immediately regretted
|
||||
deletions, messages deleted directly or via a [message retention
|
||||
policy](/help/message-retention-policy) are archived for 30 days in a
|
||||
format that can be restored by a server administrator. After that
|
||||
time, they are permanently and irrecoverably deleted from the Zulip
|
||||
server. Server administrators can adjust the archival time using
|
||||
the `ARCHIVED_DATA_VACUUMING_DELAY_DAYS` setting.
|
||||
Any uploaded files referenced only by deleted messages will be immediately
|
||||
inaccessible. Note that an uploaded file shared in multiple messages will be
|
||||
deleted only when *all* of those messages are deleted.
|
||||
|
||||
It's important to understand that anyone who received the message
|
||||
before you deleted it could have made a copy of its content. Even if
|
||||
no one is online when you send the message, users may have received
|
||||
the message via email or mobile notifications. So if you
|
||||
accidentally shared secret information that you can change, like a
|
||||
password, you may want to change that password regardless of whether
|
||||
you also delete the message.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{tab|desktop-web}
|
||||
|
||||
{!message-actions-menu.md!}
|
||||
|
||||
1. Select **Delete message**. If you do not see the **Delete message** option,
|
||||
you do not have permission to delete this message completely.
|
||||
|
||||
2. Approve by clicking **Confirm**.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
## Restoring deleted messages
|
||||
|
||||
For protection against accidental or immediately regretted
|
||||
deletions, messages deleted directly or via a [message retention
|
||||
policy](/help/message-retention-policy) are archived for 30 days in a
|
||||
format that can be restored by a server administrator. After that
|
||||
time, they are permanently and irrecoverably deleted from the Zulip
|
||||
server. Server administrators can adjust the archival time using
|
||||
the `ARCHIVED_DATA_VACUUMING_DELAY_DAYS` setting.
|
||||
|
||||
## Related articles
|
||||
|
||||
|
||||
@@ -48,9 +48,9 @@ Like your email inbox, Zulip works best if you read it topic-by-topic.
|
||||
|
||||
{!how-to-start-a-new-topic.md!}
|
||||
|
||||
### Starting a new private thread
|
||||
### Starting a new direct message
|
||||
|
||||
{!starting-a-new-private-thread.md!}
|
||||
{!starting-a-new-direct-message.md!}
|
||||
|
||||
### Responding to an existing thread
|
||||
|
||||
|
||||
@@ -154,8 +154,8 @@ in mind about the import process:
|
||||
| Multi Channel Guest | Guest |
|
||||
| Channel creator | none |
|
||||
|
||||
- Messages in threads are imported, but they are not explicitly marked as
|
||||
being in a thread.
|
||||
- Slack threads are imported as topics with names like "2023-05-30
|
||||
Slack thread 1".
|
||||
|
||||
- Message edit history and `@user joined #channel_name` messages are not imported.
|
||||
|
||||
|
||||
37
help/inbox.md
Normal file
37
help/inbox.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# Inbox
|
||||
|
||||
The **Inbox** is the default view in the Zulip mobile app. It's a great way to
|
||||
get an overview of all the unmuted conversations where you have unread messages,
|
||||
excluding [inactive streams](/help/manage-inactive-streams).
|
||||
|
||||
The **Inbox** view shows your unread direct message conversations, followed by
|
||||
all topics with unread messages, grouped by stream. The list of streams is
|
||||
sorted alphabetically, with [pinned streams](/help/pin-a-stream) at the top.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{tab|mobile}
|
||||
|
||||
1. Tap the **Inbox**
|
||||
(<img src="/static/images/help/mobile-inbox-icon.svg" alt="inbox" class="mobile-icon"/>)
|
||||
tab in the bottom left corner of the app.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
!!! tip ""
|
||||
|
||||
You can collapse or expand the list of topics in a stream by tapping the
|
||||
**collapse**
|
||||
(<img src="/static/images/help/mobile-expand-less-icon.svg" alt="inbox" class="mobile-icon"/>)
|
||||
or **expand**
|
||||
(<img src="/static/images/help/mobile-expand-more-icon.svg" alt="inbox" class="mobile-icon"/>)
|
||||
icon to the left of a stream name.
|
||||
|
||||
## Related articles
|
||||
|
||||
* [Reading strategies](/help/reading-strategies)
|
||||
* [Recent conversations](/help/recent-conversations)
|
||||
* [All messages](/help/all-messages)
|
||||
* [Mute or unmute a stream](/help/mute-a-stream)
|
||||
* [Mute or unmute a topic](/help/mute-a-topic)
|
||||
* [Browse and subscribe to streams](/help/browse-and-subscribe-to-streams)
|
||||
@@ -9,14 +9,15 @@ Muting has the following effects:
|
||||
word](/help/dm-mention-alert-notifications#alert-words) notifications), unless
|
||||
you are [mentioned](/help/mention-a-user-or-group).
|
||||
- Messages in muted topics do not appear in the [**All messages**
|
||||
view](/help/all-messages).
|
||||
view](/help/all-messages) or the mobile **Inbox** view.
|
||||
- Muted topics appear in the [**Recent conversations**
|
||||
view](/help/recent-conversations) only if the **Include muted** filter is
|
||||
enabled.
|
||||
- Unread messages in muted topics do not contribute to stream unread counts.
|
||||
- In the left sidebar, muted topics and streams are grayed out. They are also
|
||||
sorted to the bottom of their stream (for topics) or stream section (for
|
||||
streams).
|
||||
- Muted topics and streams are grayed out in the left sidebar of the desktop/web
|
||||
app, and in the mobile app.
|
||||
- In the desktop/web app, muted topics are sorted to the bottom of their stream,
|
||||
and muted streams are sorted to the bottom of their stream section.
|
||||
|
||||
!!! warn ""
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
Use the **Recent conversations** view to get an overview of all the ongoing
|
||||
conversations. This view is particularly useful for catching up on
|
||||
messages sent while you were away.
|
||||
In Zulip, a **conversation** is a [direct message](/help/direct-messages) thread
|
||||
(one-on-one or with a group), or a [topic in a
|
||||
stream](/help/streams-and-topics). Use the **Recent conversations** view to get
|
||||
an overview of all the ongoing conversations. This view is particularly useful
|
||||
for catching up on messages sent while you were away.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
!!! tip ""
|
||||
|
||||
You can switch from composing a stream message to a composing a direct
|
||||
You can switch from composing a stream message to composing a direct
|
||||
message by selecting **Direct message** from the dropdown in the upper left
|
||||
of the compose box.
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* [Reading topics](/help/reading-topics)
|
||||
* [Reading direct messages (DMs)](/help/reading-dms)
|
||||
* [Starting a new topic](/help/starting-a-new-topic)
|
||||
* [Starting a new private thread](/help/starting-a-new-private-thread)
|
||||
* [Starting a new direct message](/help/starting-a-new-direct-message)
|
||||
* [Replying to messages](/help/replying-to-messages)
|
||||
* [Messaging tips & tricks](/help/messaging-tips)
|
||||
* [Keyboard shortcuts](/help/keyboard-shortcuts)
|
||||
@@ -88,6 +88,7 @@
|
||||
* [Reading strategies](/help/reading-strategies)
|
||||
* [Recent conversations](/help/recent-conversations)
|
||||
* [All messages](/help/all-messages)
|
||||
* [Inbox](/help/inbox)
|
||||
* [Message actions](/help/message-actions)
|
||||
* [Marking messages as read](/help/marking-messages-as-read)
|
||||
* [Marking messages as unread](/help/marking-messages-as-unread)
|
||||
@@ -186,7 +187,7 @@
|
||||
* [Public access option](/help/public-access-option)
|
||||
* [Stream posting policy](/help/stream-sending-policy)
|
||||
* [Restrict stream creation](/help/configure-who-can-create-streams)
|
||||
* [Restrict stream invitation](/help/configure-who-can-invite-to-streams)
|
||||
* [Restrict stream membership management](/help/configure-who-can-invite-to-streams)
|
||||
* [Add or remove users from a stream](/help/add-or-remove-users-from-a-stream)
|
||||
* [Set default streams for new users](/help/set-default-streams-for-new-users)
|
||||
* [Rename a stream](/help/rename-a-stream)
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
|
||||
!!! tip ""
|
||||
|
||||
Rather than kicking off a group thread, consider starting the
|
||||
Rather than kicking off a group direct message, consider starting the
|
||||
conversation in a new topic to make it easier to browse later on.
|
||||
@@ -14,9 +14,8 @@
|
||||
|
||||
{!start-composing.md!}
|
||||
|
||||
1. Wrap the link text in square brackets followed by the URL
|
||||
wrapped in parentheses to create a named link:
|
||||
`[link text](URL)`
|
||||
1. To create a named link, use `[ ]` around the link text, and `( )` around the
|
||||
URL: `[Link text](URL)`.
|
||||
|
||||
!!! keyboard_tip ""
|
||||
|
||||
|
||||
@@ -100,21 +100,21 @@ in the Zulip app to add more to your repertoire as needed.
|
||||
|
||||
## Composing messages
|
||||
|
||||
* **Reply to message**: <kbd>R</kbd> or <kbd>Enter</kbd> — Reply to the
|
||||
selected message (outlined in blue). Same behavior as clicking on the
|
||||
message.
|
||||
|
||||
* **Reply to message, mentioning author**: <kbd>@</kbd>
|
||||
|
||||
* **Reply only to author**: <kbd>Shift</kbd> + <kbd>R</kbd>
|
||||
|
||||
* **Quote and reply to message**: <kbd>></kbd>
|
||||
|
||||
* **New stream message**: <kbd>C</kbd> — For starting a new topic in a
|
||||
stream.
|
||||
|
||||
* **New direct message**: <kbd>X</kbd>
|
||||
|
||||
* **Reply to message**: <kbd>R</kbd> or <kbd>Enter</kbd> — Reply to the
|
||||
selected message (outlined in blue). Same behavior as clicking on the
|
||||
message.
|
||||
|
||||
* **Quote and reply to message**: <kbd>></kbd>
|
||||
|
||||
* **Reply directly to sender**: <kbd>Shift</kbd> + <kbd>R</kbd>
|
||||
|
||||
* **Reply @-mentioning sender**: <kbd>@</kbd>
|
||||
|
||||
### In the compose box
|
||||
|
||||
* **Send message**: <kbd>Enter</kbd>, <kbd>Tab</kbd> then <kbd>Enter</kbd>,
|
||||
|
||||
@@ -23,7 +23,7 @@ are at your computer. You will still be able to
|
||||
|
||||
1. Under **Advanced**, click on the **Automatically mark messages as
|
||||
read** dropdown, and select **Always**, **Never** or **Only in
|
||||
conversation views**.
|
||||
[conversation](/help/recent-conversations) views**.
|
||||
|
||||
{tab|mobile}
|
||||
|
||||
@@ -33,7 +33,8 @@ are at your computer. You will still be able to
|
||||
|
||||
1. Tap **Mark messages as read on scroll**.
|
||||
|
||||
1. Select **Always**, **Never** or **Only in conversation views**.
|
||||
1. Select **Always**, **Never** or **Only in
|
||||
[conversation](/help/recent-conversations) views**.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ Standard hosting.
|
||||
if you discover a misconfiguration accidentally deleted content you
|
||||
meant to preserve, contact Zulip support promptly for assistance with
|
||||
restoration. See the [deletion
|
||||
documentation](/help/edit-or-delete-a-message#how-deletion-works) for
|
||||
documentation](/help/edit-or-delete-a-message#delete-a-message-completely) for
|
||||
more details on precisely how message deletion works in Zulip.
|
||||
|
||||
## Related articles
|
||||
|
||||
@@ -6,5 +6,5 @@
|
||||
|
||||
* [Getting started with Zulip](/help/getting-started-with-zulip)
|
||||
* [Starting a new topic](/help/starting-a-new-topic)
|
||||
* [Starting a new private thread](/help/starting-a-new-private-thread)
|
||||
* [Starting a new direct message](/help/starting-a-new-direct-message)
|
||||
* [Replying to messages](/help/replying-to-messages)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
{!mute-unmute-intro.md!}
|
||||
|
||||
## Mute a topic
|
||||
## Configure topic notifications in unmuted streams
|
||||
|
||||
{start_tabs}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
{!topic-actions.md!}
|
||||
|
||||
1. Select **Mute topic**.
|
||||
1. Select **Mute topic** or **Unmute topic**.
|
||||
|
||||
!!! tip ""
|
||||
|
||||
@@ -21,13 +21,13 @@
|
||||
|
||||
{!topic-long-press-menu.md!}
|
||||
|
||||
1. Tap **Mute topic**.
|
||||
1. Tap **Mute topic** or **Unmute topic**.
|
||||
|
||||
{!topic-long-press-menu-tip.md!}
|
||||
|
||||
{end_tabs}
|
||||
|
||||
## Unmute a topic
|
||||
## Configure topic notifications in muted streams
|
||||
|
||||
{start_tabs}
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
{!topic-actions.md!}
|
||||
|
||||
1. Select **Unmute topic**.
|
||||
1. Select **Unmute topic** or **Mute topic**.
|
||||
|
||||
!!! tip ""
|
||||
|
||||
@@ -44,9 +44,19 @@
|
||||
|
||||
{tab|mobile}
|
||||
|
||||
1. Tap the **Streams**
|
||||
(<img src="/static/images/help/mobile-hash-icon.svg" alt="hash" class="mobile-icon"/>)
|
||||
tab at the bottom of the app.
|
||||
|
||||
1. Select a grayed-out (muted) stream from the streams list.
|
||||
|
||||
1. Tap the **Topics list**
|
||||
(<img src="/static/images/help/mobile-list-icon.svg" alt="list" class="mobile-icon"/>)
|
||||
icon in the upper right corner of the app.
|
||||
|
||||
{!topic-long-press-menu.md!}
|
||||
|
||||
1. Tap **Unmute topic**.
|
||||
1. Tap **Unmute topic** or **Mute topic**.
|
||||
|
||||
{!topic-long-press-menu-tip.md!}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ arrow if the box is empty.
|
||||
|
||||
* [Getting started with Zulip](/help/getting-started-with-zulip)
|
||||
* [Starting a new topic](/help/starting-a-new-topic)
|
||||
* [Starting a new private thread](/help/starting-a-new-private-thread)
|
||||
* [Starting a new direct message](/help/starting-a-new-direct-message)
|
||||
* [Replying to messages](/help/replying-to-messages)
|
||||
* [Messaging tips & tricks](/help/messaging-tips)
|
||||
* [Keyboard shortcuts](/help/keyboard-shortcuts)
|
||||
|
||||
@@ -21,7 +21,7 @@ to avoid unnecessarily mentioning someone twice.
|
||||
|
||||
{!message-actions-menu.md!}
|
||||
|
||||
1. Click **Quote and reply or forward**.
|
||||
1. Click **Quote and reply**.
|
||||
|
||||
1. *(optional)* Delete any parts of the quoted message that are not
|
||||
relevant to your reply.
|
||||
@@ -30,7 +30,7 @@ to avoid unnecessarily mentioning someone twice.
|
||||
|
||||
!!! keyboard_tip ""
|
||||
|
||||
You can also use <kbd>></kbd> to **quote and reply or forward** the
|
||||
You can also use <kbd>></kbd> to **quote and reply** to the
|
||||
selected message.
|
||||
|
||||
{tab|mobile}
|
||||
@@ -54,7 +54,7 @@ to avoid unnecessarily mentioning someone twice.
|
||||
|
||||
{!message-actions-menu.md!}
|
||||
|
||||
1. Click **Quote and reply or forward**.
|
||||
1. Click **Quote and reply**.
|
||||
|
||||
1. *(optional)* Delete any parts of the quoted message that you don't want to
|
||||
forward.
|
||||
@@ -68,8 +68,7 @@ to avoid unnecessarily mentioning someone twice.
|
||||
|
||||
!!! keyboard_tip ""
|
||||
|
||||
You can also use <kbd>></kbd> to **quote and reply or forward** the
|
||||
selected message.
|
||||
You can also use <kbd>></kbd> to forward the selected message.
|
||||
|
||||
{tab|mobile}
|
||||
|
||||
|
||||
@@ -12,4 +12,5 @@
|
||||
* [Reading topics](/help/reading-topics)
|
||||
* [Reading strategies](/help/reading-strategies)
|
||||
* [All messages](/help/all-messages)
|
||||
* [Inbox](/help/inbox)
|
||||
* [Configure default view](/help/configure-default-view)
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
|
||||
* [Getting started with Zulip](/help/getting-started-with-zulip)
|
||||
* [Starting a new topic](/help/starting-a-new-topic)
|
||||
* [Starting a new private thread](/help/starting-a-new-private-thread)
|
||||
* [Starting a new direct message](/help/starting-a-new-direct-message)
|
||||
* [Quote and reply](/help/quote-and-reply)
|
||||
* [Messaging tips & tricks](/help/messaging-tips)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{!admin-only.md!}
|
||||
|
||||
Zulip supports using SAML authentication for single sign-on, both for Zulip
|
||||
Cloud and self-hosted Zulip servers.
|
||||
Cloud and self-hosted Zulip servers. SAML Single Logout is also supported.
|
||||
|
||||
This page describes how to configure SAML authentication with several common providers:
|
||||
|
||||
|
||||
@@ -21,6 +21,11 @@ can schedule a message for next morning to avoid disturbing others.
|
||||
|
||||
1. Select one of the suggested scheduling options, or pick a custom time.
|
||||
|
||||
!!! keyboard_tip ""
|
||||
|
||||
From the compose box, you can use <kbd>Tab</kbd>, <kbd>Tab</kbd>,
|
||||
<kbd>Enter</kbd> to open the compose menu and start scheduling a message.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
## Edit or reschedule a message
|
||||
|
||||
@@ -1,21 +1,103 @@
|
||||
# Share and upload files
|
||||
|
||||
Attach files to messages, including images, documents, sound, and video.
|
||||
Zulip supports attaching multiple files to messages, including images,
|
||||
documents, sound, and video. You can edit the names of the files others see
|
||||
after you upload them.
|
||||
|
||||
First, [open the compose box](/help/open-the-compose-box). Then
|
||||
Zulip will automatically generate a **thumbnail** for each file when you send
|
||||
the message, if it can. Image thumbnails will be shown directly in the message,
|
||||
and you can click on a thumbnail to [view the full image](/help/view-and-browse-images).
|
||||
|
||||
* **Drag and drop** files into the compose box.
|
||||
* **Copy and paste** files into the compose box.
|
||||
* Click the **paperclip** (<i class="fa fa-paperclip"></i>) icon at
|
||||
the bottom of the compose box to find files on your computer.
|
||||
## Uploading files
|
||||
|
||||
Zulip will insert a link to the file, in Markdown format:
|
||||
`[link text](URL)`. You can modify the `link text` to whatever you want.
|
||||
{start_tabs}
|
||||
|
||||
Zulip will automatically generate a **thumbnail** of the file when you send
|
||||
it, if it can. You can
|
||||
[preview the message](/help/preview-your-message-before-sending) before
|
||||
sending to see what the thumbnail will look like.
|
||||
{tab|via-markdown}
|
||||
|
||||
{!start-composing.md!}
|
||||
|
||||
1. Drag and drop files, or copy and paste one or more files into the compose
|
||||
box. Zulip will upload the files, and insert named links using
|
||||
[Markdown formatting](/help/format-your-message-using-markdown#links):
|
||||
`[Link text](URL)`.
|
||||
|
||||
1. _(optional)_ Modify the link text as desired.
|
||||
|
||||
!!! tip ""
|
||||
|
||||
You can [preview the message](/help/preview-your-message-before-sending)
|
||||
before sending to see what your uploaded files will look like.
|
||||
|
||||
{tab|via-compose-box-buttons}
|
||||
|
||||
{!start-composing.md!}
|
||||
|
||||
1. Click the **paperclip** (<i class="fa fa-paperclip"></i>) icon at
|
||||
the bottom of the compose box to select one or more files. Zulip will upload
|
||||
the files, and insert named links using
|
||||
[Markdown formatting](/help/format-your-message-using-markdown#links):
|
||||
`[Link text](URL)`.
|
||||
|
||||
1. _(optional)_ Modify the link text as desired.
|
||||
|
||||
!!! tip ""
|
||||
|
||||
You can [preview the message](/help/preview-your-message-before-sending)
|
||||
before sending to see what your uploaded files will look like.
|
||||
|
||||
{tab|mobile}
|
||||
|
||||
1. Navigate to a stream, topic, or direct message view.
|
||||
|
||||
1. Tap the
|
||||
**paperclip** (<img src="/static/images/help/mobile-paperclip-icon.svg" alt="paperclip" class="mobile-icon"/>),
|
||||
**image** (<img src="/static/images/help/mobile-image-icon.svg" alt="image" class="mobile-icon"/>),
|
||||
or **camera** (<img src="/static/images/help/mobile-camera-icon.svg" alt="camera" class="mobile-icon"/>)
|
||||
button at the bottom of the app to select one or more files. Zulip will
|
||||
upload the files, and insert named links using
|
||||
[Markdown formatting](/help/format-your-message-using-markdown#links):
|
||||
`[Link text](URL)`.
|
||||
|
||||
1. _(optional)_ Modify the link text as desired.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
!!! tip ""
|
||||
|
||||
The link text will default to the name of the uploaded file.
|
||||
|
||||
## Sharing files
|
||||
|
||||
You can share files from other apps on Zulip.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{tab|android}
|
||||
|
||||
1. Select one or more files and tap the **Zulip**
|
||||
(<img src="/static/images/logo/zulip-icon-circle.svg" alt="logo" class="mobile-icon"/>)
|
||||
logo.
|
||||
|
||||
1. Select a stream name and topic name, or tap the
|
||||
**Direct message** tab and **Choose recipients**.
|
||||
|
||||
1. _(optional)_ Write a message.
|
||||
|
||||
1. Tap the **Send** button.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
## Named file example
|
||||
|
||||
### What you type
|
||||
|
||||
```
|
||||
[A whale of a good time](https://your.zulip.domain/user_uploads/1/46/IPvysqXEtiTG1ZdNBrwAZODi/whale-time.png)
|
||||
```
|
||||
|
||||
### What it looks like
|
||||
|
||||

|
||||
|
||||
## Troubleshooting info
|
||||
|
||||
@@ -29,3 +111,4 @@ This limit can be changed by the server administrator.
|
||||
|
||||
* [Manage your uploaded files](/help/manage-your-uploaded-files)
|
||||
* [View and browse images](/help/view-and-browse-images)
|
||||
* [Animated GIFs](/help/animated-gifs-from-giphy)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Starting a new private thread
|
||||
# Starting a new direct message
|
||||
|
||||
{!starting-a-new-private-thread.md!}
|
||||
{!starting-a-new-direct-message.md!}
|
||||
|
||||
## Related articles
|
||||
|
||||
@@ -11,6 +11,6 @@
|
||||
## Related articles
|
||||
|
||||
* [Getting started with Zulip](/help/getting-started-with-zulip)
|
||||
* [Starting a new private thread](/help/starting-a-new-private-thread)
|
||||
* [Starting a new direct message](/help/starting-a-new-direct-message)
|
||||
* [Replying to messages](/help/replying-to-messages)
|
||||
* [Messaging tips & tricks](/help/messaging-tips)
|
||||
|
||||
@@ -62,7 +62,8 @@ and compose box. Status emoji and status messages are also shown on
|
||||
!!! tip ""
|
||||
|
||||
You can also click on a user's profile picture or name on a message they
|
||||
sent to view their status in their **user card**.
|
||||
sent to view their status in their **user card**, or configure status text
|
||||
to always be shown in the right sidebar.
|
||||
|
||||
{tab|mobile}
|
||||
|
||||
@@ -75,6 +76,27 @@ and compose box. Status emoji and status messages are also shown on
|
||||
|
||||
{end_tabs}
|
||||
|
||||
### Configure how statuses are displayed
|
||||
|
||||
You can choose whether or not status text is displayed in the right sidebar.
|
||||
With the compact option, only status emoji are shown.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{tab|desktop-web}
|
||||
|
||||
{settings_tab|display-settings}
|
||||
|
||||
1. Under **Advanced**, select **Compact** or **Show status and text** for the
|
||||
user list style.
|
||||
|
||||
!!! tip ""
|
||||
|
||||
You can always hover over a user's name in the right sidebar to view their
|
||||
status message if they have one set.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
## Availability
|
||||
|
||||
There are three availability states:
|
||||
|
||||
@@ -64,7 +64,7 @@ administrator can access private stream messages:
|
||||
| View stream name | ✔ | ✔ | ✔ | ◾
|
||||
| Join | ✔ | ✔ | ✔ |
|
||||
| Unsubscribe | ◾ | ◾ | ◾ | ◾
|
||||
| Add others | ✔ | ✔ | ✔ |
|
||||
| Add others | ✔ | ✶ | ✶ |
|
||||
| Remove others | ✔ | ✶ | ✶ | ✶
|
||||
| See subscriber list | ✔ | ✔ | ✔ | ◾
|
||||
| See full history | ✔ | ✔ | ✔ | ◾
|
||||
@@ -80,8 +80,9 @@ administrator can access private stream messages:
|
||||
<span class="legend_symbol">◾</span><span class="legend_label">If subscribed to the stream</span>
|
||||
|
||||
<span class="legend_symbol">✶</span><span class="legend_label">
|
||||
Configurable. See [Stream posting policy](/help/stream-sending-policy) and
|
||||
[Configure who can remove users](/help/add-or-remove-users-from-a-stream#configure-who-can-remove-users)
|
||||
Configurable. See [Stream posting policy](/help/stream-sending-policy),
|
||||
[Configure who can add users][add-users], and
|
||||
[Configure who can remove users][remove-users]
|
||||
for details.
|
||||
</span>
|
||||
|
||||
@@ -93,7 +94,7 @@ for details.
|
||||
| View stream name | ✔ | ◾ | ◾ | ◾
|
||||
| Join | | | |
|
||||
| Unsubscribe | ◾ | ◾ | ◾ | ◾
|
||||
| Add others | ◾ | ◾ | ◾ |
|
||||
| Add others | ◾ | ✶ | ✶ |
|
||||
| Remove others | ✔ | ✶ | ✶ | ✶
|
||||
| See subscriber list | ✔ | ◾ | ◾ | ◾
|
||||
| See full history | ✶ | ✶ | ✶ | ✶
|
||||
@@ -110,8 +111,9 @@ for details.
|
||||
|
||||
<span class="legend_symbol">✶</span><span class="legend_label">
|
||||
Configurable, but at minimum must be subscribed to the stream.
|
||||
See [Stream posting policy](/help/stream-sending-policy) and
|
||||
[Configure who can remove users](/help/add-or-remove-users-from-a-stream#configure-who-can-remove-users)
|
||||
See [Stream posting policy](/help/stream-sending-policy),
|
||||
[Configure who can add users][add-users], and
|
||||
[Configure who can remove users][remove-users]
|
||||
for details.
|
||||
</span>
|
||||
|
||||
@@ -120,3 +122,6 @@ for details.
|
||||
* [Roles and permissions](/help/roles-and-permissions)
|
||||
* [Stream sending policy](/help/stream-sending-policy)
|
||||
* [Web-public streams](/help/public-access-option)
|
||||
|
||||
[add-users]: /help/configure-who-can-invite-to-streams#configure-who-can-add-users
|
||||
[remove-users]: /help/configure-who-can-invite-to-streams#configure-who-can-remove-users
|
||||
|
||||
@@ -49,17 +49,12 @@ Collective](https://opencollective.com/zulip).
|
||||
[Python API](https://github.com/zulip/python-zulip-api).
|
||||
|
||||
* **Review** Zulip on product comparison websites, such as
|
||||
[Capterra](https://reviews.capterra.com/new/197945) and
|
||||
[G2](https://www.g2.com/products/zulip/take_survey). Organizations rely on
|
||||
[G2](https://www.g2.com/products/zulip/reviews/start) and [Software
|
||||
Advice](https://reviews.softwareadvice.com/new/316022). Organizations rely on
|
||||
review sites more and more when choosing software for their team, and sharing
|
||||
your experience with Zulip (good or bad) helps them evaluate whether Zulip
|
||||
might work for their needs.
|
||||
|
||||
!!! tip ""
|
||||
For a limited time, you can receive a $15 gift card by leaving a Capterra
|
||||
review using [this
|
||||
link](https://reviews.capterra.com/new/197945/b0a11684-ef99-43d0-8cb8-1b4afac9b03b?lang=en).
|
||||
|
||||
* **Mention** Zulip on social media, or like and retweet [Zulip's
|
||||
tweets](https://twitter.com/zulip).
|
||||
|
||||
@@ -71,10 +66,11 @@ Collective](https://opencollective.com/zulip).
|
||||
|
||||
## Help improve Zulip
|
||||
|
||||
* [**Report
|
||||
issues**](https://zulip.readthedocs.io/en/stable/contributing/contributing.html#reporting-issues),
|
||||
including both feature requests and bug reports. Many improvements to the
|
||||
Zulip app start with a user's suggestion.
|
||||
* **Report issues**, including both [feature
|
||||
requests](https://zulip.readthedocs.io/en/latest/contributing/suggesting-features.html)
|
||||
and [bug
|
||||
reports](https://zulip.readthedocs.io/en/latest/contributing/reporting-bugs.html).
|
||||
Many improvements to the Zulip app start with a user's suggestion.
|
||||
|
||||
* [**Give
|
||||
feedback**](https://zulip.readthedocs.io/en/stable/contributing/contributing.html#user-feedback)
|
||||
|
||||
@@ -10,13 +10,25 @@ web app your organization is using.
|
||||
Zulip Cloud organizations are always updated to the latest version of Zulip.
|
||||
|
||||
[upgrade-zulip]:
|
||||
https://zulip.readthedocs.io/en/stable/production/upgrade-or-modify.html
|
||||
[changelog]: https://zulip.readthedocs.io/en/stable/overview/changelog.html
|
||||
https://zulip.readthedocs.io/en/latest/production/upgrade-or-modify.html
|
||||
[changelog]: https://zulip.readthedocs.io/en/latest/overview/changelog.html
|
||||
|
||||
### View Zulip server and web app version
|
||||
|
||||
{start_tabs}
|
||||
|
||||
{tab|v6}
|
||||
|
||||
1. Click on the **gear** (<i class="fa fa-cog"></i>) icon in the upper
|
||||
right corner of the web or desktop app.
|
||||
|
||||
1. View the version number or Zulip Cloud plan in the top section of the menu.
|
||||
|
||||
1. *(optional)* Click on the version number or Zulip Cloud plan for additional
|
||||
details.
|
||||
|
||||
{tab|v4}
|
||||
|
||||
{relative|gear|about-zulip}
|
||||
|
||||
1. View the version number under **Zulip Server**.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -123,7 +123,7 @@
|
||||
"Alert words allow you to be notified as if you were @-mentioned when certain words or phrases are used in Zulip. Alert words are not case sensitive.": "تتيح لك كلمات التنبيه أن يتم إشعارك كما لو تمت الإشارة إليك @ عند استخدام كلمات أو عبارات معينة في \"زوليب\". كلمات التنبيه ليست حساسة لحالة الأحرف.",
|
||||
"Alerted messages": "",
|
||||
"All": "الجميع",
|
||||
"All direct messages": "",
|
||||
"All direct messages": "كل الرسائل المباشرة",
|
||||
"All messages": "جميع الرسائل",
|
||||
"All messages including muted streams": "جميع الرسائل بما في ذلك الغرف الصامتة",
|
||||
"All streams": "كل التيارات",
|
||||
@@ -201,7 +201,7 @@
|
||||
"Card": "",
|
||||
"Center the view around message ID <z-value></z-value>.": "قم بتوسيط العرض حول الـ ID الخاص بالرسالة<z-value></z-value> .",
|
||||
"Change": "تغيير",
|
||||
"Change avatar": "",
|
||||
"Change avatar": "تغيير الصورة الرمزية",
|
||||
"Change color": "غير اللون",
|
||||
"Change email": "تغيير البريد الالكتروني",
|
||||
"Change group info": "تغيير معلومات المجموعة",
|
||||
@@ -225,7 +225,7 @@
|
||||
"Code playgrounds": "مكان تجربة الشِفرة",
|
||||
"Code playgrounds are interactive in-browser development environments, such as <z-link-repl>replit</z-link-repl>, that are designed to make it convenient to edit and debug code. Zulip <z-link-code-blocks>code blocks</z-link-code-blocks> that are tagged with a programming language will have a button visible on hover that allows users to open the code block on the code playground site.": "",
|
||||
"Collapse compose": "طي التأليف",
|
||||
"Collapse direct messages": "",
|
||||
"Collapse direct messages": "تصغير الرسائل المباشرة",
|
||||
"Collapse message": "طي الرسالة",
|
||||
"Collapse/show selected message": "طي/ إظهار الرسالة المحددة ",
|
||||
"Community": "مجتمع",
|
||||
@@ -233,7 +233,6 @@
|
||||
"Compact": "المدمج",
|
||||
"Complete": "اكتمل",
|
||||
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "أكمل ال<z-link> الملف التعريفي للمنظمة</z-link> للعلامة التجارية واشرح الغرض من منظمة \"زوليب\" هذه.",
|
||||
"Compose a reply @-mentioning author": "تأليف رد @-mentioning مؤلف",
|
||||
"Compose message": "اكتب رسالة",
|
||||
"Compose your message here": "اكتب رسالتك هنا",
|
||||
"Compose your message here...": "ألّف رسالتك هنا...",
|
||||
@@ -281,12 +280,12 @@
|
||||
"Custom profile fields": "حقول الملف الشخصي المخصصة",
|
||||
"Custom time": "وقت مخصص",
|
||||
"Cycle between stream narrows": "حلقة بين تضييقات العرض في الغرفة ",
|
||||
"DIRECT MESSAGES": "",
|
||||
"DIRECT MESSAGES": "الرسائل المباشرة",
|
||||
"DM": "",
|
||||
"DMs, mentions, and alerts": "",
|
||||
"Dark": "",
|
||||
"Dark": "المضلم",
|
||||
"Dark theme": "الوضع المظلم",
|
||||
"Dark theme logo": "",
|
||||
"Dark theme logo": "شعار الوضع المضلم",
|
||||
"Data exports": "تصدير البيانات",
|
||||
"Date muted": "تاريخ الوضع الصامت",
|
||||
"Date updated": "",
|
||||
@@ -348,8 +347,8 @@
|
||||
"Detailed keyboard shortcuts documentation": "توثيق مفصل لاختصارات لوحة المفاتيح",
|
||||
"Detailed message formatting documentation": "توثيق مفصل لتنسيق الرسالة",
|
||||
"Detailed search filters documentation": "",
|
||||
"Direct message": "",
|
||||
"Direct messages": "",
|
||||
"Direct message": "رسالة مباشرة",
|
||||
"Direct messages": "الرسائل المباشرة",
|
||||
"Direct messages and mentions": "",
|
||||
"Direct messages are disabled in this organization.": "",
|
||||
"Direct messages disabled": "",
|
||||
@@ -504,7 +503,7 @@
|
||||
"For example, to configure a code playground for code blocks tagged as Python, you can set:": "",
|
||||
"For more examples and technical details, see the <z-link>help center documentation</z-link> on adding code playgrounds.": "",
|
||||
"For more examples, see the <z-link>help center documentation</z-link> on adding linkifiers.": "",
|
||||
"Forgot it?": "",
|
||||
"Forgot it?": "نسيت؟",
|
||||
"Forked from upstream at {zulip_merge_base}": "متشعب من المنبع في {zulip_merge_base}",
|
||||
"Friday": "الجمعة",
|
||||
"Full name": "الاسم الكامل",
|
||||
@@ -564,7 +563,7 @@
|
||||
"Invalid URL": "عنوان URL غير صالح",
|
||||
"Invalid stream ID": "مُعرف غرفة غير صالح",
|
||||
"Invalid time format: {timestamp}": "تنسيق الوقت غير صالح: {timestamp}",
|
||||
"Invalid user": "",
|
||||
"Invalid user": "مستخدم غير صالح",
|
||||
"Invalid users": "",
|
||||
"Invitation expires after": "تنتهي الدعوة بعد",
|
||||
"Invitations": "الدعوات",
|
||||
@@ -617,7 +616,7 @@
|
||||
"Link:": "رابط:",
|
||||
"Linkifiers": "الروابط",
|
||||
"Linkifiers make it easy to refer to issues or tickets in third party issue trackers, like GitHub, Salesforce, Zendesk, and others. For instance, you can add a linkifier that automatically turns #2468 into a link to the GitHub issue in the Zulip repository with:": "",
|
||||
"Loading…": "",
|
||||
"Loading…": "جار التحميل...",
|
||||
"Local time": "الوقت المحلي",
|
||||
"Log in": "تسجيل الدخول",
|
||||
"Log in to browse more streams": "",
|
||||
@@ -701,8 +700,8 @@
|
||||
"Narrow to all unmuted messages": "تضييق العرض لجميع الرسائل غير المكتومة",
|
||||
"Narrow to current compose box recipient": "تضييق العرض لمستلم مربع التأليف الحالي",
|
||||
"Narrow to direct messages that include <z-value></z-value>.": "",
|
||||
"Narrow to direct messages with <z-value></z-value>.": "",
|
||||
"Narrow to direct messages.": "",
|
||||
"Narrow to direct messages with <z-value></z-value>.": "تضييق العرض إلى الرسائل المباشرة مع <z-value></z-value>.",
|
||||
"Narrow to direct messages.": "ضييق إلى الرسائل المباشرة.",
|
||||
"Narrow to just message ID <z-value></z-value>.": "تضييق العرض لـ ID الرسالة فقط<z-value></z-value>.",
|
||||
"Narrow to messages containing images.": "تضييق العرض على الرسائل التي تحتوي على صور.",
|
||||
"Narrow to messages containing links.": "تضييق العرض للرسائل التي تحتوي على روابط.",
|
||||
@@ -714,7 +713,7 @@
|
||||
"Narrow to messages that mention you.": "تضييق العرض للرسائل التي تشير إليك.",
|
||||
"Narrow to messages with alert words.": "تضييق العرض للرسائل مع كلمات التنبيه.",
|
||||
"Narrow to messages with topic <z-value></z-value>.": "تضييق العرض على رسائل موضوع <z-value></z-value>.",
|
||||
"Narrow to next unread direct message": "",
|
||||
"Narrow to next unread direct message": "ضيق إلى الرسالة المباشرة الغير المقروءة التالية",
|
||||
"Narrow to next unread topic": "تضييق العرض على المواضيع غير المقروءة التالية",
|
||||
"Narrow to starred messages.": "تضييق العرض إلى الرسائل المميزة بنجمة.",
|
||||
"Narrow to stream from topic view": "",
|
||||
@@ -727,7 +726,7 @@
|
||||
"Never ask on this computer": "لا تسأل أبدًا على هذا الكمبيوتر",
|
||||
"Never expires": "لا تنتهي أبدًا",
|
||||
"New": "جديد",
|
||||
"New direct message": "",
|
||||
"New direct message": "رسائلة مباشرة جديدة",
|
||||
"New email": "بريد إلكتروني جديد",
|
||||
"New message": "رسالة جديدة",
|
||||
"New option": "خيار جديد",
|
||||
@@ -739,7 +738,7 @@
|
||||
"New topic": "موضوع جديد",
|
||||
"New user announcements": "إعلانات المستخدم الجديد",
|
||||
"Next message": "الرسالة التالية",
|
||||
"Next unread direct message": "",
|
||||
"Next unread direct message": "الرسالة المباشرة الغير مقروءة التالية",
|
||||
"Next unread topic": "الموضوع غير المقروء التالي",
|
||||
"Next week": "الاسبوع القادم",
|
||||
"No bots match your current filter.": "لا روبوتات تطابق تصفيتك الحالية.",
|
||||
@@ -800,6 +799,7 @@
|
||||
"Only organization owners may deactivate an organization.": "",
|
||||
"Only owners can change these settings.": "يمكن فقط للمالكين تغيير هذه الإعدادات.",
|
||||
"Only stream members can add users to a private stream": "يمكن فقط لأعضاء الغرفة إضافة مستخدمين إلى الغرفة الخاصة",
|
||||
"Only stream members can add users to a private stream.": "",
|
||||
"Only subscribers to this stream can edit stream permissions.": "يمكن للمشتركين في هذه الغرفة فقط تعديل أذونات الغرفة.",
|
||||
"Open": "فتح",
|
||||
"Open message menu": "فتح قائمة الرسائل",
|
||||
@@ -875,7 +875,7 @@
|
||||
"Pronouns": "الضمائر",
|
||||
"Public": "عام",
|
||||
"Question": "سؤال",
|
||||
"Quote and reply or forward": "اقتبس ورد أو أعد التوجيه",
|
||||
"Quote and reply": "",
|
||||
"Quote and reply to message": "اقتبس ورد على الرسالة",
|
||||
"Quoted original email (in replies)": "",
|
||||
"React to selected message with": "تفاعل مع الرسالة المحددة مع",
|
||||
@@ -894,9 +894,10 @@
|
||||
"Removed successfully.": "تمت الإزالة بنجاح.",
|
||||
"Rename topic": "",
|
||||
"Rename topic to:": "",
|
||||
"Reply @-mentioning sender": "",
|
||||
"Reply directly to sender": "رد المباشر الي المرسل",
|
||||
"Reply mentioning bot": "الرد بذكر الروبوت",
|
||||
"Reply mentioning user": "الرد بذكر المستخدم",
|
||||
"Reply to author": "الرد على المؤلف",
|
||||
"Reply to message": "الرد على الرسالة",
|
||||
"Reply to selected conversation": "",
|
||||
"Reply to selected message": "الرد على الرسالة المحددة",
|
||||
@@ -955,10 +956,10 @@
|
||||
"Send automated notice to old topic": "ارسال ملاحظة تلقائية لموضوع قديم",
|
||||
"Send digest emails when I'm away": "إرسال موجز رسائل البريد الإلكتروني عندما أكون بعيدًا",
|
||||
"Send digest emails when user is away": "إرسال موجز رسائل البريد الإلكتروني عندما يكون المستخدم بعيدًا",
|
||||
"Send direct message": "",
|
||||
"Send direct message": "بعث رسالة مباشرة",
|
||||
"Send email notifications for new logins to my account": "إرسال إشعارات البريد الإلكتروني لعمليات تسجيل الدخول الجديدة إلى حسابي",
|
||||
"Send emails introducing Zulip to new users": "إرسال رسائل البريد الإلكتروني التقديمية الخاصة بـ \"زوليب\" للمستخدمين الجدد",
|
||||
"Send later": "",
|
||||
"Send later": "ارسال لاحقا",
|
||||
"Send me Zulip's low-traffic newsletter (a few emails a year)": "أرسل لي نشرة \"زوليب\" الإخبارية منخفضة الحركة (بضع رسائل بريد إلكتروني في السنة)",
|
||||
"Send message": "أرسل رسالة",
|
||||
"Send mobile notifications even if I'm online": "إرسال إشعارات الجوال حتى وإن كُنت متصلًا.",
|
||||
@@ -1062,6 +1063,8 @@
|
||||
"This is a <z-link>demo organization</z-link> and will be automatically deleted in {days_remaining} days.": "هذه <z-link>منظمة تجريبية</z-link> وسيتم حذفها تلقائيًا في غضون {days_remaining} يوم.",
|
||||
"This is not a <z-link>publicly accessible</z-link> conversation.": "هذه ليست محادثة <z-link>متاحة للعامة</z-link>.",
|
||||
"This is what a Zulip notification looks like.": "هذا ما يبدو عليه إشعار \"زوليب\".",
|
||||
"This message could not be sent at the scheduled time.": "",
|
||||
"This message is no longer scheduled for {deliver_at}.": "",
|
||||
"This message was hidden because you have muted the sender.": "تم إخفاء هذه الرسالة لأنك كتمت صوت المرسل.",
|
||||
"This organization is configured so that administrators and moderators can add custom emoji.": "",
|
||||
"This organization is configured so that administrators and moderators can modify user groups.": "",
|
||||
@@ -1194,7 +1197,7 @@
|
||||
"Version {zulip_version}": "الإصدار {zulip_version}",
|
||||
"Video call provider": "مزود مكالمات الفيديو",
|
||||
"View all streams": "",
|
||||
"View direct messages": "",
|
||||
"View direct messages": "عرض الرسائل المباشرة",
|
||||
"View drafts": "عرض المسودات",
|
||||
"View edit history": "عرض سجل التعديل",
|
||||
"View file": "استعراض الملف",
|
||||
@@ -1254,10 +1257,11 @@
|
||||
"Working…": "يعمل…",
|
||||
"Write": "كتابة",
|
||||
"Yes, please!": "نعم من فضلك!",
|
||||
"Yes, save": "",
|
||||
"Yes, save": "نعم , حفظ",
|
||||
"Yes, schedule": "نعم ,جدول",
|
||||
"Yes, send": "نعم أرسل",
|
||||
"Yesterday": "أمس",
|
||||
"You": "",
|
||||
"You": "انت",
|
||||
"You (click to remove) and {other_username} reacted with {emoji_name}": "أنت (انقر للإزالة) و {other_username} تفاعلت مع {emoji_name}",
|
||||
"You (click to remove) reacted with {emoji_name}": "أنت (انقر للإزالة) تفاعلت مع {emoji_name}",
|
||||
"You (click to remove), {comma_separated_usernames} and {last_username} reacted with {emoji_name}": "أنت (انقر للإزالة)، {comma_separated_usernames} و {last_username} تفاعلت مع {emoji_name}",
|
||||
@@ -1275,12 +1279,14 @@
|
||||
"You can also make <z-link>tables</z-link> with this <z-link>Markdown-ish table syntax</z-link>.": "يمكنك أيضا أن تجعل <z-link>الجداول</z-link> مع <z-link>صيغة جداول Markdown-ish</z-link>.",
|
||||
"You can combine search filters as needed.": "",
|
||||
"You can fully access this community and participate in conversations by creating a Zulip account in this organization.": "يمكنك الوصول الكامل إلى هذا المجتمع والمشاركة في المحادثات من خلال إنشاء حساب Zulip في هذه المنظمة.",
|
||||
"You can no longer save changes to this message.": "",
|
||||
"You can only view or manage invitations that you sent.": "",
|
||||
"You can reactivate deactivated users from <z-link>organization settings</z-link>.": "يمكنك إعادة تنشيط المستخدمين المعطلين من <z-link>إعدادات المنظمة</z-link>.",
|
||||
"You can use email to send messages to Zulip streams.": "",
|
||||
"You cannot create a stream with no subscribers!": "لا يمكنك إنشاء غرفة بدون مشتركين!",
|
||||
"You cannot create a user group with no members!": "",
|
||||
"You cannot send messages to deactivated users.": "لا يمكنك إرسال رسائل للمستخدمين المعطلين.",
|
||||
"You do not have permission to add other users to streams in this organization.": "",
|
||||
"You do not have permission to move some of the messages in this topic. Contact a moderator to move all messages.": "",
|
||||
"You do not have permission to post in this stream.": "ليس لديك الإذن للنشر في هذه الغرفة.",
|
||||
"You do not have permission to resolve topics with messages older than {N, plural, one {# day} other {# days}} in this organization.": "",
|
||||
@@ -1295,15 +1301,15 @@
|
||||
"You have muted <z-stream-topic></z-stream-topic>.": "لقد كتمت <z-stream-topic></z-stream-topic>.",
|
||||
"You have no active bots.": "ليس لديك روبوتات نشطة.",
|
||||
"You have no direct messages including {person} yet.": "",
|
||||
"You have no direct messages with these users yet.": "",
|
||||
"You have no direct messages with {person} yet.": "",
|
||||
"You have no direct messages yet!": "",
|
||||
"You have no direct messages with these users yet.": "ليس لديك اي رسائل مباشرة مع هذا الشخص حتي الان.",
|
||||
"You have no direct messages with {person} yet.": "ليس لديك اي رسائل مباشرة مع {person} حتي الان",
|
||||
"You have no direct messages yet!": "ليس لديك اي رسائل مباشرة حتي الان!",
|
||||
"You have no inactive bots.": "ليس لديك روبوتات غير نشطة.",
|
||||
"You have no starred messages.": "",
|
||||
"You have no unread messages!": "ليس لديك رسائل غير مقروءة!",
|
||||
"You have not configured any topics yet.": "",
|
||||
"You have not muted any users yet.": "لم تقم بكتم أي مستخدم حتى الآن.",
|
||||
"You have not sent any direct messages to yourself yet!": "",
|
||||
"You have not sent any direct messages to yourself yet!": "إنك لم ترسل أي رسائل مباشرة إلى نفسك حتى الآن!",
|
||||
"You have not uploaded any files.": "لم تقم برفع أي ملفات.",
|
||||
"You haven't been mentioned yet!": "لم يتم ذكرك بعد!",
|
||||
"You haven't received any messages sent by {person} yet.": "",
|
||||
@@ -1345,11 +1351,11 @@
|
||||
"clear": "مسح",
|
||||
"cookie": "ملف تعريف الارتباط",
|
||||
"deprecated": "ملغي",
|
||||
"direct messages with yourself": "",
|
||||
"direct messages with {recipient}": "",
|
||||
"direct messages with yourself": "رسائل مباشرة مع نفسك",
|
||||
"direct messages with {recipient}": "رسائل مباشرة مع {recipient}",
|
||||
"does not apply to administrators": "",
|
||||
"does not apply to moderators and administrators": "",
|
||||
"group direct messages with {recipient}": "",
|
||||
"group direct messages with {recipient}": "مجموعة الرسائل المباشرة مع {recipient}",
|
||||
"he/him": "هو/ ـه",
|
||||
"in 1 hour": "في ساعة واحدة",
|
||||
"in 20 minutes": "في 20 دقيقة",
|
||||
|
||||
5479
locale/be/LC_MESSAGES/django.po
Normal file
5479
locale/be/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
1390
locale/be/translations.json
Normal file
1390
locale/be/translations.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -233,7 +233,6 @@
|
||||
"Compact": "",
|
||||
"Complete": "",
|
||||
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "",
|
||||
"Compose a reply @-mentioning author": "Създаване на отговор със @-споменаване на автора",
|
||||
"Compose message": "",
|
||||
"Compose your message here": "Съставете вашето съобщение тук",
|
||||
"Compose your message here...": "Съставете вашето съобщение тук...",
|
||||
@@ -800,6 +799,7 @@
|
||||
"Only organization owners may deactivate an organization.": "",
|
||||
"Only owners can change these settings.": "",
|
||||
"Only stream members can add users to a private stream": "",
|
||||
"Only stream members can add users to a private stream.": "",
|
||||
"Only subscribers to this stream can edit stream permissions.": "",
|
||||
"Open": "Отвори",
|
||||
"Open message menu": "Отвори меню инструменти",
|
||||
@@ -875,7 +875,7 @@
|
||||
"Pronouns": "",
|
||||
"Public": "Публичен",
|
||||
"Question": "",
|
||||
"Quote and reply or forward": "",
|
||||
"Quote and reply": "Цитирай и отговори",
|
||||
"Quote and reply to message": "Цитирай и отговори на съобщение",
|
||||
"Quoted original email (in replies)": "",
|
||||
"React to selected message with": "Отоговори на избраното съобщение с",
|
||||
@@ -894,9 +894,10 @@
|
||||
"Removed successfully.": "",
|
||||
"Rename topic": "",
|
||||
"Rename topic to:": "",
|
||||
"Reply @-mentioning sender": "",
|
||||
"Reply directly to sender": "",
|
||||
"Reply mentioning bot": "",
|
||||
"Reply mentioning user": "",
|
||||
"Reply to author": "Отговори на автора",
|
||||
"Reply to message": "Отговори на съобщение",
|
||||
"Reply to selected conversation": "",
|
||||
"Reply to selected message": "",
|
||||
@@ -1062,6 +1063,8 @@
|
||||
"This is a <z-link>demo organization</z-link> and will be automatically deleted in {days_remaining} days.": "",
|
||||
"This is not a <z-link>publicly accessible</z-link> conversation.": "",
|
||||
"This is what a Zulip notification looks like.": "",
|
||||
"This message could not be sent at the scheduled time.": "",
|
||||
"This message is no longer scheduled for {deliver_at}.": "",
|
||||
"This message was hidden because you have muted the sender.": "",
|
||||
"This organization is configured so that administrators and moderators can add custom emoji.": "",
|
||||
"This organization is configured so that administrators and moderators can modify user groups.": "",
|
||||
@@ -1255,6 +1258,7 @@
|
||||
"Write": "Напиши",
|
||||
"Yes, please!": "Да, моля!",
|
||||
"Yes, save": "",
|
||||
"Yes, schedule": "",
|
||||
"Yes, send": "",
|
||||
"Yesterday": "",
|
||||
"You": "Вие",
|
||||
@@ -1275,12 +1279,14 @@
|
||||
"You can also make <z-link>tables</z-link> with this <z-link>Markdown-ish table syntax</z-link>.": "",
|
||||
"You can combine search filters as needed.": "",
|
||||
"You can fully access this community and participate in conversations by creating a Zulip account in this organization.": "",
|
||||
"You can no longer save changes to this message.": "",
|
||||
"You can only view or manage invitations that you sent.": "",
|
||||
"You can reactivate deactivated users from <z-link>organization settings</z-link>.": "",
|
||||
"You can use email to send messages to Zulip streams.": "",
|
||||
"You cannot create a stream with no subscribers!": "",
|
||||
"You cannot create a user group with no members!": "",
|
||||
"You cannot send messages to deactivated users.": "",
|
||||
"You do not have permission to add other users to streams in this organization.": "",
|
||||
"You do not have permission to move some of the messages in this topic. Contact a moderator to move all messages.": "",
|
||||
"You do not have permission to post in this stream.": "",
|
||||
"You do not have permission to resolve topics with messages older than {N, plural, one {# day} other {# days}} in this organization.": "",
|
||||
|
||||
5734
locale/bqi/LC_MESSAGES/django.po
Normal file
5734
locale/bqi/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
1390
locale/bqi/translations.json
Normal file
1390
locale/bqi/translations.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -233,7 +233,6 @@
|
||||
"Compact": "",
|
||||
"Complete": "",
|
||||
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "",
|
||||
"Compose a reply @-mentioning author": "Redacta una resposta @-mencionant un autor",
|
||||
"Compose message": "",
|
||||
"Compose your message here": "Redacteu el missatge aquí",
|
||||
"Compose your message here...": "Redacteu el missatge aquí...",
|
||||
@@ -800,6 +799,7 @@
|
||||
"Only organization owners may deactivate an organization.": "",
|
||||
"Only owners can change these settings.": "",
|
||||
"Only stream members can add users to a private stream": "",
|
||||
"Only stream members can add users to a private stream.": "",
|
||||
"Only subscribers to this stream can edit stream permissions.": "",
|
||||
"Open": "",
|
||||
"Open message menu": "Obre el menú de missatges",
|
||||
@@ -875,7 +875,7 @@
|
||||
"Pronouns": "",
|
||||
"Public": "Públic",
|
||||
"Question": "",
|
||||
"Quote and reply or forward": "",
|
||||
"Quote and reply": "Cita i respon",
|
||||
"Quote and reply to message": "Cita i respon al missatge",
|
||||
"Quoted original email (in replies)": "",
|
||||
"React to selected message with": "Reacciona al missatge seleccionat amb",
|
||||
@@ -894,9 +894,10 @@
|
||||
"Removed successfully.": "",
|
||||
"Rename topic": "",
|
||||
"Rename topic to:": "",
|
||||
"Reply @-mentioning sender": "",
|
||||
"Reply directly to sender": "",
|
||||
"Reply mentioning bot": "",
|
||||
"Reply mentioning user": "Respon amb menció a l'usuari",
|
||||
"Reply to author": "Respon a l'autor",
|
||||
"Reply to message": "Respon al missatge",
|
||||
"Reply to selected conversation": "",
|
||||
"Reply to selected message": "",
|
||||
@@ -1062,6 +1063,8 @@
|
||||
"This is a <z-link>demo organization</z-link> and will be automatically deleted in {days_remaining} days.": "",
|
||||
"This is not a <z-link>publicly accessible</z-link> conversation.": "",
|
||||
"This is what a Zulip notification looks like.": "",
|
||||
"This message could not be sent at the scheduled time.": "",
|
||||
"This message is no longer scheduled for {deliver_at}.": "",
|
||||
"This message was hidden because you have muted the sender.": "",
|
||||
"This organization is configured so that administrators and moderators can add custom emoji.": "",
|
||||
"This organization is configured so that administrators and moderators can modify user groups.": "",
|
||||
@@ -1255,6 +1258,7 @@
|
||||
"Write": "Escriu",
|
||||
"Yes, please!": "Sí, per favor!",
|
||||
"Yes, save": "",
|
||||
"Yes, schedule": "",
|
||||
"Yes, send": "",
|
||||
"Yesterday": "",
|
||||
"You": "",
|
||||
@@ -1275,12 +1279,14 @@
|
||||
"You can also make <z-link>tables</z-link> with this <z-link>Markdown-ish table syntax</z-link>.": "",
|
||||
"You can combine search filters as needed.": "",
|
||||
"You can fully access this community and participate in conversations by creating a Zulip account in this organization.": "",
|
||||
"You can no longer save changes to this message.": "",
|
||||
"You can only view or manage invitations that you sent.": "",
|
||||
"You can reactivate deactivated users from <z-link>organization settings</z-link>.": "",
|
||||
"You can use email to send messages to Zulip streams.": "",
|
||||
"You cannot create a stream with no subscribers!": "",
|
||||
"You cannot create a user group with no members!": "",
|
||||
"You cannot send messages to deactivated users.": "",
|
||||
"You do not have permission to add other users to streams in this organization.": "",
|
||||
"You do not have permission to move some of the messages in this topic. Contact a moderator to move all messages.": "",
|
||||
"You do not have permission to post in this stream.": "",
|
||||
"You do not have permission to resolve topics with messages older than {N, plural, one {# day} other {# days}} in this organization.": "",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"%'{file}' exceeds the maximum file size for attachments ({variable} MB).": "%'{file}' překračuje největší velikost souboru pro přílohy ({variable} MB).",
|
||||
"(attached file)": "",
|
||||
"(attached file)": "(soubor v příloze)",
|
||||
"(forever)": "(navždy)",
|
||||
"(hidden)": "(skryto)",
|
||||
"(no description)": "(žádný popis)",
|
||||
@@ -104,9 +104,9 @@
|
||||
"Added successfully!": "Úspěšně přidáno!",
|
||||
"Added successfully.": "Úspěšně přidáno.",
|
||||
"Administrator": "Správce",
|
||||
"Administrators and moderators this Zulip organization will be able to see this email address.": "",
|
||||
"Administrators and moderators this Zulip organization will be able to see this email address.": "Tuto e-mailovou adresu uvidí správci a moderátoři této organizace Zulip.",
|
||||
"Administrators can delete any message.": "Správci mohou smazat jakoukoli zprávu.",
|
||||
"Administrators of this Zulip organization will be able to see this email address.": "",
|
||||
"Administrators of this Zulip organization will be able to see this email address.": "Tuto e-mailovou adresu uvidí správci této organizace Zulip.",
|
||||
"Admins": "Správci",
|
||||
"Admins and moderators": "Správci a moderátoři",
|
||||
"Admins only": "Pouze správci",
|
||||
@@ -117,13 +117,13 @@
|
||||
"Advanced": "Rozšířené",
|
||||
"Advertise organization in the Zulip communities directory": "Inzerovat organizaci v adresáři komunit Zulip",
|
||||
"Alert word": "Sledovaná slovo",
|
||||
"Alert word \"{alert_word}\" removed successfully!": "",
|
||||
"Alert word \"{alert_word}\" removed successfully!": "Sledované slovo \"{alert_word}\" úspěšně odstraněno!",
|
||||
"Alert word already exists!": "Sledované slovo již existuje!",
|
||||
"Alert words": "Sledovaná slova",
|
||||
"Alert words allow you to be notified as if you were @-mentioned when certain words or phrases are used in Zulip. Alert words are not case sensitive.": "Sledovaná slova umožňují, abyste byl uvědoměn, kdykoliv někdo použije určitá slova nebo fráze, podobně jako kdybyste byl zmíněn pomocí @. U sledovaných slov se nerozlišuje velikost písmen.",
|
||||
"Alerted messages": "",
|
||||
"Alerted messages": "Zprávy s upozorněním",
|
||||
"All": "Vše",
|
||||
"All direct messages": "",
|
||||
"All direct messages": "Všechny přímé zprávy",
|
||||
"All messages": "Všechny zprávy",
|
||||
"All messages including muted streams": "Všechny zprávy včetně ztlumených kanálů",
|
||||
"All streams": "Všechny kanály",
|
||||
@@ -143,45 +143,45 @@
|
||||
"An API key can be used to programmatically access a Zulip account. Anyone with access to your API key has the ability to read your messages, send messages on your behalf, and otherwise impersonate you on Zulip, so you should guard your API key as carefully as you guard your password. <br /> We recommend creating bots and using the bots' accounts and API keys to access the Zulip API, unless the task requires access to your account.": "API klíč lze použít pro progamový přístup k Zulip účtu. Kdokoliv, kdo má přístup k vašemu API klíči, může číst vaše zprávy, odesílat zprávy za vás a v zásadě vystupovat na Zulipu vaším jménem. To znamená, že byste měli svůj API klíč držet v bezpečí stejně jako vaše heslo.<br />Doporučujeme využít roboty a robotické účty (resp. jejich API klíče) pro přístup k API Zulipu pokud úkol vyloženě nevyžaduje přístup k vašemu účtu.",
|
||||
"An hour ago": "Před hodinou",
|
||||
"An unknown error occurred.": "Vyskytla se neznámá chyba",
|
||||
"Announce new stream in": "",
|
||||
"Announce new stream in": "Oznámit nový kanál v",
|
||||
"Any organization administrator can conduct an export.": "Všichni správci organizace mohou provést uložení dat.",
|
||||
"Any time": "Kdykoli",
|
||||
"April": "Duben",
|
||||
"Archive <z-link></z-link>?": "",
|
||||
"Archive <z-link></z-link>?": "Archivovat <z-link></z-link>?",
|
||||
"Archive stream": "Archivovat kanál",
|
||||
"Archiving stream <z-stream></z-stream> will immediately unsubscribe everyone. This action cannot be undone.": "Archivací kanálu <z-stream></z-stream> bude všem okamžitě zrušen odběr. Tento krok nepůjde vrátit zpět.",
|
||||
"Are you sure you want to continue?": "",
|
||||
"Are you sure you want to continue?": "Určitě chcete pokračovat?",
|
||||
"Are you sure you want to create stream ''''{stream_name}'''' and subscribe {count} users to it?": "Jste si jistý, že chcete vytvořit kanál '''{stream_name}'''' a přihlásit k jeho odběru {count} uživatelů?",
|
||||
"Are you sure you want to deactivate this organization?": "Opravdu chcete vypnout tuto organizaci?",
|
||||
"Are you sure you want to deactivate your account?": "Opravdu chcete vypnout svůj účet?",
|
||||
"Are you sure you want to delete all drafts? This action cannot be undone.": "Určitě chcete smazat všechny koncepty? Tento krok nelze vrátit zpět.",
|
||||
"Are you sure you want to delete your profile picture?": "Opravdu chcete smazat obrázek svého profilu?",
|
||||
"Are you sure you want to mark all messages as read? This action cannot be undone.": "",
|
||||
"Are you sure you want to mark all messages as read? This action cannot be undone.": "Určitě chcete označit všechny zprávy jako přečtené? Tento krok nelze vzít zpět.",
|
||||
"Are you sure you want to mute <b>{user_name}</b>? Messages sent by muted users will never trigger notifications, will be marked as read, and will be hidden.": "Opravdu chcete ztlumit <b>{user_name}</b>? Zprávy odeslané ztlumenými uživateli nikdy nespustí oznámení, budou označeny jako přečtené a budou skryty.",
|
||||
"Are you sure you want to permanently delete <b>{topic_name}</b>?": "Jste si jistý/á, že chcete trvale smazat <b>{topic_name}</b>?",
|
||||
"Are you sure you want to resend the invitation to <z-email></z-email>?": "Opravdu chcete znovu poslat pozvánku <z-email></z-email>?",
|
||||
"Are you sure you want to revoke the invitation to <strong>{email}</strong>?": "Opravdu chcete zrušit pozvánku <strong>{email}</strong>?",
|
||||
"Are you sure you want to revoke this invitation link created by <strong>{referred_by}</strong>?": "Opravdu chcete zrušit tento zvací odkaz vytvořený <strong>{referred_by}</strong>?",
|
||||
"Are you sure you want to send @-mention notifications to the <strong>{subscriber_count}</strong> users subscribed to #{stream_name}? If not, please edit your message to remove the <strong>@{wildcard_mention}</strong> mention.": "",
|
||||
"Are you sure you want to send @-mention notifications to the <strong>{subscriber_count}</strong> users subscribed to #{stream_name}? If not, please edit your message to remove the <strong>@{wildcard_mention}</strong> mention.": "Jste si jisti, že chcete zasílat oznámení o @-zmínkách <strong>{subscriber_count}</strong> uživatelům odebírajícím #{stream_name}? Pokud ne, upravte prosím svou zprávu tak, abyste odstranili zmínku <strong>@{wildcard_mention}</strong>.",
|
||||
"Are you sure you want to unstar all messages in <stream-topic></stream-topic>? This action cannot be undone.": "Chcete odhvězdičkovat všechny ohvězdičkované zprávy v <stream-topic></stream-topic>? Tento krok nelze vrátit zpět.",
|
||||
"Are you sure you want to unstar all starred messages? This action cannot be undone.": "Chcete odhvězdičkovat všechny ohvězdičkované zprávy? Tento krok nelze vrátit zpět.",
|
||||
"Ask me later": "Zeptat se později",
|
||||
"At the office": "V kanceláři",
|
||||
"Audible": "",
|
||||
"Audible": "Slyšitelné",
|
||||
"Audible desktop notifications": "Slyšitelné oznámení na ploše",
|
||||
"August": "Srpen",
|
||||
"Authentication methods": "Metody autentizace",
|
||||
"Author": "Autor",
|
||||
"Automated messages and emails": "Automatické zprávy a e-maily",
|
||||
"Automatic": "Automaticky",
|
||||
"Automatic (follows system settings)": "",
|
||||
"Automatically mark messages as read": "",
|
||||
"Automatic (follows system settings)": "Automaticky (podle nastavení systému)",
|
||||
"Automatically mark messages as read": "Automatické označování zpráv jako přečtených",
|
||||
"Available on Zulip Cloud Standard. <z-link-upgrade>Upgrade</z-link-upgrade> or <z-link-sponsorship>request sponsorship</z-link-sponsorship> to access.": "Dostupné na Zulip Cloud Standard. Pro přístup <z-link-upgrade>povýšit</z-link-upgrade> nebo <z-link-sponsorship>požádat o sponzorství</z-link-sponsorship>.",
|
||||
"Avatar changes are disabled in this organization": "Změny avatarů jsou v této organizaci zakázány",
|
||||
"Avatar from Gravatar": "Avatar z Gravataru",
|
||||
"Back to streams": "Zpět na kanály",
|
||||
"Because you are the only organization owner, you cannot deactivate your account.": "",
|
||||
"Because you are the only subscriber, this stream will be automatically archived.": "",
|
||||
"Because you are the only organization owner, you cannot deactivate your account.": "Protože jste jediným vlastníkem organizace, nemůžete svůj účet vypnout.",
|
||||
"Because you are the only subscriber, this stream will be automatically archived.": "Protože jste jediný odběratel, bude tento kanál automaticky archivován.",
|
||||
"Billing": "Fakturace",
|
||||
"Bold": "Tučné",
|
||||
"Bot": "Robot",
|
||||
@@ -190,7 +190,7 @@
|
||||
"Bot owner": "Vlastník robota",
|
||||
"Bot type": "Druh robota",
|
||||
"Bots": "Roboti",
|
||||
"Browse recent conversations": "",
|
||||
"Browse recent conversations": "Procházet nedávné konverzace",
|
||||
"Browse streams": "Procházet kanály",
|
||||
"Business": "Podnikání",
|
||||
"Busy": "Zaneprázdněn",
|
||||
@@ -198,10 +198,10 @@
|
||||
"Cancel": "Zrušit",
|
||||
"Cancel compose": "Zahodit koncept",
|
||||
"Cancel compose and save draft": "Zrušit sestavení a uložit návrh",
|
||||
"Card": "",
|
||||
"Card": "Karta",
|
||||
"Center the view around message ID <z-value></z-value>.": "Vystředit zobrazení okolo zprávy s ID <z-value></z-value>.",
|
||||
"Change": "Změnit",
|
||||
"Change avatar": "",
|
||||
"Change avatar": "Změnit avatara",
|
||||
"Change color": "Změnit barvu",
|
||||
"Change email": "Změnit e-mail",
|
||||
"Change group info": "Změnit informace o skupině",
|
||||
@@ -213,10 +213,10 @@
|
||||
"Choose members": "Vybrat členy",
|
||||
"Choose subscribers": "Vybrat odběratele",
|
||||
"Clear avatar": "Smazat avatar",
|
||||
"Clear image": "",
|
||||
"Clear image": "Vymazat obrázek",
|
||||
"Clear profile picture": "Vymazat obrázek profilu",
|
||||
"Click here to reveal.": "Klepněte zde pro odhalení.",
|
||||
"Click on the pencil (<z-pencil-icon></z-pencil-icon>) icon to edit and reschedule a message.": "",
|
||||
"Click on the pencil (<z-pencil-icon></z-pencil-icon>) icon to edit and reschedule a message.": "Klepněte na ikonu tužky (<z-pencil-icon></z-pencil-icon>) pro upravení a přeplánování zprávy.",
|
||||
"Click outside the input box to save. We'll automatically notify anyone that was added or removed.": "Pro uložení klepněte mimo zadávací pole. Automaticky bude upozorněn každý, kdo byl přidán nebo odstraněn.",
|
||||
"Click to view or download.": "Klepněte pro zobrazení nebo stáhnutí.",
|
||||
"Close": "Zavřít",
|
||||
@@ -225,7 +225,7 @@
|
||||
"Code playgrounds": "Dětská hřiště pro kód",
|
||||
"Code playgrounds are interactive in-browser development environments, such as <z-link-repl>replit</z-link-repl>, that are designed to make it convenient to edit and debug code. Zulip <z-link-code-blocks>code blocks</z-link-code-blocks> that are tagged with a programming language will have a button visible on hover that allows users to open the code block on the code playground site.": "",
|
||||
"Collapse compose": "Sbalit koncept",
|
||||
"Collapse direct messages": "",
|
||||
"Collapse direct messages": "Sbalit přímé zprávy",
|
||||
"Collapse message": "Sbalit zprávu",
|
||||
"Collapse/show selected message": "Sbalit/Rozbalit vybranou zprávu",
|
||||
"Community": "Společenství",
|
||||
@@ -233,25 +233,24 @@
|
||||
"Compact": "Kompaktní",
|
||||
"Complete": "Dokončeno",
|
||||
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "Dokončete <z-link>profil organizace</z-link> pro označení a vysvětlení účelu této organizace Zulip.",
|
||||
"Compose a reply @-mentioning author": "Sepsat odpověď @-zmiňující autora",
|
||||
"Compose message": "Vytvořit zprávu",
|
||||
"Compose your message here": "Svoji zprávu sepište zde",
|
||||
"Compose your message here...": "Svoji zprávu sepište zde...",
|
||||
"Composing messages": "Vytváření zpráv",
|
||||
"Configure how Zulip notifies you about new messages.": "Nastavit, jak Zulip upozorňuje na nové zprávy.",
|
||||
"Configure regular expression patterns that will be used to automatically transform any matching text in Zulip messages and topics into links.": "",
|
||||
"Configure regular expression patterns that will be used to automatically transform any matching text in Zulip messages and topics into links.": "Nastavte vzory regulárních výrazů, které se použijí k automatické přeměně odpovídajícího textu ve zprávách a tématech Zulip na odkazy.",
|
||||
"Configure the <z-link>default personal preference settings</z-link> for new users joining your organization.": "Nastavte <z-link>výchozí nastavení osobních nastavení</z-link> pro nové uživatele, kteří se připojí k vaší organizaci.",
|
||||
"Configure the authentication methods for your organization.": "Nastavit metody autentizace pro vaší organizaci.",
|
||||
"Configure the default streams new users are subscribed to when joining your organization.": "Nastavit výchozí kanály, které budou noví uživatele po připojení k vaší organizaci automaticky odebírat.",
|
||||
"Confirm": "Potvrdit",
|
||||
"Consider <z-link>searching all public streams</z-link>.": "Zvažte <z-link>prohledávání všech veřejných kanálů</z-link>.",
|
||||
"Contact a moderator to resolve this topic.": "",
|
||||
"Contact a moderator to unresolve this topic.": "",
|
||||
"Contact a moderator to resolve this topic.": "Pro vyřešení tohoto tématu se spojte s moderátorem.",
|
||||
"Contact a moderator to unresolve this topic.": "Pro zrušení tohoto tématu se spojte s moderátorem.",
|
||||
"Contact support": "Spojit se s podporou",
|
||||
"Convert emoticons before sending (<code>:)</code> becomes 😃)": "Převést emotikony před odesláním (z <code>:)</code> bude 😃)",
|
||||
"Cookie Bot": "Cookie robot",
|
||||
"Copied!": "Zkopírováno!",
|
||||
"Copy address": "",
|
||||
"Copy address": "Kopírovat adresu",
|
||||
"Copy and close": "Kopírovat a zavřít",
|
||||
"Copy code": "Kopírovat kód",
|
||||
"Copy link": "Kopírovat odkaz",
|
||||
@@ -260,17 +259,17 @@
|
||||
"Copy mention syntax": "Kopírovat skladbu zmínky",
|
||||
"Copy version": "Kopírovat verzi",
|
||||
"Copy zuliprc": "Kopírovat zuliprc",
|
||||
"Could not resolve topic": "",
|
||||
"Could not unresolve topic": "",
|
||||
"Could not resolve topic": "Nepodařilo se vyřešit téma",
|
||||
"Could not unresolve topic": "Nepodařilo se zrušit řešení tématu",
|
||||
"Create": "Vytvořit",
|
||||
"Create a stream": "Vytvořit kanál",
|
||||
"Create new stream": "Vytvořit nový kanál",
|
||||
"Create new user group": "",
|
||||
"Create new user group": "Vytvořit novou uživatelskou skupinu",
|
||||
"Create stream": "Vytvořit kanál",
|
||||
"Create user group": "Vytvořit uživatelskou skupinu",
|
||||
"Creating group...": "Vytváří se skupina...",
|
||||
"Creating stream...": "Kanál se vytváří...",
|
||||
"Currently viewing all direct messages.": "",
|
||||
"Currently viewing all direct messages.": "V současné době se zobrazují všechny přímé zprávy.",
|
||||
"Currently viewing all messages.": "V současné době se zobrazují všechny zprávy.",
|
||||
"Currently viewing the entire stream.": "V současné době se zobrazuje celý kanál.",
|
||||
"Custom": "Vlastní",
|
||||
@@ -281,15 +280,15 @@
|
||||
"Custom profile fields": "Vlastní pole profilu",
|
||||
"Custom time": "Vlastní čas",
|
||||
"Cycle between stream narrows": "Procházet mezi jednotlivými zúženími kanálů",
|
||||
"DIRECT MESSAGES": "",
|
||||
"DM": "",
|
||||
"DMs, mentions, and alerts": "",
|
||||
"Dark": "",
|
||||
"DIRECT MESSAGES": "PŘÍMÉ ZPRÁVY",
|
||||
"DM": "PZ",
|
||||
"DMs, mentions, and alerts": "Přímé zprávy, zmínky a sledovaná slova",
|
||||
"Dark": "Tmavé",
|
||||
"Dark theme": "Tmavý vzhled",
|
||||
"Dark theme logo": "",
|
||||
"Dark theme logo": "Logo tmavého vzhledu",
|
||||
"Data exports": "Uložení dat",
|
||||
"Date muted": "Datum utlumeno",
|
||||
"Date updated": "",
|
||||
"Date updated": "Datum aktualizace",
|
||||
"Date uploaded": "Datum nahrání",
|
||||
"Day of the week to send digests": "Den v týdnu, kdy posílat přehledy",
|
||||
"Deactivate": "Vypnout",
|
||||
@@ -303,11 +302,11 @@
|
||||
"Deactivated": "Vypnutý",
|
||||
"Deactivated users": "Vypnutí uživatelé",
|
||||
"December": "Prosinec",
|
||||
"Default for stream": "",
|
||||
"Default for stream": "Výchozí pro kanál",
|
||||
"Default is {language}. Use 'text' to disable highlighting.": "Výchozí je {language}. Použijte 'text' pro zakázání zvýrazňování.",
|
||||
"Default language for code blocks": "Výchozí jazyk pro bloky kódu",
|
||||
"Default streams": "Výchozí kanály",
|
||||
"Default streams for this organization": "",
|
||||
"Default streams for this organization": "Výchozí kanály pro tuto organizaci",
|
||||
"Default user settings": "Výchozí uživatelská nastavení",
|
||||
"Default view": "Výchozí zobrazení",
|
||||
"Delay before sending message notification emails": "Zpoždění před odesláním e-mailů s oznámeními o zprávách",
|
||||
@@ -349,7 +348,7 @@
|
||||
"Detailed message formatting documentation": "Podrobná dokumentace k formátování zpráv",
|
||||
"Detailed search filters documentation": "",
|
||||
"Direct message": "",
|
||||
"Direct messages": "",
|
||||
"Direct messages": "Přímé zprávy",
|
||||
"Direct messages and mentions": "",
|
||||
"Direct messages are disabled in this organization.": "",
|
||||
"Direct messages disabled": "",
|
||||
@@ -800,6 +799,7 @@
|
||||
"Only organization owners may deactivate an organization.": "",
|
||||
"Only owners can change these settings.": "Tato nastavení mohou měnit pouze majitelé.",
|
||||
"Only stream members can add users to a private stream": "Do soukromého kanálu mohou další uživatele přidávat pouze jeho členové.",
|
||||
"Only stream members can add users to a private stream.": "",
|
||||
"Only subscribers to this stream can edit stream permissions.": "Oprávnění k tomuto kanálu mohou upravovat pouze jeho odběratelé.",
|
||||
"Open": "Otevřít",
|
||||
"Open message menu": "Otevřít nabídku ke zprávě",
|
||||
@@ -875,7 +875,7 @@
|
||||
"Pronouns": "Zájmena",
|
||||
"Public": "Veřejné",
|
||||
"Question": "Otázka",
|
||||
"Quote and reply or forward": "Ocitovat a odpovědět nebo přeposlat",
|
||||
"Quote and reply": "Citovat a odpovědět",
|
||||
"Quote and reply to message": "Ocitovat a odpovědět na zprávu",
|
||||
"Quoted original email (in replies)": "",
|
||||
"React to selected message with": "Odpovědět na vybranou zprávu s",
|
||||
@@ -894,9 +894,10 @@
|
||||
"Removed successfully.": "Úspěšně odstraněno.",
|
||||
"Rename topic": "",
|
||||
"Rename topic to:": "",
|
||||
"Reply @-mentioning sender": "",
|
||||
"Reply directly to sender": "",
|
||||
"Reply mentioning bot": "Odpovědět a zmínit robota",
|
||||
"Reply mentioning user": "Odpovědět a zmínit uživatele",
|
||||
"Reply to author": "Odpovědět autorovi",
|
||||
"Reply to message": "Odpovědět na zprávu",
|
||||
"Reply to selected conversation": "",
|
||||
"Reply to selected message": "Odpovědět na vybranou zprávu",
|
||||
@@ -1062,6 +1063,8 @@
|
||||
"This is a <z-link>demo organization</z-link> and will be automatically deleted in {days_remaining} days.": "Toto je <z-link>ukázková organizace</z-link> a bude automaticky smazána během {days_remaining} dní.",
|
||||
"This is not a <z-link>publicly accessible</z-link> conversation.": "Toto není <z-link>veřejně přístupný</z-link> rozhovor.",
|
||||
"This is what a Zulip notification looks like.": "Takto vypadá oznámení Zulipu.",
|
||||
"This message could not be sent at the scheduled time.": "",
|
||||
"This message is no longer scheduled for {deliver_at}.": "",
|
||||
"This message was hidden because you have muted the sender.": "Tato zpráva byla skrytá, protože jste ztlumil odesílatele.",
|
||||
"This organization is configured so that administrators and moderators can add custom emoji.": "",
|
||||
"This organization is configured so that administrators and moderators can modify user groups.": "",
|
||||
@@ -1255,6 +1258,7 @@
|
||||
"Write": "Psát",
|
||||
"Yes, please!": "Ano, prosím!",
|
||||
"Yes, save": "",
|
||||
"Yes, schedule": "",
|
||||
"Yes, send": "Ano, odeslat",
|
||||
"Yesterday": "Včera",
|
||||
"You": "Vy",
|
||||
@@ -1275,12 +1279,14 @@
|
||||
"You can also make <z-link>tables</z-link> with this <z-link>Markdown-ish table syntax</z-link>.": "Také můžete dělat <z-link>tabulky</z-link> s touto<z-link>Markdown tabulkovou syntaxí</z-link>.",
|
||||
"You can combine search filters as needed.": "",
|
||||
"You can fully access this community and participate in conversations by creating a Zulip account in this organization.": "Vytvořením účtu Zulip v této organizaci získáte plný přístup k tomuto společenství a můžete se účastnit rozhovorů.",
|
||||
"You can no longer save changes to this message.": "",
|
||||
"You can only view or manage invitations that you sent.": "",
|
||||
"You can reactivate deactivated users from <z-link>organization settings</z-link>.": "Vypnuté uživatele můžete znovu zapnout v <z-link>nastavení organizace</z-link>.",
|
||||
"You can use email to send messages to Zulip streams.": "",
|
||||
"You cannot create a stream with no subscribers!": "Nelze vytvořit kanál, který nemá žádné odběratele!",
|
||||
"You cannot create a user group with no members!": "",
|
||||
"You cannot send messages to deactivated users.": "Vypnutým uživatelům nelze poslat zprávy.",
|
||||
"You do not have permission to add other users to streams in this organization.": "",
|
||||
"You do not have permission to move some of the messages in this topic. Contact a moderator to move all messages.": "",
|
||||
"You do not have permission to post in this stream.": "Nemáte oprávnění vkládat příspěvky do tohoto kanálu.",
|
||||
"You do not have permission to resolve topics with messages older than {N, plural, one {# day} other {# days}} in this organization.": "",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -233,7 +233,6 @@
|
||||
"Compact": "",
|
||||
"Complete": "Wedi'i gwblhau",
|
||||
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "Cwblhewch y<z-link> proffil sefydliad</z-link> i frandio ac egluro pwrpas y sefydliad Zulip hwn.",
|
||||
"Compose a reply @-mentioning author": "Cyfansoddwch ateb @-sôn am awdur",
|
||||
"Compose message": "Cyfansoddi neges",
|
||||
"Compose your message here": "Cyfansoddwch eich neges yma",
|
||||
"Compose your message here...": "Cyfansoddwch eich neges yma ...",
|
||||
@@ -800,6 +799,7 @@
|
||||
"Only organization owners may deactivate an organization.": "",
|
||||
"Only owners can change these settings.": "",
|
||||
"Only stream members can add users to a private stream": "Dim ond aelodau ffrwd all ychwanegu defnyddwyr at ffrwd breifat",
|
||||
"Only stream members can add users to a private stream.": "",
|
||||
"Only subscribers to this stream can edit stream permissions.": "",
|
||||
"Open": "Ar agor",
|
||||
"Open message menu": "Agor dewislen neges ",
|
||||
@@ -875,7 +875,7 @@
|
||||
"Pronouns": "",
|
||||
"Public": "Cyhoeddus",
|
||||
"Question": "",
|
||||
"Quote and reply or forward": "Dyfynnwch ac atebwch neu ymlaen",
|
||||
"Quote and reply": "",
|
||||
"Quote and reply to message": "Dyfynnwch ac atebwch y neges",
|
||||
"Quoted original email (in replies)": "",
|
||||
"React to selected message with": "Ymateb i neges ddethol gyda",
|
||||
@@ -894,9 +894,10 @@
|
||||
"Removed successfully.": "",
|
||||
"Rename topic": "",
|
||||
"Rename topic to:": "",
|
||||
"Reply @-mentioning sender": "",
|
||||
"Reply directly to sender": "",
|
||||
"Reply mentioning bot": "",
|
||||
"Reply mentioning user": "Ateb sôn am ddefnyddiwr",
|
||||
"Reply to author": "Ymateb i'r awdur",
|
||||
"Reply to message": "Ymateb i'r neges",
|
||||
"Reply to selected conversation": "",
|
||||
"Reply to selected message": "Ymateb i neges a ddewiswyd",
|
||||
@@ -1062,6 +1063,8 @@
|
||||
"This is a <z-link>demo organization</z-link> and will be automatically deleted in {days_remaining} days.": "Hwn yw<z-link> sefydliad demo</z-link> a bydd yn cael ei ddileu yn awtomatig mewn {days_remaining} diwrnod.",
|
||||
"This is not a <z-link>publicly accessible</z-link> conversation.": "",
|
||||
"This is what a Zulip notification looks like.": "Dyma sut mae hysbysiad Zulip yn edrych.",
|
||||
"This message could not be sent at the scheduled time.": "",
|
||||
"This message is no longer scheduled for {deliver_at}.": "",
|
||||
"This message was hidden because you have muted the sender.": "Cuddiwyd y neges hon oherwydd eich bod wedi tawelu’r anfonwr.",
|
||||
"This organization is configured so that administrators and moderators can add custom emoji.": "",
|
||||
"This organization is configured so that administrators and moderators can modify user groups.": "",
|
||||
@@ -1255,6 +1258,7 @@
|
||||
"Write": "Ysgrifennu",
|
||||
"Yes, please!": "Os gwelwch yn dda!",
|
||||
"Yes, save": "",
|
||||
"Yes, schedule": "",
|
||||
"Yes, send": "Ie, anfon",
|
||||
"Yesterday": "Ddoe",
|
||||
"You": "",
|
||||
@@ -1275,12 +1279,14 @@
|
||||
"You can also make <z-link>tables</z-link> with this <z-link>Markdown-ish table syntax</z-link>.": "Gallwch chi hefyd wneud<z-link> byrddau</z-link> gyda hyn<z-link> Cystrawen tabl Markdown-ish</z-link> .",
|
||||
"You can combine search filters as needed.": "",
|
||||
"You can fully access this community and participate in conversations by creating a Zulip account in this organization.": "",
|
||||
"You can no longer save changes to this message.": "",
|
||||
"You can only view or manage invitations that you sent.": "",
|
||||
"You can reactivate deactivated users from <z-link>organization settings</z-link>.": "Gallwch ail-ysgogi defnyddwyr sydd wedi'u dadactifadu o<z-link> gosodiadau sefydliad</z-link> .",
|
||||
"You can use email to send messages to Zulip streams.": "",
|
||||
"You cannot create a stream with no subscribers!": "Ni allwch greu ffrwd heb unrhyw danysgrifwyr!",
|
||||
"You cannot create a user group with no members!": "",
|
||||
"You cannot send messages to deactivated users.": "Ni allwch anfon negeseuon at ddefnyddwyr sydd wedi'u dadactifadu.",
|
||||
"You do not have permission to add other users to streams in this organization.": "",
|
||||
"You do not have permission to move some of the messages in this topic. Contact a moderator to move all messages.": "",
|
||||
"You do not have permission to post in this stream.": "",
|
||||
"You do not have permission to resolve topics with messages older than {N, plural, one {# day} other {# days}} in this organization.": "",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -233,7 +233,6 @@
|
||||
"Compact": "",
|
||||
"Complete": "",
|
||||
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "",
|
||||
"Compose a reply @-mentioning author": "",
|
||||
"Compose message": "",
|
||||
"Compose your message here": "",
|
||||
"Compose your message here...": "",
|
||||
@@ -800,6 +799,7 @@
|
||||
"Only organization owners may deactivate an organization.": "",
|
||||
"Only owners can change these settings.": "",
|
||||
"Only stream members can add users to a private stream": "",
|
||||
"Only stream members can add users to a private stream.": "",
|
||||
"Only subscribers to this stream can edit stream permissions.": "",
|
||||
"Open": "",
|
||||
"Open message menu": "",
|
||||
@@ -875,7 +875,7 @@
|
||||
"Pronouns": "",
|
||||
"Public": "",
|
||||
"Question": "",
|
||||
"Quote and reply or forward": "",
|
||||
"Quote and reply": "",
|
||||
"Quote and reply to message": "",
|
||||
"Quoted original email (in replies)": "",
|
||||
"React to selected message with": "",
|
||||
@@ -894,9 +894,10 @@
|
||||
"Removed successfully.": "",
|
||||
"Rename topic": "",
|
||||
"Rename topic to:": "",
|
||||
"Reply @-mentioning sender": "",
|
||||
"Reply directly to sender": "",
|
||||
"Reply mentioning bot": "",
|
||||
"Reply mentioning user": "",
|
||||
"Reply to author": "",
|
||||
"Reply to message": "",
|
||||
"Reply to selected conversation": "",
|
||||
"Reply to selected message": "",
|
||||
@@ -1062,6 +1063,8 @@
|
||||
"This is a <z-link>demo organization</z-link> and will be automatically deleted in {days_remaining} days.": "",
|
||||
"This is not a <z-link>publicly accessible</z-link> conversation.": "",
|
||||
"This is what a Zulip notification looks like.": "",
|
||||
"This message could not be sent at the scheduled time.": "",
|
||||
"This message is no longer scheduled for {deliver_at}.": "",
|
||||
"This message was hidden because you have muted the sender.": "",
|
||||
"This organization is configured so that administrators and moderators can add custom emoji.": "",
|
||||
"This organization is configured so that administrators and moderators can modify user groups.": "",
|
||||
@@ -1276,12 +1279,14 @@
|
||||
"You can also make <z-link>tables</z-link> with this <z-link>Markdown-ish table syntax</z-link>.": "",
|
||||
"You can combine search filters as needed.": "",
|
||||
"You can fully access this community and participate in conversations by creating a Zulip account in this organization.": "",
|
||||
"You can no longer save changes to this message.": "",
|
||||
"You can only view or manage invitations that you sent.": "",
|
||||
"You can reactivate deactivated users from <z-link>organization settings</z-link>.": "",
|
||||
"You can use email to send messages to Zulip streams.": "",
|
||||
"You cannot create a stream with no subscribers!": "",
|
||||
"You cannot create a user group with no members!": "",
|
||||
"You cannot send messages to deactivated users.": "",
|
||||
"You do not have permission to add other users to streams in this organization.": "",
|
||||
"You do not have permission to move some of the messages in this topic. Contact a moderator to move all messages.": "",
|
||||
"You do not have permission to post in this stream.": "",
|
||||
"You do not have permission to resolve topics with messages older than {N, plural, one {# day} other {# days}} in this organization.": "",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -233,7 +233,6 @@
|
||||
"Compact": "Kompakt",
|
||||
"Complete": "Fertig",
|
||||
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "Vervollständige das <z-link>Organisationsprofil</z-link>, um dieser Zulip-Organisation eine Marke zu verleihen und ihren Zweck zu erläutern.",
|
||||
"Compose a reply @-mentioning author": "Antwort mit einer @-Erwähnung des Verfassers erstellen",
|
||||
"Compose message": "Nachricht verfassen",
|
||||
"Compose your message here": "Erstelle hier deine Nachricht",
|
||||
"Compose your message here...": "Erstelle hier deine Nachricht...",
|
||||
@@ -800,6 +799,7 @@
|
||||
"Only organization owners may deactivate an organization.": "Nur Besitzer einer Organisation können diese deaktivieren.",
|
||||
"Only owners can change these settings.": "Nur Eigentümer können diese Einstellungen ändern.",
|
||||
"Only stream members can add users to a private stream": "Nur Stream-Mitglieder können Nutzer zu einem privaten Stream hinzufügen",
|
||||
"Only stream members can add users to a private stream.": "",
|
||||
"Only subscribers to this stream can edit stream permissions.": "Nur Abonnenten dieses Streams können Stream-Berechtigungen bearbeiten.",
|
||||
"Open": "Öffnen",
|
||||
"Open message menu": "Nachrichten-Menü öffnen",
|
||||
@@ -875,7 +875,7 @@
|
||||
"Pronouns": "Pronomen",
|
||||
"Public": "Öffentlich",
|
||||
"Question": "Frage",
|
||||
"Quote and reply or forward": "Zitieren und antworten oder weiterleiten",
|
||||
"Quote and reply": "Zitieren und antworten",
|
||||
"Quote and reply to message": "Nachricht zitieren und beantworten",
|
||||
"Quoted original email (in replies)": "Zitierte Originalnachricht (bei Antworten)",
|
||||
"React to selected message with": "Auf die ausgewählte Nachricht reagieren mit",
|
||||
@@ -894,9 +894,10 @@
|
||||
"Removed successfully.": "Entfernung erfolgreich.",
|
||||
"Rename topic": "",
|
||||
"Rename topic to:": "",
|
||||
"Reply @-mentioning sender": "",
|
||||
"Reply directly to sender": "",
|
||||
"Reply mentioning bot": "Antwort mit Erwähnung des Bots",
|
||||
"Reply mentioning user": "Antwort mit @-Erwähnung des Nutzers erstellen.",
|
||||
"Reply to author": "An Verfasser antworten",
|
||||
"Reply to message": "Auf Nachricht antworten",
|
||||
"Reply to selected conversation": "",
|
||||
"Reply to selected message": "Auf ausgewählte Nachricht antworten",
|
||||
@@ -1062,6 +1063,8 @@
|
||||
"This is a <z-link>demo organization</z-link> and will be automatically deleted in {days_remaining} days.": "Dies ist eine <z-link>Demo-Organisation</z-link>, sie wird in {days_remaining} Tagen automatisch gelöscht.",
|
||||
"This is not a <z-link>publicly accessible</z-link> conversation.": "Dies ist keine <z-link>öffentlich zugängliche</z-link> Konversation.",
|
||||
"This is what a Zulip notification looks like.": "So sehen Benachrichtigungen in Zulip aus.",
|
||||
"This message could not be sent at the scheduled time.": "",
|
||||
"This message is no longer scheduled for {deliver_at}.": "",
|
||||
"This message was hidden because you have muted the sender.": "Diese Nachricht ist verborgen, weil du den Absender stummgeschaltet hast.",
|
||||
"This organization is configured so that administrators and moderators can add custom emoji.": "",
|
||||
"This organization is configured so that administrators and moderators can modify user groups.": "",
|
||||
@@ -1255,6 +1258,7 @@
|
||||
"Write": "Schreiben",
|
||||
"Yes, please!": "Ja, bitte!",
|
||||
"Yes, save": "",
|
||||
"Yes, schedule": "",
|
||||
"Yes, send": "Ja, senden",
|
||||
"Yesterday": "Gestern",
|
||||
"You": "Du",
|
||||
@@ -1275,12 +1279,14 @@
|
||||
"You can also make <z-link>tables</z-link> with this <z-link>Markdown-ish table syntax</z-link>.": "Du kannst auch <z-link>Tabellen</z-link> erstellen mit dieser <z-link>Markdown-artigen Tabellensyntax</z-link>.",
|
||||
"You can combine search filters as needed.": "Du kannst Suchfilter kombinieren, wie du es brauchst.",
|
||||
"You can fully access this community and participate in conversations by creating a Zulip account in this organization.": "Du bekommst vollständigen Zugriff auf diese Community und kannst an den Konversationen teilnehmen, wenn du in dieser Organisation einen Zulip-Account erstellst.",
|
||||
"You can no longer save changes to this message.": "",
|
||||
"You can only view or manage invitations that you sent.": "Du kannst nur die Einladungen ansehen oder verwalten, die du selbst gesendet hast.",
|
||||
"You can reactivate deactivated users from <z-link>organization settings</z-link>.": "Du kannst deaktivierte Nutzer in den <z-link>Einstellungen der Organisation</z-link> wieder reaktivieren.",
|
||||
"You can use email to send messages to Zulip streams.": "Du kannst E-Mails dazu nutzen, Nachrichten an Streams in Zulip zu schicken.",
|
||||
"You cannot create a stream with no subscribers!": "Du kannst keinen Stream ohne Mitglieder erstellen!",
|
||||
"You cannot create a user group with no members!": "Du kannst keine Nutzergruppe ohne Gruppenmitglieder erstellen!",
|
||||
"You cannot send messages to deactivated users.": "Du kannst keine Nachrichten an deaktivierte Nutzer senden.",
|
||||
"You do not have permission to add other users to streams in this organization.": "",
|
||||
"You do not have permission to move some of the messages in this topic. Contact a moderator to move all messages.": "",
|
||||
"You do not have permission to post in this stream.": "Du hast keine Berechtigung, um in diesem Stream zu schreiben.",
|
||||
"You do not have permission to resolve topics with messages older than {N, plural, one {# day} other {# days}} in this organization.": "",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"%'{file}' exceeds the maximum file size for attachments ({variable} MB).": "%'{file}' exceeds the maximum file size for attachments ({variable} MB).",
|
||||
"(attached file)": "",
|
||||
"(attached file)": "(attached file)",
|
||||
"(forever)": "(forever)",
|
||||
"(hidden)": "(hidden)",
|
||||
"(no description)": "(no description)",
|
||||
@@ -143,7 +143,7 @@
|
||||
"An API key can be used to programmatically access a Zulip account. Anyone with access to your API key has the ability to read your messages, send messages on your behalf, and otherwise impersonate you on Zulip, so you should guard your API key as carefully as you guard your password. <br /> We recommend creating bots and using the bots' accounts and API keys to access the Zulip API, unless the task requires access to your account.": "An API key can be used to programmatically access a Zulip account. Anyone with access to your API key has the ability to read your messages, send messages on your behalf, and otherwise impersonate you on Zulip, so you should guard your API key as carefully as you guard your password. <br /> We recommend creating bots and using the bots' accounts and API keys to access the Zulip API, unless the task requires access to your account.",
|
||||
"An hour ago": "An hour ago",
|
||||
"An unknown error occurred.": "An unknown error occurred.",
|
||||
"Announce new stream in": "",
|
||||
"Announce new stream in": "Announce new stream in",
|
||||
"Any organization administrator can conduct an export.": "Any organisation administrator can conduct an export.",
|
||||
"Any time": "Any time",
|
||||
"April": "April",
|
||||
@@ -175,7 +175,7 @@
|
||||
"Automated messages and emails": "Automated messages and emails",
|
||||
"Automatic": "Automatic",
|
||||
"Automatic (follows system settings)": "Automatic (follows system settings)",
|
||||
"Automatically mark messages as read": "",
|
||||
"Automatically mark messages as read": "Automatically mark messages as read",
|
||||
"Available on Zulip Cloud Standard. <z-link-upgrade>Upgrade</z-link-upgrade> or <z-link-sponsorship>request sponsorship</z-link-sponsorship> to access.": "Available on Zulip Cloud Standard. <z-link-upgrade>Upgrade</z-link-upgrade> or <z-link-sponsorship>request sponsorship</z-link-sponsorship> to access.",
|
||||
"Avatar changes are disabled in this organization": "Avatar changes are disabled in this organisation",
|
||||
"Avatar from Gravatar": "Avatar from Gravatar",
|
||||
@@ -216,7 +216,7 @@
|
||||
"Clear image": "Clear image",
|
||||
"Clear profile picture": "Clear profile picture",
|
||||
"Click here to reveal.": "Click here to reveal.",
|
||||
"Click on the pencil (<z-pencil-icon></z-pencil-icon>) icon to edit and reschedule a message.": "",
|
||||
"Click on the pencil (<z-pencil-icon></z-pencil-icon>) icon to edit and reschedule a message.": "Click on the pencil (<z-pencil-icon></z-pencil-icon>) icon to edit and reschedule a message.",
|
||||
"Click outside the input box to save. We'll automatically notify anyone that was added or removed.": "Click outside the input box to save. We'll automatically notify anyone that was added or removed.",
|
||||
"Click to view or download.": "Click to view or download.",
|
||||
"Close": "Close",
|
||||
@@ -233,7 +233,6 @@
|
||||
"Compact": "Compact",
|
||||
"Complete": "Complete",
|
||||
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "Complete the <z-link>organisation profile</z-link> to brand and explain the purpose of this Zulip organization.",
|
||||
"Compose a reply @-mentioning author": "Compose a reply @-mentioning author",
|
||||
"Compose message": "Compose message",
|
||||
"Compose your message here": "Compose your message here",
|
||||
"Compose your message here...": "Compose your message here...",
|
||||
@@ -282,14 +281,14 @@
|
||||
"Custom time": "Custom time",
|
||||
"Cycle between stream narrows": "Cycle between stream narrows",
|
||||
"DIRECT MESSAGES": "DIRECT MESSAGES",
|
||||
"DM": "",
|
||||
"DM": "DM",
|
||||
"DMs, mentions, and alerts": "DMs, mentions, and alerts",
|
||||
"Dark": "Dark",
|
||||
"Dark theme": "Dark theme",
|
||||
"Dark theme logo": "Dark theme logo",
|
||||
"Data exports": "Data exports",
|
||||
"Date muted": "Date muted",
|
||||
"Date updated": "",
|
||||
"Date updated": "Date updated",
|
||||
"Date uploaded": "Date uploaded",
|
||||
"Day of the week to send digests": "Day of the week to send digests",
|
||||
"Deactivate": "Deactivate",
|
||||
@@ -303,11 +302,11 @@
|
||||
"Deactivated": "Deactivated",
|
||||
"Deactivated users": "Deactivated users",
|
||||
"December": "December",
|
||||
"Default for stream": "",
|
||||
"Default for stream": "Default for stream",
|
||||
"Default is {language}. Use 'text' to disable highlighting.": "Default is {language}. Use 'text' to disable highlighting.",
|
||||
"Default language for code blocks": "Default language for code blocks",
|
||||
"Default streams": "Default streams",
|
||||
"Default streams for this organization": "",
|
||||
"Default streams for this organization": "Default streams for this organisation",
|
||||
"Default user settings": "Default user settings",
|
||||
"Default view": "Default view",
|
||||
"Delay before sending message notification emails": "Delay before sending message notification emails",
|
||||
@@ -348,7 +347,7 @@
|
||||
"Detailed keyboard shortcuts documentation": "Detailed keyboard shortcuts documentation",
|
||||
"Detailed message formatting documentation": "Detailed message formatting documentation",
|
||||
"Detailed search filters documentation": "Detailed search filters documentation",
|
||||
"Direct message": "",
|
||||
"Direct message": "Direct message",
|
||||
"Direct messages": "Direct messages",
|
||||
"Direct messages and mentions": "Direct messages and mentions",
|
||||
"Direct messages are disabled in this organization.": "Direct messages are disabled in this organisation.",
|
||||
@@ -384,7 +383,7 @@
|
||||
"EDITED": "EDITED",
|
||||
"Edit": "Edit",
|
||||
"Edit #{stream_name}": "Edit #{stream_name}",
|
||||
"Edit and reschedule message": "",
|
||||
"Edit and reschedule message": "Edit and reschedule message",
|
||||
"Edit bot": "Edit bot",
|
||||
"Edit custom profile field": "Edit custom profile field",
|
||||
"Edit linkfiers": "Edit linkfiers",
|
||||
@@ -393,7 +392,7 @@
|
||||
"Edit selected draft": "Edit selected draft",
|
||||
"Edit selected message or view source": "Edit selected message or view source",
|
||||
"Edit status": "Edit status",
|
||||
"Edit stream name and description": "",
|
||||
"Edit stream name and description": "Edit stream name and description",
|
||||
"Edit topic": "Edit topic",
|
||||
"Edit user": "Edit user",
|
||||
"Edit your last message": "Edit your last message",
|
||||
@@ -454,7 +453,7 @@
|
||||
"Expand direct messages": "Expand direct messages",
|
||||
"Expand message": "Expand message",
|
||||
"Expires at": "Expires at",
|
||||
"Expires on {date} at {time}": "",
|
||||
"Expires on {date} at {time}": "Expires on {date} at {time}",
|
||||
"Export failed": "Export failed",
|
||||
"Export organization": "Export organisation",
|
||||
"Export started. Check back in a few minutes.": "Export started. Check back in a few minutes.",
|
||||
@@ -521,11 +520,11 @@
|
||||
"Go back through viewing history": "Go back through viewing history",
|
||||
"Go forward through viewing history": "Go forward through viewing history",
|
||||
"Go invisible": "Go invisible",
|
||||
"Go to #{display_recipient}": "",
|
||||
"Go to #{display_recipient} > {topic}": "",
|
||||
"Go to #{display_recipient}": "Go to #{display_recipient}",
|
||||
"Go to #{display_recipient} > {topic}": "Go to #{display_recipient} > {topic}",
|
||||
"Go to conversation": "Go to conversation",
|
||||
"Go to default view": "Go to default view",
|
||||
"Go to direct messages with {display_reply_to}": "",
|
||||
"Go to direct messages with {display_reply_to}": "Go to direct messages with {display_reply_to}",
|
||||
"Got it": "Got it",
|
||||
"Got it!": "Got it!",
|
||||
"Government": "Government",
|
||||
@@ -582,7 +581,7 @@
|
||||
"Inviting...": "Inviting...",
|
||||
"Italic": "Italic",
|
||||
"January": "January",
|
||||
"Join video call.": "",
|
||||
"Join video call.": "Join video call.",
|
||||
"Join {realm_name}": "Join {realm_name}",
|
||||
"Joined": "Joined",
|
||||
"Joined {date_joined}": "Joined {date_joined}",
|
||||
@@ -663,8 +662,8 @@
|
||||
"Message {recipient_names}": "Message {recipient_names}",
|
||||
"Message {recipient_name} ({recipient_status})": "Message {recipient_name} ({recipient_status})",
|
||||
"Messages in all public streams": "Messages in all public streams",
|
||||
"Messages will not be automatically marked as read because this is not a conversation view. <z-link>Change setting</z-link>": "",
|
||||
"Messages will not be automatically marked as read. <z-link>Change setting</z-link>": "",
|
||||
"Messages will not be automatically marked as read because this is not a conversation view. <z-link>Change setting</z-link>": "Messages will not be automatically marked as read because this is not a conversation view. <z-link>Change setting</z-link>",
|
||||
"Messages will not be automatically marked as read. <z-link>Change setting</z-link>": "Messages will not be automatically marked as read. <z-link>Change setting</z-link>",
|
||||
"Mobile": "Mobile",
|
||||
"Mobile message notifications": "Mobile message notifications",
|
||||
"Mobile notifications": "Mobile notifications",
|
||||
@@ -672,7 +671,7 @@
|
||||
"Moderator": "Moderator",
|
||||
"Moderators": "Moderators",
|
||||
"Monday": "Monday",
|
||||
"Monday at {time}": "",
|
||||
"Monday at {time}": "Monday at {time}",
|
||||
"Move all messages in <strong>{topic_name}</strong>": "Move all messages in <strong>{topic_name}</strong>",
|
||||
"Move all messages in this topic": "Move all messages in this topic",
|
||||
"Move message": "Move message",
|
||||
@@ -700,7 +699,7 @@
|
||||
"Narrow to all direct messages": "Narrow to all direct messages",
|
||||
"Narrow to all unmuted messages": "Narrow to all unmuted messages",
|
||||
"Narrow to current compose box recipient": "Narrow to current compose box recipient",
|
||||
"Narrow to direct messages that include <z-value></z-value>.": "",
|
||||
"Narrow to direct messages that include <z-value></z-value>.": "Narrow to direct messages that include <z-value></z-value>.",
|
||||
"Narrow to direct messages with <z-value></z-value>.": "Narrow to direct messages with <z-value></z-value>.",
|
||||
"Narrow to direct messages.": "Narrow to direct messages.",
|
||||
"Narrow to just message ID <z-value></z-value>.": "Narrow to just message ID <z-value></z-value>.",
|
||||
@@ -717,7 +716,7 @@
|
||||
"Narrow to next unread direct message": "Narrow to next unread direct message",
|
||||
"Narrow to next unread topic": "Narrow to next unread topic",
|
||||
"Narrow to starred messages.": "Narrow to starred messages.",
|
||||
"Narrow to stream from topic view": "",
|
||||
"Narrow to stream from topic view": "Narrow to stream from topic view",
|
||||
"Narrow to topic or DM conversation": "Narrow to topic or DM conversation",
|
||||
"Narrow to unread messages.": "Narrow to unread messages.",
|
||||
"Narrow to {message_recipient}": "Narrow to {message_recipient}",
|
||||
@@ -800,6 +799,7 @@
|
||||
"Only organization owners may deactivate an organization.": "Only organisation owners may deactivate an organisation.",
|
||||
"Only owners can change these settings.": "Only owners can change these settings.",
|
||||
"Only stream members can add users to a private stream": "Only stream members can add users to a private stream",
|
||||
"Only stream members can add users to a private stream.": "Only stream members can add users to a private stream.",
|
||||
"Only subscribers to this stream can edit stream permissions.": "Only subscribers to this stream can edit stream permissions.",
|
||||
"Open": "Open",
|
||||
"Open message menu": "Open message menu",
|
||||
@@ -875,7 +875,7 @@
|
||||
"Pronouns": "Pronouns",
|
||||
"Public": "Public",
|
||||
"Question": "Question",
|
||||
"Quote and reply or forward": "Quote and reply or forward",
|
||||
"Quote and reply": "Quote and reply",
|
||||
"Quote and reply to message": "Quote and reply to message",
|
||||
"Quoted original email (in replies)": "Quoted original email (in replies)",
|
||||
"React to selected message with": "React to selected message with",
|
||||
@@ -894,11 +894,12 @@
|
||||
"Removed successfully.": "Removed successfully.",
|
||||
"Rename topic": "Rename topic",
|
||||
"Rename topic to:": "Rename topic to:",
|
||||
"Reply @-mentioning sender": "Reply @-mentioning sender",
|
||||
"Reply directly to sender": "Reply directly to sender",
|
||||
"Reply mentioning bot": "Reply mentioning bot",
|
||||
"Reply mentioning user": "Reply mentioning user",
|
||||
"Reply to author": "Reply to author",
|
||||
"Reply to message": "Reply to message",
|
||||
"Reply to selected conversation": "",
|
||||
"Reply to selected conversation": "Reply to selected conversation",
|
||||
"Reply to selected message": "Reply to selected message",
|
||||
"Request education pricing": "Request education pricing",
|
||||
"Request sponsorship": "Request sponsorship",
|
||||
@@ -929,7 +930,7 @@
|
||||
"Saved as draft": "Saved as draft",
|
||||
"Saved. Please <z-link>reload</z-link> for the change to take effect.": "Saved. Please <z-link>reload</z-link> for the change to take effect.",
|
||||
"Saving": "Saving",
|
||||
"Schedule for {formatted_send_later_time}": "",
|
||||
"Schedule for {formatted_send_later_time}": "Schedule for {formatted_send_later_time}",
|
||||
"Schedule message": "Schedule message",
|
||||
"Scheduled messages": "Scheduled messages",
|
||||
"Scroll down": "Scroll down",
|
||||
@@ -1062,6 +1063,8 @@
|
||||
"This is a <z-link>demo organization</z-link> and will be automatically deleted in {days_remaining} days.": "This is a <z-link>demo organisation</z-link> and will be automatically deleted in {days_remaining} days.",
|
||||
"This is not a <z-link>publicly accessible</z-link> conversation.": "This is not a <z-link>publicly accessible</z-link> conversation.",
|
||||
"This is what a Zulip notification looks like.": "This is what a Zulip notification looks like.",
|
||||
"This message could not be sent at the scheduled time.": "This message could not be sent at the scheduled time.",
|
||||
"This message is no longer scheduled for {deliver_at}.": "This message is no longer scheduled for {deliver_at}.",
|
||||
"This message was hidden because you have muted the sender.": "This message was hidden because you have muted the sender.",
|
||||
"This organization is configured so that administrators and moderators can add custom emoji.": "This organisation is configured so that administrators and moderators can add custom emoji.",
|
||||
"This organization is configured so that administrators and moderators can modify user groups.": "This organisation is configured so that administrators and moderators can modify user groups.",
|
||||
@@ -1104,16 +1107,16 @@
|
||||
"To invite users, please <z-link-billing>increase the number of licenses</z-link-billing> or <z-link-help-page>deactivate inactive users</z-link-help-page>.": "To invite users, please <z-link-billing>increase the number of licenses</z-link-billing> or <z-link-help-page>deactivate inactive users</z-link-help-page>.",
|
||||
"To preserve your reading state, this view does not mark messages as read.": "To preserve your reading state, this view does not mark messages as read.",
|
||||
"Today": "Today",
|
||||
"Today at {time}": "",
|
||||
"Today at {time}": "Today at {time}",
|
||||
"Toggle first emoji reaction on selected message": "Toggle first emoji reaction on selected message",
|
||||
"Toggle subscription": "Toggle subscription",
|
||||
"Toggle the gear menu": "Toggle the gear menu",
|
||||
"Toggle topic mute": "Toggle topic mute",
|
||||
"Tomorrow": "Tomorrow",
|
||||
"Tomorrow at {time}": "",
|
||||
"Tomorrow at {time}": "Tomorrow at {time}",
|
||||
"Topic": "Topic",
|
||||
"Topic muted": "Topic muted",
|
||||
"Topic settings": "",
|
||||
"Topic settings": "Topic settings",
|
||||
"Topics": "Topics",
|
||||
"Topics are required in this organization.": "Topics are required in this organisation.",
|
||||
"Topics marked as resolved": "Topics marked as resolved",
|
||||
@@ -1123,7 +1126,7 @@
|
||||
"Type": "Type",
|
||||
"URL pattern": "URL pattern",
|
||||
"URL prefix": "URL prefix",
|
||||
"URL template": "",
|
||||
"URL template": "URL template",
|
||||
"USERS": "USERS",
|
||||
"Uncheck all": "Uncheck all",
|
||||
"Undo": "Undo",
|
||||
@@ -1135,7 +1138,7 @@
|
||||
"Unmute stream": "Unmute stream",
|
||||
"Unmute this user": "Unmute this user",
|
||||
"Unmute topic": "Unmute topic",
|
||||
"Unmuted": "",
|
||||
"Unmuted": "Unmuted",
|
||||
"Unpin stream from top": "Unpin stream from top",
|
||||
"Unread": "Unread",
|
||||
"Unread count badge (appears in desktop sidebar and browser tab)": "Unread count badge (appears in desktop sidebar and browser tab)",
|
||||
@@ -1210,7 +1213,7 @@
|
||||
"View scheduled messages": "View scheduled messages",
|
||||
"View stream": "View stream",
|
||||
"View stream messages": "View stream messages",
|
||||
"View streams": "",
|
||||
"View streams": "View streams",
|
||||
"View user card": "View user card",
|
||||
"View your profile": "View your profile",
|
||||
"Visual": "Visual",
|
||||
@@ -1254,7 +1257,8 @@
|
||||
"Working…": "Working…",
|
||||
"Write": "Write",
|
||||
"Yes, please!": "Yes, please!",
|
||||
"Yes, save": "",
|
||||
"Yes, save": "Yes, save",
|
||||
"Yes, schedule": "Yes, schedule",
|
||||
"Yes, send": "Yes, send",
|
||||
"Yesterday": "Yesterday",
|
||||
"You": "You",
|
||||
@@ -1268,19 +1272,21 @@
|
||||
"You are not allowed to send direct messages in this organization.": "You are not allowed to send direct messages in this organisation.",
|
||||
"You are not currently subscribed to this stream.": "You are not currently subscribed to this stream.",
|
||||
"You are not subscribed to any streams.": "You are not subscribed to any streams.",
|
||||
"You are not subscribed to stream <z-stream-name></z-stream-name>": "",
|
||||
"You are not subscribed to stream <z-stream-name></z-stream-name>": "You are not subscribed to stream <z-stream-name></z-stream-name>",
|
||||
"You are sending a message to a resolved topic. You can send as-is or unresolve the topic first.": "You are sending a message to a resolved topic. You can send as-is or unresolve the topic first.",
|
||||
"You are using an old version of the Zulip desktop app with known security bugs.": "You are using an old version of the Zulip desktop app with known security bugs.",
|
||||
"You aren't subscribed to this stream and nobody has talked about that yet!": "You aren't subscribed to this stream and nobody has talked about that yet!",
|
||||
"You can also make <z-link>tables</z-link> with this <z-link>Markdown-ish table syntax</z-link>.": "You can also make <z-link>tables</z-link> with this <z-link>Markdown-ish table syntax</z-link>.",
|
||||
"You can combine search filters as needed.": "You can combine search filters as needed.",
|
||||
"You can fully access this community and participate in conversations by creating a Zulip account in this organization.": "You can fully access this community and participate in conversations by creating a Zulip account in this organisation.",
|
||||
"You can no longer save changes to this message.": "You can no longer save changes to this message.",
|
||||
"You can only view or manage invitations that you sent.": "You can only view or manage invitations that you sent.",
|
||||
"You can reactivate deactivated users from <z-link>organization settings</z-link>.": "You can reactivate deactivated users from <z-link>organisation settings</z-link>.",
|
||||
"You can use email to send messages to Zulip streams.": "You can use email to send messages to Zulip streams.",
|
||||
"You cannot create a stream with no subscribers!": "You cannot create a stream with no subscribers!",
|
||||
"You cannot create a user group with no members!": "You cannot create a user group with no members!",
|
||||
"You cannot send messages to deactivated users.": "You cannot send messages to deactivated users.",
|
||||
"You do not have permission to add other users to streams in this organization.": "You do not have permission to add other users to streams in this organisation.",
|
||||
"You do not have permission to move some of the messages in this topic. Contact a moderator to move all messages.": "You do not have permission to move some of the messages in this topic. Contact a moderator to move all messages.",
|
||||
"You do not have permission to post in this stream.": "You do not have permission to post in this stream.",
|
||||
"You do not have permission to resolve topics with messages older than {N, plural, one {# day} other {# days}} in this organization.": "You do not have permission to resolve topics with messages older than {N, plural, one {# day} other {# days}} in this organisation.",
|
||||
@@ -1290,18 +1296,18 @@
|
||||
"You do not have permission to unresolve topics with messages older than {N, plural, one {# hour} other {# hours}} in this organization.": "You do not have permission to unresolve topics with messages older than {N, plural, one {# hour} other {# hours}} in this organisation.",
|
||||
"You do not have permission to unresolve topics with messages older than {N, plural, one {# minute} other {# minutes}} in this organization.": "You do not have permission to unresolve topics with messages older than {N, plural, one {# minute} other {# minutes}} in this organisation.",
|
||||
"You do not have permission to use wildcard mentions in this stream.": "You do not have permission to use wildcard mentions in this stream.",
|
||||
"You don't have any direct message conversations yet.": "",
|
||||
"You don't have any direct message conversations yet.": "You don't have any direct message conversations yet.",
|
||||
"You get": "You get",
|
||||
"You have muted <z-stream-topic></z-stream-topic>.": "You have muted <z-stream-topic></z-stream-topic>.",
|
||||
"You have no active bots.": "You have no active bots.",
|
||||
"You have no direct messages including {person} yet.": "",
|
||||
"You have no direct messages including {person} yet.": "You have no direct messages including {person} yet.",
|
||||
"You have no direct messages with these users yet.": "You have no direct messages with these users yet.",
|
||||
"You have no direct messages with {person} yet.": "You have no direct messages with {person} yet.",
|
||||
"You have no direct messages yet!": "You have no direct messages yet!",
|
||||
"You have no inactive bots.": "You have no inactive bots.",
|
||||
"You have no starred messages.": "",
|
||||
"You have no starred messages.": "You have no starred messages.",
|
||||
"You have no unread messages!": "You have no unread messages!",
|
||||
"You have not configured any topics yet.": "",
|
||||
"You have not configured any topics yet.": "You have not configured any topics yet.",
|
||||
"You have not muted any users yet.": "You have not muted any users yet.",
|
||||
"You have not sent any direct messages to yourself yet!": "You have not sent any direct messages to yourself yet!",
|
||||
"You have not uploaded any files.": "You have not uploaded any files.",
|
||||
@@ -1310,17 +1316,17 @@
|
||||
"You must be an organization administrator to create a stream without subscribing.": "You must be an organisation administrator to create a stream without subscribing.",
|
||||
"You need to be running Zephyr mirroring in order to send messages!": "You need to be running Zephyr mirroring in order to send messages!",
|
||||
"You searched for:": "You searched for:",
|
||||
"You subscribed to stream <z-stream-name></z-stream-name>": "",
|
||||
"You subscribed to stream <z-stream-name></z-stream-name>": "You subscribed to stream <z-stream-name></z-stream-name>",
|
||||
"You type": "You type",
|
||||
"You unsubscribed from stream <z-stream-name></z-stream-name>": "",
|
||||
"You will not receive notifications about new messages.": "",
|
||||
"You unsubscribed from stream <z-stream-name></z-stream-name>": "You unsubscribed from stream <z-stream-name></z-stream-name>",
|
||||
"You will not receive notifications about new messages.": "You will not receive notifications about new messages.",
|
||||
"You're not subscribed to this stream. You will not be notified if other users reply to your message.": "You're not subscribed to this stream. You will not be notified if other users reply to your message.",
|
||||
"Your API key:": "Your API key:",
|
||||
"Your Zulip account on <z-link></z-link> has been deactivated, and you will no longer be able to log in.": "Your Zulip account on <z-link></z-link> has been deactivated, and you will no longer be able to log in.",
|
||||
"Your message has been scheduled for {deliver_at}.": "Your message has been scheduled for {deliver_at}.",
|
||||
"Your message is taking longer than expected to be sent. Sending…": "Your message is taking longer than expected to be sent. Sending…",
|
||||
"Your message was sent to a stream you have muted.": "",
|
||||
"Your message was sent to a topic you have muted.": "",
|
||||
"Your message was sent to a stream you have muted.": "Your message was sent to a stream you have muted.",
|
||||
"Your message was sent to a topic you have muted.": "Your message was sent to a topic you have muted.",
|
||||
"Your password": "Your password",
|
||||
"Your status": "Your status",
|
||||
"Your time zone:": "Your time zone:",
|
||||
@@ -1330,7 +1336,7 @@
|
||||
"Zulip Server {display_version}": "Zulip Server {display_version}",
|
||||
"Zulip Server {display_version} (modified)": "Zulip Server {display_version} (modified)",
|
||||
"Zulip Server {display_version} (patched)": "Zulip Server {display_version} (patched)",
|
||||
"Zulip lets you mute topics and streams to avoid receiving notifications messages you are not interested in. Muting a stream effectively mutes all topics in that stream. You can also manually mute a topic in an unmuted stream, or unmute a topic in a muted stream. <z-link>Learn more.</z-link>": "",
|
||||
"Zulip lets you mute topics and streams to avoid receiving notifications messages you are not interested in. Muting a stream effectively mutes all topics in that stream. You can also manually mute a topic in an unmuted stream, or unmute a topic in a muted stream. <z-link>Learn more.</z-link>": "Zulip lets you mute topics and streams to avoid receiving notifications messages you are not interested in. Muting a stream effectively mutes all topics in that stream. You can also manually mute a topic in an unmuted stream, or unmute a topic in a muted stream. <z-link>Learn more.</z-link>",
|
||||
"Zulip needs to send email to confirm users' addresses and send notifications.": "Zulip needs to send email to confirm users' addresses and send notifications.",
|
||||
"Zulip needs your permission to <z-link>enable desktop notifications.</z-link>": "Zulip needs your permission to <z-link>enable desktop notifications.</z-link>",
|
||||
"Zulip's translations are contributed by our amazing community of volunteer translators. If you'd like to help, see the <z-link>Zulip translation guidelines</z-link>.": "Zulip's translations are contributed by our amazing community of volunteer translators. If you'd like to help, see the <z-link>Zulip translation guidelines</z-link>.",
|
||||
|
||||
5477
locale/eo/LC_MESSAGES/django.po
Normal file
5477
locale/eo/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
1390
locale/eo/translations.json
Normal file
1390
locale/eo/translations.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"%'{file}' exceeds the maximum file size for attachments ({variable} MB).": "%'{file}' excede el máximo tamaño de archivo para adjuntos ({variable} MB).",
|
||||
"(attached file)": "",
|
||||
"(attached file)": "(archivo adjunto)",
|
||||
"(forever)": "(Guardar para siempre)",
|
||||
"(hidden)": "(oculto)",
|
||||
"(no description)": "(sin descripción)",
|
||||
@@ -33,17 +33,17 @@
|
||||
"<p>You are searching for messages that belong to more than one topic, which is not possible.</p>": "<p>Estás buscando mensajes que pertenencen a más de un tema, lo cual no es posible.</p>",
|
||||
"<strong>{name}</strong> is not subscribed to this stream. They will not be notified if you mention them.": "<strong>{name}</strong> no está subscrito a este canal. No será notificado si le mencionas.",
|
||||
"<strong>{name}</strong> is not subscribed to this stream. They will not be notified unless you subscribe them.": "<strong>{name}</strong> no está subscrito a este canal. No será notificado si no le subscribes.",
|
||||
"<strong>{username}</strong> has {number_of_invites_by_user} unexpired invitations.": "",
|
||||
"<strong>{username}</strong> has {number_of_invites_by_user} unexpired invitations.": "<strong>{username}</strong> tiene {number_of_invites_by_user} invitaciones sin expirar.",
|
||||
"<z-button>Subscribe</z-button>": "<z-button>Suscribirse</z-button>",
|
||||
"<z-link>Click here</z-link> to learn about exporting private streams and messages.": "<z-link>Haz clic aquí</z-link> para aprender sobre cómo exportar canales privados y mensajes.",
|
||||
"<z-link>Upgrade</z-link> for more space.": "<z-link>Mejora</z-link> para más espacio.",
|
||||
"<z-shortcut></z-shortcut> to add a new line": "<z-shortcut></z-shortcut> para agregar una nueva linea",
|
||||
"<z-shortcut></z-shortcut> to send": "<z-shortcut></z-shortcut> para enviar",
|
||||
"<z-user></z-user> will have the same properties as it did prior to deactivation, including role, owner and stream subscriptions.": "<z-user></z-user> tendrá la mismas configuraciones a como los tuvo antes de la desactivación, incluyendo rol, propietario y subscriptores del canal.",
|
||||
"<z-user></z-user> will have the same role, stream subscriptions, user group memberships, and other settings and permissions as they did prior to deactivation.": "",
|
||||
"<z-user></z-user> will have the same role, stream subscriptions, user group memberships, and other settings and permissions as they did prior to deactivation.": "<z-user></z-user> tendrá el mismo rol, suscripcion a canales, grupos de usuarios, otras configuraciones y permisos que los que tenía antes de la desactivación.",
|
||||
"A Topic Move already in progress.": "Un cambio de tema ya en marcha. ",
|
||||
"A deactivated bot cannot send messages, access data, or take any other action.": "",
|
||||
"A deactivated emoji will remain visible in existing messages and emoji reactions, but cannot be used on new messages.": "",
|
||||
"A deactivated bot cannot send messages, access data, or take any other action.": "Un bot desactivado no puede enviar mensajes, acceder a datos o tomar cualquier otra acción.",
|
||||
"A deactivated emoji will remain visible in existing messages and emoji reactions, but cannot be used on new messages.": "Un emoji desactivado permanecerá visible en mensajes y reacciones de emoji existentes, pero no podrá ser usado en mensajes nuevos.",
|
||||
"A language is marked as 100% translated only if every string in the web, desktop, and mobile apps is translated, including administrative UI and error messages.": "Un idioma está marcado como traducido al 100% únicamente si todas las cadenas en las aplicaciones web, escritorio y móvil son traducidas. Incluyendo la interfaz administrativa y mensajes de error.",
|
||||
"A stream needs to have a name": "Un canal necesita tener un nombre",
|
||||
"A stream with this name already exists": "Ya existe un canal con este nombre",
|
||||
@@ -58,17 +58,17 @@
|
||||
"Action": "Acción",
|
||||
"Actions": "Acciones",
|
||||
"Active": "Activo",
|
||||
"Active an hour ago": "",
|
||||
"Active an hour ago": "Activo hace una hora",
|
||||
"Active bots": "Bots activos",
|
||||
"Active more than 2 weeks ago": "",
|
||||
"Active more than 2 weeks ago": "Activo hace más de dos semanas",
|
||||
"Active now": "Activo ahora",
|
||||
"Active users": "Usuarios activos",
|
||||
"Active yesterday": "",
|
||||
"Active {days_old} days ago": "",
|
||||
"Active {hours} hours ago": "",
|
||||
"Active {last_active_date}": "",
|
||||
"Active {minutes} minutes ago": "",
|
||||
"Activity unknown": "",
|
||||
"Active yesterday": "Activo ayer",
|
||||
"Active {days_old} days ago": "Activo hace {days_old} dias",
|
||||
"Active {hours} hours ago": "Activo hace {hours} horas",
|
||||
"Active {last_active_date}": "Activo en {last_active_date}",
|
||||
"Active {minutes} minutes ago": "Activo hace {minutes} minutos",
|
||||
"Activity unknown": "Actividad desconocida",
|
||||
"Add": "Añadir",
|
||||
"Add GIF": "Añadir GIF",
|
||||
"Add a new alert word": "Añadir una nueva alerta",
|
||||
@@ -121,7 +121,7 @@
|
||||
"Alert word already exists!": "¡La alerta ya existe!",
|
||||
"Alert words": "Alertas",
|
||||
"Alert words allow you to be notified as if you were @-mentioned when certain words or phrases are used in Zulip. Alert words are not case sensitive.": "Las alertas te permiten ser notificado como si te @-mencionasen cuando ciertas palabras o frases son usadas en Zulip. Las alertas no son sensitivas a mayúsculas o minúsculas.",
|
||||
"Alerted messages": "",
|
||||
"Alerted messages": "Mensajes con alertas",
|
||||
"All": "Todas",
|
||||
"All direct messages": "Todos los mensajes directos",
|
||||
"All messages": "Todos los mensajes",
|
||||
@@ -143,7 +143,7 @@
|
||||
"An API key can be used to programmatically access a Zulip account. Anyone with access to your API key has the ability to read your messages, send messages on your behalf, and otherwise impersonate you on Zulip, so you should guard your API key as carefully as you guard your password. <br /> We recommend creating bots and using the bots' accounts and API keys to access the Zulip API, unless the task requires access to your account.": "Una clave de API puede ser usada para acceder de forma automática a una cuenta de Zulip. Cualquiera con acceso a tu clave de API puede leer tus mensajes, enviar mensajes en tu nombre, e impersonarte en general en Zulip, así que deberías proteger tu clave de API tan cuidadosamente como proteges tu contraseña. <br /> Te recomendamos crear bots, y usar sus cuentas y claves de API para acceder a la API de Zulip, a no ser que la tarea requiera acceso a tu cuenta.",
|
||||
"An hour ago": "Hace una hora",
|
||||
"An unknown error occurred.": "Ha ocurrido un error desconocido.",
|
||||
"Announce new stream in": "",
|
||||
"Announce new stream in": "Anunciar nuevo canal en",
|
||||
"Any organization administrator can conduct an export.": "Cualquier administrador de organización puede exportar.",
|
||||
"Any time": "Cualquier momento",
|
||||
"April": "Abril",
|
||||
@@ -162,7 +162,7 @@
|
||||
"Are you sure you want to resend the invitation to <z-email></z-email>?": "¿Estás seguro que deseas reenviar la invitación a <z-email></z-email>?",
|
||||
"Are you sure you want to revoke the invitation to <strong>{email}</strong>?": "¿Estás seguro que deseas revocar la invitación a <strong>{email}</strong>?",
|
||||
"Are you sure you want to revoke this invitation link created by <strong>{referred_by}</strong>?": "¿Estás seguro que deseas revocar el vínculo de invitación creado por <strong>{referred_by}</strong>?",
|
||||
"Are you sure you want to send @-mention notifications to the <strong>{subscriber_count}</strong> users subscribed to #{stream_name}? If not, please edit your message to remove the <strong>@{wildcard_mention}</strong> mention.": "",
|
||||
"Are you sure you want to send @-mention notifications to the <strong>{subscriber_count}</strong> users subscribed to #{stream_name}? If not, please edit your message to remove the <strong>@{wildcard_mention}</strong> mention.": "¿Estás seguro que quieres enviar notificaciones de mención @ a los <strong>{subscriber_count}</strong> usuarios suscritos a #{stream_name}?. Si no lo estás, por favor edita tu mensaje para eliminar la mención a <strong>@{wildcard_mention}</strong> .",
|
||||
"Are you sure you want to unstar all messages in <stream-topic></stream-topic>? This action cannot be undone.": "¿Seguro que quieres quitar la estrella a todos los mensajes en <stream-topic></stream-topic>? Esta acción no se puede deshacer.",
|
||||
"Are you sure you want to unstar all starred messages? This action cannot be undone.": "¿Estas seguro de querer quitar la estrella a todos los mensajes con estrella? Esta acción no se puede deshacer.",
|
||||
"Ask me later": "Pregúntame más tarde",
|
||||
@@ -175,8 +175,8 @@
|
||||
"Automated messages and emails": "Mensajes y correos electrónicos automáticos",
|
||||
"Automatic": "Automático",
|
||||
"Automatic (follows system settings)": "Automático (coincidir con configuración del sistema)",
|
||||
"Automatically mark messages as read": "",
|
||||
"Available on Zulip Cloud Standard. <z-link-upgrade>Upgrade</z-link-upgrade> or <z-link-sponsorship>request sponsorship</z-link-sponsorship> to access.": "",
|
||||
"Automatically mark messages as read": "Marcar los mensajes como leídos automáticamente",
|
||||
"Available on Zulip Cloud Standard. <z-link-upgrade>Upgrade</z-link-upgrade> or <z-link-sponsorship>request sponsorship</z-link-sponsorship> to access.": "Disponible en Zulip Cloud Standard. <z-link-upgrade>Actualiza</z-link-upgrade> o <z-link-sponsorship>solicita patrocinio</z-link-sponsorship> para tener acceso.",
|
||||
"Avatar changes are disabled in this organization": "Los cambios de avatar están deshabilitados en esta organización",
|
||||
"Avatar from Gravatar": "Avatar de Gravatar",
|
||||
"Back to streams": "Volver a canales",
|
||||
@@ -216,7 +216,7 @@
|
||||
"Clear image": "Borrar imagen",
|
||||
"Clear profile picture": "Limpiar imagen de perfil",
|
||||
"Click here to reveal.": "Haz click acá para mostarar.",
|
||||
"Click on the pencil (<z-pencil-icon></z-pencil-icon>) icon to edit and reschedule a message.": "",
|
||||
"Click on the pencil (<z-pencil-icon></z-pencil-icon>) icon to edit and reschedule a message.": "Haz click en el ícono de lápiz (<z-pencil-icon></z-pencil-icon>) para editar y reprogramar un mensaje.",
|
||||
"Click outside the input box to save. We'll automatically notify anyone that was added or removed.": "Haz click fuera de la caja de texto para guardar. Notificaremos automáticamente a cualquiera que haya sido añadido o eliminado.",
|
||||
"Click to view or download.": "Haz click para ver o descargar.",
|
||||
"Close": "Cerrar",
|
||||
@@ -224,7 +224,7 @@
|
||||
"Close this dialog window": "Cerrar esta ventana modal",
|
||||
"Code playgrounds": "",
|
||||
"Code playgrounds are interactive in-browser development environments, such as <z-link-repl>replit</z-link-repl>, that are designed to make it convenient to edit and debug code. Zulip <z-link-code-blocks>code blocks</z-link-code-blocks> that are tagged with a programming language will have a button visible on hover that allows users to open the code block on the code playground site.": "",
|
||||
"Collapse compose": "",
|
||||
"Collapse compose": "Colapsar editor",
|
||||
"Collapse direct messages": "Colapsar mensajes directos",
|
||||
"Collapse message": "Colapsar mensaje",
|
||||
"Collapse/show selected message": "Contraer/mostrar el mensaje seleccionado",
|
||||
@@ -232,21 +232,20 @@
|
||||
"Commuting": "Viajando",
|
||||
"Compact": "Compacto",
|
||||
"Complete": "Completado",
|
||||
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "",
|
||||
"Compose a reply @-mentioning author": "Redactar una respuesta @-mencionando al autor",
|
||||
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "Completa el <z-link>perfil de la organización</z-link> para personalizar y expicar el propósito de esta organización Zulip.",
|
||||
"Compose message": "Escribir mensaje",
|
||||
"Compose your message here": "Escribe tu mensaje aquí",
|
||||
"Compose your message here...": "Escribe tu mensaje aquí...",
|
||||
"Composing messages": "Redactar mensajes",
|
||||
"Configure how Zulip notifies you about new messages.": "Configurar cómo te notifica Zulip que hay mensajes nuevos.",
|
||||
"Configure regular expression patterns that will be used to automatically transform any matching text in Zulip messages and topics into links.": "",
|
||||
"Configure the <z-link>default personal preference settings</z-link> for new users joining your organization.": "",
|
||||
"Configure regular expression patterns that will be used to automatically transform any matching text in Zulip messages and topics into links.": "Configura patrones de expresiones regulares que serán usados para transformar el texto coincidente en los mensajes y temas de Zulip en vínculos",
|
||||
"Configure the <z-link>default personal preference settings</z-link> for new users joining your organization.": "Configura las <z-link>preferencias personales por defecto</z-link> para los nuevos usuarios que ingresen a tu organización.",
|
||||
"Configure the authentication methods for your organization.": "Configura los métodos de autentificación para tu organización.",
|
||||
"Configure the default streams new users are subscribed to when joining your organization.": "Configura los canales a los que los nuevos usuarios están suscritos por defecto cuando se unen a tu organización.",
|
||||
"Confirm": "Confirmar",
|
||||
"Consider <z-link>searching all public streams</z-link>.": "",
|
||||
"Contact a moderator to resolve this topic.": "",
|
||||
"Contact a moderator to unresolve this topic.": "",
|
||||
"Consider <z-link>searching all public streams</z-link>.": "Considera <z-link>buscar en todos los canales publicos</z-link>.",
|
||||
"Contact a moderator to resolve this topic.": "Contacta a un administrador para cerrar este tema.",
|
||||
"Contact a moderator to unresolve this topic.": "Contacta a un administrador para reabrir este tema.",
|
||||
"Contact support": "Contactar a soporte",
|
||||
"Convert emoticons before sending (<code>:)</code> becomes 😃)": "Convertir los emoticonos antes de enviarlos (<code>:)</code> se convierte en 😃)",
|
||||
"Cookie Bot": "Bot de Cookies",
|
||||
@@ -260,8 +259,8 @@
|
||||
"Copy mention syntax": "Copiar la sintaxis de la mención",
|
||||
"Copy version": "Copiar Versión",
|
||||
"Copy zuliprc": "Copiar zuliprc",
|
||||
"Could not resolve topic": "",
|
||||
"Could not unresolve topic": "",
|
||||
"Could not resolve topic": "No se puede cerrar este tema.",
|
||||
"Could not unresolve topic": "No se pudo reactivar este tema.",
|
||||
"Create": "Crear",
|
||||
"Create a stream": "Crear un canal",
|
||||
"Create new stream": "Crear nuevo canal",
|
||||
@@ -282,14 +281,14 @@
|
||||
"Custom time": "",
|
||||
"Cycle between stream narrows": "Desplazarse por los filtros de canal",
|
||||
"DIRECT MESSAGES": "MENSAJES DIRECTOS",
|
||||
"DM": "",
|
||||
"DM": "MD",
|
||||
"DMs, mentions, and alerts": "Mensajes directos, menciones y alertas",
|
||||
"Dark": "Oscuro",
|
||||
"Dark theme": "Tema oscuro",
|
||||
"Dark theme logo": "Logo de tema oscuro",
|
||||
"Data exports": "Exportaciones de datos",
|
||||
"Date muted": "Fecha de silencio",
|
||||
"Date updated": "",
|
||||
"Date updated": "Fecha actualizada",
|
||||
"Date uploaded": "Fecha de subida",
|
||||
"Day of the week to send digests": "Día de la semana para enviar resumenes",
|
||||
"Deactivate": "Desactivar",
|
||||
@@ -303,11 +302,11 @@
|
||||
"Deactivated": "Desactivado",
|
||||
"Deactivated users": "Usuarios desactivados",
|
||||
"December": "Diciembre",
|
||||
"Default for stream": "",
|
||||
"Default for stream": "Defecto para el canal",
|
||||
"Default is {language}. Use 'text' to disable highlighting.": "Por defecto es {language}. Usa 'text' para desabilitar el resaltado.",
|
||||
"Default language for code blocks": "Lenguaje por defecto para bloques de código",
|
||||
"Default streams": "Canales por defecto",
|
||||
"Default streams for this organization": "",
|
||||
"Default streams for this organization": "Canales por defecto para esta organización",
|
||||
"Default user settings": "Ajustes de usuario por defecto",
|
||||
"Default view": "Vista por defecto",
|
||||
"Delay before sending message notification emails": "Retraso antes de enviar correos electrónicos de notificación de mensaje",
|
||||
@@ -317,7 +316,7 @@
|
||||
"Delete all drafts": "Eliminar todos los borradores",
|
||||
"Delete code playground?": "",
|
||||
"Delete custom profile field?": "¿Eliminar campo personalizado de perfil?",
|
||||
"Delete data export?": "",
|
||||
"Delete data export?": "¿Eliminar exportación de datos?",
|
||||
"Delete draft": "Eliminar borrador",
|
||||
"Delete file": "Eliminar archivo",
|
||||
"Delete file?": "¿Eliminar archivo?",
|
||||
@@ -327,7 +326,7 @@
|
||||
"Delete message": "Eliminar mensaje",
|
||||
"Delete message?": "¿Eliminar mensaje?",
|
||||
"Delete profile picture": "Eliminar imagen de perfil",
|
||||
"Delete scheduled message": "",
|
||||
"Delete scheduled message": "Eliminar mensaje programado",
|
||||
"Delete selected draft": "Eliminar el borrador seleccionado",
|
||||
"Delete topic": "Borrar tema",
|
||||
"Delete {user_group_name}?": "¿Eliminar {user_group_name}?",
|
||||
@@ -348,7 +347,7 @@
|
||||
"Detailed keyboard shortcuts documentation": "Documentación detallada de los atajos de teclado",
|
||||
"Detailed message formatting documentation": "Documentación detallada sobre el formato de los mensajes",
|
||||
"Detailed search filters documentation": "Documentacion detallada de filtros de búsqueda",
|
||||
"Direct message": "",
|
||||
"Direct message": "Mensaje Directo",
|
||||
"Direct messages": "Mensajes Directos",
|
||||
"Direct messages and mentions": "Mensajes directos y todas las menciones",
|
||||
"Direct messages are disabled in this organization.": "Los mensajes directos están deshabilitados para esta organización",
|
||||
@@ -384,16 +383,16 @@
|
||||
"EDITED": "EDITADO",
|
||||
"Edit": "Editar",
|
||||
"Edit #{stream_name}": "Editar #{stream_name}",
|
||||
"Edit and reschedule message": "",
|
||||
"Edit and reschedule message": "Editar y reprogramar mensaje",
|
||||
"Edit bot": "Editar bot",
|
||||
"Edit custom profile field": "Editar campo personalizado de perfil",
|
||||
"Edit linkfiers": "",
|
||||
"Edit message": "Editar mensaje",
|
||||
"Edit or reschedule message": "",
|
||||
"Edit or reschedule message": "Editar o reprogramar mensaje",
|
||||
"Edit selected draft": "Editar el borrador seleccionado",
|
||||
"Edit selected message or view source": "Editar mensaje seleccionado o ver fuente",
|
||||
"Edit status": "Editar estado",
|
||||
"Edit stream name and description": "",
|
||||
"Edit stream name and description": "Editar nombre y descripción del canal",
|
||||
"Edit topic": "Editar tema",
|
||||
"Edit user": "Editar usuario",
|
||||
"Edit your last message": "Editar tu último mensaje",
|
||||
@@ -420,7 +419,7 @@
|
||||
"Enable notifications": "Activar notificaciones",
|
||||
"Enable read receipts": "Habilitar confirmación de lectura",
|
||||
"Enabled": "Activado",
|
||||
"End of results from your <z-link>history</z-link>.": "",
|
||||
"End of results from your <z-link>history</z-link>.": "Fin de los resultados de tu <z-link>historia</z-link>.",
|
||||
"Endpoint URL": "URL del endpoint",
|
||||
"Enter sends when composing a message": "Intro envía cuando se escribe un mensaje",
|
||||
"Error": "Error",
|
||||
@@ -430,7 +429,7 @@
|
||||
"Error creating user group.": "Error creando grupo de usuarios.",
|
||||
"Error deleting message": "Error al borrar el mensaje",
|
||||
"Error fetching message edit history": "Error al recopilar el historial de ediciones del mensaje",
|
||||
"Error in unsubscribing from #{stream_name}": "",
|
||||
"Error in unsubscribing from #{stream_name}": "Error al desuscribirse de #{stream_name}",
|
||||
"Error listing invites": "Error al listar las invitaciones",
|
||||
"Error moving topic": "Error moviendo tema",
|
||||
"Error removing alert word!": "¡Error eliminando la alerta!",
|
||||
@@ -440,7 +439,7 @@
|
||||
"Error removing user from this stream.": "Error al quitar al usuario de este canal",
|
||||
"Error saving edit": "Error al guardar la edición",
|
||||
"Error: Cannot deactivate the only organization owner.": "Error: No se puede desactivar el único propietario de la organización.",
|
||||
"Error: Cannot deactivate the only user. You can deactivate the whole organization though in your <z-link>organization profile settings</z-link>.": "",
|
||||
"Error: Cannot deactivate the only user. You can deactivate the whole organization though in your <z-link>organization profile settings</z-link>.": "Error: No se pudo desactivar este usuario individual. Puedes desactivar la organización completa a través de las <z-link>configuración de perfil de organización</z-link>.",
|
||||
"Escape key navigates to default view": "Tecla Escape navega a la vista por defecto",
|
||||
"Estimated messages per week": "Mensajes estimados por semana",
|
||||
"Event or conference": "Evento o conferencia",
|
||||
@@ -450,11 +449,11 @@
|
||||
"Everyone sees this in their own time zone.": "Todos ven esto en sus propias zonas horarias.",
|
||||
"Exclude messages with topic <z-value></z-value>.": "Excluir mensajes con el tema <z-value></z-value>.",
|
||||
"Exit search": "Salir de la búsqueda",
|
||||
"Expand compose": "",
|
||||
"Expand compose": "Expandir edición",
|
||||
"Expand direct messages": "Expandir mensajes directos",
|
||||
"Expand message": "Expandir mensaje",
|
||||
"Expires at": "Expira en",
|
||||
"Expires on {date} at {time}": "",
|
||||
"Expires on {date} at {time}": "Expira el {date} a las {time}",
|
||||
"Export failed": "La exportación de datos ha fallado",
|
||||
"Export organization": "Exportar organización",
|
||||
"Export started. Check back in a few minutes.": "Exportación iniciada. Vuelve en unos minutos.",
|
||||
@@ -479,7 +478,7 @@
|
||||
"Filter": "Filtrar",
|
||||
"Filter bots": "Filtrar bots",
|
||||
"Filter by category": "Filtrar por categoría",
|
||||
"Filter code playgrounds": "",
|
||||
"Filter code playgrounds": "Filtrar playgrounds de código",
|
||||
"Filter deactivated users": "Filtrar usuarios desactivados",
|
||||
"Filter default streams": "Filtrar canales por defecto",
|
||||
"Filter emoji": "Filtrar emoji",
|
||||
@@ -501,11 +500,11 @@
|
||||
"First message": "Primer mensaje",
|
||||
"First time? Read our <z-link>guidelines</z-link> for creating and naming streams.": "¿Primera vez? Lee nuestros <z-link>lineamientos</z-link> para crear y nombrar canales.",
|
||||
"First time? Read our <z-link>guidelines</z-link> for creating user groups.": "¿Primera vez? Lee nuestros <z-link>lineamientos</z-link> para crear grupos de usuarios.",
|
||||
"For example, to configure a code playground for code blocks tagged as Python, you can set:": "",
|
||||
"For more examples and technical details, see the <z-link>help center documentation</z-link> on adding code playgrounds.": "",
|
||||
"For example, to configure a code playground for code blocks tagged as Python, you can set:": "Por ejemplo, para configurar un playground para bloques de código Python, puedes usar:",
|
||||
"For more examples and technical details, see the <z-link>help center documentation</z-link> on adding code playgrounds.": "Para más ejemplos y detalles ténicos, mira la <z-link>documentación en el centro de ayuda</z-link> a cerca de agregar playgrounds de código.",
|
||||
"For more examples, see the <z-link>help center documentation</z-link> on adding linkifiers.": "",
|
||||
"Forgot it?": "¿Lo olvidaste?",
|
||||
"Forked from upstream at {zulip_merge_base}": "",
|
||||
"Forked from upstream at {zulip_merge_base}": "Bifurcado desde {zulip_merge_base}",
|
||||
"Friday": "Viernes",
|
||||
"Full name": "Nombre completo",
|
||||
"GIPHY attribution": "Atribución de GIPHY",
|
||||
@@ -521,11 +520,11 @@
|
||||
"Go back through viewing history": "Ir atrás a través de la historia de visualización",
|
||||
"Go forward through viewing history": "I adelante a través de la historia de visualización",
|
||||
"Go invisible": "Volverse invisible",
|
||||
"Go to #{display_recipient}": "",
|
||||
"Go to #{display_recipient} > {topic}": "",
|
||||
"Go to #{display_recipient}": "Ir a #{display_recipient}",
|
||||
"Go to #{display_recipient} > {topic}": "Ir a #{display_recipient} > {topic}",
|
||||
"Go to conversation": "Ir a conversación",
|
||||
"Go to default view": "Ir a la vista por defecto",
|
||||
"Go to direct messages with {display_reply_to}": "",
|
||||
"Go to direct messages with {display_reply_to}": "Ir a mensajes directos con {display_reply_to}",
|
||||
"Got it": "Entendido",
|
||||
"Got it!": "¡Lo tengo!",
|
||||
"Government": "Govierno",
|
||||
@@ -537,7 +536,7 @@
|
||||
"Header": "Cabecera",
|
||||
"Help center": "Centro de ayuda",
|
||||
"Hide muted message again": "Ocultar mensajes silenciados de nuevo",
|
||||
"Hide notice": "",
|
||||
"Hide notice": "Ocultar notificación",
|
||||
"Hide password": "Ocultar contraseña",
|
||||
"Hide starred message count": "Ocultar contador de mensajes destacados",
|
||||
"High contrast mode": "Modo de alto contraste",
|
||||
@@ -545,7 +544,7 @@
|
||||
"Hint (up to 80 characters)": "Pista (hasta 80 caracteres)",
|
||||
"Humans": "Humanos",
|
||||
"Idle": "Inactivo",
|
||||
"If you don't know your password, you can <z-link>reset it</z-link>.": "",
|
||||
"If you don't know your password, you can <z-link>reset it</z-link>.": "Si no sabes la contraseña, puedes <z-link>reestablecerla</z-link>.",
|
||||
"Ignored deactivated users:": "Usuarios desactivados ignorados:",
|
||||
"Image": "Imagen",
|
||||
"In a meeting": "En una reunión",
|
||||
@@ -582,7 +581,7 @@
|
||||
"Inviting...": "Invitando...",
|
||||
"Italic": "Cursiva",
|
||||
"January": "Enero",
|
||||
"Join video call.": "",
|
||||
"Join video call.": "Unirse a la video llamada",
|
||||
"Join {realm_name}": "Unirse a {realm_name}",
|
||||
"Joined": "Se unió",
|
||||
"Joined {date_joined}": "Unido {date_joined}",
|
||||
@@ -622,7 +621,7 @@
|
||||
"Log in": "Entrar",
|
||||
"Log in to browse more streams": "Inicia sesión para exporar más canales",
|
||||
"Log out": "Salir",
|
||||
"Looking for our <z-integrations>integrations</z-integrations> or <z-api>API</z-api> documentation?": "",
|
||||
"Looking for our <z-integrations>integrations</z-integrations> or <z-api>API</z-api> documentation?": "¿Estás buscando a cerca de las <z-integrations>integraciones</z-integrations> o documentación de la<z-api>API</z-api>?",
|
||||
"MOVED": "MOVIDO",
|
||||
"Manage bot": "Administrar bot",
|
||||
"Manage streams": "Gestionar canales",
|
||||
@@ -644,7 +643,7 @@
|
||||
"Me": "Yo",
|
||||
"Member": "Miembro",
|
||||
"Members": "Miembros",
|
||||
"Mention a time-zone-aware time": "",
|
||||
"Mention a time-zone-aware time": "Mencionar un tiempo con zona horaria",
|
||||
"Mentioned in": "Mencionado en",
|
||||
"Mentions": "Menciones",
|
||||
"Menu": "Menú",
|
||||
@@ -663,8 +662,8 @@
|
||||
"Message {recipient_names}": "Enviar mensaje a {recipient_names}",
|
||||
"Message {recipient_name} ({recipient_status})": "Enviar mensaje a {recipient_name} ({recipient_status})",
|
||||
"Messages in all public streams": "Mensajes en todos los canales públicos",
|
||||
"Messages will not be automatically marked as read because this is not a conversation view. <z-link>Change setting</z-link>": "",
|
||||
"Messages will not be automatically marked as read. <z-link>Change setting</z-link>": "",
|
||||
"Messages will not be automatically marked as read because this is not a conversation view. <z-link>Change setting</z-link>": "Los mensajes no se marcarán como leídos porque esta no es una vista de conversación. <z-link>Cambiar configuración</z-link>",
|
||||
"Messages will not be automatically marked as read. <z-link>Change setting</z-link>": "Mensajes leídos no se marcarán automáticamente como leídos. <z-link>Cambiar configuración</z-link>",
|
||||
"Mobile": "Móvil",
|
||||
"Mobile message notifications": "Notificaciones de mensajes en móviles",
|
||||
"Mobile notifications": "Notificaciones móviles",
|
||||
@@ -672,14 +671,14 @@
|
||||
"Moderator": "Moderador",
|
||||
"Moderators": "Moderadores",
|
||||
"Monday": "Lunes",
|
||||
"Monday at {time}": "",
|
||||
"Move all messages in <strong>{topic_name}</strong>": "",
|
||||
"Monday at {time}": "Lunes a las {time}",
|
||||
"Move all messages in <strong>{topic_name}</strong>": "Mover todos los mensajes en <strong>{topic_name}</strong>",
|
||||
"Move all messages in this topic": "Mover todos los mensajes en este tema",
|
||||
"Move message": "Mover mensaje",
|
||||
"Move messages": "Mover mensajes",
|
||||
"Move messages or topic": "Mover mensajes o tema",
|
||||
"Move only this message": "Mover solo este mensaje",
|
||||
"Move some messages?": "",
|
||||
"Move some messages?": "¿Mover algunos mensajes?",
|
||||
"Move this and all following messages in this topic": "Mover este y todos los siguientes mensajes en este tema",
|
||||
"Move topic": "Mover tema",
|
||||
"Moved ({last_edit_timestr})": "Movido ({last_edit_timestr})",
|
||||
@@ -700,7 +699,7 @@
|
||||
"Narrow to all direct messages": "Filtrar todos los mensajes privados",
|
||||
"Narrow to all unmuted messages": "Filtrar a todos los mensajes no silenciados",
|
||||
"Narrow to current compose box recipient": "Filtrar al receptor del cuadro de redacción actual",
|
||||
"Narrow to direct messages that include <z-value></z-value>.": "",
|
||||
"Narrow to direct messages that include <z-value></z-value>.": "Reducir búsqueda a los mensajes directos que incluyan <z-value></z-value>.",
|
||||
"Narrow to direct messages with <z-value></z-value>.": "Filtrar todos los mensajes privados con <z-value></z-value>.",
|
||||
"Narrow to direct messages.": "Filtrar los mensajes privados.",
|
||||
"Narrow to just message ID <z-value></z-value>.": "Limitar únicamente a mensaje con ID <z-value></z-value>.",
|
||||
@@ -718,7 +717,7 @@
|
||||
"Narrow to next unread topic": "Filtrar al siguiente tema sin leer",
|
||||
"Narrow to starred messages.": "Filtrar solo mensajes destacados.",
|
||||
"Narrow to stream from topic view": "",
|
||||
"Narrow to topic or DM conversation": "",
|
||||
"Narrow to topic or DM conversation": "Reducir búsqueda a temas o mensajes directos",
|
||||
"Narrow to unread messages.": "Filtrar solo mensajes sin leer.",
|
||||
"Narrow to {message_recipient}": "Limitar a {message_recipient}",
|
||||
"Narrowing": "Filtrar",
|
||||
@@ -754,9 +753,9 @@
|
||||
"No matching users.": "No hay coincidencias de usuario.",
|
||||
"No one has read this message yet.": "Nadie ha leido este mensaje aún.",
|
||||
"No owner": "Sin dueño",
|
||||
"No playgrounds configured.": "",
|
||||
"No playgrounds configured.": "No hay playgrounds configurados",
|
||||
"No restrictions": "Sin restricciones",
|
||||
"No scheduled messages.": "",
|
||||
"No scheduled messages.": "No hay mensajes programados.",
|
||||
"No search results": "Sin resultados de búsqueda",
|
||||
"No search results.": "Sin resultados de búsqueda.",
|
||||
"No stream subscriptions.": "No hay subscripciones a canal.",
|
||||
@@ -792,14 +791,15 @@
|
||||
"One or more email addresses...": "Una o más direcciones de correo electrónico...",
|
||||
"One or more of these users do not exist!": "¡Uno o más de esos usuarios no existen!",
|
||||
"Only 2 custom profile fields can be displayed on the user card.": "Solamente 2 campos personalizados de perfil pueden ser mostrados en la tarjeta del usuario.",
|
||||
"Only group members can add users to a group.": "",
|
||||
"Only group members can add users to a group.": "Solo los miembros del grupo puede agregar usuarios a un grupo.",
|
||||
"Only in conversation views": "Solo en vistas de conversación",
|
||||
"Only organization administrators can edit these settings": "",
|
||||
"Only organization administrators can edit these settings": "Solo administradores de la organización pueden editar estas configuraciones",
|
||||
"Only organization administrators can edit these settings.": "Solo los administradores de la organización pueden editar estos ajustes.",
|
||||
"Only organization owners can edit these settings.": "Solo propietarios de la organización pueden editar estas opciones.",
|
||||
"Only organization owners may deactivate an organization.": "",
|
||||
"Only organization owners may deactivate an organization.": "Solo propietarios pueden desactivar una organización",
|
||||
"Only owners can change these settings.": "Solo los propietarios pueden cambiar esas configuraciones.",
|
||||
"Only stream members can add users to a private stream": "Solo miembros del canal pueden añadir usuarios al canal privado",
|
||||
"Only stream members can add users to a private stream.": "Solo miembros del canal pueden agregar usuarios a un canal privado.",
|
||||
"Only subscribers to this stream can edit stream permissions.": "Solo los subscriptores de este canal pueden editar los permisos del canal.",
|
||||
"Open": "Abrir",
|
||||
"Open message menu": "Abrir el menú de mensajes",
|
||||
@@ -809,7 +809,7 @@
|
||||
"Optional": "Opcional",
|
||||
"Organization": "Organización",
|
||||
"Organization administrators": "Administradores de la organización",
|
||||
"Organization administrators can change the announcement stream in the organization settings.": "",
|
||||
"Organization administrators can change the announcement stream in the organization settings.": "Los administradores de la organizacion pueden cambiar el anuncio de canales en las configuraciones de la organización.",
|
||||
"Organization administrators can reactivate deactivated users.": "Solo los administradores de la organización pueden reactivar usuarios desactivados.",
|
||||
"Organization description": "Descripción de la organización",
|
||||
"Organization logo": "Logo de organización",
|
||||
@@ -822,7 +822,7 @@
|
||||
"Organization profile picture": "Imagen de perfil de la organización",
|
||||
"Organization settings": "Ajustes de organización",
|
||||
"Organization type": "Tipo de organización",
|
||||
"Organization using {percent_used}% of {upload_quota}.": "",
|
||||
"Organization using {percent_used}% of {upload_quota}.": "La Organización está usando {percent_used}% de {upload_quota}.",
|
||||
"Other": "Otro",
|
||||
"Other emails": "Otros correos electrónicos",
|
||||
"Other permissions": "Otros permisos",
|
||||
@@ -875,7 +875,7 @@
|
||||
"Pronouns": "Pronombres",
|
||||
"Public": "Público",
|
||||
"Question": "Pregunta",
|
||||
"Quote and reply or forward": "Citar y responder o reenviar",
|
||||
"Quote and reply": "Citar y responder",
|
||||
"Quote and reply to message": "Citar y contestar mensaje",
|
||||
"Quoted original email (in replies)": "Citado en el email original (en las respuestas)",
|
||||
"React to selected message with": "Reaccionar al mensaje seleccionado con",
|
||||
@@ -894,9 +894,10 @@
|
||||
"Removed successfully.": "Removido satisfactoriamente.",
|
||||
"Rename topic": "",
|
||||
"Rename topic to:": "",
|
||||
"Reply @-mentioning sender": "",
|
||||
"Reply directly to sender": "",
|
||||
"Reply mentioning bot": "Responder mencionando el bot",
|
||||
"Reply mentioning user": "Contestar mencionando a este usuario",
|
||||
"Reply to author": "Responder al autor",
|
||||
"Reply to message": "Responder mensaje",
|
||||
"Reply to selected conversation": "",
|
||||
"Reply to selected message": "Responder al mensaje seleccionado",
|
||||
@@ -1062,9 +1063,11 @@
|
||||
"This is a <z-link>demo organization</z-link> and will be automatically deleted in {days_remaining} days.": "",
|
||||
"This is not a <z-link>publicly accessible</z-link> conversation.": "Esta no es una conversación <z-link>publicamente accesible</z-link>.",
|
||||
"This is what a Zulip notification looks like.": "Así es como se verá una notificación de Zulip",
|
||||
"This message could not be sent at the scheduled time.": "Este mensaje no puede ser enviado en la hora programada.",
|
||||
"This message is no longer scheduled for {deliver_at}.": "Este mensaje ya no está programado para {deliver_at}.",
|
||||
"This message was hidden because you have muted the sender.": "Este mensaje ha sido ocultado porque has silenciado al remitente.",
|
||||
"This organization is configured so that administrators and moderators can add custom emoji.": "",
|
||||
"This organization is configured so that administrators and moderators can modify user groups.": "",
|
||||
"This organization is configured so that administrators and moderators can add custom emoji.": "Esta organización está configurada para que los administradores y moderadores puedan agregar emojis personalizados.",
|
||||
"This organization is configured so that administrators and moderators can modify user groups.": "Esta organización está configurada para que los administradores y moderadores puedan modificar grupos de usuarios.",
|
||||
"This organization is configured so that administrators, moderators and full members belonging to the group can modify user groups.": "",
|
||||
"This organization is configured so that administrators, moderators and group members can modify user groups.": "",
|
||||
"This organization is configured so that admins and moderators can invite users to this organization.": "",
|
||||
@@ -1255,6 +1258,7 @@
|
||||
"Write": "Escribir",
|
||||
"Yes, please!": "¡Sí, por favor!",
|
||||
"Yes, save": "",
|
||||
"Yes, schedule": "",
|
||||
"Yes, send": "Sí, enviar",
|
||||
"Yesterday": "Ayer",
|
||||
"You": "Tú",
|
||||
@@ -1275,12 +1279,14 @@
|
||||
"You can also make <z-link>tables</z-link> with this <z-link>Markdown-ish table syntax</z-link>.": "",
|
||||
"You can combine search filters as needed.": "",
|
||||
"You can fully access this community and participate in conversations by creating a Zulip account in this organization.": "",
|
||||
"You can no longer save changes to this message.": "",
|
||||
"You can only view or manage invitations that you sent.": "",
|
||||
"You can reactivate deactivated users from <z-link>organization settings</z-link>.": "",
|
||||
"You can use email to send messages to Zulip streams.": "",
|
||||
"You cannot create a stream with no subscribers!": "¡No puedes crear un canal sin suscriptores!",
|
||||
"You cannot create a user group with no members!": "",
|
||||
"You cannot send messages to deactivated users.": "No puedes enviar mensajes a usuarios desactivados.",
|
||||
"You do not have permission to add other users to streams in this organization.": "",
|
||||
"You do not have permission to move some of the messages in this topic. Contact a moderator to move all messages.": "",
|
||||
"You do not have permission to post in this stream.": "",
|
||||
"You do not have permission to resolve topics with messages older than {N, plural, one {# day} other {# days}} in this organization.": "",
|
||||
@@ -1368,9 +1374,9 @@
|
||||
"{N, plural, one {Working… {N} message marked as unread so far.} other {Working… {N} messages marked as unread so far.}}": "{N, plural, one {} many {} other {}}",
|
||||
"{comma_separated_usernames} and {last_username} reacted with {emoji_name}": "",
|
||||
"{date} at {time}": "",
|
||||
"{days_old} days ago": "",
|
||||
"{full_name} is typing…": "",
|
||||
"{hours} hours ago": "",
|
||||
"{days_old} days ago": "hace {days_old} días",
|
||||
"{full_name} is typing…": "{full_name} está escribiendo…",
|
||||
"{hours} hours ago": "hace {hours} horas",
|
||||
"{items_selected} selected": "{items_selected} seleccionados",
|
||||
"{messages_not_allowed_to_move, plural, one {# message} other {# messages}} will remain in the current topic.": "{messages_not_allowed_to_move, plural, one {} many {} other {}} will remain in the current topic.",
|
||||
"{minutes} min to edit": "{minutes} min para editar",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user