# План добавления выбора языка контента в BIgo Reader

## 📋 Текущая ситуация

### ✅ Что уже есть:
1. **Язык интерфейса** - уже работает через `localization.py`
2. **Поддержка переводов в БД** - `language` параметр в DatabaseManager
3. **Переводы контента** загружаются через:
   ```python
   language = self.app.config.get('language', 'en')
   self.db_manager = DatabaseManager(filepath, language=language)
   ```

### ❌ Чего нет:
- **UI виджета** для выбора языка контента
- **Динамическое переключение** языка контента (нужна перезагрузка страницы)
- **Сохранение выбранного языка контента** в конфиг

## 🎯 Задача

Добавить **LanguageSelector для выбора языка контента** (текстов книг и комментариев к диаграммам), отдельно от языка интерфейса.

### Требования:
1. **Отдельная настройка** - `content_language` vs `interface_language`
2. **Позиция в UI** - на toolbar или в отдельной секции
3. **Применение** - перезагрузка текущей страницы с новым языком
4. **Сохранение** - в конфиг и сессию

## 🔧 План реализации (УТВЕРЖДЕНО)

### ✅ Принятые решения:
1. **UI расположение:** View Menu → Content Language
2. **Диалог подтверждения:** ДА - спрашивать перед перезагрузкой
3. **Позиция скролла:** ДА - сохранять и восстанавливать
4. **Открытые диаграммы:** Перезагружать нужные (с новым языком)
5. **Fallback:** Индикатор в UI (например, 🇺🇦 Українська*)
6. **Конфиг:** Раздельные настройки (interface + content)
7. **Мобильное:** Боковое меню + настройки
8. **Производительность:** Простое пересоздание DatabaseManager

---

### Этап 1: Добавить Content Language в меню View

**Файл:** `bigo_reader/ui/main_window.py`

#### 1.1. Добавить импорт
```python
from bigo_book.ui.multilang_widgets import LanguageSelector
from tkinter import messagebox
```

#### 1.2. Добавить в `__init__`:
```python
# Content language (for book text and diagrams)
self.content_language = self.app.config.get('content_language', 'en')

# Track scroll position for reload
self._scroll_position = 0.0

# Track open diagram windows
self._open_diagram_ids = []  # List of diagram_ids currently open
```

#### 1.3. Добавить в меню View (в методе create_menu):
```python
def create_menu(self):
    """Create menu bar"""
    menubar = tk.Menu(self.root)
    
    # ... File menu ...
    
    # View menu
    view_menu = tk.Menu(menubar, tearoff=0)
    menubar.add_cascade(label=_("View"), menu=view_menu)
    
    view_menu.add_command(label=_("Zoom In"), command=self._zoom_in, accelerator="Ctrl++")
    view_menu.add_command(label=_("Zoom Out"), command=self._zoom_out, accelerator="Ctrl+-")
    view_menu.add_separator()
    
    # Content Language submenu
    lang_menu = tk.Menu(view_menu, tearoff=0)
    view_menu.add_cascade(label=_("Content Language"), menu=lang_menu)
    
    # Add language options
    languages = [
        ('en', 'English'),
        ('uk', 'Українська'),
        ('ru', 'Русский'),
        ('cn', '中文'),
        ('ja', '日本語'),
        ('ko', '한국어')
    ]
    
    self.content_lang_var = tk.StringVar(value=self.content_language)
    
    for lang_code, lang_name in languages:
        lang_menu.add_radiobutton(
            label=lang_name,
            variable=self.content_lang_var,
            value=lang_code,
            command=lambda lc=lang_code: self._on_content_language_changed(lc)
        )
    
    # ... rest of menu ...
```

#### 1.4. Добавить callback с диалогом подтверждения:
```python
def _on_content_language_changed(self, new_language: str):
    """Handle content language change with confirmation"""
    if new_language == self.content_language:
        return  # No change
    
    # Get language name
    lang_names = {
        'en': 'English',
        'uk': 'Українська', 
        'ru': 'Русский',
        'cn': '中文',
        'ja': '日本語',
        'ko': '한국어'
    }
    lang_name = lang_names.get(new_language, new_language)
    
    # Ask for confirmation
    if not self.book_id:
        # No book open, just change setting
        self.content_language = new_language
        self.app.config.set('content_language', new_language)
        self.app.config.save()
        messagebox.showinfo(
            _("Language Changed"),
            f"Content language set to {lang_name}"
        )
        return
    
    # Book is open - need to reload
    result = messagebox.askyesno(
        _("Change Content Language"),
        f"Change content language to {lang_name}?\n\n"
        f"Current page will be reloaded with translated content.\n"
        f"Scroll position will be preserved.",
        icon='question'
    )
    
    if result:
        logging.info(f"Content language changed: {self.content_language} → {new_language}")
        old_language = self.content_language
        self.content_language = new_language
        
        # Save to config
        self.app.config.set('content_language', new_language)
        self.app.config.save()
        
        # Reload with new language
        self._reload_with_new_language()
    else:
        # User cancelled - revert selection
        self.content_lang_var.set(self.content_language)
```

#### 1.5. Добавить метод перезагрузки с сохранением позиции:
```python
def _reload_with_new_language(self):
    """Reload current page with new content language"""
    if not self.book_id or not self.current_page:
        return
    
    # 1. Save scroll position
    if hasattr(self, 'text_widget'):
        self._scroll_position = self.text_widget.yview()[0]
    
    # 2. Track open diagrams
    self._open_diagram_ids = []
    if hasattr(self, 'diagram_windows'):
        for window in self.diagram_windows.values():
            if window and window.winfo_exists():
                diagram_id = getattr(window, 'diagram_id', None)
                if diagram_id:
                    self._open_diagram_ids.append(diagram_id)
    
    # 3. Close all diagram windows
    self._close_all_diagrams()
    
    # 4. Recreate database manager with new language
    try:
        if self.db_manager.db_type == DatabaseType.SQLITE:
            filepath = self.db_manager.db_path
            self.db_manager.close()
            self.db_manager = DatabaseManager(filepath, language=self.content_language)
        else:  # PostgreSQL
            from ..utils.db_profile_helper import create_database_manager_from_active_profile
            self.db_manager.close()
            self.db_manager = create_database_manager_from_active_profile(
                language=self.content_language
            )
    except Exception as e:
        logging.error(f"Failed to recreate database manager: {e}")
        messagebox.showerror(_("Error"), f"Failed to reload with new language:\n{e}")
        return
    
    # 5. Reload current book and page
    current_page = self.current_page
    book = self.db_manager.get_book_by_id(self.book_id)
    
    self.book_id = None  # Reset to force reload
    self._load_book(book)
    self.navigation.go_to_page(current_page)
    
    # 6. Restore scroll position
    if hasattr(self, 'text_widget') and self._scroll_position > 0:
        self.text_widget.yview_moveto(self._scroll_position)
    
    # 7. Reopen diagrams that were open
    if self._open_diagram_ids:
        self.root.after(500, self._reopen_diagrams)  # Small delay for UI to settle
    
    # 8. Show success message with fallback indicator
    lang_names = {
        'en': 'English',
        'uk': 'Українська',
        'ru': 'Русский', 
        'cn': '中文',
        'ja': '日本語',
        'ko': '한국어'
    }
    lang_name = lang_names.get(self.content_language, self.content_language)
    
    # Check if translation is available
    has_translation = self._check_translation_availability()
    
    if has_translation:
        msg = f"Content language changed to {lang_name}"
    else:
        msg = f"Content language set to {lang_name}*\n\n*Translation not available. Showing original text."
    
    messagebox.showinfo(_("Language Changed"), msg)

def _close_all_diagrams(self):
    """Close all open diagram windows"""
    if hasattr(self, 'diagram_windows'):
        for window in list(self.diagram_windows.values()):
            if window and window.winfo_exists():
                window.destroy()
        self.diagram_windows.clear()

def _reopen_diagrams(self):
    """Reopen previously open diagrams with new language"""
    for diagram_id in self._open_diagram_ids:
        try:
            self._open_diagram_by_id(diagram_id)
        except Exception as e:
            logging.warning(f"Failed to reopen diagram {diagram_id}: {e}")
    self._open_diagram_ids.clear()

def _check_translation_availability(self) -> bool:
    """Check if current page has translation in selected language"""
    if not self.current_page or not self.db_manager:
        return True
    
    try:
        page_data = self.db_manager.get_page_by_number(self.book_id, self.current_page)
        # Check if translated_content exists and is not empty
        if page_data and page_data.get('translated_content'):
            return True
        return False
    except Exception:
        return False
```

#### 1.6. Добавить индикатор языка в статус-бар (опционально):
```python
def _update_status_bar(self):
    """Update status bar with page info and language indicator"""
    if hasattr(self, 'status_label'):
        lang_names = {'en': '🇬🇧', 'uk': '🇺🇦', 'ru': '🇷🇺', 'cn': '🇨🇳', 'ja': '🇯🇵', 'ko': '🇰🇷'}
        lang_icon = lang_names.get(self.content_language, '🌐')
        
        has_translation = self._check_translation_availability()
        lang_indicator = lang_icon if has_translation else f"{lang_icon}*"
        
        status_text = f"Page {self.current_page} of {self.total_pages}  |  {lang_indicator}"
        self.status_label.config(text=status_text)
```

### Этап 2: Обновить DatabaseManager creation

**Изменить везде, где создаётся DatabaseManager:**

#### 2.1. В `_open_database_file`:
```python
def _open_database_file(self, filepath: Path) -> None:
    """Open database file"""
    try:
        # Get content language preference
        language = self.content_language  # Use instance variable instead of config
        
        self.db_manager = DatabaseManager(filepath, language=language)
        ...
```

#### 2.2. В `_restore_session`:
```python
def _restore_session(self):
    """Restore last session state"""
    try:
        ...
        # Create database manager with content language
        language = self.content_language  # Use instance variable
        self.db_manager = DatabaseManager(db_path, language=language)
        ...
```

### Этап 3: Мобильное приложение

**Файл:** `bigo_reader_mobile/ui/main_window.py`

Применить те же изменения:
1. Добавить `content_language` в конфиг
2. Добавить LanguageSelector в UI
3. Добавить callback для смены языка
4. Добавить метод перезагрузки контента

#### Особенности для мобильного:
- LanguageSelector может быть в настройках вместо toolbar
- Нужно обновить BookTextWindow тоже
- Синхронизировать с десктопной версией

## 📊 Структура языков

### Язык интерфейса (`interface_language`):
- Управляется через `localization.py`
- Хранится в `config.json` как `language`
- Используется для меню, кнопок, сообщений

### Язык контента (`content_language`):
- Управляется через LanguageSelector
- Хранится в `config.json` как `content_language`
- Используется для:
  - Текстов книг (`Page_Translations`)
  - Комментариев к диаграммам (`Diagram_Comment_Translations`)
  - Названий разделов (`Content_Translations`)
  - Метаданных книг (`Book_Translations`)

## 🧪 Тестирование

### Тест 1: Смена языка контента
1. Открыть книгу на русском
2. Переключить Content Language на Українська
3. **Проверить:** Текст страницы обновился на украинский
4. **Проверить:** Комментарии к диаграммам на украинском

### Тест 2: Сохранение настройки
1. Выбрать Content Language: 中文
2. Закрыть приложение
3. Открыть снова
4. **Проверить:** Content Language = 中文
5. **Проверить:** Тексты загружаются на китайском

### Тест 3: Fallback на primary language
1. Выбрать Content Language: 한국어 (Korean)
2. Открыть книгу, у которой нет корейского перевода
3. **Проверить:** Текст отображается на primary_language книги
4. **Проверить:** В логах предупреждение о fallback

## 📝 Изменения в конфиге

**Файл:** `config.json`

```json
{
  "language": "en",              // Язык интерфейса
  "content_language": "en",      // Язык контента (НОВОЕ!)
  "reader": {
    "auto_open_first_diagram": true,
    "show_full_board": false,
    "sync_pdf_text": false
  },
  ...
}
```

## 🎨 UI Mock-up

```
┌─────────────────────────────────────────────────────────────┐
│ BIgo Reader                                          [ - □ × ]│
├─────────────────────────────────────────────────────────────┤
│ File  Book  View  Tools  Help                                │
├─────────────────────────────────────────────────────────────┤
│ [📖] [🔖] [🔍] [⚙️]   Content Language: [🇬🇧 English ▼]       │ ← НОВОЕ!
├─────────────────────────────────────────────────────────────┤
│                                                               │
│  Page 1 of 150                                                │
│                                                               │
│  Глава 1. Основы дзёсэки                                     │ ← Перевод!
│                                                               │
│  В этой главе мы рассмотрим базовые дзёсэки...              │
│                                                               │
│  @DIAGRAM1:Дзёсэки 3-3@ показывает классическую...          │
│                                                               │
└─────────────────────────────────────────────────────────────┘
```

## 🚀 Оценка времени

- **Desktop Reader:** 1-1.5 часа
- **Mobile Reader:** 1-1.5 часа
- **Тестирование:** 30 минут
- **Итого:** 3-3.5 часа

## ✅ Начнём?

Предлагаю следующий порядок:
1. Desktop Reader - добавить LanguageSelector
2. Desktop Reader - добавить перезагрузку контента
3. Mobile Reader - те же изменения
4. Тестирование обеих версий

Начинаем с Desktop Reader?
