86 lines
3.5 KiB
Python
86 lines
3.5 KiB
Python
import os
|
|
|
|
from fluent.syntax.parser import FluentParser
|
|
from fluent.syntax.serializer import FluentSerializer
|
|
|
|
from file import YAMLFile, FluentFile
|
|
from fluentast import FluentSerializedMessage, FluentAstAttributeFactory
|
|
from fluentformatter import FluentFormatter
|
|
from project import Project
|
|
import logging
|
|
|
|
######################################### Class defifitions ############################################################
|
|
class YAMLExtractor:
|
|
def __init__(self, yaml_files):
|
|
self.yaml_files = yaml_files
|
|
|
|
def execute(self):
|
|
for yaml_file in yaml_files:
|
|
yaml_elements = yaml_file.get_elements(yaml_file.parse_data(yaml_file.read_data()))
|
|
|
|
if not len(yaml_elements):
|
|
continue
|
|
|
|
fluent_file_serialized = self.get_serialized_fluent_from_yaml_elements(yaml_elements)
|
|
|
|
if not fluent_file_serialized:
|
|
continue
|
|
|
|
pretty_fluent_file_serialized = formatter.format_serialized_file_data(fluent_file_serialized)
|
|
|
|
relative_parent_dir = yaml_file.get_relative_parent_dir(project.prototypes_dir_path).lower()
|
|
file_name = yaml_file.get_name()
|
|
|
|
en_fluent_file_path = self.create_en_fluent_file(relative_parent_dir, file_name, pretty_fluent_file_serialized)
|
|
ru_fluent_file_path = self.create_ru_fluent_file(en_fluent_file_path)
|
|
|
|
def get_serialized_fluent_from_yaml_elements(self, yaml_elements):
|
|
fluent_serialized_messages = list(
|
|
map(lambda el: FluentSerializedMessage.from_yaml_element(el.id, el.name, FluentAstAttributeFactory.from_yaml_element(el), el.parent_id), yaml_elements)
|
|
)
|
|
fluent_exist_serialized_messages = list(filter(lambda m: m, fluent_serialized_messages))
|
|
|
|
if not len(fluent_exist_serialized_messages):
|
|
return None
|
|
|
|
return '\n'.join(fluent_exist_serialized_messages)
|
|
|
|
def create_en_fluent_file(self, relative_parent_dir, file_name, file_data):
|
|
en_new_dir_path = os.path.join(project.en_locale_prototypes_dir_path, relative_parent_dir)
|
|
en_fluent_file = FluentFile(os.path.join(en_new_dir_path, f'{file_name}.ftl'))
|
|
en_fluent_file.save_data(file_data)
|
|
logging.info(f'Актуализирован файл английской локали {en_fluent_file.full_path}')
|
|
|
|
return en_fluent_file.full_path
|
|
|
|
def create_ru_fluent_file(self, en_analog_file_path):
|
|
ru_file_full_path = en_analog_file_path.replace('en-US', 'ru-RU')
|
|
|
|
if os.path.isfile(ru_file_full_path):
|
|
return
|
|
else:
|
|
en_file = FluentFile(f'{en_analog_file_path}')
|
|
file = FluentFile(f'{ru_file_full_path}')
|
|
file.save_data(en_file.read_data())
|
|
logging.info(f'Создан файл русской локали {ru_file_full_path}')
|
|
|
|
return ru_file_full_path
|
|
|
|
|
|
|
|
######################################## Var definitions ###############################################################
|
|
|
|
logging.basicConfig(level = logging.INFO)
|
|
project = Project()
|
|
serializer = FluentSerializer()
|
|
parser = FluentParser()
|
|
formatter = FluentFormatter()
|
|
|
|
yaml_files_paths = project.get_files_paths_by_dir(project.prototypes_dir_path, 'yml')
|
|
yaml_files = list(map(lambda yaml_file_path: YAMLFile(yaml_file_path), yaml_files_paths))
|
|
|
|
########################################################################################################################
|
|
|
|
logging.info(f'Поиск yaml-файлов ...')
|
|
YAMLExtractor(yaml_files).execute()
|