---
title: "Full Site Editing - Documentation - PerfLocale"
description: "Translate the text you typed into a block theme's templates and template parts. How PerfLocale resolves a translated header, footer or page layout, and what it deliberately does not touch."
canonical: "https://perflocale.com/docs/full-site-editing/"
source: "https://perflocale.com/docs/full-site-editing/"
format: "markdown"
---
# Full Site Editing

In a block theme, a lot of visible text lives outside your posts and pages. A header, a footer, a 404 page, a page layout — these are **templates** and **template parts**, stored separately from your content. Translating a page never reached them, so a German visitor could read a translated page underneath an English header.

PerfLocale translates the text you typed into those templates. It does not change _which_ template WordPress chooses, and it never touches the original.

## What this covers, and what it does not

This applies to templates you have **customised in the Site Editor** — the ones WordPress stores in your database. A theme’s own template files are a different thing: their text already comes from the theme’s translations, and PerfLocale deliberately leaves them alone. If you have never opened the Site Editor, there is probably nothing here for you to translate.

It also does not translate the content _inside_ a template that already has its own translation route. A synced pattern referenced from a template, a navigation menu, a post — those are translated by the mechanisms described in [Content Translation](https://perflocale.com/docs/content-translation/), and they work whether or not this setting is on.

## Turning it on

Go to **PerfLocale → Settings → Translation** and tick _Full Site Editing_. It is off by default.

Templates and template parts are switched on together, as one setting. They are two storage types behind one feature: a page layout is a template and the header inside it is a template part, so enabling one without the other produces a half-translated page — a German body under an English header — which reads as a bug rather than as a choice you made.

## Translating a template

Once enabled, customised templates and template parts appear on the **Translations** screen alongside your posts and pages, and are translated the same way: create the translation, edit its content, publish it.

You rarely need to create them by hand. **Saving a template in your default language fills in any missing language automatically**, each one seeded with the original’s blocks and created as a **draft** — so nothing changes for visitors until you publish it. Add a language later and the next save picks it up. If you would rather create every translation yourself, return `false` from `perflocale/fse/auto_create_translations`.

**A translation only takes effect once it is published.** A draft is ignored and the original renders instead. This is deliberate: WordPress renders an _empty area_ for a template part it cannot resolve, so a half-finished header would leave a blank strip across the top of your site. Publishing is the signal that the translation is ready to be shown.

## What happens when a translation is missing

The original renders. Every one of these falls back rather than showing nothing:

-   no translation exists for the visitor’s language;
-   a translation exists but is still a draft, pending or trashed;
-   a translation is published but empty, or contains only whitespace;
-   the source template was deleted, leaving the translation orphaned.

That last one matters more than it looks. If you use the Site Editor’s _Reset to theme default_ on a template, the original is removed but its translation is a separate record that survives. PerfLocale identifies a translation by its link to the source, not by its name, so an orphaned translation simply stops being used instead of serving stale text indefinitely.

## The Site Editor edits the original, and shows you the translations

The canvas always edits the original. Translated content is substituted on the front end, for visitors, and never loaded into the editor — because if it were, saving would write the German text over your English source with no undo. Your original is the thing that must never be at risk.

Translations also stay out of the Site Editor’s template _list_. A list showing “Header” four times, once per language, makes the Site Editor harder to use, not easier.

What you do get is a **Translations** panel in the settings sidebar, alongside _Content_ and _Design_. It lists every active language for the template, template part, pattern or navigation menu you are editing, marks which one you are looking at, and links straight to each translation so you can open it and edit it as its own entity. A translation that is still a draft is marked _Draft_, with the line _Not used until published — the original renders instead_ beneath it — the condition that is otherwise invisible from the canvas, because a draft template is ignored and the original renders in its place.

A template you have not customised yet has no record to translate, so the panel says so rather than showing an empty list. Save a change first and it appears.

## Performance

On your default language nothing happens at all: the feature checks the current language and returns before doing any work, so a monolingual site or a default-language visit costs nothing measurable.

On a translated request, PerfLocale looks up every relevant translation in **one query per template type, once per request**, then answers from that. It does not query per template or per block.

## Hooks

Four filters are relevant. All are documented in full on the [Hooks Reference](https://perflocale.com/docs/hooks/).

-   `perflocale/fse/auto_create_translations` — whether saving a template fans out a draft copy to every active language. Return `false` to keep template translations entirely manual.
-   `perflocale/fse/verify_part_theme` — re-check a template part translation’s theme membership at substitution time, for the case where the theme term is stripped after the lookup was primed.
-   `perflocale/settings/non_public_post_types` — which non-public types are offered in Settings.
-   `perflocale/query/never_scoped_post_types` — the post types that are never language-scoped by PerfLocale’s query filter. Templates are resolved by name rather than browsed by language, so scoping their lookups does not filter them, it breaks them. Change this only if you know precisely why you need to.

## See also

-   [Content Translation](https://perflocale.com/docs/content-translation/) - synced patterns, block-theme menus, and the site title and tagline.
-   [Language Fallbacks](https://perflocale.com/docs/language-fallbacks/) - what happens when a translation is missing.
-   [Translations (Admin)](https://perflocale.com/docs/translations/) - the screen where translations are created and tracked.

[← Back to Docs](https://perflocale.com/docs/)
