Skip to content
Merged
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
42 changes: 42 additions & 0 deletions platform/self_hosting/running_with_docker.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,45 @@ spring:
```

Don't forget to change the `POSTGRES_USER`, `POSTGRES_PASSWORD`, `username` and `password` properties to your values.

## Optional: Spelling & Grammar checks (LanguageTool)

Tolgee's [QA Checks](/platform/translation_process/qa_checks) include Spelling and Grammar checks powered by [LanguageTool](https://languagetool.org/). These checks require a separate LanguageTool container.

Add the LanguageTool service to your `docker-compose.yml`:

```yaml title=docker-compose.yaml
services:
app:
image: tolgee/tolgee{{dockerTagVersion}}
volumes:
- ./data:/data
- ./config.yaml:/config.yaml
ports:
- '8080:8080'
environment:
spring.config.additional-location: file:///config.yaml
depends_on:
- languagetool
languagetool:
image: erikvl87/languagetool:6.7
environment:
- Java_Xms=256m
- Java_Xmx=1024m
```

Then add the LanguageTool URL to your `config.yaml`:

```yaml title=config.yaml
tolgee:
language-tool:
url: http://languagetool:8010
```

Or as an environment variable: `TOLGEE_LANGUAGE__TOOL_URL=http://languagetool:8010`

Once configured, you can enable Spelling and Grammar checks in your project's QA settings (they default to Off).

:::note
The container loads all language models on startup, which can take a while and uses ~1-1.5 GB of memory. Adjust `Java_Xmx` based on your available resources.
:::
230 changes: 230 additions & 0 deletions platform/translation_process/qa_checks.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
---
id: qa_checks
title: Translation QA Checks
sidebar_label: QA Checks
image: /img/og-images/platform.png
description: Automatically detect translation quality issues like missing placeholders, inconsistent punctuation, broken placeholder syntax, spelling and grammar errors with Tolgee's built-in localization QA checks.
---

import { ScreenshotWrapper } from '../shared/_ScreenshotWrapper';
import { ScreenRecording } from '../shared/_ScreenRecording';

When managing translations across many languages, it's easy for localization errors to slip through. A translator might accidentally remove a placeholder, break [placeholder syntax](/platform/translation_process/icu_message_format), add extra spaces, or miss punctuation. These translation quality issues are hard to spot manually, especially at scale, and can lead to broken UI, missing data, or confusing user experiences.

QA Checks solve this by automatically validating your translations and flagging potential issues such as missing placeholders, broken placeholder syntax, inconsistent punctuation, spelling and grammar errors, and more. Issues are detected **in real time** as you type and also run in the background when translations are saved or modified in bulk.

<ScreenshotWrapper
src="/img/docs/platform/qa-checks/qa_checks_overview.png"
alt="Overview of QA checks panel in the translation editor showing detected issues"
/>

:::info Feature availability
QA Checks are available in advanced plans. [Upgrade your plan](https://tolgee.io/pricing) to use this feature.

If you use the self-hosted version, you must [set up the license](https://tolgee.io/pricing/self-hosted) to use this feature.
:::

## Enabling QA Checks

If you would like to start using QA checks, you have to enable them first. To enable QA checks

1. Go to `Project settings`
2. Find the `QA Checks` section
3. Toggle QA Checks on

<ScreenRecording
src="/img/docs/platform/qa-checks/enable.webm"
alt="Enabling QA checks in project settings"
/>

Once enabled, Tolgee will automatically run checks on all translations in the project. You'll see a progress indicator while the initial check completes.

## Available Check Types

Tolgee provides check types organized into two categories: **general checks** that catch common translation issues, and **syntax checks** that validate the structure of the translation itself.

### General Checks

These checks catch common translation issues such as formatting inconsistencies, missing content, and spelling or grammar errors

| Check | Description |
|-------|-------------|
| **Empty translation** | Detects blank or whitespace-only translations |
| **Spaces mismatch** | Leading/trailing space differences, doubled spaces, non-breaking spaces |
| **Unmatched new lines** | Missing or extra line breaks compared to the base translation |
| **Trim check** | Detects leading/trailing spaces or new lines within the base translation |
| **Character case mismatch** | Capitalization differences (e.g., first letter case) |
| **Missing numbers** | Numeric values present in the base but missing in the translation |
| **Spelling** | Spelling errors (off by default) |
| **Grammar** | Grammar errors (off by default) |
| **Repeated words** | Consecutive repeated words (e.g., "the the") |
| **Punctuation mismatch** | Missing, extra, or replaced punctuation marks |
| **Brackets mismatch** | Missing or extra brackets compared to the base |
| **Brackets unbalanced** | Unclosed or unopened brackets within the translation |
| **Special character mismatch** | Missing or extra special characters |
| **Different URLs** | URLs that are missing, extra, or different from the base |
| **Key length limit** | Translation exceeds the key's configured [character limit](/platform/translation_keys/keys#character-limit) |

### Syntax Checks

These checks validate the structure and syntax of the translation itself

| Check | Description |
|-------|-------------|
| **Inconsistent placeholders** | Variable placeholders (e.g., `{userName}`) missing or extra compared to the base |
| **Inconsistent HTML** | HTML tags missing or extra compared to the base |
| **HTML syntax** | Unclosed or unopened HTML tags |
| **ICU syntax** | Invalid [message format](/platform/translation_process/icu_message_format) (select, plural, choice expressions) |

## Spelling and Grammar Checks

Typos and grammar mistakes in translations are easy to miss during manual review, especially across many languages. The `Spelling` and `Grammar` checks help catch these errors automatically.

Both checks are powered by an external spelling and grammar engine that uses dictionaries and pattern-matching rules. This means they are effective at catching common typos, misspellings, and basic grammar errors, but they have important limitations to be aware of.

### What These Checks Can Do

- Detect common **spelling mistakes** and suggest corrections
- Flag basic **grammar errors** such as incorrect word forms or agreement issues
- Provide **one-click corrections** for most detected issues

### What These Checks Cannot Do

These checks use rule-based pattern matching, not contextual understanding. They work best on standard prose and may not perform well in all situations

- **Domain-specific terms, brand names, and abbreviations** are often flagged as errors. Use `Ignore` to dismiss these, or add them to your project [glossary](/platform/glossaries/managing_glossaries) so they are automatically excluded from spelling and grammar results.
- **Short, non-sentence text** such as button labels, menu items, or single-word translations may trigger irrelevant suggestions. Tolgee already filters out some sentence-level rules (like "capitalize first letter") that don't apply to short text, but occasional false positives are expected.
- **Language coverage varies.** The engine supports approximately 30 languages, with some having comprehensive rules and others having minimal coverage. If a language is not supported, the checks silently return no results for that language.
- **Placeholders, HTML, and URLs are excluded.** To reduce noise, issues that overlap with [placeholders](/platform/translation_process/icu_message_format), HTML tags, or URLs are automatically filtered out. Dedicated checks already cover those elements.

### Enable Spelling and Grammar Checks

Both checks default to `Off` because they require additional setup for self-hosted instances and are best enabled intentionally after understanding their limitations.

To enable them, go to `Project settings` > `QA Checks` and set `Spelling` and `Grammar` to `Warning`.

:::note Self-hosted instances
Spelling and grammar checks require a separate container to run. If you are self-hosting Tolgee, see the [self-hosting setup guide](/platform/self_hosting/running_with_docker#optional-spelling--grammar-checks-languagetool) for deployment instructions. Without it, these checks cannot be enabled.
:::

## Viewing QA Issues

### In the Translation Editor

To help translators catch issues as they work, QA checks are shown directly in the translation editor. When you open a translation for editing, the QA checks panel appears below the text field. Each issue shows

- The **check type** (e.g., "Spaces mismatch")
- A **description** of what was detected
- A **suggested replacement** when available, with highlighted differences

<ScreenRecording
src="/img/docs/platform/qa-checks/translations_view.webm"
alt="QA checks panel in the translation editor showing issues"
/>

Issues are updated **in real time** as you type, so you get immediate feedback on your changes.

### Inline Highlights

Problematic text spans are highlighted directly in the translation editor. Hovering over a highlight shows the issue details and a suggested fix.

<ScreenRecording
src="/img/docs/platform/qa-checks/inline_highlights.webm"
alt="Inline highlights showing issue details on hover"
/>

### QA Badge

A QA badge appears next to translations in the translations list view when there are open issues or checks are still running

- **Badge with count** - number of open issues
- **Spinner** - checks are still running (e.g., after an [import](/platform/projects_and_organizations/import) or settings change)

When all issues are resolved, the badge disappears.

<ScreenRecording
src="/img/docs/platform/qa-checks/spinner.webm"
alt="QA badge showing spinner while checks are running"
/>

## Fixing Issues

### One-Click Corrections

When a check provides a suggested replacement, you can apply it with a single click on the `Correct` button. The fix is applied directly to the translation text.

<ScreenRecording
src="/img/docs/platform/qa-checks/correct.webm"
alt="Clicking Correct to apply a suggested fix"
/>

### Ignoring Issues

Sometimes a flagged issue is intentional or a false positive. For example, you might deliberately omit a placeholder in a specific language, or a grammar check might not understand a domain-specific term. In these cases, you can `Ignore` the issue. Ignored issues won't count toward the issue total and won't appear as warnings.

To ignore an issue, click the `Ignore` button next to it in the QA panel. You can also `Unignore` it later if needed.

<ScreenRecording
src="/img/docs/platform/qa-checks/ignore.webm"
alt="Ignoring and unignoring a QA issue"
/>

## Configuring Check Severity

You can customize which checks are active and their severity at both the **project level** and the **language level**.

### Project-Level Settings

To configure QA checks for your entire project

1. Go to `Project settings` > `QA Checks`
2. For each check type, set the severity
- `Warning` - the check is active and issues are reported
- `Off` - the check is disabled

*Currently, only two severity levels are supported: `Warning` and `Off`. More severity levels may be added in the future.*

Most checks default to `Warning`. The exceptions are **Spelling** and **Grammar**, which default to `Off`. See [Spelling and Grammar Checks](#spelling-and-grammar-checks) for details on their capabilities and limitations.

:::note Self-hosted: Spelling and Grammar checks
Spelling and Grammar checks require a separate [LanguageTool](https://languagetool.org/) container. If you are self-hosting Tolgee, see the [self-hosting setup guide](/platform/self_hosting/running_with_docker#optional-spelling--grammar-checks-languagetool) for how to deploy and configure the LanguageTool container. Without it, Spelling and Grammar checks cannot be enabled.
:::

<ScreenRecording
src="/img/docs/platform/qa-checks/project_level_qa_settings.webm"
alt="Configuring QA check severity in project settings"
/>

### Language-Level Overrides

Some checks may not be relevant for all languages. For example, character case checks don't apply to languages without case distinctions, and certain punctuation rules differ across writing systems. Language-level overrides let you fine-tune settings for these cases.

To configure overrides for a specific language

1. Go to `Project settings` > `QA Checks`
2. Click on the `Language overrides` section
3. Select a language and adjust the settings

<ScreenRecording
src="/img/docs/platform/qa-checks/language_level_qa_settings.webm"
alt="Configuring language-level QA check overrides"
/>

Language-level settings always take precedence over project-level settings. Changing project settings does not affect languages that already have overrides. You can reset a language back to project defaults at any time.

## When QA Checks Run

QA checks run in real time as you type in the translation editor, so you get immediate feedback without saving first. When you save a translation, all enabled checks run again and results are persisted. This also applies to [imported](/platform/projects_and_organizations/import) translations. The QA badge and issue counts are updated accordingly.

The system is designed to handle all rechecking automatically, so you should never need to trigger a manual recheck under normal circumstances. However, as a last resort, you can manually trigger a full QA recheck for all translations in a project from the translations view using [batch operations](/platform/translation_keys/batch_operations).

<ScreenRecording
src="/img/docs/platform/qa-checks/recheck_batch.webm"
alt="Triggering a full QA recheck via batch operations"
/>

Checks are also automatically re-run when the base language translation changes, a language tag is changed, or [branches are merged](/platform/branching/merging_branches).

### Plural Translations

For translations that use plural forms, QA checks run separately on each plural variant. Issues are reported per variant, so you can see exactly which form has the problem.
1 change: 1 addition & 0 deletions sidebarPlatform.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ module.exports = {
'translation_process/labels',
'translation_process/icu_message_format',
'translation_process/tolgee_universal_icu_placeholders',
'translation_process/qa_checks',
'translation_process/notifications',
],
},
Expand Down
Binary file added static/img/docs/platform/qa-checks/correct.webm
Binary file not shown.
Binary file added static/img/docs/platform/qa-checks/enable.webm
Binary file not shown.
Binary file added static/img/docs/platform/qa-checks/ignore.webm
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file added static/img/docs/platform/qa-checks/spinner.webm
Binary file not shown.
Binary file not shown.
Loading