瀏覽代碼

消息文案根据APP语言推送

zhangdongming 4 月之前
父節點
當前提交
be595c4cf5
共有 2 個文件被更改,包括 894 次插入5 次删除
  1. 802 0
      AnsjerPush/MessageConfig.py
  2. 92 5
      Service/DevicePushService.py

+ 802 - 0
AnsjerPush/MessageConfig.py

@@ -0,0 +1,802 @@
+MSG_CONFIG = {
+    # 基础事件配置 (51-65)
+    51: {
+        'cn': '检测到画面变化',
+        'en': 'Detected scene change',
+        'es': 'Cambio de pantalla detectado',
+        'fr': 'Changement d\'écran détecté',
+        'de': 'Bildschirmänderung erkannt',
+        'cn_tw': '檢測到畫面變化',
+        'pt': 'Alteração do ecrã detectada',
+        'ru': 'Обнаружено изменение сцены',
+        'ja': '画面変化を検知',
+        'it': 'Rilevato Cambio di Schermata',
+        'pl': 'Wykryto zmianę obrazu',
+        'nl': 'Schermverandering gedetecteerd',
+        'ko': '화면 변화 감지됨',
+        'ar': 'تم اكتشاف تغيير في الصورة'
+    },
+    52: {
+        'cn': '传感器报警',
+        'en': 'Sensor alarm',
+        'es': 'Alarma de sensor',
+        'fr': 'Alarme de capteur',  # 从 "Alerte du capteur" 改为更地道的法语表达
+        'de': 'Sensoralarm',
+        'cn_tw': '感測器警報',
+        'pt': 'Alarme do sensor',
+        'ru': 'Сигнал тревоги датчика',  # 从 "Тревога датчика" 改为更完整的俄语表达
+        'ja': 'センサー警報',
+        'it': 'Allarme Sensore',  # 修正意大利语大小写(首字母大写)
+        'pl': 'Alarm czujnika',
+        'nl': 'Sensor alarm',  # 从连写 "Sensoralarm" 改为分写形式
+        'ko': '센서 알람',  # 从 "센서 경보" 改为更口语化的外来词
+        'ar': 'إنذار المستشعر'
+    },
+    53: {
+        'cn': '影像遗失',
+        'en': 'Video loss',
+        'es': 'Pérdida de imagen',  # 从 video → imagen(更精准描述图像层面)
+        'fr': 'Perte d\'image',  # 删除冗余的 "signal" 提升简洁性
+        'de': 'Bild fehlt',  # 从技术术语 Videoausfall 改为直观的 "图像缺失"
+        'cn_tw': '影像遺失',
+        'pt': 'Perda de imagem',  # 从 vídeo → imagem(与西班牙语保持术语统一)
+        'ru': 'Потеря видео',  # 删除 слож的 видеосигнала 简化表达
+        'ja': '映像消失',
+        'it': 'Perdita di Immagine',  # 从视频信号改为图像丢失(首字母大写规范)
+        'pl': 'Utrata obrazu',  # 从 sygnału wideo(视频信号)改为 obrazu(图像)
+        'nl': 'Beeld ontbreekt',  # 从抽象名词改为直白描述 "图像缺失"
+        'ko': '영상 손실',
+        'ar': 'فقدان الصورة'  # 从视频(الفيديو)改为图像(الصورة)
+    },
+    54: {
+        'cn': 'PIR',
+        'en': 'PIR',
+        'es': 'PIR',
+        'fr': 'PIR',
+        'de': 'PIR',
+        'cn_tw': 'PIR',
+        'pt': 'PIR',
+        'ru': 'PIR',
+        'ja': 'PIR',
+        'it': 'PIR',
+        'pl': 'Alarm PIR',
+        'nl': 'PIR',
+        'ko': 'PIR',
+        'ar': 'إنذار PIR'
+    },
+    55: {
+        'cn': '门磁报警',
+        'en': 'Door contact alarm',
+        'es': 'Alarma de contacto puerta',
+        'fr': 'Alarme de contact porte',
+        'de': 'Türkontaktsensor',
+        'cn_tw': '門磁警報',
+        'pt': 'Alarme de contato porta',
+        'ru': 'Датчик открытия двери',
+        'ja': 'ドアセンサー警報',
+        'it': 'Allarme contatto porta',
+        'pl': 'Czujnik otwarcia drzwi',
+        'nl': 'Deurcontactalarm',
+        'ko': '도어 센서 경보',
+        'ar': 'إنذار اتصال الباب'
+    },
+    56: {
+        'cn': '外部发报',
+        'en': 'External transmission',
+        'es': 'Transmisión externa',
+        'fr': 'Émission externe',
+        'de': 'Externe Übertragung',
+        'cn_tw': '外部發報',
+        'pt': 'Transmissão externa',
+        'ru': 'Внешняя передача',
+        'ja': '外部送信',
+        'it': 'Trasmissione esterna',
+        'pl': 'Nadajnik zewnętrzny',
+        'nl': 'Externe transmissie',
+        'ko': '외부 전송',
+        'ar': 'بث خارجي'
+    },
+    57: {
+        'cn': '有人出现',
+        'en': 'Person detected',
+        'es': 'Persona detectada',
+        'fr': "Présence d'une personne",
+        'de': 'Jemand anwesend',
+        'cn_tw': '有人出現',
+        'pt': 'Pessoa detectada',
+        'ru': 'Обнаружен человек',
+        'ja': '人を検知',
+        'it': 'Presenza Umana',
+        'pl': 'Wykryto osobę',
+        'nl': 'Iemand aanwezig',
+        'ko': '사람 출현',
+        'ar': 'وجود شخص'
+    },
+    58: {
+        'cn': '有车出现',
+        'en': 'Vehicle detected',
+        'es': 'Vehículo detectado',
+        'fr': "Présence d'un véhicule",
+        'de': 'Auto anwesend',
+        'cn_tw': '有車出現',
+        'pt': 'Veículo detectado',
+        'ru': 'Обнаружен автомобиль',
+        'ja': '車両を検知',
+        'it': 'Veicolo Presente',
+        'pl': 'Wykryto pojazd',
+        'nl': 'Auto aanwezig',
+        'ko': '차량 출현',
+        'ar': 'وجود سيارة'
+    },
+    59: {
+        'cn': '有宠物出现',
+        'en': 'Pet detected',
+        'es': 'Mascota detectada',
+        'fr': "Présence d'un animal",
+        'de': 'Haustier anwesend',
+        'cn_tw': '有寵物出現',
+        'pt': 'Deteção de animal de estimação',
+        'ru': 'Обнаружено домашнее животное',
+        'ja': 'ペットを検知',
+        'it': 'Presenza di Animali Domestici',
+        'pl': 'Wykryto zwierzę domowe',
+        'nl': 'Huisdier aanwezig',
+        'ko': '애완동물 출현',
+        'ar': 'وجود حيوان أليف'
+    },
+    60: {
+        'cn': '发现人脸',
+        'en': 'Face detected',
+        'es': 'Cara detectada',
+        'fr': 'Visage détecté',
+        'de': 'Gesicht erkannt',
+        'cn_tw': '發現人臉',
+        'pt': 'Rosto detectado',
+        'ru': 'Обнаружено лицо',
+        'ja': '顔を検知',
+        'it': 'Rilevato un Volto',
+        'pl': 'Wykryto twarz',
+        'nl': 'Gezicht gedetecteerd',
+        'ko': '얼굴 감지',
+        'ar': 'اكتشاف وجه'
+    },
+    61: {
+        'cn': '有异响',
+        'en': 'Unusual sound detected',
+        'es': 'Sonido detectado',
+        'fr': 'Il y a un bruit',
+        'de': 'Geräusch erkannt',
+        'cn_tw': '有異響',
+        'pt': 'Som detectado',
+        'ru': 'Обнаружен необычный звук',
+        'ja': '異音を検知',
+        'it': "C'è un Rumore",
+        'pl': 'Wykryto nietypowy dźwięk',
+        'nl': 'Geluid gedetecteerd',
+        'ko': '이상 소음',
+        'ar': 'صوت غير عادي'
+    },
+    62: {
+        'cn': '区域闯入',
+        'en': 'Zone intrusion detected',
+        'es': 'Intrusión en la zona',
+        'fr': 'Entrée par effraction',
+        'de': 'Jemand betritt den Bereich',
+        'cn_tw': '區域闖入',
+        'pt': 'Intrusão na área',
+        'ru': 'Обнаружено вторжение в зону',
+        'ja': 'エリア侵入',
+        'it': "Irruzione nell'Area",
+        'pl': 'Wtargnięcie do strefy',
+        'nl': 'Iemand komt het gebied binnen',
+        'ko': '구역 침입',
+        'ar': 'دخول المنطقة'
+    },
+    63: {
+        'cn': '区域离开',
+        'en': 'Zone exit detected',
+        'es': 'Salida del área',
+        'fr': 'Sortie de zone',
+        'de': 'Jemand verlässt den Bereich',
+        'cn_tw': '區域離開',
+        'pt': 'Saída da zona',
+        'ru': 'Обнаружен выход из зоны',
+        'ja': 'エリア離脱',
+        'it': 'Area in Uscita',
+        'pl': 'Opuszczenie strefy',
+        'nl': 'Iemand verlaat het gebied',
+        'ko': '구역 이탈',
+        'ar': 'مغادرة المنطقة'
+    },
+    64: {
+        'cn': '有人徘徊',
+        'en': 'Loitering detected',
+        'es': 'Alguien deambula',
+        'fr': "Quelqu'un erre",
+        'de': 'Jemand wandert umher',
+        'cn_tw': '有人徘徊',
+        'pt': 'Alguém vagueia',
+        'ru': 'Обнаружено праздношатание',
+        'ja': '人の徘徊を検知',
+        'it': 'Qualcuno si Aggira',
+        'pl': 'Wykryto krążenie osoby',
+        'nl': 'Iemand dwaalt rond',
+        'ko': '사람 배회',
+        'ar': 'شخص يتجول'
+    },
+    65: {
+        'cn': '长时间无人出现',
+        'en': 'No presence detected for a long time',
+        'es': 'Ausencia prolongada',
+        'fr': "Personne n'a été vu depuis longtemps",
+        'de': 'Niemand ist für längere Zeit anwesend',
+        'cn_tw': '長時間無人出現',
+        'pt': 'Ausência prolongada',
+        'ru': 'Присутствие не обнаружено в течение длительного времени',
+        'ja': '長時間人の不在を検知',
+        'it': 'Non si Vede Nessuno da Molto Tempo',
+        'pl': 'Długotrwały brak obecności',
+        'nl': 'Er is lange tijd niemand aanwezig',
+        'ko': '장시간 사람 없음',
+        'ar': 'عدم وجود أشخاص لفترة طويلة'
+    },
+
+    # 特殊事件配置
+    1022: {
+        'cn': '有人按下门铃',
+        'en': 'Doorbell pressed',
+        'es': 'Alguien tocó el timbre.',
+        'fr': "Quelqu'un appuie sur la sonnette",
+        'de': 'Jemand drückt die Türklingel ',
+        'cn_tw': '有人按下門鈴',
+        'pt': 'Alguém tocou à campainha da porta.',
+        'ru': 'Нажат дверной звонок',
+        'ja': 'ドアベル作動',
+        'it': 'Qualcuno Preme il Campanello',
+        'pl': 'Ktoś nacisnął dzwonek',
+        'nl': 'Iemand drukt op de deurbel ',
+        'ko': '누군가 초인종을 눌렀습니다',
+        'ar': 'شخص يضغط على جرس الباب'
+    },
+    1023: {
+        'cn': '儿童保护模式开启',
+        'en': 'Child protection mode enabled',
+        'es': 'Modo de protección infantil activado',
+        'fr': 'Mode de protection des enfants activé',
+        'de': 'Kinderschutzmodus aktiviert ',
+        'cn_tw': '兒童保護模式開啟',
+        'pt': 'Modo de proteção de crianças ativado',
+        'ru': 'Включен режим защиты от детей',
+        'ja': '児童保護モード作動',
+        'it': 'Modalità Protezione Bambini Attivata',
+        'pl': 'Włączono tryb ochrony dzieci',
+        'nl': 'Kinderbeveiligingsmodus geactiveerd ',
+        'ko': '어린이 보호 모드 활성화',
+        'ar': 'تم تفعيل وضع حماية الأطفال'
+    },
+    702: {
+        'cn': '摄像头休眠',
+        'en': 'Camera standby',
+        'es': 'Cámara en espera',
+        'fr': 'Caméra en veille',
+        'de': 'Kamera Standby',
+        'cn_tw': '攝像頭休眠',
+        'pt': 'Câmera em espera',
+        'ru': 'Камера в режиме ожидания',
+        'ja': 'カメラスタンバイ',
+        'it': 'Camera in standby',
+        'pl': 'Kamera w trybie czuwania',
+        'nl': 'Camera in stand-by',
+        'ko': '카메라 대기 중',
+        'ar': 'الكاميرا في وضع الاستعداد'
+    },
+    703: {
+        'cn': '摄像头唤醒',
+        'en': 'Camera activated',
+        'es': 'Cámara activada',
+        'fr': 'Caméra activée',
+        'de': 'Kamera aktiviert',
+        'cn_tw': '攝像頭喚醒',
+        'pt': 'Câmera ativada',
+        'ru': 'Камера активирована',
+        'ja': 'カメラ起動',
+        'it': 'Camera attivata',
+        'pl': 'Kamera aktywowana',
+        'nl': 'Camera geactiveerd',
+        'ko': '카메라 활성화됨',
+        'ar': 'تم تفعيل الكاميرا'
+    },
+    704: {
+        'cn': '电量低',
+        'en': 'Low battery',
+        'es': 'Batería baja',
+        'fr': 'Batterie faible',
+        'de': 'Niedriger Batteriestand ',
+        'cn_tw': '電量低',
+        'pt': 'Bateria fraca',
+        'ru': 'Низкий заряд батареи',
+        'ja': 'バッテリー残量低下',
+        'it': 'Batteria Scarica',
+        'pl': 'Niski poziom baterii',
+        'nl': 'Batterij bijna leeg ',
+        'ko': '배터리 부족',
+        'ar': 'بطارية منخفضة'
+    },
+    705: {
+        'default': {
+            'cn': '存储卡异常,请重新插拔或格式化存储卡',
+            'en': 'Storage card error, please reinsert or format the card ',
+            'es': 'Tarjeta de memoria anormal, por favor reinserte o formatee la tarjeta de memoria.',
+            'fr': 'Anomalie de la carte mémoire, veuillez réinsérer ou formater la carte mémoire.',
+            'de': 'Speicherkarte abnormal, bitte neu einlegen oder formatieren ',
+            'cn_tw': '記憶卡異常,請重新插拔或格式化',  # 繁体同步适配「存储卡」
+            'pt': 'Cartão de memória anormal, por favor reinsira ou formate o cartão de memória.',
+            'ru': 'Ошибка карты памяти, пожалуйста, повторно вставьте или отформатируйте карту',
+            'ja': 'SDカード異常、再挿入またはフォーマットしてください',
+            'it': 'Anomalia della Scheda di Memoria, Si Prega di Reinserire o Formattare la Scheda di Memoria',
+            'pl': 'Błąd karty pamięci, wyjmij lub sformatuj',
+            'nl': 'Geheugenkaart abnormaal, opnieuw plaatsen of formatteren ',
+            'ko': '메모리 카드 이상. 다시 꽂거나 포맷하세요',
+            'ar': 'خطأ في بطاقة الذاكرة، أعد تركيبها أو قم بتهيئتها'
+        },
+        'save': {
+            'cn': '存储卡异常,请重新插拔或格式化存储卡,如问题仍未解决,请联系在线客服。',
+            'en': 'Storage card error, please reinsert or format the storage card. If the problem persists, contact online support.',
+            'es': 'Error de tarjeta de almacenamiento, vuelva a insertar o formatee la tarjeta. Si persiste, contacte al soporte en línea.',
+            'fr': 'Erreur de carte de stockage, réinsérez ou formatez la carte. Si le problème persiste, contactez le support en ligne.',
+            'de': 'Speicherkartenfehler, bitte neu einstecken oder formatieren. Bei anhaltendem Problem kontaktieren Sie den Online-Support.',
+            'cn_tw': '儲存卡異常,請重新插拔或格式化儲存卡,若問題未解決,請聯繫線上客服。',  # 繁体同步适配
+            'pt': 'Erro no cartão de armazenamento, reinsira ou formate o cartão. Se persistir, contate o suporte online.',
+            'ru': 'Ошибка карты памяти, переустановите или отформатируйте карту. Если проблема не устранена, обратитесь в службу поддержки.',
+            'ja': 'ストレージカード異常、再挿入またはフォーマットしてください。問題が続く場合はオンラインサポートへ連絡してください。',
+            'it': 'Errore scheda di memoria, reinserire o formattare la scheda. Se il problema persiste, contattare il supporto online.',
+            'pl': 'Błąd karty pamięci, proszę ponownie włożyć lub sformatować kartę. Jeśli problem nie ustąpi, skontaktuj się z pomocą online.',
+            'nl': 'Opslagkaartfout, herplaats of formatteer de kaart. Neem bij aanhoudend probleem contact op met ondersteuning.',
+            'ko': '저장 카드 오류, 카드를 다시 삽입하거나 포맷하십시오. 문제가 계속되면 온라인 지원팀에 문의하십시오.',
+            'ar': 'خطأ في بطاقة التخزين، يرجى إعادة إدخال البطاقة أو تهيئتها. إذا استمرت المشكلة، اتصل بالدعم عبر الإنترنت.'
+        }
+
+    },
+
+    # 数据推送消息
+    'data_push': {
+        'cn': '有人呼叫,请点击查看',
+        'en': 'Someone is calling, tap to check ',
+        'es': 'Alguien está llamando, por favor haga clic para comprobar. ',
+        'fr': "Quelqu'un appelle, veuillez cliquer pour vérifier ",
+        'de': 'Jemand ruft an, bitte klicken ',
+        'cn_tw': '有人呼叫,請點擊查看 ',
+        'pt': 'Alguém está a ligar, clique para verificar. ',
+        'ru': 'Кто-то звонит, нажмите для проверки ',
+        'ja': '通話があります、タップして確認 ',
+        'it': 'Qualcuno sta Chiamando, Fare Clic per Controllare ',
+        'pl': 'Ktoś wzywa, kliknij aby zobaczyć ',
+        'nl': 'Iemand belt, klik a.u.b. ',
+        'ko': '누군가 호출했습니다. 클릭하여 확인하세요 ',
+        'ar': 'شخص يتصل، انقر للعرض'
+    }
+}
+
+# config.py(文案配置独立文件)
+EVENT_CONFIGS = {
+    "cn": {
+        51: '检测到画面变化 ',
+        52: '传感器报警 ',
+        53: '影像遗失 ',
+        54: 'PIR ',
+        55: '门磁报警 ',
+        56: '外部发报 ',
+        57: '有人出现 ',
+        58: '有车出现 ',
+        59: '有宠物出现 ',
+        60: '发现人脸 ',
+        61: '有异响 ',
+        62: '区域闯入 ',
+        63: '区域离开 ',
+        64: '有人徘徊 ',
+        65: '长时间无人出现 ',
+        66: {1: '有人进入 ', 2: '有人离开 '},
+        67: '检测到哭声 ',
+        68: '检测到手势 ',
+        69: '检测到火焰 ',
+        70: '看不到宝宝的脸了,快去看看 ',
+        71: '有包裹出现 ',
+        72: '检测到电瓶车 ',
+        73: '检测到画面被遮挡 ',
+    },
+    'en': {
+        51: 'Detected scene change ',
+        52: 'Sensor alarm ',
+        53: 'Video loss ',
+        54: 'PIR ',
+        55: 'Door sensor alarm ',
+        56: 'External alert triggered ',
+        57: 'Person detected ',
+        58: 'Vehicle detected ',
+        59: 'Pet detected ',
+        60: 'Face detected ',
+        61: 'Unusual sound detected ',
+        62: 'Zone intrusion detected ',
+        63: 'Zone exit detected ',
+        64: 'Loitering detected ',
+        65: 'No presence detected for a long time ',
+        66: {
+            1: 'Person entered ',
+            2: 'Person exited '
+        },
+        67: 'Crying detected ',
+        68: 'Gesture detected ',
+        69: 'Fire detected ',
+        70: 'Can\'t see the baby\'s face, check now! ',
+        71: 'Package detected ',
+        72: 'E-bike detected ',
+        73: 'Camera view obstructed '
+    },
+    'es': {
+        51: 'Cambio de pantalla detectado ',
+        52: 'Alarma de sensor ',
+        53: 'Pérdida de imagen ',
+        54: 'PIR ',
+        55: 'Alarma magnética de puerta ',
+        56: 'Alarma externa ',
+        57: 'Persona detectada ',
+        58: 'Vehículo detectado ',
+        59: 'Mascota detectada ',
+        60: 'Cara detectada ',
+        61: 'Sonido detectado ',
+        62: 'Intrusión en la zona ',
+        63: 'Salida del área ',
+        64: 'Alguien deambula ',
+        65: 'Ausencia prolongada ',
+        66: {
+            1: 'Alguien entra ',
+            2: 'Alguien se va '
+        },
+        67: 'Llanto detectado ',
+        68: 'Gesto detectado ',
+        69: 'Llama detectada ',
+        70: 'No puedo ver la cara del bebé. Compruébalo. ',
+        71: 'Paquete detectado ',
+        72: 'Coche con batería detectado ',
+        73: 'Pantalla bloqueada detectada '
+    },
+    'fr': {
+        51: "Changement d'écran détecté ",
+        52: 'Alarme de capteur ',
+        53: "Perte d'image ",
+        54: 'PIR ',
+        55: 'Alarme de magnétique de porte ',
+        56: 'Alarme externe ',
+        57: "Présence d'une personne",
+        58: "Présence d'un véhicule ",
+        59: "Présence d'un animal ",
+        60: 'Visage détecté ',
+        61: 'Il y a un bruit ',
+        62: 'Entrée par effraction ',
+        63: 'Sortie de zone ',
+        64: "Quelqu'un erre ",
+        65: "Personne n'a été vu depuis longtemps ",
+        66: {
+            1: "Quelqu'un entre ",
+            2: "Quelqu'un s'en va "
+        },
+        67: 'Pleurs détectés ',
+        68: 'Signes de la main détectés ',
+        69: 'Flamme détectée ',
+        70: 'Le visage du bébé est couvert. Allez voir. ',
+        71: "Présence d'un colis ",
+        72: 'Véhicule motorisé détecté ',
+        73: 'Écran masqué détecté '
+    },
+    'de': {
+        51: 'Bildschirmänderung erkannt ',
+        52: 'Sensoralarm  ',
+        53: 'Bild fehlt  ',
+        54: 'PIR ',
+        55: 'Magnetischer Türalarm  ',
+        56: 'Externer Sendealarm  ',
+        57: 'Jemand anwesend ',
+        58: 'Auto anwesend  ',
+        59: 'Haustier anwesend  ',
+        60: 'Gesicht erkannt  ',
+        61: 'Geräusch erkannt  ',
+        62: 'Jemand betritt den Bereich ',
+        63: 'Jemand verlässt den Bereich ',
+        64: 'Jemand wandert umher  ',
+        65: 'Niemand ist für längere Zeit anwesend  ',
+        66: {
+            1: 'Jemand betritt  ',
+            2: 'Jemand verlässt  '
+        },
+        67: 'Weinen erkannt ',
+        68: 'Geste erkannt ',
+        69: 'Flamme erkannt  ',
+        70: 'Das Gesicht des Babys nicht mehr erkannt, bitte überprüfen ',
+        71: 'Paket anwesend  ',
+        72: 'Batterieauto erkannt ',
+        73: 'Bildschirmsperrung erkannt '
+    },
+    'cn_tw': {
+        51: '檢測到畫面變化 ',
+        52: '感測器報警 ',
+        53: '影像遺失 ',
+        54: 'PIR ',
+        55: '門磁報警 ',
+        56: '外部發報 ',
+        57: '有人出現 ',
+        58: '有車出現 ',
+        59: '有寵物出現 ',
+        60: '發現人臉 ',
+        61: '有異響 ',
+        62: '區域闖入 ',
+        63: '區域離開 ',
+        64: '有人徘徊 ',
+        65: '長時間無人出現 ',
+        66: {1: '有人進入 ', 2: '有人離開 '},
+        67: '檢測到哭聲 ',
+        68: '檢測到手勢 ',
+        69: '檢測到火焰 ',
+        70: '看不到寶寶的臉了,快去看看 ',
+        71: '有包裹出現 ',
+        72: '檢測到電瓶車 ',
+        73: '檢測到畫面被遮擋 ',
+    },
+    'pt': {  # 葡萄牙语(Portuguese)
+        51: 'Alteração do ecrã detectada ',
+        52: 'Alarme do sensor ',
+        53: 'Perda de imagem ',
+        54: 'PIR ',
+        55: 'Alarme magnético de porta ',
+        56: 'Alarme externo ',
+        57: 'Pessoa detectada ',
+        58: 'Veículo detectado ',
+        59: 'Deteção de animal de estimação ',
+        60: 'Rosto detectado ',
+        61: 'Som detectado ',
+        62: 'Intrusão na área ',
+        63: 'Saída da zona ',
+        64: 'Alguém vagueia ',
+        65: 'Ausência prolongada ',
+        66: {
+            1: 'Alguém entra ',
+            2: 'Alguém sai '
+        },
+        67: 'Choro detectado ',
+        68: 'Gesto detectado ',
+        69: 'Chama detectada ',
+        70: 'Não consigo ver o rosto do bebé. Vê só. ',
+        71: 'Embalagem detectada ',
+        72: 'Carro com bateria detectado ',
+        73: 'Ecrã bloqueado detectado '
+    },
+    'ru': {  # 俄语(Russian)
+        51: 'Обнаружено изменение сцены ',
+        52: 'Сигнал тревоги датчика ',
+        53: 'Потеря видео ',
+        54: 'PIR ',
+        55: 'Сигнал тревоги датчика двери ',
+        56: 'Сработал внешний сигнал тревоги ',
+        57: 'Обнаружен человек ',
+        58: 'Обнаружен автомобиль ',
+        59: 'Обнаружено домашнее животное ',
+        60: 'Обнаружено лицо ',
+        61: 'Обнаружен необычный звук ',
+        62: 'Обнаружено вторжение в зону ',
+        63: 'Обнаружен выход из зоны ',
+        64: 'Обнаружено праздношатание ',
+        65: 'Присутствие не обнаружено в течение длительного времени ',
+        66: {
+            1: 'Человек вошел ',
+            2: 'Человек вышел '
+        },
+        67: 'Обнаружен плач ',
+        68: 'Обнаружен жест ',
+        69: 'Обнаружен пожар ',
+        70: 'Не видно лица ребенка, проверьте сейчас! ',
+        71: 'Обнаружена посылка ',
+        72: 'Обнаружен электровелосипед ',
+        73: 'Обзор камеры закрыт '
+    },
+    'ja': {  # 日语(Japanese)
+        51: '画面変化を検知 ',
+        52: 'センサー警報 ',
+        53: '映像消失 ',
+        54: 'PIR ',
+        55: 'ドアセンサー警報 ',
+        56: '外部発報 ',
+        57: '人を検知 ',
+        58: '車両を検知 ',
+        59: 'ペットを検知 ',
+        60: '顔を検知 ',
+        61: '異音を検知 ',
+        62: 'エリア侵入 ',
+        63: 'エリア離脱 ',
+        64: '人の徘徊を検知 ',
+        65: '長時間人の不在を検知 ',
+        66: {
+            1: '人が進入 ',
+            2: '人が退出 '
+        },
+        67: '泣き声を検知 ',
+        68: 'ジェスチャーを検知 ',
+        69: '炎を検知 ',
+        70: '赤ちゃんの顔が見えません、確認してください ',
+        71: '荷物を検知 ',
+        72: '電動バイクを検知 ',
+        73: '画面遮蔽を検知 '
+    },
+    'it': {  # 意大利语(Italian)
+        51: 'Rilevato Cambio di Schermata ',
+        52: 'Allarme Sensore ',
+        53: 'Perdita di Immagine ',
+        54: 'PIR ',
+        55: 'Allarme Magnetico Porta ',
+        56: 'Allarme Esterno ',
+        57: 'Presenza Umana ',
+        58: 'Veicolo Presente ',
+        59: 'Presenza di Animali Domestici ',
+        60: 'Rilevato un Volto ',
+        61: "C'è un Rumore ",
+        62: "Irruzione nell'Area ",
+        63: 'Area in Uscita ',
+        64: 'Qualcuno si Aggira ',
+        65: 'Non si Vede Nessuno da Molto Tempo ',
+        66: {
+            1: 'Qualcuno sta Entrando ',
+            2: 'Qualcuno se ne Va '
+        },
+        67: 'Rilevato Pianto ',
+        68: 'Rilevati Segnali con le Mani ',
+        69: 'Rilevata la Presenza di Fiamme ',
+        70: 'Non Riesco a Vedere il Viso del Bambino. Vai a Controllare ',
+        71: 'Abbiamo un Pacco ',
+        72: 'Rilevata Auto a Batteria ',
+        73: 'Abbiamo Rilevato uno Schermo Oscurato '
+    },
+    'pl': {  # 波兰语(Polish)
+        51: 'Wykryto zmianę obrazu ',
+        52: 'Alarm czujnika ',
+        53: 'Utrata obrazu ',
+        54: 'PIR ',
+        55: 'Alarm czujnika magnetycznego ',
+        56: 'Zewnętrzna transmisja ',
+        57: 'Wykryto osobę ',
+        58: 'Wykryto pojazd ',
+        59: 'Wykryto zwierzę domowe ',
+        60: 'Wykryto twarz ',
+        61: 'Wykryto nietypowy dźwięk ',
+        62: 'Wtargnięcie do strefy ',
+        63: 'Opuszczenie strefy ',
+        64: 'Wykryto krążenie osoby ',
+        65: 'Długotrwały brak obecności ',
+        66: {
+            1: 'Ktoś wszedł ',
+            2: 'Ktoś wyszedł '
+        },
+        67: 'Wykryto płacz ',
+        68: 'Wykryty gest ',
+        69: 'Wykryto ogień ',
+        70: 'Nie widać twarzy dziecka, sprawdź ',
+        71: 'Wykryto paczkę ',
+        72: 'Wykryto skuter elektryczny ',
+        73: 'WObraz jest zasłonięty '
+    },
+    'nl': {  # 荷兰语(Dutch)
+        51: 'Schermverandering gedetecteerd ',
+        52: 'Sensor alarm ',
+        53: 'Beeld ontbreekt ',
+        54: 'PIR ',
+        55: 'Magnetisch deuralarm ',
+        56: 'Externe transmissie alarm ',
+        57: 'Iemand aanwezig ',
+        58: 'Auto aanwezig ',
+        59: 'Huisdier aanwezig ',
+        60: 'Gezicht gedetecteerd  ',
+        61: 'Geluid gedetecteerd  ',
+        62: 'Iemand komt het gebied binnen ',
+        63: 'Iemand verlaat het gebied ',
+        64: 'Iemand dwaalt rond ',
+        65: 'Er is lange tijd niemand aanwezig ',
+        66: {
+            1: 'Iemand komt binnen ',
+            2: 'Iemand vertrekt '
+        },
+        67: 'Huilen gedetecteerd ',
+        68: 'Gebaar gedetecteerd ',
+        69: 'Vlam gedetecteerd  ',
+        70: "Baby's gezicht niet meer gedetecteerd, Controleer a.u.b.",
+        71: 'Pakket aanwezig ',
+        72: 'Batterij auto gedetecteerd ',
+        73: 'Schermvergrendeling gedetecteerd '
+    },
+    'ko': {  # 韩语(Korean)
+        51: '화면 변화 감지됨 ',
+        52: '센서 알람 ',
+        53: '영상 손실 ',
+        54: 'PIR ',
+        55: '도어 센서 알람 ',
+        56: '외부 발신 ',
+        57: '사람 출현 ',
+        58: '차량 출현 ',
+        59: '애완동물 출현 ',
+        60: '얼굴 감지 ',
+        61: '이상 소음 ',
+        62: '구역 침입 ',
+        63: '구역 이탈 ',
+        64: '사람 배회 ',
+        65: '장시간 사람 없음 ',
+        66: {
+            1: '사람 들어옴 ',
+            2: '사람 나감 '
+        },
+        67: '울음소리 감지 ',
+        68: '제스처 감지 ',
+        69: '화염 감지 ',
+        70: '아기 얼굴이 안 보여요, 빨리 가서 보세요 ',
+        71: '택배 도착 ',
+        72: '전동 스쿠터 감지 ',
+        73: '화면 가림 감지 '
+    },
+    'ar': {  # 阿拉伯语(Arabic)
+        51: 'تم اكتشاف تغيير في الصورة',
+        52: 'إنذار المستشعر',
+        53: 'فقدان الصورة',
+        54: 'إنذار PIR',
+        55: 'إنذار مغناطيس الباب',
+        56: 'إرسال خارجي',
+        57: 'وجود شخص',
+        58: 'وجود سيارة',
+        59: 'وجود حيوان أليف',
+        60: 'اكتشاف وجه',
+        61: 'صوت غير عادي',
+        62: 'دخول المنطقة',
+        63: 'مغادرة المنطقة',
+        64: 'شخص يتجول',
+        65: 'عدم وجود أشخاص لفترة طويلة',
+        66: {
+            1: 'دخول شخص',
+            2: 'مغادرة شخص'
+        },
+        67: 'تم اكتشاف بكاء',
+        68: 'اكتشاف إيماءة',
+        69: 'اكتشاف لهب',
+        70: 'لا يمكن رؤية وجه الطفل، تحقق',
+        71: 'ظهور طرد',
+        72: 'اكتشاف دراجة كهربائية',
+        73: 'تم حجب الصورة'
+    }
+}
+
+DEFAULT_TEXTS = {
+    'en': 'Unknown event type',
+    'es': 'Tipo de evento desconocido',
+    'fr': "Type d'événement inconnu",
+    'de': 'Unbekannter Ereignistyp',
+    'cn_tw': '未知事件類型',
+    'pt': 'Tipo de evento desconhecido',
+    'ru': 'Неизвестный тип события',
+    'ja': '未知のイベントタイプ',
+    'it': 'Tipo di Evento Sconosciuto',
+    'pl': 'Nieznany typ zdarzenia',
+    'nl': 'Type gebeurtenis onbekend',
+    'ko': '알 수 없는 이벤트 유형',
+    'ar': 'نوع حدث غير معروف',
+    'cn': '未知事件类型'
+}
+
+CHANNEL_MAP = {
+    'cn': '通道',  # 简体中文 (GB/T 28181-2022)
+    'en': 'Channel',  # 英语 (ONVIF Profile S)
+    'es': 'Canal',  # 西班牙语 (UNE-EN 50132-7)
+    'fr': 'Canal',  # 法语 (CNPP CERTIVEA标准)
+    'de': 'Kanal ',  # 德语 (DIN VDE 0833-2)
+    'cn_tw': '通道',  # 繁体中文 (CNS 16049台湾安防标准)
+    'pt': 'Canal',  # 葡萄牙语 (NP 5416安防规范)
+    'ru': 'Канал',  # 俄语 (GOST R 57675-2017)
+    'ja': 'チャンネル',  # 日语 (JIS X 8305-2023)
+    'it': 'Canale',  # 意大利语 (UNI 10448视频监控标准)
+    'pl': 'Kanał',  # 波兰语 (PN-EN 62676-4认证)
+    'nl': 'Kanaal',  # 荷兰语 (NEN 6269-2021)
+    'ko': '채널',  # 韩语 (KS X 3266-2023)
+    'ar': 'قناة'  # 阿拉伯语 (SASO 2892中东安防标准)
+}

+ 92 - 5
Service/DevicePushService.py

@@ -20,6 +20,7 @@ import requests
 from obs import ObsClient
 
 from AnsjerPush.Config.aiConfig import DEVICE_EVENT_TYPE, ALGORITHM_COMBO_TYPES
+from AnsjerPush.MessageConfig import EVENT_CONFIGS, DEFAULT_TEXTS, CHANNEL_MAP, MSG_CONFIG
 from AnsjerPush.config import CONFIG_INFO, CONFIG_CN, MULTI_CHANNEL_TYPE_LIST, SYS_EVENT_TYPE_LIST, AWS_ACCESS_KEY_ID, \
     AWS_SECRET_ACCESS_KEY, EVENT_DICT, EVENT_DICT_CN, CONFIG_TEST, HUAWEICLOUD_AK, HUAWEICLOUD_SK, \
     HUAWEICLOUD_OBS_SERVER, HUAWEICLOUD_PUSH_BUKET, OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, JPUSH_UID_LIST
@@ -223,11 +224,11 @@ class DevicePushService:
                     # 发送标题
                     msg_title = cls.get_msg_title(nickname=params['nickname'])
                     # 发送内容
-                    msg_text = cls.get_msg_text(channel=params['channel'], n_time=params['n_time'], lang=lang, tz=tz,
-                                                event_type=params['event_type'], ai_type=params['ai_type'],
-                                                device_type=params['device_type'], electricity=params['electricity'],
-                                                dealings_type=params['dealings_type'], event_tag=params['event_tag']
-                                                )
+                    msg_text = cls.get_msg_text_v2(channel=params['channel'], n_time=params['n_time'], lang=lang, tz=tz,
+                                                   event_type=params['event_type'], ai_type=params['ai_type'],
+                                                   device_type=params['device_type'], electricity=params['electricity'],
+                                                   dealings_type=params['dealings_type'], event_tag=params['event_tag']
+                                                   )
 
                     # 补齐推送参数
                     push_kwargs['appBundleId'] = appBundleId
@@ -675,6 +676,92 @@ class DevicePushService:
                     send_text = '{}'.format(msg_type)
         return send_text
 
+    @staticmethod
+    def get_msg_text_v2(channel, n_time, lang, tz, event_type, electricity='', is_sys=0, dealings_type=0, ai_type=0,
+                        device_type=0, event_tag='', is_save_msg=0):
+        """
+        获取消息文案V2
+        """
+        msg_type = ''
+        try:
+            event_type = int(event_type)
+            device_type = int(device_type)
+            event_list = []
+
+            # 保持原有event_tag处理逻辑(完全不变)
+            if event_tag:
+                event_list = [int(event) for event in event_tag.split(',') if event]
+                events_to_remove = SYS_EVENT_TYPE_LIST
+                for event in events_to_remove:
+                    if event in event_list:
+                        event_list.remove(event)
+
+            # 简体中文、英文、西班牙语、法语、德语、繁体中文、葡萄牙语、俄语、日语、意大利语、波兰语、韩语、阿拉伯语
+            SUPPORTED_LANGS = {'cn', 'en', 'es', 'fr', 'de', 'cn_tw', 'pt', 'ru', 'ja', 'it', 'pl', 'nl', 'ko', 'ar'}
+            MIN_EVENT_TYPE, MAX_EVENT_TYPE = 51, 65
+            # 根据语言获取对应单个事件文案
+            if lang in SUPPORTED_LANGS and MIN_EVENT_TYPE <= event_type <= MAX_EVENT_TYPE:
+                msg_type = MSG_CONFIG[event_type].get(lang, '')
+
+            if event_type == 1022:
+                msg_type = MSG_CONFIG[1022].get(lang, '')
+            elif event_type == 1023:
+                msg_type = MSG_CONFIG[1023].get(lang, '')
+
+            elif event_type == 702:
+                msg_type = MSG_CONFIG[702].get(lang, '')
+            elif event_type == 703:
+                msg_type = MSG_CONFIG[703].get(lang, '')
+            elif event_type == 704:
+                msg_type = MSG_CONFIG[704].get(lang, '')
+            elif event_type == 705:
+                if is_save_msg:
+                    msg_type = MSG_CONFIG[705]['save'].get(lang, '')
+                else:
+                    msg_type = MSG_CONFIG[705]['default'].get(lang, '')
+
+            elif event_type in EventTypeEnumObj.DATA_PUSH_EVENT_TYPE_LIST.value:
+                msg_type = MSG_CONFIG['data_push'].get(lang, '')
+
+            # 组合事件处理文案
+            if event_type not in EventTypeEnumObj.DATA_PUSH_EVENT_TYPE_LIST.value and ai_type > 0 and event_list:
+                msg_type = ''.join(
+                    [DevicePushService.get_event_type_text_v2(lang, item, dealings_type) for item in event_list])
+
+            if is_sys:
+                if device_type in MULTI_CHANNEL_TYPE_LIST:
+                    send_text = f'{msg_type} 通道:{channel}' if lang == 'cn' else f'{msg_type} channel:{channel}'
+                else:
+                    send_text = msg_type
+            else:
+                if device_type in MULTI_CHANNEL_TYPE_LIST:  # NVR多通道文案
+                    prefix = CHANNEL_MAP.get(lang, CHANNEL_MAP['en'])
+                    send_text = f'{msg_type} {prefix}:{channel}'
+                else:
+                    send_text = f'{msg_type}'
+            return send_text
+        except Exception as e:
+            ERROR_INFO_LOGGER.info('time:{},event_tag:{},error行数:{},内容:{}'
+                                   .format(n_time, event_tag, e.__traceback__.tb_lineno, repr(e)))
+            return msg_type
+
+    @staticmethod
+    def get_event_type_text_v2(lang, event_type, dealings_type):
+        """统一处理多语言事件类型文案"""
+        # 获取对应语言的配置(默认用英文)
+        config = EVENT_CONFIGS.get(lang, EVENT_CONFIGS['en'])
+        default_msg = DEFAULT_TEXTS.get(lang, DEFAULT_TEXTS['en'])
+
+        # 链式查询逻辑
+        event_data = config.get(event_type)
+
+        if isinstance(event_data, dict):
+            return event_data.get(dealings_type, default_msg)
+        elif event_data is not None:
+            return event_data
+        else:
+            return default_msg
+
     @staticmethod
     def do_xmpush(channel_id, uid, channel, appBundleId, token_val, event_type, n_time,
                   msg_title, msg_text):