diff --git a/src/ui/bible-view.ts b/src/ui/bible-view.ts index a2c23e6..73d58ca 100644 --- a/src/ui/bible-view.ts +++ b/src/ui/bible-view.ts @@ -80,9 +80,11 @@ export class BibleView { private versions: BibleVersion[] = []; private loadedText: Map = new Map(); private t: ReturnType; + private language: LanguageCode; constructor(container: HTMLElement, language: LanguageCode = 'en', version = '', book = '', passage = '') { this.container = container; + this.language = language; this.t = getTranslations(language); this.currentVersion = version || 'en/bible/kjv'; @@ -100,6 +102,7 @@ export class BibleView { try { const resp = await fetch('/data/bible/versions.json'); this.versions = await resp.json(); + this.sortVersionsByLanguage(); } catch { this.versions = [ { id: 'en/bible/kjv', name: 'English (KJV)', language: 'en', books: [] }, @@ -109,6 +112,20 @@ export class BibleView { } } + private sortVersionsByLanguage() { + const lang = this.language; + const priority = (l: string) => { + if (l === lang) return 0; + if ((lang === 'ru' || lang === 'cu') && (l === 'ru' || l === 'cu')) return 1; + return 2; + }; + this.versions.sort((a, b) => { + const pa = priority(a.language); + const pb = priority(b.language); + return pa - pb || a.name.localeCompare(b.name); + }); + } + async render() { await this.loadVersions(); diff --git a/src/ui/settings-view.ts b/src/ui/settings-view.ts index 9ee4597..4c13a5f 100644 --- a/src/ui/settings-view.ts +++ b/src/ui/settings-view.ts @@ -58,6 +58,18 @@ function defaultBibleForLanguage(lang: string): string { return map[lang] || 'kjv'; } +const LANG_LABELS: Record = { + en: 'English', ru: 'Русский', cu: 'Церковнославянский', + el: 'Ἑλληνικά', fr: 'Français', la: 'Latina', + zh: '中文', ar: 'العربية', +}; + +function versionPriority(lang: string, userLang: string): number { + if (lang === userLang) return 0; + if ((userLang === 'ru' || userLang === 'cu') && (lang === 'ru' || lang === 'cu')) return 1; + return 2; +} + function detectBrowserLanguage(): LanguageCode { const lang = navigator.language || (navigator as any).userLanguage || ''; if (lang.startsWith('ru')) return 'ru'; @@ -227,37 +239,7 @@ export class SettingsView {
@@ -343,6 +325,44 @@ export class SettingsView { `; + // Load default Bible versions dynamically + (async () => { + try { + const resp = await fetch('/data/bible/versions.json'); + const versions = await resp.json(); + const userLang = this.settings.language; + + // Sort by language priority + versions.sort((a: any, b: any) => { + const pa = versionPriority(a.language, userLang); + const pb = versionPriority(b.language, userLang); + return pa - pb || a.name.localeCompare(b.name); + }); + + // Group by language + const groups: Record = {}; + for (const v of versions) { + if (!groups[v.language]) groups[v.language] = []; + groups[v.language].push(v); + } + + // Build optgroups in priority order + const orderedLangs = [...new Set(versions.map((v: any) => v.language))] as string[]; + const select = document.getElementById('default-bible') as HTMLSelectElement; + if (select) { + select.innerHTML = orderedLangs.map((lang: string) => { + const items = groups[lang]; + return `${items.map((v: any) => { + const shortId = v.id.split('/').pop(); + const size = OfflineManager.getBibleSize(v.id); + const comment = size ? ` (${size})` : ''; + return ``; + }).join('')}`; + }).join(''); + } + } catch {} + })(); + // Event listeners document.getElementById('language')?.addEventListener('change', (e) => { this.settings.language = (e.target as HTMLSelectElement).value; @@ -449,6 +469,12 @@ export class SettingsView { try { const resp = await fetch('/data/bible/versions.json'); const versions = await resp.json(); + const userLang = this.settings.language; + versions.sort((a: any, b: any) => { + const pa = versionPriority(a.language, userLang); + const pb = versionPriority(b.language, userLang); + return pa - pb || a.name.localeCompare(b.name); + }); const html = await Promise.all(versions.map(async (v: any) => { const firstBook = v.books?.[0]?.id; let isCached = false;