From 17278c9715d4281633237b9c834461d9c05b5ff0 Mon Sep 17 00:00:00 2001 From: iainb Date: Fri, 2 May 2025 11:19:15 +0100 Subject: [PATCH] add languages.current to reactivity/window --- .changeset/shy-tomatoes-relate.md | 5 +++++ packages/svelte/src/reactivity/window/index.js | 9 +++++++++ .../samples/reactivity-window/_expected.html | 2 +- .../samples/reactivity-window/main.svelte | 3 ++- packages/svelte/types/index.d.ts | 4 ++++ 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 .changeset/shy-tomatoes-relate.md diff --git a/.changeset/shy-tomatoes-relate.md b/.changeset/shy-tomatoes-relate.md new file mode 100644 index 0000000000..4274592e37 --- /dev/null +++ b/.changeset/shy-tomatoes-relate.md @@ -0,0 +1,5 @@ +--- +'svelte': minor +--- + +add languages.current to svelte/reactivity/window diff --git a/packages/svelte/src/reactivity/window/index.js b/packages/svelte/src/reactivity/window/index.js index 8c50a5c440..4ccae39d1f 100644 --- a/packages/svelte/src/reactivity/window/index.js +++ b/packages/svelte/src/reactivity/window/index.js @@ -154,3 +154,12 @@ export const devicePixelRatio = /* @__PURE__ */ new (class DevicePixelRatio { return BROWSER ? window.devicePixelRatio : undefined; } })(); + +/** + * `languages.current` is a reactive view of `navigator.languages`. On the server it is `undefined`. + * @since + */ +export const languages = new ReactiveValue( + BROWSER ? () => navigator.languages : () => undefined, + (update) => on(window, 'languagechange', update) +); diff --git a/packages/svelte/tests/server-side-rendering/samples/reactivity-window/_expected.html b/packages/svelte/tests/server-side-rendering/samples/reactivity-window/_expected.html index ee65cb76c7..09d272c511 100644 --- a/packages/svelte/tests/server-side-rendering/samples/reactivity-window/_expected.html +++ b/packages/svelte/tests/server-side-rendering/samples/reactivity-window/_expected.html @@ -1 +1 @@ -

devicePixelRatio:

innerHeight:

innerWidth:

online:

outerHeight:

outerWidth:

screenLeft:

screenTop:

scrollX:

scrollY:

\ No newline at end of file +

devicePixelRatio:

innerHeight:

innerWidth:

languages:

online:

outerHeight:

outerWidth:

screenLeft:

screenTop:

scrollX:

scrollY:

\ No newline at end of file diff --git a/packages/svelte/tests/server-side-rendering/samples/reactivity-window/main.svelte b/packages/svelte/tests/server-side-rendering/samples/reactivity-window/main.svelte index e84e41bf63..8b9f37aa4c 100644 --- a/packages/svelte/tests/server-side-rendering/samples/reactivity-window/main.svelte +++ b/packages/svelte/tests/server-side-rendering/samples/reactivity-window/main.svelte @@ -1,10 +1,11 @@

devicePixelRatio: {devicePixelRatio.current}

innerHeight: {innerHeight.current}

innerWidth: {innerWidth.current}

+

languages: {languages.current}

online: {online.current}

outerHeight: {outerHeight.current}

outerWidth: {outerWidth.current}

diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index b233cfcc0b..b763a46198 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -2224,6 +2224,10 @@ declare module 'svelte/reactivity/window' { export const devicePixelRatio: { get current(): number | undefined; }; + /** + * `languages.current` is a reactive view of `navigator.languages`. On the server it is `undefined`. + * */ + export const languages: ReactiveValue; class ReactiveValue { constructor(fn: () => T, onsubscribe: (update: () => void) => void);