languageIds[]] * * Page-specific preferences are shared across all modules working with that page. * * @internal */ final class SharedUserPreferences { /** * Resolve selected languages with fallback chain. * * Priority order: * 1. Explicit request parameter (not stored, just for current request) * 2. Page-specific stored preference (shared across modules) * 3. ModuleData from request (for backward compat) * 4. Default [0] * * @param array|null $requestLanguages Languages from request parameter * @param array|null $moduleDataLanguages Languages from ModuleData (for backward compat) * @return int[] Resolved language IDs */ public function resolveLanguages( BackendUserAuthentication $backendUser, ?array $requestLanguages, int $pageId, ?array $moduleDataLanguages = null ): array { // 1. Explicit request parameter (highest priority) if (!empty($requestLanguages)) { return array_unique(array_map(intval(...), $requestLanguages)); } // 2. Page-specific preference (shared across modules) $pageSpecific = $backendUser->uc['pageLanguages'][$pageId] ?? null; if (is_array($pageSpecific)) { return $pageSpecific; } // 3. ModuleData from request (for backward compat) if (!empty($moduleDataLanguages)) { return array_unique(array_map(intval(...), $moduleDataLanguages)); } // 4. Default return [0]; } /** * Store language selection for a page (shared across modules). * * This preference will be used by ALL modules working with this page, * ensuring consistent language selection across Page Module, Records module, etc. */ public function setPageLanguages(BackendUserAuthentication $backendUser, int $pageId, array $languageIds): void { if (!isset($backendUser->uc['pageLanguages'])) { $backendUser->uc['pageLanguages'] = []; } $backendUser->uc['pageLanguages'][$pageId] = $languageIds; $backendUser->writeUC(); } }