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>
45 lines
1.8 KiB
PHP
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');
|
|
}
|
|
}
|