Skip to content

Prevent server-side rendering of language switch - #6272

Open
saschaszott wants to merge 2 commits into
DSpace:mainfrom
saschaszott:saschaszott-patch-25
Open

saschaszott wants to merge 2 commits into
DSpace:mainfrom
saschaszott:saschaszott-patch-25

Conversation

@saschaszott

Copy link
Copy Markdown
Contributor

References

n/a

Description

The language switch dropdown is now wrapped in a @defer block. As a result the language switch is no longer part of the server-side rendered HTML. It is is only rendered in the browser / client-side after hydration.

Instructions for Reviewers

The language switch is only useful to interactive / human users. Nevertheless, SSR renders the full dropdown into every page. With the default configuration (35 languages), this adds about 7 kB of markup to every SSR response. After this change, only the empty host element is left, about 136 bytes.

Angular never renders @defer blocks during SSR, and it renders them on the client after hydration.

The default custom theme reuses the base template and is therefore covered as well. Custom themes that provide their own lang-switch.component.html are not affected and keep their current behavior. I'm not sure if this note should be added to the release notes.

The language switch button now appears shortly after the page has loaded in the browser, so neighboring header icons may shift slightly while the page is loading.

How to Test

  1. Make sure your test instance contains at least two active languages
  2. Build and start with SSR: npm start.
  3. Open any item landing page in a browser:
    • The globe button in the page header appears after the page has loaded.
    • Opening the dropdown and switching the language works as before, with both mouse and keyboard (Enter).
    • The browser console shows no hydration errors (NG05xx).
  4. Check the SSR output of the item landing page: the element ´ds-base-lang-switch should be empty (<!----> only). There should be no ngbDropdown and no .dropdown-item entries.

Checklist

This checklist provides a reminder of what we are going to look for when reviewing your PR. You do not need to complete this checklist prior creating your PR (draft PRs are always welcome).
However, reviewers may request that you complete any actions in this list if you have not done so. If you are unsure about an item in the checklist, don't hesitate to ask. We're here to help!

  • My PR is created against the main branch of code (unless it is a backport or is fixing an issue specific to an older branch).
  • My PR is small in size (e.g. less than 1,000 lines of code, not including comments & specs/tests), or I have provided reasons as to why that's not possible.
  • My PR follows all coding best practices based on the Code Conventions Guide
  • My PR passes ESLint validation using npm run lint
  • My PR doesn't introduce circular dependencies (verified via npm run check-circ-deps)
  • My PR includes TypeDoc comments for all new (or modified) public methods and classes. It also includes TypeDoc for large or complex private methods.
  • My PR passes all specs/tests and includes new/updated specs or tests based on the Code Testing Guide.
  • My PR aligns with Accessibility guidelines if it makes changes to the user interface.
  • My PR uses i18n (internationalization) keys instead of hardcoded English text, to allow for translations.
  • My PR includes details on how to test it. I've provided clear instructions to reviewers on how to successfully test this fix or feature.
  • If my PR includes new libraries/dependencies (in package.json), I've made sure their licenses align with the DSpace BSD License based on the Licensing of Contributions documentation.
  • If my PR includes new features or configurations, I've provided basic technical documentation in the PR itself.
  • If my PR fixes an issue ticket, I've linked them together.

@saschaszott saschaszott changed the title Prevent rendering of language switch during SSR Prevent server-side rendering of language switch Sep 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant