Active
Project:
Localization server
Version:
3.0.x-dev
Component:
Code
Priority:
Normal
Category:
Task
Assigned:
Unassigned
Reporter:
Created:
7 Sep 2026 at 15:30 UTC
Updated:
7 Sep 2026 at 16:16 UTC
Jump to comment: Most recent
The migrations in l10n_migrate and the site repository copy the Drupal 7 tables column by column. Comparing them with the 3.0.x data model and with what the site does after the migration turned up transforms that are missing, data with no migration, and steps the cutover needs. This issue lists them so each can become a child issue with a fixture based test, as #3397394 asks for.
connector_module verbatim, so migrated projects reference l10n_drupal_rest_restapi while 3.0.x expects the plugin id drupal_rest:restapi. Parsing from the queue, drush and the connector pages fail for every migrated project. Needs a static map, after checking which values production holds.'' or "0") are skipped by the source plugin. If production has any, their lines and translations lose their string. "0" is a legitimate source string.nplurals and with $n, in the l10n_pconfig setting. The exporter writes that setting into Plural-Forms as is, so those languages export invalid headers. Build the full formula from the Drupal 7 plurals and formula columns for every language..po files (they are synced, not copied), but the packager file rows keep their fid. Every packaged file row then points at a missing file entity, and the downloads page and blocks, which join the file table, show nothing until each release is repackaged. The .po rows need file entities without a copy, or the packager file migration creates them.variable table.l10n_server_translation_history from the migrate database connection, the Drupal 7 database. After the cutover that database is gone, while the data is in the local table. Small separate fix.One child issue per item above, each with a fixture based kernel test in l10n_migrate following #3397394. The full list with priorities, evidence and the verification queries is kept in the working notes and will be attached.
LLM was used to find, diagnose explain and fix this issue. With human review.
Comments
Comment #2
gábor hojtsyOne item from the summary can be dropped: the string context.
Drupal 7 stores
''for strings without a context. On 3.0.x the parser writes''as well (see the "Context cannot be null" line inL10nHelper), but a string base field holding''counts as empty for the entity API and gets stored as NULL. Verified on a 3.0.x site: a string entity created with context''comes back from the database with a NULL context. The migration destination is the same entity API, so migrated rows end up as NULL without any transform in the migration.There is no index effect either way: strings are looked up by the
hashkey, an md5 of value and context concatenated, which is the same for''and NULL, and nothing indexes the context column itself.What has to hold is that every comparison against an empty context on 3.0.x also accepts NULL. The translate page filter does that since #3621196: Declining suggestions and several translate page filters are broken by leftover Drupal 7 column names and the exporter checks for emptiness, so no migration work is needed here.
LLM was used to find, diagnose explain and fix this issue. With human review.