Plugins change. Strings get added, removed and reworded, and a translation written six months ago slowly stops describing the software it belongs to.
translations/sync-translations reconciles the two: strings that no longer exist are dropped, new ones appear empty, and existing translations are carried across.
At a glance
| Ability | translations/sync-translations |
| Toolset | Loco Translate — toolset/loco-translate |
| Group | Loco Translate › Maintenance |
| Requires | Loco Translate, active on the site |
| Capability | manage_options |
| Safety | Writes data |
| Repeatable | Not idempotent — each call changes the row set, so re-running is not a no-op |
| Ships in | AcrossAI Abilities Manager 0.0.34 and later |
Why fuzzy matching is switched off
Loco can guess. Given a source string that changed slightly, its fuzzy matcher will attach the old translation to the new string and flag it for review.
That is a reasonable feature with a human in the loop and a bad one without. Here there is no human, so only exact source matches are carried over. A changed string arrives untranslated rather than plausibly wrong — which is the failure mode you can see.
Where a bundle has no POT template, this reconciles against the plugin source code instead. The response says which was used in source, because a sync against source code is a weaker guarantee than one against a maintained template.
before_count and after_count make the scale of the change visible. A large drop means the template lost strings, which is worth understanding before accepting.
Input
| Name | Type | Required | What it is |
|---|---|---|---|
bundle | string | Yes | Bundle id, handle or slug — all three appear in Loco’s own screens. Use core for WordPress itself. |
domain | string | No | Text domain. Omit for the bundle default. |
locale | string | Yes | Locale to sync. |
What comes back
| Name | Type | What it is |
|---|---|---|
artefacts | object | Bytes written per artefact — po_bytes, mo_bytes, php_bytes, json_files, json_bytes. Read back from disk rather than reported by Loco, so a zero mo_bytes means the site is still serving the old strings. |
file | string | The PO file that was synced. |
before_count | integer | How many strings it held before. |
after_count | integer | How many it holds now. |
source | string | Whether the template or the source code was used as reference. |
success | boolean | Whether the call completed. |
message | string | A one-line summary of what happened, suitable for showing a human. |
error_code | string | Present only on failure — a stable machine-readable reason, such as a missing field, a wrong field type or an unmet confirmation. |
Example
Ask your assistant:
This plugin updated — bring the German translation in line with the new strings.
It resolves to one call:
{
"ability": "translations/sync-translations",
"parameters": {
"bundle": "woocommerce",
"locale": "de_DE"
}
}Worth knowing
- Compare
before_countwithafter_count. A big fall means strings were dropped, and their translations went with them. - No fuzzy matching. Changed strings come back untranslated, on purpose.
- A sync reorders the file, which is why nothing in this suite addresses strings by position.
Related abilities
- List Translation Strings — find what the sync left untranslated
- Extract Strings To Template — refresh the template it syncs against
- Update Translation Strings — fill in the new gaps
Get the plugins:
AcrossAI Abilities Manager · AcrossAI MCP Manager
Browse the rest: Every ability, by category