feat(i18n): localize start/help/menu, practice, words, import, reminder, vocabulary, tasks/stats for RU/EN/JA; add JSON-based i18n helper\n\nfeat(lang): support learning/translation languages across AI flows; hide translations with buttons; store examples per lang\n\nfeat(vocab): add source_lang and translation_lang to Vocabulary, unique constraint (user_id, source_lang, word_original); filter /vocabulary by user.learning_language\n\nchore(migrations): add Alembic setup + migration to add vocab lang columns; env.py reads app settings and supports asyncpg URLs\n\nfix(words/import): pass learning_lang + translation_lang everywhere; fix menu themes generation\n\nfeat(settings): add learning language selector; update main menu on language change
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy import String, BigInteger, DateTime, Integer, Boolean, JSON, Enum as SQLEnum
|
||||
from sqlalchemy import String, BigInteger, DateTime, Integer, Boolean, JSON, Enum as SQLEnum, UniqueConstraint
|
||||
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
||||
import enum
|
||||
|
||||
@@ -52,11 +52,16 @@ class User(Base):
|
||||
class Vocabulary(Base):
|
||||
"""Модель словарного запаса"""
|
||||
__tablename__ = "vocabulary"
|
||||
__table_args__ = (
|
||||
UniqueConstraint("user_id", "source_lang", "word_original", name="uq_vocab_user_lang_word"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
user_id: Mapped[int] = mapped_column(Integer, nullable=False, index=True)
|
||||
word_original: Mapped[str] = mapped_column(String(255), nullable=False)
|
||||
word_translation: Mapped[str] = mapped_column(String(255), nullable=False)
|
||||
source_lang: Mapped[Optional[str]] = mapped_column(String(5)) # ISO2 языка слова (язык изучения)
|
||||
translation_lang: Mapped[Optional[str]] = mapped_column(String(5)) # ISO2 языка перевода (обычно язык интерфейса)
|
||||
transcription: Mapped[Optional[str]] = mapped_column(String(255))
|
||||
examples: Mapped[Optional[dict]] = mapped_column(JSON) # JSON массив примеров
|
||||
category: Mapped[Optional[str]] = mapped_column(String(100))
|
||||
|
||||
Reference in New Issue
Block a user