Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
469 views
in Technique[技术] by (71.8m points)

localization - Why is the dictionary not translated with Flask-Babel

I am writing a website in Flask. I use Flask-Babel for translation into different languages. I use lazy_gettext to translate dictionary values. When changing the language on the site, all phrases and sentences that I wrapped should be translated. Everything is translated besides the words that are wrapped in this mqtt.py file in the MgttTOAA class. Tell me what the problem might be or suggest some other translation option. Thanks

# mqtt.py
from app import socketio, app
from flask import request
from flask_mqtt import Mqtt
from flask_babel import lazy_gettext as _l
from app.tasks import SchedulerTask
import json
import copy
import logging

mqtt = Mqtt(app)
logger = logging.getLogger('flask.flask_mqtt')
logger.disabled = True


class MqttTOAA(object):
    # топик контроля воротами забора, топик данных воротами забора, топик контроля гаражными, топик данных гаражными
    type_topic = ["/Control", "/Data"]
    m_request_state = {"comm": "3"}  # запрос на получение статуса ворот
    m_start = {"Gate": "Start"}  # сообщение для открытия/закрытия ворот
    m_stop = {"Gate": "Stop"}  # сообщение для остановки ворот
    qos_request = 1
    qos_sub = 2
    struct_state_devices = None      # словарь информации о состоянии устройств
    # состояние ворот: действие
    # действие: статус, отображаемый на странице
    # поля: текст кнопки, отображаемый статус, код устройства
    # статус ворот # предыдущая позиция ворот и отметка о том, были ли отсановленны
    dict_gate = {"dict_state_button": {'con_Clos': _l(u'Открыть'),
                                       'con_Open': _l(u'Закрыть'),
                                       "fl_OpenClos": (_l(u'Продолжить'),
                                                       _l(u'Остановить'),
                                                       _l(u'Прервать'))},
                 "dict_state_text": {_l(u'Открыть'): _l(u'закрыты'),
                                     _l(u'Закрыть'): _l(u'открыты'),
                                     _l(u'Продолжить'): _l(u'остановлены'),
                                     _l(u'Прервать'): _l(u'закрываются'),
                                     _l(u'Остановить'): (_l(u'открываются'),
                                                         _l(u'закрываются'),
                                                         _l(u'в движении'))},
                 "dict_type_element": {"button": u'', "text": u'', "device_code": u'', },
                 "state_gate": {},
                 "position": {"state": u'', "stop": False},
                 "reverse": False,
                 }
    close_msg = _l(u'закрываются')
    open_msg = _l(u'открываются')

    POOL_TIME = 2     # Интервал отправки запроса брокеру
    end_publish = None
    devices = None
    app_now = None
    schedulers_list = list()
    sch_task = None
    code_list = list()

    def __init__(self, devices, app):
        mqtt._connect()
        self.devices = devices
        self.app_now = app
        self.sch_task = SchedulerTask()
        self.create_devices_dict()
        self.handle_mqtt_connect()
        self.mqtt_onmessage = mqtt.on_message()(self._handle_mqtt_message)
        self.mqtt_onlog = mqtt.on_log()(self._handle_logging)
        self.socketio_error = socketio.on_error()(self._handle_error)
        self.handle_change_state = socketio.on('change_state')(self._handle_change_state)
        self.handle_unsubscribe_all = socketio.on('unsubscribe_all')(self._handle_unsubscribe_all)

    # ожидание подключения к брокеру,
    # затем подписка на топик и запуск потока для постоянной отсылки сообщений в топик Control
    def handle_mqtt_connect(self):
        task = None
        for dev in self.devices:
            if dev.device_code not in self.code_list:  # запущен ли уже поток с таким кодом
                mqtt.subscribe("BK" + dev.device_code + self.type_topic[1], self.qos_sub)
                self.code_list.append(dev.device_code)
                task = self.sch_task.add_scheduler_publish(dev.device_code,
                                                           mqtt,
                                                           "BK" + dev.device_code +
                                                           self.type_topic[0],
                                                           self.m_request_state,
                                                           self.qos_request,
                                                           self.POOL_TIME)
                if task is not None:
                    self.schedulers_list.append(task)

        if len(self.schedulers_list) > 0:
            self.sch_task.start_schedulers()
            self.code_list.clear()

    # обработчик ошибок
    @staticmethod
    def _handle_error():
        print(request.event["message"])  # "my error event"
        print(request.event["args"])  # (data,)

    # отмена подписки на топик
    @staticmethod
    def _handle_unsubscribe_all():
        mqtt.unsubscribe_all()

    # функция изменения состояния ворот по нажатию
    def _handle_change_state(self, code):
        print(code)
        # print(self.struct_state_devices[code])
        message = None
        if code is not None:
            try:
                type_g = self.struct_state_devices[code]["state_gate"]

                if type_g["fl_OpenClos"] == 1:  # ворота в движении -> остановка
                    message = self.m_stop
                else:
                    if self.struct_state_devices[code]["reverse"] is True:
                        # остановились и двигаются в обратном направлении -> остановка
                        if self.struct_state_devices[code]["position"]["state"] == self.close_msg:
                            message = self.m_stop
                            self.struct_state_devices[code]["position"]["state"] = self.open_msg
                        else:
                            message = self.m_start
                    else:  # ворота остановленны -> продолжение движения
                        message = self.m_start
                print("Msg:" + str(message))
            except Exception as ex:
                print(ex)
            if message is not None:
                mqtt.publish("BK" + code + self.type_topic[0], json.dumps(message), self.qos_request)
            else:
                print("Error change state " + code)

    # обработка принятых сообщений от топика, на который подписан
    def _handle_mqtt_message(self, client, userdata, message):
        # print("Get message")
        data = dict(
            topic=message.topic,
            payload=message.payload.decode(),
            qos=message.qos,
            )
        try:
            data = json.loads(data['payload'])
            self.gate_msg(data)
        except Exception as ex:
            print("Exception: " + str(ex))

    # логирование
    @staticmethod
    def _handle_logging(self, client, userdata, level, buf):
        print(level, buf)
        pass

    # создание словаря устройств
    def create_devices_dict(self):
        if self.struct_state_devices is None:
            self.struct_state_devices = dict()
        for dev in self.devices:
            self.struct_state_devices[dev.device_code] = self.dict_gate.copy()  # добавление словаря устройства
            if dev.typedev.reverse:
                self.struct_state_devices[dev.device_code]['reverse'] = True

    # функция измения состояния гаражных ворот (с реверсом)
    def gate_msg(self, data):
        k = ""
        code = data["esp_id"][2:]
        dict_dev = copy.deepcopy(self.struct_state_devices[code])
        dict_dev["state_gate"] = data.copy()
        try:
            if dict_dev["state_gate"]["con_Clos"] == 0:  # ворота закрыты
                # print("1")
                k = "con_Clos"
                dict_dev["position"]["state"] = k
                dict_dev["position"]["stop"] = False
            elif dict_dev["state_gate"]["con_Open"] == 0:  # ворота открыты
                # print("2")
                k = "con_Open"
                dict_dev["position"]["state"] = k
                dict_dev["position"]["stop"] = False
            elif dict_dev["state_gate"]["fl_OpenClos"] == 0:  # ворота остановленны/движение прервано
                # print("3")
                k = "fl_OpenClos"
                # обратный ход ворот при закрытии
                if dict_dev["position"]["state"] == self.close_msg and dict_dev["reverse"] is True:
                    # print("4")
                    k1 = 1
                    k2 = 0
                    dict_dev["dict_type_element"]["text"] = 
                        dict_dev["dict_state_text"][dict_dev["dict_state_button"][k][k1]][k2]
                    dict_dev["position"]["stop"] = False
                else:
                    # print("5")
                    k1 = 0
                    dict_dev["dict_type_element"]["text"] = 
                        dict_dev["dict_state_text"][dict_dev["dict_state_button"][k][k1]]
                    dict_dev["position"]["stop"] = True
            elif dict_dev["state_gate"]["fl_OpenClos"] == 1:  # ворота в движении
                # print("6")
                k = "fl_OpenClos"
                # Если невозможно определить открываются или закрываются ворота
                if len(dict_dev["position"]["state"]) == 0:
                    # print("7")
                    k1 = 1
                    k2 = 2
                    dict_dev["dict_type_element"]["text"] = 
                        dict_dev["dict_state_text"][dict_dev["dict_state_button"][k][k1]][k2]
                # определение - закрываются или открываются ворота
                elif dict_dev["position"]["state"] == "con_Clos" or 
                        dict_dev["position"]["state"] == self.open_msg:
                    if dict_dev["position"]["stop"]:
                        # print("8")
                        k1 = 1
                        k2 = 1
                        dict_dev["position"]["stop"] = False
                        dict_dev["dict_type_element"]["text"] = 
                            dict_dev["dict_state_text"][dict_dev["dict_state_button"][k][k1]][k2]
                    else:
                        # print("9")
                        k1 = 1
                        k2 = 0
                        dict_dev["dict_type_element"]["text"] = 
                            dict_dev["dict_state_text"][dict_dev["dict_state_button"][k][k1]][k2]
                elif dict_dev["position"]["state"] == "con_Open" or 
                        dict_dev["position"]["state"] == self.close_msg:
          

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...