snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled

This commit is contained in:
upstream-mirror
2026-09-15 15:05:30 +05:00
commit 64898b2c79
8999 changed files with 1757358 additions and 0 deletions

201
docs/translating/chinese.md Normal file
View File

@@ -0,0 +1,201 @@
# Chinese translation style guide(中文翻译指南)
## Note(题记)
The language style of Zulip is a little colloquial, while the Chinese
translation prefers a formal style and also avoids stereotypes. Since
Zulip is a modern internet application, many Chinese translations are
borrowed from the popular Web software, such as WeiBo, WeChat, QQ
Mail etc. that most Chinese users are familiar with.
Zulip 的文风比较口语化,考虑到大多数中国用户的习惯,翻译时的语言习惯稍
微正式了一点,但也尽量避免刻板。Zulip 是一款时尚的互联网应用,翻译时也
借鉴了中国用户熟悉的微博、微信、QQ 邮箱等软件的用语习惯,以期贴近用户。
## Terms(术语)
- Message - **消息**
"Message" can be literally translated as "消息" and "信息", both
OK. Here "消息" is chosen for translation. For example, "Stream
Message" is translated as "频道消息", while "Direct Message" is
translated as "直信". The domestic WeiBo, WeChat also keep in line
with the habit. "Starred Message" is similar to "Star Mail (星标邮件)"
feature in QQ Mail, so it is translated into "星标消息".
Message 可直译为“消息”、“信息”等,两者皆可,这里统一选用“消息”。例如,
“Stream Message”译作“频道消息”;但“Direct Message”又译为“直信",与国
内微博、微信的使用习惯保持一致。“Starred Message”类似于 QQ 邮箱中的“星标
邮件”功能,这里也借鉴翻译为“星标消息”。
- Stream - **频道**
There were several other optional translations, e.g., "群组(Group)", "
主题(Subject)", and "栏目(Column)". The "频道(Channel)" is in use now,
which is inspired by the chat "Channel" in the game Ingress. Since
"Stream" can be "Created/Deleted" or "Subscribed/Unsubscribed",
"Stream" can also initiate a "Topic" discussion, the meanings of "频道
(Channel) are closer to "Stream" than others. Another translation is "
讨论组", which is a term of QQ, in which it is a temporary chat
group. However, "讨论组" has one more Chinese character than "频道
(Channel)".
曾经使用的翻译有“群组”、“主题”、“版块”,还有“栏目”。现在选择的“频道”灵
感来源于 Ingress 游戏中的聊天“Channel”。因为“Stream”可以“新建/删除
(Create/Delete)”、也可以“订阅/退订(Subscribe/Unsubscribe)”,
“Stream”内部还可以发起“话题(Topic)讨论。“Stream”还有一个备选方案,就
是“讨论组”,字多一个,稍微有点啰嗦。主要参考自以前 QQ 的“讨论组”,在 QQ 中
是一种临时的群组。
- Topic - **话题**
- Invite-Only/Public Stream - **私有/公开频道**
"Invite-Only Stream" requires users must be invited explicitly to
subscribe, which assures a high privacy. Other users cannot perceive
the presence of such streams. Since literal translation is hard to
read, it is translated sense to sense as "私有频道(Private Stream)"。
“Invite-Only Stream”是需要频道内部用户邀请才能订阅的频道;“Invite-Only
Stream”具有非常好的私密性,用户在没有订阅时是不能感知这类频道的存在的。
直译读起来有点拗口,因此选择译为“私有频道”。
- Bot - **机器人**
- Integration - **应用整合**
"Integration" is literally translated as "集成" or "整合". It means
integrating Zulip production with other applications and services. For
integrity in Chinese expression, it is translated as "应用整合
(Application Integration)".
“Integration”原意为“集成”与“整合”,这里表示将其它的应用或者服务与 Zulip
实现整合。为表达意思完整,补充翻译为“应用整合”。
- Notification - **通知**
- Alert Word - **提示词**
## Phrases(习惯用语)
- Subscribe/Unsubscribe - **订阅/退订**
The perfect tense subscribed/unsubscribed is translated as "已订阅/已
退订". Sometimes "Join" is used to express the same meanings as
"Subscribe", also be translated as "订阅(Subscribe)".
完成时态译为“已订阅(Subscribed)”和“已退订(Unsubscribed)”。有时,
“Join”也会用来表达与“Subscribe”相同的意思,也一并翻译为“订阅”。
- Narrow to ... - **筛选**
"Narrow to" is translated as "筛选(Filter by)" for now, based on two considerations:
1. In Chinese, the word "筛选(Filter)" means a way to select according
to the specific conditions. "Narrow to ..." means "to narrow the
scope of ...". The two words share the common meanings.
2. "筛选" is a common computer phrase and has been well
accepted by public, e.g., the "Filter(筛选)" feature in Microsoft
Excel.
In addition, in the searching context "Narrow to ..." is not
translated as "筛选(Filter)" but as "搜索(Search)" because of
readability considerations.
这里暂且翻译为“筛选”。主要有两点考虑:
1. 在汉语中,“筛选”表示按照指定条件进行挑选的方式。“Narrow to ...”的含
义为“使...缩小范围”,两者有一定共通性。
2. “筛选”也是比较大众化的计算机用语,易于为大家所接受。例如 Microsoft
Excel 中的“筛选”功能。
另外,在搜索功能的语境中,“Narrow to ...”没有翻译为“筛选”,而翻译为“搜
索”,这是出于可读性的考虑。
- Mute/Unmute - **开启/关闭免打扰**
"Mute" is mostly translated as "静音(Silent)", which is common in TV
set. Such a translation is not appropriate for Zulip. "开启/关闭免打
扰(Turn off/on Notification)" is a sense to sense translation, which
is also borrowed from the WeChat.
“Mute”常见的中文翻译为“静音”,在电视设备中常见,用在 Zulip 中并不太合适。
这里取意译,与大家常用的微信(WeChat)中“消息免打扰”用语习惯一致。
- Deactivate/Reactivate - **禁用/启用(帐户),关闭/激活(社区)**
When applied to a user account, translated as "禁用/启用
(Disable/Enable)", for example, "Deactivated users" to "禁用的用户";
when applied to a realm, translated as "关闭/激活(Close/Open)", for
example "Your realm has been deactivated." to "您的社区已关闭".
当应用于用户帐户时,选择翻译为“禁用/启用”,例如“Deactivated users”翻译
为“禁用的用户”;当应用于“社区”(Realm)时,选择翻译为“关闭/激活”,如
“Your realm has been deactivated.”翻译为“您的社区已关闭”。
- Invalid - **不正确**
"Invalid" is mainly used in exception information, which is uncommon
for general users. Other translations "错误(Error)", "非法(Illegal)",
"不合法(Invalid)" are all ok. Generally, it is translated as "不正确
(Incorrect)" for consistency. For example, "Invalid API key" is
translated as "API 码不正确".
“Invalid”大部分用于一些异常信息,这些信息普通用户应该很少见到。可选翻
译有“错误”、“非法”、“不合法”;为保持一致的习惯,这里统一翻译为“不正确”。
例如“Invalid API key”翻译为“API 码不正确”。
- I want - **开启**
Mainly used in the settings page, literally translated as "I want to
...", which is colloquial and inappropriate in Chinese expression. It
is translated sense to sense as "开启(Turn on some options)".
主要出现在设置页面(Setting Page)中,直译为“我想...”、“我要...”。取直
译过于口语化,并不合乎中文的使用习惯。因此这里取意译,翻译为“开启(某
某功能选项)”。
- User/People/Person - **用户**
All translated as "用户(User)".
统一翻译为“用户”。
## Others(其它)
- You/Your - **您/您的**
It is translated as 您/您的(You/Your) rather than "你/你的(You/Your)",
so as to express respect to the user.
出于尊重用户的目的,翻译为敬语“您/您的”,而不翻译为“你/你的”。
- We - **我们(或不翻)**
"We" is generally translated as the first person "我们(We)", while in
formal Chinese, extensive use of "We" is relatively rare. So in many
times and places it can be ignored not to translate or transforming
expression. For example, "Still no email? We can resend it" is
translated as "仍然没有收到邮件?点击重新发送(Still no email? Click to
resend.)".
一般翻译为第一人称“我们”;但也有不少地方选择不翻译,因为在中文使用习惯
中,不太以自我为中心,大量使用“我们”的情况比较少。因此有时会有下面这样
翻译:“Still no email? We can resend it” 译为 “仍然没有收到邮件?点击
重新发送”。
- The Exclamation/Dot - (一般省略)
The exclamation appears in many places in Zulip. The tone that the
exclamation expresses should be stronger in Chinese than in
English. So the exclamation can be just deleted when translating or
replaced with the dot, unless you are sure to write it. In addition,
the dot in Chinese (。) often has a bad effect on page layout. It is
recommended to omit the dot, just leave empty at the end of the
sentence or paragraph.
感叹号在 Zulip 中出现非常多,可能英文中感叹号的语气比中文中略轻一点。在
中文翻译建议省略大部分的感叹号。另外,句号在中文排版中比较影响美观,因
此也一般建议省略不翻。句末留空即可。

140
docs/translating/finnish.md Normal file
View File

@@ -0,0 +1,140 @@
# Finnish translation style guide
## Guidelines
Tervetuloa!
Before you start, take a look these instructions we have gathered here
for you to help on your translation journey.
### Word order
Consider translating the same thing with the easiest Finnish possible.
It's not mandatory to follow the English text word by word, as long as
the message is clear.
Eg.
- Click the button below to create the organization and register your
account. -> Luo organisaatio ja rekisteröi tilisi napsauttamalla
alla olevaa painiketta.
- Sent! Your message is outside your current narrow. -> Lähetetty!
Viesti on nykyisen näkymäsi ulkopuolella.
### Grammatical case (Sijamuodot)
Translate using the UI to be sure what is the correct grammatical
case. Basic form of a word might not always be suitable for the
purpose.
Eg.
- Topics marked as resolved -> Ratkaistut aiheet (versus Aiheet, jotka on merkitty ratkaistuiksi)
- View Shortcuts -> Katsel**un** pikanäppäimet
### Loan word (Lainasanat)
Even though it's common to use words formed directly from English, try
to consider also users without IT background, people that don't speak
English and accessibility. User interface should contain these with
minimum amount, but for technical error messages could be preferred.
There are some amount of software related words that are widely used
as loan words.
See section [Terms](#terms) for more details.
### **_Please_**, in error messages
As it might appeal to use correspondence _Ole hyvä ja_, it's not
commonly used in Finnish. We are strict and used to more direct
messaging. Let's not translate _please_ and use instruction format
only. No Finn is going to be offended by this.
Eg.
- Please enter at most 10 emails. -> Lisää korkeintaan 10 sähköpostia.
But
- Yes, please! -> Kyllä, kiitos!
### Zulip word inflection
- in/from Zulip - **Zulipissa** / **Zulipista** / **Zulipin**
- Zulip organization - **Zulip-organisaatio**
- Zulip app - **Zulip-sovellus**
### Your -expression
Finnish language has _form of ownership_ so there shouldn't be need to
thanslate _your_ as _sinun_ but rather use _si_ ending. It might be
considered to leave out as well.
Eg.
- Your organization -> Organisaatio**si**
- Your account -> Tili**si**
But
- You do have active accounts in the following organization(s). ->
Sinulla ei ole aktiivista tiliä seuraavissa organisaatio(i)ssa.
### Comma
Use commas in whole sentences where it is required. You can use these instructions as help.
[Kotimaisten kielten keskus - pilkku.](http://www.kielitoimistonohjepankki.fi/haku/pilkku/ohje/86)
## Terms
- Administrator - **Järjestelmänvalvoja**
- App - **Sovellus**
- Authorization - **Valtuus**
- Avatar - **Avatar**
- Beta - **Beta**
- Change - **Muuta**
- Cheat sheet - **Lunttilappu**
- Click - **Napsauta**
- Configure - **Määritä**
- Deactivate - **Poista käytöstä**
- Domain - **Verkkotunnus**
- Export - **Poiminta**
- Filter - **Suodata**
- Full member - **Täysivaltainen jäsen**
- Host - **Isäntä**
- Help center - **Tukikeskus**
- ID - **Tunnus**
- Integraatio - **Integraatio**
- Interactive - **Interaktiivinen**
- Invalid - **Virheellinen**
- Moderator - **Moderaattori**
- Mute - **Mykistää**
- Narrow - **Rajaa hakua**
- Notification - **Ilmoitus**
- Topic - **Aihe**
- Organization - **Organisaatio**
- Permission - **Lupa**
- Pin - **Kiinnitä**
- Picker - **Valitsin**
- Plan - **Tilaus**
- DM (direct messages) - **SV (suoraviesti)** - Short version is needed in mobile.
- Reset - **Nollata**
- Save - **Tallenna**
- Stream - **Kanava**
- Subscriber - **Tilaaja**
- Subscription - **Tilaus**
- Subscribe a stream - **Tilaa kanava**
- Subdomain - **Aliverkkotunnus**
- Shortcuts - **Pikanäppäimet**
- Unsubscribe - **Peru tilaus**
- Unsupported - **Ei-tuettu**
- Unresolve - **Merkitse ratkaisemattomaksi**
- Webhook - **Webhook**
- Whoops - **Hupsista**
- Widget - **Widgetti**
## Other
Some translations can be tricky, so please don't hesitate to ask the
community or to contribute to this guide! Thanks for your effort!

View File

@@ -0,0 +1,28 @@
# French translation style guide
## Community
In addition to the topic [#translation > French translations][]
in the main "#translation" channel, there is a dedicated channel
[#translation/fr][] for discussing the French translations.
Please join there too and say hello.
[#translation > French translations]: https://chat.zulip.org/#narrow/channel/58-translation/topic/French.20translations
[#translation/fr]: https://chat.zulip.org/#narrow/channel/371-translation.2Ffr
## Rules
- Use of _vous_ instead of _tu_;
- A non-breaking space before a colon and a semi-colon;
- A space after a colon, a semi-colon, a dot and a comma;
- Follow English capitalization;
- Prefer the infinitive form of a verb: _Save_ into _Sauver_ (instead of _Sauvez_).
Some translations can be tricky, so please don't hesitate to ask the community or contribute to this guide.
## Terms
Please refer to the [Weblate
glossary](https://hosted.weblate.org/projects/zulip/glossary/fr/) for
recommended translations. If some important word is missing from the
glossary, please ask in [#translation/fr][].

362
docs/translating/german.md Normal file
View File

@@ -0,0 +1,362 @@
# German translation style guide (Richtlinien für die deutsche Übersetzung)
Thank you for considering to contribute to the German translation!
Before you start writing, please make sure that you have read the
following general translation rules.
## Rules
### Formal or informal?
**Informal.**
Although written German tends to be quite formal, websites in German are
usually following informal netiquette. As Zulip's guides are written
in a more colloquial style, German translations should be rather informal as well.
**Don't use slang or regional phrases in the German translation:**
- Instead of _"So'n Dreck kann jedem mal passieren."_, you could
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 Quelltext steht."_ instead.
### Gender-inclusive language
**Use gender-inclusive language, placing a _gender colon_
([Gender-Doppelpunkt](https://de.wikipedia.org/wiki/Gender-Doppelpunkt))
where necessary.**
Place the gender colon between the word stem and the feminine ending.
- Instead of _Nutzer_, use _Nutzer:innen_
- Instead of _dieser Nutzer_, use _diese:r Nutzer:in_
**Try to find gender-neutral alternatives before using the gender colon.**
- Instead of _jede:r_, try to use _alle_.
**If a gender-neutral term is readily available, consider using it.**
- Instead of _benutzerdefiniert_, consider using _eigen_.
**In compound nouns, only use the gender colon in the last element, if appropriate.**
- Instead of _Nutzer:innengruppe_ or _Nutzer:innen-Gruppe_, use _Nutzergruppe_.
### Form of address
**Use "Du" instead of "Sie".**
For the reasons provided in [the previous section](#formal-or-informal),
stick to _Du_ (informal) instead of _Sie_ (formal) when addressing
the reader and remember to capitalize _Du_.
### Form of instruction
**Prefer imperative over constructions with auxiliary verbs.**
For instructions, try to use the imperative (e.g., _"Gehe auf die Seite"_ -
_"Go to the page"_) instead of constructions with auxiliary verbs
(e.g., _"Du musst auf die Seite ... gehen"_ - _"You have to go the page ..."_).
This keeps the phrases short, less stiff and avoids unnecessary addressing
of the reader.
### Rules for labels
**Use continuous labels with verbs in infinitive form**
To be consistent with other online platforms, use continuous labels for buttons,
item titles, etc. with verbs in infinitive form,
e.g., _Manage streams_ - _Kanäle verwalten_ instead of _Verwalte Kanäle_.
### Concatenation of words
**Try to avoid it.**
German is famous for its concatenations of nouns
(e.g., _Heizölrückstoßdämpfung_, which means _fuel oil recoil attenuation_).
For the sake of correct rendering and simplicity, you should try to avoid such
concatenations whenever possible, since they can break the layout of the Zulip
frontend. Try to stick to a maximum length of 20 characters and follow your
intuition.
- A term like _Tastaturkürzel_ for _Keyboard shortcuts_ is fine - it is
shorter than 20 characters and commonly used in web applications.
- A term like _Benachrichtigungsstichwörter_ for _Alert words_ should
not be used, it sounds odd and is longer than 20 characters.
You could use "_Stichwörter, die mich benachrichtigen_" instead.
### Anglicisms
**Use them if other web apps do so and a teenager could understand the term.**
Unlike other languages, German happily adapts modern words from English.
This becomes even more evident in internet applications,
so you should not be afraid of using them if they provide an advantage over
the German equivalent. Take the following two examples as a reference:
- Translating _Bot_: Use _Bot_, as a completely accurate German
equivalent **doesn't** exist (e.g., _Roboter_) and the term _Bot_ is not
unknown to German speakers.
### Special characters
**Use "ä, ö, ü" and "ß" consistently.**
While _ä, ö, ü_ and _ß_ are more and more being replaced by _ae, oe, ue_
and _ss_ in chats, forums and even websites, German translations
containing umlauts have a more trustworthy appearance.
For capitalizations, you can replace the _ß_ by _ss_.
### False friends
**Watch out!**
A false friend is a word in another language that is spelled
or sounds similar to a word in one's own language,
yet has a different meaning.
False friends for the translation from German to English include
_actually_ - _eigentlich_, _eventually_ - _schließlich_, _map_ - _Karte_, etc.
Make sure to not walk into such a trap.
### Other
- Try to keep words and phrases short and understandable. The front-end
developers will thank you ;)
- Be consistent. Use the same terms for the same things, even if that
means repeating. Have a look at other German translations on Zulip
to get a feeling for the vocabulary.
- Balance common verbs and nouns with specific IT-related translations
of English terms - this can be tricky, try to check how other resources
were translated (e.g., Gmail, Microsoft websites, Facebook) to decide
what wouldn't sound awkward / rude in German.
- For additional translation information, feel free to check out
[this](https://en.wikipedia.org/wiki/Wikipedia:Translating_German_WP) Wikipedia guide
on translating German Wikipedia articles into English.
Some terms are very tricky to translate, so be sure to communicate with other German
speakers in the community. It's all about making Zulip friendly and usable.
## Terms (Begriffe)
- Message - **Nachricht**
_"Nachricht" (Facebook, WhatsApp, Transifex)_
- Direct Message (DM), Direct Messages (DMs) - **Direktnachricht (DM), Direktnachrichten (DMs)**
While we try to avoid concatenating words whenever possible, "Direktnachricht" is used
by many other platforms (e.g., X/Twitter, Slack, Discord).
Use _DM_ with its plural form _DMs_ rather than DN/DNs in line with other services.
_"Direktnachricht" (X/Twitter, Slack)_
- Starred Message - **Markierte Nachricht**
We go with "markiert" instead of "gesternt" (which is not even a proper
German word) here, since it comes closer to the original meaning of "starred".
_"Markierte Nachricht" (Gmail, Transifex),
"Nachricht mit Stern" (WhatsApp)_
_"Bereich" (Transifex), "Community" (Google+)_
- Stream - **Stream**
Even though the term **Stream** is not commonly used in German web applications,
it is both understood well enough by many Germans with only little English
skills, and the best choice for describing Zulip's chat hierarchy. The term
"Kanal" wouldn't fit here, since it translates to "channel" - these are used
by other chat applications with a simple, flat chat hierarchy, that is,
no differentiation between streams and topics.
_"Stream" (Transifex), "Kanal" (KDE IRC documentation, various
small German forums)_
- Topic - **Thema**
_(Gmail - for email subjects, Transifex)_
- Public Stream - **Öffentlicher Stream**
While some might find this direct translation a tad long, the alternative
"Offener Stream" can be ambiguous - especially users who are inexperienced
with Zulip could think of this as streams that are online.
_"Öffentlicher Stream" (Transifex)_
- Bot - **Bot**
Not only is "bot" a short and easily memorable term, it is also widely used
in German technology magazines, forums, etc.
_"Bot" (Transifex, Heise, Die Zeit)_
- Integration - **Integration**
While the German translation of "Integration" is spelled just like the English
version, the translation is referring to the German term. For this reason,
use "Integrationen" instead of "Integrations" when speaking of multiple
integrations in German. There aren't many German sources available for this
translation, but "Integration" has the same meaning in German and English.
_"Integration/-en" (Transifex)_
- Notification - **Benachrichtigung**
Nice and easy. Other translations for "notification" like
"Erwähnung", "Bescheid" or "Notiz" don't fit here.
_"Benachrichtigung" (Facebook, Gmail, Transifex, Wikipedia)_
- Alert Word - **Signalwort**
This one is tricky, since one might initially think of "Alarmwort" as a proper
translation. "Alarm", however, has a negative connotation, people link it to
unpleasant events. "Signal", on the other hand, is neutral, just like
"alert word". Nevertheless, [Linguee](https://www.linguee.de/deutsch-englisch/search?source=auto&query=alert+word)
shows that some websites misuse "Alarm" for the translation.
_"Signalwort" (Transifex), "Wort-Alarm" (Linguee)_
- View - **View** (Developer documentation)
Since this is a Zulip-specific term for
> every path that the Zulip server supports (doesn’t show a 404 page for),
and there is no German equivalent, talking of "Views" is preferable in the
developer documentation and makes it easier to rely on parts of the German
_and_ parts of the English documentation.
- View - **Ansicht** (User-facing documentation)
For user-facing documentation, we want to use "Ansicht" instead of "view",
as "Ansicht" provides a translated description for what you think of when
hearing "view". "Ansicht" is not desirable for the developer documentation,
since it does not emphasize the developing aspects of views (in contrast to
anglicisms, which Germans often link to IT-related definitions).
_"Ansicht" (Transifex)_
- Home - **Startseite**
Nice and easy. "Zuhause" obviously doesn't fit here ;).
_"Startseite" (Facebook, Transifex)_
- Emoji - **Emoji**
"Emoji" is the standard term for Emojis. Any other Germanized translation like
"Bildschriftzeichen" (which exists!) would sound stiff and outdated. "Emoticon"
works as well, but is not that common in German.
_"Emoji" (Facebook, WhatsApp), "Emoticon" (Google+)_
## Phrases (Ausdrücke)
- Subscribe/Unsubscribe - **Abonnieren/Deabonnieren**
This translation is unambiguous.
_"Deabonnieren" (YouTube, Transifex)_
- Narrow to - **Begrenzen auf**
Transifex has two different translations for "Narrow to" -
"Schränke auf ... ein." and "Begrenze auf ... ." Both sound a bit strange to a
German speaker, since they would expect grammatically correct sentences when
using the imperative (e.g., "Schränke diesen Stream ein auf ... .") Since this
would be too long for many labels, the infinitive "begrenzen auf" is preferable.
"einschränken auf" sounds equally good, but Transifex shows more use cases for
"begrenzen auf".
_"Schränke auf ... ein." (Transifex) "Begrenze auf ... ." (Transifex)_
- Filter - **Filtern**
A direct translation is fine here. Watch out to use the infinitive instead
of the imperative, e.g., "Nachrichten filtern" instead of "Filtere Nachrichten".
_"Filtern" (Thunderbird, LinkedIn)_
- Mute/Unmute - **Stummschalten/Lautschalten**
"Lautschalten" is rarely used in German, but so is "Stummschaltung
deaktivieren". Since anyone can understand the idea behind "Lautschalten", it is
preferable due to its brevity.
- Deactivate/Reactivate - **Deaktivieren/Reaktivieren**
_"Deaktivieren/Reaktivieren" (Transifex)_
- Search - **Suchen**
_"Suchen" (YouTube, Google, Facebook, Transifex)_
- Pin/Unpin - **Anpinnen/Loslösen**
While "pinnen" is shorter than "anpinnen", "anpinnen" sweeps any ambiguity out of
the way. This term is not used too often on Zulip, so the length shouldn't be a
problem.
_"Anpinnen/Ablösen" (Transifex), "Pinnen" (Pinterest)_
- Mention/@mention - **Erwähnen/@-erwähnen**
Make sure to say "@-erwähnen", but "die @-Erwähnung" (capitalized).
_"Erwähnen/@-Erwähnen" (Transifex)_
- Invalid - **Ungültig**
_"Ungültig" (Transifex)_
- Customization - **Anpassen**
The literal translation "Anpassung" would sound weird in most cases, so we use
the infinitive form "anpassen".
- I want - **Ich möchte**
"Ich möchte" is the polite form of "Ich will".
_"Ich möchte" - (Transifex, general sense of politeness)_
- User - **Nutzer:in**
"Benutzer:in" would work as well, but "Nutzer:in" is shorter and more commonly
used in web applications.
_"Nutzer\*innen" (Figma, Facebook), "Benutzer\*innen" (GitHub,
Airtable), "Nutzer" (Facebook, Gmail), "Benutzer" (Transifex)_
- Person/People - Personen
We use "Personen" instead of plural "Nutzer:innen" for "people".
_"Nutzer/Personen" (Transifex)_
## Other (Verschiedenes)
- You - **Du**
Why not "Sie"? In brief, Zulip and other web applications tend to use a rather
informal language. If you would like to read more about the reasoning behind
this, refer to the [general notes](#formal-or-informal) for
translating German.
_"Du" (Google, Facebook), "Sie" (Transifex)_
- We - **Wir** (rarely used)
German guides don't use "wir" very often - they tend to reformulate the
phrases instead.
_"Wir" (Google, Transifex)_

63
docs/translating/hindi.md Normal file
View File

@@ -0,0 +1,63 @@
# Hindi translation style guide (हिन्दी अनुवाद शैली मार्गदर्शक)
- Use _आप_ as the second-person pronoun. Don't use तुम or तू.
(See [chat thread](https://chat.zulip.org/#narrow/channel/58-translation/topic/Hindi.20Translation/near/1762384).)
- Imperative, active, and continuous verbs, e.g., _manage streams_ -
_चैनल प्रबंधित करें_, not _चैनल प्रबंधन_.
- Warm and friendly phrasing whenever appropriate.
- No slang or regional phrases that could be unclear or too informal.
- Balance common verbs and nouns with specific IT-related translations
of English terms - this can be tricky, try to check how other
resources were translated (e.g., Gmail, Microsoft websites, Facebook)
to decide what wouldn't sound awkward / rude in Hindi.
Some terms are very tricky to translate, so be sure to communicate
with other Hindi speakers in the community. It's all about making
Zulip friendly and usable.
## Terms (शर्तें)
- Message - **संदेश**
- Direct message (DM) - **सीधा संदेश**
- Stream - **धारा**: the use of the literal Hindi word for stream
"प्रवाह" is very confusing and not the correct metaphor for Hindi
speaking people. The correct term would be "धारा".
- Topic - **विषय**
- Private/invite-only stream - **निजी / केवल-आमंत्रण धारा**
- Public stream - **सार्वजनिक धारा**
- Bot - **बॉट**
- Integration - **एकीकरण**
- Notification - **अधिसूचना**
- Alert word - **सतर्क शब्द**
- View - **राय**
- Filter - **छानना**: as used with narrowing (see below).
- Home - **मुख पृष्ठ**: we never use the term "घर" (literally home) in Hindi.
- Emoji - **इमोजी**
## Phrases (वाक्यांश)
- Subscribe/Unsubscribe to a stream - **एक धारा में सदस्यता लें/सदस्यता समाप्त करें**
- Narrow to - **अकेले फ़िल्टर करें**: this is _filter only_, because there's no other
word that's common enough in Hindi for _to narrow_.
- Mute/Unmute - **शांत/अशांत**
- Deactivate/Reactivate - **निष्क्रिय करें / पुन: सक्रिय करें**
- Search - **खोज करें/ढूंढें**
- Pin - **ठीक करना**
- Mention/@mention - **ज़िक्र करना / @ज़िक्र करना**
- Invalid - **अमान्य**
- Customization - **अनुकूलन**
- I want - **मुझे चाहिए**
- User - **उपयोगकर्ता**
- Person/People - **व्यक्ति/लोग**: "लोग" is the correct plural for
"व्यक्ति", but when talking of _लोग_ referring to it as a crowd, we use
"भीड़" instead.
## Others (अन्य)
- We - **हम**
- Message table - **संदेश बोर्ड**
- Enter/Intro - **दर्ज / परिचय**

20
docs/translating/index.md Normal file
View File

@@ -0,0 +1,20 @@
# Translating Zulip
```{toctree}
---
maxdepth: 3
---
translating
internationalization
chinese
finnish
french
german
hindi
japanese
polish
russian
spanish
urdu
```

View File

@@ -0,0 +1,364 @@
# Internationalization for developers
Zulip is designed with internationalization (i18n) in mind, which lets users
view the Zulip UI in their preferred language. As a developer, it's your
responsibility to make sure that:
- UIs you implement look good when translated into languages other than English.
- Any strings your code changes touch are correctly marked for translation.
This pages gives concrete guidance on how to accomplish these goals, as well as
providing additional context for those who are curious.
## How internationalization impacts Zulip's UI
Always be mindful that **text width is not a constant**. The width of the string
needed to express something varies dramatically between languages. This means
you can't just hardcode a button or widget to look great for English and expect
it to work in all languages.
You can test your work by changing the lengths of strings to be 50% longer and
50% shorter than in English. For strings that are already in the Zulip UI,
Russian is a good test case for translations that are generally longer than
English. Japanese translations are generally shorter.
## What should be marked for translation
Our goal is for **all user-facing strings** in Zulip to be tagged for
translation in both [HTML templates][html-templates] and code, and our linters
attempt to enforce this. This applies to every bit of language a user might see,
including things like error strings, dates, and email content.
The exceptions to the "tag everything users sees" rule are:
- Landing pages (e.g., <https://zulip.com/features/>)
- [Help center pages](../documentation/helpcenter.md)
- [Zulip updates](https://zulip.com/help/configure-automated-notices#zulip-update-announcements)
We do aim for those pages to be usable with tools like Google Translate.
Note that the "user-facing" part is also important. To make good use of our
community translators' valuable time, we only tag content that will actually be
displayed to users.
## How to mark a string for translation
When tagging strings for translation, variation between languages means that you
have to be careful in exactly what you tag, and how you split things up:
- **Punctuation** varies between languages (e.g., Japanese doesn't use
`.`s at the end of sentences). This means that you should always
include end-of-sentence symbols like `.` and `?` inside the
to-be-translated strings, so that translators can correctly
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
translatable strings** produces broken results. If a sentence contains a
variable, never tag the part before the variable separately from the part
after the variable.
- **Strings with numerals** (e.g., "5 bananas") work quite differently between
languages, so double-check your work when tagging strings with numerals for
translation. See the [plurals](#plurals-and-lists) section below for details.
Note also that we have a "sentence case" [capitalization
policy](translating.md#capitalization) that we enforce using linters that check
all strings tagged for translation in Zulip.
## Translation syntax in Zulip
A few general notes:
- Translation functions must be passed the string to translate, not a
variable containing the target string. Otherwise, the parsers that
extract the strings in a project to send to translators will not
find your string.
- Zulip makes use of the [Jinja2][] templating system for the server
and [Handlebars][] for the web app. Our [HTML templates][html-templates]
documentation includes useful information on the syntax and
behavior of these systems.
### Web application translations
We use the [FormatJS][] library for translations in the Zulip web app,
both in [Handlebars][] templates and JavaScript.
FormatJS uses the standard [ICU MessageFormat][], which includes
useful features such as [plural translations](#plurals-and-lists).
To mark a string translatable in JavaScript files, pass it to the
`intl.formatMessage` function, which we alias to `$t` in `intl.js`:
```js
$t({defaultMessage: "English text"})
```
The string to be translated must be a constant literal string, but
variables can be interpolated by enclosing them in braces (like
`{variable}`) and passing a context object:
```js
$t({defaultMessage: "English text with a {variable}"}, {variable: "Variable value"})
```
`$t` does not escape any variables, so if your translated string is
eventually going to be used as HTML, use `$t_html` instead.
```js
html_content = $t_html({defaultMessage: "HTML with a {variable}"}, {variable: "Variable value"});
$("#foo").html(html_content);
```
The only HTML tags allowed directly in translated strings are the
simple HTML tags enumerated in `default_html_elements`
(`web/src/i18n.ts`) with no attributes. This helps to avoid
exposing HTML details to translators. If you need to include more
complex markup such as a link, you can define a custom HTML tag
locally to the translation, or use a Handlebars template:
```js
$t_html(
{defaultMessage: "<b>HTML</b> linking to the <z-link>login page</z-link>"},
{"z-link": (content_html) => `<a href="/login/">${content_html.join("")}</a>`},
)
```
#### Plurals and lists
Plurals are a complex detail of human language. In English, there are
only two variants for how a word like "banana" might be spelled
depending on the number of objects being discussed: "1 banana" and "2
bananas". But languages vary greatly in how plurals work. For example,
in Russian, the form a noun takes
[depends](https://en.wikipedia.org/wiki/Russian_declension#Declension_of_cardinal_numerals)
in part on the last digit of its quantity.
To solve this problem, Zulip expresses plural strings using the
standard [ICU MessageFormat][] syntax, which defines how the string
varies depending on whether there's one item or many in English:
```js
"{N, plural, one {Done! {N} message marked as read.} other {Done! {N} messages marked as read.}}"
```
Translators are then able to write a translation using this same
syntax, potentially using a different set of cases, like this Russian
translation, which varies the string based on whether there was 1,
few, or many items:
```js
"{N, plural, one {Готово! {N} сообщение помечено как прочитанное.} few {Готово! {N} сообщений помечены как прочитанные.} many {Готово! {N} сообщений помечены как прочитанные.} other {Готово! {N} сообщений помечены как прочитанные.}}"
```
You don't need to understand how to write Russian plurals. As a
developer, you just need to write the correct ICU plurals for English,
which will always just have singular and plural variants, and
translators can take care of the rest.
Nonetheless, even the English format takes some concentration to
read. So when designing UI, we generally try to avoid unnecessarily
writing strings that require plurals in favor of other ways to present
information, like displaying an icon with a number next to it.
Languages differ greatly in how to construct a list of the form "foo,
bar, and baz". Some languages don't use commas! The web application
has a handy `util.format_array_as_list` function for correctly doing
this using the `Intl` module; use `git grep` to find examples.
#### Handlebars templates
For translations in Handlebars templates we also use FormatJS, through two
Handlebars [helpers][] that Zulip registers. The syntax for simple strings is:
```html+handlebars
{{t 'English text' }}
{{t 'Block of English text with a {variable}.' }}
```
If you are passing a translated string to a Handlebars partial, you can use:
```html+handlebars
{{> template_name
variable_name=(t 'English text')
}}
```
The syntax for HTML strings is:
<!-- The html+handlebars lexer fails to lex the single braces. -->
```text
{{#tr}}
<p>Block of English text.</p>
{{/tr}}
{{#tr}}
<p>Block of English text with a {variable}.</p>
{{/tr}}
```
Just like in JavaScript code, variables are enclosed in _single_
braces (rather than the usual Handlebars double braces). Unlike in
JavaScript code, variables are automatically escaped by our Handlebars
helper.
Handlebars expressions like `{{variable}}` or blocks like
`{{#if}}...{{/if}}` aren't permitted inside a `{{#tr}}...{{/tr}}`
translated block, because they don't work properly with translation.
The Handlebars expression would be evaluated before the string is
processed by FormatJS, so that the string to be translated wouldn't be
constant. We have a linter to enforce that translated blocks don't
contain Handlebars.
Restrictions on including HTML tags in translated strings are the same
as in JavaScript. You can insert more complex markup using a local
custom HTML tag like this:
```html+handlebars
{{#tr}}
<b>HTML</b> linking to the <z-link>login page</z-link>
{{#*inline "z-link"}}<a href="/login/">{{> @partial-block}}</a>{{/inline}}
{{/tr}}
```
### Server translations
Strings in the server primarily comprise two areas:
- Error strings and other values returned by the API.
- Strings in portico pages, such as the login flow, that are not
rendered using JavaScript or Handlebars.
#### Jinja2 templates
All user-facing text in the Zulip UI should be generated by an Jinja2 HTML
template so that it can be translated.
To mark a string for translation in a Jinja2 template, you
can use the `_()` function in the templates like this:
```jinja
{{ _("English text") }}
```
If a piece of text contains both a literal string component and variables, use a
block translation. This puts in placeholders for variables, to allow translators
to translate an entire sentence.
To tag a block for translation, Jinja2 uses the [trans][trans] tag, like this:
```jinja
{% trans %}This string will have {{ value }} inside.{% endtrans %}
```
Never break up a sentence like this, as it will make it impossible to translate
correctly:
```jinja
# Don't do this!
{{ _("This string will have") }} {{ value }} {{ _("inside") }}
```
#### Python
A string in Python can be marked for translation using the `_()` function,
which can be imported as follows:
```python
from django.utils.translation import gettext as _
```
Zulip expects all the error messages to be translatable as well. To
ensure this, the error message passed to `JsonableError`
should always be a literal string enclosed by `_()`
function, for example:
```python
JsonableError(_('English text'))
```
If you're declaring a user-facing string at top level or in a class, you need to
use `gettext_lazy` instead, to ensure that the translation happens at
request-processing time when Django knows what language to use, for example:
```python
from zproject.backends import check_password_strength, email_belongs_to_ldap
AVATAR_CHANGES_DISABLED_ERROR = gettext_lazy("Avatar changes are disabled in this organization.")
def confirm_email_change(request: HttpRequest, confirmation_key: str) -> HttpResponse:
...
```
```python
class Realm(models.Model):
MAX_REALM_NAME_LENGTH = 40
MAX_REALM_SUBDOMAIN_LENGTH = 40
...
...
STREAM_EVENTS_NOTIFICATION_TOPIC = gettext_lazy("channel events")
```
To ensure we always internationalize our JSON error messages, the
Zulip linter (`tools/lint`) attempts to verify correct usage.
## Translation process
The end-to-end tooling process for translations in Zulip is as follows.
1. The strings are marked for translation (see sections for
[server](#server-translations) and
[web app](#web-application-translations) translations for details on
this).
2. Translation resource files are created using the
`./manage.py makemessages` command. This command will create, for
each language, a resource file called `translations.json` for the
web app strings and `django.po` for the server strings.
The `makemessages` command is idempotent in that:
- It will only delete singular keys in the resource file when they
are no longer used in Zulip code.
- It will only delete plural keys (see above for the documentation
on plural translations) when the corresponding singular key is
absent.
- It will not override the value of a singular key if that value
contains a translated text.
3. Those resource files, when committed, are automatically scanned by
Weblate.
4. Translators translate the strings in the Weblate UI.
5. Weblate makes the translations into a Git commit, which then can be
merged into the codebase by a maintainer.
If you're interested, you may also want to check out the [translators'
workflow](translating.md#translators-workflow), just so you have a
sense of how everything fits together.
## Translation resource files
All the translation magic happens through resource files, which hold
the translated text. Server resource files are located at
`locale/<lang_code>/LC_MESSAGES/django.po`, while web app resource
files are located at `locale/<lang_code>/translations.json`.
## Additional resources
We recommend the [EdX i18n guide][edx-i18n] as a great resource for learning
more about internationalization in general; we agree with essentially all of
their style guidelines.
[edx-i18n]: https://docs.openedx.org/en/latest/developers/references/developer_guide/internationalization/i18n.html
[jinja2]: http://jinja.pocoo.org/
[handlebars]: https://handlebarsjs.com/
[trans]: https://jinja.palletsprojects.com/en/3.0.x/extensions/#i18n-extension
[formatjs]: https://formatjs.github.io/
[icu messageformat]: https://formatjs.github.io/docs/core-concepts/icu-syntax#plural-format
[helpers]: https://handlebarsjs.com/guide/block-helpers.html
[html-templates]: ../subsystems/html-css.md#html-templates

View File

@@ -0,0 +1,15 @@
# Japanese translation style guide
## Rules
- Use full-width parentheses `()` for half-width parentheses `()` in original text.
## Terms
- alert word - **キーワード**/**キーワード通知**
"Alert" can be literally translated as "アラート", however, it gives a negative impression in Japanese. To describe the function clearly, use "キーワード" or more fully "キーワード通知".
- narrow - **~だけ表示**
- subscribe - **フォロー**
- subscriber - **フォロワー**

284
docs/translating/polish.md Normal file
View File

@@ -0,0 +1,284 @@
# Polish translation style guide
Use semi-formal Polish for translation, some specifics:
- Informal "you" (_ty_) instead of more formal approaches (e.g., plural
"you" (_wy_), using any formal titles like _Państwo_, _Pan/Pani_).
- Gender-neutral forms of verbs, e.g., _unsubscribed_ - _odsubskrybowano_,
not \*odsubskrybowałeś".
- Imperative, active and continuous verbs, e.g., _manage streams_ -
_zarządzaj kanałami_, not _zarządź kanałami_.
- Not using reflexive _się_, e.g., _log out_ would be simply _wyloguj_,
not _wyloguj się_.
- Warm and friendly phrasing whenever appropriate.
- No slang or regional phrases that could be unclear or too informal,
e.g., _zajawka_.
- Consistent usage of Zulip-specific terms and common verbs for
actions, even if it means repeating - this is one of the key aspects
of "semi-formal", as synonyms would be often more appropriate in
written Polish.
- Mindful usage of long words and phrases - it's sometimes hard to
translate English to Polish concisely, be mindful of how it looks on
the frontend after translating.
- Balance common verbs and nouns with specific IT-related translations
of English terms - this can be tricky, try to check how other
resources were translated (e.g., Gmail, Microsoft websites, Facebook)
to decide what wouldn't sound awkward in Polish.
Some terms are very tricky to translate, so be sure to communicate
with other Polish speakers in the community. It's all about making
Zulip friendly and usable.
## Special terms used in Zulip
**alert word**: powiadomienie, "ostrzeżenie" could mean something negative
and alert words in Zulip are used to help users find relevant content
example:
You can set your own alert words for Zulip messages.
> Możesz ustawić powiadomienia dla wybranych fraz w Zulipie.
**Combined feed**: strumień mieszany
example:
You can see all messages in unmuted streams and topics with "Combined feed".
> Możesz zobaczyć pełną listę wiadomości poprzez widok "Strumień mieszany".
**bot**: bot
example:
You can add bots to your Zulip.
> Możesz dodać boty do swojego Zulipa.
**customization**: personalizacja, _kastomizacja_ could be too awkward
and _dostosowanie do potrzeb klienta_ is too long
example:
You can personalize Zulip in many ways, e.g., by pinning certain streams.
> Możesz spersonalizować Zulipa na wiele sposobów, np. przypinając niektóre kanały.
**emoji**: emoji, both in singular and plural, _ikona emoji_ is a pleonasm
example:
Zulip supports emoji both in messages and as reactions.
> Zulip wspiera używanie emoji w wiadomościach i jako reakcje.
**filter**: filtr (noun) and filtrowanie (verb)
example:
You can filter the messages by searching for relevant terms.
> Możesz przefiltrować wiadomości poprzez wyszukiwanie.
**group DM**: czat grupowy, different from _wiadomość_ since the usage
of _czat grupowy_ seems more common
example:
You can start a group DM with users in your organization.
> Możesz rozpocząć czat grupowy z użytkownikami w Twojej organizacji.
**integration**: integracja
example:
Zulip supports multiple third-party integrations.
> Zulip wspiera wiele zewnętrznych integracji.
**I want**: chcę
example:
I want to change my password.
> Chcę zmienić hasło.
**invalid**: niepoprawny/a
example:
Invalid command.
> Niepoprawna instrukcja.
**me**: me, no translation since it's used as `/me`
example:
You can use `/me` to write a reaction message.
> Możesz napisać wiadomość w formie komentarza poprzez użycie `me`.
**mention**: oznaczenie (noun) and oznaczyć (verb)
example:
You can mention other Zulip users by using @.
> Możesz oznaczyć innych użytkowników Zulipa używając @.
**message**: wiadomość
example:
You got a new message.
> Masz nową wiadomość.
**message table**: lista wiadomości
example:
The middle column in Zulip is a message table of all messages in current narrow.
> Środkowa kolumna w Zulipie zawiera listę wiadomości w wybranym widoku.
**muting a stream/topic**: wyciszenie kanału/wątku
**unmuting a stream/topic**: wyłącz wyciszenie kanału/wątku
example:
You can mute any topic in Zulip through the left-side panel.
> Możesz wyciszyć dowolny wątek w Zulipie używając menu kontekstowego po lewej.
**narrow**: widok (noun) and zawęzić (verb)
example:
You can narrow the messages to any stream, topic or search results.
> Możesz zawęzić wiadomości do wybranego kanału, wątku lub wyników wyszukiwania.
**notification**: powiadomienie
example:
Turn on notifications.
> Włącz powiadomienia.
**person**: osoba, najczęściej użytkownik
**people**: osoby, najczęściej użytkownicy
**pinning**: przypięcie (noun) and przypiąć (verb)
example:
You can pin streams in the left-side panel.
> Możesz przypiąć wybrane kanały w menu kontekstowym po lewej.
**direct message**: Wiadomość bezpośrednia
example:
You can send a direct message to other users in your organization.
> Możesz wysłać bezpośrednią wiadomość do innych użytkowników w Twojej organizacji.
**DM**: DM, translation could be confusing
example:
Direct messages are often abbreviated to DM.
> Wiadomości bezpośrednie są też nazywane DMami, od angielskiego "direct message".
**private stream**: prywatny kanał
**public stream**: publiczny kanał
example:
Join a private stream.
> Dołącz do prywatnego kanału.
**search**: wyszukiwanie (noun) and wyszukaj (verb)
example:
Zulip allows you to search messages in all streams and topics you are
subscribed to.
> Zulip pozwala na wyszukiwanie wiadomości we wszystkich subskrybowanych kanałach
> i wątkach.
**starred message**: oznaczona wiadomość (noun)
**star**: oznaczyć
example:
You starred this message.
> Ta wiadomość została oznaczona.
**stream**: kanał, similar to a tv channel - _strumień_ sounds a bit artificial
example:
You can create new streams in Zulip.
> Możesz tworzyć nowe kanały w Zulipie.
**subscribing to a stream**: (za)subskrybowanie kanału (noun) and
(za)subskrybować kanał (verb), perfective form depending on the
context
examples:
Subscribe to a stream.
> Zasubskrybuj kanał.
You are not subscribed to this stream.
> Nie subskrybujesz tego kanału.
**topic**: wątek
example:
Add a new topic.
> Dodaj nowy wątek.
**unsubscribing from a stream**: odsubskrybowanie kanału (noun) and
odsubskrybować kanał (verb)
example:
You have unsubscribed from this stream.
> Odsubskrybowano kanał.
**user**: użytkownik
example:
Zulip supports an unlimited number of users in an organization.
> Zulip nie limituje liczby użytkowników w organizacji.
**view**: widok, see: **narrow**

View File

@@ -0,0 +1,59 @@
# Russian translation style guide
Вот некоторые правила, которых стоит придерживаться для поддержания
качества перевода. Они продиктованы опытом - собственным и коллег,
здравым смыслом и техническими особенностями продукта.
- Переводите you, как "вы", не как "Вы"
- Не используйте "ё"
- Не переводите Zulip
- Избегайте IT-жаргонизмы и кальки. Например, не приватный, а личный;
не email, а электронная почта / адрес электронной почты.
- Фразы должны правильно читаться и передавать исходный смысл. Для
этого анализируйте контекст фразы.
- Вместо изобретения собственных терминов, используйте устоявшиеся
фразы из других чатов: Slack, VKontakte, Skype - то, к чему уже
привыкли люди.
## Перевод некоторых терминов
- login - **войти**
- sign up - **зарегистрироваться**
- stream - **канал**
- organization - **организация**
- message - **сообщение**
- messages - **переписка**
- conversation - **беседа**
- chat - **чат**
- send - **отправить**
- email - **адрес электронной почты**
- feedback - **обратная связь**
- user - **пользователь**
- topic - **тема**
- narrow - **показать только**
- narrowing - **уточнение**
- private - **личный**
- alert word - **сигнальное слово**
- upload - **загрузить**
- uploads - **файлы**
- settings - **настройки**
- invalid - **неверный**
- incorrect - **неправильный**
- unknown - **неизвестный**
- account - **учетная запись**
- subdomain - **поддомен**
- API key - **API-ключ**
- recipient - **получатель**
- subscriber - **участник**
- invite-only - **закрытый**
- public - **открытый**
- name - **название** for things, **имя** for people
- id - **код**
- notifications - **оповещения**
- @-mentions - **@-упоминания**
- mute - **заглушить**
- emoji - **эмодзи**
- user - **пользователь**
- compose - **написать**
- custom - **дополнительный**
- home view - **общий список сообщений**

View File

@@ -0,0 +1,90 @@
# Spanish translation style guide
Use informal Spanish for translation:
- Informal "you" (_tú_) instead of formal form _usted_. Many top software
companies (e.g., Google) use the informal one, because it's much more common in
the daily language and avoids making translations look like they were written
by machines.
- Imperative, active, and continuous verbs, e.g., _manage streams_ -
_gestionar canales_, not _gestión de canales_.
- Not using reflexive _se_ e.g., _log out_ should be _salir_, not _salirse_,
whenever the infinitive form is possible without making the translation
awkward.
- Warm and friendly phrasing whenever appropriate.
- No slang or regional phrases that could be unclear or too informal.
- Balance common verbs and nouns with specific IT-related translations
of English terms - this can be tricky, try to check how other
resources were translated (e.g., Gmail, Microsoft websites, Facebook)
to decide what wouldn't sound awkward / rude in Spanish.
- Latest RAE rule ("solo" should
[**never**](https://www.rae.es/espanol-al-dia/el-adverbio-solo-y-los-pronombres-demostrativos-sin-tilde)
have accent, even when it can be replaced with "solamente").
Some terms are very tricky to translate, so be sure to communicate
with other Spanish speakers in the community. It's all about making
Zulip friendly and usable.
## Términos
- Message - **Mensaje**
- Direct message (DM) - **Mensaje directo (MD)**
- Group DM - **Mensaje directo grupal**: many users may not associate "MD" with
_direct message_ in a group context, so it's better to use the unabbreviated
form rather than "MD grupal".
- Stream - **Canal**: the use of the literal Spanish word for stream
"Flujo" is very confusing and not the correct metaphor for Spanish
speaking people. The correct term would be "canal" (_channel_).
- Topic - **Tema**
- Private/invite-only stream - **Canal privado/limitado por invitación**: (lit.
_channel limited by invitation_)
- Public stream - **Canal público**
- Bot - **Bot**
- Embedded bot - **Bot integrado**
- Interactive bot - **Bot interactivo**
- Integration - **Integración**
- Notification - **Notificación**
- Alert word - **Alerta**: this is only _alert_. Nonetheless, adding _word_ may
make the term confusing (something like _danger!_ could be a "palabra de
alerta" as well). Google Alerts uses "alerta" in its Spanish translation.
- View - **Vista**
- Filter - **Filtro**: as used with narrowing (see below).
- Home - **Inicio**: we never use the term "Hogar" (literally home) in Spanish.
- Emoji - **Emoticono** (plural: **emoticonos**)
- Slash command - **/comando**
- Webhook - **Webhook**
- Endpoint - **Endpoint**
## Frases
- Subscribe/Unsubscribe to a stream - **Suscribir a/Desuscribir de un canal**
- Narrow to - **Buscar solo**: this translates to _search only_. We use this
term because there's no other word that's common enough in Spanish for
_to narrow_ except for "filtrar", but this word can be incorrectly
interpreted as _filter out_. We should stick to a term that we can use
unambiguously and consistently for all instances of _Narrow to_.
- Mute/Unmute - **Silenciar/No silenciar**
- Deactivate/Reactivate - **Desactivar/Reactivar**
- Search - **Buscar**
- Pin - **Fijar** (lit. _to fixate_)
- Mention/@mention - **Mencionar/@mención**
- Invalid - **Inválido**
- Customization - **Personalización**
- I want - **Yo quiero**
- User - **Usuario**
- Person/People - **Persona/Personas**: "personas" is the correct plural for
"person", but when talking of _people_ referring to it as a crowd, we use
"gente" instead.
## Otros
- You - **Tú**: also "vosotros" if it's in plural.
- We - **Nosotros**
- Message table - **Tablón de mensajes**
- Enter/Intro - **Enter/Intro**

View File

@@ -0,0 +1,232 @@
# Translation guidelines
Zulip has full support for Unicode (and partial support for RTL
languages), so you can use your preferred language everywhere in
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 would be
greatly appreciated!
If you are interested in knowing about the technical end-to-end
tooling and processes for tagging strings for translation and syncing
translations in Zulip, read about [Internationalization for
Developers](internationalization.md).
## Translators' workflow
These are the steps you should follow if you want to help translate
Zulip:
1. Join [#translation][translation-channel] in the [Zulip development
community server](https://zulip.com/development-community/), and say hello.
That channel is also the right place for any questions, updates on your
progress, reporting problematic strings, etc.
1. [Sign up for Weblate](https://hosted.weblate.org/accounts/register/).
:::{note}
Unless you plan to contribute country-specific translations, do not
select a country-specific language in the **Languages** list when
you sign up. E.g., use **English (United Kingdom) (en_GB)** if you
plan to translate Zulip into UK English, but select **Spanish
(es)** rather than **Spanish (Colombia) (es_CO)** for general
Spanish translations.
:::
1. Navigate to the [Zulip project on Weblate](https://hosted.weblate.org/projects/zulip/).
1. Choose the language you'd like to translate into; your preferred
languages should be at the top.
1. Optionally, use the "Components" tab at the top to translate only
part of the project. Zulip has several different components, split
up by where they are used:
- `Flutter` is used for the mobile app.
- `Desktop` is for the parts of the Zulip desktop apps that are not
shared with the Zulip web app. This is a fairly small number of
strings.
- `Django` and `Frontend` have strings for the next major release
of the Zulip server and web app (which is what we run on
chat.zulip.org and Zulip Cloud).
- The variants of `Django` and `Frontend` with names
ending with a version, like `(10.x)`, are strings for Zulip's
current [stable release series](../overview/release-lifecycle.md).
Weblate is smart about only asking you to translate a string once
even if it appears in multiple resources. The `(10.x)` type variants
allow translators to get a language to 100% translated for the
current release.
1. Click the "Translate" button to begin translating. Refer to
[Weblate's
documentation](https://docs.weblate.org/en/latest/user/translating.html#translating)
for how to translate each string.
1. If possible, test your translations (details below).
1. Ask in Zulip for a maintainer to merge the strings from Weblate,
and deploy the update to chat.zulip.org so you can verify them in
action there.
Some useful tips for your translating journey:
- Follow your language's [translation guide](#translation-style-guides).
Keeping it open in a tab while translating is very handy. If one
doesn't exist one, write one as you go; they're easiest to write as
you go along and will help any future translators a lot.
- Use, and update, the [Weblate
glossary](https://hosted.weblate.org/projects/zulip/glossary/) for
your language. This will help by providing consistent, inline
translation references for terms (e.g., "channel") which are used
repeatedly throughout the application.
- Don't translate variables or code (usually preceded by a `%`, inside
HTML tags `<...>`, or enclosed in braces like `{variable}`); just
keep them verbatim.
- When context is unclear, you may find it helpful to follow the
"Source string location" link in the right sidebar of the Weblate
UI.
- When in doubt, ask for context in
[#translation](https://chat.zulip.org/#narrow/channel/58-translation) in
the [Zulip development community server](https://zulip.com/development-community/).
- Pay attention to capital letters and punctuation. Details make the
difference! Weblate will catch, and warn about, some cases of
mismatched punctuation.
- Take advantage of Weblate's [key
bindings](https://docs.weblate.org/en/latest/user/translating.html#keyboard-shortcuts)
for efficiency.
- While one should definitely prioritize translating the `Frontend`
and `Flutter` components, since the most prominent user-facing
strings are there, API error messages in `Django` are presented to
users, so a full translation should include them.
### Testing translations
This section assumes you have a
[Zulip development environment](../development/overview.md) set up;
if setting one up is a problem for you, ask in chat.zulip.org and we
can usually just deploy the latest translations there.
1. Add the Weblate remote to your Git repository:
```shell
git remote add weblate https://hosted.weblate.org/git/zulip/django/
```
1. Merge the changes into your local repository:
```shell
git cherry-pick weblate/main ^upstream/main
```
There are a few ways to see your translations in the Zulip UI:
- You can insert the language code as a URL prefix. For example, you
can view the login page in German using
`http://localhost:9991/de/login/`. This works for any part of the
Zulip UI, including portico (logged-out) pages.
- For Zulip's logged-in UI (i.e. the actual web app), you can [pick the
language](https://zulip.com/help/change-your-language) in the
Zulip UI.
- If your system has languages configured in your OS/browser, Zulip's
portico (logged-out) pages will automatically use your configured
language. Note that we only tag for translation strings in pages
that individual users need to use (e.g., `/login/`, `/register/`,
etc.), not marketing pages like `/features/`.
- In case you need to understand how the above interact, Zulip figures
out the language the user requests in a browser using the following
prioritization (mostly copied from the Django docs):
1. It looks for the language code as a URL prefix (e.g., `/de/login/`).
1. It looks for the cookie named 'django_language'. You can set a
different name through the `LANGUAGE_COOKIE_NAME` setting.
1. It looks for the `Accept-Language` HTTP header in the HTTP request
(this is how browsers tell Zulip about the OS/browser language).
- Using an HTTP client library like `requests`, `cURL` or `urllib`,
you can pass the `Accept-Language` header; here is some sample code to
test `Accept-Language` header using Python and `requests`:
```python
import requests
headers = {"Accept-Language": "de"}
response = requests.get("http://localhost:9991/login/", headers=headers)
print(response.content)
```
This can occasionally be useful for debugging.
### Machine translation
Weblate has [built-in machine translation
capabilities](https://docs.weblate.org/en/latest/admin/machine.html).
If machine translation is enabled for your language, you can generate one by
clicking the **Automatic suggestions** tab below the translation box.
Bear in mind that we expect human-quality translations for
Zulip. While machine translation can be a helpful aid, please be sure
to review all machine translated strings.
### Translation style guides
We maintain translation style guides for Zulip, giving guidance on how
Zulip should be translated into specific languages (e.g., what word to
translate words like "channel" to), with reasoning, so that future
translators can understand and preserve those decisions:
- [Chinese](chinese.md)
- [Finnish](finnish.md)
- [French](french.md)
- [German](german.md)
- [Hindi](hindi.md)
- [Japanese](japanese.md)
- [Polish](polish.md)
- [Russian](russian.md)
- [Spanish](spanish.md)
We encourage this information to also be placed in [Weblate's
glossary](https://hosted.weblate.org/projects/zulip/glossary/), which
will help provide inline suggestions when translating.
Some translated languages don't have these, but we highly encourage
translators for new languages (or those updating a language) write a
style guide as they work, since it's easy to take notes as you
translate, and doing so greatly increases the ability of future
translators to update the translations in a consistent way. See [our
docs on this documentation](../documentation/overview.md) for how to
submit your changes.
### Capitalization
We expect that all the English translatable strings in Zulip are
properly capitalized in a way consistent with how Zulip does
capitalization in general. This means that:
- The first letter of a sentence or phrase should be capitalized.
- Correct: "Channel settings"
- Incorrect: "Channel Settings"
- All proper nouns should be capitalized.
- Correct: "This is Zulip"
- Incorrect: "This is zulip"
- All common words like URL, HTTP, etc. should be written in their
standard forms.
- Correct: "URL"
- Incorrect: "Url"
The Zulip test suite enforces these capitalization guidelines in the
web app codebase [in our test
suite](../testing/testing.md#other-test-suites)
(`./tools/check-capitalization`; `tools/lib/capitalization.py` has
some exclude lists, e.g., `IGNORED_PHRASES`).
[translation-channel]: https://chat.zulip.org/#narrow/channel/58-translation

63
docs/translating/urdu.md Normal file
View File

@@ -0,0 +1,63 @@
# Urdu translation style guide(انداذِ ترجمہ کا رہنما)
Use semi-formal Urdu for translation:
- Formal "you" (_آپ_) instead of informal form _تم_. Many top software
companies (e.g., Google, Facebook, Microsoft) use the formal one, because it's typically
considered rude to use the informal one without an established acquaintance with someone.
- Imperative, active, and continuous verbs, e.g., _manage streams_ -
_سٹریمس کی رہنمائ کریں_, not _سٹریمس کی رہنمائ_.
- Warm and friendly phrasing whenever appropriate.
- No slang or regional phrases that could be unclear or too informal.
- Balance common verbs and nouns with specific IT-related translations
of English terms - this can be tricky, try to check how other
resources were translated (e.g., Gmail, Microsoft websites, Facebook)
to decide what wouldn't sound awkward/rude in Urdu.
Some terms are very tricky to translate, so be sure to communicate
with other Urdu speakers in the community. It's all about making
Zulip friendly and usable.
## Terms(اصطلاحات)
- Message - **پیغام**
- Direct message (DM) - **براہ راست پیغام**
- Stream - **سٹریم**
- Topic - **موضوع**
- Private/invite-only stream - **ذاتی / دعوت کی ضرورت والی سٹریم**
- Public stream - **عوامی سٹریم**
- Bot - **بوٹ**
- Integration - **انضمام**
- Notification - **اطلاع**
- Alert word - **الفاظِ چوکس**: this literally translate to "word(s) to remain vigilant of".
- View - **دیکھیں**
- Filter - **فلٹر**: as used with narrowing (see below).
- Home - **ھُوم**: using the literal translation--"گھر" (literally home)--would seem out of place.
- Emoji - **ایموجی**
## Phrases (فِقْرے)
- Narrow to - **محدود کریں**: the literal Urdu translation is "تنگ کریں" which may end up being
interpreted as its more common meaning which is incorrect here. The correct phrase is
"محدود کریں".
- Subscribe/Unsubscribe to a stream - **سٹریم کو سبسکرائب ی / اَنسبسکرائب**
- Mute/Unmute - **خاموش کریں / نا خاموسش کریں**
- Deactivate/Reactivate - **فعال کریں/غیر فعال کریں**
- Search - **تلاش کریں**
- Pin - **پن کریں**
- Mention/@mention - **زکر کریں / @زکر کریں**
- Invalid - **غلط**
- Customization - **ضرورت کے مطابق بنانا**
- I want - **مجھےچاھءے**
- User - **صارف**
- Person/People - **شخص / لوگ**
## Others(مختلف دیگر)
- We - **ہم**
- Message table - **پیغام بورڈ**
- Enter/Intro - **تعارف / درج**