From 8ef5f63300ddcd82bc9f8286340b6a1c2b306a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=A2=D1=80=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Sat, 1 Aug 2026 22:08:39 +0300 Subject: [PATCH] i18n for offline settings (en/ru/cu) --- src/core/i18n.ts | 48 +++++++++++++++++++++++++++++++++++++++++ src/ui/settings-view.ts | 48 ++++++++++++++++------------------------- 2 files changed, 67 insertions(+), 29 deletions(-) diff --git a/src/core/i18n.ts b/src/core/i18n.ts index 90137c7..c74a843 100644 --- a/src/core/i18n.ts +++ b/src/core/i18n.ts @@ -483,6 +483,18 @@ export interface Translations { aboutText: string; aboutLicense: string; installPwa: string; + offlineContent: string; + offlineLangs: string; + offlineDataTypes: string; + offlineLives: string; + offlineCalendar: string; + offlineMenaion: string; + offlinePreload: string; + offlineClearCache: string; + offlineCalculating: string; + offlineDone: string; + offlineSelectLang: string; + offlineCleared: string; }; // Common @@ -1007,6 +1019,18 @@ const translations: Record = { aboutText: 'Ponomar is an Orthodox Church calendar application providing liturgical information, service texts, and Bible readings in multiple languages.', aboutLicense: 'Based on the Ponomar Java desktop application by Aleksandr Andreev and Yuri Shardt. Licensed under GPL v3.', installPwa: 'Install Ponomar', + offlineContent: 'Offline Content', + offlineLangs: 'Languages to cache', + offlineDataTypes: 'Data to cache', + offlineLives: 'Lives', + offlineCalendar: 'Calendar', + offlineMenaion: 'Menaion', + offlinePreload: 'Preload', + offlineClearCache: 'Clear cache', + offlineCalculating: 'Calculating storage...', + offlineDone: 'Done! Data cached for offline use.', + offlineSelectLang: 'Please select at least one language.', + offlineCleared: 'Cache cleared.', }, common: { @@ -1529,6 +1553,18 @@ const translations: Record = { aboutText: 'Понома́рь — приложение православного календаря, предоставляющее литургическую информацию, тексты служб и библейские чтения на нескольких языках.', aboutLicense: 'Основано на Java-приложении Понома́рь от Александра Андреева и Юрия Шардт. Лицензия GPL v3.', installPwa: 'Установить Пономарь', + offlineContent: 'Офлайн-контент', + offlineLangs: 'Языки для кэширования', + offlineDataTypes: 'Типы данных', + offlineLives: 'Жития', + offlineCalendar: 'Календарь', + offlineMenaion: 'Минея', + offlinePreload: 'Загрузить', + offlineClearCache: 'Очистить кэш', + offlineCalculating: 'Расчёт размера...', + offlineDone: 'Готово! Данные закэшированы для офлайн-использования.', + offlineSelectLang: 'Пожалуйста, выберите хотя бы один язык.', + offlineCleared: 'Кэш очищен.', }, common: { @@ -2051,6 +2087,18 @@ const translations: Record = { aboutText: 'Понома́рь — приложенiе православнаго календаря, предоставляющее литургическiю информацию, тексты службъ и библейскія чтения на нескольких языкахъ.', aboutLicense: 'Основано на Java-приложенiи Понома́рь отъ Александра Андреева и Юрия Шардт. Лицензия GPL v3.', installPwa: 'Оустановити Понома́рь', + offlineContent: 'Офлайн-контентъ', + offlineLangs: 'Языки для кеширования', + offlineDataTypes: 'Типы данныхъ', + offlineLives: 'Житїя', + offlineCalendar: 'Календарь', + offlineMenaion: 'Минїа', + offlinePreload: 'Загрузити', + offlineClearCache: 'Очистити кешъ', + offlineCalculating: 'Расчётъ размѣра...', + offlineDone: 'Готово! Данныя закешированы для офлайн-потребленїя.', + offlineSelectLang: 'Пожалуйста, изберите хотя бы единъ языкъ.', + offlineCleared: 'Кешъ очищенъ.', }, common: { diff --git a/src/ui/settings-view.ts b/src/ui/settings-view.ts index c503827..6cceb63 100644 --- a/src/ui/settings-view.ts +++ b/src/ui/settings-view.ts @@ -238,59 +238,49 @@ export class SettingsView {
-

Offline Content

+

${t.settings.offlineContent}

- +
- - - - - + ${LANGUAGES.map(l => ` + + `).join('')}
- +
- Calculating storage... + ${t.settings.offlineCalculating}
- - + +
@@ -383,7 +373,7 @@ export class SettingsView { if (selectedLangs.length === 0) { const progressText = document.getElementById('offline-progress-text'); - if (progressText) progressText.textContent = 'Please select at least one language.'; + if (progressText) progressText.textContent = t.settings.offlineSelectLang; return; } @@ -395,7 +385,7 @@ export class SettingsView { // Start preloading in background OfflineManager.preload({ languages: selectedLangs, types: selectedTypes }).then(() => { if (progressBar) progressBar.style.width = '100%'; - if (progressText) progressText.textContent = 'Done! Data cached for offline use.'; + if (progressText) progressText.textContent = t.settings.offlineDone; OfflineManager.getStats().then(stats => { const statsEl = document.getElementById('offline-stats'); if (statsEl) { @@ -410,7 +400,7 @@ export class SettingsView { if (prog && prog.total > 0) { const pct = Math.round((prog.current / prog.total) * 100); if (progressBar) progressBar.style.width = `${pct}%`; - if (progressText) progressText.textContent = `${prog.current} / ${prog.total} files — ${prog.file.substring(0, 60)}...`; + if (progressText) progressText.textContent = `${prog.current} / ${prog.total} ${t.settings.offlineDataTypes} — ${prog.file.substring(0, 60)}...`; } if (!prog || prog.done) clearInterval(pollInterval); }, 200); @@ -420,7 +410,7 @@ export class SettingsView { document.getElementById('offline-clear')?.addEventListener('click', async () => { await OfflineManager.clearCache(); const statsEl = document.getElementById('offline-stats'); - if (statsEl) statsEl.textContent = 'Cache cleared.'; + if (statsEl) statsEl.textContent = t.settings.offlineCleared; const progressDiv = document.getElementById('offline-progress'); if (progressDiv) progressDiv.classList.add('hidden'); });