This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 8de37c3b152 Update i18n policy and related instructions for Release
Managers (2025-09-13) (#55629)
8de37c3b152 is described below
commit 8de37c3b152d8aa3261e2ae5d44ba09a7867424d
Author: Shahar Epstein <[email protected]>
AuthorDate: Sat Sep 13 23:41:09 2025 +0300
Update i18n policy and related instructions for Release Managers
(2025-09-13) (#55629)
* Update i18n policy and related instructions for release managers
(2025-09-13)
* Update airflow-core/src/airflow/ui/public/i18n/README.md
Co-authored-by: Jens Scheffler <[email protected]>
---------
Co-authored-by: Jens Scheffler <[email protected]>
---
airflow-core/src/airflow/ui/public/i18n/README.md | 55 +++++++++++++++-----
dev/README_RELEASE_AIRFLOW.md | 63 ++++++++++++++++-------
2 files changed, 87 insertions(+), 31 deletions(-)
diff --git a/airflow-core/src/airflow/ui/public/i18n/README.md
b/airflow-core/src/airflow/ui/public/i18n/README.md
index 18e4d44284d..1d1c21f0a2a 100644
--- a/airflow-core/src/airflow/ui/public/i18n/README.md
+++ b/airflow-core/src/airflow/ui/public/i18n/README.md
@@ -61,11 +61,15 @@ communicating in the dev list or merging Pull Requests on
their behalf).
**Engaged translator** - Active contributor participating in translation
without formal ownership.
-**Inactive translation/code owner** — A translation/code owner is considered
inactive if they meet either of
+**Complete translation** - A supported locale is considered complete when it
covers at least 90% of the terms in the default locale.
+
+**Inactive owner** — Either a translation owner or a code owner might be
considered inactive if they meet any of
the following criteria:
- The locale under their responsibility has remained incomplete for at least 2
consecutive releases.
-- They have not participated in the Apache Airflow project for more than 12
months.
+- They have not contributed to Apache Airflow for more than 12 months.
+- Code owners specifically might be considered inactive according to any other
terms mentioned in the
+ ["Committers and PMC
Members"](../../../../../../COMMITTERS.rst#inactive-committers) document.
**Dev list** - The Apache Airflow development mailing list:
[email protected].
@@ -101,6 +105,8 @@ the following criteria:
- Code owners who act as translation sponsors are also responsible for:
- Ensuring that the translation owner is active and able to maintain the
translation.
- Act according to section 6.4 when the translation owner relinquishes their
role or become inactive.
+ - When they sponsor a single translation owner, without additional
translation owners/engaged translators involved,
+ they SHALL also review the language aspects of translation-related PRs
using a trusted third-party opinion (e.g., LLM).
### 4.3. Engaged translator
@@ -128,9 +134,11 @@ the following criteria:
owner.
- When the above is not met, steps mentioned in section 6.4 SHOULD be taken by
the appropriate roles.
-> [!NOTE]
-> It is welcomed and desired to have more than one translation owner to enable
peer reviews and provide
-> coverage during absences.
+ > [!WARNING]
+ > It is preferred to have at least two translation owners, or at least one
translation owner and another engaged translator,
+ > to allow peer reviews and provide coverage during absences.
+ > Specifically, when translation is sponsored and there's only a single
translation owner, without additional proficient people involved, the code
owner becomes responsible for reviewing language aspects of PRs
+ > using a third-party opinion, which could risk quality and timeliness of
reviews.
### 5.2. Adding new locales
@@ -200,9 +208,10 @@ Translation conflicts MUST be resolved according to the
procedures outlined in s
### 6.1. Approval of ownership candidates
-- The designated code owner, should post a thread to the dev list, requesting
the approval of:
- - Introducing a new locale (including a link to the PR)
- - Translation owner(s) in the suggested locale for non committer candidates.
(sponsored)
+- The designated code owner should post a thread to the dev list that includes
the following details:
+ - The locale being suggested, including a link to the PR.
+ - Designated code owner(s) and translation owner(s) in the suggested locale.
+ - If the code owner is sponsored, they should indicate this as well.
Specifically, if there is only one translation owner, the code owner should
also declare how they plan to approve the language aspects of PRs (e.g., an
engaged translator, LLM, etc.).
- Within the thread, the code owner should demonstrate that the translation
owner is suitable for the role,
according to the requirements in section 5.3.
- Approval of any translation owner who is not a committer requires at least
one binding vote of 1 PMC member,
@@ -215,6 +224,7 @@ The following steps outline the process for approving a new
locale to be added t
- Creating a PR for adding the suggested locale to the
codebase ([see
example](https://github.com/apache/airflow/pull/51258/files)), which includes:
+ - Adding the plural form rules for the suggested locale under
`PLURAL_SUFFIXES` constant in `dev/i18n/check_translations_completeness.py`.
- The locale files (translated according to the guidelines) in the
`airflow-core/src/airflow/ui/public/i18n/locales/<LOCALE_CODE>` directory,
where `<LOCALE_CODE>` is the
code of the language according to ISO 639-1 standard (e.g., `fr` for
French). Languages with regional
@@ -283,7 +293,8 @@ Language proficiency for translation owners can be
demonstrated through any of t
(e.g., Portuguese vs. Spanish), the other language might be used as a
reference, but still the default
language (English) should be the primary source for translations.
- Translations should be accurate, maintaining original meaning and intent.
-- Translations should be complete, covering all terms and phrases in the
default language.
+- Translations should be complete, covering all terms and phrases in the
default language up to the defined
+ completeness threshold.
- Translation of technical terminology should be consistent (for example: Dag,
Task, Operator, etc.).
- Language should be polite and neutral in tone.
- Local conventions should be considered (e.g., date formats, number
formatting, formal vs. informal tone,
@@ -302,6 +313,10 @@ All files:
uv run dev/i18n/check_translations_completeness.py
```
+> [!NOTE]
+> When announcing a freeze time, copy the output of the table showing
completeness of all languages
+> to the mail body.
+
Files for specific languages:
```bash
@@ -350,13 +365,27 @@ FAIL_WHEN_ENGLISH_TRANSLATION_CHANGED = True
```
This fails any attempt to change English translation files in a PR unless
`allow translation change`
-label is applied to the PR. This allows to still fix critical issues in
English translation files and make
-deliberate updates to it but avoids accidental changes.
+label is applied to the PR. This still allows issues in the English
translation files to be fixed and
+deliberate updates to be made, while avoiding accidental changes.
-Any change in such English translation files during freeze time MUST be
communicated in the
-`#18n` Slack channel - so that translators can be informed as early as
possible about those translations
+Any change in the English translation files during freeze time MUST be
communicated in the
+[#18n](https://app.slack.com/client/TCQ18L22Z/C09D0A7FESJ?) Slack channel and
MUST be approved by at least 1 PMC member - so that translators can be informed
as early as possible about those translations
being added.
+> [!NOTE]
+> The definition of completeness takes into account that some terms might be
added during freeze time and remain untranslated.
+
+### 11.1 Guidelines for approving freeze exemptions
+
+The following questions should be considered before approving exemptions for
changes to the English translation files during freeze time:
+
+- Are the changes necessary for a critical fix or feature?
+- Do the changes only introduce minor fixes to existing terms? (such
modifications are usually less disruptive and OK to approve)
+- Do the changes introduce new terms, remove terms, or significantly alter
already translated terms? (if so, it may be better to wait until the next
release)
+- Is it feasible to complete the translations in all locales before the
release? (the fewer changes, the more feasible)
+- If not all translations are completed before the release, will it
significantly affect the user experience? (if so, it might be better to wait
until the next release).
+- If not all translations are completed before the release, will any locales
be left in an incomplete state? (if so, it might be better to wait until the
next release).
+
## 12. Exceptions
If any exceptions to this policy are needed, they MUST be discussed and
approved by voting in the dev list
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 70374c64908..db9daec486a 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -21,7 +21,7 @@
**Table of contents**
- [Selecting what to put into the
release](#selecting-what-to-put-into-the-release)
- - [Validating completeness of i18n locale
files](#validating-completeness-of-i18n-locale-files)
+ - [Validating completeness of i18n locale files and announcing i18n freeze
time](#validating-completeness-of-i18n-locale-files-and-announcing-i18n-freeze-time)
- [Selecting what to cherry-pick](#selecting-what-to-cherry-pick)
- [Making the cherry picking](#making-the-cherry-picking)
- [Collapse Cadwyn Migrations](#collapse-cadwyn-migrations)
@@ -73,39 +73,52 @@ The first step of a release is to work out what is being
included. This differs
- For a *patch* release, you will be selecting specific commits to cherry-pick
and backport into the existing release branch.
-## Validating completeness of i18n locale files
+## Validating completeness of i18n locale files and announcing i18n freeze time
-At this point you should validate the completeness of the i18n locale files -
follow the instructions in section 8.1 of the [internationalization (i18n)
policy](../airflow-core/src/airflow/ui/public/i18n/README.md) for doing so.
-If there are any incomplete locales, copy the names of the incomplete locales
and send out a reminder to the code owners to ensure completion of the
translation by a due date of your choice
-before cutting the release candidate (RC).
-The reminder should be sent via [email protected] mailing list,
preferably with an accompanying GitHub issue for tracking purposes.
-Do not hold the release process beyond the due date if there are still
incomplete locales.
+> [!NOTE]
+> It is recommended to delegate all operations in this task to another
committer.
+
+Before cutting the release candidate (RC), you should announce a freeze time
for i18n changes to allow translators to complete translations for the upcoming
release without being overloaded by new terms, or other significant changes.
+The freeze should last at least one week, and until the RC is cut.
+It is recommended to announce the freeze at least two weeks before it starts.
+To prepare for the announcement, generate an output of completeness for all
locale files - follow the instructions in section 8.1 of the
[internationalization (i18n)
policy](../airflow-core/src/airflow/ui/public/i18n/README.md#81-checking-completeness-of-i18n-files)
for doing so.
+The reminder should be sent via [email protected] mailing list - you may
accompany it with a GitHub issue for tracking purposes.
+
+> [!NOTE]
+> When applicable - you should mention, within the output, translations that
have been incomplete in the past release,
+> and warn that they might be removed if they are not completed by the release
date.
Subject:
```shell script
cat <<EOF
-[REMINDER] Complete translations for Airflow ${VERSION} RC by <date>
+[ANNOUNCEMENT] English Translation freeze for Airflow ${VERSION} RC starting
at <START_DATE>
EOF
```
-Body:
+Body (assuming delegation to another committer):
```shell script
cat <<EOF
Hey fellow Airflowers,
-I'm planning to cut the Airflow ${VERSION} RC soon.
+I'm sending this message on behalf of the release managers.
+The release managers are planning to cut the Airflow ${VERSION} RC soon/by
<RELEASE_DATE>.
+
+After running the i18n completeness script, this is the coverage state of all
merged locales as of <CURRENT_DATE>:
-After running the i18n completeness script, I found that the following locales
are currently incomplete:
-<list of incomplete locales>
+<OUTPUT_OF_I18N_COMPLETENESS_SCRIPT>
-I'd like to ask locales' code owners to ensure the completion of the
translations for these locales by <due date>,
-and respond to this email after doing so.
-During this time, I'd like all committers to refrain merging PRs that add new
terms to the default locale (English),
-or rename/relocate keys of existing terms to avoid overloading the translators.
-When creating a PR, please run locally the i18n completeness script on your
locale to ensure all translations are complete.
-Changes applied after this date will not be included in the release, and the
missing terms will fall back to English instead.
+To prevent overloading the translators and to ensure completeness of all
translations by the release, a freeze upon the English locale will be applied
starting <START_DATE>,
+and until the RC is cut.
+Code owners, translation owners, and engaged translators are asked to complete
the coverage of their assigned locales during this time.
+
+Important notes:
+1. Any changes merged after the final release won't not be included, and
missing terms will fall back to English.
+2. Any PR that modifies the English locale during the freeze time will fail CI
checks.
+3. Requests for exemptions should be communicated in the #i18n Slack channel,
and approved by at least 1 PMC member - guidelines for approval are available
in the i18n policy.
+4. PRs approved for an exemption will be labeled with `allow translation
change`, and then the relevant CI check will pass. Translators are encouraged
to complete the translations for the exempted terms during the freeze time.
+5. Merging PRs for adding new translations could be done during the freeze
time - designated code owners should validate that by the end of the freeze
time, the coverage of the suggested translation is complete.
Thanks for your cooperation!
@@ -113,6 +126,20 @@ Thanks for your cooperation!
EOF
```
+When the freeze starts, you should merge a PR for setting the flag
`FAIL_WHEN_ENGLISH_TRANSLATION_CHANGED` to `True` in the file
[selective_checks.py](./breeze/src/airflow_breeze/utils/selective_checks.py).
+If the freeze gets extended, you should update the announcement thread
accordingly.
+When it is time to cut the RC, you should:
+
+1. Generate an additional completeness output:
+ a. If there are incomplete locales that were also incomplete in the previous
completeness output, please contact the code owner and ask them to act
according to section "Relinquishing translation/code ownership" in the i18n
policy (section 6.4).
+ b. If there are other incomplete locales, please write it as a reminder for
the next freeze announcement.
+2. Create a PR for setting the flag back to `False`.
+3. Post on the same thread that the freeze is lifted, and share the final
completeness output.
+
+> [!NOTE]
+> Release managers - do not hold the release process beyond the due date if
there are still incomplete locales after the freeze.
+> It is the responsibility of code owners to ensure the completeness of their
locales by the due date.
+
## Selecting what to cherry-pick
For obvious reasons, you can't cherry-pick every change from `main` into the
release branch -