6
StarHorizon_Public/Tools/ss14_ru/translationsassembler.py
2025-08-05 10:00:54 +03:00

68 lines
3.1 KiB
Python

import logging
import typing
from fluent.syntax import FluentParser, FluentSerializer
from pydash import py_
from file import FluentFile
from fluentast import FluentSerializedMessage
from lokalise_fluent_ast_comparer_manager import LokaliseFluentAstComparerManager
from lokalise_project import LokaliseProject
from lokalisemodels import LokaliseKey
import os
######################################### Class defifitions ############################################################
# TODO непереведенные элементы приходят как { "" }. Необходимо сохранять английский перевод
class TranslationsAssembler:
def __init__(self, items: typing.List[LokaliseKey]):
self.group = py_.group_by(items, 'key_base_name')
keys = list(self.group.keys())
self.sorted_keys = py_.sort_by(keys, lambda key: self.sort_by_translations_timestamp(self.group[key]),
reverse=True)
def execute(self):
for keys in self.group:
full_message = FluentSerializedMessage.from_lokalise_keys(self.group[keys])
parsed_message = FluentParser().parse(full_message)
ru_full_path = self.group[keys][0].get_file_path().ru
ru_file = FluentFile(ru_full_path)
try:
ru_file_parsed = ru_file.read_parsed_data()
except:
logging.error(f'Файла {ru_file.full_path} не существует')
continue
manager = LokaliseFluentAstComparerManager(sourse_parsed=ru_file_parsed, target_parsed=parsed_message)
for_update = manager.for_update()
for_create = manager.for_create()
for_delete = manager.for_delete()
if len(for_update):
updated_ru_file_parsed = manager.update(for_update)
updated_ru_file_serialized = FluentSerializer(with_junk=True).serialize(updated_ru_file_parsed)
ru_file.save_data(updated_ru_file_serialized)
updated_keys = list(map(lambda el: el.get_id_name(), for_update))
logging.info(f'Обновлены ключи: {updated_keys} в файле {ru_file.full_path}')
def sort_by_translations_timestamp(self, list):
sorted_list = py_.sort_by(list, 'data.translations_modified_at_timestamp', reverse=True)
return sorted_list[0].data.translations_modified_at_timestamp
######################################## Var definitions ###############################################################
logging.basicConfig(level=logging.INFO)
lokalise_project_id = os.getenv('lokalise_project_id')
lokalise_personal_token = os.getenv('lokalise_personal_token')
lokalise_project = LokaliseProject(project_id=lokalise_project_id,
personal_token=lokalise_personal_token)
all_keys: typing.List[LokaliseKey] = lokalise_project.get_all_keys()
translations_assembler = TranslationsAssembler(all_keys)
########################################################################################################################
translations_assembler.execute()