2024-07-02 20:16:03 +02:00
|
|
|
<script lang="ts">
|
2024-07-13 15:17:03 +02:00
|
|
|
import settings, { updateSetting } from "$lib/state/settings";
|
2024-07-02 20:16:03 +02:00
|
|
|
import { t, locale, locales } from "$lib/i18n/translations";
|
|
|
|
|
|
|
|
import languages from "$i18n/languages.json";
|
|
|
|
|
2024-07-07 20:18:25 +02:00
|
|
|
import IconSelector from "@tabler/icons-svelte/IconSelector.svelte";
|
|
|
|
|
2024-07-02 20:16:03 +02:00
|
|
|
$: currentSetting = $settings.appearance.language;
|
|
|
|
|
2024-07-08 15:46:20 +02:00
|
|
|
$: disabled = $settings.appearance.autoLanguage;
|
|
|
|
|
2024-07-02 20:16:03 +02:00
|
|
|
const updateLocale = (lang: string) => {
|
|
|
|
updateSetting({
|
|
|
|
appearance: {
|
|
|
|
language: lang as keyof typeof languages,
|
|
|
|
},
|
2024-07-07 20:18:25 +02:00
|
|
|
});
|
|
|
|
};
|
2024-07-02 20:16:03 +02:00
|
|
|
</script>
|
|
|
|
|
2024-07-08 15:46:20 +02:00
|
|
|
<div class="language-selector-parent" class:disabled aria-hidden={disabled}>
|
2024-07-07 20:18:25 +02:00
|
|
|
<div id="language-selector" class="selector button">
|
|
|
|
<div class="selector-info">
|
|
|
|
<h4 class="selector-title">
|
|
|
|
{$t("settings.language.preferred.title")}
|
|
|
|
</h4>
|
|
|
|
<div class="right-side">
|
|
|
|
<span class="selector-current" aria-hidden="true">
|
2024-07-09 17:41:53 +02:00
|
|
|
{$t(`languages.${currentSetting}`)}
|
2024-07-07 20:18:25 +02:00
|
|
|
</span>
|
|
|
|
<IconSelector />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<select
|
|
|
|
id="setting-dropdown-appearance-language"
|
|
|
|
bind:value={$locale}
|
|
|
|
on:change={() => updateLocale($locale)}
|
2024-07-08 15:46:20 +02:00
|
|
|
disabled={disabled}
|
2024-07-07 20:18:25 +02:00
|
|
|
>
|
|
|
|
{#each $locales as value}
|
|
|
|
<option {value} selected={currentSetting === value}>
|
|
|
|
{$t(`languages.${value}`)}
|
|
|
|
</option>
|
|
|
|
{/each}
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
<div class="subtext toggle-description">
|
|
|
|
{$t("settings.language.preferred.description")}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
.language-selector-parent {
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
gap: 10px;
|
|
|
|
overflow: hidden;
|
2024-07-08 15:46:20 +02:00
|
|
|
transition: opacity 0.2s;
|
|
|
|
}
|
|
|
|
|
|
|
|
.language-selector-parent.disabled {
|
|
|
|
opacity: 0.5;
|
2024-07-07 20:18:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#language-selector {
|
|
|
|
display: flex;
|
|
|
|
flex-direction: row;
|
|
|
|
align-items: center;
|
|
|
|
justify-content: space-between;
|
|
|
|
position: relative;
|
|
|
|
|
|
|
|
padding: calc(var(--switcher-padding) * 2) 16px;
|
|
|
|
|
|
|
|
pointer-events: all;
|
|
|
|
overflow: scroll;
|
|
|
|
}
|
|
|
|
|
2024-07-08 15:46:20 +02:00
|
|
|
.disabled #language-selector {
|
|
|
|
pointer-events: none;
|
|
|
|
}
|
|
|
|
|
2024-07-07 20:18:25 +02:00
|
|
|
.selector-info {
|
|
|
|
height: 100%;
|
|
|
|
width: 100%;
|
|
|
|
display: flex;
|
|
|
|
justify-content: space-between;
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
gap: var(--padding);
|
|
|
|
min-height: 26px;
|
|
|
|
|
|
|
|
z-index: 2;
|
|
|
|
pointer-events: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
.right-side {
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
justify-content: flex-end;
|
|
|
|
float: right;
|
|
|
|
gap: calc(var(--padding) / 2);
|
|
|
|
}
|
|
|
|
|
2024-07-08 08:49:27 +02:00
|
|
|
.selector-current,
|
|
|
|
.selector select {
|
|
|
|
font-size: 13px;
|
|
|
|
font-weight: 400;
|
2024-07-07 20:18:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
.right-side :global(svg) {
|
|
|
|
stroke-width: 1.5px;
|
|
|
|
height: 20px;
|
|
|
|
width: 20px;
|
|
|
|
stroke: var(--secondary);
|
|
|
|
}
|
|
|
|
|
|
|
|
.selector select {
|
|
|
|
position: absolute;
|
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
|
|
|
background: none;
|
|
|
|
border: none;
|
|
|
|
left: 0;
|
|
|
|
border-radius: var(--border-radius);
|
|
|
|
cursor: pointer;
|
2024-07-08 08:49:27 +02:00
|
|
|
color: transparent;
|
|
|
|
text-align: right;
|
|
|
|
|
|
|
|
/* safari fix */
|
2024-07-10 17:54:04 +02:00
|
|
|
appearance: initial;
|
2024-07-08 08:49:27 +02:00
|
|
|
text-align-last: right;
|
2024-07-07 20:18:25 +02:00
|
|
|
}
|
|
|
|
|
2024-07-10 14:42:00 +02:00
|
|
|
/* fix for chrome on windows */
|
|
|
|
option {
|
|
|
|
color: initial;
|
|
|
|
text-align: initial;
|
|
|
|
text-align-last: initial;
|
2024-07-10 17:54:04 +02:00
|
|
|
border-radius: initial;
|
|
|
|
background: initial;
|
|
|
|
border: initial;
|
2024-07-10 14:42:00 +02:00
|
|
|
}
|
|
|
|
|
2024-07-07 20:18:25 +02:00
|
|
|
@media (hover: hover) {
|
|
|
|
.selector:hover {
|
|
|
|
background-color: var(--button-hover);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|