Skip to content

docs: suggesting translations in context for community projects (pitch tolgee/tolgee-platform#3780, scope E) - #1144

Merged
Anty0 merged 40 commits into
jirikuchynka/community-translations-docsfrom
jirikuchynka/community-sdk-suggestions-e
Oct 19, 2026
Merged

Anty0 merged 40 commits into
jirikuchynka/community-translations-docsfrom
jirikuchynka/community-sdk-suggestions-e

Conversation

@Anty0

@Anty0 Anty0 commented Sep 20, 2026 •

Copy link
Copy Markdown
Member

Docs for in-context suggestions, scope E of pitch tolgee/tolgee-platform#3780 (community translation v2.0, SDK and browser plugin).

Merged into #1130. This branch was built on #1130's branch, and the two were finished and reviewed together. Both are now delivered by #1130, whose description covers the combined result.

The feature is released:

Part Release
Platform tolgee/tolgee-platform#3930 in Tolgee v3.227.0
SDK tolgee/tolgee-js#3539 in @tolgee/web 7.3.0
Browser plugin Tolgee Tools v1.11.0
Plugin sign-in on self-hosted (tolgee.oauth2.browser-extension-enabled) Tolgee v3.230.0

What it delivers

  • platform/translation_process/community-translation-in-context.mdx is for owners of public projects. It covers what to switch on in the project and on a self-hosted server, what to declare on the website (apiUrl, projectId, no apiKey, an SDK new enough), what contributors need, the Translate with Tolgee badge, and what contributors can and can't do in the dialog.
  • js-sdk/in_context.mdx gets a new section, "Suggesting Translations in Context". It covers the Save / Suggest / Save & suggest button and the per-field notes, partial failures, reviewing suggestions in the dialog, the suggest-only dialog (with a screenshot), and troubleshooting. It is built on main's sign-in rewrite from docs: sign in with a Tolgee account for the CLI, the browser extension and MCP clients #1151, which also documents plugin sign-in, so this PR no longer adds its own sign-in section.
  • suggestions.mdx says that with Suggestions mode off, the API rejects new suggestions with suggestions_disabled (HTTP 409) while existing ones stay manageable. It documents the Delete own permission, including for API keys and connected applications.
  • platform/translate-with-tolgee.mdx is a page for contributors. The Translate with Tolgee badge links to it through the short link /translate-with-tolgee, which static/_redirects points to the page.
  • Self-hosting links to main's oauth_sign_in.mdx for turning the browser extension on, instead of adding a second section to getting_started.mdx.

Pre-merge checklist, resolved

  • Version placeholders are filled in: v3.227.0 for the platform, @tolgee/web 7.3.0 for suggesting, 7.2.0 for sign-in, and v3.230.0 for self-hosted plugin sign-in.
  • Dialog and plugin labels are checked against the released source:
    • the dialog's Accept, Accept only, Decline, Accept and decline others, Delete, Show more, Save, Suggest, Save & suggest
    • the plugin's Connect to Tolgee, the missing-permissions alert and Sign in again, Sign-in not available on this site, Sign-in needs a newer Tolgee SDK
    • the platform's Delete own
  • "Show more" loads ten more at a time, and the page says so.
  • The partial-failure behaviour is checked against the shipped dialog.
  • platform/self_hosting/configuration.mdx is regenerated. It now comes from main at v3.236.1.
  • Screenshots:

Still open (tracked on #1130)

  • The short link redirects to the page on the deploy preview (/translate-with-tolgee answers 301 to /platform/translate-with-tolgee).
  • Tolgee Tools v1.11.0 is a GitHub pre-release. Confirm it is live in the browser stores.

TolgeeMachine and others added 8 commits September 21, 2026 10:52
…#1133)

Two statements in the docs do not match the product. Both were found
while verifying Tolgee feature availability against the platform source
for a comparison page.

## Machine translation providers

`platform/translation_process/machine_translation.mdx` listed four
external providers. The product ships five: `MtServiceType` has
`GOOGLE`, `AWS`, `DEEPL`, `AZURE` and `BAIDU`, and Baidu Translate has
its own configuration section in the self-hosting docs
(`tolgee.machine-translation.baidu`).

Added Baidu, marked self-hosted only since it is configured with your
own API key via server configuration.

## AI Translator context

`platform/translation_process/ai_translator.mdx` said Tolgee Context is
"available only in the Cloud version with SDK 5.9.0 and higher". It is
not Cloud only. The SDK 5.9.0 requirement is the real constraint, so the
note now states just that.

## Why this matters

Both statements understate what Tolgee does, and a competitor comparison
page repeated one of them because our own docs said it. The provider
count in particular was used to score a competitor claim as wrong when
the competitor was right.

## Not covered here

Three further inaccuracies live on `tolgee.io/pricing`, which is not in
this repo:

- The AI translator is marked N/A on the Free plan. No such gate exists
in the code; `LlmProviderController` has no `@RequiresFeatures` and
there is no AI translator feature in the `Feature` enum.
- Included MT credits for Team and Advanced disagree with the billing
API (10,000 vs 200,000, and 1,000,000 vs 2,000,000).
- The Advanced extra-seat price disagrees with the billing API (EUR 22
vs 16).

Co-authored-by: Barus Urbanova <bara.skrivankova@gmail.com>
Anty0 and others added 14 commits September 24, 2026 13:36
The docs home page title was the org slogan, rendered as "Painless
localization | Tolgee". It now renders as exactly "Tolgee Docs" (tab
title and og:title). Other pages keep their titles.
…us id (#1153)

Part of the traffic source attribution work. Companion to
tolgee/billing#325, which must be released before this does anything.

## PostHog persistence

`persistence` was `'memory'`, so the anonymous distinct id died on every
page load and no pre-signup journey could ever be stitched to an
account. It is now `'localStorage+cookie'` with `cross_subdomain_cookie:
true`, so tolgee.io and docs.tolgee.io share one id.

`persistence_name: 'tg_marketing'` is load-bearing, not tidiness. The
webapp initialises PostHog with the same project token, no
`persistence_name`, and then calls `posthog.identify(userId)`. Without a
store of its own, the marketing sites would read the app's
**identified** person store: for anyone who has ever logged in on that
browser the id sent as `p` would be their user id, and the backend would
then ask PostHog to alias one customer's identified id onto another
person.

`capture_pageview: false` stays as it was, because `LayoutContent`
already captures `$pageview` per route.

## The touch snippet

`marketingTouch.ts` posts every external arrival to `POST
/v2/public/session` and stores the returned opaque session id back into
the `tg_sid` cookie. An arrival is external when the referrer is empty
or off `tolgee.io`, or when the URL carries campaign params. Internal
navigation posts nothing.

It fires once per arrival per tab. The two-key `sessionStorage`
fingerprint is what collapses a reload and a client-side route change
into one arrival: `document.referrer` survives both, while
`location.search` does not, so a fingerprint mixing them would re-report
one visit as two on the first internal click.

Its counterpart is `scripts/framer/marketing-touch.js` in the
tolgee-company repo, which carries the same logic for the Framer site.
They diverge in exactly three places, all forced by their hosts, and the
file header on each says which.

## Two things to set before this has any effect

- **`DOCUSAURUS_MARKETING_SESSION_ENDPOINT` must be set in the docs
deploy environment** (to `https://app.tolgee.io/v2/public/session`).
There is deliberately no fallback: `document.referrer` is empty on
localhost, so a default would make every fresh tab in a preview build or
a local dev server write a real session and touch row into the
production billing database.
- The token key now accepts `DOCUSAURUS_POSTHOG_TOKEN` with the existing
misspelled `DOCOSAURUS_POSTHOG_TOKEN` as a fallback, so the deploy
environment and this file can be corrected in either order. The same
applies to the api host key. Nothing breaks if the environment keeps the
old spelling.

`initPosthog` is also now skipped entirely when the token or host is
missing, instead of being called with `undefined`, which made every
downstream check pass vacuously.

## Verification

`npm run tsc` is clean for every changed file (the four errors it
reports are pre-existing, in `Table.tsx`, `PricingChanges.tsx`,
`SsoFieldsTable.tsx` and `PlaceholderConversions.tsx`), and `eslint` is
clean on all of them. The browser checks (one POST on a direct load,
none on an internal link, none on F5, one on a new campaign in the same
tab, `p` present in the body) are still to run against a deploy preview.
Anty0 added a commit to tolgee/tolgee-platform that referenced this pull request Oct 9, 2026
#3780) (#3930)

This is the **integration branch** for pitch #3780
(community SDK suggestions). The pitch's platform scopes were built on
separate branches and have all been merged into this one; this PR goes
to `main`.

## Deploy note — read before merging

The backfill changeSet `1789914853000-1` appends
`translation-suggestions.own-access` to every granular permission row
(members, invitations, organization base permissions) whose scopes
already imply `translations.view` — any of the 18 scopes frozen in
`translationSuggestionsOwnAccessBackfill.sql` — and that does not carry
it yet.

- **Rolling deploy window.** Once the backfill has run, pods still on
the previous release cannot read a backfilled row — the scope name is
not in their `Scope` enum. For a user with granular permissions that
means `GET /v2/projects/{id}` 404 and translations 500 from an old pod,
and the members list 500 for the project owner. Everyone else is
unaffected. The window closes when the rollout completes. **Deploy
during quiet hours** (user's decision, 2026-09-22).
- **Permission cache — longer than the deploy.** Nothing evicts
`Caches.PERMISSIONS` when the backfill writes the rows, and
`CacheProperties.defaultTtl` is **120 minutes**. On a multi-pod Redis
deployment a granular member whose cached permission predates the
backfill is refused own-delete — an action they could perform before
this release — until that entry expires. Self-healing, but up to two
hours, and it outlives the rolling deploy above. A single-node Caffeine
cache is unaffected (it starts empty, after Liquibase). Evicting the
permission cache after the migration turns this window off.
- **Rollback.** The changeSet has a real `<rollback>` that strips the
scope from every permission row and API key that holds it.

## Release note for this release

Creating a suggestion on a project with suggestions **disabled** is now
rejected with `suggestions_disabled` (HTTP 409 Conflict — the project's
state, not the request, is what is wrong). Until now only the webapp
enforced it, so API and SDK clients could create suggestions on a
disabled project. Listing, accepting, declining and deleting stay
allowed, so pending suggestions can still be cleaned up.

Also: this release is the floor for the Tolgee browser extension that
ships with the pitch — it asks for the suggestion scopes as a fixed
list, and a server that does not know them refuses the whole
authorization.

## What Foundation landed

- New scope `translation-suggestions.own-access`, implying
`translations.view` and implied by `translation-suggestions.manage`,
granted by the VIEW, TRANSLATE and REVIEW roles (EDIT and MANAGE through
manage) and by the community floor; selectable in advanced permissions.
- Deleting your own suggestion requires that scope for every credential.
A project API key or OAuth token that carries it can now delete its
owner's suggestions, which no scoped credential could before. An author
without it gets `operation_not_permitted` naming the missing scope.
- Creating a suggestion on a project with suggestions disabled is
rejected with `suggestions_disabled` (409). Listing, accepting,
declining and deleting stay allowed.
- `GET /v2/api-keys/current-permissions` returns `suggestionsMode` and
`translationProtection`, so the in-context dialog can decide between
Save and Suggest.
- `docs/oauth/README.md` describes the new gate.

## What scope D landed (PR #3937, merged here)

- **The backfill** above, so members with granular permissions keep
deleting their own suggestions. It grants nobody more than they had:
before the scope, every author could delete their own suggestion
whatever their scopes.
- The platform's suggestion list no longer offers **delete** on an own
suggestion without the scope — it used to show a button that answers
403. `translation-suggestions.manage` still covers anyone's suggestion.
- A user-facing message for the `suggestions_disabled` error in the
webapp.
- `GET /v2/api-keys/current-permissions` also returns **`userId`**
(whose suggestions are mine — the browser extension's page proxy refuses
`/v2/user` on purpose) and **`userScopes`**, the user's own expanded
project scopes, *not* narrowed by the API key or OAuth grant. A scope in
`userScopes` but not in `scopes` is one the credential lacks, which is
what lets a client say "your account can do this, this sign-in cannot".
- **OAuth: an unknown scope is dropped rather than refusing the
request**, on both the authorization and the refresh. Without it, every
scope a client learns from a newer Tolgee breaks sign-in against every
older server. A request left with no supported scope is still
`invalid_scope`, and on a refresh a scope this server knows but never
granted is still refused.

### What it looks like

Every screen this changes, before and after. Same fixture, same
viewport; the "before" column comes from a worktree on `main`. The same
shots, laid out side by side, are also at
https://claude.ai/artifact/PuwZjocwwMrDwqc1EktHS8 (private — ask if you
need access).

**Advanced permissions gains a "Delete own" row.** It is what lets a
member remove a suggestion they wrote; a moderator who can manage
everyone's suggestions holds it implicitly, which is why it shows ticked
and dimmed.

| Before (`main`) | After |
| --- | --- |
| ![Granular permissions dialog: Suggestions offers Suggest and
Manage](https://github.com/user-attachments/assets/dbcf6810-8123-413b-a688-d5ac3a9a40ea)
| ![The same dialog with an added Delete own row under
Suggestions](https://github.com/user-attachments/assets/686976ea-3940-4a73-9cd0-00c25fe10c90)
|

**Without the permission, the delete action is gone.** The same
contributor looking at the suggestion they wrote, with granular
permissions that do not carry `translation-suggestions.own-access`.
Before, any author could delete their own suggestion whatever their
permissions said, so the row always offered its menu; now there is no
button at all, because deleting was the only thing that menu offered.

| Before (`main`) | After |
| --- | --- |
| ![Suggestion row hovered, showing a three-dot action
button](https://github.com/user-attachments/assets/23b81cd7-8286-46c5-b98c-07e17f4a8ab4)
| ![The same suggestion row hovered, with no action
button](https://github.com/user-attachments/assets/55a4823a-c38a-4305-b4e7-ee2e6ba17a2d)
|

**With the permission, nothing changes for the author.** Everyone who
could delete their own suggestion before keeps it through the backfill,
so this is what the same contributor sees in practice.

![Suggestion row action menu open, showing Delete
suggestion](https://github.com/user-attachments/assets/c8765b9f-4dae-45da-b478-4e7e798c3a70)

**Suggesting into a project that stopped taking suggestions.** The
server now refuses it; a tab opened before the switch is the only way to
meet this, and it says so instead of failing namelessly.

![Error toast reading Suggestions are disabled for this
project](https://github.com/user-attachments/assets/43225646-8de9-41d6-9eef-e253e75eede8)

Related: tolgee-js integration PR tolgee/tolgee-js#3539 · browser
extension tolgee/chrome-plugin#44 (held until this is released) · docs
tolgee/documentation#1144.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added a dedicated permission for deleting your own translation
suggestions. Project roles include it by default, and granular
permissions can grant it separately.
* Current-permissions responses now include the user’s project scopes,
project suggestion settings, translation protection setting, and user
ID.
* **Bug Fixes**
* Deleting your own suggestion now requires the dedicated permission;
users with suggestion-management access can still delete any suggestion.
* Suggestion creation is rejected when suggestions are disabled for a
project.
* OAuth authorization and refresh requests ignore unknown scopes when
supported scopes remain. Requests with no supported scopes, or with
known but ungranted scopes, still fail.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->




## Review fixes (9 Oct)

- `660dd2702` (tip after rebase) — `fix: respond 409 when suggesting on
a project with suggestions disabled`: `createSuggestion` throws
`DisabledFunctionalityException` (409 Conflict) instead of
`BadRequestException` (400); the error code `suggestions_disabled` is
unchanged. The branch was also rebased onto current `main`
(`ca0d93174`); every earlier commit is unchanged (`git range-diff` all
`=`).
TolgeeMachine added a commit to tolgee/tolgee-platform that referenced this pull request Oct 9, 2026
# [3.227.0](v3.226.3...v3.227.0) (2026-10-09)

### Features

* suggestions in the in-context dialog for community members (pitch tolgee/tolgee-platform[#3780](#3780)) ([#3930](#3930)) ([1e04181](1e04181)), closes [#3937](#3937) [tolgee/tolgee-js#3539](tolgee/tolgee-js#3539) [tolgee/chrome-plugin#44](tolgee/chrome-plugin#44) [tolgee/documentation#1144](tolgee/documentation#1144)
TolgeeMachine and others added 4 commits October 9, 2026 15:33
…n and MCP clients (#1151)

## What this does

Tolgee can now sign apps in with the user's account instead of a copied
API key. The platform acts as an OAuth 2.1 authorization server, the
Tolgee CLI, the Tolgee Tools browser extension and MCP clients use it.
The docs said nothing about this yet. This PR adds the missing pages and
updates the ones that only knew API keys.

Platform docs are written for users, the CLI and JS SDK docs for
developers. Simple English throughout.

## New pages

- **Platform › Account Settings › Sign in with Tolgee (OAuth)**: which
apps use it, what the consent screen asks (unverified app warning, local
app notice, single project vs all projects, permissions), how long
access lasts, how to end it, a comparison with API keys, common
questions.
- **Platform › Self-hosting › Sign-in for apps (OAuth)**: what is on by
default after an upgrade, why `back-end-url` matters on a split-origin
setup, how to register the browser extension, the switches
`cli-enabled`, `cimd-enabled` and `cimd-allowed-hosts`, token lifetimes,
the two metrics to watch.

## Updated pages

- **MCP server** (about, setup, usage): signing in with a Tolgee account
is now the first option, with Claude Code and VS Code steps. API keys
stay as the second option. Notes on the tools that still need a PAT, and
new troubleshooting rows with the real error codes.
- **API keys and PAT tokens**: a tip pointing at the new sign-in page.
- **CLI › Usage**: the "Logging in" section is rewritten around a bare
`tolgee login`: `--no-browser`, CI behaviour, the project taken from the
approval, `login --list`, the three `logout` forms, the credential
priority order, where the store lives. **Introduction** and **Project
configuration** got short notes.
- **JS SDK › In-context translating**, **options**, **plugins**: the
extension sign-in path, what a site must provide (`projectId`,
`@tolgee/web` 7.2.0), how requests are relayed through the extension,
the API key fallback.

## Depends on

- tolgee/tolgee-platform#3944 (MCP client sign-in, CLI client
registration, unverified-app consent screen).
- tolgee/tolgee-cli#210 (`tolgee login` through the browser).
- `@tolgee/web` 7.2.0 and Tolgee Tools 1.10.0 are already released.

## Screenshots

Four new images under `static/img/docs/platform/oauth/`: the consent
screen for the CLI, and the Tolgee Tools popup before and after signing
in together with the consent screen it opens. They were taken against a
local instance, so they show `localhost` and a demo project.

## Not in this PR

- The configuration reference section. It is generated from a running
server at release time and will pick up the new properties then.
- A sentence about refusing sibling hosts of the instance domain. That
change is not on the platform PR yet.

## Checks

`npm run build` (with broken links set to throw), `npm run eslint` and
`npm run prettier-check` pass locally.
JanCizmar and others added 14 commits October 13, 2026 17:32
Docs for tolgee/tolgee-platform#3973.

## Export page (`platform/projects_and_organizations/export.mdx`)

- Rewritten dashboard section for the new layout: Languages and Format
on top, the collapsible `Advanced settings` section and its one-line
summary.
- New sections: configure advanced settings, export only keys with
specific tags (include/exclude, `*` wildcards), and reuse your last
export setup (`Reset to defaults`, links override remembered values).
- Fixed the outdated claim that only JSON and XLIFF are supported, and
added a REST example for `filterTagIn` / `filterTagNotIn`.

## Content delivery
(`platform/projects_and_organizations/content_delivery.mdx`)

- Updated the create step for the new dialog and added a "Choose what
gets published" section covering states, namespaces, format options and
include/exclude tags.

## Screenshots

New webp screenshots from a realistic demo project in
`static/img/docs/platform/export/` and
`static/img/docs/platform/content-delivery/`. The old `export.webp` and
`add-content-delivery.png` showed the previous UI and were not used
elsewhere, so they are removed.

Merge together with or after the platform PR.
## What changed

Two things in `.github/dependabot.yml`:

- Ignore major bumps for everything.
- Group the openapi-docs plugin and theme so they can only be bumped
together.

Patch and minor updates keep coming as before.

## Why

Every major bump Dependabot opened in this repo needed a migration it
cannot do on its own:

- Tailwind 4 moves the PostCSS plugin to a separate package and needs a
config rewrite.
- ESLint 10 needs the flat config format.
- React 19 is not supported by Docusaurus 3.
- Bumping `@docusaurus/core` alone leaves the other `@docusaurus/*`
packages behind, so the build breaks.

They all failed CI, got closed, and came back the next month. There are
4 closed react-dom branches and 3 for eslint. Doing a major by hand,
when there is a reason to, is the only way these land.

The grouping rule fixes a worse problem. The openapi-docs plugin and
theme must share a version. Bumping only the plugin (#1103, #1122)
breaks every API reference page in the browser, and neither the build
nor the deploy preview catches it, because the failure is client side.

## On security updates

An `ignore` rule also applies to Dependabot security update PRs, so a
wildcard would normally be too blunt. It is fine here: Dependabot
security updates and Dependabot alerts are both switched off for this
repository, so there is nothing for the rule to suppress. If either is
turned on later, this rule should become a list of package names
instead.
Documents the `=` exact-match prefix in scoped search, added in
tolgee/tolgee-platform#3914.

- New row `key:=cart.title` in the wildcard table, section renamed to
cover whole-value matching.
- Notes that `*` still works after `=` and how to find a value that
itself starts with `=`.
- API section mentions the `=` syntax next to `*`.

Merge after the platform PR is released.
…#1157)

Bumps
[@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)
from 8.44.1 to 8.71.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/parser's
releases</a>.</em></p>
<blockquote>
<h2>v8.71.1</h2>
<h2>8.71.1 (2026-10-05)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-misused-promises] skip argument
checks for calls without arguments (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12923">#12923</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unused-vars] report
usedOnlyAsType for partially exported merged declarations (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12892">#12892</a>)</li>
<li><strong>eslint-plugin:</strong> [require-array-sort-compare] use
array argument type constraint (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12919">#12919</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unsafe-enum-assignment] skip
identical types and bound deep type walks (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12957">#12957</a>)</li>
<li><strong>eslint-plugin:</strong> [no-confusing-void-expression] don't
autofix when declared return type is unknown (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12930">#12930</a>)</li>
<li><strong>eslint-plugin:</strong> [prefer-optional-chain] check the
constrained type (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12953">#12953</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-parameters]
count instantiated mapped type constraints (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12941">#12941</a>)</li>
<li><strong>project-service:</strong> throttle cleanup when opening
files (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12934">#12934</a>)</li>
<li><strong>type-utils:</strong> match re-exports and global
declarations in <code>TypeOrValueSpecifier</code> (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12943">#12943</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Diptajoy Mistry <a
href="https://github.com/diptomistry"><code>@​diptomistry</code></a></li>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Josh Goldberg</li>
<li>Josh Goldberg ✨</li>
<li>Medhansh Poojari</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>v8.71.0</h2>
<h2>8.71.0 (2026-09-28)</h2>
<h3>🚀 Features</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-unsafe-enum-assignment] add rule
(<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12732">#12732</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [switch-exhaustiveness-check] always
sort literal cases in stable order (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12885">#12885</a>)</li>
<li><strong>eslint-plugin:</strong> [unbound-method] respect <code>this:
void</code> on class properties (<a
href="https://github.com/typescript-eslint/typescript-eslint/commit/7fce9127d">7fce9127d</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-assertion]
specialize generic assertion report message (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12832">#12832</a>)</li>
<li><strong>eslint-plugin:</strong> [no-misused-promises] handle a
return outside of any function (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12912">#12912</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Fatih Çakır <a
href="https://github.com/wfatih"><code>@​wfatih</code></a></li>
<li>Josh Goldberg</li>
<li>Josh Goldberg ✨</li>
<li>Zamiell <a
href="https://github.com/Zamiell"><code>@​Zamiell</code></a></li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.0">GitHub
Releases</a> for more information.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md">@​typescript-eslint/parser's
changelog</a>.</em></p>
<blockquote>
<h2>8.71.1 (2026-10-05)</h2>
<p>This was a version bump only for parser to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>8.71.0 (2026-09-28)</h2>
<p>This was a version bump only for parser to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>8.70.1 (2026-09-21)</h2>
<p>This was a version bump only for parser to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.1">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>8.70.0 (2026-09-07)</h2>
<p>This was a version bump only for parser to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.70.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>8.69.0 (2026-08-31)</h2>
<p>This was a version bump only for parser to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.69.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>8.68.0 (2026-08-24)</h2>
<p>This was a version bump only for parser to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.68.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
<h2>8.67.0 (2026-08-10)</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/d57b8da272375b6a45270639894a793933208a91"><code>d57b8da</code></a>
chore(release): publish 8.71.1</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/8695664c5ee3fbb8fd76907fc45e148579cc3162"><code>8695664</code></a>
chore(release): publish 8.71.0</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/23d38ceeb8fb1237f55cb62fc2b54419e1fa1ed7"><code>23d38ce</code></a>
chore(release): publish 8.70.1</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/7ee76085c22e923c0036b8e0733a3ca7dfd82b60"><code>7ee7608</code></a>
chore(release): publish 8.70.0</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/9a6e546823e5d8f2dc015df2aa66c0230615e209"><code>9a6e546</code></a>
chore(release): publish 8.69.0</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/8f4e00a4e8f3bdf93a5e5e8bc568ba1c15a4f896"><code>8f4e00a</code></a>
chore(release): publish 8.68.0</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/55f6d5d4ca39d2fab93db97ced497b956017878d"><code>55f6d5d</code></a>
chore: enable source maps (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser/issues/12677">#12677</a>)</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/20a261fb8e62351e88176b075090dc9276d26072"><code>20a261f</code></a>
chore(release): publish 8.67.0</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/3b155bb1344fd7ce83086cf2f864a7e8f3b4a217"><code>3b155bb</code></a>
chore: use typescript 7 for typechecking (<a
href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser/issues/12601">#12601</a>)</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/e51b11ba3ab31837762c675f62f0d4dcb1abc4fb"><code>e51b11b</code></a>
chore(release): publish 8.66.0</li>
<li>Additional commits viewable in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.1/packages/parser">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@typescript-eslint/parser&package-manager=npm_and_yarn&previous-version=8.44.1&new-version=8.71.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1. Replace key-based limits with hosted words.
2. Explain how hosted words are counted and what happens at the limit.
3. Rename plan availability notices to the Translate, Optimise, Manage
and Enterprise plans.
…#1158)

The Subscriptions and Invoices pages in organization settings are now
one Billing page, with `My subscription` and `Plans` tabs. The docs
still pointed to the old pages.

## Changes

- **Organization settings** - the billing section describes the two tabs
and the `Cloud` / `Self-hosted` toggle. Invoices and the customer portal
are now at the bottom of `My subscription`. The heading is "View and
Manage Billing", but it keeps the old `#view-and-manage-subscriptions`
anchor, so the link from the Machine Translation page and older links
still work.
- **Self-hosted licensing** - "Subscription page" is now "Billing page".
To subscribe, it points to `Plans` → `Self-hosted`, and custom plans to
`Your custom plans`.
- **6 screenshots retaken** on a local platform + billing build from
`main`: `subscriptions`, `Invoices-customer-portal`,
`subscriptions-selfhosted`, `subscription_license_key`,
`subscription_self-hosted_cancel`,
`subscription_self-hosted_cancel_confirm`.
- **5 unused images removed** - no page used them and they showed the
old menu.

## Not in this PR

- Screenshots on other pages (members, glossaries, translation memories,
LLM providers, SSO) still show the old menu in the sidebar. The page
content is still right, so I left them.
- The usage list in organization settings ("Used keys", "Used seats") is
out of date, but #1145 rewrites that part.

## Checked

- `npm run build` passes (it fails on broken links and anchors).
- Every text change was compared with the running app. The
`/billing-self-hosted` link and the old `/subscriptions` and `/invoices`
URLs redirect to the Billing page.

---------

Co-authored-by: Barus Urbanova <bara.skrivankova@gmail.com>
- Move the Community Translation pages under Translation Process with
  kebab-case names, and rename the contributor page to
  translate-with-tolgee.mdx
- Restructure Community Translation by owner and contributor point of view,
  with a self-contained lead, numbered procedures, the exposure of a public
  project, who may accept and publish, and the self-hosted requirements
- Name the free Business plan for non-commercial open source with a
  mailto:sales@tolgee.io link
- Fill in the released versions, the suggestions_disabled status (409), and
  the plugin and dialog labels as the products spell them
- Build the in-context suggestions section on main's sign-in rewrite and
  link to oauth_sign_in.mdx instead of a second self-hosting section
- Retake the advanced project settings screenshot with Public project and
  move it to the top of the section; add a suggest-only dialog screenshot
…y-sdk-suggestions

# Conflicts:
#	js-sdk/in_context.mdx
@Anty0
Anty0 merged commit 48b42ed into jirikuchynka/community-translations-docs Oct 19, 2026
3 checks passed
@Anty0
Anty0 deleted the jirikuchynka/community-sdk-suggestions-e branch October 19, 2026 05:25
@Anty0 Anty0 mentioned this pull request Oct 19, 2026
1 of 3 tasks
Barush added a commit that referenced this pull request Oct 19, 2026
Documents Community Translation end to end: public projects and
community contributors in the platform (pitch
tolgee/tolgee-platform#3806), and suggesting translations in context
through the Tolgee Tools browser plugin (pitch
tolgee/tolgee-platform#3780). It includes the changes from #1144, which
was built on top of this branch and is merged into it.

The feature is released:

| Part | Release |
| --- | --- |
| Public projects | Tolgee v3.206.0 |
| `Community translation` switcher entry | Tolgee v3.207.0 |
| `Community` tab, `Invite to Team` | Tolgee v3.215.0 |
| Plugin sign-in on self-hosted
(`tolgee.oauth2.browser-extension-enabled`) | Tolgee v3.230.0 |
| Suggestions in the in-context dialog | `@tolgee/web` 7.3.0, Tolgee
v3.227.0 |
| Missing-permissions alert in the plugin | Tolgee Tools v1.11.0 |

## New pages

- **`platform/translation_process/community-translation.mdx`**, the
feature hub. It has a part for owners and members (making a project
public and what that exposes, sharing it, reviewing suggestions, seeing
who contributed, making it private again) and a part for contributors
(what they can do, finding the projects they helped with). It also
covers the self-hosted requirements: version floor, authentication and
open registrations.
-
**`platform/translation_process/community-translation-in-context.mdx`**,
for owners whose website uses the Tolgee JS SDK. It covers what to
switch on in the project and on a self-hosted server, what to declare on
the website (`apiUrl`, `projectId`, no `apiKey`), what contributors
need, the `Translate with Tolgee` badge, and what contributors can do in
the dialog.
- **`platform/translate-with-tolgee.mdx`** is the page the badge links
to, through the short link `/translate-with-tolgee` that
`static/_redirects` points to it. It walks a first-time contributor
through installing the plugin, signing in and Alt+clicking a string, and
lists fixes for common problems.

## Updated pages

- **`js-sdk/in_context.mdx`** gets a new section, "Suggesting
Translations in Context". It covers the `Save` / `Suggest` / `Save &
suggest` button, the per-field notes, partial failures, reviewing
suggestions in the dialog, suggest-only permissions and troubleshooting.
A short paragraph links the sign-in section to it. The page is based on
main's version from #1151.
- **`suggestions.mdx`** describes the two accept actions (`Accept only`
and `Accept and decline others`) and the display of up to three
suggestions with `Show all`. It notes that `Suggestions mode` off
rejects new suggestions with `suggestions_disabled` (HTTP 409), and it
documents the `Delete own` permission. It also corrects which
permissions accepting and declining need.
- **`project_settings.mdx`** gets a `Public project` section, and the
Advanced screenshot is retaken and moved to the top of the section (see
the review comments below).
- **`members.mdx`** gets a `Community Contributors` section (the `Team`
and `Community` tabs) and a community-permissions note.
- **`sidebarPlatform.js`**: both community pages sit under Translation
Process, and the contributor page sits under Get Started.

## Review comments addressed

- The page moved to Translation Process.
- The open-source offer now names the free Business plan for
non-commercial open source and links to `mailto:sales@tolgee.io`.
- The lead paragraph is rewritten as who, what, how and what's next,
with no links, and says "anyone with a Tolgee account".
- Sections are grouped by owner and contributor point of view.
- The full public projects URL is given, with the self-hosted
equivalent.
- The page says where the organization switcher is and when `Community
translation` appears.
- The community projects screenshot is explained: logged in, what `My
contributions only` filters, and that `Community translation` is not a
real organization.
- Accept options and the Team and Community tabs are bullets.
- The Advanced project settings screenshot was missing `Public project`
and sat at the bottom of the section. It is retaken with `Public
project` on top and moved directly under the section heading.
- `Read more` from the settings page links to the "Making a Project
Public" anchor.
- The `public project` links on the Members page go to the "Making a
Project Public" anchor instead of the page top.

## Screenshots

These are captured against a local Tolgee v3.236.0 and the `@tolgee/web`
test app, or reused from main.

- public toggle
- Advanced settings
- public projects page
- community projects page
- Community tab
- the accept actions
- the in-context dialog in suggest-only mode
- the plugin's `Connect to Tolgee` popup and consent screen, reused from
main's #1151 images

## Open

- [x] The short link redirects to the page on the deploy preview
(`/translate-with-tolgee` answers 301 to
`/platform/translate-with-tolgee`).
- [ ] Tolgee Tools v1.11.0 is a GitHub pre-release. Confirm it is live
in the Chrome Web Store and Firefox Add-ons before release notes point
at the missing-permissions alert.
- [ ] Optional: replace
`static/img/docs/platform/oauth/consent-screen-browser-extension.webp`
on the contributor page with a capture made as a contributor. The
current one shows a user with edit rights.

The branch is up to date with `main`. Checked with `npm run build`,
which throws on broken links and anchors.

---------

Co-authored-by: Barush Urbanová <bara.skrivankova@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants