Repository: AllYarnsAreBeautiful/ayab-desktop
Pull request #766: Fix/add ru translations
Author: login: dl1com
Created: 2025-03-13T20:11:12Z | Merged: 2025-03-15T15:26:41Z

as proposed by djdollar on Discord

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **Bug Fixes**
  - Revised the order in which system messages are processed.
  - Enhanced error handling in selection logic to prevent potential issues.
- **Style**
  - Corrected the error message wording for single bed knitting for improved clarity.
- **New Features**
  - Enhanced localization support, ensuring interface texts (such as header labels and notifications) are appropriately translated.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/src/main/python/main/ayab/engine/hw_test_communication_mock.py b/src/main/python/main/ayab/engine/hw_test_communication_mock.py
index 6a137e51..727fde49 100644
--- a/src/main/python/main/ayab/engine/hw_test_communication_mock.py
+++ b/src/main/python/main/ayab/engine/hw_test_communication_mock.py
@@ -61,7 +61,7 @@ def read_API6(self):
         if len(self.rx_msg_list) == 0:
             return None
         # else
-        res = self.rx_msg_list.popleft()  # FIFO
+        res = self.rx_msg_list.pop()  # FIFO
         return res
 
     def __output(self, token: Token, msg: str) -> None:
diff --git a/src/main/python/main/ayab/engine/options.py b/src/main/python/main/ayab/engine/options.py
index eba36911..594ec4c7 100644
--- a/src/main/python/main/ayab/engine/options.py
+++ b/src/main/python/main/ayab/engine/options.py
@@ -244,7 +244,7 @@ def validate(self) -> tuple[Literal[False], str] | tuple[Literal[True], None]:
                 return False, "Invalid needle start and end."
         # else
         if self.mode == Mode.SINGLEBED and self.num_colors >= 3:
-            return False, "Singlebed knitting currently supports only 2 colors."
+            return False, "Single bed knitting currently supports only 2 colors."
         # else
         if self.mode == Mode.CIRCULAR_RIBBER and self.num_colors >= 3:
             return False, "Circular knitting supports only 2 colors."
diff --git a/src/main/python/main/ayab/knitprogress.py b/src/main/python/main/ayab/knitprogress.py
index 99007009..70b9507c 100644
--- a/src/main/python/main/ayab/knitprogress.py
+++ b/src/main/python/main/ayab/knitprogress.py
@@ -152,7 +152,12 @@ def load_columns_from_status(
     def instantiate_row_from_columns(
         self, status: Status, columns: List[QTableWidgetItem]
     ) -> None:
-        self.setVerticalHeaderItem(0, QTableWidgetItem("To Be Selected"))
+        self.setVerticalHeaderItem(
+            0,
+            QTableWidgetItem(
+                QCoreApplication.translate("KnitProgress", "To Be Selected")
+            ),
+        )
         for i, col in enumerate(columns):
             self.setItem(0, i, col)
             self.setColumnWidth(i, self.__prefs.value("lower_display_stitch_width"))
@@ -264,14 +269,12 @@ def onStitchSelect(self, current: QTableWidgetItem | None) -> None:
         if current is None:
             self.__progbar.set_selection_label("")
             return
-        if (
-            self.horizontalHeaderItem(current.column()).foreground().color().red()
-            == 187
-        ):
+        header = self.horizontalHeaderItem(current.column())
+        if header is not None and header.foreground().color().red() == 187:
             side = "Right"
         else:
             side = "Left"
         selection_string = f"""Selection: {
             self.verticalHeaderItem(current.row()).text()} stitch {side}-{
-            self.horizontalHeaderItem(current.column()).text()}"""
+            header.text() if header else ''}"""
         self.__progbar.set_selection_label(selection_string)
diff --git a/src/main/python/main/ayab/signal_sender.py b/src/main/python/main/ayab/signal_sender.py
index 0df8ef0e..488e943c 100644
--- a/src/main/python/main/ayab/signal_sender.py
+++ b/src/main/python/main/ayab/signal_sender.py
@@ -108,7 +108,7 @@ def emit_blocking_popup(
     ) -> None:
         """Sends the blocking_popup_displayer signal."""
         self.emit_blocking_popup_displayer(
-            QCoreApplication.translate("AyabPlugin", message), message_type
+            QCoreApplication.translate("Notifications", message), message_type
         )
 
     def emit_popup(
@@ -116,9 +116,9 @@ def emit_popup(
     ) -> None:
         """Sends the popup_displayer signal."""
         self.emit_popup_displayer(
-            QCoreApplication.translate("AyabPlugin", message), message_type
+            QCoreApplication.translate("Notifications", message), message_type
         )
 
     def emit_notification(self, message: str = "", log: bool = True) -> None:
         """Sends the notifier signal."""
-        self.emit_notifier(QCoreApplication.translate("AyabPlugin", message), log)
+        self.emit_notifier(QCoreApplication.translate("Notifications", message), log)
diff --git a/src/main/resources/base/ayab/translations/ayab-translation-master.tsv b/src/main/resources/base/ayab/translations/ayab-translation-master.tsv
index 69220e5a..388e9d33 100644
--- a/src/main/resources/base/ayab/translations/ayab-translation-master.tsv
+++ b/src/main/resources/base/ayab/translations/ayab-translation-master.tsv
@@ -1,26 +1,26 @@
 Context	en_US	en_GB	de_DE	is_IS	it_IT	ru_RU	uk_UA	fr_FR	es_ES	ko_KR	ja_JP	zh_CN
-Firmware	Error flashing firmware.	Error flashing firmware.	Fehler beim Aufspielen der Firmware.	Villa við uppfærslu á hugbúnaði.							ファームウェアをフラシュ中にエラーが発生しました。	刷写固件错误
-Firmware	Flashing done!	Flashing done!		Uppfærslu lokið!	Firmware aufgespielt!						フラシュ完了！	刷写完成！
-Firmware	Firmware Flashing Utility	Firmware Flashing Utility	Firmware-Dienstprogramm	Hugbúnaðar uppfærsla							ファームウェアフラッシュしているユーティリティ	固件刷写
-Firmware	Port	Port	Schnittstelle	Tengi	Porta	порт	порт	Port	Puerto		ポート	端口
+Firmware	Error flashing firmware.	Error flashing firmware.	Fehler beim Aufspielen der Firmware.	Villa við uppfærslu á hugbúnaði.		Ошибка записи прошивки.					ファームウェアをフラシュ中にエラーが発生しました。	刷写固件错误
+Firmware	Flashing done!	Flashing done!	Firmware aufgespielt!	Uppfærslu lokið!		Прошивка завершена успешно!					フラシュ完了！	刷写完成！
+Firmware	Firmware Flashing Utility	Firmware Flashing Utility	Firmware-Dienstprogramm	Hugbúnaðar uppfærsla		Утилита для прошивки					ファームウェアフラッシュしているユーティリティ	固件刷写
+Firmware	Port	Port	Schnittstelle	Tengi	Porta	Порт	порт	Port	Puerto		ポート	端口
 Firmware	Controller	Controller	Mikrocontroller	Örgjörvi	Microcontroller	Микроконтроллер	Мікроконтролер	Microcontrôleur	Microcontrolador		コントローラ	控制器
 Firmware	Firmware Version	Firmware Version	Firmware-Version	Hugbúnaðarútgáfa	Versione del Firmware	Версия Прошивки	Версія Прошивки	Version du Firmware	Versión del Firmware		ファームウェアのバージョン	固件版本
-Firmware	Flash	Flash	Aufspielen	Uppfæra	Programma			Flasher	Flashear		フラッシュ	刷写
+Firmware	Flash	Flash	Aufspielen	Uppfæra	Programma	Прошивка		Flasher	Flashear		フラッシュ	刷写
 Scene	Image dimensions	Image dimensions	Mustergröße	Myndastærð	Dimensione dell'immagine	Размер изображения	Розмір зображення	Dimensions de l'image	Dimensiones de la imagen	이미지 치수	イメージサイズ	图像尺寸
 Dock	Port Selection	Port Selection	Schnittstelle wählen	Velja tengi	Selezione porta seriale	Выбрать порт	Вибір порту	Sélection du port	Seleccionar puerto	포트 선택	ポートの選択	端口选择
 Dock	Refresh	Refresh	Aktualisieren	Endurnýja	Ricarica	Обновить	Оновити	Réactualiser	Actualizar	리플레시	リフレッシュ	刷新
 Dock	Settings	Settings	Einstellungen	Stillingar	Impostazioni	Настройки	Налаштування	Paramètres	Ajustes	설정	設定	设置
-Dock	Knitting Mode	Knitting Mode	Strickmodus	Prjóna stilling	Modalità di lavorazione	Режим вязание	Режим в'язання	Mode tricot	Método de tejido	니팅 모드	編みモード	编织模式
 Dock	Status	Status	Status	Staða	Stato	Статус	Стан	Statut	Estado	상태	状態	状态
+Options	Knitting Mode	Knitting Mode	Strickmodus	Prjóna stilling	Modalità di lavorazione	Режим вязания	Режим в'язання	Mode tricot	Método de tejido	니팅 모드	編みモード	编织模式
 Options	Colors	Colours	Farben	Litir	Colori	Цвета	Кольори	Couleurs	Colores	색상들	色	颜色
-Options	Start Row	Start Row	Startzeile	Byrja umferð	Inizio giro	Начальный ряд	Початковий ряд	Commencer le rang	Fila de inicio	시작 단	スタート段	起始行
+Options	Start Row	Start Row	Startzeile	Byrja umferð	Inizio giro	Начальный ряд	Початковий ряд	Commencer au rang	Fila de inicio	시작 단	スタート段	起始行
 Options	Infinite Repeat	Infinite Repeat	Unendlich wiederholen	Endurtekning	Ripetizione infinita	Повторять	Нескінченне повторення	Répétition a l'infini	Repetición infinita	무한 반복	無限リピート	无限重复
 Options	Start Needle	Start Needle	Startnadel	Byrjunar nál	Ago iniziale	Стартовая игла	Початкова голка	Première aiguille	Aguja de inicio	시작 바늘	スタート針	起始针
 Options	Stop Needle	Stop Needle	Stopnadel	Enda nál	Ago finale	Конечная игла	Остання голка	Dernière aiguille	Aguja de parada	끝나는 바늘	止針	结束针
 Options	Alignment	Alignment	Ausrichtung	Jafna	Allineamento	Выравнивание	Вирівнювання	Alignement	Alineamiento	조정	アライメント	对齐
-Options	Mirror Image	Mirror Image	Muster spiegeln	Spegilmynd	Ribalta l'immagine	Зеркальное отражение	Дзеркальне зображення	Image miroir	Imagen espejo	거울 이미지	鏡像	镜像
+Options	Knit Side Image	Mirror Image	Muster spiegeln	Spegilmynd	Ribalta l'immagine	Зеркальное отражение	Дзеркальне зображення	Image miroir	Imagen espejo	거울 이미지	鏡像	镜像
 Options	Continuous Status Reporting	Continuous Status Reporting	Kontinuierlicher Status	Stöðug skýrsla	Report continuativo	Непрерывный отчет о статусе	Постійне звітування про стан	Rapport de situation en continu	Informe de estado continuo	지속적 상태 보고	継続的なステータスレポート	持续状态报告
-StatusTab	Hall Sensors	Hall Sensors	Hall-Effekt-Sensoren	Skynjari	Apparato sensori	Датчик Холла	Датчики Холла	Capteurs à effet Hall	Sensores de effecto Hall	홀 센서		霍尔传感器
+StatusTab	Hall Sensors	Hall Sensors	Hall-Effekt-Sensoren	Skynjari	Apparato sensori	Датчики Холла	Датчики Холла	Capteurs à effet Hall	Sensores de effecto Hall	홀 센서		霍尔传感器
 StatusTab	Hall Left	Hall Left	Hallsensor links	Vinstri skynjari	Apparato sensore sinistro	Датчик Холла слева	Лівий датчик Холла	Hall Gauche	Hall izquierda	홀 왼쪽		霍尔左
 StatusTab	Hall Right	Hall Right	Hallsensor rechts	Hægri skynjari	Apparato sensore destro	Датчик Холла справа	Правий датчик Холла	Hall Droite	Hall derecha	홀 오른쪽		霍尔右
 StatusTab	Carriage	Carriage	Schlitten	Vagn	Carrello	Каретка	Каретка	Chariot	Carro	캐리지	キャリジ	机头
@@ -28,17 +28,17 @@ StatusTab	No carriage detected	No carriage detected	Kein Schlitten erkannt	Finn
 StatusTab	direction	direction	Richtung	Stefna	direzione	направление	напрямок	direction	dirección	방향	方向	方向
 StatusTab	Progress	Progress	Fortschritt	Staða	Progressione	Прогресс	Прогрес	Progrès	Progreso	진행	進捗	进程
 StatusTab	progress	progress	Fortschritt	staða	progressione	прогресс	прогрес	progrès	progreso	진행	進捗	进程
-StatusTab	Center	Centre	Zentriert	Miðja	Centra	Центр	Центр	Centre	Centrar	중앙	中心	中心
-StatusTab	Left	Left	Links	Vinstri	Sinistra	Лево	Ліворуч	Gauche	Izquierda	왼쪽	左	左
-StatusTab	Right	Right	Rechts	Hægri	Destra	Право	Праворуч	Droite	Derecha	오른쪽	右	右
+StatusTab	Center	Centre	Zentriert	Miðja	Centra	По центру	Центр	Centre	Centrar	중앙	中心	中心
+StatusTab	Left	Left	Links	Vinstri	Sinistra	Слева	Ліворуч	Gauche	Izquierda	왼쪽	左	左
+StatusTab	Right	Right	Rechts	Hægri	Destra	Справа	Праворуч	Droite	Derecha	오른쪽	右	右
 MainWindow	All Yarns Are Beautiful	All Yarns Are Beautiful	All Yarns Are Beautiful	Allt Garn Er Fallegt	All Yarns Are Beautiful	Вся пряжа прекрасна	Уся пряжа прекрасна	Tous Les Fils Sont Beaux	Todos Los Hilos Son Hermosos	모든 실은 아름답다	すべての糸は美しいです	诸纱皆妙
 MainWindow	Website	Website	Webseite	Vefsíða	Sito web	Интернет сайт	Веб-сайт	Site Internet	Sitio web	웹사이트	Web サイト	网页
 MainWindow	Manual	Manual	Anleitung	Handbók	Manuale	Справочник	Посібник	Manuel	Manual	매뉴얼	マニュアル	手册
 MainWindow	Assistant	Assistant	Assistent	Aðstoð	Assistente	Помощник	Помічник	Assistant	Asistente	어시스턴트	アシスタント	助手
-MainWindow	1. Load Image File	1. Load Image File	1. Muster öffnen	1. Hlaðið myndskrá	1. Carica l'immagine	1. Загрузить изображение	1. Завантажити зображення	1. Charger une image	1. Cargar archivo de imagen	1. 이미지 파일 부르기	イメージファイルの読み込み	1.读取图像文件
+MainWindow	1. Open Image File	1. Open Image File	1. Muster öffnen	1. Hlaðið myndskrá	1. Carica l'immagine	1. Загрузить изображение	1. Завантажити зображення	1. Charger une image	1. Cargar archivo de imagen	1. 이미지 파일 부르기	イメージファイルの読み込み	1.读取图像文件
 MainWindow	Knitting Options	Knitting Options	Strickeinstellungen	Prjóna valkostir	Opzioni Lavorazione	Варианты вязания	Варіанти в'язання	Options de tricot	Opciones de tejido	니팅 옵션	編み設定	编织选项
 MainWindow	2. Knit	2. Knit	2. Stricken	2. Prjónið	2. Lavora	2. Вязание	2. В'язання	2. Tricoter	2. Tejer	2. 니트!	編む	2.编织
-MainWindow	Test	Test	Testen	Prófa	Test		Тест	Тест	Tester	테스트	テスト	测试
+MainWindow	Test	Test	Testen	Prófa	Test	Тест	Тест	Tester		테스트	テスト	测试
 MainWindow	Cancel	Cancel	Abbrechen	Hætta við	Annulla	Отмена	Скасувати	Annuler	Cancelar	취소	キャンセル	取消
 MainWindow	Open Knitting Project	Open Knitting Project	Projekt öffnen	Opna skrá	Apri il progetto	Начать новый проект	Відкрити в'язальний проєкт	Ouvrir un projet	Abrir proyecto de tejido	니팅 프로젝트 열기	編み物プロジェクトを開く	打开编织项目
 MenuBar	File	File	Datei	Skrá	File	Файл	Файл	Fichier	Archivo	파일	ファイル	文件
@@ -46,7 +46,11 @@ MenuBar	Help	Help	Hilfe	Hjálp	Aiuto	Помощь	Допомога	Aide	Ayuda	
 MenuBar	Tools	Tools	Werkzeuge	Verkfæri	Strumenti	Инструменты	Інструменти	Outils	Utiles	도구		工具
 MenuBar	Preferences	Preferences	Einstellungen	Forstillingar	Preferenze	Персональные настройки	Налаштування	Préférences	Preferencias	환경 설정	好み	偏好设置
 MenuBar	Image Actions	Image Actions	Musterbearbeitung	Mynda aðgerðir	Azioni immagine	Действия с изображением	Дії з зображенням	Image	Imagen	이미지 변경	イメージアクション	图像操作
+MenuBar	Open Image File	Open Image File	Muster öffnen	Hlaðið myndskrá	Carica l'immagine	Загрузить изображение	Завантажити зображення	Charger une image	Cargar archivo de imagen	이미지 파일 부르기	イメージファイルの読み込み	读取图像文件
 MenuBar	Load AYAB Firmware	Load AYAB Firmware	AYAB Firmware aufspielen	Uppfæra AYAB hugbúnað	Carica il firmware AYAB	Загрузить прошивку AYAB	Завантажити прошивку AYAB	Chargement du firmware AYAB	Cargar el firmware AYAB	AYAB 펌웨어 설정	AYABのファームウェアをロードする	读取AYAB固件
+MenuBar	Test AYAB Device	Test AYAB Device	AYAB-Gerät testen	Prófa AYAB tæki	Test dispositivo AYAB	Проверить устройство AYAB	Перевірити пристрій AYAB	Test de l'appareil AYAB	Probar dispositivo AYAB	AYAB 장치 테스트	AYABデバイスをテストする	测试AYAB设备
+MenuBar	Knit	Knit	Stricken	Prjónið	Lavora	Вязание	В'язання	Tricoter	Tejer	니트!	編む	编织
+MenuBar	Cancel Knitting	Cancel Knitting	Stricken abbrechen	Hætta við prjón	Annulla lavorazione	Отменить вязание	Скасувати в'язання	Annuler le tricot	Anular tejido	니팅 취소	編みをキャンセル	取消编织
 MenuBar	Quit	Quit	Beenden	Hætta	Chiudi	Выход	Вихід	Quitter	Salir	끝내기	やめる	退出
 MenuBar	Help – About	Help – About	Hilfe – Über	Hjálp – Um	Aiuto – Informazioni	Помощь	Допомога – Про	Aide – À propos	Ayuda – Sobre	도움 - 관하여	ヘルプ - について	帮助-关于
 MenuBar	Help	Help	Hilfe	Hjálp	Aiuto	Помощь	Допомога	Aide	Ayuda	도움	ヘルプ	帮助
@@ -59,19 +63,26 @@ MenuBar	Vertical Flip	Vertical Flip	Vertikal spiegeln	Snúa lóðrétt	Inverti v
 MenuBar	Rotate Left	Rotate Left	Links drehen	Snúa til vinstri	Ruota a sinistra	Поворот влево	Обертати ліворуч	Rotation à gauche	Girar a la izquierda	왼쪽으로 돌리기	左に回転	左转
 MenuBar	Rotate Right	Rotate Right	Rechts drehen	Snúa til hægri	Ruota a destra	Поворот вправо	Обертати праворуч	Rotation à droite	Girar a la derecha	오른쪽으로 돌리기	右に回転	右转
 MenuBar	Set Preferences	Set Preferences	Einstellungen festlegen	Setjið forstillingar	Imposta preferenze	Установить персональные настройки	Встановити налаштування	Indiquez vos préférences	Cofigurar preferencias	기본 설정	環境設定を設定する	设置偏好
+MenuBar	Zoom In	Zoom In	Vergrößern	Stækka	Zoom in	Приблизить	Збільшити	Zoomer	Alejar	확대	ズームイン	放大
+MenuBar	Zoom Out	Zoom Out	Verkleinern	Minnka	Zoom out	Отдалить	Зменшити	Dézoomer	Alejar	축소	ズームアウト	缩小
 Mirrors	Reflect image	Reflect image	Muster spiegeln	Endurspegla mynd	Rifletti l'immagine	Отразить изображение	Відобразити зображення	Refléter l'image	Reflejar imagen	이미지 반영	イメージを反映する	倒映图像
 Mirrors	Add mirrors	Add mirrors	Spiegelungen hinzufügen	Spegla	Specchia	Добавить зеркальное отражение	Додати дзеркальне відображення	Miroirs	Agregar espejos	반영 추가	ミラーを追加するる	添加镜像
-Mirrors	Left	Left	Links	Vinstri	Sinistra	Лево	Ліворуч	Gauche	Izquierda	왼쪽	左	左
-Mirrors	Right	Right	Rechts	Hægri	Destra	Право	Праворуч	Droite	Derecha	오른쪽	右	右
-Mirrors	Top	Top	Oben	Efst	Sopra	Верх	Верх	Haut	Arriba	맨위	上	顶
-Mirrors	Bottom	Bottom	Unten	Neðst	Sotto	Низ	Низ	Bas	Abajo	맨아래	底	底
+Mirrors	Left	Left	Links	Vinstri	Sinistra	Слева	Ліворуч	Gauche	Izquierda	왼쪽	左	左
+Mirrors	Right	Right	Rechts	Hægri	Destra	Справа	Праворуч	Droite	Derecha	오른쪽	右	右
+Mirrors	Top	Top	Oben	Efst	Sopra	Сверху	Верх	Haut	Arriba	맨위	上	顶
+Mirrors	Bottom	Bottom	Unten	Neðst	Sotto	Снизу	Низ	Bas	Abajo	맨아래	底	底
 Mirrors	OK	OK	OK	Í lagi	Conferma	ОК	ОК	Confirmer	OK	예	オッケー	OK
 Prefs	Set Preferences	Set Preferences	Einstellungen festlegen	Setjið forstillingar	Imposta preferenze	Установить персональные настройки	Встановити налаштування	Indiquez vos préférences	Cofigurar preferencias	기본 설정	環境の設定を設定する	设置偏好
+Prefs	Machine	Machine	Maschine	Vél	Macchina	Машина	Машина	Machine	Máquina	기계	マシン	机器
 Prefs	Settings	Settings	Einstellungen	Stillingar	Impostazioni	Настройки	Налаштування	Paramètres	Ajustes	설정	設定	设置
 Prefs	Default Knitting Mode	Default Knitting Mode	Vorauswahl Strickmodus	Sjálfgefinn prjónahamur	Modalità di lavorazione automatica	Режим вязания по умолчанию	Режим в'язання за замовчуванням	Mode tricot par défaut	Método de tejer por defecto	기본 니팅 모드	デフォルトの編みモード	默认编织模式
+Prefs	Default Knit Side Image	Default Knit Side Image	Vorauswahl Spiegelbild	Mynd af vorauswahl	Immagine di lavorazione automatica	Отражать рисунок по умолчанию	Зображення в'язання за замовчуванням	Image miroir par défaut	Imagen espejo por defecto	기본 니트 사이드 이미지	デフォルトの編み側の画像	默认编织侧图像
 Prefs	Default Infinite Repeat	Default Infinite Repeat	Vorauswahl Unendlich wiederholen	Sjálfgefin endurtekning	Ripetizione automatica	Повторение по умолчанию	Нескінченне повторення за замовчуванням	Répétition a l'infini par défaut	Repetición por defecto infinita	기본 무한 반복	デフォルトの無限リピート	默认无限重复
 Prefs	Default Alignment	Default Alignment	Vorauswahl Ausrichtung	Sjálfgefin jöfnun	Allineamento automatico	Выравнивание по умолчанию	Вирівнювання за замовчуванням	Alignement par défaut	Alineación por defecto	기본 정렬	デフォルトの配置	默认对齐
 Prefs	Default Mirroring	Default Mirroring	Vorauswahl Spiegelung	Sjálfgefin speglun	Ribaltamento automatico	Зеркальное отображение по умолчанию	Дзеркальне відображення за замовчуванням	Image miroir par défaut	Reflejo por defecto	기본 미러링	デフォルトのミラーリング	默认镜像
+Prefs	Aspect Ratio	Aspect Ratio	Seitenverhältnis	Hlutfall myndarhlutfall	Rapporto d'aspetto	Отношение сторон	Співвідношення сторін	Rapport d'aspect	Relación de aspecto	비율	アスペクト比	宽高比
+Prefs	Disable Hardware Beep	Disable Hardware Beep	Hardware-Beep deaktivieren	Afvirkja hljóðkerfið	Disabilita segnale acustico	Отключить встроенный динамик	Вимкнути звуковий сигнал	Désactiver le bip	Desactivar pitido	하드웨어 비프음 끄기	ハードウェアビープを無効にする	禁用硬件蜂鸣
+Prefs	Lower Display Stitch Width	Lower Display Stitch Width	Anzeige der Maschenbreite verringern	Lækka breidd myndarhlutfalls	Abbassa larghezza immagine	Ширина стежка в нижнем окне	Зменшити ширину зображення	Réduire la largeur de l'image	Disminuir el ancho de la imagen	하단 디스플레이 스티치 너비 줄이기	下部ディスプレイステッチ幅を下げる	降低显示针宽度
 Prefs	Quiet Mode	Quiet Mode	Lautlos	Hljóðlaus stilling	Modalità silenziosa	Без звука	Режим без звуку	Mode silencieux	Modo silencioso	저소음 모드	静穏モード	静默模式
 Prefs	Language	Language	Sprache	Tungumál	Lingua	Язык	Мова	Langue	Lenguaje	언어	言語	语言
 Prefs	OK	OK	OK	Í lagi	Conferma	ОК	ОК	Confirmer	OK	예	オッケー	OK
@@ -80,6 +91,7 @@ Progress	Progress	Progress	Fortschritt	Staða	Progressione	Прогресс	Пр
 KnitProgress	Row	Row	Zeile	Umferð	Giro	Ряд	Ряд	Rang	Fila	단	段	行
 KnitProgress	Pass	Pass	Durchgang	Endurtekning	Passa	Пройти	Пропуск	Passage	Paso	통과	渡す	通过
 KnitProgress	Color	Colour	Farbe	Litur	Colore	Цвет	Колір	Couleur	Color	색상	色	颜色
+KnitProgress	To Be Selected	To Be Selected	Auswählen	Þarf að velja	Selezionare	Иглы к выбору	Вибрати	À sélectionner	Por seleccionar	선택할 것	選択する	待选
 NeedleColor	green	green	grün	grænn	verde	зелёный (зеленый)	зелений	vert	verde	녹색	みどり	绿
 NeedleColor	orange	orange	orange	appelsínugulur	arancione	оранжевый	помаранчевий	orange	naranja	오렌지색	オレンジ	橙
 KnitMode	Singlebed	Singlebed	Einzelbett	Eitt borð	Frontura singola	Однофонтурное вязание	Однофонтурне	Fonture simple	Frontura simple	싱글 배드	シングルベッド	单主机
@@ -87,20 +99,19 @@ KnitMode	Ribber: Classic	Ribber: Classic	Doppelbett: Klassisch	Ribber: Klassísk
 KnitMode	Ribber: Middle-Colors-Twice	Ribber: Middle-Colours-Twice	Doppelbett: Middle-Colors-Twice	Ribber: Miðlitur-Tvisvar	2a Frontura: Middle-Colors-Twice	двухфонтурное: Средний-цвет-дважды	Двофонтурне: Подвоєння середнього кольору	2ème Fonture: Middle-Colors-Twice	Doble frontura: Colores medios dos veces	고무단중간-색-두번		罗纹副机：Middle-Colors-Twice
 KnitMode	Ribber: Heart of Pluto	Ribber: Heart of Pluto	Doppelbett: Heart of Pluto	Ribber: Heart of Pluto	2a Frontura: Heart of Pluto	двухфонтурное: сердце Плутона	Двофонтурне: серце Плутона	2ème Fonture: Heart of Pluto	Doble frontura: Heart of Pluto	고무단 Heart of Pluto		罗纹副机：冥王之心
 KnitMode	Ribber: Circular	Ribber: Circular	Doppelbett: Rundstricken	Ribber: Hringuprjón	2a Frontura: Circolare	двухфонтурное: Круговое	Двофонтурне: По колу	2ème Fonture: Circulaire	Doble frontura: Circular	고무단원형		罗纹副机：圆织
-Alignment	Center	Centre	Zentriert	Miðja	Centra	Центр	Центр	Centre	Centrar	중앙	中心	中心
-Alignment	Left	Left	Links	Vinstri	Sinistra	Лево	Ліворуч	Gauche	Izquierda	왼쪽	左	左
-Alignment	Right	Right	Rechts	Hægri	Destra	Право	Праворуч	Droite	Derecha	오른쪽	右	右
+Alignment	Center	Centre	Zentriert	Miðja	Centra	По центру	Центр	Centre	Centrar	중앙	中心	中心
+Alignment	Left	Left	Links	Vinstri	Sinistra	Слева	Ліворуч	Gauche	Izquierda	왼쪽	左	左
+Alignment	Right	Right	Rechts	Hægri	Destra	Справа	Праворуч	Droite	Derecha	오른쪽	右	右
 KnitEngine	Simulation	Simulation	Simulation	Hermir	Simulazione	Моделирование	Моделювання	Simulation	Simulación	시뮬레이션	シミュレーション	模拟
-KnitEngine	You need to set an image.	You need to set an image.	Bitte Muster wählen.	Þú verður að hlaða mynd.	Devi impostare un'immagine.	Вам нужно установить изображение.	Виберіть зображення.	Choisissez une image pour continuer.	Necesitar configurar una imagen.	이미지를 설정하세요.	イメージを設置する必要があります。	你需要设置一个图像。
-KnitEngine	Invalid needle start and end.	Invalid needle start and end.	Ungültige Startnadel oder Endnadel.	Röng upphafs- og enda-nál.	Ago iniziale e finale invalidi.	Недопустимое начало или конец иглы.	Неправильна стартова або кінцева голка.	Erreur sur la première et dernière aiguille du tricot.	Inicio y fin de la aguja no válidos.	바늘 시작이나 끝이 잘못 됐습니다.	無効な針の開始と終了	无效的织针起始和结束。
-KnitEngine	Start row is larger than the image.	Start row is larger than the image.	Die Startzeile ist höher als das Muster.	Byrjunaröð er stærri en mynd.	Il giro d'inizio è più grande dell'immagine.	Начальный ряд больше изображения.	Початковий ряд більший за зображення.	Le premier rang est plus grand que l'image.	La fila de inicio es más grande que la imagen.	시작 단이 이미지보다 큼니다.	イメージより開始段が大きいです	起始行比图像大。
-KnitEngine	Please choose a valid port.	Please choose a valid port.	Bitte wählen Sie einen gültigen Port.	Veljið rétt tengi.	Scegli una porta seriale valida.	Пожалуйста, выберите действующий порт.	Виберіть дійсний порт.	Veuillez choisir un port valide.	Elija un puerto válido.	유효한 포트를 선택하세요.	有効なポートを選んでください	请选择一个有效端口。
-KnitEngine	Single bed knitting currently supports only 2 colors.	Single bed knitting currently supports only 2 colours.	Einzelbettstricken unterstützt nur 2 Farben.	Stilling styður bara tvo liti.	La lavorazione in frontura singola supporta solo 2 colori.	Однофонтурное вязание поддерживает только двухцветное вязание.	Однофонтурне в'язання підтримує лише 2 кольори.	Le tricot en simple fonture est limité à deux couleurs.	El tejido de una frontura actualmente solo soporta 2 colores.	싱글배드 니팅은 2가지 색만 지원합니다.	現在、シングルベッド編み物は２色のみサとなります。	单主机编织当前只支持双色。
-KnitEngine	Circular knitting supports only 2 colors.	Circular knitting supports only 2 colours.	Rundstricken unterstützt nur 2 Farben.	Hringprjón styður bara tvo liti.	La lavorazione circolare supporta solo 2 colori.	Круговое вязание поддерживает только двухцветное вязание.	В'язання по колу підтримує лише 2 кольори.	Le mode tricot circulaire est limité à deux couleurs.	Tejido circular soporta solo 2 colores.	원형 니팅은 2가지 색만 지원합니다.	丸編みは２色のみとなります。	圆织只支持双色。
-KnitEngine	Connecting to machine...	Connecting to machine...	Verbinde zur Maschine...	Tengist vél...	Connessione in corso…	Подключение к машине.	Підключення до машини...	Connection en cours...	Conexión a la máquina.	기계에 연결 중...	機械に接続しています…	正在连接机器…
-KnitEngine	Please start machine. (Set the carriage to mode KC-I or KC-II and move the carriage over the left turn mark).	Please start machine. (Set the carriage to mode KC-I or KC-II and move the carriage over the left turn mark).	Bitte starten Sie die Maschine. (Stellen Sie den Schlitten auf KC-I oder KC-II und bewegen Sie den Schlitten über die linke Umkehrmarke.)	Kveikið á vélinni. (Stillið vagninn á KC-I eða KC-II og færið vagninn til vinstri yfir skynjarann).	Avvia la macchina. (Imposta il carrello su KC-I o KC-II e sposta il carrello oltre il segno sinistro d'inizio.)	Пожалуйста, включите машину. (установите каретку в положение КС-1 или КС-2 и переведите каретку влево за датчик).	Будь ласка, запустіть машину. (Налаштуйте каретку на KC-I або KC-II і перемістіть каретку ліворуч за датчик.)	Veuillez démarrer la machine. (Mettre le chariot sur le mode KC-I ou KCII et le placer sur le côté gauche).	Por favor, inicie la máquina. (Ajuste el carro al modo KC-I o KC-II y mueva el carro sobre la marca de giro a la izquierda).	기계를 시작하세요.(캐리지의 체인지놉을 KC-I 또는 KC-II로 설정하고 캐리지를 왼쪽 센서 넘어로 이동).	機械を起動してください。（キャリジをKC IかKC II　モードに設定して、キャリジを左折マークを超えて移動します。　	请启动机器（将机头设为KC-I或KC-II模式后左移到机床的返回标上）。
-KnitEngine	Wrong Arduino firmware version. Please check that you have flashed the latest version.	Wrong Arduino firmware version. Please check that you have flashed the latest version.	Falsche Arduino-Firmware-Version.	Röng Arduino hugbúnaðarútgáfa. Vinsamlegast kannið hvort þú hafir nýjustu útgáfuna.	Versione del firmware di Arduino errata. Controlla di aver eseguito correttamente il flash all'ultima versione.	Неправильная прошивка версии андурино. Пожалуйста, проверьте что Вы установили последюю версию.	Неправильна версія прошивки Arduino. Перевірте, чи встановлено останню версію.	Mauvaise version du firmware Arduino. Vérifiez que vous avez la dernière version.	Versión incorrecta del firmware de Arduino. Por favor, compruebe que ha flasheado la última versión.	아두이노 펌웨가 문제가 있습니다. 최신 버전인지 체크해 주세요.	Arduinoファームウェアバージョンが間違っています。最新バージョンをフラシュしていることを確認てください。	错误的Arduino固件版本，请确认已经刷到最新版本。
-KnitEngine	Please knit.	Please knit.	Bitte fangen Sie an zu stricken.	Vinsamlegast prjónið.	Inizia il lavoro.	Вяжите пожалуйста.	В'яжіть будь-ласка.	Commencez le tricot.	Comience a tejer.	니트 시작	編んでください。	请编织。
-KnitEngine	Device not ready, try again.	Device not ready, try again.	Gerät nicht bereit, bitte versuchen Sie es erneut.	Tækið ekki tilbúið, reyndu aftur.	Il dispositivo non è pronto, riprova.	Устройство не отвечает, повторите попытку.	Пристрій не готовий. Повторіть спробу.	La machine n'est pas prête, essayez encore.	Dispositivo no listo, inténtelo de nuevo.	장비가 준비 되지 않았음. 다시 시도.	デバイスの準備ができていません。もう一度お試しください。	设备尚未准备好，请再试。
-KnitEngine	Image transmission finished. Please knit until you hear the double beep sound.	Image transmission finished. Please knit until you hear the double beep sound.	Musterübertragung beendet. Bitte stricken Sie, bis Sie den doppelten Piepton hören.	Myndhleðslu lokið. Prjónið þangað til þú heyrir tvöfalt píphljóð.	Trasferimento dell'immagine finito. Lavora finché senti il doppio bip.	Передача изображения завершена. Вяжите после того как услышите двойной звуковой сигнал.	Передачу зображення завершено. Будь ласка, в'яжіть, поки не почуєте подвійний звуковий сигнал.	Image transmise. Tricotez jusqu'à ce que vous entendiez un double bip.	Transmisión de imagen terminada. Por favor, tejer hasta que escuche el sonido de doble pitido.	이미지 전송이 완료 됐습니다. 삐소리가 2번 들릴 때까지 뜨세요.	イメージの送信が完了しました。 「ピー」という音が2回聞こえるまで編んでください。	图像转换结束，请编织直至听到两次哔声。
-KnitEngine	Knitting canceled.	Knitting cancelled.	Stricken abgebrochen.	Hætt við prjón.	Lavorazione eliminata.	Вязание завершено.	В’язання скасовано.	Annulation du tricot.	Tejido de punto cancelado.	니팅을 취소합니다.	編み物がキャンセルしました。	编织已取消。
+Notifications	Invalid needle start and end.	Invalid needle start and end.	Ungültige Startnadel oder Endnadel.	Röng upphafs- og enda-nál.	Ago iniziale e finale invalidi.	Неправильная начальная или конечная игла	Неправильна стартова або кінцева голка.	Erreur sur la première et dernière aiguille du tricot.	Inicio y fin de la aguja no válidos.	바늘 시작이나 끝이 잘못 됐습니다.	無効な針の開始と終了	无效的织针起始和结束。
+Notifications	Start row is larger than the image.	Start row is larger than the image.	Die Startzeile ist höher als das Muster.	Byrjunaröð er stærri en mynd.	Il giro d'inizio è più grande dell'immagine.	Начальный ряд больше изображения.	Початковий ряд більший за зображення.	Le premier rang est plus grand que l'image.	La fila de inicio es más grande que la imagen.	시작 단이 이미지보다 큼니다.	イメージより開始段が大きいです	起始行比图像大。
+Notifications	Please choose a valid port.	Please choose a valid port.	Bitte wählen Sie einen gültigen Port.	Veljið rétt tengi.	Scegli una porta seriale valida.	Пожалуйста, выберите действующий порт.	Виберіть дійсний порт.	Veuillez choisir un port valide.	Elija un puerto válido.	유효한 포트를 선택하세요.	有効なポートを選んでください	请选择一个有效端口。
+Notifications	Single bed knitting currently supports only 2 colors.	Single bed knitting currently supports only 2 colours.	Einzelbettstricken unterstützt nur 2 Farben.	Stilling styður bara tvo liti.	La lavorazione in frontura singola supporta solo 2 colori.	Однофонтурное вязание поддерживает только двухцветное вязание.	Однофонтурне в'язання підтримує лише 2 кольори.	Le tricot en simple fonture est limité à deux couleurs.	El tejido de una frontura actualmente solo soporta 2 colores.	싱글배드 니팅은 2가지 색만 지원합니다.	現在、シングルベッド編み物は２色のみサとなります。	单主机编织当前只支持双色。
+Notifications	Circular knitting supports only 2 colors.	Circular knitting supports only 2 colours.	Rundstricken unterstützt nur 2 Farben.	Hringprjón styður bara tvo liti.	La lavorazione circolare supporta solo 2 colori.	Круговое вязание поддерживает только двухцветное вязание.	В'язання по колу підтримує лише 2 кольори.	Le mode tricot circulaire est limité à deux couleurs.	Tejido circular soporta solo 2 colores.	원형 니팅은 2가지 색만 지원합니다.	丸編みは２色のみとなります。	圆织只支持双色。
+Notifications	Connecting to machine...	Connecting to machine...	Verbinde zur Maschine...	Tengist vél...	Connessione in corso…	Подключение к машине.	Підключення до машини...	Connection en cours...	Conexión a la máquina.	기계에 연결 중...	機械に接続しています…	正在连接机器…
+Notifications	Please start machine. (Set the carriage to mode KC-I or KC-II and move the carriage over the left turn mark).	Please start machine. (Set the carriage to mode KC-I or KC-II and move the carriage over the left turn mark).	Bitte starten Sie die Maschine. (Stellen Sie den Schlitten auf KC-I oder KC-II und bewegen Sie den Schlitten über die linke Umkehrmarke.)	Kveikið á vélinni. (Stillið vagninn á KC-I eða KC-II og færið vagninn til vinstri yfir skynjarann).	Avvia la macchina. (Imposta il carrello su KC-I o KC-II e sposta il carrello oltre il segno sinistro d'inizio.)	Пожалуйста, включите машину. (установите каретку в положение КС-1 или КС-2 и переведите каретку влево за датчик).	Будь ласка, запустіть машину. (Налаштуйте каретку на KC-I або KC-II і перемістіть каретку ліворуч за датчик.)	Veuillez démarrer la machine. (Mettre le chariot sur le mode KC-I ou KCII et le placer sur le côté gauche).	Por favor, inicie la máquina. (Ajuste el carro al modo KC-I o KC-II y mueva el carro sobre la marca de giro a la izquierda).	기계를 시작하세요.(캐리지의 체인지놉을 KC-I 또는 KC-II로 설정하고 캐리지를 왼쪽 센서 넘어로 이동).	機械を起動してください。（キャリジをKC IかKC II　モードに設定して、キャリジを左折マークを超えて移動します。　	请启动机器（将机头设为KC-I或KC-II模式后左移到机床的返回标上）。
+Notifications	Wrong Arduino firmware version. Please check that you have flashed the latest version.	Wrong Arduino firmware version. Please check that you have flashed the latest version.	Falsche Arduino-Firmware-Version.	Röng Arduino hugbúnaðarútgáfa. Vinsamlegast kannið hvort þú hafir nýjustu útgáfuna.	Versione del firmware di Arduino errata. Controlla di aver eseguito correttamente il flash all'ultima versione.	Неправильная прошивка версии ардуино. Пожалуйста, проверьте что Вы установили последюю версию.	Неправильна версія прошивки Arduino. Перевірте, чи встановлено останню версію.	Mauvaise version du firmware Arduino. Vérifiez que vous avez la dernière version.	Versión incorrecta del firmware de Arduino. Por favor, compruebe que ha flasheado la última versión.	아두이노 펌웨가 문제가 있습니다. 최신 버전인지 체크해 주세요.	Arduinoファームウェアバージョンが間違っています。最新バージョンをフラシュしていることを確認てください。	错误的Arduino固件版本，请确认已经刷到最新版本。
+Notifications	Please knit.	Please knit.	Bitte fangen Sie an zu stricken.	Vinsamlegast prjónið.	Inizia il lavoro.	Вяжите, пожалуйста.	В'яжіть будь-ласка.	Commencez le tricot.	Comience a tejer.	니트 시작	編んでください。	请编织。
+Notifications	Device not ready, try again.	Device not ready, try again.	Gerät nicht bereit, bitte versuchen Sie es erneut.	Tækið ekki tilbúið, reyndu aftur.	Il dispositivo non è pronto, riprova.	Устройство не отвечает, повторите попытку.	Пристрій не готовий. Повторіть спробу.	La machine n'est pas prête, essayez encore.	Dispositivo no listo, inténtelo de nuevo.	장비가 준비 되지 않았음. 다시 시도.	デバイスの準備ができていません。もう一度お試しください。	设备尚未准备好，请再试。
+Notifications	Image transmission finished. Please knit until you hear the double beep sound.	Image transmission finished. Please knit until you hear the double beep sound.	Musterübertragung beendet. Bitte stricken Sie, bis Sie den doppelten Piepton hören.	Myndhleðslu lokið. Prjónið þangað til þú heyrir tvöfalt píphljóð.	Trasferimento dell'immagine finito. Lavora finché senti il doppio bip.	Передача изображения завершена. Вяжите после того как услышите двойной звуковой сигнал.	Передачу зображення завершено. Будь ласка, в'яжіть, поки не почуєте подвійний звуковий сигнал.	Image transmise. Tricotez jusqu'à ce que vous entendiez un double bip.	Transmisión de imagen terminada. Por favor, tejer hasta que escuche el sonido de doble pitido.	이미지 전송이 완료 됐습니다. 삐소리가 2번 들릴 때까지 뜨세요.	イメージの送信が完了しました。 「ピー」という音が2回聞こえるまで編んでください。	图像转换结束，请编织直至听到两次哔声。
+Notifications	Knitting canceled.	Knitting cancelled.	Stricken abgebrochen.	Hætt við prjón.	Lavorazione eliminata.	Вязание завершено	В’язання скасовано.	Annulation du tricot.	Tejido de punto cancelado.	니팅을 취소합니다.	編み物がキャンセルしました。	编织已取消。


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>src/main/python/main/ayab/engine/hw_test_communication_mock.py (1)</summary><blockquote>

`64-64`: **Code and comment mismatch in message retrieval method**

The code now uses `pop()` which implements LIFO (Last In, First Out) behavior, but the comment still says "FIFO". This could lead to confusion when maintaining the code.

```diff
-        res = self.rx_msg_list.pop()  # FIFO
+        res = self.rx_msg_list.pop()  # LIFO
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 95d480dd84117032f2e8331cdb8c02624fbab6f9 and 05cc752f50807d58dfc11aae910f95abdc557092.

</details>

<details>
<summary>⛔ Files ignored due to path filters (1)</summary>

* `src/main/resources/base/ayab/translations/ayab-translation-master.tsv` is excluded by `!**/*.tsv`

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `src/main/python/main/ayab/engine/hw_test_communication_mock.py` (1 hunks)
* `src/main/python/main/ayab/engine/options.py` (1 hunks)
* `src/main/python/main/ayab/knitprogress.py` (2 hunks)
* `src/main/python/main/ayab/signal_sender.py` (1 hunks)

</details>

<details>
<summary>🔇 Additional comments (4)</summary><blockquote>

<details>
<summary>src/main/python/main/ayab/engine/options.py (1)</summary>

`247-247`: **Grammatical correction improves clarity**

The spacing in "Single bed knitting" has been fixed, improving readability for users and ensuring consistency in error messages.

</details>
<details>
<summary>src/main/python/main/ayab/signal_sender.py (1)</summary>

`111-111`: **Improved translation context for notification messages**

Changing the translation context from "AyabPlugin" to "Notifications" provides a more appropriate categorization for these messages, making the translation process more organized and maintainable. This change will help ensure consistent translations across the application.



Also applies to: 119-119, 124-124

</details>
<details>
<summary>src/main/python/main/ayab/knitprogress.py (2)</summary>

`155-160`: **Added localization support for "To Be Selected" text**

The header text is now properly wrapped in a translation function, enabling proper localization in different languages. This is a good improvement for internationalization.

---

`272-279`: **Fixed potential NoneType error in onStitchSelect method**

The code now properly checks if the header item is not None before attempting to access its foreground color, preventing potential runtime errors. Additionally, the selection string formatting has been improved to handle cases where the header might be None.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-15T15:19:23Z
user: login: jonathanperret
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-15T15:21:52Z
user: login: dl1com
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-15T15:24:34Z

Review comments:
diff_hunk: @@ -61,7 +61,7 @@ def read_API6(self):
         if len(self.rx_msg_list) == 0:
             return None
         # else
-        res = self.rx_msg_list.popleft()  # FIFO
path: src/main/python/main/ayab/engine/hw_test_communication_mock.py
user: login: jonathanperret
body: Oops, I didn't mean for this to go into this PR, it's a partial fix for the fact that the Test dialog doesn't open in Simulation mode. No harm in keeping it here though.
created_at: 2025-03-15T15:21:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -61,7 +61,7 @@ def read_API6(self):
         if len(self.rx_msg_list) == 0:
             return None
         # else
-        res = self.rx_msg_list.popleft()  # FIFO
path: src/main/python/main/ayab/engine/hw_test_communication_mock.py
user: login: dl1com
body: Sneaky fix
created_at: 2025-03-15T15:24:33Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-03-13T20:11:19Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

This pull request updates several parts of the codebase. In the hardware test communication mock, the message retrieval method now uses LIFO retrieval instead of FIFO. A minor grammatical fix is made in the options validation error message. In the knit progress module, a hardcoded string is replaced by a translatable call, and additional checks are introduced to avoid null header errors. The signal sender file’s translation context is also updated, ensuring consistency in how localized strings are handled.

## Changes

| File(s) | Change Summary |
|---------|----------------|
| `src/main/.../ayab/engine/hw_test_communication_mock.py` | Updated `read_API6` to use `pop()` instead of `popleft()`, changing the message retrieval order from FIFO to LIFO. |
| `src/main/.../ayab/engine/options.py` | Corrected the error message in the `validate` method by inserting a space in "Single bed knitting..." for grammatical accuracy. |
| `src/main/.../ayab/knitprogress.py`, `src/main/.../ayab/signal_sender.py` | In **knitprogress.py**, replaced a hardcoded header string with a call to `QCoreApplication.translate` and added a check for a non-None header in `onStitchSelect`. In **signal_sender.py**, updated the translation context from `"AyabPlugin"` to `"Notifications"`. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant KnitProgress
    participant Header

    User->>KnitProgress: Select a stitch (onStitchSelect event)
    KnitProgress->>Header: Retrieve horizontal header item
    alt Header exists
        KnitProgress->>Header: Check header foreground color
        KnitProgress->>KnitProgress: Determine side and build selection string
    else Header is None
        KnitProgress->>KnitProgress: Handle missing header gracefully
    end
```

## Possibly related PRs

- **AllYarnsAreBeautiful/ayab-desktop#693**: Modified the `hw_test_communication_mock.py` file to adjust command processing order, which relates to the change from FIFO to LIFO message retrieval in this PR.

<!-- walkthrough_end -->

<!-- announcements_start -->

> [!TIP]
> <details>
> <summary>⚡🧪 Multi-step agentic review comment chat (experimental)</summary>
> 
> - We're introducing multi-step agentic chat in review comments. This experimental feature enhances review discussions with the CodeRabbit agentic chat by enabling advanced interactions, including the ability to create pull requests directly from comments.
> 						- To enable this feature, set early_access to true under in the settings.
> 
> </details>

<!-- announcements_end -->

---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 05cc752f50807d58dfc11aae910f95abdc557092 and d44e8102653f2b4131686d066cabd61ffab3d5f9.

</details>

<details>
<summary>⛔ Files ignored due to path filters (1)</summary>

* `src/main/resources/base/ayab/translations/ayab-translation-master.tsv` is excluded by `!**/*.tsv`

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `src/main/python/main/ayab/engine/hw_test_communication_mock.py` (1 hunks)
* `src/main/python/main/ayab/engine/options.py` (1 hunks)
* `src/main/python/main/ayab/knitprogress.py` (2 hunks)
* `src/main/python/main/ayab/signal_sender.py` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (4)</summary>

* src/main/python/main/ayab/engine/options.py
* src/main/python/main/ayab/signal_sender.py
* src/main/python/main/ayab/engine/hw_test_communication_mock.py
* src/main/python/main/ayab/knitprogress.py

</details>

</details>
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=AllYarnsAreBeautiful/ayab-desktop&utm_content=766):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: sonarqubecloud[bot]
created_at: 2025-03-15T15:24:31Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=AllYarnsAreBeautiful_ayab-desktop&pullRequest=766) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=AllYarnsAreBeautiful_ayab-desktop&pullRequest=766&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=AllYarnsAreBeautiful_ayab-desktop&pullRequest=766&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=AllYarnsAreBeautiful_ayab-desktop&pullRequest=766&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=AllYarnsAreBeautiful_ayab-desktop&pullRequest=766&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=AllYarnsAreBeautiful_ayab-desktop&pullRequest=766&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=AllYarnsAreBeautiful_ayab-desktop&pullRequest=766)


author_association: NONE