diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/components/language_selector.svelte | 31 | ||||
| -rw-r--r-- | src/lib/components/loader.svelte | 3 | ||||
| -rw-r--r-- | src/lib/components/new_prompt.svelte | 21 | ||||
| -rw-r--r-- | src/lib/components/prompt.svelte | 16 | ||||
| -rw-r--r-- | src/lib/stores/prompt.js | 45 |
5 files changed, 116 insertions, 0 deletions
diff --git a/src/lib/components/language_selector.svelte b/src/lib/components/language_selector.svelte new file mode 100644 index 0000000..e8d0c44 --- /dev/null +++ b/src/lib/components/language_selector.svelte @@ -0,0 +1,31 @@ +<script> + import { locale, locales } from 'svelte-i18n'; + import { getLangNameFromCode } from 'language-name-map'; + import { goto } from '$app/navigation'; + + $: namedLocales = $locales + .map((code) => ({ + code, + ...getLangNameFromCode(code) + })) + .sort((a, b) => a.native - b.native); + + let selected = $locale; + + $: { + locale.set(selected); + } + + const navigateAway = function () { + goto('/'); + }; +</script> + +<select bind:value={selected} on:change={navigateAway}> + {#each namedLocales as namedLocale} + <option value={namedLocale.code}>{namedLocale.native}</option> + {/each} +</select> + +<style> +</style> diff --git a/src/lib/components/loader.svelte b/src/lib/components/loader.svelte new file mode 100644 index 0000000..4309aff --- /dev/null +++ b/src/lib/components/loader.svelte @@ -0,0 +1,3 @@ +<script> +</script> +<p> Loading... </p> diff --git a/src/lib/components/new_prompt.svelte b/src/lib/components/new_prompt.svelte new file mode 100644 index 0000000..f44ecf1 --- /dev/null +++ b/src/lib/components/new_prompt.svelte @@ -0,0 +1,21 @@ +<script> + import { _ } from 'svelte-i18n'; + import { getPrompt } from '$lib/stores/prompt'; + import { goto } from '$app/navigation'; + + export let locale + + $: prompt = getPrompt(locale); + + $: { + if ($prompt) { + goto(`/${locale.split('-')[0]}/${$prompt}`); + } + } +</script> + +<article> + <main> + {$_('loading')} + </main> +</article> diff --git a/src/lib/components/prompt.svelte b/src/lib/components/prompt.svelte new file mode 100644 index 0000000..fbdc9ef --- /dev/null +++ b/src/lib/components/prompt.svelte @@ -0,0 +1,16 @@ +<script> + import { _ } from 'svelte-i18n'; + export let terms +</script> + +<article> + <header> + {$_('title')} + </header> + <main> + {terms} + </main> + <footer> + <a href="/">{$_('refresh')}</a> + </footer> +</article> diff --git a/src/lib/stores/prompt.js b/src/lib/stores/prompt.js new file mode 100644 index 0000000..59df711 --- /dev/null +++ b/src/lib/stores/prompt.js @@ -0,0 +1,45 @@ +import { readable } from 'svelte/store'; +import { browser } from '$app/env'; + +const internals = { + kDataPrefix: 'http://localhost:3000/data/', + kAdjectivesPath: '/adjectives.json', + kNounsPath: '/nouns.json', + + async get(locale, path) { + + const shortLocale = locale.split('-')[0]; + const targetFile = internals.kDataPrefix + shortLocale + path; + const data = browser && sessionStorage.getItem(targetFile); + + if (data) { + return JSON.parse(data); + } + + let newData = await (await fetch(targetFile)).json(); + browser && sessionStorage.setItem(targetFile, JSON.stringify(newData)); + + return newData; + }, + + random(list) { + + return list[Math.floor(Math.random() * list.length)]; + } +}; + +export const getPrompt = function (locale) { + + return readable(null, function (set) { + + (async function() { + + const adjectives = await internals.get(locale, internals.kAdjectivesPath); + const nouns = await internals.get(locale, internals.kNounsPath); + + set(`${internals.random(nouns)}, ${internals.random(nouns)}, ${internals.random(adjectives)}`); + })(); + + return function stop() {}; + }); +}; |