diff --git a/website/src/hooks.server.js b/website/src/hooks.server.js
new file mode 100644
index 00000000..049a2ea8
--- /dev/null
+++ b/website/src/hooks.server.js
@@ -0,0 +1,43 @@
+import { base } from '$app/paths';
+import { languages } from '$lib/languages';
+import { getURLForLanguage } from '$lib/utils';
+
+export async function handle({ event, resolve }) {
+ let language = event.params.language ?? 'en';
+ const strings = await import(`./locales/${language}.json`);
+
+ let path = event.url.pathname;
+ let page = event.route.id?.replace('/[[language]]', '').split('/')[1] ?? 'home';
+
+ let title = strings.metadata[`${page}_title`];
+ let description = strings.metadata[`description`];
+
+ let head = `
+ gpx.studio — ${title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `;
+
+ for (let lang of Object.keys(languages)) {
+ head += `
+`;
+ }
+
+ const response = await resolve(event, {
+ transformPageChunk: ({ html }) => html.replace('', head)
+ });
+
+ return response;
+}
\ No newline at end of file
diff --git a/website/src/lib/components/Head.svelte b/website/src/lib/components/Head.svelte
deleted file mode 100644
index dacc734f..00000000
--- a/website/src/lib/components/Head.svelte
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
- {#if $isLoading}
- gpx.studio — the online GPX file editor
-
-
-
-
-
- {:else}
- gpx.studio — {$_(`metadata.${title}_title`)}
-
-
-
-
-
- {/if}
-
-
-
-
-
-
-
-
-
-
-
-
- {#each Object.keys(languages) as lang}
-
- {/each}
-
diff --git a/website/src/lib/components/LanguageSelect.svelte b/website/src/lib/components/LanguageSelect.svelte
index e4311375..891704b7 100644
--- a/website/src/lib/components/LanguageSelect.svelte
+++ b/website/src/lib/components/LanguageSelect.svelte
@@ -1,4 +1,5 @@
-