diff --git a/.svelte-kit/generated/client/app.js b/.svelte-kit/generated/client/app.js index b0d1237..744cd3a 100644 --- a/.svelte-kit/generated/client/app.js +++ b/.svelte-kit/generated/client/app.js @@ -3,13 +3,19 @@ export { matchers } from './matchers.js'; export const nodes = [ () => import('./nodes/0'), () => import('./nodes/1'), - () => import('./nodes/2') + () => import('./nodes/2'), + () => import('./nodes/3'), + () => import('./nodes/4'), + () => import('./nodes/5') ]; export const server_loads = []; export const dictionary = { - "/": [2] + "/": [2], + "/about": [3], + "/donate": [4], + "/viewer": [5] }; export const hooks = { diff --git a/.svelte-kit/generated/client/nodes/0.js b/.svelte-kit/generated/client/nodes/0.js index f02ab1d..45d0407 100644 --- a/.svelte-kit/generated/client/nodes/0.js +++ b/.svelte-kit/generated/client/nodes/0.js @@ -1 +1,3 @@ -export { default as component } from "../../../../node_modules/@sveltejs/kit/src/runtime/components/svelte-5/layout.svelte"; \ No newline at end of file +import * as universal from "../../../../src/routes/+layout.js"; +export { universal }; +export { default as component } from "../../../../src/routes/+layout.svelte"; \ No newline at end of file diff --git a/.svelte-kit/generated/client/nodes/3.js b/.svelte-kit/generated/client/nodes/3.js new file mode 100644 index 0000000..053ed5d --- /dev/null +++ b/.svelte-kit/generated/client/nodes/3.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/about/+page.svelte"; \ No newline at end of file diff --git a/.svelte-kit/generated/client/nodes/4.js b/.svelte-kit/generated/client/nodes/4.js new file mode 100644 index 0000000..4fc32c1 --- /dev/null +++ b/.svelte-kit/generated/client/nodes/4.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/donate/+page.svelte"; \ No newline at end of file diff --git a/.svelte-kit/generated/client/nodes/5.js b/.svelte-kit/generated/client/nodes/5.js new file mode 100644 index 0000000..07732a9 --- /dev/null +++ b/.svelte-kit/generated/client/nodes/5.js @@ -0,0 +1 @@ +export { default as component } from "../../../../src/routes/viewer/+page.svelte"; \ No newline at end of file diff --git a/.svelte-kit/generated/server/internal.js b/.svelte-kit/generated/server/internal.js index 9533fcb..8a81a08 100644 --- a/.svelte-kit/generated/server/internal.js +++ b/.svelte-kit/generated/server/internal.js @@ -18,10 +18,10 @@ export const options = { root, service_worker: false, templates: { - app: ({ head, body, assets, nonce, env }) => "\n\n\t\n\t\t\n\t\t\n\t\t\n\t\t" + head + "\n\t\n\t\n\t\t
" + body + "
\n\t\n\n", + app: ({ head, body, assets, nonce, env }) => "\n\n \n \n \n \n \n " + head + "\n \n \n
" + body + "
\n \n\n", error: ({ status, message }) => "\n\n\t\n\t\t\n\t\t" + message + "\n\n\t\t\n\t\n\t\n\t\t
\n\t\t\t" + status + "\n\t\t\t
\n\t\t\t\t

" + message + "

\n\t\t\t
\n\t\t
\n\t\n\n" }, - version_hash: "au0v7i" + version_hash: "lnkeyd" }; export async function get_hooks() { diff --git a/.svelte-kit/types/route_meta_data.json b/.svelte-kit/types/route_meta_data.json index a96ec02..2deec3b 100644 --- a/.svelte-kit/types/route_meta_data.json +++ b/.svelte-kit/types/route_meta_data.json @@ -1,3 +1,15 @@ { - "/": [] + "/": [ + "src/routes/+layout.js", + "src/routes/+layout.js" + ], + "/about": [ + "src/routes/+layout.js" + ], + "/donate": [ + "src/routes/+layout.js" + ], + "/viewer": [ + "src/routes/+layout.js" + ] } \ No newline at end of file diff --git a/.svelte-kit/types/src/routes/$types.d.ts b/.svelte-kit/types/src/routes/$types.d.ts index 9e82d29..0dd5022 100644 --- a/.svelte-kit/types/src/routes/$types.d.ts +++ b/.svelte-kit/types/src/routes/$types.d.ts @@ -12,7 +12,7 @@ type EnsureDefined = T extends null | undefined ? {} : T; type OptionalUnion, A extends keyof U = U extends U ? keyof U : never> = U extends unknown ? { [P in Exclude]?: never } & U : never; export type Snapshot = Kit.Snapshot; type PageParentData = EnsureDefined; -type LayoutRouteId = RouteId | "/" | null +type LayoutRouteId = RouteId | "/" | "/about" | "/donate" | "/viewer" | null type LayoutParams = RouteParams & { } type LayoutParentData = EnsureDefined<{}>; @@ -20,5 +20,7 @@ export type PageServerData = null; export type PageData = Expand; export type PageProps = { data: PageData } export type LayoutServerData = null; -export type LayoutData = Expand; +export type LayoutLoad = OutputDataShape> = Kit.Load; +export type LayoutLoadEvent = Parameters[0]; +export type LayoutData = Expand>>> & OptionalUnion>>>>>; export type LayoutProps = { data: LayoutData; children: import("svelte").Snippet } \ No newline at end of file diff --git a/.svelte-kit/types/src/routes/about/$types.d.ts b/.svelte-kit/types/src/routes/about/$types.d.ts new file mode 100644 index 0000000..462cbd7 --- /dev/null +++ b/.svelte-kit/types/src/routes/about/$types.d.ts @@ -0,0 +1,18 @@ +import type * as Kit from '@sveltejs/kit'; + +type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never; +// @ts-ignore +type MatcherParam = M extends (param : string) => param is infer U ? U extends string ? U : string : string; +type RouteParams = { }; +type RouteId = '/about'; +type MaybeWithVoid = {} extends T ? T | void : T; +export type RequiredKeys = { [K in keyof T]-?: {} extends { [P in K]: T[K] } ? never : K; }[keyof T]; +type OutputDataShape = MaybeWithVoid> & Partial> & Record> +type EnsureDefined = T extends null | undefined ? {} : T; +type OptionalUnion, A extends keyof U = U extends U ? keyof U : never> = U extends unknown ? { [P in Exclude]?: never } & U : never; +export type Snapshot = Kit.Snapshot; +type PageParentData = EnsureDefined; + +export type PageServerData = null; +export type PageData = Expand; +export type PageProps = { data: PageData } \ No newline at end of file diff --git a/.svelte-kit/types/src/routes/donate/$types.d.ts b/.svelte-kit/types/src/routes/donate/$types.d.ts new file mode 100644 index 0000000..2434e6b --- /dev/null +++ b/.svelte-kit/types/src/routes/donate/$types.d.ts @@ -0,0 +1,18 @@ +import type * as Kit from '@sveltejs/kit'; + +type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never; +// @ts-ignore +type MatcherParam = M extends (param : string) => param is infer U ? U extends string ? U : string : string; +type RouteParams = { }; +type RouteId = '/donate'; +type MaybeWithVoid = {} extends T ? T | void : T; +export type RequiredKeys = { [K in keyof T]-?: {} extends { [P in K]: T[K] } ? never : K; }[keyof T]; +type OutputDataShape = MaybeWithVoid> & Partial> & Record> +type EnsureDefined = T extends null | undefined ? {} : T; +type OptionalUnion, A extends keyof U = U extends U ? keyof U : never> = U extends unknown ? { [P in Exclude]?: never } & U : never; +export type Snapshot = Kit.Snapshot; +type PageParentData = EnsureDefined; + +export type PageServerData = null; +export type PageData = Expand; +export type PageProps = { data: PageData } \ No newline at end of file diff --git a/.svelte-kit/types/src/routes/proxy+layout.js b/.svelte-kit/types/src/routes/proxy+layout.js new file mode 100644 index 0000000..12a3ece --- /dev/null +++ b/.svelte-kit/types/src/routes/proxy+layout.js @@ -0,0 +1,17 @@ +// @ts-nocheck +import { loadTranslations } from '$lib/translations'; + +/** */ +export const load = async () => { + const initLocale = primaryLanguage(navigator.language) || 'en'; + + // TODO: Fix the undefined location issue + await loadTranslations(initLocale); + + return {}; +}; + +const primaryLanguage = (/** @type {string} */ locale) => { + if (!locale) return ''; + return locale.split('-')[0]; +}; diff --git a/.svelte-kit/types/src/routes/viewer/$types.d.ts b/.svelte-kit/types/src/routes/viewer/$types.d.ts new file mode 100644 index 0000000..23d2dd3 --- /dev/null +++ b/.svelte-kit/types/src/routes/viewer/$types.d.ts @@ -0,0 +1,18 @@ +import type * as Kit from '@sveltejs/kit'; + +type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never; +// @ts-ignore +type MatcherParam = M extends (param : string) => param is infer U ? U extends string ? U : string : string; +type RouteParams = { }; +type RouteId = '/viewer'; +type MaybeWithVoid = {} extends T ? T | void : T; +export type RequiredKeys = { [K in keyof T]-?: {} extends { [P in K]: T[K] } ? never : K; }[keyof T]; +type OutputDataShape = MaybeWithVoid> & Partial> & Record> +type EnsureDefined = T extends null | undefined ? {} : T; +type OptionalUnion, A extends keyof U = U extends U ? keyof U : never> = U extends unknown ? { [P in Exclude]?: never } & U : never; +export type Snapshot = Kit.Snapshot; +type PageParentData = EnsureDefined; + +export type PageServerData = null; +export type PageData = Expand; +export type PageProps = { data: PageData } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e1784a8..a5b662f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,9 @@ "": { "name": "embroidery-viewer", "version": "0.0.1", + "dependencies": { + "sveltekit-i18n": "^2.4.2" + }, "devDependencies": { "@eslint/compat": "^1.2.5", "@eslint/js": "^9.18.0", @@ -29,7 +32,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -706,7 +708,6 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -721,7 +722,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -731,7 +731,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -741,14 +740,12 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1046,7 +1043,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz", "integrity": "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==", - "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^8.9.0" @@ -1134,6 +1130,21 @@ "vite": "^6.0.0" } }, + "node_modules/@sveltekit-i18n/base": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@sveltekit-i18n/base/-/base-1.3.7.tgz", + "integrity": "sha512-kg1kql1/ro/lIudwFiWrv949Q07gmweln87tflUZR51MNdXXzK4fiJQv5Mw50K/CdQ5BOk/dJ0WOH2vOtBI6yw==", + "license": "MIT", + "peerDependencies": { + "svelte": ">=3.49.0" + } + }, + "node_modules/@sveltekit-i18n/parser-default": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@sveltekit-i18n/parser-default/-/parser-default-1.1.1.tgz", + "integrity": "sha512-/gtzLlqm/sox7EoPKD56BxGZktK/syGc79EbJAPWY5KVitQD9SM0TP8yJCqDxTVPk7Lk0WJhrBGUE2Nn0f5M1w==", + "license": "MIT" + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -1145,7 +1156,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { @@ -1159,7 +1169,6 @@ "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1222,7 +1231,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -1232,7 +1240,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -1303,7 +1310,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -1615,7 +1621,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "dev": true, "license": "MIT" }, "node_modules/espree": { @@ -1653,7 +1658,6 @@ "version": "1.4.6", "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.6.tgz", "integrity": "sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -1894,7 +1898,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.6" @@ -1996,7 +1999,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, "license": "MIT" }, "node_modules/locate-path": { @@ -2026,7 +2028,6 @@ "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -2560,7 +2561,6 @@ "version": "5.33.13", "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.33.13.tgz", "integrity": "sha512-uT3BAPpHGaJqpOgdwJwIK7P4JkBkSS0vylbaRXxQjt1gr+DZ9BiPkhmbZw3ql8LJofUyz5XyrzzQDgQQdfP86Q==", - "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", @@ -2635,6 +2635,22 @@ } } }, + "node_modules/sveltekit-i18n": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/sveltekit-i18n/-/sveltekit-i18n-2.4.2.tgz", + "integrity": "sha512-hjRWn4V4DBL8JQKJoJa3MRvn6d32Zo+rWkoSP5bsQ/XIAguPdQUZJ8LMe6Nc1rST8WEVdu9+vZI3aFdKYGR3+Q==", + "license": "MIT", + "workspaces": [ + "./examples/*/" + ], + "dependencies": { + "@sveltekit-i18n/base": "~1.3.0", + "@sveltekit-i18n/parser-default": "~1.1.0" + }, + "peerDependencies": { + "svelte": ">=3.49.0" + } + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -2858,7 +2874,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", - "dev": true, "license": "MIT" } } diff --git a/package.json b/package.json index 172bc4d..738de6b 100644 --- a/package.json +++ b/package.json @@ -29,5 +29,8 @@ "svelte-check": "^4.0.0", "typescript": "^5.0.0", "vite": "^6.2.6" + }, + "dependencies": { + "sveltekit-i18n": "^2.4.2" } } diff --git a/src/App.svelte b/src/App.svelte deleted file mode 100644 index 597ecf5..0000000 --- a/src/App.svelte +++ /dev/null @@ -1 +0,0 @@ -

Hello world!

diff --git a/src/app.html b/src/app.html index 84ffad1..bcc5c50 100644 --- a/src/app.html +++ b/src/app.html @@ -1,6 +1,82 @@ + diff --git a/src/lib/assets/logo.webp b/src/lib/assets/logo.webp new file mode 100644 index 0000000..a8d4df9 Binary files /dev/null and b/src/lib/assets/logo.webp differ diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte new file mode 100644 index 0000000..cec69b3 --- /dev/null +++ b/src/lib/components/Header.svelte @@ -0,0 +1,203 @@ + + +
+ + + +
+ + diff --git a/src/lib/components/MediaQuery.svelte b/src/lib/components/MediaQuery.svelte new file mode 100644 index 0000000..7e64d7b --- /dev/null +++ b/src/lib/components/MediaQuery.svelte @@ -0,0 +1,48 @@ + + + diff --git a/src/lib/translations/en/header.json b/src/lib/translations/en/header.json new file mode 100644 index 0000000..9ad8c6c --- /dev/null +++ b/src/lib/translations/en/header.json @@ -0,0 +1,7 @@ +{ + "languageSwitch": "🇧🇷", + "homeNav": "🏠 Home", + "aboutNav": "ℹ About", + "viewerNav": "🧵 Viewer", + "donateNav": "💖 Donate" +} diff --git a/src/lib/translations/index.js b/src/lib/translations/index.js new file mode 100644 index 0000000..1218cc2 --- /dev/null +++ b/src/lib/translations/index.js @@ -0,0 +1,41 @@ +import i18n from 'sveltekit-i18n'; +import lang from './lang.json'; + +/** @type {import('sveltekit-i18n').Config} */ +const config = { + translations: { + en: { lang }, + pt: { lang }, + }, + loaders: [ + { + locale: 'en', + key: 'header', + loader: async () => (await import('./en/header.json')).default, + }, + { + locale: 'pt', + key: 'header', + loader: async () => (await import('./pt/header.json')).default, + }, + ], +}; + +export const { t, locale, locales, loading, loadTranslations } = new i18n( + config, +); + +// Save to localStorage on change +locale.subscribe(($locale) => { + if (typeof localStorage !== 'undefined') { + localStorage.setItem('locale', $locale); + } +}); + +// Load from localStorage on initialization +if (typeof localStorage !== 'undefined') { + const savedLocale = localStorage.getItem('locale'); + if (savedLocale && savedLocale !== 'null') { + locale.set(savedLocale); + } +} diff --git a/src/lib/translations/lang.json b/src/lib/translations/lang.json new file mode 100644 index 0000000..c51419e --- /dev/null +++ b/src/lib/translations/lang.json @@ -0,0 +1,4 @@ +{ + "en": "English", + "pt": "Português" +} diff --git a/src/lib/translations/pt/header.json b/src/lib/translations/pt/header.json new file mode 100644 index 0000000..b47bfff --- /dev/null +++ b/src/lib/translations/pt/header.json @@ -0,0 +1,7 @@ +{ + "languageSwitch": "🇺🇸", + "homeNav": "🏠 Página Inicial", + "aboutNav": "ℹ Sobre", + "viewerNav": "🧵 Visualizador", + "donateNav": "💖 Doe" +} diff --git a/src/routes/+layout.js b/src/routes/+layout.js new file mode 100644 index 0000000..f57e56a --- /dev/null +++ b/src/routes/+layout.js @@ -0,0 +1,16 @@ +import { loadTranslations } from '$lib/translations'; + +/** @type {import('@sveltejs/kit').Load} */ +export const load = async () => { + const initLocale = primaryLanguage(navigator.language) || 'en'; + + // TODO: Fix the undefined location issue + await loadTranslations(initLocale); + + return {}; +}; + +const primaryLanguage = (/** @type {string} */ locale) => { + if (!locale) return ''; + return locale.split('-')[0]; +}; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..76366d7 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,6 @@ + + +
+ diff --git a/src/routes/about/+page.svelte b/src/routes/about/+page.svelte new file mode 100644 index 0000000..ae068f6 --- /dev/null +++ b/src/routes/about/+page.svelte @@ -0,0 +1 @@ +

About

diff --git a/src/routes/donate/+page.svelte b/src/routes/donate/+page.svelte new file mode 100644 index 0000000..793dafb --- /dev/null +++ b/src/routes/donate/+page.svelte @@ -0,0 +1 @@ +

Donate

diff --git a/src/routes/viewer/+page.svelte b/src/routes/viewer/+page.svelte new file mode 100644 index 0000000..6ce7f01 --- /dev/null +++ b/src/routes/viewer/+page.svelte @@ -0,0 +1 @@ +

Viewer