Просмотр исходного кода

refactor(translator): make independent of Telegram and async-ready, add plural support

Librellium 1 неделя назад
Родитель
Сommit
0a9382e17d
1 измененных файлов с 18 добавлено и 48 удалено
  1. 18 48
      anonflow/translator/translator.py

+ 18 - 48
anonflow/translator/translator.py

@@ -1,75 +1,45 @@
+import asyncio
 import gettext
 from collections import defaultdict
 from functools import lru_cache
 from pathlib import Path
-from typing import Literal, Optional
-
-from aiogram import Bot
-from aiogram.types import Message
-
-from anonflow import __version_str__
+from typing import Optional
 
 
 class Translator:
     def __init__(self, translations_dir: Path):
-        self.translations_dir = translations_dir
-
-        self.bot = None
+        self._translations_dir = translations_dir
 
     @staticmethod
     @lru_cache
-    def _get_translator(lang: str, translations_dir: Path):
-        translator = gettext.translation(
+    def _get_translation(lang: str, translations_dir: Path):
+        translation = gettext.translation(
             "messages",
             translations_dir,
             languages=[lang],
             fallback=True
         )
-        return translator
-
-    def format(self, s: str, message: Optional[Message], **extra):
-        bot = self.bot
-
-        msg_context = {}
-        if isinstance(message, Message):
-            user = message.from_user
-            chat = message.chat
-
-            first_name = getattr(user, "first_name", "")
-            last_name = getattr(user, "last_name", "")
-
-            msg_context = {
-                "chat_id": getattr(chat, "id", ""),
-                "user_id": getattr(user, "id", ""),
-                "first_name": first_name,
-                "last_name": last_name,
-                "full_name": " ".join(filter(None, (first_name, last_name))),
-                "username": getattr(user, "username", ""),
-                "bot_first_name": getattr(bot, "first_name", ""),
-                "bot_last_name": getattr(bot, "last_name", ""),
-                "bot_username": getattr(bot, "username", ""),
-                "bot_version": __version_str__
-            }
+        return translation
 
+    @staticmethod
+    def _format(s: str, **context):
         return s.format_map(
             defaultdict(
                 str,
-                msg_context | extra
+                context
             )
         )
 
-    def get(self, lang: Literal["ru"] = "ru"):
-        translator = self._get_translator(lang, self.translations_dir)
+    async def get(self, lang: str = "ru"):
+        translator = await asyncio.to_thread(self._get_translation, lang, self._translations_dir)
 
-        def _(msgid: str, message: Optional[Message] = None, **extra):
-            return self.format(
-                translator.gettext(msgid),
-                message=message,
-                **extra
+        def _(msgid1: str, msgid2: Optional[str] = None, n: Optional[int] = None, **context):
+            return self._format(
+                (
+                    translator.ngettext(msgid1, msgid2 if msgid2 is not None else msgid1, n)
+                    if n is not None else translator.gettext(msgid1)
+                ),
+                **context
             )
 
         return _
-
-    async def init(self, bot: Optional[Bot]):
-        if bot:
-            self.bot = await bot.get_me()