language in webapp stored in local storage

This commit is contained in:
SPRINX0\prochazka
2025-11-19 10:11:24 +01:00
parent d138d3e786
commit 06f02070c7
2 changed files with 55 additions and 38 deletions

View File

@@ -42,7 +42,7 @@
import { safeFormatDate } from 'dbgate-tools'; import { safeFormatDate } from 'dbgate-tools';
import FormDefaultActionField from './FormDefaultActionField.svelte'; import FormDefaultActionField from './FormDefaultActionField.svelte';
import AiSettingsTab from './AiSettingsTab.svelte'; import AiSettingsTab from './AiSettingsTab.svelte';
import { _t } from '../translations'; import { _t, setSelectedLanguage } from '../translations';
import hasPermission from '../utility/hasPermission'; import hasPermission from '../utility/hasPermission';
import ConfirmModal from '../modals/ConfirmModal.svelte'; import ConfirmModal from '../modals/ConfirmModal.svelte';
import { showModal } from '../modals/modalTools'; import { showModal } from '../modals/modalTools';
@@ -180,34 +180,40 @@ ORDER BY
defaultValue={false} defaultValue={false}
/> />
<div class="heading">{_t('settings.localization', { defaultMessage: 'Localization' })}</div> <div class="heading">{_t('settings.localization', { defaultMessage: 'Localization' })}</div>
<FormSelectField
<FormFieldTemplateLarge
label={_t('settings.localization.language', { defaultMessage: 'Language' })} label={_t('settings.localization.language', { defaultMessage: 'Language' })}
name="localization.language" type="combo"
defaultValue={getSelectedLanguage()} >
data-testid="SettingsModal_languageSelect" <SelectField
isNative isNative
options={[ data-testid="SettingsModal_languageSelect"
{ value: 'cs', label: 'Čeština' }, options={[
{ value: 'de', label: 'Deutsch' }, { value: 'cs', label: 'Čeština' },
{ value: 'en', label: 'English' }, { value: 'de', label: 'Deutsch' },
{ value: 'es', label: 'Español' }, { value: 'en', label: 'English' },
{ value: 'fr', label: 'Français' }, { value: 'es', label: 'Español' },
{ value: 'sk', label: 'Slovenčina' }, { value: 'fr', label: 'Français' },
{ value: 'zh', label: '中文' }, { value: 'sk', label: 'Slovenčina' },
]} { value: 'zh', label: '中文' },
on:change={() => { ]}
showModal(ConfirmModal, { defaultValue={getSelectedLanguage()}
message: _t('settings.localization.reloadWarning', { value={getSelectedLanguage()}
defaultMessage: 'Application will be reloaded to apply new language settings', on:change={e => {
}), setSelectedLanguage(e.detail);
onConfirm: () => { showModal(ConfirmModal, {
setTimeout(() => { message: _t('settings.localization.reloadWarning', {
internalRedirectTo(electron ? '/index.html' : '/'); defaultMessage: 'Application will be reloaded to apply new language settings',
}, 100); }),
}, onConfirm: () => {
}); setTimeout(() => {
}} internalRedirectTo(electron ? '/index.html' : '/');
/> }, 100);
},
});
}}
/>
</FormFieldTemplateLarge>
<div class="heading">{_t('settings.dataGrid.title', { defaultMessage: 'Data grid' })}</div> <div class="heading">{_t('settings.dataGrid.title', { defaultMessage: 'Data grid' })}</div>
<FormTextField <FormTextField

View File

@@ -7,6 +7,8 @@ import zh from '../../../translations/zh.json';
import MessageFormat, { MessageFunction } from '@messageformat/core'; import MessageFormat, { MessageFunction } from '@messageformat/core';
import { getStringSettingsValue } from './settings/settingsTools'; import { getStringSettingsValue } from './settings/settingsTools';
import getElectron from './utility/getElectron';
import { apiCall } from './utility/api';
const translations = { const translations = {
en: {}, en: {},
@@ -28,25 +30,34 @@ let selectedLanguageCache: string | null = null;
export function getSelectedLanguage(): string { export function getSelectedLanguage(): string {
if (selectedLanguageCache) return selectedLanguageCache; if (selectedLanguageCache) return selectedLanguageCache;
const browserLanguage = getBrowserLanguage(); // const browserLanguage = getBrowserLanguage();
const selectedLanguage = getStringSettingsValue('localization.language', browserLanguage); const selectedLanguage = getElectron()
? getStringSettingsValue('localization.language', null)
: localStorage.getItem('selectedLanguage');
if (!supportedLanguages.includes(selectedLanguage)) return defaultLanguage; if (!selectedLanguage || !supportedLanguages.includes(selectedLanguage)) return defaultLanguage;
return selectedLanguage; return selectedLanguage;
} }
export async function setSelectedLanguage(language: string) {
if (getElectron()) {
await apiCall('config/update-settings', { 'localization.language': language });
} else {
localStorage.setItem('selectedLanguage', language);
}
}
export function saveSelectedLanguageToCache() { export function saveSelectedLanguageToCache() {
selectedLanguageCache = getSelectedLanguage(); selectedLanguageCache = getSelectedLanguage();
} }
export function getBrowserLanguage(): string { export function getBrowserLanguage(): string {
return 'en'; if (typeof window !== 'undefined') {
// if (typeof window !== 'undefined') { return (
// return ( (navigator.languages && navigator.languages[0]).slice(0, 2) || navigator.language.slice(0, 2) || defaultLanguage
// (navigator.languages && navigator.languages[0]).slice(0, 2) || navigator.language.slice(0, 2) || defaultLanguage );
// ); }
// } return defaultLanguage;
// return defaultLanguage;
} }
type TranslateOptions = { type TranslateOptions = {