Compare commits

...

56 Commits
9.0-dev ... 7.2

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
134 changed files with 69753 additions and 15525 deletions

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

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

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

@@ -16,6 +16,7 @@ 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,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

@@ -7,6 +7,62 @@ up-to-date list of all changes.
## Zulip 7.x series
### 7.2 -- 2023-07-05
- 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
@@ -158,14 +214,15 @@ 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; the documentation has
updated example configuration.
- 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

View File

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

@@ -407,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
@@ -824,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`
@@ -948,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

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

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

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

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

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": "مجتمع",
@@ -280,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": "",
@@ -347,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": "",
@@ -503,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": "الاسم الكامل",
@@ -563,7 +563,7 @@
"Invalid URL": "عنوان URL غير صالح",
"Invalid stream ID": "مُعرف غرفة غير صالح",
"Invalid time format: {timestamp}": "تنسيق الوقت غير صالح: {timestamp}",
"Invalid user": "",
"Invalid user": "مستخدم غير صالح",
"Invalid users": "",
"Invitation expires after": "تنتهي الدعوة بعد",
"Invitations": "الدعوات",
@@ -616,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": "",
@@ -700,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.": "تضييق العرض للرسائل التي تحتوي على روابط.",
@@ -713,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": "",
@@ -726,7 +726,7 @@
"Never ask on this computer": "لا تسأل أبدًا على هذا الكمبيوتر",
"Never expires": "لا تنتهي أبدًا",
"New": "جديد",
"New direct message": "",
"New direct message": "رسائلة مباشرة جديدة",
"New email": "بريد إلكتروني جديد",
"New message": "رسالة جديدة",
"New option": "خيار جديد",
@@ -738,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.": "لا روبوتات تطابق تصفيتك الحالية.",
@@ -895,7 +895,7 @@
"Rename topic": "",
"Rename topic to:": "",
"Reply @-mentioning sender": "",
"Reply directly to sender": "",
"Reply directly to sender": "رد المباشر الي المرسل",
"Reply mentioning bot": "الرد بذكر الروبوت",
"Reply mentioning user": "الرد بذكر المستخدم",
"Reply to message": "الرد على الرسالة",
@@ -956,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": "إرسال إشعارات الجوال حتى وإن كُنت متصلًا.",
@@ -1197,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": "استعراض الملف",
@@ -1257,11 +1257,11 @@
"Working…": "يعمل…",
"Write": "كتابة",
"Yes, please!": "نعم من فضلك!",
"Yes, save": "",
"Yes, schedule": "",
"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}",
@@ -1301,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.": "",
@@ -1351,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

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-31 15:33+0000\n"
"POT-Creation-Date: 2023-07-03 20:21+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -3018,7 +3018,7 @@ msgid ""
"invitation. We did send invitations to everyone else!"
msgstr ""
#: zerver/actions/message_edit.py:92 zerver/views/scheduled_messages.py:59
#: zerver/actions/message_edit.py:92 zerver/views/scheduled_messages.py:61
msgid "Nothing to change"
msgstr ""
@@ -3218,7 +3218,7 @@ msgid "Scheduled message was already sent"
msgstr ""
#: zerver/actions/scheduled_messages.py:166
#: zerver/views/scheduled_messages.py:87 zerver/views/scheduled_messages.py:127
#: zerver/views/scheduled_messages.py:89 zerver/views/scheduled_messages.py:129
msgid "Scheduled delivery time must be in the future."
msgstr ""
@@ -3330,7 +3330,7 @@ msgstr ""
#: zerver/decorator.py:662 zerver/lib/streams.py:699 zerver/lib/streams.py:725
#: zerver/lib/streams.py:727 zerver/lib/streams.py:742
#: zerver/lib/user_groups.py:34 zerver/lib/user_groups.py:41
#: zerver/lib/user_groups.py:35 zerver/lib/user_groups.py:42
#: zerver/lib/users.py:249 zerver/lib/users.py:278 zerver/views/invite.py:60
#: zerver/views/realm_emoji.py:31 zerver/views/streams.py:336
#: zerver/views/streams.py:630
@@ -4256,27 +4256,27 @@ msgstr ""
msgid "Unknown animated image format."
msgstr ""
#: zerver/lib/user_groups.py:43
#: zerver/lib/user_groups.py:44
msgid "Invalid user group"
msgstr ""
#: zerver/lib/user_groups.py:55
#: zerver/lib/user_groups.py:56
msgid "Invalid user group ID: {}"
msgstr ""
#: zerver/lib/user_groups.py:73
#: zerver/lib/user_groups.py:74
msgid "'{}' must be a system user group."
msgstr ""
#: zerver/lib/user_groups.py:77
#: zerver/lib/user_groups.py:78
msgid "'{}' setting cannot be set to '@role:internet' group."
msgstr ""
#: zerver/lib/user_groups.py:82
#: zerver/lib/user_groups.py:83
msgid "'{}' setting cannot be set to '@role:owners' group."
msgstr ""
#: zerver/lib/user_groups.py:87
#: zerver/lib/user_groups.py:88
msgid "'{}' setting cannot be set to '@role:nobody' group."
msgstr ""
@@ -4511,6 +4511,11 @@ msgstr ""
msgid "CSRF error: {reason}"
msgstr ""
#: zerver/middleware.py:628
#, python-brace-format
msgid "Reverse proxy misconfiguration: {proxy_reason}"
msgstr ""
#: zerver/models.py:500
msgid "stream events"
msgstr ""
@@ -4979,7 +4984,7 @@ msgid "Only administrators can override default emoji."
msgstr ""
#: zerver/views/realm_emoji.py:46 zerver/views/realm_icon.py:27
#: zerver/views/realm_logo.py:33 zerver/views/upload.py:275
#: zerver/views/realm_logo.py:33 zerver/views/upload.py:278
#: zerver/views/user_settings.py:352
msgid "Uploaded file is larger than the allowed limit of {} MiB"
msgstr ""
@@ -5025,11 +5030,11 @@ msgstr ""
msgid "Invalid playground"
msgstr ""
#: zerver/views/scheduled_messages.py:64
#: zerver/views/scheduled_messages.py:66
msgid "Recipient required when updating type of scheduled message."
msgstr ""
#: zerver/views/scheduled_messages.py:69
#: zerver/views/scheduled_messages.py:71
msgid "Topic required when updating scheduled message type to stream."
msgstr ""
@@ -5066,8 +5071,8 @@ msgstr ""
msgid "Stream already has that name!"
msgstr ""
#: zerver/views/streams.py:452 zerver/views/user_groups.py:107
#: zerver/views/user_groups.py:276
#: zerver/views/streams.py:452 zerver/views/user_groups.py:108
#: zerver/views/user_groups.py:285
msgid "Nothing to do. Specify at least one of \"add\" or \"delete\"."
msgstr ""
@@ -5121,7 +5126,7 @@ msgstr ""
msgid "Invalid json for submessage"
msgstr ""
#: zerver/views/thumbnail.py:43 zerver/views/upload.py:182
#: zerver/views/thumbnail.py:43 zerver/views/upload.py:185
msgid "<p>You are not authorized to view this file.</p>"
msgstr ""
@@ -5137,56 +5142,63 @@ msgstr ""
msgid "User has disabled typing notifications for direct messages"
msgstr ""
#: zerver/views/upload.py:180
#: zerver/views/upload.py:183
msgid "<p>File not found.</p>"
msgstr ""
#: zerver/views/upload.py:220
#: zerver/views/upload.py:223
msgid "Invalid token"
msgstr ""
#: zerver/views/upload.py:222
#: zerver/views/upload.py:225
msgid "Invalid filename"
msgstr ""
#: zerver/views/upload.py:265
#: zerver/views/upload.py:268
msgid "You must specify a file to upload"
msgstr ""
#: zerver/views/upload.py:267 zerver/views/users.py:424
#: zerver/views/upload.py:270 zerver/views/users.py:424
#: zerver/views/users.py:526
msgid "You may only upload one file at a time"
msgstr ""
#: zerver/views/user_groups.py:73
#: zerver/views/user_groups.py:74
msgid "No new data supplied"
msgstr ""
#: zerver/views/user_groups.py:148
#: zerver/views/user_groups.py:149
#, python-brace-format
msgid "{user_full_name} added you to the group {group_name}."
msgstr ""
#: zerver/views/user_groups.py:153
#: zerver/views/user_groups.py:154
#, python-brace-format
msgid "{user_full_name} removed you from the group {group_name}."
msgstr ""
#: zerver/views/user_groups.py:184
#: zerver/views/user_groups.py:185
#, python-brace-format
msgid "User {user_id} is already a member of this group"
msgstr ""
#: zerver/views/user_groups.py:211
#: zerver/views/user_groups.py:212
msgid "There is no member '{}' in this user group"
msgstr ""
#: zerver/views/user_groups.py:236
#: zerver/views/user_groups.py:237
#, python-brace-format
msgid "User group {group_id} is already a subgroup of this group."
msgstr ""
#: zerver/views/user_groups.py:257
#: zerver/views/user_groups.py:246
#, python-brace-format
msgid ""
"User group {user_group_id} is already a subgroup of one of the passed "
"subgroups."
msgstr ""
#: zerver/views/user_groups.py:266
#, python-brace-format
msgid "User group {group_id} is not a subgroup of this group."
msgstr ""
@@ -5449,18 +5461,18 @@ msgstr ""
msgid "Invalid data."
msgstr ""
#: zproject/backends.py:521
#: zproject/backends.py:520
msgid "You need to reset your password."
msgstr ""
#: zproject/backends.py:2203
#: zproject/backends.py:2202
msgid "Missing id_token parameter"
msgstr ""
#: zproject/backends.py:2904
#: zproject/backends.py:2903
msgid "Invalid OTP"
msgstr ""
#: zproject/backends.py:2907
#: zproject/backends.py:2906
msgid "Can't use both mobile_flow_otp and desktop_flow_otp together."
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -799,7 +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 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",
@@ -894,8 +894,8 @@
"Removed successfully.": "Removed successfully.",
"Rename topic": "Rename topic",
"Rename topic to:": "Rename topic to:",
"Reply @-mentioning sender": "",
"Reply directly to sender": "",
"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 message": "Reply to message",
@@ -1063,8 +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 is no longer scheduled for {deliver_at}.": "",
"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.",
@@ -1279,14 +1279,14 @@
"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 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 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.",

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

File diff suppressed because it is too large Load Diff

View File

@@ -348,7 +348,7 @@
"Detailed message formatting documentation": "",
"Detailed search filters documentation": "",
"Direct message": "",
"Direct messages": "",
"Direct messages": "پیام خصوصی",
"Direct messages and mentions": "",
"Direct messages are disabled in this organization.": "",
"Direct messages disabled": "",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -662,7 +662,7 @@
"Message {recipient_names}": "Message {recipient_names}",
"Message {recipient_name} ({recipient_status})": "Message {recipient_name} ({recipient_status})",
"Messages in all public streams": "Messages dans tous les canaux publics",
"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>": "Les messages ne seront pas automatiquement marqués comme lus car vous n'êtes pas dans une vue de conversation. <z-link>Modifier paramètre</z-link>",
"Messages will not be automatically marked as read. <z-link>Change setting</z-link>": "Les messages ne seront pas automatiquement marqués comme lus. <z-link>Modifier paramètre</z-link>",
"Mobile": "Mobile",
"Mobile message notifications": "Notifications de messages mobiles",

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-31 15:33+0000\n"
"POT-Creation-Date: 2023-07-03 20:21+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -3018,7 +3018,7 @@ msgid ""
"invitation. We did send invitations to everyone else!"
msgstr ""
#: zerver/actions/message_edit.py:92 zerver/views/scheduled_messages.py:59
#: zerver/actions/message_edit.py:92 zerver/views/scheduled_messages.py:61
msgid "Nothing to change"
msgstr ""
@@ -3218,7 +3218,7 @@ msgid "Scheduled message was already sent"
msgstr ""
#: zerver/actions/scheduled_messages.py:166
#: zerver/views/scheduled_messages.py:87 zerver/views/scheduled_messages.py:127
#: zerver/views/scheduled_messages.py:89 zerver/views/scheduled_messages.py:129
msgid "Scheduled delivery time must be in the future."
msgstr ""
@@ -3330,7 +3330,7 @@ msgstr ""
#: zerver/decorator.py:662 zerver/lib/streams.py:699 zerver/lib/streams.py:725
#: zerver/lib/streams.py:727 zerver/lib/streams.py:742
#: zerver/lib/user_groups.py:34 zerver/lib/user_groups.py:41
#: zerver/lib/user_groups.py:35 zerver/lib/user_groups.py:42
#: zerver/lib/users.py:249 zerver/lib/users.py:278 zerver/views/invite.py:60
#: zerver/views/realm_emoji.py:31 zerver/views/streams.py:336
#: zerver/views/streams.py:630
@@ -4256,27 +4256,27 @@ msgstr ""
msgid "Unknown animated image format."
msgstr ""
#: zerver/lib/user_groups.py:43
#: zerver/lib/user_groups.py:44
msgid "Invalid user group"
msgstr ""
#: zerver/lib/user_groups.py:55
#: zerver/lib/user_groups.py:56
msgid "Invalid user group ID: {}"
msgstr ""
#: zerver/lib/user_groups.py:73
#: zerver/lib/user_groups.py:74
msgid "'{}' must be a system user group."
msgstr ""
#: zerver/lib/user_groups.py:77
#: zerver/lib/user_groups.py:78
msgid "'{}' setting cannot be set to '@role:internet' group."
msgstr ""
#: zerver/lib/user_groups.py:82
#: zerver/lib/user_groups.py:83
msgid "'{}' setting cannot be set to '@role:owners' group."
msgstr ""
#: zerver/lib/user_groups.py:87
#: zerver/lib/user_groups.py:88
msgid "'{}' setting cannot be set to '@role:nobody' group."
msgstr ""
@@ -4511,6 +4511,11 @@ msgstr ""
msgid "CSRF error: {reason}"
msgstr ""
#: zerver/middleware.py:628
#, python-brace-format
msgid "Reverse proxy misconfiguration: {proxy_reason}"
msgstr ""
#: zerver/models.py:500
msgid "stream events"
msgstr ""
@@ -4979,7 +4984,7 @@ msgid "Only administrators can override default emoji."
msgstr ""
#: zerver/views/realm_emoji.py:46 zerver/views/realm_icon.py:27
#: zerver/views/realm_logo.py:33 zerver/views/upload.py:275
#: zerver/views/realm_logo.py:33 zerver/views/upload.py:278
#: zerver/views/user_settings.py:352
msgid "Uploaded file is larger than the allowed limit of {} MiB"
msgstr ""
@@ -5025,11 +5030,11 @@ msgstr ""
msgid "Invalid playground"
msgstr ""
#: zerver/views/scheduled_messages.py:64
#: zerver/views/scheduled_messages.py:66
msgid "Recipient required when updating type of scheduled message."
msgstr ""
#: zerver/views/scheduled_messages.py:69
#: zerver/views/scheduled_messages.py:71
msgid "Topic required when updating scheduled message type to stream."
msgstr ""
@@ -5066,8 +5071,8 @@ msgstr ""
msgid "Stream already has that name!"
msgstr ""
#: zerver/views/streams.py:452 zerver/views/user_groups.py:107
#: zerver/views/user_groups.py:276
#: zerver/views/streams.py:452 zerver/views/user_groups.py:108
#: zerver/views/user_groups.py:285
msgid "Nothing to do. Specify at least one of \"add\" or \"delete\"."
msgstr ""
@@ -5121,7 +5126,7 @@ msgstr ""
msgid "Invalid json for submessage"
msgstr ""
#: zerver/views/thumbnail.py:43 zerver/views/upload.py:182
#: zerver/views/thumbnail.py:43 zerver/views/upload.py:185
msgid "<p>You are not authorized to view this file.</p>"
msgstr ""
@@ -5137,56 +5142,63 @@ msgstr ""
msgid "User has disabled typing notifications for direct messages"
msgstr ""
#: zerver/views/upload.py:180
#: zerver/views/upload.py:183
msgid "<p>File not found.</p>"
msgstr ""
#: zerver/views/upload.py:220
#: zerver/views/upload.py:223
msgid "Invalid token"
msgstr ""
#: zerver/views/upload.py:222
#: zerver/views/upload.py:225
msgid "Invalid filename"
msgstr ""
#: zerver/views/upload.py:265
#: zerver/views/upload.py:268
msgid "You must specify a file to upload"
msgstr ""
#: zerver/views/upload.py:267 zerver/views/users.py:424
#: zerver/views/upload.py:270 zerver/views/users.py:424
#: zerver/views/users.py:526
msgid "You may only upload one file at a time"
msgstr ""
#: zerver/views/user_groups.py:73
#: zerver/views/user_groups.py:74
msgid "No new data supplied"
msgstr ""
#: zerver/views/user_groups.py:148
#: zerver/views/user_groups.py:149
#, python-brace-format
msgid "{user_full_name} added you to the group {group_name}."
msgstr ""
#: zerver/views/user_groups.py:153
#: zerver/views/user_groups.py:154
#, python-brace-format
msgid "{user_full_name} removed you from the group {group_name}."
msgstr ""
#: zerver/views/user_groups.py:184
#: zerver/views/user_groups.py:185
#, python-brace-format
msgid "User {user_id} is already a member of this group"
msgstr ""
#: zerver/views/user_groups.py:211
#: zerver/views/user_groups.py:212
msgid "There is no member '{}' in this user group"
msgstr ""
#: zerver/views/user_groups.py:236
#: zerver/views/user_groups.py:237
#, python-brace-format
msgid "User group {group_id} is already a subgroup of this group."
msgstr ""
#: zerver/views/user_groups.py:257
#: zerver/views/user_groups.py:246
#, python-brace-format
msgid ""
"User group {user_group_id} is already a subgroup of one of the passed "
"subgroups."
msgstr ""
#: zerver/views/user_groups.py:266
#, python-brace-format
msgid "User group {group_id} is not a subgroup of this group."
msgstr ""
@@ -5449,18 +5461,18 @@ msgstr ""
msgid "Invalid data."
msgstr ""
#: zproject/backends.py:521
#: zproject/backends.py:520
msgid "You need to reset your password."
msgstr ""
#: zproject/backends.py:2203
#: zproject/backends.py:2202
msgid "Missing id_token parameter"
msgstr ""
#: zproject/backends.py:2904
#: zproject/backends.py:2903
msgid "Invalid OTP"
msgstr ""
#: zproject/backends.py:2907
#: zproject/backends.py:2906
msgid "Can't use both mobile_flow_otp and desktop_flow_otp together."
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -894,8 +894,8 @@
"Removed successfully.": "Rimosso con successo.",
"Rename topic": "Rinomina argomento",
"Rename topic to:": "Rinomina argomento in:",
"Reply @-mentioning sender": "",
"Reply directly to sender": "",
"Reply @-mentioning sender": "Rispondi @-menzionando il mittente",
"Reply directly to sender": "Rispondi direttamente al mittente",
"Reply mentioning bot": "Rispondi citando bot",
"Reply mentioning user": "Rispondi menzionando l'utente",
"Reply to message": "Rispondi al messaggio",

File diff suppressed because it is too large Load Diff

View File

@@ -91,7 +91,7 @@
"Add members": "メンバーを追加",
"Add member…": "メンバーを追加",
"Add new default stream": "新しいデフォルトのストリームを追加",
"Add new user group": "",
"Add new user group": "新規ユーザーグループを追加",
"Add one or more users": "ユーザーを追加",
"Add option": "",
"Add question": "質問追加",
@@ -174,8 +174,8 @@
"Author": "著者",
"Automated messages and emails": "自動メッセージとメール",
"Automatic": "自動",
"Automatic (follows system settings)": "",
"Automatically mark messages as read": "",
"Automatic (follows system settings)": "自動 (システム設定に従い)",
"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.": "",
"Avatar changes are disabled in this organization": "",
"Avatar from Gravatar": "Gravatarのプロフィール画像",
@@ -230,7 +230,7 @@
"Collapse/show selected message": "選択したメッセージを折り畳む/表示",
"Community": "コミュニティー",
"Commuting": "通勤中",
"Compact": "",
"Compact": "最小",
"Complete": "完了",
"Complete the <z-link>organization profile</z-link> to brand and explain the purpose of this Zulip organization.": "",
"Compose message": "メッセージを作成",
@@ -283,7 +283,7 @@
"DIRECT MESSAGES": "ダイレクトメッセージ",
"DM": "",
"DMs, mentions, and alerts": "",
"Dark": "",
"Dark": "ダーク",
"Dark theme": "ダークテーマ",
"Dark theme logo": "",
"Data exports": "データのエクスポート",
@@ -293,7 +293,7 @@
"Day of the week to send digests": "ダイジェストを送信する曜日",
"Deactivate": "無効",
"Deactivate account": "アカウントを無効化",
"Deactivate bot": "",
"Deactivate bot": "ボットを無効",
"Deactivate custom emoji?": "カスタム絵文字を無効にしますか?",
"Deactivate organization": "組織を無効にする",
"Deactivate user": "",
@@ -347,7 +347,7 @@
"Detailed keyboard shortcuts documentation": "キーボードショートカットの詳細なドキュメント",
"Detailed message formatting documentation": "メッセージの記述方法の詳細ドキュメント",
"Detailed search filters documentation": "検索フィルターの詳細なドキュメント",
"Direct message": "",
"Direct message": "ダイレクトメッセージ",
"Direct messages": "ダイレクトメッセージ",
"Direct messages and mentions": "ダイレクトメッセージとメンション",
"Direct messages are disabled in this organization.": "この組織では、ダイレクトメッセージが無効化されています。",
@@ -417,7 +417,7 @@
"Emoji theme": "絵文字のテーマ",
"Enable message edit history": "メッセージの編集履歴を有効にする",
"Enable notifications": "通知を有効",
"Enable read receipts": "",
"Enable read receipts": "開封確認を有効する",
"Enabled": "有効",
"End of results from your <z-link>history</z-link>.": "あなたの<z-link>履歴</z-link>からの結果は以上です",
"Endpoint URL": "エンドポイント URL",
@@ -440,7 +440,7 @@
"Error saving edit": "編集内容の保存に失敗しました",
"Error: Cannot deactivate the only organization owner.": "Error:組織の所有者は最低1名存在している必要があります。",
"Error: Cannot deactivate the only user. You can deactivate the whole organization though in your <z-link>organization profile settings</z-link>.": "",
"Escape key navigates to default view": "",
"Escape key navigates to default view": "Escキーでデフォルト表示に移動する ",
"Estimated messages per week": "推定週間メッセージ数",
"Event or conference": "イベント・会議",
"Everyone": "全員",
@@ -551,7 +551,7 @@
"Inactive": "非アクティブ",
"Inactive bots": "非アクティブなボット",
"Include DMs": "ダイレクトメッセージを含める",
"Include content of direct messages in desktop notifications": "",
"Include content of direct messages in desktop notifications": "DM内容をデスクトップ通知に含む ",
"Include message content in message notification emails": "通知メールにメッセージ内容を含める",
"Include muted": "ミュート済みのメッセージを含める",
"Include organization name in subject of message notification emails": "新規メッセージ受信を知らせる通知メールのタイトルに組織名を含める",
@@ -608,7 +608,7 @@
"Let others see when I've read messages": "",
"Let recipients see when I'm typing direct messages": "",
"Let subscribers see when I'm typing messages in streams": "入力中であることを、ストリームのフォロワーに表示する",
"Light": "",
"Light": "ライト",
"Light theme": "ライトモード",
"Light theme logo": "",
"Link": "リンク",
@@ -781,7 +781,7 @@
"Notifications": "通知",
"Notifications for @all/@everyone mentions": "@allと@everyoneの通知",
"Notify recipients": "",
"Notify stream": "",
"Notify stream": "ストリームを通知する",
"Notify this user by email?": "",
"November": "11月",
"October": "10月",
@@ -884,7 +884,7 @@
"Reactivate this bot": "このボットを再有効化",
"Reactivate this user": "",
"Reactivate {name}": "",
"Read receipts": "",
"Read receipts": "開封確認",
"Read receipts are currently disabled in this organization.": "この組織では現在、既読表示が無効化されています。",
"Read receipts are not available for Notification Bot messages.": "",
"Receives new stream announcements": "",
@@ -962,8 +962,8 @@
"Send later": "",
"Send me Zulip's low-traffic newsletter (a few emails a year)": "Zulip のニュースレターを受け取る(年に数回)",
"Send message": "メッセージを送信",
"Send mobile notifications even if I'm online": "",
"Send mobile notifications even if user is online": "",
"Send mobile notifications even if I'm online": "オンライン時でもモバイル通知を送信する",
"Send mobile notifications even if user is online": "オンライン時でもモバイル通知を送信する",
"Send weekly digest emails to inactive users": "活動していないユーザーに毎週ダイジェストのメールを送信する",
"Sent!": "送信しました!",
"Sent! Your message is outside your current narrow.": "送信しました。送信したメッセージは、現在の画面では表示されません。",
@@ -1080,7 +1080,7 @@
"This organization is configured so that nobody can invite users to this organization.": "",
"This organization is configured so that only administrators can add bots.": "",
"This organization is configured so that only administrators can add custom emoji.": "",
"This organization is configured so that only administrators can add generic bots.": "",
"This organization is configured so that only administrators can add generic bots.": "この組織は管理者のみが汎用ボットを追加できるように設定しています。",
"This organization is configured so that only administrators can modify user groups.": "",
"This organization is configured to restrict editing of message content to {minutes_to_edit} minutes after it is sent.": "この組織は、送信後{minutes_to_edit}分間メッセージの編集ができないように設定されています。",
"This stream does not exist or is private.": "このストリームは存在しないか、非公開です。",
@@ -1141,7 +1141,7 @@
"Unmuted": "",
"Unpin stream from top": "ストリームの固定を解除する",
"Unread": "未読",
"Unread count badge (appears in desktop sidebar and browser tab)": "",
"Unread count badge (appears in desktop sidebar and browser tab)": "未読件数バッジ (デスクトップサイドバーとブラウザータブに表示)",
"Unread messages": "",
"Unresolve topic": "トピックを未解決にする",
"Unstar": "スターを外す",
@@ -1192,7 +1192,7 @@
"User(s) invited successfully.": "ユーザーを招待しました。",
"User(s) join as": "ユーザー(たち) の権限",
"Users": "ユーザー",
"Users can always disable their personal read receipts.": "",
"Users can always disable their personal read receipts.": "ユーザーが自分の開封確認をいつでも無効にできます。",
"Vacationing": "休暇中",
"Version {zulip_version}": "バージョン {zulip_version}",
"Video call provider": "ビデオ通話サービス",
@@ -1208,7 +1208,7 @@
"View messages sent": "送信済みメッセージを表示",
"View messages with yourself": "",
"View profile": "プロフィールを見る",
"View read receipts": "",
"View read receipts": "開封を確認",
"View recent conversations": "",
"View scheduled messages": "",
"View stream": "ストリームを表示",
@@ -1343,7 +1343,7 @@
"[Configure]": "[設定]",
"[Disable]": "[無効]",
"[More…]": "[さらに表示]",
"[Quoting…]": "",
"[Quoting…]": "[引用中...]",
"[Unset]": "[未設定]",
"and {remaining_senders, plural, one {1 other} other {# others}}.": "",
"back to streams": "",
@@ -1385,6 +1385,6 @@
"{num_of_people, plural, one {This message has been <z-link>read</z-link> by {num_of_people} person:} other {This message has been <z-link>read</z-link> by {num_of_people} people:}}": "{num_of_people, plural, other {{num_of_people} 人がこのメッセージを<z-link>読みました</z-link>}}",
"{seconds} sec to edit": "{seconds}秒前",
"{user_time} local time": "",
"{username} [said]({link_to_message}):": "",
"{username} [said]({link_to_message}):": "{username} [said]({link_to_message}):",
"{username} reacted with {emoji_name}": "{username} が {emoji_name} で反応しました"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1390
locale/lv/translations.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Zulip\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-31 15:33+0000\n"
"POT-Creation-Date: 2023-07-03 20:21+0000\n"
"PO-Revision-Date: 2021-05-27 07:08+0000\n"
"Last-Translator: Akash Nimare <svnitakash@gmail.com>\n"
"Language-Team: Malayalam (http://www.transifex.com/zulip/zulip/language/"
@@ -3099,7 +3099,7 @@ msgid ""
"invitation. We did send invitations to everyone else!"
msgstr ""
#: zerver/actions/message_edit.py:92 zerver/views/scheduled_messages.py:59
#: zerver/actions/message_edit.py:92 zerver/views/scheduled_messages.py:61
msgid "Nothing to change"
msgstr ""
@@ -3307,7 +3307,7 @@ msgid "Scheduled message was already sent"
msgstr ""
#: zerver/actions/scheduled_messages.py:166
#: zerver/views/scheduled_messages.py:87 zerver/views/scheduled_messages.py:127
#: zerver/views/scheduled_messages.py:89 zerver/views/scheduled_messages.py:129
msgid "Scheduled delivery time must be in the future."
msgstr ""
@@ -3419,7 +3419,7 @@ msgstr ""
#: zerver/decorator.py:662 zerver/lib/streams.py:699 zerver/lib/streams.py:725
#: zerver/lib/streams.py:727 zerver/lib/streams.py:742
#: zerver/lib/user_groups.py:34 zerver/lib/user_groups.py:41
#: zerver/lib/user_groups.py:35 zerver/lib/user_groups.py:42
#: zerver/lib/users.py:249 zerver/lib/users.py:278 zerver/views/invite.py:60
#: zerver/views/realm_emoji.py:31 zerver/views/streams.py:336
#: zerver/views/streams.py:630
@@ -4347,27 +4347,27 @@ msgstr ""
msgid "Unknown animated image format."
msgstr ""
#: zerver/lib/user_groups.py:43
#: zerver/lib/user_groups.py:44
msgid "Invalid user group"
msgstr ""
#: zerver/lib/user_groups.py:55
#: zerver/lib/user_groups.py:56
msgid "Invalid user group ID: {}"
msgstr ""
#: zerver/lib/user_groups.py:73
#: zerver/lib/user_groups.py:74
msgid "'{}' must be a system user group."
msgstr ""
#: zerver/lib/user_groups.py:77
#: zerver/lib/user_groups.py:78
msgid "'{}' setting cannot be set to '@role:internet' group."
msgstr ""
#: zerver/lib/user_groups.py:82
#: zerver/lib/user_groups.py:83
msgid "'{}' setting cannot be set to '@role:owners' group."
msgstr ""
#: zerver/lib/user_groups.py:87
#: zerver/lib/user_groups.py:88
msgid "'{}' setting cannot be set to '@role:nobody' group."
msgstr ""
@@ -4602,6 +4602,11 @@ msgstr ""
msgid "CSRF error: {reason}"
msgstr ""
#: zerver/middleware.py:628
#, python-brace-format
msgid "Reverse proxy misconfiguration: {proxy_reason}"
msgstr ""
#: zerver/models.py:500
msgid "stream events"
msgstr ""
@@ -5082,7 +5087,7 @@ msgid "Only administrators can override default emoji."
msgstr ""
#: zerver/views/realm_emoji.py:46 zerver/views/realm_icon.py:27
#: zerver/views/realm_logo.py:33 zerver/views/upload.py:275
#: zerver/views/realm_logo.py:33 zerver/views/upload.py:278
#: zerver/views/user_settings.py:352
msgid "Uploaded file is larger than the allowed limit of {} MiB"
msgstr ""
@@ -5128,11 +5133,11 @@ msgstr ""
msgid "Invalid playground"
msgstr ""
#: zerver/views/scheduled_messages.py:64
#: zerver/views/scheduled_messages.py:66
msgid "Recipient required when updating type of scheduled message."
msgstr ""
#: zerver/views/scheduled_messages.py:69
#: zerver/views/scheduled_messages.py:71
msgid "Topic required when updating scheduled message type to stream."
msgstr ""
@@ -5169,8 +5174,8 @@ msgstr ""
msgid "Stream already has that name!"
msgstr ""
#: zerver/views/streams.py:452 zerver/views/user_groups.py:107
#: zerver/views/user_groups.py:276
#: zerver/views/streams.py:452 zerver/views/user_groups.py:108
#: zerver/views/user_groups.py:285
msgid "Nothing to do. Specify at least one of \"add\" or \"delete\"."
msgstr ""
@@ -5224,7 +5229,7 @@ msgstr ""
msgid "Invalid json for submessage"
msgstr ""
#: zerver/views/thumbnail.py:43 zerver/views/upload.py:182
#: zerver/views/thumbnail.py:43 zerver/views/upload.py:185
msgid "<p>You are not authorized to view this file.</p>"
msgstr ""
@@ -5240,56 +5245,63 @@ msgstr ""
msgid "User has disabled typing notifications for direct messages"
msgstr ""
#: zerver/views/upload.py:180
#: zerver/views/upload.py:183
msgid "<p>File not found.</p>"
msgstr ""
#: zerver/views/upload.py:220
#: zerver/views/upload.py:223
msgid "Invalid token"
msgstr ""
#: zerver/views/upload.py:222
#: zerver/views/upload.py:225
msgid "Invalid filename"
msgstr ""
#: zerver/views/upload.py:265
#: zerver/views/upload.py:268
msgid "You must specify a file to upload"
msgstr ""
#: zerver/views/upload.py:267 zerver/views/users.py:424
#: zerver/views/upload.py:270 zerver/views/users.py:424
#: zerver/views/users.py:526
msgid "You may only upload one file at a time"
msgstr ""
#: zerver/views/user_groups.py:73
#: zerver/views/user_groups.py:74
msgid "No new data supplied"
msgstr ""
#: zerver/views/user_groups.py:148
#: zerver/views/user_groups.py:149
#, python-brace-format
msgid "{user_full_name} added you to the group {group_name}."
msgstr ""
#: zerver/views/user_groups.py:153
#: zerver/views/user_groups.py:154
#, python-brace-format
msgid "{user_full_name} removed you from the group {group_name}."
msgstr ""
#: zerver/views/user_groups.py:184
#: zerver/views/user_groups.py:185
#, python-brace-format
msgid "User {user_id} is already a member of this group"
msgstr ""
#: zerver/views/user_groups.py:211
#: zerver/views/user_groups.py:212
msgid "There is no member '{}' in this user group"
msgstr ""
#: zerver/views/user_groups.py:236
#: zerver/views/user_groups.py:237
#, python-brace-format
msgid "User group {group_id} is already a subgroup of this group."
msgstr ""
#: zerver/views/user_groups.py:257
#: zerver/views/user_groups.py:246
#, python-brace-format
msgid ""
"User group {user_group_id} is already a subgroup of one of the passed "
"subgroups."
msgstr ""
#: zerver/views/user_groups.py:266
#, python-brace-format
msgid "User group {group_id} is not a subgroup of this group."
msgstr ""
@@ -5552,19 +5564,19 @@ msgstr ""
msgid "Invalid data."
msgstr ""
#: zproject/backends.py:521
#: zproject/backends.py:520
msgid "You need to reset your password."
msgstr ""
#: zproject/backends.py:2203
#: zproject/backends.py:2202
msgid "Missing id_token parameter"
msgstr ""
#: zproject/backends.py:2904
#: zproject/backends.py:2903
msgid "Invalid OTP"
msgstr ""
#: zproject/backends.py:2907
#: zproject/backends.py:2906
msgid "Can't use both mobile_flow_otp and desktop_flow_otp together."
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -1,12 +1,16 @@
{
"ar": {
"not_translated": 120,
"not_translated": 102,
"total": 388
},
"bg": {
"not_translated": 283,
"total": 388
},
"bqi": {
"not_translated": 321,
"total": 388
},
"ca": {
"not_translated": 174,
"total": 388
@@ -36,7 +40,7 @@
"total": 388
},
"fa": {
"not_translated": 239,
"not_translated": 238,
"total": 388
},
"fi": {
@@ -120,13 +124,17 @@
"total": 388
},
"sv": {
"not_translated": 334,
"not_translated": 333,
"total": 388
},
"ta": {
"not_translated": 326,
"total": 388
},
"tl": {
"not_translated": 365,
"total": 388
},
"tr": {
"not_translated": 88,
"total": 388

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-31 15:33+0000\n"
"POT-Creation-Date: 2023-07-03 20:21+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -3017,7 +3017,7 @@ msgid ""
"invitation. We did send invitations to everyone else!"
msgstr ""
#: zerver/actions/message_edit.py:92 zerver/views/scheduled_messages.py:59
#: zerver/actions/message_edit.py:92 zerver/views/scheduled_messages.py:61
msgid "Nothing to change"
msgstr ""
@@ -3217,7 +3217,7 @@ msgid "Scheduled message was already sent"
msgstr ""
#: zerver/actions/scheduled_messages.py:166
#: zerver/views/scheduled_messages.py:87 zerver/views/scheduled_messages.py:127
#: zerver/views/scheduled_messages.py:89 zerver/views/scheduled_messages.py:129
msgid "Scheduled delivery time must be in the future."
msgstr ""
@@ -3329,7 +3329,7 @@ msgstr ""
#: zerver/decorator.py:662 zerver/lib/streams.py:699 zerver/lib/streams.py:725
#: zerver/lib/streams.py:727 zerver/lib/streams.py:742
#: zerver/lib/user_groups.py:34 zerver/lib/user_groups.py:41
#: zerver/lib/user_groups.py:35 zerver/lib/user_groups.py:42
#: zerver/lib/users.py:249 zerver/lib/users.py:278 zerver/views/invite.py:60
#: zerver/views/realm_emoji.py:31 zerver/views/streams.py:336
#: zerver/views/streams.py:630
@@ -4255,27 +4255,27 @@ msgstr ""
msgid "Unknown animated image format."
msgstr ""
#: zerver/lib/user_groups.py:43
#: zerver/lib/user_groups.py:44
msgid "Invalid user group"
msgstr ""
#: zerver/lib/user_groups.py:55
#: zerver/lib/user_groups.py:56
msgid "Invalid user group ID: {}"
msgstr ""
#: zerver/lib/user_groups.py:73
#: zerver/lib/user_groups.py:74
msgid "'{}' must be a system user group."
msgstr ""
#: zerver/lib/user_groups.py:77
#: zerver/lib/user_groups.py:78
msgid "'{}' setting cannot be set to '@role:internet' group."
msgstr ""
#: zerver/lib/user_groups.py:82
#: zerver/lib/user_groups.py:83
msgid "'{}' setting cannot be set to '@role:owners' group."
msgstr ""
#: zerver/lib/user_groups.py:87
#: zerver/lib/user_groups.py:88
msgid "'{}' setting cannot be set to '@role:nobody' group."
msgstr ""
@@ -4510,6 +4510,11 @@ msgstr ""
msgid "CSRF error: {reason}"
msgstr ""
#: zerver/middleware.py:628
#, python-brace-format
msgid "Reverse proxy misconfiguration: {proxy_reason}"
msgstr ""
#: zerver/models.py:500
msgid "stream events"
msgstr ""
@@ -4978,7 +4983,7 @@ msgid "Only administrators can override default emoji."
msgstr ""
#: zerver/views/realm_emoji.py:46 zerver/views/realm_icon.py:27
#: zerver/views/realm_logo.py:33 zerver/views/upload.py:275
#: zerver/views/realm_logo.py:33 zerver/views/upload.py:278
#: zerver/views/user_settings.py:352
msgid "Uploaded file is larger than the allowed limit of {} MiB"
msgstr ""
@@ -5024,11 +5029,11 @@ msgstr ""
msgid "Invalid playground"
msgstr ""
#: zerver/views/scheduled_messages.py:64
#: zerver/views/scheduled_messages.py:66
msgid "Recipient required when updating type of scheduled message."
msgstr ""
#: zerver/views/scheduled_messages.py:69
#: zerver/views/scheduled_messages.py:71
msgid "Topic required when updating scheduled message type to stream."
msgstr ""
@@ -5065,8 +5070,8 @@ msgstr ""
msgid "Stream already has that name!"
msgstr ""
#: zerver/views/streams.py:452 zerver/views/user_groups.py:107
#: zerver/views/user_groups.py:276
#: zerver/views/streams.py:452 zerver/views/user_groups.py:108
#: zerver/views/user_groups.py:285
msgid "Nothing to do. Specify at least one of \"add\" or \"delete\"."
msgstr ""
@@ -5120,7 +5125,7 @@ msgstr ""
msgid "Invalid json for submessage"
msgstr ""
#: zerver/views/thumbnail.py:43 zerver/views/upload.py:182
#: zerver/views/thumbnail.py:43 zerver/views/upload.py:185
msgid "<p>You are not authorized to view this file.</p>"
msgstr ""
@@ -5136,56 +5141,63 @@ msgstr ""
msgid "User has disabled typing notifications for direct messages"
msgstr ""
#: zerver/views/upload.py:180
#: zerver/views/upload.py:183
msgid "<p>File not found.</p>"
msgstr ""
#: zerver/views/upload.py:220
#: zerver/views/upload.py:223
msgid "Invalid token"
msgstr ""
#: zerver/views/upload.py:222
#: zerver/views/upload.py:225
msgid "Invalid filename"
msgstr ""
#: zerver/views/upload.py:265
#: zerver/views/upload.py:268
msgid "You must specify a file to upload"
msgstr ""
#: zerver/views/upload.py:267 zerver/views/users.py:424
#: zerver/views/upload.py:270 zerver/views/users.py:424
#: zerver/views/users.py:526
msgid "You may only upload one file at a time"
msgstr ""
#: zerver/views/user_groups.py:73
#: zerver/views/user_groups.py:74
msgid "No new data supplied"
msgstr ""
#: zerver/views/user_groups.py:148
#: zerver/views/user_groups.py:149
#, python-brace-format
msgid "{user_full_name} added you to the group {group_name}."
msgstr ""
#: zerver/views/user_groups.py:153
#: zerver/views/user_groups.py:154
#, python-brace-format
msgid "{user_full_name} removed you from the group {group_name}."
msgstr ""
#: zerver/views/user_groups.py:184
#: zerver/views/user_groups.py:185
#, python-brace-format
msgid "User {user_id} is already a member of this group"
msgstr ""
#: zerver/views/user_groups.py:211
#: zerver/views/user_groups.py:212
msgid "There is no member '{}' in this user group"
msgstr ""
#: zerver/views/user_groups.py:236
#: zerver/views/user_groups.py:237
#, python-brace-format
msgid "User group {group_id} is already a subgroup of this group."
msgstr ""
#: zerver/views/user_groups.py:257
#: zerver/views/user_groups.py:246
#, python-brace-format
msgid ""
"User group {user_group_id} is already a subgroup of one of the passed "
"subgroups."
msgstr ""
#: zerver/views/user_groups.py:266
#, python-brace-format
msgid "User group {group_id} is not a subgroup of this group."
msgstr ""
@@ -5448,18 +5460,18 @@ msgstr ""
msgid "Invalid data."
msgstr ""
#: zproject/backends.py:521
#: zproject/backends.py:520
msgid "You need to reset your password."
msgstr ""
#: zproject/backends.py:2203
#: zproject/backends.py:2202
msgid "Missing id_token parameter"
msgstr ""
#: zproject/backends.py:2904
#: zproject/backends.py:2903
msgid "Invalid OTP"
msgstr ""
#: zproject/backends.py:2907
#: zproject/backends.py:2906
msgid "Can't use both mobile_flow_otp and desktop_flow_otp together."
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -348,7 +348,7 @@
"Detailed message formatting documentation": "",
"Detailed search filters documentation": "",
"Direct message": "",
"Direct messages": "",
"Direct messages": "Direktmeddelanden",
"Direct messages and mentions": "",
"Direct messages are disabled in this organization.": "",
"Direct messages disabled": "",

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Zulip\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-31 15:33+0000\n"
"POT-Creation-Date: 2023-07-03 20:21+0000\n"
"PO-Revision-Date: 2018-04-11 21:06+0000\n"
"Last-Translator: Tim Abbott <tabbott@kandralabs.com>\n"
"Language-Team: Tamil (http://www.transifex.com/zulip/zulip/language/ta/)\n"
@@ -3101,7 +3101,7 @@ msgid ""
"invitation. We did send invitations to everyone else!"
msgstr ""
#: zerver/actions/message_edit.py:92 zerver/views/scheduled_messages.py:59
#: zerver/actions/message_edit.py:92 zerver/views/scheduled_messages.py:61
msgid "Nothing to change"
msgstr ""
@@ -3313,7 +3313,7 @@ msgid "Scheduled message was already sent"
msgstr ""
#: zerver/actions/scheduled_messages.py:166
#: zerver/views/scheduled_messages.py:87 zerver/views/scheduled_messages.py:127
#: zerver/views/scheduled_messages.py:89 zerver/views/scheduled_messages.py:129
msgid "Scheduled delivery time must be in the future."
msgstr ""
@@ -3425,7 +3425,7 @@ msgstr ""
#: zerver/decorator.py:662 zerver/lib/streams.py:699 zerver/lib/streams.py:725
#: zerver/lib/streams.py:727 zerver/lib/streams.py:742
#: zerver/lib/user_groups.py:34 zerver/lib/user_groups.py:41
#: zerver/lib/user_groups.py:35 zerver/lib/user_groups.py:42
#: zerver/lib/users.py:249 zerver/lib/users.py:278 zerver/views/invite.py:60
#: zerver/views/realm_emoji.py:31 zerver/views/streams.py:336
#: zerver/views/streams.py:630
@@ -4379,29 +4379,29 @@ msgstr ""
msgid "Unknown animated image format."
msgstr ""
#: zerver/lib/user_groups.py:43
#: zerver/lib/user_groups.py:44
msgid "Invalid user group"
msgstr ""
#: zerver/lib/user_groups.py:55
#: zerver/lib/user_groups.py:56
#, fuzzy
#| msgid "Enable notifications"
msgid "Invalid user group ID: {}"
msgstr "அறிவிப்புகளை இயக்கு"
#: zerver/lib/user_groups.py:73
#: zerver/lib/user_groups.py:74
msgid "'{}' must be a system user group."
msgstr ""
#: zerver/lib/user_groups.py:77
#: zerver/lib/user_groups.py:78
msgid "'{}' setting cannot be set to '@role:internet' group."
msgstr ""
#: zerver/lib/user_groups.py:82
#: zerver/lib/user_groups.py:83
msgid "'{}' setting cannot be set to '@role:owners' group."
msgstr ""
#: zerver/lib/user_groups.py:87
#: zerver/lib/user_groups.py:88
msgid "'{}' setting cannot be set to '@role:nobody' group."
msgstr ""
@@ -4643,6 +4643,11 @@ msgstr ""
msgid "CSRF error: {reason}"
msgstr ""
#: zerver/middleware.py:628
#, python-brace-format
msgid "Reverse proxy misconfiguration: {proxy_reason}"
msgstr ""
#: zerver/models.py:500
#, fuzzy
#| msgid "Username"
@@ -5147,7 +5152,7 @@ msgid "Only administrators can override default emoji."
msgstr "நிர்வாகிகள்"
#: zerver/views/realm_emoji.py:46 zerver/views/realm_icon.py:27
#: zerver/views/realm_logo.py:33 zerver/views/upload.py:275
#: zerver/views/realm_logo.py:33 zerver/views/upload.py:278
#: zerver/views/user_settings.py:352
msgid "Uploaded file is larger than the allowed limit of {} MiB"
msgstr ""
@@ -5195,11 +5200,11 @@ msgstr ""
msgid "Invalid playground"
msgstr "அறிவிப்புகளை இயக்கு"
#: zerver/views/scheduled_messages.py:64
#: zerver/views/scheduled_messages.py:66
msgid "Recipient required when updating type of scheduled message."
msgstr ""
#: zerver/views/scheduled_messages.py:69
#: zerver/views/scheduled_messages.py:71
msgid "Topic required when updating scheduled message type to stream."
msgstr ""
@@ -5240,8 +5245,8 @@ msgstr ""
msgid "Stream already has that name!"
msgstr ""
#: zerver/views/streams.py:452 zerver/views/user_groups.py:107
#: zerver/views/user_groups.py:276
#: zerver/views/streams.py:452 zerver/views/user_groups.py:108
#: zerver/views/user_groups.py:285
msgid "Nothing to do. Specify at least one of \"add\" or \"delete\"."
msgstr ""
@@ -5297,7 +5302,7 @@ msgstr ""
msgid "Invalid json for submessage"
msgstr ""
#: zerver/views/thumbnail.py:43 zerver/views/upload.py:182
#: zerver/views/thumbnail.py:43 zerver/views/upload.py:185
msgid "<p>You are not authorized to view this file.</p>"
msgstr ""
@@ -5313,56 +5318,63 @@ msgstr ""
msgid "User has disabled typing notifications for direct messages"
msgstr ""
#: zerver/views/upload.py:180
#: zerver/views/upload.py:183
msgid "<p>File not found.</p>"
msgstr ""
#: zerver/views/upload.py:220
#: zerver/views/upload.py:223
msgid "Invalid token"
msgstr ""
#: zerver/views/upload.py:222
#: zerver/views/upload.py:225
msgid "Invalid filename"
msgstr ""
#: zerver/views/upload.py:265
#: zerver/views/upload.py:268
msgid "You must specify a file to upload"
msgstr ""
#: zerver/views/upload.py:267 zerver/views/users.py:424
#: zerver/views/upload.py:270 zerver/views/users.py:424
#: zerver/views/users.py:526
msgid "You may only upload one file at a time"
msgstr ""
#: zerver/views/user_groups.py:73
#: zerver/views/user_groups.py:74
msgid "No new data supplied"
msgstr ""
#: zerver/views/user_groups.py:148
#: zerver/views/user_groups.py:149
#, python-brace-format
msgid "{user_full_name} added you to the group {group_name}."
msgstr ""
#: zerver/views/user_groups.py:153
#: zerver/views/user_groups.py:154
#, python-brace-format
msgid "{user_full_name} removed you from the group {group_name}."
msgstr ""
#: zerver/views/user_groups.py:184
#: zerver/views/user_groups.py:185
#, python-brace-format
msgid "User {user_id} is already a member of this group"
msgstr ""
#: zerver/views/user_groups.py:211
#: zerver/views/user_groups.py:212
msgid "There is no member '{}' in this user group"
msgstr ""
#: zerver/views/user_groups.py:236
#: zerver/views/user_groups.py:237
#, python-brace-format
msgid "User group {group_id} is already a subgroup of this group."
msgstr ""
#: zerver/views/user_groups.py:257
#: zerver/views/user_groups.py:246
#, python-brace-format
msgid ""
"User group {user_group_id} is already a subgroup of one of the passed "
"subgroups."
msgstr ""
#: zerver/views/user_groups.py:266
#, python-brace-format
msgid "User group {group_id} is not a subgroup of this group."
msgstr ""
@@ -5633,19 +5645,19 @@ msgstr ""
msgid "Invalid data."
msgstr ""
#: zproject/backends.py:521
#: zproject/backends.py:520
msgid "You need to reset your password."
msgstr ""
#: zproject/backends.py:2203
#: zproject/backends.py:2202
msgid "Missing id_token parameter"
msgstr ""
#: zproject/backends.py:2904
#: zproject/backends.py:2903
msgid "Invalid OTP"
msgstr ""
#: zproject/backends.py:2907
#: zproject/backends.py:2906
msgid "Can't use both mobile_flow_otp and desktop_flow_otp together."
msgstr ""

File diff suppressed because it is too large Load Diff

1390
locale/tl/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

@@ -1382,7 +1382,7 @@
"{minutes} min to edit": "Düzenlemek için {minutes} dakika",
"{minutes} minutes ago": "{minutes} dakika önce",
"{modal_heading_text}": "",
"{num_of_people, plural, one {This message has been <z-link>read</z-link> by {num_of_people} person:} other {This message has been <z-link>read</z-link> by {num_of_people} people:}}": "{num_of_people, plural, one {} other {}}",
"{num_of_people, plural, one {This message has been <z-link>read</z-link> by {num_of_people} person:} other {This message has been <z-link>read</z-link> by {num_of_people} people:}}": "{num_of_people, plural, one {Bu mesaj {num_of_people} kişi tarafından <z-link>okunmuştur</z-link> :} other {Bu mesaj {num_of_people} kişi tarafından <z-link>okunmuştur</z-link>:}}",
"{seconds} sec to edit": "Düzenlemek için {seconds} saniye",
"{user_time} local time": "",
"{username} [said]({link_to_message}):": "{username} [dedi]({link_to_message}):",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1382,7 +1382,7 @@
"{minutes} min to edit": "{minutes} tối thiểu để chỉnh sửa",
"{minutes} minutes ago": "{minutes} một vài phút trước",
"{modal_heading_text}": "",
"{num_of_people, plural, one {This message has been <z-link>read</z-link> by {num_of_people} person:} other {This message has been <z-link>read</z-link> by {num_of_people} people:}}": "{num_of_people, plural, other {}}",
"{num_of_people, plural, one {This message has been <z-link>read</z-link> by {num_of_people} person:} other {This message has been <z-link>read</z-link> by {num_of_people} people:}}": "{num_of_people, plural, other {Tin nhắn này đã được<z-link> đọc</z-link> bởi {num_of_people} người:}}",
"{seconds} sec to edit": "{seconds} giây để chỉnh sửa",
"{user_time} local time": "",
"{username} [said]({link_to_message}):": "",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -650,7 +650,7 @@
"Menus": "選單",
"Message #{stream_name}": "",
"Message #{stream_name} > {topic_name}": "",
"Message actions": "",
"Message actions": "訊息動作",
"Message deletion": "",
"Message edit history": "訊息編輯歷史",
"Message editing": "訊息編輯",

View File

@@ -16,5 +16,6 @@ uwsgi_param SERVER_NAME $server_name;
uwsgi_param HTTP_X_REAL_IP $remote_addr;
uwsgi_param HTTP_X_FORWARDED_PROTO $trusted_x_forwarded_proto;
uwsgi_param HTTP_X_FORWARDED_SSL "";
uwsgi_param HTTP_X_PROXY_MISCONFIGURATION $x_proxy_misconfiguration;
uwsgi_pass django;

View File

@@ -6,5 +6,6 @@ proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $trusted_x_forwarded_proto;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Proxy-Misconfiguration $x_proxy_misconfiguration;
proxy_next_upstream off;
proxy_redirect off;

View File

@@ -23,13 +23,6 @@ location ~ ^/internal/s3/(?<s3_hostname>[^/]+)/(?<s3_path>.*) {
# the first response. Django explicitly unsets the first, and
# does not set the latter two.
# nginx does its own DNS resolution, which is necessary here to
# resolve the IP of the S3 server. Point it at the local caching
# systemd resolved service. The validity duration is set to match
# S3's DNS validity.
resolver 127.0.0.53 valid=300s;
resolver_timeout 10s;
proxy_pass $download_url$is_args$args;
proxy_cache uploads;
# If the S3 response doesn't contain Cache-Control headers (which

View File

@@ -0,0 +1,16 @@
require "resolv"
Puppet::Functions.create_function(:resolver_ip) do
def resolver_ip()
parsed = Resolv::DNS::Config.default_config_hash()
if parsed[:nameserver].empty?
raise 'No nameservers found in /etc/resolv.conf! Configure one by setting application_server.nameserver in /etc/zulip/zulip.conf'
end
resolver = parsed[:nameserver][0]
if resolver.include?(':')
'[' + resolver + ']'
else
resolver
end
end
end

View File

@@ -59,6 +59,12 @@ class zulip::app_frontend_base {
source => 'puppet:///modules/zulip/nginx/zulip-include-app.d/keepalive-loadbalancer.conf',
notify => Service['nginx'],
}
} else {
file { ['/etc/nginx/zulip-include/app.d/accept-loadbalancer.conf',
'/etc/nginx/zulip-include/app.d/keepalive-loadbalancer.conf']:
ensure => absent,
notify => Service['nginx'],
}
}
file { '/etc/nginx/zulip-include/upstreams':
@@ -73,8 +79,22 @@ class zulip::app_frontend_base {
$s3_memory_cache_size = zulipconf('application_server', 's3_memory_cache_size', '1M')
$s3_disk_cache_size = zulipconf('application_server', 's3_disk_cache_size', '200M')
$s3_cache_inactive_time = zulipconf('application_server', 's3_cache_inactive_time', '30d')
$configured_nginx_resolver = zulipconf('application_server', 'nameserver', '')
if $configured_nginx_resolver == '' {
# This may fail in the unlikely change that there is no configured
# resolver in /etc/resolv.conf, so only call it is unset in zulip.conf
$nginx_resolver_ip = resolver_ip()
} elsif (':' in $configured_nginx_resolver) and ! ('.' in $configured_nginx_resolver) and ! ('[' in $configured_nginx_resolver) {
# Assume this is IPv6, which needs square brackets.
$nginx_resolver_ip = "[${configured_nginx_resolver}]"
} else {
$nginx_resolver_ip = $configured_nginx_resolver
}
file { '/etc/nginx/zulip-include/s3-cache':
require => [Package[$zulip::common::nginx], File['/srv/zulip-uploaded-files-cache']],
require => [
Package[$zulip::common::nginx],
File['/srv/zulip-uploaded-files-cache'],
],
owner => 'root',
group => 'root',
mode => '0644',

View File

@@ -83,28 +83,20 @@ class zulip::postgresql_base {
}
package{"${postgresql}-pgdg-pgroonga":
ensure => installed,
require => [Package[$postgresql],
Exec[$setup_system_deps]],
ensure => latest,
require => [
Package[$postgresql],
Exec[$setup_system_deps]
],
}
$dbname = zulipconf('postgresql', 'database_name', 'zulip')
$dbuser = zulipconf('postgresql', 'database_user', 'zulip')
file { $pgroonga_setup_sql_path:
ensure => file,
exec { 'pgroonga-config':
require => Package["${postgresql}-pgdg-pgroonga"],
owner => 'postgres',
group => 'postgres',
mode => '0640',
content => template('zulip/postgresql/pgroonga_setup.sql.template.erb'),
}
exec{'create_pgroonga_extension':
require => File[$pgroonga_setup_sql_path],
# lint:ignore:140chars
command => "bash -c 'cat ${pgroonga_setup_sql_path} | su postgres -c \"psql -v ON_ERROR_STOP=1 ${dbname}\" && touch ${pgroonga_setup_sql_path}.applied'",
# lint:endignore
creates => "${pgroonga_setup_sql_path}.applied",
unless => @("EOT"/$),
test -f ${pgroonga_setup_sql_path}.applied &&
test "$(dpkg-query --show --showformat='\${Version}' "${postgresql}-pgdg-pgroonga")" \
= "$(cat ${pgroonga_setup_sql_path}.applied)"
| EOT
command => "${::zulip_scripts_path}/setup/pgroonga-config ${postgresql_sharedir}",
}
}

View File

@@ -1,3 +1,10 @@
# nginx does its own DNS resolution, which is necessary here to
# resolve the IP of the S3 server. Point it at whatever is configured
# first in /etc/resolv.conf. The validity duration is set to match
# S3's DNS validity.
resolver <%= @nginx_resolver_ip %> valid=300s;
resolver_timeout 10s;
# This cache is only used if S3 file storage is configured.
proxy_cache_path /srv/zulip-uploaded-files-cache
levels=1:2

View File

@@ -3,6 +3,10 @@
map $remote_addr $trusted_x_forwarded_proto {
default $scheme;
}
map $http_x_forwarded_for $x_proxy_misconfiguration {
default "";
"~." "No proxies configured in Zulip, but proxy headers detected from proxy at $remote_addr; see https://zulip.readthedocs.io/en/latest/production/deployment.html#putting-the-zulip-application-behind-a-reverse-proxy";
}
<% else %>
# We do this in two steps because `geo` does not support variable
# interpolation in the value, but does support CIDR notation,
@@ -18,4 +22,9 @@ map $is_x_forwarded_proto_trusted $trusted_x_forwarded_proto {
0 $scheme;
1 $http_x_forwarded_proto;
}
map "$is_x_forwarded_proto_trusted:$http_x_forwarded_proto" $x_proxy_misconfiguration {
"~^0:" "Incorrect reverse proxy IPs set in Zulip (try $remote_addr?); see https://zulip.readthedocs.io/en/latest/production/deployment.html#putting-the-zulip-application-behind-a-reverse-proxy";
"~^1:$" "No X-Forwarded-Proto header sent from trusted proxy $realip_remote_addr; see example configurations in https://zulip.readthedocs.io/en/latest/production/deployment.html#putting-the-zulip-application-behind-a-reverse-proxy";
default "";
}
<% end %>

View File

@@ -1,2 +0,0 @@
CREATE EXTENSION PGROONGA;
GRANT USAGE ON SCHEMA pgroonga TO <%= @dbuser %>;

View File

@@ -49,6 +49,18 @@ Options:
EOF
}
system_requirements_failure() {
set +x
echo >&2
cat >&2
cat <<EOF >&2
For more information, see:
https://zulip.readthedocs.io/en/latest/production/requirements.html
EOF
exit 1
}
# Shell option parsing. Over time, we'll want to move some of the
# environment variables below into this self-documenting system.
args="$(getopt -o '' --long help,hostname:,email:,certbot,self-signed-cert,cacert:,postgresql-database-name:,postgresql-database-user:,postgresql-version:,postgresql-missing-dictionaries,no-init-db,no-overwrite-settings,no-dist-upgrade -n "$0" -- "$@")"
@@ -221,9 +233,7 @@ fi
case "$os_id $os_version_id" in
'debian 11' | 'debian 12' | 'ubuntu 20.04' | 'ubuntu 22.04') ;;
*)
set +x
cat <<EOF
system_requirements_failure <<EOF
Unsupported OS release: $os_id $os_version_id
Zulip in production is supported only on:
@@ -231,33 +241,37 @@ Zulip in production is supported only on:
- Debian 12
- Ubuntu 20.04 LTS
- Ubuntu 22.04 LTS
For more information, see:
https://zulip.readthedocs.io/en/latest/production/requirements.html
EOF
exit 1
;;
esac
machine="$(uname -m)"
if [ "$machine" != x86_64 ] && [ "$machine" != aarch64 ]; then
system_requirements_failure <<EOF
Unsupported CPU architecture: $machine (expected x86_64 or aarch64).
EOF
fi
dpkg_architecture="$(dpkg --print-architecture)"
if [ "$dpkg_architecture" != amd64 ] && [ "$dpkg_architecture" != arm64 ]; then
system_requirements_failure <<EOF
Unsupported OS architecture: $dpkg_architecture (expected amd64 or arm64).
EOF
fi
has_universe() {
apt-cache policy \
| grep -q "^ release v=$os_version_id,o=Ubuntu,a=$os_version_codename,n=$os_version_codename,l=Ubuntu,c=universe"
}
if [ "$os_id" = ubuntu ] && ! has_universe && ! { apt-get update && has_universe; }; then
set +x
cat <<'EOF'
system_requirements_failure <<EOF
You must enable the Ubuntu Universe repository before installing
Zulip. You can do this with:
sudo add-apt-repository universe
sudo apt update
For more information, see:
https://zulip.readthedocs.io/en/latest/production/requirements.html
EOF
exit 1
fi
case ",$PUPPET_CLASSES," in

View File

@@ -28,6 +28,7 @@ from scripts.lib.zulip_tools import (
DEPLOYMENTS_DIR,
assert_running_as_root,
get_config,
get_config_bool,
get_config_file,
get_zulip_pwent,
listening_publicly,
@@ -205,20 +206,23 @@ def shutdown_server() -> None:
# postgresql.version is required for database servers, but wasn't
# previously; fill it in based on what the OS provides.
postgresql_version = None
if os.path.exists("/etc/init.d/postgresql"):
postgresql_version = get_config(config_file, "postgresql", "version")
django_pg_version = subprocess.check_output(
# We use the _current_ deploy's manage.py, since ours has not
# yet had its virtualenv configured yet.
[
"../current/manage.py",
"shell",
"-c",
"from django.db import connection; print(int(connection.cursor().connection.server_version/10000))",
],
preexec_fn=su_to_zulip,
text=True,
).strip()
if not postgresql_version:
default_postgresql_version = {
("debian", "11"): "13",
("debian", "12"): "15",
("ubuntu", "20.04"): "12",
("ubuntu", "22.04"): "14",
("centos", "7"): "11",
}
if (vendor, os_version) in default_postgresql_version:
postgresql_version = default_postgresql_version[(vendor, os_version)]
else:
error_desupported_os(vendor, os_version)
postgresql_version = django_pg_version
subprocess.check_call(
[
"crudini",
@@ -229,8 +233,27 @@ if os.path.exists("/etc/init.d/postgresql"):
postgresql_version,
]
)
elif postgresql_version != django_pg_version:
logging.critical(
"PostgreSQL version mismatch: %s (running) vs %s (configured)",
django_pg_version,
postgresql_version,
)
logging.info(
"/etc/zulip/zulip.conf claims that Zulip is running PostgreSQL\n"
"%s, but the server is connected to a PostgreSQL running\n"
"version %s. Check the output from pg_lsclusters to verify\n"
"which clusters are running, and update /etc/zulip/zulip.conf to match.\n"
"\n"
"In general, this results from manually upgrading PostgreSQL; you\n"
"should follow our instructions for using our tool to do so:\n"
"https://zulip.readthedocs.io/en/latest/production/upgrade.html#upgrading-postgresql",
postgresql_version,
django_pg_version,
)
sys.exit(1)
if tuple(map(int, postgresql_version.split("."))) < (12,):
if int(postgresql_version) < 12:
logging.critical("Unsupported PostgreSQL version: %s", postgresql_version)
logging.info(
"Please upgrade to PostgreSQL 12 or newer first.\n"
@@ -248,9 +271,20 @@ if glob.glob("/usr/share/postgresql/*/extension/tsearch_extras.control"):
subprocess.check_call(["apt-get", "remove", "-y", "postgresql-*-tsearch-extras"])
if not (minimal_change or args.skip_puppet):
# We need to temporarily hold pgroonga, if installed -- upgrading
# it without running the appropriate upgrade SQL can cause
# PostgreSQL to crash
if postgresql_version is not None and get_config_bool(config_file, "machine", "pgroonga"):
subprocess.check_call(
["apt-mark", "hold", f"postgresql-{postgresql_version}-pgdg-pgroonga"]
)
logging.info("Upgrading system packages...")
subprocess.check_call(["apt-get", "update"])
subprocess.check_call(["apt-get", "-y", "--with-new-pkgs", "upgrade"])
if postgresql_version is not None and get_config_bool(config_file, "machine", "pgroonga"):
subprocess.check_call(
["apt-mark", "unhold", f"postgresql-{postgresql_version}-pgdg-pgroonga"]
)
# To bootstrap zulip-puppet-apply, we need to install the system yaml
# package; new installs get this, but old installs may not have it.

View File

@@ -1,3 +1,2 @@
\connect zulip
CREATE EXTENSION pgroonga;
GRANT USAGE ON SCHEMA pgroonga TO zulip;

20
scripts/setup/pgroonga-config Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -eux
dbversion=$(crudini --get /etc/zulip/zulip.conf postgresql version)
dbname=$(crudini --get /etc/zulip/zulip.conf postgresql database_name 2>/dev/null || echo zulip)
sharedir="${1:-/usr/share/postgresql/$dbversion}"
applied_file="$sharedir/pgroonga_setup.sql.applied"
installed_version=$(dpkg-query --show --showformat='${Version}' "postgresql-$dbversion-pgdg-pgroonga")
if [ ! -f "$applied_file" ]; then
sql="CREATE EXTENSION PGROONGA"
else
sql="ALTER EXTENSION pgroonga UPDATE"
fi
echo "$sql" | su postgres -c "psql -v ON_ERROR_STOP=1 $dbname"
echo "$installed_version" >"$applied_file"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
set -eo pipefail
set -euo pipefail
if [ "$EUID" -ne 0 ]; then
echo "Error: This script must be run as root" >&2
@@ -12,7 +12,8 @@ export LC_ALL=C.UTF-8
export LANG=C.UTF-8
export LANGUAGE=C.UTF-8
UPGRADE_TO=${1:-15}
LATEST_SUPPORTED_VERSION=15
UPGRADE_TO=${1:-$LATEST_SUPPORTED_VERSION}
UPGRADE_FROM=$(crudini --get /etc/zulip/zulip.conf postgresql version)
ZULIP_PATH="$(dirname "$0")/../.."
@@ -21,6 +22,38 @@ if [ "$UPGRADE_TO" = "$UPGRADE_FROM" ]; then
exit 1
fi
if [[ "$UPGRADE_TO" -lt "$UPGRADE_FROM" ]]; then
echo "Refusing to downgrade PostgreSQL $UPGRADE_FROM to $UPGRADE_TO!"
exit 1
fi
if [[ "$UPGRADE_TO" -gt "$LATEST_SUPPORTED_VERSION" ]]; then
echo "This version of Zulip does not support PostgreSQL $UPGRADE_TO."
echo "You may need to upgrade Zulip before you can upgrade to PostgreSQL $UPGRADE_TO."
exit 1
fi
# Verify that the version in /etc/zulip/zulip.conf is the version that
# Django actually stores its data in. We can only do that if the
# database server is on the same host as the application server.
if [ -d /home/zulip/deployments/current ]; then
DATA_IS_IN=$(su zulip -c '/home/zulip/deployments/current/manage.py shell -c "from django.db import connection; print(int(connection.cursor().connection.server_version/10000))"')
if [ "$UPGRADE_FROM" != "$DATA_IS_IN" ]; then
cat <<EOF
/etc/zulip/zulip.conf claims that Zulip is running PostgreSQL
$UPGRADE_FROM, but the server is connected to a PostgreSQL running
version $DATA_IS_IN. Check the output from pg_lsclusters to verify
which clusters are running, and update /etc/zulip/zulip.conf to match.
In general, this results from manually upgrading PostgreSQL; you
should use this tool for all PostgreSQL upgrades.
EOF
exit 1
fi
fi
set -x
"$ZULIP_PATH"/scripts/lib/setup-apt-repo

View File

@@ -116,8 +116,6 @@ SELECT unnest(
ARRAY['ALTER SYSTEM SET pgroonga.enable_wal = ''on''', 'SELECT pg_reload_conf()']
END
) \gexec
GRANT USAGE ON SCHEMA pgroonga TO $USERNAME;
EOF
psql -v ON_ERROR_STOP=1 -e -h localhost postgres "$USERNAME" <<EOF

View File

@@ -1,6 +1,6 @@
import os
ZULIP_VERSION = "7.0"
ZULIP_VERSION = "7.2"
# Add information on number of commits and commit hash to version, if available
zulip_git_version_file = os.path.join(
@@ -14,8 +14,8 @@ ZULIP_VERSION = lines.pop(0).strip()
ZULIP_MERGE_BASE = lines.pop(0).strip()
LATEST_MAJOR_VERSION = "7.0"
LATEST_RELEASE_VERSION = "7.0"
LATEST_RELEASE_ANNOUNCEMENT = "https://blog.zulip.com/2022/11/17/zulip-6-0-released/"
LATEST_RELEASE_VERSION = "7.2"
LATEST_RELEASE_ANNOUNCEMENT = "https://blog.zulip.com/2023/05/31/zulip-7-0-released/"
# Versions of the desktop app below DESKTOP_MINIMUM_VERSION will be
# prevented from connecting to the Zulip server. Versions above

View File

@@ -186,6 +186,7 @@ export function clear_compose_box() {
compose_ui.autosize_textarea($("#compose-textarea"));
compose_banner.clear_errors();
compose_banner.clear_warnings();
compose_banner.clear_uploads();
compose_ui.hide_compose_spinner();
popover_menus.reset_selected_schedule_timestamp();
}

View File

@@ -78,6 +78,7 @@ function clear_box() {
compose_ui.autosize_textarea($("#compose-textarea"));
compose_banner.clear_errors();
compose_banner.clear_warnings();
compose_banner.clear_uploads();
}
export function autosize_message_content() {

View File

@@ -106,6 +106,10 @@ export function clear_warnings(): void {
$(`#compose_banners .${CSS.escape(WARNING)}`).remove();
}
export function clear_uploads(): void {
$("#compose_banners .upload_banner").remove();
}
export function clear_unmute_topic_notifications(): void {
$(`#compose_banners .${CLASSNAMES.unmute_topic_notification.replaceAll(" ", ".")}`).remove();
}

View File

@@ -199,6 +199,7 @@ export function update_compose_for_message_type(message_type, opts) {
}
compose_banner.clear_errors();
compose_banner.clear_warnings();
compose_banner.clear_uploads();
}
export function on_compose_select_recipient_update() {

View File

@@ -928,23 +928,32 @@ export function by_recipient(target_id, opts) {
// don't use message_lists.current as it won't work for muted messages or for out-of-narrow links
const message = message_store.get(target_id);
if (
user_settings.web_mark_read_on_scroll_policy !==
web_mark_read_on_scroll_policy_values.never.code
) {
// We don't check message_list.can_mark_messages_read
// here because the target message_list isn't initialized;
// but the targeted message is about to be marked read
// in the new view.
unread_ops.notify_server_message_read(message);
}
switch (message.type) {
case "private":
if (
user_settings.web_mark_read_on_scroll_policy !==
web_mark_read_on_scroll_policy_values.never.code
) {
// We don't check message_list.can_mark_messages_read
// here because the target message_list isn't initialized;
// but the targeted message is about to be marked read
// in the new view.
unread_ops.notify_server_message_read(message);
}
by("dm", message.reply_to, opts);
break;
case "stream":
if (
user_settings.web_mark_read_on_scroll_policy ===
web_mark_read_on_scroll_policy_values.always.code
) {
// We don't check message_list.can_mark_messages_read
// here because the target message_list isn't initialized;
// but the targeted message is about to be marked read
// in the new view.
unread_ops.notify_server_message_read(message);
}
by("stream", message.stream, opts);
break;
}

View File

@@ -239,7 +239,7 @@ function set_compose_box_schedule(element) {
return selected_send_at_time;
}
export function open_send_later_menu(instance) {
export function open_send_later_menu() {
if (!compose_validate.validate(true)) {
return;
}
@@ -248,11 +248,12 @@ export function open_send_later_menu(instance) {
const date = new Date();
const filtered_send_opts = scheduled_messages.get_filtered_send_opts(date);
$("body").append(render_send_later_modal(filtered_send_opts));
let interval;
overlays.open_modal("send_later_modal", {
autoremove: true,
on_show() {
instance._interval = setInterval(
interval = setInterval(
scheduled_messages.update_send_later_options,
scheduled_messages.SCHEDULING_MODAL_UPDATE_INTERVAL_IN_MILLISECONDS,
);
@@ -312,7 +313,7 @@ export function open_send_later_menu(instance) {
$send_later_modal_overlay.trigger("focus");
},
on_hide() {
clearInterval(instance._interval);
clearInterval(interval);
},
});
}
@@ -331,12 +332,10 @@ export function do_schedule_message(send_at_time) {
export function initialize() {
register_popover_menu("#streams_inline_icon", {
onShow(instance) {
popover_instances.stream_settings = instance;
const can_create_streams =
settings_data.user_can_create_private_streams() ||
settings_data.user_can_create_public_streams() ||
settings_data.user_can_create_web_public_streams();
on_show_prep(instance);
if (!can_create_streams) {
// If the user can't create streams, we directly
@@ -346,7 +345,12 @@ export function initialize() {
return false;
}
// Assuming that the instance can be shown, track and
// prep the instance for showing
popover_instances.stream_settings = instance;
instance.setContent(parse_html(render_left_sidebar_stream_setting_popover()));
on_show_prep(instance);
// When showing the popover menu, we want the
// "Add streams" and the "Filter streams" tooltip
// to appear below the "Add streams" icon.
@@ -360,6 +364,8 @@ export function initialize() {
filter_streams_tooltip._tippy?.setProps({
placement: "bottom",
});
// The linter complains about unbalanced returns
return true;
},
onHidden(instance) {
@@ -905,7 +911,7 @@ export function initialize() {
const send_at_timestamp = get_selected_send_later_timestamp();
do_schedule_message(send_at_timestamp);
});
$popper.one("click", ".open_send_later_modal", () => open_send_later_menu(instance));
$popper.one("click", ".open_send_later_modal", open_send_later_menu);
},
onHidden(instance) {
instance.destroy();

Some files were not shown because too many files have changed in this diff Show More