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
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:
201
docs/translating/chinese.md
Normal file
201
docs/translating/chinese.md
Normal 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
140
docs/translating/finnish.md
Normal 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!
|
||||
28
docs/translating/french.md
Normal file
28
docs/translating/french.md
Normal 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
362
docs/translating/german.md
Normal 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
63
docs/translating/hindi.md
Normal 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
20
docs/translating/index.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# Translating Zulip
|
||||
|
||||
```{toctree}
|
||||
---
|
||||
maxdepth: 3
|
||||
---
|
||||
|
||||
translating
|
||||
internationalization
|
||||
chinese
|
||||
finnish
|
||||
french
|
||||
german
|
||||
hindi
|
||||
japanese
|
||||
polish
|
||||
russian
|
||||
spanish
|
||||
urdu
|
||||
```
|
||||
364
docs/translating/internationalization.md
Normal file
364
docs/translating/internationalization.md
Normal 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
|
||||
15
docs/translating/japanese.md
Normal file
15
docs/translating/japanese.md
Normal 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
284
docs/translating/polish.md
Normal 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**
|
||||
59
docs/translating/russian.md
Normal file
59
docs/translating/russian.md
Normal 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 - **общий список сообщений**
|
||||
90
docs/translating/spanish.md
Normal file
90
docs/translating/spanish.md
Normal 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**
|
||||
232
docs/translating/translating.md
Normal file
232
docs/translating/translating.md
Normal 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
63
docs/translating/urdu.md
Normal 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 - **تعارف / درج**
|
||||
Reference in New Issue
Block a user