Compare commits

..

437 Commits

Author SHA1 Message Date
Alex Vandiver
4174047f64 Release Zulip Server 7.2. 2023-07-05 19:57:28 +00:00
Alex Vandiver
adbee935f7 upload: Provide a default upload file name, rather than 500.
(cherry picked from commit e2847790b6)
2023-07-04 16:31:05 +00:00
Alex Vandiver
ebed224395 i18n: Update translation data from Transifex. 2023-07-03 20:40:46 +00:00
Alex Vandiver
738429cf77 middleware: Detect reverse proxy misconfigurations.
Combine nginx and Django middlware to stop putting misleading warnings
about `CSRF_TRUSTED_ORIGINS` when the issue is untrusted proxies.
This attempts to, in the error logs, diagnose and suggest next steps
to fix common proxy misconfigurations.

See also #24599 and zulip/docker-zulip#403.

(cherry picked from commit 8a77cca341)
2023-07-03 18:52:30 +00:00
Alex Vandiver
2f91471e98 zproject: Prevent having exactly 17/18 middlewares, for Python 3.11 bug.
Having exactly 17 or 18 middlewares, on Python 3.11.0 and above,
causes python to segfault when running tests with coverage; see
https://github.com/python/cpython/issues/106092

Work around this by adding one or two no-op middlewares if we would
hit those unlucky numbers.  We only add them in testing, since
coverage is a requirement to trigger it, and there is no reason to
burden production with additional wrapping.

(cherry picked from commit cf0b803d50)
2023-07-03 18:52:30 +00:00
Alex Vandiver
8f9807176e puppet: Remove loadbalancer configurations when they are unset.
(cherry picked from commit 671b708c4b)
2023-07-03 18:52:30 +00:00
Karl Stolley
217f5731fe stream_settings: Fix scroll at max-height.
Simplebar seems unaware of the `max-height: 1000px` on
`.subscriptions-container`, and therefore does not properly provide
a scrollbar when it's needed.

This commit adds a `max-height` to the stream Simplebar container,
ensuring that otherwise hidden content that Simplebar believes to
be visible can be scrolled to.

Finally, rather than rely on magic numbers or math done in comments,
this commit establishes CSS variables for all relevant modal-element
heights, doing the math inline using CSS calc().

Fixes #26107.

(cherry picked from commit 0c55fb7e89)
2023-07-03 18:51:58 +00:00
Karl Stolley
ca0fd7f797 bot_icon: Adjust bot-icon color for light and dark modes.
(cherry picked from commit a9bc5e94e7)
2023-07-03 18:51:37 +00:00
Alex Vandiver
da4c4f74f2 slack: Handle the special case of permissions denied on team.info call.
This is a follow-up to 4c8915c8e4, for
the case when the `team:read` permission is missing, which causes the
`team.info` call itself to fail.  The error message supplies
information about the provided and missing permissions -- but it also
still sends the `X-OAuth-Scopes` header which we normall read, so we can
use that as normal.

(cherry picked from commit 21aeb4a040)
2023-07-03 18:51:15 +00:00
Alex Vandiver
b2068222e0 pgroonga: Remove 'GRANT USAGE' statement again.
dc2726c814 removed these statements, but c8ec3dfcf6 accidentally
brought one back.  Remove it.

(cherry picked from commit f5540303ba)
2023-07-03 18:50:51 +00:00
Alex Vandiver
2dfc0463bd pgroonga: Run upgrade SQL when pgroonga package is updated.
Updating the pgroonga package is not sufficient to upgrade the
extension in PostgreSQL -- an `ALTER EXTENSION pgroonga UPDATE` must
explicitly be run[^1].  Failure to do so can lead to unexpected behavior,
including crashes of PostgreSQL.

Expand on the existing `pgroonga_setup.sql.applied` file, to track
which version of the PostgreSQL extension has been configured.  If the
file exists but is empty, we run `ALTER EXTENSION pgroonga UPDATE`
regardless -- if it is a no-op, it still succeeds with a `NOTICE`:

```
zulip=# ALTER EXTENSION pgroonga UPDATE;
NOTICE:  version "3.0.8" of extension "pgroonga" is already installed
ALTER EXTENSION
```

The simple `ALTER EXTENSION` is sufficient for the
backwards-compatible case[^1] -- which, for our usage, is every
upgrade since 0.9 -> 1.0.  Since version 1.0 was released in 2015,
before pgroonga support was added to Zulip in 2016, we can assume for
the moment that all pgroonga upgrades are backwards-compatible, and
not bother regenerating indexes.

Fixes: #25989.

[^1]: https://pgroonga.github.io/upgrade/

(cherry picked from commit c8ec3dfcf6)
2023-07-03 18:50:14 +00:00
Alex Vandiver
92c538c862 pgroonga: Remove now-unnecessary 'GRANT USAGE' statement.
This was only necessary for PGroonga 1.x, and the `pgroonga` schema
will most likely be removed at some point inthe future, which will
make this statement error out.

Drop the unnecessary statement.

(cherry picked from commit dc2726c814)
2023-07-03 18:50:14 +00:00
Lauryn Menard
2e03e1b6ee narrow: Mark as read in by_recipient based on case ("dm" or "stream").
In commit #25837, we added in a check for the user's mark as read
policy in the frontend for `by_topic` and `by_recipient` narrowing.
In that change, the assumption was that for both functions, it was
sufficient to check only for whether the user policy was to never
mark as read.

But because the `by_recipient` function may narrow to an interleaved
stream view, it is possible that message will be marked as read
when the user did not expect it to be (e.g. they marked all the
messages in a topic narrow as unread and then used the `S` key
shortcut to navigate back to the stream view) when they have
conversation views only as their mark as read  policy.

Here we move the check for the user's mark as read policy to be in
the two cases for `by_recipient` so that the mark as read behavior
here matches the user's setting.

(cherry picked from commit c5fbd3f085)
2023-07-03 18:49:31 +00:00
Daniil Fadeev
0ac81a1b77 compose_banner: Remove uploads banners when clearing compose box.
Upload banners were not cleared after closing compose box, which meant
that they would remain present in a paused state after compose was reopened.

https://chat.zulip.org/#narrow/stream/9-issues/topic/Incomplete.20Upload.20banner.20remains.20on.20closing.20compose/near/1582602
(cherry picked from commit daab1d4265)
2023-07-03 18:49:10 +00:00
Alex Vandiver
92e840efd1 puppet: Support IPv6 nameservers.
The syntax in `/etc/resolv.conf` does not include any brackets:
```
nameserver 2001:db8::a3
```

However, the format of the nginx `resolver` directive[^1] requires that
IPv6 addresses be enclosed in brackets.

Adjust the `resolver_ip` puppet function to surround any IPv6
addresses extracted from `/etc/resolv.conf` with square brackets, and
any addresses from `application_server.resolver` to gain brackets if
necessary.

Fixes: #26013.

[^1]: http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver

(cherry picked from commit 7ef05316d5)
2023-07-03 18:48:47 +00:00
Alex Vandiver
f1a8c402d1 convert_slack_data: Document "--token" more correctly.
(cherry picked from commit 38d1b3314a)
2023-07-03 18:48:08 +00:00
Alex Vandiver
8878fee6d6 slack: Provide more information when a Slack token fails to validate.
(cherry picked from commit 4c8915c8e4)
2023-07-03 18:48:08 +00:00
Alex Vandiver
783f3fac3b test_slack_importer: Switch to xoxb tokens, which is what we accept.
(cherry picked from commit 1b2ba4e09d)
2023-07-03 18:48:08 +00:00
Sahil Batra
5f397e5fa8 stream_settings: Fix height of select elements.
Previously, we used to have top and bottom paddings of 4px to
the select elements but it was removed in a208da9c4d to make
sure that text for the selected option is aligned properly.

All other select elements have height set to 30px, but the
select elements in stream settings page had height set to
"fit-content" and so they looked ugly after removing the
padding.

This commit sets the height of select elements in stream
settings to 30px.

(cherry picked from commit b119ff68c3)
2023-07-03 18:47:31 +00:00
Daniil Fadeev
8ff2684d61 compose: Fix keyboard indicator appearance in send shortcut.
(cherry picked from commit b13a85cdbf)
2023-07-03 18:46:41 +00:00
Daniil Fadeev
016f53711d compose: Fix keyboard indicator vertical alignment in send shortcut.
(cherry picked from commit 83b4fef060)
2023-07-03 18:46:41 +00:00
Alex Vandiver
e921c7dafe docs: Clarify that trust of X-Fowarded-Proto is also necessary.
Previously, `X-Forwarded-Proto` did not need to be set, and failure to
set `loadbalancer.ips` would merely result in bad IP-address
rate-limiting and incorrect access logs; after 0935d388f0, however,
failure to do either of those, if Zulip is deployed with `http_only`,
will lead to infinite redirect loops after login.  These are
accompanied by a misleading error, from Tornado, of:

    Forbidden (Origin checking failed - https://zulip.example.com does not match any trusted origins.): /json/events

This is most common with Docker deployments, where deployments use
another docker container, such as nginx or Traefik, to do SSL
termination.  See zulip/docker-zulip#403.

Update the documentation to reinforce that `loadbalancer.ips` also
controls trust of `X-Forwarded-Proto`, and that failure to set it will
cause the application to not function correctly.

(cherry picked from commit d46279c41e)
2023-07-03 18:45:54 +00:00
Alex Vandiver
9b950f9c6a send_email: Delete ScheduledEmail objects with no recipients.
9d97af6ebb addressed the one major source of inconsistent data which
would be solved by simply re-attempting the ScheduledEmail row.  Every
other instance that we have seen since then has been a corrupt or
modified database in some way, which does not self-resolve.  This
results in an endless stream of emails to the administrator, and no
forward progress.

Drop this to a warning, and make it remove the offending row.  This
ensures we make forward progress.

(cherry picked from commit 77c146b8b0)
2023-07-03 18:44:33 +00:00
Alex Vandiver
aab515feb9 version: Update version after 7.1 release. 2023-06-13 18:15:14 +00:00
Alex Vandiver
b178bb7c59 Release Zulip Server 7.1. 2023-06-13 17:59:16 +00:00
Alex Vandiver
8a783c448f i18n: Update translation data from Transifex. 2023-06-13 17:28:04 +00:00
Alya Abbott
f4f8d091a9 github: Configure templates for filing issues.
This PR creates templates for filing issues. The templates are
intentionally quite light-weight. Note that I'm specifically not using
forms for creating issues, as the UI for filling out such a form does
not include GitHub's helpful formatting buttons and preview mode.

Follow-up to #25998, pushed as a separate PR so that the original one can pass CI.

This PR creates templates for filing issues. The templates are
intentionally quite light-weight. Note that I'm specifically not using
forms for creating issues, as the UI for filling out such a form does
not include GitHub's helpful formatting buttons and preview mode.

A major goal is to guide users towards starting a CZO conversation
when that's more appropriate than filing a GitHub issue.

Note that the config makes it possible to create a blank issue, which
should be handy for:

* Issues filed by maintainers
* Issues for tracking follow-ups from merged PRs
* Probably some other situations

Because the blank issue option is easy to miss, it should probably be
documented somewhere, but I'm not sure where. We can perhaps start
with a note on CZO.

Relevant CZO threads:

https://chat.zulip.org/#narrow/stream/137-feedback/topic/issues.20link.20in.20description/near/1561110)
https://chat.zulip.org/#narrow/stream/2-general/topic/bug.20report.20management/near/1589141

Also provide external documentation links for situations where
filing an issue is not the best approach.

(cherry picked from commit 0adcc2a1df)
2023-06-13 11:48:50 -04:00
Alya Abbott
67157ec2b8 docs: Link to new guide on suggesting features and improvements.
(cherry picked from commit 03659004a9)
2023-06-13 11:48:50 -04:00
Alex Vandiver
4bf4c8a040 upgrade-postgresql: Only upgrade to a supported version.
(cherry picked from commit 875502b2e1)
2023-06-13 11:48:50 -04:00
Alex Vandiver
08a844153c docs: Document supported versions of PostgreSQL.
Fixes: #25853.
(cherry picked from commit f4b20337a7)
2023-06-13 11:48:50 -04:00
Alya Abbott
69e04c20f9 docs: Add a guide on suggesting features and improvements.
Similar to the guide on reporting bugs.

(cherry picked from commit 9ee5a5a70e)
2023-06-13 11:48:50 -04:00
Alya Abbott
ec8d341cae docs: Link to new "Reporting bugs" guide.
(cherry picked from commit 9258acce14)
2023-06-13 11:48:50 -04:00
Alya Abbott
3ee59df091 docs: Improve instructions for reporting bugs.
- Create a dedicated "Reporting bugs" page to learly document
where and how bugs should be reported.
- Drop "Reporting issues" section from the Contributing guide.
- Delete "Bug report guidelines" page.

(cherry picked from commit 052a109ba4)
2023-06-13 11:48:50 -04:00
Alex Vandiver
dd940d2eac puppet: Read resolver from /etc/resolv.conf.
04cf68b45e make nginx responsible for downloading (and caching)
files from S3.  As noted in that commit, nginx implements its own
non-blocking DNS resolver, since the base syscall is blocking, so
requires an explicit nameserver configuration.  That commit used
127.0.0.53, which is provided by systemd-resolved, as the resolver.

However, that service may not always be enabled and running, and may
in fact not even be installed (e.g. on Docker).  Switch to parsing
`/etc/resolv.conf` and using the first-provided nameserver.  In many
deployments, this will still be `127.0.0.53`, but for others it will
provide a working DNS server which is external to the host.

In the event that a server is misconfigured and has no resolvers in
`/etc/resolv.conf`, it will error out:
```console
Error: Evaluation Error: Error while evaluating a Function Call, No nameservers found in /etc/resolv.conf!  Configure one by setting application_server.nameserver in /etc/zulip/zulip.conf (file: /home/zulip/deployments/current/puppet/zulip/manifests/app_frontend_base.pp, line: 76, column: 70) on node example.zulipdev.org
```

(cherry picked from commit bd217ad31b)
2023-06-12 21:12:50 +00:00
Tim Abbott
e3f0c28528 docs: Improve troubleshooting overview intro.
(cherry picked from commit 6ca5130cd8)
2023-06-12 20:09:13 +00:00
Alya Abbott
b44ee89245 docs: Clarify instructions for getting help with self-hosting.
(cherry picked from commit 582e88544c)
2023-06-12 20:09:13 +00:00
Alex Vandiver
ee2654c4ee uploads: Allow access to the /download/ variant anonymously.
This was mistakenly left off of b799ec32b0.

(cherry picked from commit fbb831ff3b)
2023-06-12 20:05:46 +00:00
Alex Vandiver
c12f8de80b test_helpers: Switch add/remove_ratelimit to a contextmanager.
Failing to remove all of the rules which were added causes action at a
distance with other tests.  The two methods were also only used by
test code, making their existence in zerver.lib.rate_limiter clearly
misplaced.

This fixes one instance of a mis-balanced add/remove, which caused
tests to start failing if run non-parallel and one more anonymous
request was added within a rate-limit-enabled block.

(cherry picked from commit 0dbe111ab3)
2023-06-12 20:05:46 +00:00
Sahil Batra
94437ab5be user_groups: Prevent cycles when adding subgroups for a user group.
The user group depedency graph should always be a DAG.
This commit adds code to make sure we keep the graph DAG
while adding subgroups to a user group.

Fixes #25913.
2023-06-12 16:04:18 -04:00
Zixuan James Li
a9a30ad5b4 user_groups: Make system groups creation atomic.
We want to make sure that the system groups, once created, will always
have the GroupGroupMemberships fully set up.

Signed-off-by: Zixuan James Li <p359101898@gmail.com>
2023-06-12 16:04:18 -04:00
Alex Vandiver
e9f0ef4c15 docs: Clarify access to port 25 is needed for local email delivery. 2023-06-12 16:04:18 -04:00
Alex Vandiver
2e16e27265 ui_init: Fix typo in error data. 2023-06-12 16:04:18 -04:00
Karl Stolley
f5e2a2a38f popovers: Reorganize Tippy onShow logic for stream popover.
These changes appear to correct the keyboard-navigation repro
from #25907, and it makes it possible for users without the
permission to create streams to exit the streams modal by
hitting Esc.

This reorganizes logic within the Tippy `onShow` method to
ensure that nothing is set or called for those users without
stream-creation privileges.

These changes probably require broader testing to determine
whether the fix addresses only that specific reproducer, or
the broader problems #25907 addresses with malfunctioning
j, k, Esc, and Return keys (when Ctrl + Return to send is
enabled).

Fixes a part of #25907.
2023-06-12 16:04:18 -04:00
Alex Vandiver
5a177bff3a prod_settings_template: Document REALM_HOSTS configuration.
This was in docs/production/multiple-organizations.md, but not the
settings template.
2023-06-12 16:04:18 -04:00
Alex Vandiver
fabb5ffe94 upgrade-zulip: Verify postgresql.version against where data is stored.
This prevents installing a PostgreSQL server which matches
/etc/zulip/zulip.conf but which has no data and is not used by Django.
2023-06-12 16:04:18 -04:00
Alex Vandiver
5b4a673bbd upgrade-zulip: Set postgresql.version from running version, not a guess. 2023-06-12 16:04:18 -04:00
Alex Vandiver
afeb73e12a upgrade-zulip: Simplify PostgreSQL version check.
This is much simpler now that we do not support PostgreSQL 9.x.
2023-06-12 16:04:18 -04:00
Alex Vandiver
d5a39a6564 upgrade-postgresql: Prevent upgrades if /etc/zulip/zulip.conf is wrong.
If the `postgresql.version` in `/etc/zulip/zulip.conf` is out of date
or wrong, upgrading to the actual current version would drop your
production database without prompting.  While we do document taking a
Zulip backup (which includes a database backup) before running
`upgrade-postgresql`[^1], not everyone does so, with possibly
catastrophic consequences.

Do a true end-to-end check of the version in `/etc/zulip/zulip.conf`
by asking Django to query the database for its version, checking that
against the configured value, and aborting if there is any
disagreement.

[^1]: https://zulip.readthedocs.io/en/latest/production/upgrade.html#upgrading-postgresql
2023-06-12 16:04:18 -04:00
Alex Vandiver
a4b5ee41ea upgrade-postgresql: Prevent PostgreSQL downgrades. 2023-06-12 16:04:18 -04:00
Alex Vandiver
884a8d5628 upgrade-postgresql: Check for undefined variables. 2023-06-12 16:04:18 -04:00
Mateusz Mandera
8c9e521f57 migrations: Handle duplicate fk constraint in 0443.
It turns out that for some some deployments, there exists a second,
duplicate, foreign key constraint for user_profile_id. The logic below
would try to rename both to the same name, which would fail on the
second:

```
psycopg2.errors.DuplicateObject: constraint "zerver_userpresenceo_user_profile_id_d75366d6_fk_zerver_us" for relation "zerver_userpresence" already exists
```

Eliminate the duplicate constraint, rather than attempting to rename
it.  Also add a block, in case of future reuse of this pattern, which
caveats that this approach will not work in the presence of
explicitly-named indexes.  UserPresence happens to not have any, so
this technique is safe in this instance.

Co-authored-by: Alex Vandiver <alexmv@zulip.com>
2023-06-12 16:04:18 -04:00
Brijmohan Siyag
2f04875ad3 send_later: Wildcard mention throwing error on send later.
It was throwing error while schudiling a message having wildcard mention,
because the function `open_send_later_menu` was using param instance to track down
interval, but the parametere instance was not passed from when it was
called from warning banner action. This commit removes the instance
param as it is of no use, and uses a variable to track interval.
2023-06-12 16:04:18 -04:00
Anders Kaseorg
9dcf1944ad install: Check CPU and OS architecture.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-06-12 16:04:18 -04:00
Anders Kaseorg
6b895d1622 install: Add system_requirements_failure helper.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-06-12 16:04:18 -04:00
Mateusz Mandera
1a65e8a538 migrations: Fix bug in migration 0439.
This code clearly meant to return host and returning realm.host is a
mistake. realm.host is not accessible in a migration due to being a
@property-decorated method. The code constructs the host var value just
above this line.

(cherry picked from commit a55901aa67)
2023-06-05 16:33:22 +00:00
Tim Abbott
3240a513f1 version: Update version after 7.0 release. 2023-05-31 09:20:26 -07:00
Tim Abbott
b00ce1bad1 Release Zulip Server 7.0. 2023-05-31 08:48:02 -07:00
Tim Abbott
383bffb88b mailmap: Add entry for Brijmohan Siyag. 2023-05-31 08:48:02 -07:00
Tim Abbott
073ba23fae i18n: Update translation data from Transifex. 2023-05-31 08:36:53 -07:00
Lalit
abfaba0a42 mailmap: Add entry for Lalit Kumar Singh. 2023-05-31 08:19:05 -07:00
Alex Vandiver
9a6529f86a docs: Add language to code blocks. 2023-05-31 08:18:03 -07:00
Alex Vandiver
adb30c4d18 docs: Remove unused link references. 2023-05-31 08:18:03 -07:00
Alex Vandiver
8212dccc91 docs: Fix missing and typo'd link references. 2023-05-31 08:18:03 -07:00
Alex Vandiver
679591ccce docs: Document postgresql.missing_dictionaries. 2023-05-31 08:18:03 -07:00
Anders Kaseorg
5b07bf767b landing-page: Add Microsoft Store download link.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-31 08:16:59 -07:00
Lauryn Menard
bca7683f58 api-docs: Revisions for feature level 161 changes.
Revises the API changelog entry for feature level 161 to document
the changes to `DELETE /users/me/subscriptions` and to explain
more clearly what the new `can_remove_subscribers_group_id`
parameter does.

Updates the feature level 161 changes notes and related descriptions
to include links and also more clearly explain the updates.

Also, updates the `GET /user_groups` example to better reflect what
is returned for system groups since this is now referenced in the
`can_remove_subscribers_group_id` parameter description.

The original API feature level 161 API documentation changes were
made in commit c3759814be and commit 73f11853ec.
2023-05-31 08:16:22 -07:00
Lauryn Menard
b0b3230917 scheduled-messages: Update scheduled_message_id parameter for DELETE.
Updates the scheduled_message_id parameter for deleting scheduled
messages to use the to_non_negative_int converter function for
validation, which is used in other endpoints/views with an ID in
the request path.
2023-05-31 08:15:03 -07:00
Aman Agrawal
634a771a37 hotkey-hint: Fix text not middle aligned at different zoom levels.
* Remove `box-sizing` and `min-width` properties which have no
  effect on `inline` positioned element. Modified class selector to
  add `span` which reflects this while reading the CSS.

* Remove `2px` vertical padding and `line-height` which combined
  are fighting for space??
2023-05-31 00:23:57 -07:00
Tim Abbott
3c60e538f9 people: Downgrade late added user errors for spectators.
As noted in the comment, this condition is expected to happen for
spectator users.
2023-05-30 20:45:18 -04:00
rht
1c84f02f57 slack import: Convert threads to nicely named Zulip topics.
Fixes #9006.
2023-05-30 16:35:19 -07:00
Tim Abbott
ddd174af36 mailmap: Fix a few duplicates for 7.0 release credits. 2023-05-30 16:15:29 -07:00
Alya Abbott
660ccccf68 docs: Add section about mentioning others to commit discipline doc. 2023-05-30 14:55:09 -07:00
Karl Stolley
38c8c374d5 docs: Introduce headings on commit discipline. 2023-05-30 14:54:49 -07:00
Alex Vandiver
d058188fa8 docs: Update documentation for deploy hooks.
ecfb12404a updated how values were passed to hooks, but did not
update the documentation.
2023-05-30 14:52:01 -07:00
Alex Vandiver
9ca4574fae docs: Document zulip_notify deploy hook. 2023-05-30 14:52:01 -07:00
Aman Agrawal
a47d204ca0 stream_ui_updates: Only update UI if the stream is being edited.
If the stream settings is open but the stream which was
subscribed/unsubscribed wasn't open (say user unsubscribed
from a different tab), `$settings_button` would
be `undefined` here.
2023-05-30 14:50:24 -07:00
Alya Abbott
173e5389af help: Define "conversation" in /help/include/recent-conversations.md.
Also link to definition from /help/marking-mesages-as-read.
2023-05-30 13:01:52 -07:00
Aman Agrawal
086db7621c css: Use a variable to track bottom_whitespace height.
Since we want the same space in recent topics to display the
compose box without overlapping with any other topics, it makes
sense to use a common variable.
2023-05-30 12:41:08 -07:00
Aman Agrawal
839af9ed8d compose: Update max-height when compose banner is displayed.
Othwersie, compose banner will overlap with any breadcrumbs
we have below the last message when user is fully scrolled up
and compose is at max-height.
2023-05-30 12:41:08 -07:00
Aman Agrawal
7706d64530 resize: Extract method to get bottom whitespace.
Minor optimization to reduce left sidebar and right sidebar
calculation when we just want to update bottom whitespace height.
2023-05-30 12:41:08 -07:00
Aman Agrawal
0f4bccd107 recent_conversation: Make all topics visible with compose open.
Fixes #25751
2023-05-30 12:41:08 -07:00
Aman Agrawal
43b83588c9 recent_conversation: Move padding to filter buttons.
This removes it from being included in the max-height of the table.
2023-05-30 12:38:17 -07:00
Aman Agrawal
e2ac125a6d recent_conversation: Fix incorrect min-height dimension. 2023-05-30 12:36:40 -07:00
Karl Stolley
d720ce4b4e popovers: Register mobile compose tooltip on button container.
This ensures that the click event on the mobile `+` button for
showing the compose tooltip is registered on a different element
from the tooltip for showing the `C` shortcut menu.
2023-05-30 12:27:20 -07:00
Lauryn Menard
892c5f48f7 narrow: Mark as read when narrowing by_topic or by_recipient.
In commit a93598c22e, we removed, in `narrow.by_topic` and
`narrow_by_recipient`, calls to `unread_ops.notify_server_message_read`
because that would have marked messages as read for users who had
set their preference in the web-app to never mark messages as read.

We add those calls back now, but with a check for that user setting.
2023-05-30 12:26:36 -07:00
Alex Vandiver
f45a6a6d99 docs: Add missing link in Sentry deploy docs. 2023-05-30 11:25:43 -07:00
Alex Vandiver
54590e67f2 docs: Fix link to sentry deploy hook. 2023-05-30 11:25:43 -07:00
sbansal1999
2d6e6369f3 integrations: Add Linear webhook integration.
Fixes part of #23118.
2023-05-30 10:48:19 -07:00
Prakhar Pratyush
dcb163bbe3 user_topics: Update API documentation.
This commit adds the missing 'UNMUTED' visibility policy
to the documentation for 'api/get-events' and 'api/register-queue'.

It replaces INHERIT with NONE for a clearer name
in the 'api/update-user-topic' documentation.

Other smaller changes in wording to improve readability.
2023-05-30 10:46:05 -07:00
Lalit
56463ce921 ts: Convert internal_url.js to TypeScript. 2023-05-30 10:45:01 -07:00
David Rosa
0b19d5cd5e help: Document "Inbox view" mobile feature.
- Adds a new page under the "Reading messages" section documenting
the Inbox view on mobile.
- Adds Inbox, expand more, and expand less SVG mobile icons.
- Cross-links with "Recent conversations" and "All messages".
2023-05-30 10:40:41 -07:00
Karl Stolley
30b7da34e0 css: Size stream recipient box for small screens.
This allows the recipient box to take 100% of the available
horizontal space, up to 175px. The effect is that the
compose-box buttons are available to users at mobile scales
(viewports of 400px wide or less).
2023-05-30 10:39:25 -07:00
Anders Kaseorg
dc158b18f2 release-checklist: Purge unneeded beta branch.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-29 18:07:54 -07:00
Anders Kaseorg
e3e2691124 Update version following 7.0-beta3 release.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-29 17:14:15 -07:00
Tim Abbott
1af16642d9 Release Zulip Server 7.0-beta3. 2023-05-29 16:35:59 -07:00
Anders Kaseorg
3ca131743b CVE-2023-33186: Fix topic tooltip cross-site scripting vulnerability.
Commit 903dbda79b (#25370) introduced a
cross-site scripting vulnerability in the tooltips for the stream and
topic in the recipient bar.  An attacker who can send messages could
maliciously craft a topic for the message, such that a victim who
hovers the tooltip for that topic in their message feed triggers
execution of JavaScript code controlled by the attacker.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-29 16:35:49 -07:00
Tim Abbott
5f7727888c docs: Fix changelog link to preferred markdown style. 2023-05-29 16:35:19 -07:00
Tim Abbott
00accdc86b docs: Update changelog for changes since 7.0-beta2. 2023-05-29 16:27:29 -07:00
Tim Abbott
5e7d61464d puppet: Include trusted-proto definition in zulip_ops configurations.
This should have been part of
0935d388f0.
2023-05-29 15:13:45 -07:00
Sahil Batra
a143d6b62c message_edit: Add period to error message raised due to time limit. 2023-05-29 14:49:32 -07:00
Sahil Batra
200d43d4cd alerts: Fix vertical alignment of "x" button.
This commit fixes the vertical alignment of "x" button in the
alert to be more closer to the center. We can still improve it
by probably using something like flexbox layout instead of
hard coding paddings or margins.
2023-05-29 14:49:32 -07:00
Sahil Batra
7f4f905ec8 message: Show error while resolving/unresolving topic.
We were not showing the error, if any, when resolving and
unresolving the topic using topic popover in left sidebar
or using the banner in compose box. This commit adds code
to show the error in the message feed where we show other
errors like connection error, etc.
2023-05-29 14:49:32 -07:00
Alya Abbott
457ff73082 help: Update suggested review sites on Support the Zulip project page. 2023-05-29 14:41:41 -07:00
Anders Kaseorg
6ca8e853df requirements: Switch to released coverage fix.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-29 14:41:20 -07:00
Zixuan James Li
7a5d3e164e linkifier: Remove unused debug message.
This is a follow-up to #23125.

Signed-off-by: Zixuan James Li <p359101898@gmail.com>
2023-05-29 14:40:55 -07:00
Tim Abbott
e26f9180c1 docs: Remove a duplicate changelog line.
This same line appears near the end of the 7.0 list.
2023-05-29 12:25:47 -07:00
Karl Stolley
4bfbec48dd docs: Clarify where labels are noted.
This will prevent curious readers from scrolling in search of a list
of labels below (as I did initially).
2023-05-29 11:21:51 -07:00
Karl Stolley
a164173acf docs: Close up instances of 'codebase'. 2023-05-29 11:21:51 -07:00
Tim Abbott
10d679d41d i18n: Update translation data from Transifex. 2023-05-29 11:16:46 -07:00
Satyam Bansal
caf6506811 integrations: Simplify regex checks in GitHub Integration.
The regex check is replaced with a simpler "startswith" function.
2023-05-29 10:55:31 -07:00
Tim Abbott
dce4a3c98e markdown: Remove most of Twitter integration.
Twitter removed their v1 API. We take care to keep the existing cached
results around for now, and to not poison that cache, since we might
be able replace this with something that can still use the existing
cache.
2023-05-29 10:43:35 -07:00
Aman Agrawal
ecc1433d02 compose_recipient: Improve post recipient selection behaviour.
This moves selection of the correct input box / textarea to
a `on_hidden_callback` of dropdown widget, which also allows us
to just simplify `on_compose_select_recipient_update` to only
call `switch_message_type` when necessary so that it doesn't
interfere with setting focus.
2023-05-29 08:59:18 -07:00
Aman Agrawal
f3aeabaeec dropdown_widget: Add a on_hidden_callback. 2023-05-29 08:59:18 -07:00
Aman Agrawal
51a7c94b9c compose_recipient: Extract update_recipient_label. 2023-05-29 08:59:18 -07:00
Aman Agrawal
230b3f075b scroll_bar: Fix overlapping right sidebar and browser scrollbars.
Fixes #25779

We move the simplebar scroll on the right sidebar to a little left
when there is an overlay scrollbar present so that user can drag
either of them.
2023-05-29 08:50:06 -07:00
Sahil Batra
4724d45abd settings: Rename "Full name" label to "Name" in bot modals.
This commit renames "Full name" label to "Name" in bot creation
and bot edit modal.
2023-05-29 08:47:09 -07:00
Alya Abbott
3ca20e3ea8 help: Document quick way to check Zulip version.
Version number was added to top section of gear menu in
4df8c6610f.

Version number was added to "About Zulip" in
668b5137b0.
2023-05-29 08:39:01 -07:00
Aman Agrawal
ea9992d853 overlays: Use close_overlay to close overlays!
It is unusal to use a hack to close overlays when there is a method
to do it.

This fixes a bug where user is unable to scroll message feed
after opening an overlay and then using browser back button.

This could have easily cause other bugs too.
2023-05-29 08:29:47 -07:00
Aman Agrawal
db26f2b2fc resize: Use autosize on window resize.
This fixes a bug where reducing the height of the window, reduces
the size of textarea and doesn't instroduce scrollbars, making
the textarea not scrollable.
2023-05-29 08:12:34 -07:00
Aman Agrawal
9c2ffaf1b3 message_list_view: Fix incorrect comparison.
`this` is MessageListView here while `message_lists.current` is
MessageList.
2023-05-29 08:06:00 -07:00
Aman Agrawal
a1ba41ce66 message_list_view: Discard unused variable. 2023-05-29 08:06:00 -07:00
Tim Abbott
1f8b3fd09a css: Fix fluid_layout_width setting.
0457f6807c seems to have accidentally
inverted the setting; we also clean up duplicate declarations of this
1400px value.
2023-05-28 22:06:16 -07:00
Alya Abbott
c97deb6be2 help: Tweak docs on keyboard shortcuts for composing messages.
- Adjust the order in keyboard shortucts help menu and help center.
- Make minor wording improvements.
2023-05-28 19:18:34 -07:00
Mateusz Mandera
db7a7d589c actions: Handle cross-realm messages in do_scrub_realm.
This is necessary to properly scrub all data from the realm.
2023-05-28 15:24:31 -07:00
Palash Baderia
f46f557109 tippy: Add delay for recipient bar icons.
This commit adds a long hover delay [750,20] to recipient bar icons.
Doing this prevents the situation when the tippy tooltips are left
floating when the icons suddenly disappear as you enter the topics
according to the organization settings and the references are removed.
Adding an additional delay ensures that the icons disappear and then
the tooltips appear.
2023-05-28 15:22:07 -07:00
Karl Stolley
e54f920549 alert_box: Maintain alert-box position despite scrolling.
Fixes #25791.
2023-05-28 15:21:00 -07:00
Aman Agrawal
8654f839b5 overlays: Stop document from occupying the extra scrollbar width.
When overlay / modal is displayed, scrollbar is hidden due to
the disabled scrolling on `html`. Reduce width of fixed elements
that will be visible in background and `html` so that they don't
occupy that extra space.

Also, I was over-thinking how we can get the scrollbar width. The
moment we allowed scrolling on `html`, it was easy to get the
scrollbar width.
2023-05-28 15:20:20 -07:00
Aman Agrawal
0457f6807c scroll_bar: Use a CSS class to toggle fluid layout. 2023-05-28 15:16:08 -07:00
Aman Agrawal
d03e72bc0e message_viewport: Rename message_pane variable. 2023-05-28 15:16:08 -07:00
Aman Agrawal
46a4964633 message_list_view: Minor optimization. 2023-05-28 15:16:08 -07:00
Aman Agrawal
2c8a5ac751 message_list_view: Only update scroll position for current msg list. 2023-05-28 15:16:08 -07:00
David Rosa
299d13646e help: Tweak wording for inserting a link via Markdown. 2023-05-28 15:08:49 -07:00
David Rosa
122bd3fcc1 help: Add mobile instructions to "Share and upload files".
- Documents uploading files via compose box buttons.
- Documents sharing files from other Android apps.
2023-05-28 15:08:49 -07:00
David Rosa
d89933b885 help: Update "Share and upload files" article.
- Adds via-markdown instructions block.
- Adds via-compose-box-buttons instructions block.
- Documents option to select multiple files.
- Adds named image file example section.
2023-05-28 15:08:49 -07:00
Karl Stolley
052e6655b5 css: Remove superflous background color on date row.
This fix prevents the active-message outline from being obscured
under certain conditions, such as when setting a browser to zoom
out at 90% or less.

Suggested-by: Anders Kaseorg <anders@zulip.com>
2023-05-28 15:08:05 -07:00
Aman Agrawal
067ce35fb1 popovers: Use fixed position for all popovers.
I manually verified that they were working correctly.
2023-05-27 08:04:45 -07:00
Aman Agrawal
6a5cfd2c05 popovers: Fix popovers not being hidden on scrolling. 2023-05-27 08:04:45 -07:00
Anders Kaseorg
66501a8eae requirements: Upgrade Python requirements.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-26 22:09:18 -07:00
Anders Kaseorg
9797de52a0 ruff: Fix RUF010 Use conversion in f-string.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-26 22:09:18 -07:00
Lauryn Menard
0c09a4fffe scheduled-messages: Add API documentation for new endpoint.
Part of splitting creating and editing scheduled messages.
Final commit. Should be merged with previous commits in series.

Updates the API documentation for the new endpoint for editing
scheduled messages.
2023-05-26 18:05:55 -07:00
Lauryn Menard
957382253a scheduled-messages: Split out edit scheduled message endpoint.
Part of splitting creating and editing scheduled messages.
Should be merged with final commit in series. Breaks tests.

Splits out editing an existing scheduled message into a new
view function and updated `edit_scheduled_message` function.
2023-05-26 18:05:55 -07:00
Lauryn Menard
154af5bb6b scheduled-messages: Remove ID from create scheduled message.
Part of splitting creating and editing scheduled messages.
Should be merged with final commit in series. Breaks tests.

Removes `scheduled_message_id` parameter from the create scheduled
message path.
2023-05-26 18:05:55 -07:00
Lauryn Menard
7af5ceb1c5 scheduled-messages: Add direct scheduled message to populate_db.
Prep commit for splitting create/edit endpoint for scheduled
messages.

Because of `test-api` runs the tests in alphabetical order based on
the `operationId`, we need two scheduled messages in the test database.
The first for the curl example delete (delete-scheduled-message) and
the second for the curl example update (update-scheduled-message).
2023-05-26 18:05:55 -07:00
Aman Agrawal
61f7ede43c hashchange: Never set empty hash # in URL.
Setting empty hash `#` scrolls user to the top of message feed if
done via `window.location.hash` or using browser back / forward button.

To avoid this, we set don't set `hash` after org URL for default view
when user uses `escape` key or clicks on org logo.

In other situations, we explicitly set the hash of the view.
2023-05-26 16:28:45 -07:00
Lauryn Menard
2f196bff19 api-docs: Add when moving messages fields/parameters were added.
Adds API changelog feature level 1 and associated Changes notes
for when the `stream_id` parameter in the `PATCH /messages/message_id`
was added, and for when the `prev_stream` field was added to edit
history information for messages.

We're adding these to the Zulip 3.0 feature level 1 because
commit 843345dfee that introduced this field and this parameter
to the server / backend code was merged before the commit that added
the API feature level tracking, commit e3b90a5ec8, at level 1.
2023-05-26 11:57:08 -07:00
Lauryn Menard
0d1b7f0d6e api-changelog: Clarify feature level 118 entry about prev_stream.
Clarifies that the `prev_stream` field was in the message edit
history prior to these changes.
2023-05-26 11:57:08 -07:00
Lauryn Menard
bb735460e5 api-docs: Update avatar_url descriptions for feature level 163 change.
Updates the descriptions of the `avatar_url` field in message and
user objects to be clear that the current user must have access
to the other user's real email address in order for the value to
ever be `null`.

Also adds a bullet point to the API changelog feature level 163
entry about this change.
2023-05-26 11:51:05 -07:00
Lauryn Menard
389e45625a api-docs: Clarify if "email" is the "Zulip API email".
Clarifies additional areas of the API documentation where a user's
email is mentioned / used where it could be useful to clarify
that the email in question is the "Zulip API email".
2023-05-26 11:51:05 -07:00
Lauryn Menard
8c7e18fd75 api-docs: Use reference link in /register-queue main description. 2023-05-26 11:51:05 -07:00
Lauryn Menard
ee58910f1a api-docs: Update /get-own-user to consistently use "requesting user". 2023-05-26 11:51:05 -07:00
Lauryn Menard
7a4565e833 api-changelog: Update feature level 163 entry and changes notes.
Original commits for this feature level's changes were part
of #22994.
2023-05-26 11:51:05 -07:00
Lauryn Menard
526fd7f24b api-docs: Add "delivery_email" field to example responses. 2023-05-26 11:51:05 -07:00
Lauryn Menard
58a64b33c9 api-docs: Revise main description for /get-user-by-email endpoint. 2023-05-26 11:51:05 -07:00
Lauryn Menard
87e9482672 api-docs: Update "Zulip display email" to "Zulip API email".
In some instances, the email was not clearly defined as
Zulip display email, but the Zulip API email is what is being
returned.
2023-05-26 11:51:05 -07:00
Josh Yap
6b77499286 settings: Link to user card in new stream/group tables.
When creating new streams or groups, open up user card when
a user's name is clicked on. This behavior now matches
other settings tables elsewhere.

Fixes #25725.
2023-05-26 09:55:01 -07:00
Aman Agrawal
a55c1ab2da server_events_dispatch: Remove body fade out on changing theme.
This causes the app to scroll to top and causes slow paint.
2023-05-26 09:40:24 -07:00
Anders Kaseorg
03a0a7abc6 shared: Avoid replaceAll again.
The JavaScript engine used by zulip-mobile on Android is still some
four years out of date, apparently.

This reverts commit a3d6c47b7d (#25734)
and part of commit 54f90e41c0 (#25554).

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-25 22:39:12 -07:00
Tim Abbott
c95773118e CONTRIBUTING: Add links to new review process guide.
These links could not be merged without breaking CI in the previous
commits.
2023-05-25 18:10:22 -07:00
Alya Abbott
f9649d1f45 portico: Replace "GChat" with "Google Chat" on case study. 2023-05-25 17:50:31 -07:00
Karl Stolley
199567228a unread_marker: Style as subtle linear gradient. 2023-05-25 17:43:38 -07:00
Lalit
38dd1de5b2 ts: Convert compose_textarea.js to TypeScript.
Added type definitions for `jquery-caret-plugin` third party package and
converted `compose_textarea.js` to TypeScript.
2023-05-25 17:33:18 -07:00
Sahil Batra
48e99657ad events: Remove realm_community_topic_editing_limit_seconds.
This commit removes realm_community_topic_editing_limit_seconds
field from register response since topic edit limit is now
controlled by move_messages_within_streams_limit_seconds
setting.
We also remove DEFAULT_COMMUNITY_TOPIC_EDITING_LIMIT_SECONDS
constant since it is no longer used.
2023-05-25 17:26:21 -07:00
evykassirer
932bbac04c drafts: Darken background in drafts and scheduled message overlays. 2023-05-25 17:22:23 -07:00
Karl Stolley
060c95dda6 compose_box: Explicitly set topic bar text color. 2023-05-25 17:19:29 -07:00
Karl Stolley
42e0d72b67 compose_box: Maintain consistent dropdown height.
This commit keeps the height of the dropdown consistent, even when
it's adjacent a multiline collection of pills in a group DM.

It also keeps the righthand buttons and narrows top-aligned, too.

Additional markup and CSS ensures that the < marker always stays
vertically centered with respect to the dropdown.
2023-05-25 17:19:29 -07:00
Karl Stolley
4df04f1032 compose_box: Correct topic input-box height.
While this commit achieves what the subject advertises (fixing the
input box's height to match the recipient drop-down), but it does
so by relying heavily on flexbox's behavior to manage the height
of the elements and vertical centering, where necessary, rather
than positioning hacks or vertical padding.

This commit also removes some additional styles that do not make
sense (e.g., `min-width: 0`) or that need not be set.
2023-05-25 17:19:29 -07:00
Anders Kaseorg
13d92acdb3 run-dev: Clarify magic number for errno.EADDRINUSE.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-25 15:49:06 -07:00
Alya Abbott
fc0f73c1db docs: Link to new PR review process doc from /contributing/reviewable-prs.md. 2023-05-25 13:16:56 -07:00
Alya Abbott
1456691d56 docs: Link to new PR review process doc from /contributing/code-reviewing.md.
Also drop redundant points in "Asking for a code review" section.
2023-05-25 13:16:56 -07:00
Alya Abbott
afc016c0f0 docs: Add a page documenting review process for pull requests.
- Move the "Submitting a pull request" and "Stages of a pull
request" sections of the contributing guide to a dedicated page.
- Add more detail.
2023-05-25 13:16:56 -07:00
Lauryn Menard
f079dec525 api-changelog: Revise feature level 160 entry.
Original API feature level entry from commit ff89590558.
2023-05-25 12:05:04 -07:00
Lauryn Menard
2c606ed99e api-changelog: Revise feature level 164 entry.
Original API feature level 164 entry from commit a593089770.
2023-05-25 12:04:29 -07:00
Lauryn Menard
e41c235657 api-docs: Link client_capabilities parameter in property descriptions.
In the register response properties deprecated at feature level 89,
update the descriptions to link to the client_capabilities parameter
when referenced.

Also, moves the enter_send property to be in the same section of the
register response as other properties deprecated at this feature level.

These descriptions were originally added to these properties in
commit e6f828a8e2.
2023-05-25 12:04:03 -07:00
Satyam Bansal
856329bb45 message_formatting: Reorder items to prioritize more useful ones.
Fixes #25743.
2023-05-25 12:01:36 -07:00
Satyam Bansal
07a6a85cf8 message_formatting: Remove line from emoji formatting tip. 2023-05-24 16:47:52 -07:00
Satyam Bansal
0e1b0939f5 message_formatting: Add a row for "---" in message formatting tips. 2023-05-24 16:47:52 -07:00
Daniil Fadeev
dc81858829 popovers: Export tippy_no_propagation function and rename it.
This commit will enable us to use the API we developed for Tippy
popovers, allowing us to integrate them into any external modules
that require a Tippy popover.
2023-05-24 16:24:09 -07:00
Aman Agrawal
54fae321aa tooltips: Fix offscreen tooltips taking scroll space. 2023-05-24 15:43:19 -07:00
Aman Agrawal
95f8b3a618 hashchange: Disable scroll position restoration.
This avoids a bug where during a browser initiated hashchange
(via back/forward/manually typed URL) browser sets the scroll
position of the current hash based on its memory of the scroll
position of the new hash.
2023-05-24 15:43:19 -07:00
Aman Agrawal
77f2562cbb popovers: Use fixed position for all bootstrap popovers.
`absolute` position elements in message feed can go
offscreen since `html` is now scrollable.
2023-05-24 15:43:19 -07:00
Aman Agrawal
26c63abe18 overlays: Don't scroll background when modal/overlay is open. 2023-05-24 15:43:19 -07:00
Aman Agrawal
dc04b0e171 navbar_alerts: Adjust app based on navbar height. 2023-05-24 15:43:19 -07:00
Aman Agrawal
a78dc4a2bd css: Scroll on html instead of .app. 2023-05-24 15:43:19 -07:00
Satyam Bansal
cae02dbca4 integrations: Ignore merge queue push events for GitHub Integration.
Previosuly, the server would send a 500 whenever a merge queue push
event was encountered.

Fixes #25629.
2023-05-24 15:33:50 -07:00
Daniil Fadeev
3e2d5b3c86 compose_validate: Use correct stream_id value for different context.
This commit addresses the issue of relying on `compose_state` for
retrieving the `stream_id` to display warning banners. Previously,
warnings were shown for syntax in the message edit box based on
whether that syntax would trigger a warning for the draft content (if
any) currently in the compose box.

We fix this by using a new `get_stream_id_for_textarea` function to
obtain the correct `stream_id` value for the check being done.

Fixes: #25410.
2023-05-24 12:48:44 -07:00
Daniil Fadeev
807b9ae081 compose_validate: Extract the logic of getting stream_id. 2023-05-24 12:48:44 -07:00
Alya Abbott
084331010c help: Update /help/edit-or-delete-a-message for clarity and consistency. 2023-05-24 12:40:18 -07:00
David Rosa
9ee584f206 help: Document "Delete message" mobile feature. 2023-05-24 12:40:18 -07:00
David Rosa
7551d96e1c help: Add instructions block to "Delete a message" on Desktop/Web. 2023-05-24 12:40:18 -07:00
David Rosa
84fb9ab817 help: Document "Edit message" mobile feature. 2023-05-24 12:40:18 -07:00
Karl Stolley
30782f7aa4 docs: Remove zid reference.
@timabbott note that it's been years since this has posed any problems:
https://github.com/zulip/zulip/pull/25733#discussion_r1203144805
2023-05-24 12:31:11 -07:00
Karl Stolley
04656bf16f docs: Provide an example of dynamic styling. 2023-05-24 12:31:11 -07:00
Karl Stolley
ee7b6f476d docs: Add testing example and supporting links. 2023-05-24 12:31:11 -07:00
Karl Stolley
fe1b7a9bb3 docs: Integrate HTML and CSS style with subsystem doc. 2023-05-24 12:31:11 -07:00
Karl Stolley
735618b9db docs: Restructure CSS introduction.
This better presents the CSS organization for readers, and also
removes a stale reference and link to Bootstrap.

Because postcss-nesting's spec-aligned syntax has tripped up some
contributors, the mention of PostCSS now includes a link to the
postcss-nesting README and the CSS Nesting spec from the W3C, which
PostCSS Nesting attempts to adhere to.
2023-05-24 12:31:11 -07:00
Karl Stolley
3fd621b608 docs: Correct stale Chrome and Handlebars links. 2023-05-24 12:31:11 -07:00
Karl Stolley
3443e1d479 docs: Make surface edits to dangerous constructs. 2023-05-24 12:31:11 -07:00
Karl Stolley
bb78c21fda docs: Rewrite and update JavaScript guidance. 2023-05-24 12:31:11 -07:00
Karl Stolley
5ff853fa71 docs: Update Python guidance in code style. 2023-05-24 12:31:11 -07:00
Karl Stolley
72b16e2fe7 docs: Edit and tighten opening sections. 2023-05-24 12:31:11 -07:00
Karl Stolley
761ae28551 docs: Rewrite and restructure introduction to code style. 2023-05-24 12:31:11 -07:00
Karl Stolley
827dd22fe1 docs: Restructure and rewrite style and conventions headings. 2023-05-24 12:31:11 -07:00
Karl Stolley
c7c9322651 docs: Reorganize code style and conventions doc.
This commit represents an in-place reordering of the document. No
headings or content has been changed (that will happen in subsequent
commits).

The goal is to open the document with generic advice and guidance
applicable to all Zulip developers across all languages:

1. Consistency, enforced by linters and automated tests, opens the
   document.
2. General, largely language-neutral advice about line length,
   third-party code, translation, paths, and secrets come next.
3. Next up is language-specific advice and conventions: Python,
   followed by JavaScript and TypeScript, followed by HTML and CSS
   (although the HTML and CSS will be moved in a subsequent commit
   to their own file).
4. Closing the file, rather than opening it, is the section on
   Dangerous constructs. Some of these are fairly specialized, so
   it makes sense not to ask readers to read through them before
   presenting, say, our philosophy on line length.

Finally, in trying to come up with a sensible order for all sections
of this document, the "More arbitrary style things" heading has been
removed.
2023-05-24 12:31:11 -07:00
Hardik Dharmani
72e628ffdf edit_bot: Include current bot owner to bot owner dropdown. 2023-05-24 12:11:52 -07:00
Satyam Bansal
d221cb92c6 stream_settings: Remove unused parameters after migration to tippy. 2023-05-24 12:11:10 -07:00
Satyam Bansal
920a5eac1a stream_settings: Migrate popovers to tippy.
Fixes #25627.
2023-05-24 12:11:10 -07:00
Satyam Bansal
094c3da965 stream_settings: Fix disabled subscribe button tooltip.
Previously, hovering over the disabled subscribe button
would not display any tooltip due to an undefined object
being passed to the function that created the tooltip.
2023-05-24 12:11:10 -07:00
Lauryn Menard
1beebb9fa1 api-changelog: Update feature level 168 entry and changes notes.
Original API changelog entry from commit ae72777c77.
2023-05-24 11:38:00 -07:00
sbansal1999
7c68a30363 billing-helpers: Add commas to formatted amount. 2023-05-24 11:32:24 -07:00
Aman Agrawal
263ee4cb86 feedback_widget: Don't use non-optimal animation properties.
Animating `box-shadow` and `top` is slow since the browser
drops frames when animating them. We can fix it by using `will-change`
property but it is just better to not animate them and instead
use transform.
2023-05-24 11:30:55 -07:00
Anders Kaseorg
a3d6c47b7d internal_url: Remove obsolete TODO comment.
zulip-mobile currently requires Android ≥ 7 and iOS ≥ 14, both of
which support replaceAll.  The code change was in commit
54f90e41c0 (#25554).

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-24 11:26:56 -07:00
evykassirer
47c107faa5 modals: Fix background color bug from background color changes. 2023-05-23 21:40:11 -07:00
Satyam Bansal
b3196e5310 settings: Close date-picker when settings modal is closed.
Previously, if the user closes the settings modal by pressing
the "Esc" key and if any date-pickers were open then they would
remain on the screen. This commit fixes that and now date-pickers
are closed when the settings modal is closed.

Also added a puppeteer test to verify the said behavior.

Fixes part of #25097.
2023-05-23 17:01:00 -07:00
Satyam Bansal
557d80965c flatpickr: Add close_all function to close all the opened date pickers. 2023-05-23 17:01:00 -07:00
evykassirer
c486588360 search: Make search box bottom border visible again.
The nav bar's bottom border was being hidden by the search
bar. This makes the search bar slightly less high to fix this
issue.

Soon this code will be replaced with the changes in #24345.
2023-05-23 14:46:44 -07:00
Anders Kaseorg
fea0ae1a2b requirements: Switch to released jsx-lexer fix (same code).
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-23 13:47:36 -07:00
Mateusz Mandera
45e3626bd2 saml: Clean up additional session vars if authentication fails.
This doesn't have any obvious security implications right now, but
nonetheless such information is not meant to stick around in the session
if authentication didn't succeed and not cleaning up would be a bug.
2023-05-23 13:01:15 -07:00
Mateusz Mandera
c9fb55dd20 saml: Improve the comments about the SAMLDocument processing logic. 2023-05-23 13:01:15 -07:00
Mateusz Mandera
22cd8a28d2 docs: Mention SAML SLO support at /help/saml-authentication. 2023-05-23 13:01:15 -07:00
Mateusz Mandera
dcbcb05655 saml: Make SP-initiated SLO work after signup. 2023-05-23 13:01:15 -07:00
Mateusz Mandera
04f5358a76 tests: Flush session in verify_desktop_flow_end_page in social auth.
As the relevant comment elaborates - what happens next in the test in
simulating the step that happens in the desktop app. Thus a new session
needs to be used. Otherwise, the old session created normally in the
browser pollutes the state and can give falsely passing tests.

This should be happening for all social auth tests using this, not just
in that one SAML test, thus moving it inside the helper method.
2023-05-23 13:01:15 -07:00
Mateusz Mandera
8fb0fe96c6 saml: Save SessionIndex in session and use when making a LogoutRequest.
This is a useful improvement in general for making correct
LogoutRequests to Idps and a necessary one to make SP-initiated logout
fully work properly in the desktop application. During desktop auth
flow, the user goes through the browser, where they log in through their
IdP. This gives them a logged in  browser session at the IdP. However,
SAML SP-initiated logout is fully conducted within the desktop
application. This means that proper information needs to be given to the
the IdP in the LogoutRequest to let it associate the LogoutRequest with
that logged in session that was established in the browser. SessionIndex
is exactly the tool for that in the SAML spec.
2023-05-23 13:01:15 -07:00
Mateusz Mandera
5dd4dcdebb saml: Make SP-initiated SLO work in the desktop application. 2023-05-23 13:01:15 -07:00
Mateusz Mandera
3f55c10685 saml: Rework SP-initiated logout config to support IdP-level config.
This gives more flexibility on a server with multiple organizations and
SAML IdPs. Such a server can have some organizations handled by IdPs
with SLO set up, and some without it set up. In such a scenario, having
a generic True/False server-wide setting is insufficient and instead
being able to specify the IdPs/orgs for SLO is needed.
2023-05-23 13:01:15 -07:00
Mateusz Mandera
e8f3b87b17 saml: Sign LogoutRequests and LogoutResponses if certs are set up. 2023-05-23 13:01:15 -07:00
Mateusz Mandera
0bb0220ebb saml: Implement SP-initiated Logout.
Closes #20084

This is the flow that this implements:
1. A logged-in user clicks "Logout".
2. If they didn't auth via SAML, just do normal logout. Otherwise:
3. Form a LogoutRequest and redirect the user to
https://idp.example.com/slo-endpoint?SAMLRequest=<LogoutRequest here>
4. The IdP validates the LogoutRequest, terminates its own user session
and redirects the user to
https://thezuliporg.example.com/complete/saml/?SAMLRequest=<LogoutResponse>
with the appropriate LogoutResponse. In case of failure, the
LogoutResponse is expected to express that.
5. Zulip validates the LogoutResponse and if the response is a success
response, it executes the regular Zulip logout and the full flow is
finished.
2023-05-23 13:01:15 -07:00
Mateusz Mandera
dda4603f94 auth: Extract EXPIRABLE_SESSION_VAR_DEFAULT_EXPIRY_SECS. 2023-05-23 13:01:15 -07:00
Mateusz Mandera
01498add9b auth: Rename authentication_method session var. 2023-05-23 13:01:15 -07:00
Karl Stolley
903090c582 css: Move mention-pill colors under rendered markdown.
This just ensures that the mention-pill color selectors are children
of `rendered_markdown`, which class appears both in the message-
preview area as well as individual message rows.

Fixes #25720.
2023-05-23 12:57:24 -07:00
Anders Kaseorg
8a128ba81e commit-msg: Don’t change the current directory for non-Vagrant.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-23 12:24:44 -07:00
evykassirer
9427fb7230 settings: Fix narrow-screen background color, use color variable.
Fixes #25708.
2023-05-23 11:31:03 -07:00
Lauryn Menard
eba83b9d87 api-docs: Expand /update-message main description for realm settings.
Expands the main description for the `/update-message` documentation
to include a list of the realm settings in the API that are relevant
to when users can update a message's content, topic or stream.
2023-05-23 11:11:20 -07:00
Lauryn Menard
8ec9abe00d api-changelog: Clarify feature level 159 descriptive text.
Original API changelog entries: commit 02eee3a04f and
commit 815bf609fa.
2023-05-23 11:11:20 -07:00
Lauryn Menard
e4ae8b79c3 api-changelog: Clarify feature level 162 descriptive text.
Original API changelog entries: commit 73f0eae394 and
commit 2c4e076fef and commit 891f83601d.
2023-05-23 11:11:20 -07:00
Lauryn Menard
0e9c34a975 api-changelog: Clarify feature level 172 descriptive text.
Original API feature level entries: commit 440f9e397a and
commit bd7f728796.
2023-05-23 11:11:20 -07:00
Sahil Batra
295b37bceb bootstrap: Remove bootstrap CSS rules for number type inputs.
We have added the required CSS rules to individual elements in
previous commits and this commit can remove the CSS in bootstrap.css.
2023-05-23 10:54:12 -07:00
Sahil Batra
c8ad693e41 billing: Add bootstrap CSS to number type inputs.
This commit adds bootstrap CSS rules for number type inputs
in billing and upgrade page to billing.css as we will be
removing them from bootstrap.css in further commits.
2023-05-23 10:54:12 -07:00
Sahil Batra
96eaadda71 activity: Add bootstrap CSS styles for number type inputs.
This commit adds bootstrap CSS rules for number type inputs
in activity page to activity.css as we will be removing them
from bootstrap.css in further commits.
2023-05-23 10:54:12 -07:00
Sahil Batra
a62a863f67 bootstrap: Remove CSS for "submit" type inputs.
We use "submit" type inputs in dev login page. Only "cursor"
CSS was applied to those elements from bootstrap and this
commit adds it to those elements in portico_signin.css and
removes the CSS in bootstrap.css and bootstrap-btn.css.
2023-05-23 10:54:12 -07:00
Sahil Batra
599ad856b2 bootstrap: Remove CSS for ".input-xxlarge" elements.
We use "input-xxlarge" class for search box in activity
support page only. This commit adds the width property
in activity.css for the search box and rest of the CSS
applied using this class was redundant and can be removed
safely.
2023-05-23 10:54:12 -07:00
Sahil Batra
f7b27e6fea bootstrap: Remove CSS for ".input-large".
We use "input-large" class only for sponsorship page
and the bootstrap CSS for this class is already
overridden by CSS defined in portico.css.
2023-05-23 10:54:12 -07:00
Sahil Batra
8719594c51 bootstrap: Remove CSS for search type inputs.
We do not use search type inputs anywhere in the app
and thus we can safely remove the CSS for it.
2023-05-23 10:54:12 -07:00
Sahil Batra
d8c8de5f27 bootstrap: Remove CSS for color type input elements.
We do not use "color" type input elements anywhere in the
app.
2023-05-23 10:54:12 -07:00
Sahil Batra
3f57672e15 bootstrap: Remove CSS for "tel" type input elements.
We do not use "tel" type input elements anywhere in the
app.
2023-05-23 10:54:12 -07:00
Sahil Batra
385d30b285 bootstrap: Remove CSS for week type input elements.
We do not use "week" type input elements anywhere in the
app.
2023-05-23 10:54:12 -07:00
Sahil Batra
33df97a3d9 bootstrap: Remove CSS for time type input elements.
We do not use "time" type input elements anywhere in the
app.
2023-05-23 10:54:12 -07:00
Sahil Batra
7627f346a3 bootstrap: Remove CSS for month type input elements.
We do not use "month" type input elements anywhere in the
app.
2023-05-23 10:54:12 -07:00
Sahil Batra
5d484a8794 bootstrap: Remove CSS for date type input elements.
We do not use "date" type input elements anywhere in the
app.
2023-05-23 10:54:12 -07:00
Sahil Batra
8ca8745c0e bootstrap: Remove CSS for datetime type input elements.
We do not use "datetime" type input elements anywhere in the
app.
2023-05-23 10:54:12 -07:00
Sahil Batra
286f47468d bootstrap: Remove CSS for button type inputs.
We do not use button type inputs anywhere in the app so
we can remove its CSS.
2023-05-23 10:54:12 -07:00
Sahil Batra
b08ba862e6 bootstrap: Remove CSS for reset type inputs.
We do not use "reset" type inputs in our app, so we can
safely remove the CSS for them.
2023-05-23 10:54:12 -07:00
Aman Agrawal
dc6099d656 message_row: Use equal top/bottom padding in message content.
We had the `3px 0 1px` padding before migration to use grid,
then I switched it to use `4px 0 1px` since we were planning to
use blue box border which seemed to have helped that case.

Since we switched to using outline for blue box, it makes sense
to just use equal padding.
2023-05-23 10:45:28 -07:00
Greg Price
df8a434424 portico: Add Senior Flutter Engineer position to /jobs page. 2023-05-22 17:22:39 -07:00
Alex Vandiver
0935d388f0 nginx: Set X-Forwarded-Proto based on trust from requesting source.
Django has a `SECURE_PROXY_SSL_HEADER` setting[^1] which controls if
it examines a header, usually provided by upstream proxies, to allow
it to treat requests as "secure" even if the proximal HTTP connection
was not encrypted.  This header is usually the `X-Forwarded-Proto`
header, and the Django configuration has large warnings about ensuring
that this setting is not enabled unless `X-Forwarded-Proto` is
explicitly controlled by the proxy, and cannot be supplied by the
end-user.

In the absence of this setting, Django checks the `wsgi.url_scheme`
property of the WSGI environment[^2].

Zulip did not control the value of the `X-Forwarded-Proto` header,
because it did not set the `SECURE_PROXY_SSL_HEADER` setting (though
see below).  However, uwsgi has undocumented code which silently
overrides the `wsgi.url_scheme` property based on the
`HTTP_X_FORWARDED_PROTO` property[^3] (and hence the
`X-Forwarded-Proto` header), thus doing the same as enabling the
Django `SECURE_PROXY_SSL_HEADER` setting, but in a way that cannot be
disabled.  It also sets `wsgi.url_scheme` to `https` if the
`X-Forwarded-SSL` header is set to `on` or `1`[^4], providing an
alternate route to deceive to Django.

These combine to make Zulip always trust `X-Forwarded-Proto` or
``X-Forwarded-SSL` headers from external sources, and thus able to
trick Django into thinking a request is "secure" when it is not.
However, Zulip is not accessible via unencrypted channels, since it
redirects all `http` requests to `https` at the nginx level; this
mitigates the vulnerability.

Regardless, we harden Zulip against this vulnerability provided by the
undocumented uwsgi feature, by stripping off `X-Forwarded-SSL` headers
before they reach uwsgi, and setting `X-Forwarded-Proto` only if the
request was received directly from a trusted proxy.

Tornado, because it does not use uwsgi, is an entirely separate
codepath.  It uses the `proxy_set_header` values from
`puppet/zulip/files/nginx/zulip-include-common/proxy`, which set
`X-Forwarded-Proto` to the scheme that nginx received the request
over.  As such, `SECURE_PROXY_SSL_HEADER` was set in Tornado, and only
Tornado; since the header was always set in nginx, this was safe.
However, it was also _incorrect_ in cases where nginx did not do SSL
termination, but an upstream proxy did -- it would mark those requests
as insecure when they were actually secure.  We adjust the
`proxy_set_header X-Forwarded-Proto` used to talk to Tornado to
respect the proxy if it is trusted, or the local scheme if not.

[^1]: https://docs.djangoproject.com/en/4.2/ref/settings/#secure-proxy-ssl-header
[^2]: https://wsgi.readthedocs.io/en/latest/definitions.html#envvar-wsgi.url_scheme
[^3]: 73efb013e9/core/protocol.c (L558-L561)
[^4]: 73efb013e9/core/protocol.c (L531-L534)
2023-05-22 16:50:29 -07:00
Greg Price
2baa4fc0ca total-contributions: Add zulip-flutter to the list of repos. 2023-05-22 16:04:26 -07:00
Greg Price
c4cc27cd20 total-contributions: Fix bug that replaced a repo's whole history with nothing.
When using a start date before the first commit to a repo, we should
include the repo's entire history (up to the end date) in our totals.

Instead, we were using a range like "..{upper_version}", which in Git
revision-range syntax means the start of the range is HEAD -- so the
range was empty.

Fix that by leaving out the ".." when we want no left endpoint.
2023-05-22 16:04:26 -07:00
Greg Price
0c8fef2fc8 total-contributions: Factor out logic common to all repos. 2023-05-22 16:04:26 -07:00
Karl Stolley
ab94bcb21b css: Move recipient-row unread markers to message row file. 2023-05-22 15:54:57 -07:00
Karl Stolley
36c5df7663 css: Move message-row styles to own file. 2023-05-22 15:54:57 -07:00
Karl Stolley
ffbd0cb316 css: Clean up comments for future readers. 2023-05-22 15:54:57 -07:00
Tim Abbott
a5ac19e93a emails: Work around bad Apple Mail preview parser.
Apparently, Apple Mail interpreted the <body> text in the comment here
as the start of the body in the email in its special parser for
displaying a preview of emails in the inbox view, resulting in every
Zulip email being displayed as "tag out of the email, the ..." instead
of our configured preheader.
2023-05-22 15:50:50 -07:00
xoldyckk
6f009c5e65 ts: Convert rtl.js to TypeScript.
Co-authored-by: Satyam Bansal <sbansal1999@gmail.com>
2023-05-22 15:41:42 -07:00
Lauryn Menard
6d6a335e32 api-docs: Make realm_linkifiers current API clear in description.
Adjusts the descriptions of realm_linkifiers (and deprecated
realm_filters) events and register response fields so that the
description of the current API is complete without the feature
level 176 **Changes** notes.
2023-05-22 15:20:07 -07:00
Lauryn Menard
fd02648b0e api-changelog: Update feature level 175 entry and related changes notes. 2023-05-22 13:21:03 -07:00
Karl Stolley
9f99235368 send_button: Suppress Send tooltip on tabbing to send. 2023-05-22 13:01:52 -07:00
Aman Agrawal
eeea5c1713 css: Fix @everyone and @stream displayed as user mentions.
Backend incorrectly renders @everyone and @stream as `user-mention`
while they are clearly `group_mention`. To fix this, we use
`data-user-id` property of @everyone and @stream which are
set to `*` for them.
2023-05-22 12:41:44 -07:00
Aman Agrawal
67ff421194 css: Change mention text and background colors. 2023-05-22 12:41:44 -07:00
Aman Agrawal
c415944e55 css: Separate mention pill colors. 2023-05-22 12:41:44 -07:00
Lalit
888d6d8037 settings_playground: Fix sorting issues in playgrounds table.
Removed the sorting functions which were sorting under the assumption that
our comparison items were a list instead I used the generic sort functions
functionality of our `list_widget` module.
2023-05-22 09:36:24 -07:00
Aman Agrawal
f04ae8acd3 drafts: Fix message header overlapping outline. 2023-05-22 09:31:21 -07:00
Lalit
7346ce98f3 ts: Convert emojisets to TypeScript.
Declared types for '*.png' modules and '!style-loader?*' modules in
`assets.d.ts` and used them in `emojisets.ts`.
2023-05-22 09:02:42 -07:00
Hardik Dharmani
d9716bc189 left_sidebar: Improve mentions in muted topics.
When there are only muted unread mentions in a stream, show `@` icon
and unread count in faded style, also align the `@` on more topics
with no unead counter on it.

If there are only muted unread messages without mentions don't show
the unread counter on the stream.

Fixes #25382.
2023-05-19 18:40:57 -07:00
Hardik Dharmani
8c6f9b3f95 unread: Improve live update for direct mentions in muted topics.
The "Mark as unread" event handler was not passing through the
mentioned_me_directly value, which is now important to left sidebar
rendering.

See the extended comment for how this solution is incorrect/incomplete
and has to fall back to guessing a potentially incorrect value in rare
situations.

Co-authored-by: Tim Abbott <tabbott@zulip.com>
2023-05-19 18:00:25 -07:00
Alex Vandiver
68722e7d3c release-checklist: Add a mastodon announce step. 2023-05-19 16:55:30 -07:00
Alex Vandiver
68c37c9d7b release-checklist: Adjust for the blogs being in Astro. 2023-05-19 16:55:30 -07:00
Alya Abbott
9ca00a1eff help: Document keyboard navigation for scheduling a message. 2023-05-19 16:53:31 -07:00
Tim Abbott
4be5ce97cb index: Move audio file HTML out of .app.
There's no compelling reason for these to be inside the container
element for the app's main screen UI.
2023-05-19 15:24:10 -07:00
Aman Agrawal
d7528f6bbe index: Remove no longer used alert-bar-container.
This was used for tutorial but was removed in
ebe959f2b0
2023-05-19 15:24:10 -07:00
Aman Agrawal
1171862bfd index: Move alert box out of .app.
This allows us to show alert box above navbar.
2023-05-19 15:24:10 -07:00
Aman Agrawal
ca21eb7141 index: Move user-profile-modal outside .app.
Keep it inside `.app` restricted its height and its ability to
draw over other elements.
2023-05-19 15:24:10 -07:00
Aman Agrawal
bbd5431e18 index: Move informational-overlays outside .app.
This is how other overlays are managed, and will be important in
upcoming refactoring, since we don't want the overlay height to be
restricted by the height of the `.app`.
2023-05-19 15:24:10 -07:00
Alex Vandiver
e6b1384a05 version: Update version and changelog after 6.2 release. 2023-05-19 16:58:55 -04:00
Lalit
7ac891a6b9 people: Add version parameter for medium sized avatar urls.
We need to append the `version` parameter when constructing the urls for
medium-sized images so that the browser updates the image in real time when
the user uploads a new avatar.

Fixes #25558.
2023-05-19 13:52:00 -07:00
Akarsh Jain
12db83b011 help: Open Help Center links in new tab for empty message lists.
This commit updates the Help Center links in all relevant empty message
list views to open in a new tab by default. This prevents users from being
navigated away from the app.

Fixes #25337.
2023-05-19 13:51:00 -07:00
Karl Stolley
c2f6167c01 css: Remove superfluous grid- properties.
The use of named areas with `grid-area` make it unnecessary to
declare `grid-row` or `grid-column` values. (Note also that
grid areas must not be presented in quotation marks.)

Additionally, because `.unread_marker` is no longer placed on the
grid by itself (i.e., it always accompanies `.date_unread_marker`
or `.message_unread_marker`), it does not need any manual grid
placement, `grid-area` or otherwise.
2023-05-19 13:48:16 -07:00
Aman Agrawal
9aa9f9b3c8 message: Separate unread marker of date_row from message.
This allows us to easily disable unread marker for date row of
the first unread message without producing any bugs.
2023-05-19 13:48:16 -07:00
Karl Stolley
ef3289b73b css: Present message_row as CSS Grid.
This change enables the unread marker to participate as a grid item,
rather than the product of various absolute/relative positioning
hacks. The intention is to therefore prevent the blue active-message
box from disappearing on browsers that have zoomed out (~80% zoom).

With grid in place, this also makes for a more robust presentation
of each message row, and named grid areas should make it possible to
modify and extend the grid into the future.

Finally, this change removes styles that are no longer necessary in
the context of CSS Grid.
2023-05-19 13:48:16 -07:00
Tim Abbott
9c09edd7af ui_init: Fix loading spectators view.
18578cc5da broke the success code path.
2023-05-19 13:42:48 -07:00
Lauryn Menard
3cb6c9aea9 api-docs: Add examples to realm_filters event prose description.
Adds examples of the regex pattern and old URL string format to
the deprecated `realm_filters` event and register response field.
The examples are in the prose description since the events are
no longer sent and therefore no longer tested.
2023-05-19 13:23:07 -07:00
Lauryn Menard
03a2c2da6a api-changelog: Update and clarify docs for feature level 176 entry.
Revises API changelog entry for missing endpoint method and to
clarify the overall text.

Updates Changes notes for feature level 176 to not have repetitive
text, so that the updates were clearer and more concise.

The original commit with the changes related to this API changelog
entry is commit 268f858f39.
2023-05-19 13:23:07 -07:00
Sahil Batra
4c4caa7be4 CVE-2023-32677: Check permission to subscribe other users in invites.
This commit updates the API to check the permission to subscribe other
users while inviting.  The API will error if the user passes the
"stream_ids" parameter (even when it contains only default streams)
and the calling user does not having permission to subscribe others to
streams.

For users who do not have permission to subscribe others, the
invitee will be subscribed to default streams at the time of
accepting the invite.

There is no change for multiuse invites, since only admins are allowed
to send them, and admins always have the permission to subscribe
others to streams.
2023-05-19 16:13:32 -04:00
Mateusz Mandera
a23b077b79 CVE-2023-28623: Prevent unauthorized signup with ldap + external auth.
Since 74dd21c8fa in Zulip Server 2.1.0, if:
- ZulipLDAPAuthBackend and an external authentication backend (any aside
  of ZulipLDAPAuthBackend and EmailAuthBackend) are the only ones
  enabled in AUTHENTICATION_BACKENDS in /etc/zulip/settings.py
- The organization permissions don't require invitations to join

...then an attacker can create a new account in the organization with
an arbitrary email address in their control that's not in the
organization's LDAP directory.

The impact is limited to installations which have the specific
combination of authentication backends described above, in addition to
having the "Invitations are required for joining this organization
organization" permission disabled.
2023-05-19 16:13:00 -04:00
Mateusz Mandera
3ed2a30e01 maybe_send_to_registration: Remove password_required arg.
This argument was added with the default incorrectly set to `True` in
bb0eb76bf3 - despite
`maybe_send_to_registration` only ever being called in production code
in a single place, with `password_required=False` explicitly. And then
it just got carried forward through refactors.

`maybe_send_to_registration` was/is also called twice in tests, falling
back to the default, but the `password_required` value is irrelevant to
the tests - and if anything letting it use the `True` has been wrong,
due to not matching how this function is actually used.
2023-05-19 16:13:00 -04:00
Josiah Kievit
28c5c64b8d css: Remove copy code button outline.
Added styling to show no outline around the copy to clipboard button on click. 

Previously, when clicking this button, a rectangular outline appeared around 
the button, which didn't look good, since a 'Copied!' message was already displayed.

Fixes #25533.
2023-05-19 13:09:10 -07:00
Karl Stolley
6e3e8c9ede linter: Lint grid-area names for quotation marks.
This adds a CSS stylelint rule that will catch erroneous quotation
marks around named grid-areas, which should be <custom-ident> values,
not strings.

So, for example, `grid-area: "my_area";` is an error. It should be
`grid-area: my_area;`.
2023-05-19 13:08:15 -07:00
Mateusz Mandera
b55adbef3d export: Handle RealmAuditLog with .acting_user in different realm. 2023-05-19 11:12:19 -07:00
Alex Vandiver
c978bfaa32 models: Add a unique index on UserProfile.api_key.
This prevents `get_user_profile_by_api_key` from doing a sequential
scan.

Doing this requires moving the generation of initial api_key values
into the column definition, so that even bare calls to
`UserProfile.objects.create` (e.g. from tests) call appropriately
generate a random initial value.
2023-05-19 11:11:04 -07:00
evykassirer
27bc36b7d6 settings: Revert dark mode background color changes. 2023-05-19 10:57:50 -07:00
Lauryn Menard
145d6915c1 api-changelog: Add 2.1.0 entry for realm_default_external_accounts.
Adds an API changelog note to 2.1 for the addition of
realm_default_external_accounts to the `/register-queue` response.

Also adds a Changes note to the field in the endpoint's response
API documentation.

The original commit that added it to that endpoint's response was
commit d7ee2aced1.
2023-05-19 10:50:17 -07:00
Sahil Batra
a4db19f9aa signup: Fix selector used for validating the forms.
This commit fixes a typo in the selector used to
validate registration, support, realm creation,
password reset and terms of service forms. This
typo also resulted in a bug where "This field is
required" error message was shown at incorrect
position and this change fixes it.

This commit also fixes the client side error
handling of these forms which did not work
perfectly due to the selector being wrong.
2023-05-19 10:48:52 -07:00
Alex Vandiver
18578cc5da ui_init: Properly call reject with an error, not an xhr.
If the spectator registration call fails, properly log the error and
call `reject` with an error object, not the xhr that `channel.post`
calls its error callback with.

This does nothing to address the UI question of what to do should this
request fail.
2023-05-19 10:48:21 -07:00
Alex Vandiver
b312a86ada sentry: Add the observed user's IP address before forwarding.
The default for Javascript reporting is that Sentry sets the IP
address of the user to the IP address that the report was observed to
come from[^1].  Since all reports come through the Zulip server, this
results in all reports being "from" one IP address, thus undercounting
the number of affected unauthenticated users, and making it difficult
to correlate Sentry reports with server logs.

Consume the Sentry Envelope format[^2] to inject the submitting
client's observed IP address, when possible.  This ensures that Sentry
reports contain the same IP address that Zulip's server logs do.

[^1]: https://docs.sentry.io/platforms/python/guides/logging/enriching-events/identify-user/
[^2]: https://develop.sentry.dev/sdk/envelopes/
2023-05-18 16:25:54 -07:00
David Rosa
19eb98a74a help: Document "User list style" display setting.
- Documents the "User list style" (under Settings > Display settings)
- Adds new section to /help/status-and-availability#statuses

Fixes #23492.
2023-05-18 16:17:56 -07:00
Toyam Cox
650cdc474d docs: Also set X-Forwarded-Proto in proxies.
Django 4.0 and higher began checking the `Origin` header, which made
it important that Zulip know accurately if the request came over HTTPS
or HTTP; failure to do so would result in "CSRF verification failed"
errors.

For Zulip servers which are accessed via proxies, this means that
`X-Fowarded-Proto` must be set accurately.  Adjust the documentation
for the suggested configurations to add the header.

Fixes: #24599.

Co-authored-by: Alex Vandiver <alexmv@zulip.com>
2023-05-18 17:17:35 -04:00
Karl Stolley
0407abc788 help_pages: Improve anchor highlights.
These changes ensure that only headings targeted by URL fragments are
highlighted in full. Div elements will have their immediate first
child element highlighted instead (e.g., the first element of an API
parameter box).
2023-05-18 13:57:42 -07:00
Aman Agrawal
44ae67d426 css: Fix gap between header and sticky header at some zoom level. 2023-05-18 13:39:46 -07:00
Aman Agrawal
3acd7b8f47 css: Move message header padding to the element with border.
Apply border and top margin on the same element so that browser
has no way to introduce a gap between them.
2023-05-18 13:39:46 -07:00
Alex Vandiver
a95b796a91 supervisor: Drop minfds back down from 1000000 to 40000.
1c76036c61 raised the number of `minfds` in Supervisor from 40k to
1M.  If Supervisor cannot guarantee that number of available file
descriptors, it will fail to start; `/etc/security/limits.conf` was
hence adjusted upwards as well.  However, on some virtualized
environments, including Proxmox LXC, setting
`/etc/security/limits.conf` may not be enough to raise the
system-level limits.  This causes `supervisord` with the larger
`minfds` to fail to start.

The limit of 1000000 was chosen to be arbitrarily high, assuming it
came without cost; it is not expected to ever be reached on any
deployment.  262b19346e already lowered one aspect of that
changeset, upon determining it did come with a cost.  Potentially
breaking virtualized deployments during upgrade is another cost of
that change.

Lower the `minfds` it back down to 40k, partially reverting
1c76036c61, but allow adjusting it upwards for extremely large
deployments.  We do not expect any except the largest deployments to
ever hit the 40k limit, and a frictionless deployment for the
vanishingly small number of huge deployments is not worth the
potential upgrade hiccups for the much more frequent smaller
deployments.
2023-05-18 13:04:33 -07:00
David Rosa
7fc474c7a6 help: Update "Restrict stream invitation" page.
- Renames page title to "Restrict stream membership management".
- Renames section about "Who can add users to streams" setting.
- Adds new section "Configure who can remove users".
- Updates help/stream-permissions

Fixes #25264.
2023-05-18 12:50:54 -07:00
David Rosa
55127b6178 help: Add intro section to help/add-or-remove-users-from-a-stream.
- Adds an intro section about what's possible by consolidating
  references to permissions.
2023-05-18 12:50:54 -07:00
Lauryn Menard
5802f7775f api-changelog: Update and clarify docs for feature level 178 entry.
Updates the descriptions and examples for there only being two key
values: "website" and "aggregated".

Also, clarifies that email keys are the Zulip display email.

And removes any descriptive text that says presence objects have
information about the clients the user is logged into.
2023-05-18 11:57:02 -07:00
Alex Vandiver
1184bdc934 push_notifications: Lock message while we mark it pending for push.
Deleting a message can race with sending a push notification for it.
b47535d8bb handled the case where the Message row has gone away --
but in such cases, it is also possible for `access_message` to
succeed, but for the save of `user_message.flags` to fail, because the
UserMessage row has been deleted by then.

Take a lock on the Message row over the accesses of, and updates to,
the relevant UserMessage row.  This guarantees that the
message's (non-)existence is consistent across that transaction.

Partial fix for #16502.
2023-05-18 11:53:21 -07:00
Anders Kaseorg
12310189ed install: Support Debian 12.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-18 11:52:22 -07:00
Anders Kaseorg
16dedb08fd ci: Fix matrix definition for tests job.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-18 11:52:22 -07:00
Anders Kaseorg
4b19863065 test_timeout: Skip test_timeout_warn on Python 3.11 for coverage issue.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-18 11:52:22 -07:00
Anders Kaseorg
480a2e2d64 postgresql-init-dev-db: Work around PGroonga WAL issue.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-18 11:52:22 -07:00
Anders Kaseorg
83c0ed2a9d build-pgroonga: Upgrade PGroonga from 2.3.6 to 3.0.3.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-18 11:52:22 -07:00
Lalit
a2db6df826 ts: Convert deprecated_feature_notice module to TypeScript. 2023-05-18 08:52:26 -07:00
Lalit
0216eb8915 deprecated_feature_notice: Use zod for validating data when fetching it from localstorage.
Refactored `maybe_show_deprecation_notice` to use zod to parse the `shown_deprecation_notices`
array stored in localstorage for better type-safety.
2023-05-18 08:52:26 -07:00
Lauryn Menard
2f96b1756e api-changelog: Add notes for feature level 3 zulip_version change.
Original API changelog note was made in commit 2c63130195.
2023-05-18 08:51:46 -07:00
Lalit
656a31d38d refactor: Move maybe_get_stream_name from stream_data to sub_store.
This commit moves `maybe_get_stream_name` function from `stream_data` to `sub_store`
as it didn't had any dependency on `stream_data` and it also helps us to cut off
dependency on `stream_data` for some of the modules including `user_topics`.
2023-05-18 08:46:16 -07:00
Lauryn Menard
3023091caa scheduled-messages: Add help center link to fetch / delete descriptions. 2023-05-18 08:45:51 -07:00
Lauryn Menard
67e1889817 scheduled-messages: Add explicit test with emails for direct message. 2023-05-18 08:45:51 -07:00
Lauryn Menard
a2a50e1408 scheduled-messages: Simplify message_to type in check_schedule_message.
As of commit 38f6807af1, we accept only stream and user IDs for
the recipient information for scheduled messages, which means we
can simplify the type for `message_to` in `check_schedule_message`.
2023-05-18 08:45:51 -07:00
Lauryn Menard
1ad0ad8ece tests-scheduled-messages: Use "direct" instead of "private". 2023-05-18 08:45:51 -07:00
Lalit
a3f46957bc ts: Convert confirm_dialog module to TypeScript. 2023-05-18 08:44:30 -07:00
Anders Kaseorg
271df2c98e requirements: Upgrade coverage.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-16 21:57:01 -07:00
Tim Abbott
ac3acc941f css: Increase opacity for grey elements.
The message timestamp and a few settings elements looked off with the
new 25% off white dark theme font color.
2023-05-16 16:52:22 -07:00
Trident Pancake
6fb16f3598 message_edit: Disable save btn after edit time limit
Fixes #25413.

The old code was disabling the save button wrong by using
`.addClass("disabled")` instead of `prop()`.

Added tooltip for the disabled save button as per issue #25413 and changed
"Times up!" color to red.

The textbox readonly logic was changed to no longer becoming readonly. Reason
being there are edge cases involving the compose buttons such that simply
marking the textbox as readonly is not sufficient.

E.g. using the compose buttons after readonly still modifies the content.

One solution might be to just hide the compose buttons visually. However, there
are edge cases for that too. If preview mode was previously active, then
perhaps that state needs to be reverted. If any modal is open, such as the emoji
picker, then that needs to be closed. Solving these edge cases doesn't
improve the user experience. Keeping the textbox editable allows an easier way
for user to copy the text and don't have weird cases.
2023-05-16 15:59:29 -07:00
Trident Pancake
b1c801847b message_edit: Remove redundant is_editable check 2023-05-16 15:59:29 -07:00
Lakshay Mittal
a208da9c4d style: Fix dropdown text alignment by reducing vertical padding.
Zulip's select widgets have a 30px height; this comes from Bootstrap
but is also generally nice for visual consistency.

In modals, we use a 15px font-size, instead of the 14px used in the
rest of the app, and in that context, the 4px vertical padding plus
30px fixed height resulted in the text not being vertically aligned.

Fix this by removing that vertical padding; all of our select elements
with these classes appear to position the text in the center of the
dropdown through other CSS mechanisms.
2023-05-16 15:43:06 -07:00
Lauryn Menard
8f4de3afc0 api-docs: Update create/edit scheduled message errors for IDs.
In commit 38f6807af1, we updated the `POST /scheduled_messages`
endpoint to only accept user IDs for direct messages. The endpoint
alread only accepted a stream ID for stream messages.

But the API documentation was not updated for the errors returned
when either a stream or user with the specified ID does not exist.

Updates the API documentation for the correct error responses.
2023-05-16 15:14:54 -07:00
Alex Vandiver
24c3e25f86 middleware: Redirect non-canonical realm domain names.
If a host is in REALM_HOSTS, it has its own domain name.  Redirect
access from other domain names to that name.
2023-05-16 15:13:51 -07:00
Alex Vandiver
724de9cd49 rocketchat: Treat users with "bot" roles as bots when importing.
We previously relied on `type`, but we have observed bots typed with a
`bot` role as well.
2023-05-16 15:10:58 -07:00
Alex Vandiver
34394cec9a rocketchat: Handle users with no email address set.
Fixes: #25596.
2023-05-16 15:10:58 -07:00
Alex Vandiver
3160c3cce0 realm_export: Return export id from POST which create it. 2023-05-16 14:05:01 -07:00
Alex Vandiver
7811e99548 realm_export: Handle hard head-of-queue failures.
Realm exports may OOM on deployments with low memory; to ensure
forward progress, log the start time in the RealmAuditLog entry, and
key off of the existence of that to prevent re-attempting an export
which was already tried once.
2023-05-16 14:05:01 -07:00
Alex Vandiver
4a43856ba7 realm_export: Do not assume null extra_data is special.
Fixes: #20197.
2023-05-16 14:05:01 -07:00
Alex Vandiver
5eeb616666 realm_export: Test failures during export. 2023-05-16 14:05:01 -07:00
Alex Vandiver
362177b788 workers: Run realm export with one thread if in low-memory environment.
We previously hard-coded 6 threads for the realm export; in low-memory
environments, spawning 6 threads for an export can lean to an OOM,
which kills the process and leaves a partial export on disk -- which
is then tried again, since the export was never completed.  This leads
to excessive disk consumption and brief repeated outages of all other
workers, until the failing export job is manually de-queued somehow.

Lower the export to only use on thread if it is already running in a
multi-threaded environment.  Note that this does not guarantee forward
progress, it merely makes it more likely that exports will succeed in
low-memory deployments.
2023-05-16 14:05:01 -07:00
Alex Vandiver
9f231322c9 workers: Pass down if they are running multi-threaded.
This allows them to decide for themselves if they should enable
timeouts.
2023-05-16 14:05:01 -07:00
Alex Vandiver
5329fed387 test_queue_worker: Do a full recursion on subclasses.
This makes it less likely we will accidentally fail to include a class
if the subclassing of QueueProcessingWorker changes, and lets mypy
more accurately understand the typing.
2023-05-16 14:05:01 -07:00
Alex Vandiver
8d8b5935ac puppet: Prevent unattended upgrades of erlang-base.
When upgraded, the `erlang-base` package automatically stops all
services which depend on the Erlang runtime; for Zulip, this is the
`rabbitmq-server` service.  This results in an unexpected outage of
Zulip.

Block unattended upgrades of the `erlang-base` package.
2023-05-16 14:02:06 -07:00
Sahil Batra
007a51f277 accounts: Allow user to change email visibility during first login.
We now allow users to change email address visibility setting
on the "Terms of service" page during first login. This page is
not shown for users creating account using normal registration
process, but is useful for imported users and users created
through API, LDAP, SCIM and management commands.
2023-05-16 13:52:56 -07:00
Sahil Batra
7f01b3fb63 users: Set tos_version to -1 for users who have not logged-in yet.
We now set tos_version to "-1" for imported users and the ones
created using API or using other methods like LDAP, SCIM and
management commands. This value will help us to allow users to
change email address visibility setting during first login.
2023-05-16 13:52:56 -07:00
Sahil Batra
f58e3d2cf6 accounts_accept_terms: Fix title and submit button text.
This commit changes the title of page to "Welcome to Zulip"
and submit button text to "Continue". We do this change because
same page will be used to allow users to set email address
visibility during first login even when organization has not
configured terms of service and we can avoid using conditionals
now by using this title and submit button text.
2023-05-16 13:52:56 -07:00
Sahil Batra
8ca060531f templates: Extract html for new user email address visibility.
This commit extracts html for setting new user email address
visibility in the registration page to a separate file.
This new file will then be used to allow imported users set
email visibility during login without having to duplicate the
code.
2023-05-16 13:52:56 -07:00
Sahil Batra
ff3233fdf1 templates: Extract html for email address visibility modal.
This commit extracts html for modal used for changing email
address visibility during registration to a separate file
so that we can avoid code duplication when we add commits
to allow changing email address visibility for imported
users during login.
2023-05-16 13:52:56 -07:00
Daniil Fadeev
859903648b scheduled_messages: Add banner for unscheduled message.
Fixes: #25614.
2023-05-16 12:39:01 -07:00
Mateusz Mandera
2b7877bcb4 support: Make user search by email case-insensitive.
It's pretty troublesome to fail to find a user in our database because
they used a different capitalization when signing up.
2023-05-16 12:38:12 -07:00
Mateusz Mandera
632e856240 support: Add option to delete user from /activity/support. 2023-05-16 12:38:12 -07:00
Karl Stolley
386d87635e popovers: Shorten 'Quote or reply' label.
This removes the previous "or forward" text from the message
actions popover, and keeps the documentation in sync with the
new text. Internationalization tests are updated, too.

Fixes #25603.
2023-05-16 12:36:29 -07:00
Aman Agrawal
e6c7363613 css: Make top message logo less bright. 2023-05-16 12:35:17 -07:00
Aman Agrawal
29880a4a1e css: Change border-bottom color for message header. 2023-05-16 12:35:17 -07:00
Aman Agrawal
c84681c69c css: Color tweaks. 2023-05-16 12:35:17 -07:00
Aman Agrawal
2a98968846 css: Use 75% white as default text color. 2023-05-16 12:35:17 -07:00
Aman Agrawal
3f4deedba1 css: Remove stale css.
`message_view_header_underpadding` is no longer present in the
codebase as we move the padding to be above the sticky recipient
bar.
2023-05-16 12:35:17 -07:00
Aman Agrawal
9f5b7ba9b0 css: Separate out text colors. 2023-05-16 12:35:17 -07:00
Aman Agrawal
c96de330b0 stream_color: Dim recipient bar background color. 2023-05-16 12:35:17 -07:00
Lauryn Menard
8d06fa7e38 api-docs: Update descriptions for display_emoji_reaction_users. 2023-05-16 12:31:03 -07:00
Lauryn Menard
8962565154 api-docs: Fix capitalization in descriptions with int values lists. 2023-05-16 12:31:03 -07:00
Lauryn Menard
239458a173 api-docs: Remove instances of "=>" in API documentation descriptions. 2023-05-16 12:31:03 -07:00
Lauryn Menard
63d51e8114 api-docs: Clarify uses of "=" in API documentation descriptions.
For cases of `name=value` in descriptions in the API documentation,
update to either use JSON style of `"name": value` when correct or
revise the descriptive text.
2023-05-16 12:31:03 -07:00
Lauryn Menard
09ab1be34f api-docs: Use backticks for descriptions referencing "null" values. 2023-05-16 12:31:03 -07:00
Lauryn Menard
c43ea96c06 api-docs: Clean up instances of "None" that should be "null". 2023-05-16 12:31:03 -07:00
Lauryn Menard
4fcb243769 api-docs: Standardize on lowercase true, false and null.
Creates a custom linter rule for `zerver/openapi/zulip.yaml` to
only allow lowercase versions of "true", "false" and "null".

Updates existing documentation for new rules.
2023-05-16 12:31:03 -07:00
Aman Agrawal
17bdf22521 css: Allow actions_hover icon to have a focus outline. 2023-05-16 11:57:17 -07:00
Brijmohan Siyag
17ec4f1e06 tooltip: Update max-width of disabled send button tooltip.
Changes the tooltip max-width on the disabled send button
from 300px to 350px to remove the weird looking padding at
the end.
2023-05-16 11:24:35 -07:00
Brijmohan Siyag
cb00fbc42f compose: Check posting policy for direct messages.
Prior this commit, changing the message type from a stream (where posting
was not allowed) to a direct message using the compose box dropdown, did not
changed the state of the send button from disabled to enabled even though
direct messages were allowed in the organization.

This was happening because `check_stream_posting_policy_for_compose_box` was
only for streams.

Now, function is updated to check for both streams and direct
messages, as it checks if direct messages are allowed or not, and depending on
that, it updates the send button's state, tooltip and displays a relevant banner.
2023-05-16 11:24:35 -07:00
Josh Yap
ee88bb5187 popovers: Hide emoji reaction when icon already present.
When hovering over another user's message, the emoji reaction
icon is already present. This commit removes the "Add emoji
reaction" menu item from the popover menu in this case, to
avoid redundancy.

Fixes #25602.
2023-05-16 10:53:54 -07:00
Josh Yap
231888b5a5 popovers: Add keyboard shortcut to emoji reaction menu item.
Fixes #25602.
2023-05-16 10:53:54 -07:00
Tim Abbott
3876171df1 compose: Fix opening compose box when viewing invalid stream.
This likely needs further refactoring to switch to using stream IDs
rather than names in this code path, but this change fixes an
exception that would be throw when opening the compose box while
viewing a narrow to an invalid stream name/ID.
2023-05-16 10:39:33 -07:00
Alex Vandiver
ffaccb8af2 outgoing_webhook: Respect settings.OUTGOING_WEBHOOK_TIMEOUT_SECONDS.
The use of the setting was accidentally removed in b88d7a741e, and
replaced with a static 10 seconds.
2023-05-16 07:00:37 -07:00
David Rosa
62553f8303 help: Restructure /help/mute-a-topic.
- Create separate sections for muted vs. unmuted streams.
- Combine instructions for muting/unmuting topics.

Fixes #25311.
2023-05-15 17:52:04 -07:00
David Rosa
eec7dedc17 help: Update links to renamed article "Starting a new direct message". 2023-05-15 16:13:55 -07:00
David Rosa
be14ec2cab help: Rename "Starting a new private thread" to "... new direct message".
With the private messages -> direct messages migration, we should
rename the "Starting a new private thread" help center article.

- Renames article to "Starting a new direct message"
- Updates relevant section in /help/getting-started-with-zulip
- Fixes typo in /help/send-group-dm
- Updates file names and adds URL redirect.

Fixes #25506.
2023-05-15 16:13:55 -07:00
Alex Vandiver
505eec4bac analytics: Create a RealmAuditLog entry when subscribing test users. 2023-05-15 16:09:44 -07:00
Alex Vandiver
ca2ca030d2 migrations: Backfill missing RealmAuditLog entries for subscriptions.
Backfill subscription realm audit log SUBSCRIPTION_CREATED events for
users which are currently subscribed but don't have any subscription
events, presumably due to some historical bug.  This is important
because those rows are necessary when reactivating a user who is
currently soft-deactivated.

For each stream, we find the subscribed users who have no
subscription-related realm audit log entries, and create a
`backfill=True` subscription audit log entry which is the latest it
could have been, based on UserMessage rows.  We then optionally insert
a `DEACTIVATION` if the current subscription is not active.
2023-05-15 16:09:44 -07:00
Tim Abbott
74e6367455 css: Increase constrast for blue box. 2023-05-15 16:01:09 -07:00
Joelute
584b11af2d unread_banner: Apply updated design to message feed banners.
In #22524, we have updated the compose banner to the new, updated design
while the unread banners have remained the same. When comparing them side
by side, they look rather old and outdated. We should apply the updated
design to the unread banners as well.

Fixes: #25551.
2023-05-15 15:59:12 -07:00
Joelute
d556b73084 unread_banner: Update HTML of unread banners to use zulip icons.
Previously, the close buttons on the unread banners used "x" as the icon.
This unfortunately doesn't scale well as we increase the font-size. To fix
this, we should update the button to use zulip icons instead of a character
as the button.
2023-05-15 15:59:12 -07:00
Karl Stolley
b852da6eed help_pages: Preserve anchor highlights.
This commit assigns a `.scroll-target` class to preserve any URL
fragment whose corresponding ID is on the self-same page as the
activating link.

This accommodates a side-effect of the fetch-based page-loading
logic, which seems to lose the `:target` reference once a load
or reload is complete.
2023-05-15 14:57:42 -07:00
Karl Stolley
ceec61ba10 help_pages: Highlight headings targeted by URL fragments.
One caveat: While the approach here works fine when loading a new
docs page whose URL includes a fragment, there appears to be something
about `simplebar` that clears out the `:target` reference. If you
click a heading link on a help page, for example, you might
momentarily see the highlighted style appear before it disappears.
2023-05-15 14:57:42 -07:00
Brijmohan Siyag
a4c7be68cc stream: change ID in selector to match updated one.
Updates the left-over ID in a5580264eb.
2023-05-15 14:55:21 -07:00
Anders Kaseorg
067a7a3a0f Fix jsx-lexer to avoid breaking Pygments TypeScriptLexer.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-15 14:52:32 -07:00
Daniil Fadeev
cb69413301 send_later: Add keyboard navigation to message scheduling modal.
Fixes: #25404.
2023-05-15 14:52:06 -07:00
Daniil Fadeev
fa112adcb7 send_late: Change the class send_later_options to an id.
It will be easier to locate the send later options in different code
 paths with the id.
2023-05-15 14:52:06 -07:00
Daniil Fadeev
e64e5f2413 scheduled_messages: Add keyboard navigation.
Keyboard navigation has been added to the scheduled messages modal
in this commit. The solution is based on the `modals_handle_events`
function from the `messages_overlay_ui.js` module, as well as some
helpful functions from the same module.

Fixes: #25181.
2023-05-15 14:46:21 -07:00
Daniil Fadeev
f2e627ba51 drafts: Move code handling keyboard navigation to a separate module.
The keyboard navigation that used to only work in drafts can now be
reused. This commit has moved the related functions to a separate
module.
2023-05-15 14:46:21 -07:00
Daniil Fadeev
35c23d0269 drafts: Refactor keyboard functions for reusability.
This is a preparatory commit to implement keyboard navigation in the
 message scheduling modal. The main goal is to make the
 `modals_handle_events` function reusable. To achieve this, we have
 extracted all the context-related variables and replaced all
 mentions of "draft" with the more neutral term "item". The
 `modals_handle_events` function now also has a context parameter,
 which contains all the necessary methods and properties to work in
 different modal contexts.
2023-05-15 14:46:20 -07:00
Alex Vandiver
0117d751c2 docs: Explain Zulip Cloud branch in release lifecycle docs.
Partial fix for #25482.
2023-05-15 14:44:11 -07:00
Alex Vandiver
6cb570f3f0 docs: Upgrade to zulip-cloud-current before exporting to Zulip Cloud.
Partial fix for #25482.
2023-05-15 14:44:11 -07:00
Alex Vandiver
e0c05825ed docs: Importing from Zulip Cloud exports should use zulip-cloud-current.
Partial fix for #25482.
2023-05-15 14:44:11 -07:00
Aman Agrawal
ae02a93d35 scheduled_message: Change tooltip of failure icon. 2023-05-15 14:43:04 -07:00
Aman Agrawal
c375d36c9e css: Dim color of failed message sent icons. 2023-05-14 16:46:20 -07:00
Aman Agrawal
1bffdda59f scheduled_message_overlay: Add a failed delivery indicator.
Fixes #25501
2023-05-14 16:46:20 -07:00
Aman Agrawal
06cbe95583 scheduled_message: Extract common elements into a separate file. 2023-05-14 16:46:20 -07:00
Aman Agrawal
c2145a8993 scheduled_message: Send update event on failed delivery. 2023-05-14 16:46:20 -07:00
Aman Agrawal
4dd32a4d85 scheduled_messages: Extract notify_update_scheduled_message. 2023-05-14 16:46:20 -07:00
Satyam Bansal
fad5c88aa9 select_recipient_widget: Use "button" tag instead of "div".
Previously, hovering over the stream selector in the
compose box would show a mouse/text pointer instead
of a hand pointer.

Fixes #25592.
2023-05-14 16:35:48 -07:00
Lalit
cab3a992c0 refactor: Extract message_feed_loading module from message_scroll.
This new module allows us to remove dependency on `message_scroll` in `fetch_status`
and hence allowing us to migrate it to TypeScript.
2023-05-14 11:24:31 -07:00
Lalit
9e1b4dafc0 message_list_data: Remove dependency on filter.js.
This commit removes dependency on `filter.js` by lifting the construction
of `Filter` object up in `all_messages_data.js`.
2023-05-14 11:24:31 -07:00
Ujjawal Modi
fc22b86eb6 streams: Correctly disable adding subscribers while creating streams.
This commit disables the field used for adding other subscribers
in stream creation box for users who are not allowed to add
other users to streams because of realm level setting
"Who can add users to  streams".

Fixes #24900.
2023-05-14 11:19:41 -07:00
Ujjawal Modi
105acc8495 streams: Disable option to add other subscribers in existing streams.
This commit disables the field used for adding other subscribers
to existing streams for users who are not allowed to add other users
to streams because of realm level setting "Who can add users to streams".
2023-05-14 11:19:05 -07:00
Ujjawal Modi
eda1ee555b streams: Properly disable add subscriber container for existing streams.
Earlier the field used for adding subscribers to existing
streams was not properly disabled.

This commit properly disables the field and also adds a new function
for enabling and disabling add subscribers container.
2023-05-14 11:19:05 -07:00
Ujjawal Modi
2a6146110c subscriptions: Change in API used for adding new subscriptions.
Earlier when a user who is not allowed to add subscribers to a
stream because of realm level setting "Who can add users to streams"
is subscribing other users while creating a new stream than new stream
was created but no one is subscribed to stream.

To fix this issue this commit makes changes in the API used
for adding subscriptions. Now stream will be created only when user
has permissions to add other users.

With a rewrite of the test by Tim Abbott.
2023-05-14 11:19:05 -07:00
Ujjawal Modi
a47569bf47 backend_tests: Add a test for subsribing others to public streams.
Earlier there was no backend test for subscribing others to
public streams in zephyr realm.

This commit adds a backend test for it.
2023-05-14 11:19:04 -07:00
Anders Kaseorg
16aa7c0923 puppet: Migrate Ruby functions from legacy Puppet 3.x API.
https://www.puppet.com/docs/puppet/7/functions_refactor_legacy.html

This removes a bug in the 3.x API that was converting nil to the empty
string, so some templates need to be adjusted.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-12 18:17:53 -07:00
Anders Kaseorg
cf8ae46291 puppet: Fix shell escaping in Ruby functions.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-12 18:17:53 -07:00
Anders Kaseorg
614ab533dc puppet: Reformat Ruby functions with rufo.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-12 18:17:53 -07:00
Tim Abbott
f26ac80ea1 api_docs: Document feature level 157 backport to 6.x. 2023-05-12 17:57:51 -07:00
Tim Abbott
2d3d3f6072 message_send: Don't mark scheduled messages to self as read.
The only reasonable intent for such a scheduled message is to remind
oneself of something at that time, which requires it being unread.

Fixes #25523.
2023-05-12 17:55:46 -07:00
Tim Abbott
daf6fb17bf do_send_messages: Use mandatory kwargs pattern. 2023-05-12 17:55:46 -07:00
Aman Agrawal
f66dde4a33 left_sidebar: Move tooltips to the focus element.
Since tippy relies on the `blur` event of `target` to hide
the toolips, it is important that the tooltip is triggered
by the element that receives that focus in keyboard navigation which
is `a` tag for left sidebar elements.
2023-05-12 17:35:52 -07:00
Mateusz Mandera
254ea4b0c8 social_auth: Save authentication method information in the session.
The immediate application of this will be for SAML SP-initiated logout,
where information about which IdP was used for authenticating the
session needs to be accessed. Aside of that, this seems like generally
valuable session information to keep that other features may benefit
from in the future.
2023-05-12 16:21:26 -07:00
Mateusz Mandera
af9d1a7dfb register_remote_user: Use explicit kwargs list.
This is nicer that .pop()ing specified keys - e.g. we no longer will
have to update this chunk of code whenever adding a new key to
ExternalAuthDataDict.
2023-05-12 16:21:25 -07:00
Lauryn Menard
90cc2716f0 scheduled-messages: Update API dicts for failed boolean field.
Adds the `failed` boolean from the ScheduledMessage to the API dict
returned by scheduled message events and register response, and by
fetching the user's scheduled messages.

`failed` will only be true when the server has tried to send the
scheduled message and failed due to an error.
2023-05-12 15:48:59 -07:00
Lauryn Menard
c7c67c01ce scheduled-messages: Update failure to send message fields for edits.
In the case of a user editing a scheduled message that the server
had failed to send at the scheduled time due to an error, we want
to update the `failed` and `failure_message` fields as the intent
is for the server to retry to send the scheduled message based on
the updated information provided by the user.
2023-05-12 15:48:59 -07:00
Lauryn Menard
cc648a2c19 scheduled-messages: Send notification if send scheduled message fails.
In the case that there is an error when sending a scheduled message,
we now send a message from the notification bot to the user who
scheduled the message about the failure/error.

The notification message is not sent if the error when sending the
scheduled message was due to the realm or sender being deactivated.
2023-05-12 15:48:59 -07:00
Alex Vandiver
b20aeadcb8 sentry: Downsample typing spans.
These can come fast and furious, and are not worth reporting all of.
Like presence reporting, we leave a small percentage of them for
network and endpoint latency information.
2023-05-12 13:53:57 -07:00
Alex Vandiver
6a3f97ba80 sentry: Heavily downsample presence spans.
Instead of dropping all of these spans, downsample them heavily (1% of
expected sampling rate).  These are some of the most frequent requests
to the server, and the high volumes do not add much information.  We
leave a small percent of requests, since it is a useful measure of
overall client network latency.
2023-05-12 13:53:57 -07:00
Alex Vandiver
9912b4c815 sentry: Unify logic for skipping span reporting.
This changes to not report any `call POST /json/users/me/presence`
spans, which we previously reported despite not including the inner
auto-instrumented HTTP spans.
2023-05-12 13:53:57 -07:00
Alya Abbott
683ed6322d portico: Add features to /features.
Add:
- Scheduled messages (new feature)
- Mute stream or topic
- Compliance exports (as part of "data exports")
- Help center
2023-05-12 13:37:16 -07:00
Alex Vandiver
a2ed0302ce streams: Prevent already-deactivated streams from being deactivated. 2023-05-12 13:26:43 -07:00
Alex Vandiver
0da62e7cda supervisor: Retry, with backoff, to connect to supervisor socket.
If `zulip-puppet-apply` is run during an upgrade, it will immediately
try to re-`stop-server` before running migrations; if the last step in
the puppet application was to restart `supervisor`, it may not be
listening on its UNIX socket yet.  In such cases, `socket.connect()`
throws a `FileNotFoundError`:

```
Traceback (most recent call last):
  File "./scripts/stop-server", line 53, in <module>
    services = list_supervisor_processes(services, only_running=True)
  File "./scripts/lib/supervisor.py", line 34, in list_supervisor_processes
    processes = rpc().supervisor.getAllProcessInfo()
  File "/usr/lib/python3.9/xmlrpc/client.py", line 1116, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python3.9/xmlrpc/client.py", line 1456, in __request
    response = self.__transport.request(
  File "/usr/lib/python3.9/xmlrpc/client.py", line 1160, in request
    return self.single_request(host, handler, request_body, verbose)
  File "/usr/lib/python3.9/xmlrpc/client.py", line 1172, in single_request
    http_conn = self.send_request(host, handler, request_body, verbose)
  File "/usr/lib/python3.9/xmlrpc/client.py", line 1285, in send_request
    self.send_content(connection, request_body)
  File "/usr/lib/python3.9/xmlrpc/client.py", line 1315, in send_content
    connection.endheaders(request_body)
  File "/usr/lib/python3.9/http/client.py", line 1250, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.9/http/client.py", line 1010, in _send_output
    self.send(msg)
  File "/usr/lib/python3.9/http/client.py", line 950, in send
    self.connect()
  File "./scripts/lib/supervisor.py", line 10, in connect
    self.sock.connect(self.host)
FileNotFoundError: [Errno 2] No such file or directory
```

Catch the `FileNotFoundError` and retry twice more, with backoff.  If
it fails repeatedly, point to `service supervisor status` for further
debugging, as `FileNotFoundError` is rather misleading -- the file
exists, it simply is not accepting connections.
2023-05-12 13:14:27 -07:00
Alex Vandiver
b8f53ab6e8 supervisor: Include STARTING processes in 'only_running' processes.
Because `STARTING` processes are on their way up, they should
effectively be counted as `RUNNING`, since the passage of time will
make them so.
2023-05-12 13:14:27 -07:00
Tim Abbott
2b2ee686f3 portico: Extract CSS variable padded-content-padding. 2023-05-12 11:54:17 -07:00
Karl Stolley
f1db7c1d72 portico_css: Keep targeted elements below menu bar.
This PR ensure that all elements targeted by URL fragments will
remain visible below the portico's menu bar at all viewport
sizes and also when a user zooms in, provided the target is on a
page with the menu bar, which will have the `portico-landing`
class.

Whether a quirk or a bug, Chrome appears to ignore the padding on
ancestral containing elements when calculating the offset for
`scroll-margin-top`, which is why padding has been moved to
`.inner-content` for `.why-page` and `.case-studies-page`, which
are the two unique class names for portico pages where the targeted-
element scrolling behavior is used.
2023-05-12 11:54:17 -07:00
Karl Stolley
e8498fd857 portico_pages: Include missing hand-generated heading IDs. 2023-05-12 11:54:17 -07:00
Karl Stolley
a5ff3d7e59 portico_pages: Add uniform structure HTML structure.
This commit ensures that the Attribution, Jobs, and Team pages all
share a uniform structure to match those of other pages. This will
simplify styling and should ensure greater confidence when modifying
portico landing-page styles.

The one CSS modification here, for the jobs page, maintains the space
at the top of the "How we work" section.
2023-05-12 11:54:17 -07:00
Aman Agrawal
dd73f7272d recent_conversation: Fix incorrect if condition.
row_focus cannot be equal to `$topic_rows.length` since it follows
0 array indexing.
2023-05-12 11:32:40 -07:00
Hardik Dharmani
0738dfd126 edit_bot_modal: Keep Save Changes button disable until changes are made.
Use update_submit_disabled_state_on_change parameter of dialog_widget
instead of setting up input handlers in show_edit_bot_info_modal.

Added new hidden input field to store value of current selected option
in edit_bot_form.hbs whose value is updated by item_click_callback
function of in settings_bots.js.

Also, called $(".edit_bot_avatar_file_input").trigger("input") on
clearing avatar so input event handler gets called and compare the
values to disable the submit button again.

Fixes #24568
2023-05-12 11:30:50 -07:00
Hardik Dharmani
81dfaa0602 dialog_widget: Update get_current_values function.
Updated `get_current_values` function to not include undefined keys
in current_values object and if the input field is of type file and
a file is selected then set the value equal to file object.
2023-05-12 11:30:50 -07:00
Aman Agrawal
461d935463 css: Fix unread marker leaking through message header. 2023-05-12 11:13:20 -07:00
Anders Kaseorg
3e6a212ace dependencies: Upgrade JavaScript dependencies.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-12 11:12:20 -07:00
Anders Kaseorg
ea28083ba4 eslint: Fix unicorn/prefer-at.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-12 11:12:20 -07:00
Anders Kaseorg
54f90e41c0 eslint: Fix unicorn/prefer-string-replace-all.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-12 11:12:20 -07:00
527 changed files with 93077 additions and 32195 deletions

View File

@@ -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"
}
}
]

View 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
View 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

View 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
View 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!

View File

@@ -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 }}

View File

@@ -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 }}

View File

@@ -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>

View File

@@ -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

View File

@@ -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")

View File

@@ -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)

View File

@@ -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:

View File

@@ -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).

View File

@@ -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}

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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.

View File

@@ -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:

View File

@@ -14,7 +14,9 @@ commit-discipline
code-style
reviewable-prs
code-reviewing
review-process
zulipbot-usage
bug-reports
reporting-bugs
suggesting-features
licensing
```

View 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.

View 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.

View File

@@ -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

View 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.

View File

@@ -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)

View File

@@ -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.

View File

@@ -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

View File

@@ -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 nginxs configuration to match the
systems; 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 messages 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
Zulips 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)

View File

@@ -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

View File

@@ -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.

View File

@@ -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]`

View File

@@ -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'
```

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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).

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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!}

View File

@@ -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).

View File

@@ -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

View File

@@ -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

View File

@@ -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
View 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)

View File

@@ -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 ""

View File

@@ -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}

View File

@@ -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.

View File

@@ -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)

View File

@@ -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.

View File

@@ -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 ""

View File

@@ -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>,

View File

@@ -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}

View File

@@ -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

View File

@@ -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)

View File

@@ -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!}

View File

@@ -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)

View File

@@ -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}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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:

View File

@@ -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

View File

@@ -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
![Markdown image](/static/images/help/markdown-image.png)
## 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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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:

View File

@@ -64,7 +64,7 @@ administrator can access private stream messages:
| View stream name | &#10004; | &#10004; | &#10004; | &#9726;
| Join | &#10004; | &#10004; | &#10004; |
| Unsubscribe | &#9726; | &#9726; | &#9726; | &#9726;
| Add others | &#10004; | &#10004; | &#10004; |
| Add others | &#10004; | &#10038; | &#10038; |
| Remove others | &#10004; | &#10038; | &#10038; | &#10038;
| See subscriber list | &#10004; | &#10004; | &#10004; | &#9726;
| See full history | &#10004; | &#10004; | &#10004; | &#9726;
@@ -80,8 +80,9 @@ administrator can access private stream messages:
<span class="legend_symbol">&#9726;</span><span class="legend_label">If subscribed to the stream</span>
<span class="legend_symbol">&#10038;</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 | &#10004; | &#9726; | &#9726; | &#9726;
| Join | | | |
| Unsubscribe | &#9726; | &#9726; | &#9726; | &#9726;
| Add others | &#9726; | &#9726; | &#9726; |
| Add others | &#9726; | &#10038; | &#10038; |
| Remove others | &#10004; | &#10038; | &#10038; | &#10038;
| See subscriber list | &#10004; | &#9726; | &#9726; | &#9726;
| See full history | &#10038; | &#10038; | &#10038; | &#10038;
@@ -110,8 +111,9 @@ for details.
<span class="legend_symbol">&#10038;</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

View File

@@ -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)

View File

@@ -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

View File

@@ -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 دقيقة",

File diff suppressed because it is too large Load Diff

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

View File

@@ -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.": "",

File diff suppressed because it is too large Load Diff

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

View File

@@ -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

View File

@@ -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

View File

@@ -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 tawelur 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

View File

@@ -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

View File

@@ -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

View File

@@ -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>.",

File diff suppressed because it is too large Load Diff

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

View File

@@ -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