微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么字典没有用 Flask-Babel 翻译

如何解决为什么字典没有用 Flask-Babel 翻译

我正在 Flask 编写网站。我使用 flask-babel 翻译成不同的语言。我使用 lazy_gettext 来翻译字典值。在网站上更改语言时,我包装的所有短语和句子都应翻译。除了 MgttTOAA 类中这个 mqtt.py 文件中包含的单词之外,所有内容都被翻译。告诉我可能是什么问题或建议其他一些翻译选项。谢谢

# 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,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:
                    if dict_dev["reverse"]:
                        # print("10")
                        k1 = 2
                        dict_dev["dict_type_element"]["text"] = \
                            dict_dev["dict_state_text"][dict_dev["dict_state_button"][k][k1]]
                    else:
                        if dict_dev["position"]["stop"]:
                            # print("11")
                            k1 = 1
                            k2 = 0
                            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("12")
                            k1 = 1
                            k2 = 1
                            dict_dev["dict_type_element"]["text"] = \
                                dict_dev["dict_state_text"][dict_dev["dict_state_button"][k][k1]][k2]

                if dict_dev["position"]["state"] != dict_dev["dict_type_element"]["text"]:
                    # print("13")
                    dict_dev["position"]["state"] = dict_dev["dict_type_element"]["text"]

            if k == "fl_OpenClos":
                dict_dev["dict_type_element"]["button"] = dict_dev["dict_state_button"][k][k1]
            else:
                dict_dev["dict_type_element"]["button"] = dict_dev["dict_state_button"][k]
                dict_dev["dict_type_element"]["text"] = \
                    dict_dev["dict_state_text"][dict_dev["dict_state_button"][k]]

        except Exception as ex:
            print("Exception (gate_msg): " + str(ex))
        dict_dev["dict_type_element"]["device_code"] = data["esp_id"][2:]
        dict_dev["dict_type_element"]["temp"] = data["temp_1"]
        dict_dev["dict_type_element"]["button"] = copy.deepcopy(str(dict_dev["dict_type_element"]["button"]))
        dict_dev["dict_type_element"]["text"] = copy.deepcopy(str(dict_dev["dict_type_element"]["text"]))
        self.struct_state_devices[code] = copy.deepcopy(dict_dev)
        socketio.emit('mqtt_message',data=dict_dev["dict_type_element"])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。