fix(i18n): sync language with state settings

This commit is contained in:
pixelpaws
2025-09-23 22:00:31 +08:00
parent 4d2c60d59b
commit e5b712c082
2 changed files with 27 additions and 55 deletions

View File

@@ -1,3 +1,5 @@
import { state } from '../state/index.js';
/**
* Internationalization (i18n) system for LoRA Manager
* Uses user-selected language from settings with fallback to English
@@ -123,26 +125,12 @@ class I18nManager {
* @returns {string} Language code
*/
getLanguageFromSettings() {
// Check localStorage for user-selected language
const STORAGE_PREFIX = 'lora_manager_';
let userLanguage = null;
try {
const settings = localStorage.getItem(STORAGE_PREFIX + 'settings');
if (settings) {
const parsedSettings = JSON.parse(settings);
userLanguage = parsedSettings.language;
}
} catch (e) {
console.warn('Failed to parse settings from localStorage:', e);
const language = state?.global?.settings?.language;
if (language && this.availableLocales[language]) {
return language;
}
// If user has selected a language, use it
if (userLanguage && this.availableLocales[userLanguage]) {
return userLanguage;
}
// Fallback to English
return 'en';
}
@@ -165,18 +153,10 @@ class I18nManager {
this.readyPromise = this.initializeWithLocale(languageCode);
await this.readyPromise;
// Save to localStorage
const STORAGE_PREFIX = 'lora_manager_';
const currentSettings = localStorage.getItem(STORAGE_PREFIX + 'settings');
let settings = {};
if (currentSettings) {
settings = JSON.parse(currentSettings);
if (state?.global?.settings) {
state.global.settings.language = languageCode;
}
settings.language = languageCode;
localStorage.setItem(STORAGE_PREFIX + 'settings', JSON.stringify(settings));
console.log(`Language changed to: ${languageCode}`);
// Dispatch event to notify components of language change

View File

@@ -4,6 +4,7 @@ import { state, createDefaultSettings } from '../state/index.js';
import { resetAndReload } from '../api/modelApiFactory.js';
import { DOWNLOAD_PATH_TEMPLATES, MAPPABLE_BASE_MODELS, PATH_TEMPLATE_PLACEHOLDERS, DEFAULT_PATH_TEMPLATES } from '../utils/constants.js';
import { translate } from '../utils/i18nHelpers.js';
import { i18n } from '../i18n/index.js';
export class SettingsManager {
constructor() {
@@ -57,9 +58,26 @@ export class SettingsManager {
state.global.settings = this.mergeSettingsWithDefaults();
}
await this.applyLanguageSetting();
this.applyFrontendSettings();
}
async applyLanguageSetting() {
const desiredLanguage = state?.global?.settings?.language;
if (!desiredLanguage) {
return;
}
try {
if (i18n.getCurrentLocale() !== desiredLanguage) {
await i18n.setLanguage(desiredLanguage);
}
} catch (error) {
console.warn('Failed to apply language from settings:', error);
}
}
mergeSettingsWithDefaults(backendSettings = {}) {
const defaults = createDefaultSettings();
const merged = { ...defaults, ...backendSettings };
@@ -1158,8 +1176,6 @@ export class SettingsManager {
// Use the universal save method for language (frontend-only setting)
await this.saveSetting('language', selectedLanguage);
this.persistLanguageToLocalStorage(selectedLanguage);
// Reload the page to apply the new language
window.location.reload();
@@ -1168,30 +1184,6 @@ export class SettingsManager {
}
}
persistLanguageToLocalStorage(language) {
const STORAGE_PREFIX = 'lora_manager_';
try {
const storageKey = `${STORAGE_PREFIX}settings`;
const currentSettings = localStorage.getItem(storageKey);
let parsedSettings = {};
if (currentSettings) {
try {
parsedSettings = JSON.parse(currentSettings) || {};
} catch (parseError) {
console.warn('Failed to parse existing settings from localStorage, resetting to defaults');
parsedSettings = {};
}
}
parsedSettings.language = language;
localStorage.setItem(storageKey, JSON.stringify(parsedSettings));
} catch (error) {
console.warn('Failed to persist language preference to localStorage:', error);
}
}
toggleInputVisibility(button) {
const input = button.parentElement.querySelector('input');
const icon = button.querySelector('i');