docs: Fix many spelling mistakes.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg 2022-02-07 15:13:33 -08:00 committed by Tim Abbott
parent d8f4e0ffb9
commit b0ce4f1bce
190 changed files with 286 additions and 286 deletions

View File

@ -41,7 +41,7 @@ jobs:
container: ${{ matrix.docker_image }}
env:
# GitHub Actions sets HOME to /github/home which causes
# problem later in provison and frontend test that runs
# problem later in provision and frontend test that runs
# tools/setup/postgresql-init-dev-db because of the .pgpass
# location. PostgreSQL (psql) expects .pgpass to be at
# /home/github/.pgpass and setting home to `/home/github/`
@ -195,7 +195,7 @@ jobs:
- name: Upload coverage reports
# Only upload coverage when both frontend and backend
# tests are ran.
# tests are run.
if: ${{ matrix.include_frontend_tests }}
uses: codecov/codecov-action@v2
with:

View File

@ -49,7 +49,7 @@ def payment_method_string(stripe_customer: stripe.Customer) -> str:
brand=default_payment_method.card.brand,
last4=default_payment_method.card.last4,
)
# There might be oneoff stuff we do for a particular customer that
# There might be one-off stuff we do for a particular customer that
# would land them here. E.g. by default we don't support ACH for
# automatic payments, but in theory we could add it for a customer via
# the Stripe dashboard.

View File

@ -80,7 +80,7 @@ def stripe_webhook(request: HttpRequest) -> HttpResponse:
)
except PaymentIntent.DoesNotExist:
# PaymentIntent that was not manually created from the billing system.
# Could be an Invoice getting paid which is is not an event we are interested in.
# Could be an Invoice getting paid which is not an event we are interested in.
return HttpResponse(status=200)
event.content_type = ContentType.objects.get_for_model(PaymentIntent)
event.object_id = payment_intent.id
@ -95,7 +95,7 @@ def stripe_webhook(request: HttpRequest) -> HttpResponse:
)
except PaymentIntent.DoesNotExist:
# PaymentIntent that was not manually created from the billing system.
# Could be an Invoice getting paid which is is not an event we are interested in.
# Could be an Invoice getting paid which is not an event we are interested in.
return HttpResponse(status=200)
event.content_type = ContentType.objects.get_for_model(PaymentIntent)
event.object_id = payment_intent.id

View File

@ -94,7 +94,7 @@ License: Expat
Files: static/assets/icons/ellipsis-v-solid.svg
Copyright: 2017 Fonticons, Inc.
License: CC-BY-4.0
Comment: This icon is picked from Version 5.13.0 of Fontawesome
Comment: This icon is picked from Version 5.13.0 of Font Awesome
Files: zerver/lib/markdown/fenced_code.py
Copyright: 2006-2008 Waylan Limberg

View File

@ -66,7 +66,7 @@ model GitHub supports).
message-editing** and **area: message view** labels are both related
to the
[Server message view](https://github.com/orgs/zulip/teams/server-message-view)
team. Feel free to join as many area label teams as as you'd like!
team. Feel free to join as many area label teams as you'd like!
After your request to join an area label team is approved, you'll receive
notifications for any issues labeled with the team's corresponding area

View File

@ -63,7 +63,7 @@ the current documentation as a resource and guide as you begin.
- Read through the existing articles in that section and pay attention
to the writing style and [voice](#voice), as well as any
[Markdown features](#markdown-features) used to enchance the
[Markdown features](#markdown-features) used to enhance the
readability of the documentation.
- Should the feature you're documenting be added or merged into an

View File

@ -256,7 +256,7 @@ Zulip, you need to update your local Git database with new refs from your
GitHub fork. You do this with `git fetch`:
```console
$ git fetch <usermame>
$ git fetch <username>
```
Ideally you should do this before you have made any commits on the same branch

View File

@ -305,7 +305,7 @@ log][commit-log] for an up-to-date list of raw changes.
- Improved formatting for Grafana integration.
- Fixed previews of Dropbox image links.
- Fixed support for storing avatars/emoji in non-S3 upload backends.
- Fixed an overly strict database constaint for code playgrounds.
- Fixed an overly strict database constraint for code playgrounds.
- Tagged user status strings for translation.
- Updated translation data from Transifex.
@ -405,7 +405,7 @@ log][commit-log] for an up-to-date list of raw changes.
- Added new [release lifecycle documentation](../overview/release-lifecycle.md).
- Added support for subscribing another stream's membership to a stream.
- Added RealmAuditLog for most settings state changes in Zulip; this
data will fascilitate future features showing a log of activity by
data will facilitate future features showing a log of activity by
a given user or changes to an organization's settings.
- Added support for using Sentry for processing backend exceptions.
- Added documentation for using `wal-g` for continuous PostgreSQL backups.
@ -822,7 +822,7 @@ log][commit-log] for an up-to-date list of raw changes.
mobile apps.
- Removed the legacy websockets-based system for sending messages. This
system was always a hack, was only ever used for one endpoint, and
did not provide a measureable latency benefit over HTTP/2.
did not provide a measurable latency benefit over HTTP/2.
## Zulip 2.1.x series
@ -1131,7 +1131,7 @@ details.
- Fixed buggy rendering of bulleted lists inside blockquotes.
- Fixed several bugs with CORS in the nginx configuration.
- Fixed error message for GitHub login attempts with a deactivated account.
- Fixed email gateway issues with non-latin characters in stream names.
- Fixed email gateway issues with non-Latin characters in stream names.
- Fixed endless re-synchronization of LDAP user avatars (which
could cause user-visible performance issues for desktop/web clients).
- Fixed all known bugs with advanced LDAP data synchronization.
@ -1928,7 +1928,7 @@ running a version from before 1.7 should upgrade directly to 1.7.1.
- Fixed zombie process leaks on servers with <4GB of RAM.
- Fixed Markdown previews of /me messages.
- Fixed a subtle bug involving timestamps of locally echoed messages.
- Fixed the behavior of key combintions like Ctrl+Enter in the compose box.
- Fixed the behavior of key combinations like Ctrl+Enter in the compose box.
- Worked around Google Compute Engine's default boto configuration,
which broke Zulip (and any other app using boto).
- Zulip now will gracefully handle the PostgreSQL server being restarted.
@ -2403,7 +2403,7 @@ running a version from before 1.7 should upgrade directly to 1.7.1.
/etc/zulip/secrets.conf.
- Improved the styling for the Administration page and added tabs.
- Substantially improved loading performance on slow networks by enabling
GZIP compression on more assets.
gzip compression on more assets.
- Changed the page title in narrowed views to include the current narrow.
- Fixed several backend performance issues affecting very large realms.
- Fixed bugs where draft compose content might be lost when reloading site.

View File

@ -284,7 +284,7 @@ variable reverse proxy implementations.
If your Zulip server will not be on the public Internet, we recommend,
installing with the `--self-signed-cert` option (rather than the
`--certbot` option), since CertBot requires the server to be on the
`--certbot` option), since Certbot requires the server to be on the
public Internet.
#### Configuring Zulip to allow HTTP

View File

@ -293,7 +293,7 @@ archive of all the organization's uploaded files.
version of Zulip as the server you're exporting from.
- For exports from Zulip Cloud (zulip.com), you need to [upgrade to
`main`][upgrade-zulip-from-git], since we run run `main` on
`main`][upgrade-zulip-from-git], since we run `main` on
Zulip Cloud:
```bash

View File

@ -132,7 +132,7 @@ There are dozens of useful management commands under
For most purposes, deactivating users is preferred, since that does not
alter message history for other users.
See the `./manage.py delete_user --help` documentation for details.
- `./manage.py clear_auth_rate_limit_history`: If a user failed authenticaton
- `./manage.py clear_auth_rate_limit_history`: If a user failed authentication
attempts too many times and further attempts are disallowed by the rate limiter,
this can be used to reset the limit.

View File

@ -126,7 +126,7 @@ and privacy in mind:
registered to be notified by your Zulip server.
- User ID numbers generated by your Zulip server, needed to route
a given notification to the appropriate set of mobile devices.
These user ID numbers are are opaque to the Push Notification
These user ID numbers are opaque to the Push Notification
Service and Kandra Labs.
- The Push Notification Service receives (but does not store) the
contents of individual mobile push notifications:

View File

@ -158,7 +158,7 @@ regularly install apt upgrades manually!
:::
Restarting one of the system services that Zulip uses (PostgreSQL,
memcached, Redis, or Rabbitmq) will drop the connections that
memcached, Redis, or RabbitMQ) will drop the connections that
Zulip processes have to the service, resulting in future operations on
those connections throwing errors.

View File

@ -44,7 +44,7 @@ which is used to help ensure developers don't spend time debugging
test/linter/etc. failures that actually were caused by the developer
rebasing and forgetting to provision". `PROVISION_VERSION` has a
format of `x.y`; when `x` doesn't match the value from the last time
the user provisioned, or `y` is higher than than the value from last
the user provisioned, or `y` is higher than the value from last
time, most Zulip tools will crash early and ask the user to provision.
This has empirically made a huge impact on how often developers spend
time debugging a "weird failure" after rebasing that had an easy

View File

@ -164,7 +164,7 @@ for that:
- If there are natural things someone might type, like `:happy:`, we try to
find an emoji to match. This extends to things that someone might not
think to type, but as soon as someone in the organization discovers it it
think to type, but as soon as someone in the organization discovers it
could get wide use, like `:working_on_it:`. Good future work would be to
collect (by survey or tooling) things people type into the emoji picker
typeahead on chat.zulip.org, and find ways to add those names as

View File

@ -304,7 +304,7 @@ There are some notable optional parameters for `verify_action`:
doesn't actually require state changes for some reason; otherwise,
`verify_action` will complain that your test doesn't really
exercise any `apply_events` logic. Typing notifications (which
are ephemereal) are a common place where we use this.
are ephemeral) are a common place where we use this.
- `num_events` will tell `verify_action` how many events the
`hamlet` user will receive after the action (the default is 1).

View File

@ -5,7 +5,7 @@ formatting. Our Markdown flavor is unique primarily to add important
extensions, such as quote blocks and math blocks, and also to do
previews and correct issues specific to the chat context. Beyond
that, it has a number of minor historical variations resulting from
its history predacting CommonMark (and thus Zulip choosing different
its history predating CommonMark (and thus Zulip choosing different
solutions to some problems) and based in part on Python-Markdown,
which is proudly a classic Markdown implementation. We reduce these
variations with every major Zulip release.

View File

@ -45,7 +45,7 @@ will instead select the first unread message matching that narrow, or
if there are none, the most recent messages matching that narrow.
This provides the nice user experience of taking you to the start of
the new stuff (with enough messages you'ev seen before still in view
the new stuff (with enough messages you've seen before still in view
at the top to provide you with context), which is usually what you
want. (When finding the "first unread message", Zulip ignores unread
messages in muted streams or in muted topics within non-muted

View File

@ -1,14 +1,14 @@
# Realms in Zulip
Zulip allows multiple _realms_ to be hosted on a single instance.
Realms are the Zulip codebases's internal name for what we refer to in
Realms are the Zulip codebase's internal name for what we refer to in
user-facing documentation as an organization (the name "realm" comes
from [Kerberos](https://web.mit.edu/kerberos/)).
Wherever possible, we avoid using the term `realm` in any user-facing
string or documentation; "Organization" is the equivalent term used in
those contexts (and we have linters that attempt to enforce this rule
in translateable strings). We may in the future modify Zulip's
in translatable strings). We may in the future modify Zulip's
internals to use `organization` instead.
The

View File

@ -129,7 +129,7 @@ migrations.
the migration can even continue where it left off, without needing
to redo work.
- **Multi-step migrations**. For really big migrations, one wants
to split the transition into into several commits that are each
to split the transition into several commits that are each
individually correct, and can each be deployed independently:
1. First, do a migration to add the new column to the Message table

View File

@ -67,7 +67,7 @@ how long they pause to think, and how frequently they get interrupted.
## Server
The server piece of typing notificiations is currently pretty
The server piece of typing notifications is currently pretty
straightforward, since we take advantage of Zulip's
[events system](../subsystems/events-system.md).

View File

@ -83,9 +83,9 @@ the images we use in GitHub Actions for testing.
After booting the container from the configured image, GitHub Actions will
create the directory mentioned in `working_directory` and all the
steps are be run from here.
steps will be run from here.
The `steps` section describes describes everything: fetching the Zulip
The `steps` section describes everything: fetching the Zulip
code, provisioning, fetching caught data, running tests and uploading
coverage reports. The steps with prefix `*` reference aliases, which
are defined in the `aliases` section at the top of the file.

View File

@ -338,7 +338,7 @@ authentication, that made outgoing HTTP requests to external
servers. We test those features using the excellent
[responses](https://pypi.org/project/responses/) library, which has a
nice interface for mocking `requests` calls to return whatever HTTP
response from the exteranl server we need for the test. you can find
response from the external server we need for the test. you can find
examples with `git grep responses.add`. Zulip's own `HostRequestMock`
class should be used only for low-level tests for code that expects to
receive Django HttpRequest object.

View File

@ -108,7 +108,7 @@ These tools/features are often useful when debugging:
of Puppeteer so you can watch what's happening, and document how to
make that work with Vagrant.
- TODO: Document `--interactive`.
- TODO: Document how to run 100x in CI to check for nondeterminstic
- TODO: Document how to run 100x in CI to check for nondeterministic
failures.
- TODO: Document any other techniques/ideas that were helpful when porting
the Casper suite.
@ -135,7 +135,7 @@ notes above:
- Run just the file containing your new tests as described above to
have a fast debugging cycle.
- When you're done writing a test, run it 100 times in a loop to
verify it does not fail nondeterminstically (see above for notes on
verify it does not fail nondeterministically (see above for notes on
how to get CI to do it for you); this is important to avoid
introducing extremely annoying nondeterministic failures into
`main`.

View File

@ -39,7 +39,7 @@ continually recheck the files as you edit them.
## Linting and style
We use the Eslint plugin for TypeScript to lint TypeScript code, just
We use the ESLint plugin for TypeScript to lint TypeScript code, just
like we do for JavaScript. Our long-term goal is to use an idiomatic
TypeScript style for our TypeScript codebase.
@ -49,7 +49,7 @@ JavaScript code, so that we can easily migrate individual modules
without too much code churn. A few examples:
- TypeScript generally prefers explicit `return undefined;`, whereas
our existing JavasScript style uses just `return;`.
our existing JavaScript style uses just `return;`.
- With TypeScript, we expect to make heavy use of `let` and `const`
rather than `var`.
- With TypeScript/ES6, we may no longer need to use `_.each()` as our

View File

@ -20,7 +20,7 @@ in a more colloquial style, German translations should be rather informal as wel
say _"Dieser Fehler tritt häufiger auf."_
- "Das ist die Seite, wo der Quelltext steht." - the "_wo_" is regional,
say _"Das ist die Seite, auf der der Quelltext steht."_ instead.
say _"Das ist die Seite, auf der Quelltext steht."_ instead.
### Form of address

View File

@ -48,7 +48,7 @@ to understand when implementing an internationalized application:
translate the content.
- **Word order** varies between languages (e.g. some languages put
subjects before verbs, others the other way around). This means
that **concatenating translateable strings** produces broken results
that **concatenating translatable strings** produces broken results
(more details with examples are below).
- The **width of the string needed to express something** varies
dramatically between languages; this means you can't just hardcode a
@ -202,7 +202,7 @@ class Realm(models.Model):
STREAM_EVENTS_NOTIFICATION_TOPIC = gettext_lazy('stream events')
```
To ensure we always internationalize our JSON errors messages, the
To ensure we always internationalize our JSON error messages, the
Zulip linter (`tools/lint`) attempts to verify correct usage.
## Frontend translations

View File

@ -7,7 +7,7 @@ Zulip.
Additionally, the Zulip UI is translated into more than a dozen major
languages, including Spanish, German, Hindi, French, Chinese, Russian,
and Japanese, and we're always excited to add more. If you speak a
language other than English, your help with translating Zulip is be
language other than English, your help with translating Zulip would be
greatly appreciated!
If you are interested in knowing about the technical end-to-end

View File

@ -102,7 +102,7 @@ Templates for the main website are found in
## Writing API REST endpoints
These are code-parseable views that take x-www-form-urlencoded or JSON
These are code-parsable views that take x-www-form-urlencoded or JSON
request bodies, and return JSON-string responses. Almost all Zulip
view code is in the implementations of API REST endpoints.
@ -135,7 +135,7 @@ one of several bad outcomes:
- Every view function comes with another function that does the
validation that has the problems from the last bullet point.
In Zulip, we solve this problem with a the special decorator called
In Zulip, we solve this problem with a special decorator called
`has_request_variables` which allows a developer to declare the
arguments a view function takes and validate their types all within
the `def` line of the function. We like this framework because we
@ -275,7 +275,7 @@ def update_realm(
`realm.save()` actually saves the changes to the realm to the
database, and `send_event` sends the event to active clients belonging
to the provided list of users (in this case, all altive users in the
to the provided list of users (in this case, all active users in the
Zulip realm).
### Calling from the web application

View File

@ -242,7 +242,7 @@ test("compose fade interactions (PMs)", () => {
return buddy_data.get_item(fred.user_id).faded;
}
// Dont fade if we're not in a narrow.
// Don't fade if we're not in a narrow.
assert.equal(faded(), false);
// Fade fred if we are narrowed to a PM narrow that does

View File

@ -21,7 +21,7 @@ page_params.translation_data = {
};
// Re-register Zulip extensions so extensions registered previously with
// mocked i18n.ts do not interefere with following tests.
// mocked i18n.ts do not interfere with following tests.
require("../../static/js/templates");
// All of our other tests stub out i18n activity;

View File

@ -845,7 +845,7 @@ run_test("Multiselect dropdown retain_selected_items", () => {
container.html = () => {};
container.find = (elem) => DropdownItem(elem);
// We essentially create fake Jquery functions
// We essentially create fake jQuery functions
// whose return value are stored in objects so that
// they can be later asserted with expected values.
function DropdownItem(element) {

View File

@ -347,7 +347,7 @@ test("muted_message_vars", () => {
test("merge_message_groups", () => {
// MessageListView has lots of DOM code, so we are going to test the message
// group mearging logic on its own.
// group merging logic on its own.
function build_message_context(message = {}, message_context = {}) {
message_context = {

View File

@ -62,14 +62,14 @@ test("add_and_remove_mutes", () => {
muted_topics.add_muted_topic(devel.stream_id, "java");
assert.ok(muted_topics.is_topic_muted(devel.stream_id, "java"));
// test idempotentcy
// test idempotency
muted_topics.add_muted_topic(devel.stream_id, "java");
assert.ok(muted_topics.is_topic_muted(devel.stream_id, "java"));
muted_topics.remove_muted_topic(devel.stream_id, "java");
assert.ok(!muted_topics.is_topic_muted(devel.stream_id, "java"));
// test idempotentcy
// test idempotency
muted_topics.remove_muted_topic(devel.stream_id, "java");
assert.ok(!muted_topics.is_topic_muted(devel.stream_id, "java"));
@ -81,14 +81,14 @@ test("add_and_remove_mutes", () => {
muted_users.add_muted_user(1);
assert.ok(muted_users.is_user_muted(1));
// test idempotentcy
// test idempotency
muted_users.add_muted_user(1);
assert.ok(muted_users.is_user_muted(1));
muted_users.remove_muted_user(1);
assert.ok(!muted_users.is_user_muted(1));
// test idempotentcy
// test idempotency
muted_users.remove_muted_user(1);
assert.ok(!muted_users.is_user_muted(1));
});

View File

@ -18,7 +18,7 @@ function test_with(fixture) {
narrow_state.set_current_filter(filter);
// Make sure our simulated tests data satisfies the
// invarariant that the first unread message we find
// invariant that the first unread message we find
// does indeed satisfy our filter.
if (fixture.unread_info.flavor === "found") {
for (const msg of fixture.all_messages) {

View File

@ -21,7 +21,7 @@ let sort_recipients_called = false;
let sort_streams_called = false;
const fake_rendered_person = $.create("fake-rendered-person");
const fake_rendered_stream = $.create("fake-rendered-stream");
const fake_rendered_group = $.create("fake-redered-group");
const fake_rendered_group = $.create("fake-rendered-group");
mock_esm("../../static/js/typeahead_helper", {
render_person() {

View File

@ -320,7 +320,7 @@ test("sending", ({override, override_rewire}) => {
emoji_name = "inactive_realm_emoji";
{
// Test removing a deactivated realm emoji. An user can interact with a
// Test removing a deactivated realm emoji. A user can interact with a
// deactivated realm emoji only by clicking on a reaction, hence, only
// `process_reaction_click()` codepath supports deleting/adding a deactivated
// realm emoji.

View File

@ -911,7 +911,7 @@ test("test_topic_edit", ({override, override_rewire}) => {
assert.equal(all_topics.get(get_topic_key(stream2, topic1)), undefined);
verify_topic_data(all_topics, stream3, topic9, messages[0].id, true);
// Message was moveed to a deleted stream, hence hidden regardless of filter.
// Message was moved to a deleted stream, hence hidden regardless of filter.
messages[0].stream_id = stream5;
messages[0].topic = topic8;
rt.process_topic_edit(stream3, topic9, topic8, stream5);

View File

@ -241,7 +241,7 @@ run_test("stream-links", () => {
run_test("timestamp without time", () => {
const $content = get_content_element();
const $timestamp = $.create("timestampe without actual time");
const $timestamp = $.create("timestamp without actual time");
$content.set_find_results("time", $array([$timestamp]));
rm.update_elements($content);

View File

@ -524,7 +524,7 @@ test("sort_recipients subscribers", () => {
test("sort_recipients pm partners", () => {
// b_user_3 is a pm partner and b_user_2 is not and
// both are not subscribered to the stream Linux.
// both are not subscribed to the stream Linux.
const small_matches = [b_user_3, b_user_2];
const recipients = th.sort_recipients({
users: small_matches,

View File

@ -232,7 +232,7 @@ run_test("eq_array easy cases", () => {
assert.equal(vdom.eq_array(x, z, eq), false);
});
run_test("eq_array elementwise", () => {
run_test("eq_array element-wise", () => {
const a = [51, 32, 93];
const b = [31, 52, 43];
const eq = (a, b) => a % 10 === b % 10;

View File

@ -62,7 +62,7 @@ run_test("basics", () => {
blueslip.reset();
});
// Let's repeat the above procedue with warnings. Unlike errors,
// Let's repeat the above procedure with warnings. Unlike errors,
// warnings shouldn't stop the code execution, and thus, the
// behaviour is slightly different.

View File

@ -409,7 +409,7 @@ class CommonUtils {
}
/**
* This method returns a array, which is formmated as:
* This method returns a array, which is formatted as:
* [
* ['stream > topic', ['message 1', 'message 2']],
* ['You and Cordelia, Lear's daughter', ['message 1', 'message 2']]

View File

@ -164,7 +164,7 @@ async function test_markdown_preview_buttons_visibility(page: Page): Promise<voi
await page.waitForSelector(markdown_preview_button, {visible: true});
await page.waitForSelector(markdown_preview_hide_button, {hidden: true});
// verify if markdowm preview button works.
// verify if Markdown preview button works.
await page.click(markdown_preview_button);
await page.waitForSelector(markdown_preview_button, {hidden: true});
await page.waitForSelector(markdown_preview_hide_button, {visible: true});

View File

@ -4,7 +4,7 @@ import type {Page} from "puppeteer";
import common from "../puppeteer_lib/common";
async function wait_for_drafts_to_dissapear(page: Page): Promise<void> {
async function wait_for_drafts_to_disappear(page: Page): Promise<void> {
await page.waitForFunction(
() => $("#draft_overlay").length === 0 || $("#draft_overlay").css("opacity") === "0",
);
@ -32,7 +32,7 @@ async function test_empty_drafts(page: Page): Promise<void> {
assert.strictEqual(await common.get_text_from_selector(page, ".drafts-list"), "No drafts.");
await page.click(`${drafts_overlay} .exit`);
await wait_for_drafts_to_dissapear(page);
await wait_for_drafts_to_disappear(page);
}
async function create_stream_message_draft(page: Page): Promise<void> {
@ -117,7 +117,7 @@ async function test_previously_created_drafts_rendered(page: Page): Promise<void
async function test_restore_message_draft(page: Page): Promise<void> {
console.log("Restoring stream message draft");
await page.click("#drafts_table .message_row:not(.private-message) .restore-draft");
await wait_for_drafts_to_dissapear(page);
await wait_for_drafts_to_disappear(page);
await page.waitForSelector("#stream-message", {visible: true});
await page.waitForSelector("#preview_message_area", {hidden: true});
await common.check_form_contents(page, "form#send_message_form", {
@ -172,7 +172,7 @@ async function test_edited_draft_message(page: Page): Promise<void> {
async function test_restore_private_message_draft(page: Page): Promise<void> {
console.log("Restoring private message draft.");
await page.click("#drafts_table .message_row.private-message .restore-draft");
await wait_for_drafts_to_dissapear(page);
await wait_for_drafts_to_disappear(page);
await page.waitForSelector("#private-message", {visible: true});
await common.check_form_contents(page, "form#send_message_form", {
content: "Test private message.",
@ -198,7 +198,7 @@ async function test_delete_draft(page: Page): Promise<void> {
assert.strictEqual(drafts_count, 1, "Draft not deleted.");
await page.waitForSelector("#drafts_table .message_row.private-message", {hidden: true});
await page.click(`${drafts_overlay} .exit`);
await wait_for_drafts_to_dissapear(page);
await wait_for_drafts_to_disappear(page);
await page.click("body");
}

View File

@ -338,7 +338,7 @@ async function test_stream_search_filters_stream_list(page: Page): Promise<void>
await page.click(".stream-list-filter");
await page.waitForSelector("#stream_filters .highlighted_stream", {visible: true});
// First stream in list gets highlihted on clicking search.
// First stream in list gets highlighted on clicking search.
await page.waitForSelector((await get_stream_li(page, "core team")) + ".highlighted_stream", {
visible: true,
});

View File

@ -20,7 +20,7 @@ async function realm_creation_tests(page: Page): Promise<void> {
page.$eval("#send_confirm", (form) => (form as HTMLFormElement).submit()),
]);
// Make sure onfirmation email is sent.
// Make sure confirmation email is sent.
assert.ok(page.url().includes("/accounts/new/send_confirm/" + email));
// Special endpoint enabled only during tests for extracting confirmation key

View File

@ -118,7 +118,7 @@ async function test_webhook_bot_creation(page: Page): Promise<void> {
assert.match(
zuliprc_decoded_url,
outgoing_webhook_zuliprc_regex,
"Incorrect outgoing webhook bot zulirc format",
"Incorrect outgoing webhook bot zuliprc format",
);
}

View File

@ -162,7 +162,7 @@ class MarkdownComparer {
message:
message +
[
"actual and expected output produce semantially identical HTML",
"actual and expected output produce semantically identical HTML",
actual,
"==",
expected,

View File

@ -47,7 +47,7 @@ tblib
# For linting Git commit messages
gitlint-core
# Needed for visualising cprofile reports
# Needed for visualising cProfile reports
snakeviz
# Needed for creating DigitalOcean droplets

View File

@ -55,7 +55,7 @@ def inline_template(template_source_name: str) -> None:
# adding html, head, and body tags if they aren't there.
# While this is correct for the email_base_default template,
# it is wrong for the other templates that extend this
# template, since we'll end up with 2 copipes of those tags.
# template, since we'll end up with 2 copies of those tags.
# Thus, we strip this stuff out if the template extends
# another template.
if template_name not in ["email_base_default", "email_base_marketing", "macros"]:

View File

@ -78,7 +78,7 @@ function call(args, idempotent) {
}
if (page_params.is_spectator) {
// In theory, the specator implementation should be
// In theory, the spectator implementation should be
// designed to prevent accessing widgets that would
// make network requests not available to spectators.
//

View File

@ -647,7 +647,7 @@ export function initialize() {
on_timestamp_selection,
new Date(),
{
// place the time picker above the icon and centerize it horizontally
// place the time picker above the icon and center it horizontally
position: "above center",
},
);

View File

@ -114,7 +114,7 @@ export function initialize() {
update_reply_recipient_label();
});
// Click handlers for buttons in the compose compose box.
// Click handlers for buttons in the compose box.
$("body").on("click", ".compose_stream_button", () => {
compose_actions.start("stream", {trigger: "new topic button"});
});

View File

@ -162,7 +162,7 @@ export function make_compose_box_full_size() {
set_full_size(true);
// The autosize should be destroyed for the full size compose
// box else it will interfare and shrink its size accordingly.
// box else it will interfere and shrink its size accordingly.
autosize.destroy($("#compose-textarea"));
$("#compose").addClass("compose-fullscreen");

View File

@ -34,7 +34,7 @@ import {user_settings} from "./user_settings";
// And your input to them is rendered as though it were HTML by
// the default highlighter.
//
// So if you are not using trusted input, you MUST use the a
// So if you are not using trusted input, you MUST use a
// highlighter that escapes (i.e. one that calls
// typeahead_helper.highlight_with_escaping).

View File

@ -17,7 +17,7 @@ This code lets you show something like this:
And then you configure the undo behavior, and
everything else is controlled by the widget.
Codewise it's a singleton widget that controls the DOM inside
Code-wise it's a singleton widget that controls the DOM inside
#feedback_container, which gets served up by server.
*/

View File

@ -9,7 +9,7 @@ function max_id_for_messages(messages) {
}
export class FetchStatus {
// The FetchStatus object tracks tracks the state of a
// The FetchStatus object tracks the state of a
// message_list_data object, whether rendered in the DOM or not,
// and is the source of truth for whether the message_list_data
// object has the complete history of the view or whether more
@ -82,7 +82,7 @@ export class FetchStatus {
// When a new message arrives matching the current view
// and found_newest is false, we cannot add the message to
// the view in-order without creating invalid output
// (where two messages are displaye adjacent but might be
// (where two messages are display adjacent but might be
// weeks and hundreds of messages apart in actuality).
//
// So we have to discard those messages. Usually, this is

View File

@ -97,7 +97,7 @@ export function get_language_list_columns(default_language: string): LanguageLis
const seconds = _.range(firsts_end, language_len);
const longest_zip: [number, number][] = [];
// Create a zip (itertool.zip_longest in python)
// Create a zip (itertools.zip_longest in python)
for (const value of firsts) {
longest_zip.push([value, seconds[value]]);
}

View File

@ -141,7 +141,7 @@ export function create(opts) {
return true;
},
// this searches given a particlar pill ID for it, removes the node
// this searches given a particular pill ID for it, removes the node
// from the DOM, removes it from the array and returns it.
// this would generally be used for DOM-provoked actions, such as a user
// clicking on a pill to remove it.
@ -200,7 +200,7 @@ export function create(opts) {
// of pills for the user to fix.
const drafts = pills.filter(
(pill) =>
// if this returns `false`, it erroed and we should push it to
// if this returns `false`, it errored and we should push it to
// the draft pills.
funcs.appendPill(pill) === false,
);

View File

@ -43,7 +43,7 @@ export class PanZoomControl {
}, 0);
});
// keybinds
// key bindings
document.addEventListener("keydown", (e) => {
if (!overlays.lightbox_open()) {
return;

View File

@ -446,7 +446,7 @@ export function initialize(helper_config) {
return translate_emoticons_to_names(src);
}
// Disable lheadings
// Disable headings
// We only keep the # Heading format.
disable_markdown_regex(marked.Lexer.rules.tables, "lheading");

View File

@ -491,7 +491,7 @@ export function initialize(home_view_loaded) {
// (Users will see a weird artifact where Recent topics has a gap
// between E.g. 6 days ago and 37 days ago while the catchup
// process runs, so this strategy still results in problematic
// visual artifacts shortly after page load; just more forgiveable
// visual artifacts shortly after page load; just more forgivable
// ones).
//
// This MessageList is defined similarly to home_message_list,

View File

@ -660,7 +660,7 @@ export class MessageListView {
// The messages we are being asked to render are shared with between
// all messages lists. To prevent having both list views overwriting
// each others data we will make a new message object to add data to
// each others' data we will make a new message object to add data to
// for rendering.
const message_containers = messages.map((message) => {
if (message.starred) {
@ -723,7 +723,7 @@ export class MessageListView {
this._post_process(dom_messages);
// The date row will be included in the message groups or will be
// added in a rerenderd in the group below
// added in a rerendered in the group below
table.find(".recipient_row").first().prev(".date_row").remove();
table.prepend(rendered_groups);
condense.condense_and_collapse(dom_messages);

View File

@ -175,7 +175,7 @@ export function get_first_unread_info() {
if (!current_filter.can_apply_locally()) {
// For things like search queries, where the server has info
// that the client isn't privvy to, we need to wait for the
// that the client isn't privy to, we need to wait for the
// server to give us a definitive list of messages before
// deciding where we'll move the selection.
return {

View File

@ -109,7 +109,7 @@ export function initialize() {
// We need to hide instance manually for popover due to
// `$("body").on("click"...` method not being triggered for
// the elements when when we do:
// the elements when we do:
// `$(instance.popper).one("click", instance.hide); in onShow.
// Cannot reproduce it on codepen -
// https://codepen.io/amanagr/pen/jOLoKVg

View File

@ -714,7 +714,7 @@ export function user_sidebar_popped() {
export function hide_user_sidebar_popover() {
if (user_sidebar_popped()) {
// this hide_* method looks different from all the others since
// the presence list may be redrawn. Due to funkiness with jquery's .data()
// the presence list may be redrawn. Due to funkiness with jQuery's .data()
// this would confuse $.popover("destroy"), which looks at the .data() attached
// to a certain element. We thus save off the .data("popover") in the
// show_user_sidebar_popover and inject it here before calling destroy.
@ -1244,7 +1244,7 @@ export function register_click_handlers() {
.fadeOut(300);
setTimeout(() => {
// The Cliboard library works by focusing to a hidden textarea.
// The Clipboard library works by focusing to a hidden textarea.
// We unfocus this so keyboard shortcuts, etc., will work again.
$(":focus").trigger("blur");
}, 0);

View File

@ -27,7 +27,7 @@ function preserve_state(send_after_reload, save_pointer, save_narrow, save_compo
// no secure way to pass that state in a signed fashion to the
// next instance of the browser client).
//
// So we jure return here and let the reload proceed without
// So we just return here and let the reload proceed without
// having preserved state. We keep the hash the same so we'll
// at least save their narrow state.
blueslip.log("Can't preserve state; no local storage.");

View File

@ -67,7 +67,7 @@ export function do_settings_change(
}
// This function is used to disable sub-setting when main setting is checked or unchecked
// or two settings are inter-dependent on their values values.
// or two settings are inter-dependent on their values.
// * is_checked is boolean, shows if the main setting is checked or not.
// * sub_setting_id is sub setting or setting which depend on main setting,
// string id of setting.

View File

@ -399,7 +399,7 @@ function get_human_profile_data(fields_user_pills) {
*/
const new_profile_data = [];
$("#edit-user-form .custom_user_field_value").each(function () {
// Remove duplicate datepicker input element generated flatpicker library
// Remove duplicate datepicker input element generated flatpickr library
if (!$(this).hasClass("form-control")) {
new_profile_data.push({
id: Number.parseInt(

View File

@ -1,5 +1,5 @@
// Module for displaying the modal asking spectators to login when
// attempting to do things that are not possible as a specatator (like
// attempting to do things that are not possible as a spectator (like
// add an emoji reaction, star a message, etc.). While in many cases,
// we will prefer to hide menu options that don't make sense for
// spectators, this modal is useful for everything that doesn't make

View File

@ -29,7 +29,7 @@ export let stream_cursor;
let has_scrolled = false;
export function update_count_in_dom(stream_li, count) {
// The subsription_block properly excludes the topic list,
// The subscription_block properly excludes the topic list,
// and it also has sensitive margins related to whether the
// count is there or not.
const subscription_block = stream_li.find(".subscription_block");

View File

@ -253,7 +253,7 @@ export function add_sub_to_table(sub) {
// If a stream is already listed/added in subscription modal,
// display stream in `Subscribed` tab and return.
// This can happen in some corner cases (which might
// be backend bugs) where a realm adminsitrator is subscribed
// be backend bugs) where a realm administrator is subscribed
// to a private stream, in which case they might get two
// stream-create events.
stream_ui_updates.update_stream_row_in_settings_tab(sub);

View File

@ -154,7 +154,7 @@ export function initialize() {
$("body").on("blur", ".message_control_button", (e) => {
// Remove tooltip when user is trying to tab through all the icons.
// If user tabs slowly, tooltips are displayed otherwise they are
// distroyed before they can be displayed.
// destroyed before they can be displayed.
e.currentTarget._tippy.destroy();
});

View File

@ -317,7 +317,7 @@ export function sort_recipients({
The following optimization is important for large realms.
If we know we're only showing 5 suggestions, and we
get 5 matches from `best_users`, then we want to avoid
calling the expensives sorts for `ok_users` and `worst_users`,
calling the expensive sorts for `ok_users` and `worst_users`,
since they just get dropped.
*/

View File

@ -1518,7 +1518,7 @@ input[type="checkbox"] {
.content-wrapper {
position: absolute;
left: 251px;
/* the width of the settings sidbar this is right of is 250px + 1px border. */
/* the width of the settings sidebar this is right of is 250px + 1px border. */
width: calc(100% - 250px - 1px);
height: 100%;
overflow: hidden;

View File

@ -470,7 +470,7 @@ li,
padding: 6px;
display: block;
/* The below two avoids the padded element from displaying
it's own border and background color */
its own border and background color */
border: none;
background-clip: content-box;
/* The z-index here ensures that the copy-message

View File

@ -244,7 +244,7 @@
<div class="input-group">
<label for="realm_add_custom_emoji_policy" class="dropdown-title">{{t "Who can add custom emoji" }}</label>
<select name="realm_add_cutsom_emoji_policy" class="setting-widget prop-element" id="id_realm_add_custom_emoji_policy" data-setting-widget-type="number">
<select name="realm_add_custom_emoji_policy" class="setting-widget prop-element" id="id_realm_add_custom_emoji_policy" data-setting-widget-type="number">
{{> dropdown_options_widget option_values=common_policy_values}}
</select>
</div>

View File

@ -83,7 +83,7 @@
</li>
<li>The first time, you'll need to type <code>Ctrl-A c</code> to switch to a new terminal in your screen session.</li>
<li><code>kinit -l7d && aklog</code></li>
<li>(Type type your password to renew your Kerberos tickets).</li>
<li>(Type your password to renew your Kerberos tickets).</li>
</ol>
<p>

View File

@ -100,7 +100,7 @@ format used by the Zulip server that they are interacting with.
* [`PATCH /realm`]: Added `string_id` parameter for changing an
organization's subdomain. Currently, this is only allowed for
changing changing a demo organization to a normal one.
changing a demo organization to a normal one.
**Feature level 103**

View File

@ -89,13 +89,13 @@ below are for a webhook named `MyWebHook`.
* `zerver/webhooks/mywebhook/fixtures/messagetype.json`: Sample json payload data
used by tests. Add one fixture file per type of message supported by your
integration.
* `zerver/webhooks/mywebhook/tests.py`: Tests for your webbook.
* `zerver/webhooks/mywebhook/tests.py`: Tests for your webhook.
* `zerver/webhooks/mywebhook/doc.md`: End-user documentation explaining
how to add the integration.
* `static/images/integrations/logos/mywebhook.svg`: A square logo for the
platform/server/product you are integrating. Used on the documentation
pages as well as the sender's avatar for messages sent by the integration.
* `static/images/integrations/mywebbook/001.svg`: A screenshot of a message
* `static/images/integrations/mywebhook/001.svg`: A screenshot of a message
sent by the integration, used on the documentation page. This can be
generated by running `tools/generate-integration-docs-screenshot --integration mywebhook`.
* `static/images/integrations/bot_avatars/mywebhook.png`: A square logo for the

View File

@ -109,7 +109,7 @@
<span id="normal-zephyr-mirror-error-text">
We recommend that
you <a class="webathena_login">give Zulip the ability to mirror the messages for you via
WebAthena</a>. If you'd prefer, you can instead
Webathena</a>. If you'd prefer, you can instead
<a href="/zephyr-mirror" target="_blank" rel="noopener noreferrer">run the
Zephyr mirror script yourself</a> in a screen
session.

View File

@ -390,7 +390,7 @@ a.button:hover {
line-height: 100%;
}
/* iOS converts adreses in emails to links automatically */
/* iOS converts addresses in emails to links automatically */
.apple-link a {
color: inherit !important;
font-family: inherit !important;

View File

@ -15,7 +15,7 @@ communication with students, and among the 30-50 person course staff.
[Tobias Lasser](https://ciip.in.tum.de/people/lasser.html), lecturer
at the TUM Department of Informatics, set out to teach an introductory
algorithms class with 1400 students in April 2020, as the Covid-19
algorithms class with 1400 students in April 2020, as the COVID-19
pandemic was sweeping across Europe. With instruction moving online,
he knew that finding an effective communication platform was more
important than ever.

View File

@ -6,7 +6,7 @@ top universities worldwide. The UCSD math department offers
prestigious graduate and undergraduate programs, with course topics
ranging from foundational material to cutting-edge research.
In response to the covid pandemic, UCSD instruction moved online early
In response to the COVID-19 pandemic, UCSD instruction moved online early
in 2020. As instructors scrambled to figure out online education,
Kiran Kedlaya, Professor of Mathematics at UCSD, gave himself a bigger
challenge: “Seeing the unique opportunity, I decided to open my

View File

@ -10,7 +10,7 @@ An organization owner can change the role of any user. An
organization administrator can change the role of most users, but
cannot create or demote an organization owner.
You can can revoke your own owner or administrative privileges if
You can revoke your own owner or administrative privileges if
there is at least one other owner in the organization (consider
promoting a new owner or [deactivating the
organization](/help/deactivate-your-organization) instead).

View File

@ -107,7 +107,7 @@ the user will get to choose which playground to open the code in.
* The **Language** field is the human-readable Pygments language name for that
programming language. The language tag for a code block is internally mapped
to these human-readable Pygments names. E.g: `py3` and `py` are mapped to
to these human-readable Pygments names; e.g., `py3` and `py` are mapped to
`Python`. One can use the typeahead (which appears when you type something
or just click on the language field) to lookup the Pygments name.

View File

@ -149,7 +149,7 @@ users to other sets of roles:
## Manage pending invitations
Organization owners can revoke or resend any invitation or reusable
invitation link. Organization administrators can can do the same
invitation link. Organization administrators can do the same
except for invitations for the organization owners role.
{start_tabs}

View File

@ -26,7 +26,7 @@ source, and synced into Zulip via the [Zulip API](/api) or another method.
By default, any user can
[change their email address](/help/change-your-email-address). However, you
can instead prevent all email changes. This is especially useful for
organizations that are using LDAP or a another single
organizations that are using LDAP or another single
sign-on solution to manage user emails.
{start_tabs}

View File

@ -10,7 +10,7 @@ First, [open the compose box](/help/open-the-compose-box). Then
the bottom of the compose box to find files on your computer.
Zulip will insert a link to the file, in Markdown format:
`[link text](URL)`. You can modily the `link text` to whatever you want.
`[link text](URL)`. You can modify the `link text` to whatever you want.
Zulip will automatically generate a **thumbnail** of the file when you send
it, if it can. You can

View File

@ -4,7 +4,7 @@ A user's profile includes their name, email, role, the date they joined,
when they were last active, and any
[custom profile fields](/help/add-custom-profile-fields) they've filled out.
It also contains additional tabs showing a user's susbcribed streams
It also contains additional tabs showing a user's subscribed streams
and user groups. Note that the information in those tabs is limited to
streams for which [you can see all subscribers](/help/stream-permissions).

View File

@ -151,7 +151,7 @@
Kandra Labs is supported by nearly $1M
in <a href="https://seedfund.nsf.gov/">SBIR
grants</a> from the US National Science
Foundation, and Zulip has benefitted enormously
Foundation, and Zulip has benefited enormously
from the 30+ developers that started working on
Zulip
via <a href="https://summerofcode.withgoogle.com/">Google

View File

@ -3,7 +3,7 @@ Run your favorite chatbot in Zulip!
0. [Install errbot](https://errbot.readthedocs.io/en/latest/user_guide/setup.html)
and follow to instructions to set up a `config.py`.
0. Check our our [Errbot integration package for Zulip](https://github.com/zulip/errbot-backend-zulip)
0. Check out our [Errbot integration package for Zulip](https://github.com/zulip/errbot-backend-zulip).
Clone this repository somewhere convenient.
0. Install the requirements listed in `errbot-backend-zulip/requirements.txt`.

View File

@ -8,7 +8,7 @@ from typing import Any, Dict, Optional
import requests
# Scans zulip repositary for issues that don't have any `area` labels.
# Scans zulip repository for issues that don't have any `area` labels.
# GitHub API token is required as GitHub limits unauthenticated
# requests to 60/hour. There is a good chance that this limit is
# bypassed in consecutive attempts.

View File

@ -13,7 +13,7 @@ Usage:
Options:
--test-custom-db
This will instruct the install test to be ran with a custom database name and user.
This will instruct the install test to be run with a custom database name and user.
EOF
}

View File

@ -24,7 +24,7 @@ from typing import Any, Dict, List
import digitalocean
import requests
parser = argparse.ArgumentParser(description="Create a Zulip devopment VM DigitalOcean droplet.")
parser = argparse.ArgumentParser(description="Create a Zulip development VM DigitalOcean droplet.")
parser.add_argument(
"username", help="GitHub username for whom you want to create a Zulip dev droplet"
)

View File

@ -22,7 +22,7 @@ TENSE_DATA = [
(["disables", "disabling", "disabled"], "disable"),
(["displays", "displaying", "displayed"], "display"),
(["documents", "documenting", "documented"], "document"),
(["drys", "drying", "dryed"], "dry"),
(["drys", "drying", "dried"], "dry"),
(["ends", "ending", "ended"], "end"),
(["enforces", "enforcing", "enforced"], "enforce"),
(["enqueues", "enqueuing", "enqueued"], "enqueue"),

View File

@ -582,8 +582,8 @@ html_rules: List["Rule"] = [
{
"pattern": " '}}",
"description": "Likely misplaced quoting in translation tags",
"good_lines": ["{{t 'translateable string' }}"],
"bad_lines": ["{{t 'translateable string '}}"],
"good_lines": ["{{t 'translatable string' }}"],
"bad_lines": ["{{t 'translatable string '}}"],
},
{
"pattern": "placeholder='[^{]",

View File

@ -97,7 +97,7 @@ EMOJI_NAME_MAPS: Dict[str, Dict[str, Any]] = {
"1f630": {"canonical_name": "cold_sweat", "aliases": []},
"1f622": {"canonical_name": "cry", "aliases": []},
# stressed from https://beebom.com/emoji-meanings/. The internet generally
# didn't seem to know what to make of the dissapointed_relieved name, and I
# didn't seem to know what to make of the disappointed_relieved name, and I
# got the sense it wasn't an emotion that was often used. Hence replaced it
# with exhausted.
"1f625": {"canonical_name": "exhausted", "aliases": ["disappointed_relieved", "stressed"]},
@ -178,7 +178,7 @@ EMOJI_NAME_MAPS: Dict[str, Dict[str, Any]] = {
# applause from https://emojipedia.org/clapping-hands-sign/
"1f44f": {"canonical_name": "clap", "aliases": ["applause"]},
# welcome and thank_you from
# https://emojipedia.org/person-with-folded-hands/, namaste from indian
# https://emojipedia.org/person-with-folded-hands/, namaste from Indian
# culture
"1f64f": {"canonical_name": "pray", "aliases": ["welcome", "thank_you", "namaste"]},
# done_deal seems like a natural addition
@ -889,7 +889,7 @@ EMOJI_NAME_MAPS: Dict[str, Dict[str, Any]] = {
"1f69e": {"canonical_name": "mountain_railway", "aliases": []},
# elevated_train seems like a reasonable addition
"1f69d": {"canonical_name": "monorail", "aliases": ["elevated_train"]},
# from gemoji/Unicode. Also, don't thin we need two bullettrain's
# from gemoji/Unicode. Also, don't think we need two bullettrain's
"1f684": {"canonical_name": "high_speed_train", "aliases": []},
# Google, Wikipedia, etc. prefer bullet train to bullettrain
"1f685": {"canonical_name": "bullet_train", "aliases": []},

View File

@ -29,7 +29,7 @@ assert_provisioning_status_ok(options.skip_provision_check)
with test_server_running(
skip_provision_check=options.skip_provision_check, external_host="zulipdev.com:9981"
):
# Zerver imports should happen after `django.setup()` is run
# zerver imports should happen after `django.setup()` is run
# by the test_server_running decorator.
from zerver.lib.actions import (
change_user_is_active,

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