Skip to content

Commit fe9ea47

Browse files
committed
Implemented translating messages
1 parent 4ba7cc5 commit fe9ea47

File tree

6 files changed

+32
-13
lines changed

6 files changed

+32
-13
lines changed

config.sample.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ telegram:
1818
- <id 2>
1919
- ...
2020

21+
# Configure whether messages should be translated into the specified language
22+
# Use the two-letter ISO 639-1 language code (examples: "de", "en", "es", "it")
23+
# Omit or keep empty to disable translations
24+
translate_to_lang: "en"
25+
2126
media:
2227
# Path where to put media files
2328
download_path: /path/where/to/put/media-files

output/elasticsearch.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ def __init__(self, config: dict):
1919

2020
self.client = Elasticsearch(hosts=config.get("host", "localhost"), basic_auth=http_auth)
2121

22-
async def write_message(self, message, downloaded_media):
23-
doc_data = await self.get_message_dict(message, downloaded_media)
22+
async def write_message(self, message, translated_text, downloaded_media):
23+
doc_data = await self.get_message_dict(message, translated_text, downloaded_media)
2424

2525
doc_data["timestamp"] = message.date
2626

output/file.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ def __init__(self, config: dict):
1010

1111
self.path = os.path.expanduser(config.get("path"))
1212

13-
async def write_message(self, message, downloaded_media):
14-
message_dict = await self.get_message_dict(message, downloaded_media)
13+
async def write_message(self, message, translated_text, downloaded_media):
14+
message_dict = await self.get_message_dict(message, translated_text, downloaded_media)
1515

1616
with open(self.path, "a") as output_file:
1717
json.dump(message_dict, output_file, default=json_default)

output/redis.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def __init__(self, config: dict):
1313

1414
self.client = Redis(host=config.get("host", "localhost"), port=config.get("port", 6379), db=config.get("db", 0), username=config.get("username"), password=config.get("password"))
1515

16-
async def write_message(self, message, downloaded_media):
17-
message_dict = await self.get_message_dict(message, downloaded_media)
16+
async def write_message(self, message, translated_text, downloaded_media):
17+
message_dict = await self.get_message_dict(message, translated_text, downloaded_media)
1818

1919
self.client.rpush(self.key, json.dumps(message_dict, default=json_default))

output/tcp.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ def ensure_connected(self):
2222
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2323
self.socket.connect((self.host, self.port))
2424

25-
async def write_message(self, message, downloaded_media):
26-
message_dict = await self.get_message_dict(message, downloaded_media)
25+
async def write_message(self, message, translated_text, downloaded_media):
26+
message_dict = await self.get_message_dict(message, translated_text, downloaded_media)
2727

2828
data = json.dumps(message_dict, default=json_default) + "\n"
2929

telegram2elastic.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
from datetime import datetime
1818
from telethon import TelegramClient, events
1919
from telethon.tl import types
20+
from telethon.tl.functions.messages import TranslateTextRequest
2021
from telethon.tl.patched import Message
2122
from telethon.tl.types import User, Chat, Channel
23+
from telethon.tl.types.messages import TranslateResultText
2224
from telethon.utils import get_display_name
2325

2426
LOG_LEVEL_INFO = 35
@@ -256,10 +258,10 @@ def __init__(self, config: dict):
256258
self.config: dict = config
257259

258260
@abstractmethod
259-
async def write_message(self, message, downloaded_media: DownloadedMedia):
261+
async def write_message(self, message, translated_text: str | None, downloaded_media: DownloadedMedia):
260262
pass
261263

262-
async def get_message_dict(self, message, downloaded_media: DownloadedMedia):
264+
async def get_message_dict(self, message, translated_text: str | None, downloaded_media: DownloadedMedia):
263265
sender_user = await message.get_sender()
264266

265267
if sender_user is None:
@@ -293,6 +295,7 @@ async def get_message_dict(self, message, downloaded_media: DownloadedMedia):
293295
"message": message,
294296
"sender": sender,
295297
"get_display_name": get_display_name,
298+
"translated_text": translated_text,
296299
"media": downloaded_media
297300
})
298301

@@ -331,10 +334,11 @@ def get_from_chat(cls, chat):
331334

332335

333336
class OutputHandler:
334-
def __init__(self, media_config: dict):
337+
def __init__(self, media_config: dict, translate_to_lang: str = None):
335338
self.outputs = []
336339
self.imports = {}
337340
self.media_config = MediaConfiguration(media_config)
341+
self.translate_to_lang = translate_to_lang
338342

339343
def add(self, config: dict):
340344
output_type = config.get("type")
@@ -364,8 +368,18 @@ async def write_message(self, message, is_chat_enabled: callable):
364368
else:
365369
downloaded_media = None
366370

371+
if self.translate_to_lang and message.text:
372+
try:
373+
translate_text_result: TranslateResultText = await message.client(TranslateTextRequest(to_lang=self.translate_to_lang, peer=message.input_sender, msg_id=message.id))
374+
translated_text = translate_text_result.text
375+
except BaseException as exception:
376+
logging.error(f"Unable to translate text '{message.text}' using language '{self.translate_to_lang}': {exception}")
377+
translated_text = None
378+
else:
379+
translated_text = None
380+
367381
for output in self.outputs:
368-
await output.write_message(message, downloaded_media)
382+
await output.write_message(message=message, translated_text=translated_text, downloaded_media=downloaded_media)
369383

370384
async def download_media(self, message):
371385
if message.file.name is None:
@@ -533,7 +547,7 @@ def main():
533547
logging.error("Unable to parse config file '{}'".format(arguments.config))
534548
exit(1)
535549

536-
output_handler = OutputHandler(media_config=config.get("media", {}))
550+
output_handler = OutputHandler(media_config=config.get("media", {}), translate_to_lang=config.get("translate_to_lang"))
537551

538552
for output in config.get("outputs", []):
539553
output_handler.add(output)

0 commit comments

Comments
 (0)