Files
KantSites/migrations/Version20261009000100.php
T
kantarciandClaude Opus 5.5 e15b2517b1 Translate pages, areas, menus, forms and posts field by field instead of rebuilding them
A site can have further languages (Settings → Languages). A page is built once; each language
adds only its texts, keyed by the stable block IDs, plus its own address under /en/… (ADR 111,
document schema v27, migration 20261009000100 for page_translation).

- Editor: DE | EN switch, a list of all texts with original, state (missing, translated,
  original changed) and filter; structure stays with the main language. Undo, drafts,
  publishing and revisions cover all languages at once.
- Website: /en and translated slugs, lang, canonical, hreflang with x-default, og:locale,
  sitemap; links to translated pages follow the language; a language switch block.
- Header, footer and linked sections translate the same way; menu entries carry labels per
  language; fixed template texts come from a small dictionary.
- Forms: labels, help, options, button and success message per language; messages and the
  step script speak the language, the submission and the email stay in the main language.
- Posts, archives, category names, consent text and the 404 page follow the language.
- Single-language sites see none of it and never touch the new table.

The forms administration becomes an overview with one row per form and its own edit page;
fields are one line each with details collapsed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:56:52 +02:00

45 lines
1.8 KiB
PHP

<?php
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20261009000100 extends AbstractMigration
{
public function getDescription(): string
{
return 'Mehrsprachigkeit: die öffentlichen Adressen der übersetzten Seiten (ADR 111).';
}
public function isTransactional(): bool
{
return false;
}
public function up(Schema $schema): void
{
// Die Texte einer Übersetzung stehen im Dokument der Seite und laufen so mit Entwurf,
// Veröffentlichung und Fassungen mit. Hier steht nur, was die Website zum Auffinden
// braucht: unter welcher Adresse eine Seite in welcher Sprache veröffentlicht ist. Die
// Zeilen entstehen beim Veröffentlichen und spiegeln genau den öffentlichen Stand.
// Eine neue Tabelle, keine Änderung an `page`: auf SQLite baut jede Indexänderung an einer
// bestehenden Tabelle sie neu auf (siehe ADR 010).
$table = $schema->createTable('page_translation');
$table->addColumn('page_id', 'string', ['length' => 32]);
$table->addColumn('website_id', 'string', ['length' => 32]);
$table->addColumn('locale', 'string', ['length' => 12]);
$table->addColumn('slug', 'string', ['length' => 80]);
$table->addColumn('path', 'string', ['length' => 400]);
$table->setPrimaryKey(['page_id', 'locale']);
$table->addUniqueIndex(['website_id', 'locale', 'path'], 'uniq_page_translation_path');
}
public function down(Schema $schema): void
{
// Die Übersetzungen selbst bleiben in den Dokumenten; ohne diese Tabelle sind sie nur
// nicht mehr öffentlich erreichbar.
$schema->dropTable('page_translation');
}
}