Skip to content

Add x-default meta tag for multilingual sites#3845

Merged
delucis merged 1 commit into
mainfrom
chris/hreflang-x-default
May 6, 2026
Merged

Add x-default meta tag for multilingual sites#3845
delucis merged 1 commit into
mainfrom
chris/hreflang-x-default

Conversation

@delucis
Copy link
Copy Markdown
Member

@delucis delucis commented Apr 22, 2026

Description

  • This PR adds an additional <link rel="alternate" hreflang="x-default" href="..."> meta tag to the existing hreflang alternates in multilingual sites.
  • Previously I’d avoided this due to Google’s docs on x-default saying that “it was designed for language selector pages”.
  • But a (I think recent?) update to that page says you can use any page and I noticed that @jdevalk’s SEO tools for Astro use x-default more liberally. Given his many years of SEO experience, I’m guessing that’s a sign this is a safe approach.

Context

One reason for experimenting with this is to see if it helps with Starlight’s use of duplicate content. In multilingual Starlight sites that are not fully translated, the default language’s content gets reused to provide readers with something without leaving their locale. This leads to situations like

  • example.com/en/intro/ — default locale content
  • example.com/fr/intro/ — translated content
  • example.com/de/intro/ — not translated, so reuses /en/ content (but with German UI for navigation etc.)

We’ve heard some reports that this reuse causes issues for search engines and can confuse them into using the non-default locale URL, so e.g. in this case a user searching in English gets suggested the /de/ URL.

Factors:

  • each page has <html lang="en/fr/de"> to indicate locale
  • each page contains hreflang alternates
  • each page is its own canonical URL, including pages with duplicate content, because UI is localized
  • for pages reusing content, the content embedded in the page has a lang="en" (or whatever the default locale is) attribute

I’m curious to see if x-default helps at all here as a signal in these cases.

The more extreme fix (and very likely to work) would be to use canonical to point back to the default locale for pages containing fallback content. However, this can have other unintended consequences. For example, site search indexers like Algolia skip indexing non-canonical pages by default, essentially removing this content if your language is not translated yet. So this change is an easier first step.

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 22, 2026

🦋 Changeset detected

Latest commit: 4ee3ded

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@astrojs/starlight Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@netlify
Copy link
Copy Markdown

netlify Bot commented Apr 22, 2026

Deploy Preview for astro-starlight ready!

Name Link
🔨 Latest commit 4ee3ded
🔍 Latest deploy log https://app.netlify.com/projects/astro-starlight/deploys/69e8f466e26886000832b2f7
😎 Deploy Preview https://deploy-preview-3845--astro-starlight.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 100 (no change from production)
Accessibility: 100 (no change from production)
Best Practices: 100 (no change from production)
SEO: 100 (no change from production)
PWA: -
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions github-actions Bot added the 🌟 core Changes to Starlight’s main package label Apr 22, 2026
@delucis delucis added the 🌟 minor Change that triggers a minor release label Apr 22, 2026
@astrobot-houston
Copy link
Copy Markdown
Contributor

size-limit report 📦

Path Size
/index.html 5.61 KB (0%)
/_astro/*.js 26.03 KB (0%)
/_astro/*.css 16.05 KB (0%)

@jdevalk
Copy link
Copy Markdown

jdevalk commented Apr 22, 2026

Yeah good change I think.

Copy link
Copy Markdown
Member

@ArmandPhilippot ArmandPhilippot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm certainly not as experimented as Joost, but as discussed in withastro/docs#13361 I think It's worth a try!

@delucis delucis added this to the v0.39 milestone Apr 22, 2026
@matthewp
Copy link
Copy Markdown
Contributor

Explanation sounds reasonable, but I'm not familiar with this property fwiw.

Copy link
Copy Markdown
Contributor

@trueberryless trueberryless left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean the Google docs still state that x-default was designed for language select pages, but I'm in favour of trying it out.

Do you think adding some kind of comment in the code linking to the Google docs or stating that we want to try it out would make sense? I wouls just like to avoid leaving a head link in there in the long-term where we forgot why it was added in the first place... 🤔 So maybe linking to this PR would also make sense...

@delucis delucis added the ✅ approved Pull requests that have been approved and are ready to merge when next cutting a release label Apr 24, 2026
@delucis delucis merged commit 4d755f5 into main May 6, 2026
19 checks passed
@delucis delucis deleted the chris/hreflang-x-default branch May 6, 2026 21:21
@astrobot-houston astrobot-houston mentioned this pull request May 6, 2026
dadezzz pushed a commit to dadezzz/university_notes that referenced this pull request May 12, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@astrojs/starlight](https://starlight.astro.build) ([source](https://github.com/withastro/starlight/tree/HEAD/packages/starlight)) | [`0.38.5` → `0.39.2`](https://renovatebot.com/diffs/npm/@astrojs%2fstarlight/0.38.5/0.39.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@astrojs%2fstarlight/0.39.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@astrojs%2fstarlight/0.38.5/0.39.2?slim=true) |

---

### Release Notes

<details>
<summary>withastro/starlight (@&#8203;astrojs/starlight)</summary>

### [`v0.39.2`](https://github.com/withastro/starlight/blob/HEAD/packages/starlight/CHANGELOG.md#0392)

[Compare Source](https://github.com/withastro/starlight/compare/@astrojs/starlight@0.39.1...@astrojs/starlight@0.39.2)

##### Patch Changes

- [#&#8203;3890](withastro/starlight#3890) [`2d05e18`](withastro/starlight@2d05e18) Thanks [@&#8203;tats-u](https://github.com/tats-u)! - Fixes CSS selector for `text-autospace` styles in Chromium browsers

### [`v0.39.1`](https://github.com/withastro/starlight/blob/HEAD/packages/starlight/CHANGELOG.md#0391)

[Compare Source](https://github.com/withastro/starlight/compare/@astrojs/starlight@0.39.0...@astrojs/starlight@0.39.1)

##### Patch Changes

- [#&#8203;3885](withastro/starlight#3885) [`010eed1`](withastro/starlight@010eed1) Thanks [@&#8203;ArmandPhilippot](https://github.com/ArmandPhilippot)! - Fixes the version mentioned in an error message related to autogenerated sidebar groups support.

- [#&#8203;3887](withastro/starlight#3887) [`b3c6990`](withastro/starlight@b3c6990) Thanks [@&#8203;delucis](https://github.com/delucis)! - Adds 13 new icons: `clock`, `desktop`, `mobile-android`, `window`, `database`, `server`, `code-branch`, `notes`, `question`, `question-circle`, `analytics`, `padlock`, and `solidjs`.

### [`v0.39.0`](https://github.com/withastro/starlight/blob/HEAD/packages/starlight/CHANGELOG.md#0390)

[Compare Source](https://github.com/withastro/starlight/compare/@astrojs/starlight@0.38.5...@astrojs/starlight@0.39.0)

##### Minor Changes

- [#&#8203;3618](withastro/starlight#3618) [`dcf6d09`](withastro/starlight@dcf6d09) Thanks [@&#8203;HiDeoo](https://github.com/HiDeoo)! - **⚠️ BREAKING CHANGE:** This release changes how autogenerated links work in Starlight’s sidebar configuration.

  If you have sidebar groups using the `autogenerate` key, you must now wrap that configuration in an `items` array:

  ```diff
  {
      label: 'My group',
  -   autogenerate: { directory: 'some-dir' },
  +   items: [{ autogenerate: { directory: 'some-dir' } }],
  }
  ```

  This change unlocks the possibility to mix autogenerated links and other links in a single group, for example:

  ```js
  {
    label: 'Mixed group',
    items: [
      'example-page',
      { autogenerate: { directory: 'examples' } },
      { label: 'More examples', link: 'https://example.com' },
    ],
  }
  ```

  This release also updates the shape of autogenerated sidebar entries in route data. Autogenerated links and groups in `Astro.locals.starlightRoute.sidebar` now include an `autogenerate` object with the [configured `directory` value](https://starlight.astro.build/guides/sidebar/#autogenerated-groups):

  ```js
  {
    type: 'link',
    label: 'Example',
    href: '/examples/example/',
    isCurrent: false,
    autogenerate: { directory: 'examples' }
  }
  ```

- [#&#8203;3618](withastro/starlight#3618) [`dcf6d09`](withastro/starlight@dcf6d09) Thanks [@&#8203;HiDeoo](https://github.com/HiDeoo)! - **⚠️ BREAKING CHANGE:** This release changes the default collapsed state of autogenerated sidebar subgroups.

  Autogenerated subgroups no longer inherit the `collapsed` value from their parent group. They are now expanded by default unless explicitly configured with [`autogenerate.collapsed`](https://starlight.astro.build/reference/configuration/#collapsing-groups).

  If your sidebar configuration relies on a collapsed parent group to also collapse its autogenerated subgroups, update your configuration to set `autogenerate.collapsed` to `true`:

  ```diff
  {
    label: 'Reference',
    collapsed: true,
    items: [
  -   { autogenerate: { directory: 'reference' } },
  +   { autogenerate: { directory: 'reference', collapsed: true } },
    ],
  }
  ```

- [#&#8203;3845](withastro/starlight#3845) [`4d755f5`](withastro/starlight@4d755f5) Thanks [@&#8203;delucis](https://github.com/delucis)! - Adds a `<link rel="alternate" hreflang="x-default" href="...">` tag pointing to the default locale in multilingual sites. The `x-default` alternate is used as a signal of which language to fall back to if no other is available. Learn more in Google’s [SEO localization docs](https://developers.google.com/search/docs/specialty/international/localized-versions#xdefault).

- [#&#8203;3862](withastro/starlight#3862) [`ec70630`](withastro/starlight@ec70630) Thanks [@&#8203;itrew](https://github.com/itrew)! - Makes spacing of items in nested lists more consistent

- [#&#8203;3872](withastro/starlight#3872) [`417a66c`](withastro/starlight@417a66c) Thanks [@&#8203;tats-u](https://github.com/tats-u)! - Enables [the CSS property `text-autospace`](https://developer.mozilla.org/docs/Web/CSS/Reference/Properties/text-autospace) in Chinese and Japanese documents.

  If you would prefer to disable autospacing in Chinese and Japanese pages, you can add the following custom CSS to your site:

  ```css
  [lang]:where(:lang(zh, ja)) {
    text-autospace: initial;
  }
  ```

- [#&#8203;3797](withastro/starlight#3797) [`9764ebd`](withastro/starlight@9764ebd) Thanks [@&#8203;delucis](https://github.com/delucis)! - Avoids the risk of layout shift when users expand and collapse sidebar groups

  This release can introduce additional padding to the site sidebar on certain devices to reserve space for scrollbars. You may wish to inspect your site sidebar visually when upgrading.

  If you would prefer to keep the previous styling, you can add the following custom CSS to your site:

  ```css
  .sidebar-pane {
    scrollbar-gutter: auto;
  }
  ```

- [#&#8203;3858](withastro/starlight#3858) [`6672c35`](withastro/starlight@6672c35) Thanks [@&#8203;delucis](https://github.com/delucis)! - Updates `i18next`, used for Starlight’s localization APIs, from v23 to v26

  There should not be any user-facing changes from this update

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjAuNyIsInVwZGF0ZWRJblZlciI6IjQzLjE3MC4yMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✅ approved Pull requests that have been approved and are ready to merge when next cutting a release 🌟 core Changes to Starlight’s main package 🌟 minor Change that triggers a minor release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants