Skip to content

fix(crowdin): workflow improvements #7755

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 43 additions & 53 deletions .github/workflows/translations-sync.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,27 @@

# See translations-upload.yml for automation to upload our source content
# See translations-pr-lint.yml for quality control we conduct on ingress of new translations.
name: Crowdin Download
name: Crowdin Translations Sync

on:
workflow_dispatch: # Allow running when we want to, for events such as urgent translation mistakes or 100% completed languages
workflow_dispatch: # Manual trigger for urgent fixes
schedule:
- cron: '0 5 * * 5' # At 05:00 on Fridays. This guarantees that we have the 72 hour weekend time to review translations.
- cron: '0 5 * * 5' # Fridays at 05:00 UTC, allowing weekend review time

# Cancel any runs on the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read
permissions: {}

env:
COMMIT_MSG: 'chore: sync translations from crowdin'
HEAD_REF: chore/crowdin

jobs:
synchronize-with-crowdin:
sync-translations:
runs-on: ubuntu-latest
outputs:
pull_request_number: ${{ steps.crowdin_pr.outputs.pull_request_number }}

steps:
- name: Harden Runner
uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
Expand All @@ -35,48 +35,46 @@ jobs:
with:
token: ${{ secrets.CROWDIN_GITHUB_BOT_TOKEN }}

# see all the options at https://github.com/crowdin/github-action
- name: Crowdin PR
# Downloads translations from Crowdin and creates a PR
# See all the options at https://github.com/crowdin/github-action
- name: Download Translations & Create PR
uses: crowdin/github-action@b8012bd5491b8aa8578b73ab5b5f5e7c94aaa6e2 # v2.7.0
id: crowdin_pr
with:
# do not upload anything - this is a one-way operation download
upload_sources: false
upload_translations: false
# the rest of this controls how the PR comes in with new translations
download_translations: true
localization_branch_name: chore/crowdin
localization_branch_name: ${{ env.HEAD_REF }}
create_pull_request: true
pull_request_title: '[automated]: crowdin sync'
pull_request_body: 'New Crowdin translations from the [Node.js Crowdin project](https://crowdin.com/project/nodejs-web)'
commit_message: 'chore: synced translations from crowdin'
pull_request_title: '[automated]: Crowdin Translations Sync'
pull_request_body: 'New translations from the [Node.js Crowdin project](https://crowdin.com/project/nodejs-web)'
commit_message: ${{ env.COMMIT_MSG }}
env:
GITHUB_TOKEN: ${{ secrets.CROWDIN_GITHUB_BOT_TOKEN }}
# A numeric ID, found at https://crowdin.com/project/nodejs-web/tools/api
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
# Created from https://crowdin.com/settings#api-key logged in using nodejs-crowdin-bot
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}

format_crowdin_pull_request:
needs: synchronize-with-crowdin
format-translations:
needs: sync-translations
runs-on: ubuntu-latest

permissions:
# This permission is required by `stefanzweifel/git-auto-commit-action`
contents: write

steps:
- name: Harden Runner
uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0
with:
egress-policy: audit

- name: Git Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# Checks out the PR branch created by the previous job
- name: Checkout PR Branch
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
with:
# Use the number from the output of crowdin/github-action
ref: refs/pull/${{ needs.synchronize-with-crowdin.outputs.pull_request_number }}/head
ref: ${{ env.HEAD_REF }}
token: ${{ secrets.CROWDIN_GITHUB_BOT_TOKEN }}
fetch-depth: 0

# Setup git user for commits
- name: Setup Git User
run: |
git config --global user.name "nodejs-crowdin"
git config --global user.email "[email protected]"

- name: Restore Lint Cache
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
Expand Down Expand Up @@ -109,27 +107,19 @@ jobs:
- name: Install packages
run: pnpm install --frozen-lockfile

- name: Run `lint:md --fix`
# This runs a specific version of ESLint with only the Translation Pages Globbing
# This avoid that unrelated changes get linted/modified within this PR
run: pnpm exec eslint "apps/site/pages/**/*.md?(x)" --fix --cache --cache-strategy=metadata --cache-file=apps/site/.eslintmdcache --config=apps/site/eslint.config.js
# Re-stage latest commit and run lint-staged
- name: Re-stage and Format Files
run: |
# Soft reset to unstage the commit but keep changes
git reset --soft HEAD^

- name: Run `prettier --write`
# This runs a specific version of Prettier with only the Translation Pages Globbing
# This avoid that unrelated changes get prettied/modified within this PR
run: pnpm exec prettier "apps/site/{pages,i18n}/**/*.{json,md,mdx}" --check --write --cache --cache-strategy=metadata --cache-location=apps/site/.prettiercache
# Run lint-staged on the staged files
# This will run linters/formatters only on changed files
# according to the configuration in package.json or .lintstagedrc
pnpm lint-staged

- name: Push Changes back to Pull Request
uses: stefanzweifel/git-auto-commit-action@b863ae1933cb653a53c021fe36dbb774e1fb9403 # v5.2.0
with:
commit_options: '--no-verify --signoff'
commit_message: 'chore: automated format of translated files'
branch: 'chore/crowdin'
git commit -m "$COMMIT_MSG" --signoff --no-verify

- name: Save Lint Cache
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: |
apps/site/.eslintmdcache
apps/site/.prettiercache
key: cache-lint-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('apps/site/.eslintmdcache') }}
# Push the changes back to the PR branch
- name: Push Changes
run: git push origin HEAD:$HEAD_REF --force
38 changes: 38 additions & 0 deletions apps/site/pages/uk/about/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,41 @@ Node.js надихався системами [Event Machine](https://github.com
HTTP є повноцінною частиною Node.js, розроблений з урахуванням потокової передачі даних і низької затримки. Це робить Node.js ідеальним варіантом для створення основи для веббібліотеки або фреймворку.

Те, що Node.js спроєктований без використання потоків, не означає, що ви не можете використовувати багато ядер у своєму середовищі. Дочірні процеси можна створити за допомогою нашого API [`child_process.fork()`](https://nodejs.org/api/child_process.html). Вони спроєктовані так, що з ними можна легко взаємодіяти. Модуль [`cluster`](https://nodejs.org/api/cluster.html) побудований на такому самому інтерфейсі, що дозволяє ділити сокети на багато процесів, аби збалансувати навантаження на ядра.

## Офіційні ресурси Node.js

Щоб забезпечити автентичність та безпеку під час роботи з Node.js, завжди використовуйте офіційні джерела. Не довіряйте електронним листам, бінарним файлам та завантаженням із неофіційних джерел.

### Офіційні домени Node.js

Для завантаження бінарних файлів Node.js та використання офіційної документації використовуйте лише ці домени:

- [nodejs.org](https://nodejs.org)
- [nodejs.dev](https://nodejs.dev) _(Перенаправляє на https://nodejs.org)_
- [iojs.org](https://iojs.org) _(Перенаправляє на https://nodejs.org)_

### Офіційні пакети npm

Команда Node.js підтримує такі офіційні простори імен в npm:

- [`@node-core`](https://npmjs.com/~node-core)
- [`@pkgjs`](https://npmjs.com/~pkgjs)

Крім того, команда Node.js супроводжує пакети, опубліковані обліковим записом npm [`nodejs-foundation`](https://npmjs.com/~nodejs-foundation). Інші пакети, які стосуються Node.js (як‑от [`undici`](https://www.npmjs.com/package/undici)), також можуть супроводжуватися учасниками з близькими зв'язками з проєктом.

Використання пакетів команди Node.js гарантує, що ви працюватимете з офіційно підтримуваними компонентами Node.js.

### Офіційні організації GitHub

Node.js та інші проєкти супроводжуються під цими офіційними організаціями GitHub:

- [nodejs](https://github.com/nodejs)
- [pkgjs](https://github.com/pkgjs)

### Офіційні канали зв'язку

Node.js та OpenJS Foundation комунікують через різні офіційні та спільнотні канали. Деталі, як долучитися до них, можна знайти на сторінці [Долучитися](https://nodejs.org/en/about/get-involved).

### Повідомлення про проблеми й неполадки сайту

Якщо ви помітите проблеми з вебсайтом Node.js, повідомте про них на [репозиторії вебсайту](https://github.com/nodejs/nodejs.org/issues). Щоб отримати дані про неполадки в реальному часі, відвідайте [сторінку статусу Node.js](https://status.nodejs.org).
32 changes: 23 additions & 9 deletions apps/site/pages/uk/about/previous-releases.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,28 @@ layout: about

## Офіційні та спільнотні методи установки

Вебсайт Node.js пропонує різні методи установки, з якими можна встановити Node.js неінтерактивно. Наприклад, за допомогою інтерфейсів командного рядка, менеджерів пакетів ОС (як-от `apt`) або менеджерів версій Node.js (як-от `nvm`).
Вебсайт Node.js пропонує кілька неінтерактивних методів установки, як-от інтерфейси командного рядка (CLI), менеджери пакетів ОС (напр. `brew`) та менеджери версій Node.js (напр. `nvm`).

Аби популяризувати та прорекламувати внески спільноти, проєкт Node.js представив нову сторінку завантажень, яка містить і офіційні, і спільнотні методи установки, що надає більше гнучкості та опцій для користувачів.
Разом з цим ми представили концепцію «офіційних» та «спільнотних» методів установки. Щоб метод уважався «офіційним», він повинний відповідати наступним вимогам:
Аби показати та просувати внески спільноти, проєкт Node.js представляє нову сторінку завантажень, яка поділяє методи установки на «офіційні» та «спільнотні». Це надає користувачам більше гнучкості та вибору, а для зрозумілості ми створили критерії для кожної категорії.

| Вимоги |
| ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Нові релізи Node.js повинні бути доступні одразу після офіційного релізу |
| Супроводжувачі проєкту повинні мати близькі зв'язки з Node.js, у тому числі пряме спілкування |
| Метод установки завантажує офіційні бінарні файли, зібрані проєктом Node.js |
| Метод установки **не** повинний будувати з вихідного коду, коли доступні бінарні файли, та не повинний змінювати офіційні бінарні файли, надані Node.js |
### Офіційні методи установки

«Офіційні» методи установки повинні виконувати наступні вимоги:

| Вимоги до офіційних методів установки |
| :------------------------------------------------------------------------------------------------------------------------------------------------- |
| Нові релізи Node.js повинні бути доступні одразу після офіційного релізу. |
| Супроводжувачі проєкту повинні мати близькі зв'язки з проєктом Node.js, у тому числі й пряме спілкування. |
| Метод установки повинний завантажувати офіційні бінарні файли, зібрані проєктом Node.js. |
| Метод установки не повинний будувати з вихідного коду, коли доступні вже збудовані бінарні файли, а також не має змінювати офіційні бінарні файли. |

### Спільнотні методи установки

Спільнотні методи установки, які містяться на самообслуговуваній сторінці завантажень (/download), також мають відповідати мінімальному набору критеріїв:

- **Підтримка версій:** Повинні підтримувати всі версії Node.js, які не мають статусу End-of-Life (EOL).
- **Сумісність ОС:** Повинні працювати на принаймні одній офіційно підтримуваній операційній системі (ОС).
- **Широка підтримка ОС:** Не можуть обмежуватися лише кількома дистрибутивами чи версіями ОС.
- Наприклад, якщо метод установки заявляє, що підтримує «Windows», він повинний працювати на «Windows 10», «Windows 11» та всіх їхніх випусках (включно із серверними версіями).
- Схожим чином, якщо метод установки заявляє, що підтримує «Linux», він повинний працювати на всіх великих дистрибутивах Linux, а не лише на конкретних. Також він не може покладатися на менеджери пакетів, специфічних для деяких дистрибутивів, як-от `apt` чи `dnf`.
- **Вільність і відкритість вихідного коду:** Повинні бути вільними для використання та мати відкритий вихідний код, не можуть продаватися як комерційний продукт та не можуть бути платним сервісом.
Loading
Loading