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>
This commit is contained in:
1 parent
c7705b7083
commit
e15b2517b1
51 files changed
+3045
-219
No files matched your search
@@ -0,0 +1,44 @@
|
||||
<?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');
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user