Skip directly to page content
b13 GmbH

Hauptstätter Str. 59
70178 Stuttgart
Germany
+49 (0) 711 460 589 70 [email protected]
Graphic featuring a stylized link icon surrounded by overlapping shapes, set against a blue background with a gradient.

Documentation

TYPO3 Extension “Hreflang Multisite”
Version 2.3.1 (2026-09-30)

Editors reach page sets in two places, and there is a third that checks the language configuration behind them.

Which Pages Belong in One Set

The mechanics are the easy part. The judgement call is which pages belong together, and there is one rule: link pages that serve the same purpose, not pages that contain the same words.

A page belongs in a set with another when it covers the same topic or purpose, is the direct counterpart in its language or region, and sits at a comparable place in the page tree. The German page "Produkte" belongs with the English "Products"—not with "Services", and not with "Über uns".

They do not have to be identical. Markets write their own copy, drop sections, and add local ones. What has to match is the job the page does for a visitor in that market. A set of pages that are merely similar is still correct; a set of pages that answer different questions is not, however similar the text.

Working Through a Tree

  • Start with the market that has the most content. It is the tree every other one will map onto, so it decides the shape of the sets.
  • Go page by page, in tree order. Jumping between areas is how pages get missed, and a missing entry invalidates the whole set for every page in it.
  • Be consistent. If two equivalent pages exist, link them—leaving one out is a decision search engines will read as an answer.
  • Come back to new pages. A page added after the set was built is not in it. The overview module filter "pages without hreflang" is the shortest way to find them.

Page Properties

The extension adds a field to the page properties of the default language. There an editor adds, sees, and edits the page set a page belongs to, and picks which page in the set is the x-default.

Translations do not get their own field—a translation belongs to the set through its default-language page.

Once the page is in a set, the field lists the whole resolved group—every language version of every linked page, derived from the tree rather than entered by hand:

The Hreflang section in a TYPO3 page's SEO tab on a page that has no page set yet, offering a single button to create one.

The Page Set Editor

Both buttons open the same editor: one row per root page in the group, with the page of the root you started from fixed and the others to be picked.

Filled in, the row of each market holds the page that represents this content there:

One record, editable from anywhere in it. Opening the set from a different member page shows the same entries; only the heading names the page you came from.

The field is hidden, not empty, when it cannot be used. It disappears from the page properties entirely in two cases: when the page’s root page belongs to no rootpage-sets group, and when the page’s doktype is listed in excludeDoktypes. An editor reporting "I don’t see the field" is describing configuration, not permissions.

The Hreflang Multisite page-set editor opened on a page that is not linked yet: one empty row per market, waiting for a page to be picked in each.

The Overview Module

Under Content → Status (Web → Info on TYPO3 v13, which is where the module group lived before it was renamed) the extension adds an overview of the page tree showing which page belongs to which set, with two controls:

  • Depth, from the current page down to unlimited
  • Filter: all pages, pages with hreflang, pages without hreflang, or incomplete sets—the last one flags sets that are missing sites, shown as badges on the row

Sets can be edited for several pages from inside the module.

Filtered to pages without hreflang, it answers the question editors actually arrive with—which pages still need linking:

The module is registered with access user, so it can be granted to non-admin backend users through the group access lists.

Pages whose doktype is excluded show N/A instead of a hreflang list.

The Hreflang Multisite overview in the TYPO3 Status module: a flat list of the page tree, each row showing the linked pages of the other markets with their language code and URL, one page still unlinked and one linked to a single market.

Verifying a Setup

Off by default:

plugin.tx_hreflang_multisite.debug = 1

With it enabled, the page module shows a check of the language configuration of the current page’s root page group. It collects the hreflang codes of every site language across the root pages in that group and reports any code that appears more than once—the situation that makes a set invalid.

The output is either "Hreflang configuration for this page is valid." or "Configuration is not valid!" followed by the duplicated codes and the sites that claim them.

What it does not do: it does not show the resolved tags, the URLs, or the page set itself. It is independent of any page set and returns the same result on a page that has none. It answers "can these root pages form a valid set at all", not "is this page’s set correct".

Despite the name it is not a developer switch—it is the only backend surface that surfaces duplicate language codes, which are otherwise invisible until the tags are wrong in the frontend.

Errors Editors Will See

Saving a set reports the three validation errors described in What Is Checked When a Set Is Saved: a missing x-default, an x-default outside the set, and more than one page from the same root page.

The last one rarely happens while building a set—you would have to pick two pages from the same tree on purpose. It shows up later, when a page is moved between root pages and lands in a tree the set already covers. The set was valid when it was saved and is not any more, and the error appears the next time someone edits it.

Two situations produce no error message at all and are worth knowing:

  • The field is not there. See the note under Page Properties above.
  • A page cannot be selected. Either its root page is in a different group, its doktype is excluded, it is already referenced by another set, or it sits outside the page tree of the chosen root page.

Freeing a Page That Is Linked to the Wrong One

The second case above is the one editors hit in practice: the page they want is missing from the selection, because it is already in someone else’s set. The wizard filters it out and does not say why.

To get it back:

  1. Open the set that currently holds it—the overview module finds it fastest, or go to the page itself and read its page set field.
  2. Remove the entry with the delete icon.
  3. Save.

The page is then selectable again. Removing an entry can leave the old set with fewer than two pages, in which case the set is deleted—see A Set With Fewer Than Two Pages Is Deleted. That is usually what you want, but it means the other page loses its tags too, not just the one you took out.

A single market row in the page-set editor showing the button that removes this page from the set, used to free a page that was linked to the wrong one.