Code refactoring for better maintainability

This commit is contained in:
Lam Wei Lun
2026-09-11 17:15:57 +08:00
parent c57b74731e
commit 966e029b95
36 changed files with 938 additions and 517 deletions
+18 -6
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -5035,16 +5035,13 @@ msgstr ""
msgid "System agents"
msgstr ""
msgid "No plugin selected"
msgstr ""
msgid "Add plugin"
msgstr ""
msgid "Select plugin"
msgid "Remove plugin"
msgstr ""
msgid "Remove plugin"
msgid "No plugin selected"
msgstr ""
msgid "Configure"
@@ -7197,6 +7194,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr ""
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
msgid "Plugin Selection"
msgstr ""
@@ -8591,6 +8594,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr ""
+24 -9
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2025-03-15 10:55+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -5473,22 +5473,18 @@ msgstr "Format no vàlid. Format vectorial esperat: \"%1%\""
msgid "System agents"
msgstr "Agents del sistema"
# AI Translated
msgid "No plugin selected"
msgstr "Cap connector seleccionat"
# AI Translated
msgid "Add plugin"
msgstr "Afegir connector"
# AI Translated
msgid "Select plugin"
msgstr "Seleccionar connector"
# AI Translated
msgid "Remove plugin"
msgstr "Eliminar connector"
# AI Translated
msgid "No plugin selected"
msgstr "Cap connector seleccionat"
# AI Translated
msgid "Configure"
msgstr "Configurar"
@@ -7723,6 +7719,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Inferior"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Selecció de connectors"
@@ -9259,6 +9261,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Finestra emergent per seleccionar el mode d'agrupació de filaments"
@@ -22233,6 +22244,10 @@ msgstr ""
"Evitar la deformació( warping )\n"
"Sabíeu que quan imprimiu materials propensos a deformar-se, com ara l'ABS, augmentar adequadament la temperatura del llit pot reduir la probabilitat de deformació?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Seleccionar connector"
#~ msgid "Select the language"
#~ msgstr "Seleccioneu l'idioma"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: \n"
"Last-Translator: Jakub Hencl\n"
"Language-Team: \n"
@@ -5430,22 +5430,18 @@ msgstr "Neplatný formát. Očekávaný vektorový formát: \"%1%\""
msgid "System agents"
msgstr "Systémoví agenti"
# AI Translated
msgid "No plugin selected"
msgstr "Není vybrán žádný plugin"
# AI Translated
msgid "Add plugin"
msgstr "Přidat plugin"
# AI Translated
msgid "Select plugin"
msgstr "Vybrat plugin"
# AI Translated
msgid "Remove plugin"
msgstr "Odebrat plugin"
# AI Translated
msgid "No plugin selected"
msgstr "Není vybrán žádný plugin"
# AI Translated
msgid "Configure"
msgstr "Konfigurovat"
@@ -7690,6 +7686,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Spodní"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Výběr pluginů"
@@ -9213,6 +9215,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Zobrazit dialog pro výběr režimu seskupení filamentů"
@@ -22214,6 +22225,10 @@ msgstr ""
"Zamezte kroucení\n"
"Víte, že při tisku materiálů náchylných ke kroucení, jako je ABS, může vhodné zvýšení teploty vyhřívané desky snížit pravděpodobnost kroucení?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Vybrat plugin"
#~ msgid "Select the language"
#~ msgstr "Zvolte jazyk"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: \n"
"Last-Translator: Heiko Liebscher <hliebschergmail.com>\n"
"Language-Team: \n"
@@ -5335,22 +5335,18 @@ msgstr "Ungültiges Format. Erwartetes Vektorformat: \"%1%\""
msgid "System agents"
msgstr "Systemagenten"
# AI Translated
msgid "No plugin selected"
msgstr "Kein Plugin ausgewählt"
# AI Translated
msgid "Add plugin"
msgstr "Plugin hinzufügen"
# AI Translated
msgid "Select plugin"
msgstr "Plugin auswählen"
# AI Translated
msgid "Remove plugin"
msgstr "Plugin entfernen"
# AI Translated
msgid "No plugin selected"
msgstr "Kein Plugin ausgewählt"
# AI Translated
msgid "Configure"
msgstr "Konfigurieren"
@@ -7560,6 +7556,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Untere"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Plugin-Auswahl"
@@ -9084,6 +9086,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Popup zum Auswählen des Filament-Gruppierungsmodus"
@@ -21634,6 +21645,10 @@ msgstr ""
"Verwerfungen vermeiden\n"
"Wussten Sie, dass beim Drucken von Materialien, die zu Verwerfungen neigen, wie z.B. ABS, durch eine entsprechende Erhöhung der Heizbetttemperatur die Wahrscheinlichkeit von Verwerfungen verringert werden kann?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Plugin auswählen"
#~ msgid "Select the language"
#~ msgstr "Sprache wählen"
+18 -6
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2026-06-17 15:44-0300\n"
"Last-Translator: Alexandre Folle de Menezes\n"
"Language-Team: \n"
@@ -5031,16 +5031,13 @@ msgstr ""
msgid "System agents"
msgstr ""
msgid "No plugin selected"
msgstr ""
msgid "Add plugin"
msgstr ""
msgid "Select plugin"
msgid "Remove plugin"
msgstr ""
msgid "Remove plugin"
msgid "No plugin selected"
msgstr ""
msgid "Configure"
@@ -7193,6 +7190,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr ""
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
msgid "Plugin Selection"
msgstr ""
@@ -8587,6 +8590,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr ""
+22 -7
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: \n"
"Last-Translator: Ian A. Bassi <>\n"
"Language-Team: \n"
@@ -5198,18 +5198,15 @@ msgstr "Formato inválido. Formato de vector esperado: \"%1%\""
msgid "System agents"
msgstr "Agentes del sistema"
msgid "No plugin selected"
msgstr "Ningún plugin seleccionado"
msgid "Add plugin"
msgstr "Añadir plugin"
msgid "Select plugin"
msgstr "Seleccionar plugin"
msgid "Remove plugin"
msgstr "Eliminar plugin"
msgid "No plugin selected"
msgstr "Ningún plugin seleccionado"
msgid "Configure"
msgstr "Configurar"
@@ -7405,6 +7402,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Inferior"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
msgid "Plugin Selection"
msgstr "Selección de plugins"
@@ -8851,6 +8854,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Ventana emergente para seleccionar el modo de agrupación de filamentos"
@@ -21180,6 +21192,9 @@ msgstr ""
"Evita la deformación\n"
"¿Sabías que al imprimir materiales propensos a la deformación como el ABS, aumentar adecuadamente la temperatura de la cama térmica puede reducir la probabilidad de deformaciones?"
#~ msgid "Select plugin"
#~ msgstr "Seleccionar plugin"
#~ msgid "Select the language"
#~ msgstr "Seleccionar el idioma"
+22 -7
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2026-07-20 13:33+0200\n"
"Last-Translator: Manu Goiogana <mgoiogana@gmail.com>\n"
"Language-Team: \n"
@@ -5247,18 +5247,15 @@ msgstr "Formatuak ez du balio. Espero den formatu bektoriala: \"%1%\""
msgid "System agents"
msgstr "Sistema-agenteak"
msgid "No plugin selected"
msgstr "Ez da pluginik hautatu"
msgid "Add plugin"
msgstr "Gehitu plugina"
msgid "Select plugin"
msgstr "Hautatu plugina"
msgid "Remove plugin"
msgstr "Kendu plugina"
msgid "No plugin selected"
msgstr "Ez da pluginik hautatu"
msgid "Configure"
msgstr "Konfiguratu"
@@ -7452,6 +7449,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Behea"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
msgid "Plugin Selection"
msgstr "Plugin-hautaketa"
@@ -8932,6 +8935,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Erakutsi filamentuak taldekatzeko modua hautatzeko leihoa"
@@ -21367,6 +21379,9 @@ msgstr ""
"Saihestu okertzea\n"
"Ba al zenekien ABS bezalako okertzeko joera duten materialak inprimatzean ohe beroaren tenperatura egoki igotzeak okertzeko probabilitatea murriztu dezakeela?"
#~ msgid "Select plugin"
#~ msgstr "Hautatu plugina"
#~ msgid "Select the language"
#~ msgstr "Hautatu hizkuntza"
+24 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: Guislain Cyril, Thomas Lété\n"
@@ -5285,22 +5285,18 @@ msgstr "Format invalide. Format vectoriel attendu : \"%1%\""
msgid "System agents"
msgstr "Agents système"
# AI Translated
msgid "No plugin selected"
msgstr "Aucun plugin sélectionné"
# AI Translated
msgid "Add plugin"
msgstr "Ajouter un plugin"
# AI Translated
msgid "Select plugin"
msgstr "Sélectionner un plugin"
# AI Translated
msgid "Remove plugin"
msgstr "Supprimer le plugin"
# AI Translated
msgid "No plugin selected"
msgstr "Aucun plugin sélectionné"
# AI Translated
msgid "Configure"
msgstr "Configurer"
@@ -7503,6 +7499,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Inférieur"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Sélection des plugins"
@@ -9000,6 +9002,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Fenêtre contextuelle pour sélectionner le mode de regroupement des filaments"
@@ -21524,6 +21535,10 @@ msgstr ""
"Éviter la déformation\n"
"Saviez-vous que lors de l’impression de matériaux susceptibles de se déformer, tels que l’ABS, une augmentation appropriée de la température du plateau chauffant peut réduire la probabilité de déformation?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Sélectionner un plugin"
#~ msgid "Select the language"
#~ msgstr "Sélectionner la langue"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -5382,22 +5382,18 @@ msgstr "Érvénytelen formátum. Elvárt vektor formátum: \"%1%\""
msgid "System agents"
msgstr "Rendszerügynökök"
# AI Translated
msgid "No plugin selected"
msgstr "Nincs kiválasztott bővítmény"
# AI Translated
msgid "Add plugin"
msgstr "Bővítmény hozzáadása"
# AI Translated
msgid "Select plugin"
msgstr "Bővítmény kiválasztása"
# AI Translated
msgid "Remove plugin"
msgstr "Bővítmény eltávolítása"
# AI Translated
msgid "No plugin selected"
msgstr "Nincs kiválasztott bővítmény"
# AI Translated
msgid "Configure"
msgstr "Konfigurálás"
@@ -7617,6 +7613,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Alsó"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Bővítmény kiválasztása"
@@ -9136,6 +9138,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Felugró ablak a filamentcsoportosítási mód kiválasztásához"
@@ -21955,6 +21966,10 @@ msgstr ""
"Kunkorodás elkerülése\n"
"Tudtad, hogy a kunkorodásra hajlamos anyagok (például ABS) nyomtatásakor az asztal hőmérsékletének növelése csökkentheti a kunkorodás valószínűségét?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Bővítmény kiválasztása"
#~ msgid "Select the language"
#~ msgstr "Válaszd ki a nyelvet"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -5383,22 +5383,18 @@ msgstr "Formato non valido. Formato vettoriale previsto: \"%1%\""
msgid "System agents"
msgstr "Agenti di sistema"
# AI Translated
msgid "No plugin selected"
msgstr "Nessun plugin selezionato"
# AI Translated
msgid "Add plugin"
msgstr "Aggiungi plugin"
# AI Translated
msgid "Select plugin"
msgstr "Seleziona plugin"
# AI Translated
msgid "Remove plugin"
msgstr "Rimuovi plugin"
# AI Translated
msgid "No plugin selected"
msgstr "Nessun plugin selezionato"
# AI Translated
msgid "Configure"
msgstr "Configura"
@@ -7621,6 +7617,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Inferiore"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Selezione plugin"
@@ -9138,6 +9140,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Popup per selezionare la modalità di raggruppamento filamenti"
@@ -21979,6 +21990,10 @@ msgstr ""
"Evita le deformazioni\n"
"Sapevi che quando si stampano materiali soggetti a deformazioni come l'ABS, aumentare in modo appropriato la temperatura del piano riscaldato può ridurre la probabilità di deformazione?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Seleziona plugin"
#~ msgid "Select the language"
#~ msgstr "Seleziona la lingua"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -5396,22 +5396,18 @@ msgstr "無効なフォーマット、%1%であるはずです。"
msgid "System agents"
msgstr "システムエージェント"
# AI Translated
msgid "No plugin selected"
msgstr "プラグインが選択されていません"
# AI Translated
msgid "Add plugin"
msgstr "プラグインを追加"
# AI Translated
msgid "Select plugin"
msgstr "プラグインを選択"
# AI Translated
msgid "Remove plugin"
msgstr "プラグインを削除"
# AI Translated
msgid "No plugin selected"
msgstr "プラグインが選択されていません"
# AI Translated
msgid "Configure"
msgstr "設定"
@@ -7627,6 +7623,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "底面"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "プラグインの選択"
@@ -9158,6 +9160,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "フィラメントグルーピングモード選択のポップアップ"
@@ -22534,6 +22545,10 @@ msgstr ""
"反りを避ける\n"
"ABSのような反りやすい素材を印刷する場合、ヒートベッドの温度を適切に上げることで、反りが発生する確率を下げることができることをご存知ですか?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "プラグインを選択"
#~ msgid "Select the language"
#~ msgstr "言語を選択"
+24 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2025-06-02 17:12+0900\n"
"Last-Translator: crwusiz <crwusiz@gmail.com>\n"
"Language-Team: \n"
@@ -5408,22 +5408,18 @@ msgstr "잘못된 형식입니다. 필요한 벡터 형식: \"%1%\""
msgid "System agents"
msgstr "시스템 에이전트"
# AI Translated
msgid "No plugin selected"
msgstr "선택된 플러그인 없음"
# AI Translated
msgid "Add plugin"
msgstr "플러그인 추가"
# AI Translated
msgid "Select plugin"
msgstr "플러그인 선택"
# AI Translated
msgid "Remove plugin"
msgstr "플러그인 제거"
# AI Translated
msgid "No plugin selected"
msgstr "선택된 플러그인 없음"
# AI Translated
msgid "Configure"
msgstr "구성"
@@ -7640,6 +7636,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "하부"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "플러그인 선택"
@@ -9220,6 +9222,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "필라멘트 그룹화 모드를 선택하기 위한 팝업"
@@ -22401,6 +22412,10 @@ msgstr ""
"뒤틀림 방지\n"
"ABS와 같이 뒤틀림이 발생하기 쉬운 소재를 출력할 때, 히트베드 온도를 적절하게 높이면 뒤틀림 가능성을 줄일 수 있다는 사실을 알고 계셨나요?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "플러그인 선택"
#~ msgid "Select the language"
#~ msgstr "언어 선택"
+1
View File
@@ -179,6 +179,7 @@ src/slic3r/GUI/PublishDialog.cpp
src/slic3r/GUI/PublishSettingsDialog.cpp
src/slic3r/GUI/SavePresetDialog.cpp
src/slic3r/GUI/Search.cpp
src/slic3r/GUI/SettingsIndex.cpp
src/slic3r/GUI/Selection.cpp
src/slic3r/GUI/SelectMachine.cpp
src/slic3r/GUI/PrePrintChecker.cpp
+24 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2026-07-02 14:13+0300\n"
"Last-Translator: Gintaras Kučinskas <sharanchius@gmail.com>\n"
"Language-Team: \n"
@@ -5369,22 +5369,18 @@ msgstr "Netinkamas formatas. Tinkamas vektorinis formatas: \"%1%\""
msgid "System agents"
msgstr "Sisteminiai agentai"
# AI Translated
msgid "No plugin selected"
msgstr "Nepasirinktas joks papildinys"
# AI Translated
msgid "Add plugin"
msgstr "Pridėti papildinį"
# AI Translated
msgid "Select plugin"
msgstr "Pasirinkti papildinį"
# AI Translated
msgid "Remove plugin"
msgstr "Pašalinti papildinį"
# AI Translated
msgid "No plugin selected"
msgstr "Nepasirinktas joks papildinys"
# AI Translated
msgid "Configure"
msgstr "Konfigūruoti"
@@ -7604,6 +7600,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Apatinis"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Papildinio pasirinkimas"
@@ -9119,6 +9121,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Iššokantis langas gijų grupavimo režimui pasirinkti"
@@ -21681,6 +21692,10 @@ msgstr ""
"Venkite deformacijų (warping)\n"
"Ar žinojote, kad spausdinant medžiagas, kurios yra linkusios trauktis ir riestis (pvz., ABS), tinkamas kaitinamojo pagrindo temperatūros padidinimas gali sumažinti deformacijų (warping) tikimybę?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Pasirinkti papildinį"
#~ msgid "Select the language"
#~ msgstr "Pasirinkite kalbą"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -5878,22 +5878,18 @@ msgstr "Onjuist formaat. Het Vector formaat wordt verwacht: \"%1%\""
msgid "System agents"
msgstr "Systeemagenten"
# AI Translated
msgid "No plugin selected"
msgstr "Geen plug-in geselecteerd"
# AI Translated
msgid "Add plugin"
msgstr "Plug-in toevoegen"
# AI Translated
msgid "Select plugin"
msgstr "Plug-in selecteren"
# AI Translated
msgid "Remove plugin"
msgstr "Plug-in verwijderen"
# AI Translated
msgid "No plugin selected"
msgstr "Geen plug-in geselecteerd"
# AI Translated
msgid "Configure"
msgstr "Configureren"
@@ -8292,6 +8288,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Onderste"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Plug-inselectie"
@@ -9969,6 +9971,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
# AI Translated
msgid "Pop up to select filament grouping mode"
msgstr "Pop-up om de filamentgroeperingsmodus te kiezen"
@@ -24121,6 +24132,10 @@ msgstr ""
"Kromtrekken voorkomen\n"
"Wist je dat bij het printen van materialen die gevoelig zijn voor kromtrekken, zoals ABS, een juiste verhoging van de temperatuur van het warmtebed de kans op kromtrekken kan verkleinen?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Plug-in selecteren"
#~ msgid "Select the language"
#~ msgstr "Kies de taal"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: OrcaSlicer 2.3.0-rc\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: \n"
"Last-Translator: Krzysztof Morga <<tlumaczeniebs@gmail.com>>\n"
"Language-Team: \n"
@@ -5498,22 +5498,18 @@ msgstr "Nieprawidłowy format. Oczekiwano formatu wektorowego: „%1%”"
msgid "System agents"
msgstr "Agenci systemowi"
# AI Translated
msgid "No plugin selected"
msgstr "Nie wybrano wtyczki"
# AI Translated
msgid "Add plugin"
msgstr "Dodaj wtyczkę"
# AI Translated
msgid "Select plugin"
msgstr "Wybierz wtyczkę"
# AI Translated
msgid "Remove plugin"
msgstr "Usuń wtyczkę"
# AI Translated
msgid "No plugin selected"
msgstr "Nie wybrano wtyczki"
# AI Translated
msgid "Configure"
msgstr "Konfiguruj"
@@ -7798,6 +7794,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Dół"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Wybór wtyczek"
@@ -9375,6 +9377,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Okno dialogowe do wyboru trybu grupowania filamentów"
@@ -22578,6 +22589,10 @@ msgstr ""
"Unikaj odkształceń\n"
"Czy wiesz, że podczas drukowania filamentami podatnymi na odkształcenia, takimi jak ABS, odpowiednie zwiększenie temperatury podgrzewanej płyty może zmniejszyć prawdopodobieństwo odkształceń?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Wybierz wtyczkę"
#~ msgid "Select the language"
#~ msgstr "Wybierz język"
+22 -7
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2026-07-26 11:14-0300\n"
"Last-Translator: Alexandre Folle de Menezes\n"
"Language-Team: Portuguese, Brazilian\n"
@@ -5212,18 +5212,15 @@ msgstr "Formato inválido. Formato de vetor esperado: \"%1%\""
msgid "System agents"
msgstr "Agentes do sistema"
msgid "No plugin selected"
msgstr "Nenhum plugin selecionado"
msgid "Add plugin"
msgstr "Adicionar plugin"
msgid "Select plugin"
msgstr "Selecionar plugin"
msgid "Remove plugin"
msgstr "Remover plugin"
msgid "No plugin selected"
msgstr "Nenhum plugin selecionado"
msgid "Configure"
msgstr "Configurar"
@@ -7423,6 +7420,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Inferior"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
msgid "Plugin Selection"
msgstr "Seleção de plugins"
@@ -8902,6 +8905,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Abrir seleção do modo de agrupamento de filamento"
@@ -21292,6 +21304,9 @@ msgstr ""
"Evitar empenamento\n"
"Você sabia que ao imprimir materiais propensos ao empenamento como ABS, aumentar adequadamente a temperatura da mesa aquecida pode reduzir a probabilidade de empenamento?"
#~ msgid "Select plugin"
#~ msgstr "Selecionar plugin"
#~ msgid "Select the language"
#~ msgstr "Selecione o idioma"
+22 -7
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: OrcaSlicer V2.5.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2026-02-25 13:38+0300\n"
"Last-Translator: Felix14_v2\n"
"Language-Team: Felix14_v2 (ДС/ТГ: @felix14_v2, почта: aleks111001@list.ru), Andylg <andylg@yandex.ru>\n"
@@ -5378,18 +5378,15 @@ msgstr "Недопустимый формат. Ожидаемый векторн
msgid "System agents"
msgstr "Системные агенты"
msgid "No plugin selected"
msgstr "Плагины не выбраны"
msgid "Add plugin"
msgstr "Добавить плагин"
msgid "Select plugin"
msgstr "Выбрать плагин"
msgid "Remove plugin"
msgstr "Удалить плагин"
msgid "No plugin selected"
msgstr "Плагины не выбраны"
msgid "Configure"
msgstr "Настроить"
@@ -7681,6 +7678,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Снизу"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
msgid "Plugin Selection"
msgstr "Выбор плагинов"
@@ -9182,6 +9185,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
# Запрашивать выбор режима группировки?
msgid "Pop up to select filament grouping mode"
msgstr "Всплывающее окно для выбора режима группировки материалов"
@@ -22331,6 +22343,9 @@ msgstr ""
"Предотвращение коробления материала\n"
"Знаете ли вы, что при печати материалами, склонными к короблению, таких как ABS, повышение температуры подогреваемого стола может снизить эту вероятность?"
#~ msgid "Select plugin"
#~ msgstr "Выбрать плагин"
#~ msgid "Select the language"
#~ msgstr "Выбор языка"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -5954,22 +5954,18 @@ msgstr "Ogiltligt format. Förväntat vector format: \"%1%\""
msgid "System agents"
msgstr "Systemagenter"
# AI Translated
msgid "No plugin selected"
msgstr "Ingen insticksmodul vald"
# AI Translated
msgid "Add plugin"
msgstr "Lägg till insticksmodul"
# AI Translated
msgid "Select plugin"
msgstr "Välj insticksmodul"
# AI Translated
msgid "Remove plugin"
msgstr "Ta bort insticksmodul"
# AI Translated
msgid "No plugin selected"
msgstr "Ingen insticksmodul vald"
# AI Translated
msgid "Configure"
msgstr "Konfigurera"
@@ -8379,6 +8375,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Bottenlager"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Val av insticksmodul"
@@ -10075,6 +10077,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
# AI Translated
msgid "Pop up to select filament grouping mode"
msgstr "Visa dialogruta för val av filamentgrupperingsläge"
@@ -24409,6 +24420,10 @@ msgstr ""
"Undvik vridning\n"
"Visste du att när du skriver ut material som är benägna att vrida, såsom ABS, kan en lämplig ökning av värmebäddens temperatur minska sannolikheten för vridning?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Välj insticksmodul"
#~ msgid "Select the language"
#~ msgstr "Välj språk"
+24 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2026-06-19 13:40+0700\n"
"Last-Translator: Icezaza\n"
"Language-Team: Thai\n"
@@ -5363,22 +5363,18 @@ msgstr "รูปแบบไม่ถูกต้อง รูปแบบเ
msgid "System agents"
msgstr "เอเจนต์ระบบ"
# AI Translated
msgid "No plugin selected"
msgstr "ไม่ได้เลือกปลั๊กอิน"
# AI Translated
msgid "Add plugin"
msgstr "เพิ่มปลั๊กอิน"
# AI Translated
msgid "Select plugin"
msgstr "เลือกปลั๊กอิน"
# AI Translated
msgid "Remove plugin"
msgstr "ลบปลั๊กอิน"
# AI Translated
msgid "No plugin selected"
msgstr "ไม่ได้เลือกปลั๊กอิน"
# AI Translated
msgid "Configure"
msgstr "กำหนดค่า"
@@ -7577,6 +7573,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "ล่าง"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "การเลือกปลั๊กอิน"
@@ -9088,6 +9090,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "ปรากฏขึ้นเพื่อเลือกโหมดการจัดกลุ่มเส้นพลาสติก"
@@ -21709,6 +21720,10 @@ msgstr ""
"หลีกเลี่ยงการบิดเบี้ยว\n"
"คุณรู้หรือไม่ว่าเมื่อพิมพ์วัสดุที่มีแนวโน้มที่จะเกิดการบิดเบี้ยว เช่น ABS การเพิ่มอุณหภูมิฐานพิมพ์อย่างเหมาะสมสามารถลดความน่าจะเป็นของการบิดเบี้ยวได้"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "เลือกปลั๊กอิน"
#~ msgid "Select the language"
#~ msgstr "เลือกภาษา"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2026-08-21 23:18+0300\n"
"Last-Translator: GlauTech\n"
"Language-Team: \n"
@@ -5426,22 +5426,18 @@ msgstr "Geçersiz format. Beklenen vektör formatı: \"%1%\""
msgid "System agents"
msgstr "Sistem aracıları"
# AI Translated
msgid "No plugin selected"
msgstr "Eklenti seçilmedi"
# AI Translated
msgid "Add plugin"
msgstr "Eklenti ekle"
# AI Translated
msgid "Select plugin"
msgstr "Eklenti seç"
# AI Translated
msgid "Remove plugin"
msgstr "Eklentiyi kaldır"
# AI Translated
msgid "No plugin selected"
msgstr "Eklenti seçilmedi"
# AI Translated
msgid "Configure"
msgstr "Yapılandır"
@@ -7666,6 +7662,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Alt"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Eklenti Seçimi"
@@ -9193,6 +9195,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "Filament gruplama modunu seçmek için açılır pencere"
@@ -22164,6 +22175,10 @@ msgstr ""
"Eğilmeyi önleyin\n"
"ABS gibi bükülmeye yatkın malzemelere baskı yaparken, ısıtma yatağı sıcaklığının uygun şekilde arttırılmasının bükülme olasılığını azaltabileceğini biliyor muydunuz?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Eklenti seç"
#~ msgid "Select the language"
#~ msgstr "Dili seçin"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: orcaslicerua\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2026-07-17 16:25+0300\n"
"Last-Translator: Andrij Mizyk <andm1zyk@proton.me>\n"
"Language-Team: Ukrainian\n"
@@ -5375,22 +5375,18 @@ msgstr "Невірний формат. Очікуваний векторний
msgid "System agents"
msgstr "Системні агенти"
# AI Translated
msgid "No plugin selected"
msgstr "Плагін не вибрано"
# AI Translated
msgid "Add plugin"
msgstr "Додати плагін"
# AI Translated
msgid "Select plugin"
msgstr "Вибрати плагін"
# AI Translated
msgid "Remove plugin"
msgstr "Вилучити плагін"
# AI Translated
msgid "No plugin selected"
msgstr "Плагін не вибрано"
# AI Translated
msgid "Configure"
msgstr "Налаштувати"
@@ -7650,6 +7646,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Низ"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Вибір плагіна"
@@ -9211,6 +9213,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
# AI Translated
msgid "Pop up to select filament grouping mode"
msgstr "Показувати вікно вибору режиму групування філаментів"
@@ -22325,6 +22336,10 @@ msgstr ""
"Уникнення деформації\n"
"Чи знаєте ви, що при друку матеріалами, схильними до деформації, такими як ABS, відповідне підвищення температури столу може зменшити ймовірність деформації?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Вибрати плагін"
#~ msgid "Select the language"
#~ msgstr "Вибрати мову"
+24 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2025-10-02 17:43+0700\n"
"Last-Translator: \n"
"Language-Team: hainguyen.ts13@gmail.com\n"
@@ -5679,22 +5679,18 @@ msgstr "Định dạng không hợp lệ. Mong đợi định dạng vector: \"%
msgid "System agents"
msgstr "Tác nhân hệ thống"
# AI Translated
msgid "No plugin selected"
msgstr "Chưa chọn plugin"
# AI Translated
msgid "Add plugin"
msgstr "Thêm plugin"
# AI Translated
msgid "Select plugin"
msgstr "Chọn plugin"
# AI Translated
msgid "Remove plugin"
msgstr "Xóa plugin"
# AI Translated
msgid "No plugin selected"
msgstr "Chưa chọn plugin"
# AI Translated
msgid "Configure"
msgstr "Cấu hình"
@@ -8035,6 +8031,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "Dưới"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "Chọn plugin"
@@ -9674,6 +9676,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
# AI Translated
msgid "Pop up to select filament grouping mode"
msgstr "Hiện cửa sổ để chọn chế độ nhóm filament"
@@ -23048,6 +23059,10 @@ msgstr ""
"Tránh cong vênh\n"
"Bạn có biết rằng khi in vật liệu dễ cong vênh như ABS, tăng nhiệt độ bàn nóng một cách thích hợp có thể giảm xác suất cong vênh không?"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "Chọn plugin"
#~ msgid "Select the language"
#~ msgstr "Chọn ngôn ngữ"
+24 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Slic3rPE\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2026-06-11 12:37-0300\n"
"Last-Translator: Handle <mail@bysb.net>\n"
"Language-Team: \n"
@@ -5219,22 +5219,18 @@ msgstr "无效格式,应该是\"%1%\"这种数组格式"
msgid "System agents"
msgstr "系统代理"
# AI Translated
msgid "No plugin selected"
msgstr "未选择插件"
# AI Translated
msgid "Add plugin"
msgstr "添加插件"
# AI Translated
msgid "Select plugin"
msgstr "选择插件"
# AI Translated
msgid "Remove plugin"
msgstr "移除插件"
# AI Translated
msgid "No plugin selected"
msgstr "未选择插件"
# AI Translated
msgid "Configure"
msgstr "配置"
@@ -7430,6 +7426,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "底部"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
msgid "Plugin Selection"
msgstr "插件选择"
@@ -8910,6 +8912,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "弹出选择耗材丝分组模式"
@@ -21457,6 +21468,10 @@ msgstr ""
"避免翘曲\n"
"您知道吗?打印ABS这类易翘曲材料时,适当提高热床温度可以降低翘曲的概率。"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "选择插件"
#~ msgid "Select the language"
#~ msgstr "选择语言"
+24 -9
View File
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-11 12:33+0800\n"
"POT-Creation-Date: 2026-09-11 17:15+0800\n"
"PO-Revision-Date: 2025-11-28 13:48-0600\n"
"Last-Translator: tntchn <15895303+tntchn@users.noreply.github.com>\n"
"Language-Team: \n"
@@ -5348,22 +5348,18 @@ msgstr "無效格式,應該是「%1%」這種格式"
msgid "System agents"
msgstr "系統代理程式"
# AI Translated
msgid "No plugin selected"
msgstr "未選擇外掛"
# AI Translated
msgid "Add plugin"
msgstr "新增外掛"
# AI Translated
msgid "Select plugin"
msgstr "選擇外掛"
# AI Translated
msgid "Remove plugin"
msgstr "移除外掛"
# AI Translated
msgid "No plugin selected"
msgstr "未選擇外掛"
# AI Translated
msgid "Configure"
msgstr "設定"
@@ -7569,6 +7565,12 @@ msgctxt "Layers"
msgid "Bottom"
msgstr "底部"
msgid "This setting does not specify a plugin capability type."
msgstr ""
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr ""
# AI Translated
msgid "Plugin Selection"
msgstr "外掛選擇"
@@ -9083,6 +9085,15 @@ msgstr ""
msgid "When enabled, pressing Space (with no other key held) opens the Speed Dial action search from any page."
msgstr ""
msgid "Recent actions"
msgstr ""
msgid "actions"
msgstr ""
msgid "How many recently launched actions to show at the top of the Speed Dial. Set to 0 to hide recent actions."
msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr "彈出視窗選擇線材分組模式"
@@ -21671,6 +21682,10 @@ msgstr ""
"避免翹曲\n"
"您知道嗎?當列印容易翹曲的材料(如 ABS)時,適當提高熱床溫度可以降低翹曲的機率。"
# AI Translated
#~ msgid "Select plugin"
#~ msgstr "選擇外掛"
#~ msgid "Select the language"
#~ msgstr "選擇語言"
+2
View File
@@ -478,6 +478,8 @@ set(SLIC3R_GUI_SOURCES
GUI/SkipPartCanvas.hpp
GUI/Search.cpp
GUI/Search.hpp
GUI/SettingsIndex.cpp
GUI/SettingsIndex.hpp
GUI/Selection.cpp
GUI/Selection.hpp
GUI/SelectMachine.cpp
+4 -4
View File
@@ -8,7 +8,7 @@
#include "Notebook.hpp"
#include "OptionsGroup.hpp"
#include "Plater.hpp"
#include "Search.hpp"
#include "SettingsIndex.hpp"
#include "Tab.hpp"
#include "slic3r/plugin/PluginManager.hpp"
@@ -526,11 +526,11 @@ void ActionRegistry::materialize_setting_actions()
{
assert(wxThread::IsMain());
// Reuse the Sidebar's live searcher: it's the only OptionsSearcher whose groups_and_categories
// map is populated (Tab::add_key feeds it at build time), and it already mirrors the current
// Reuse the Sidebar's live settings index: it's the only catalog whose group/category map is
// populated (Tab::add_key feeds it at build time), and it already mirrors the current
// configs/printer-technology. Use the all-modes view so the Speed Dial lists every setting,
// including those above the user's current mode, and can prompt to switch before jumping.
const std::vector<Search::Option>& options = wxGetApp().sidebar().get_searcher().all_modes_options();
const std::vector<Search::Option>& options = wxGetApp().sidebar().settings_index().all_options();
// Load the persisted per-action state ONCE (not per-option) so a re-materialised setting keeps
// its recency/favourite; mirroring seed_state but amortised over the whole option set.
+2 -2
View File
@@ -248,7 +248,7 @@ void OptionsGroup::append_line(const Line& line)
// affordance for it. Settings tabs only; the searcher already exists by the time tabs are built.
if (m_use_custom_ctrl && !line.label_path.empty())
for (const auto& opt : line.get_options())
wxGetApp().sidebar().get_searcher().set_path(opt.opt_id, static_cast<Preset::Type>(config_type()), line.label_path);
wxGetApp().sidebar().settings_index().set_path(opt.opt_id, static_cast<Preset::Type>(config_type()), line.label_path);
if (line.full_width && (line.widget != nullptr || !line.get_extra_widgets().empty()))
return;
@@ -656,7 +656,7 @@ Option ConfigOptionsGroup::get_option(const std::string& opt_key, int opt_index
m_opt_map.emplace(opt_id, pair);
if (m_use_custom_ctrl) // fill group and category values just for options from Settings Tab
wxGetApp().sidebar().get_searcher().add_key(opt_id, static_cast<Preset::Type>(this->config_type()), title, this->config_category(), this->icon);
wxGetApp().sidebar().settings_index().add_key(opt_id, static_cast<Preset::Type>(this->config_type()), title, this->config_category(), this->icon);
return Option(*m_config->def()->get(opt_key), opt_id);
}
+5
View File
@@ -6419,6 +6419,11 @@ Search::OptionsSearcher& Sidebar::get_searcher()
return p->searcher;
}
Search::SettingsIndex& Sidebar::settings_index()
{
return p->searcher.index();
}
std::string& Sidebar::get_search_line()
{
return p->searcher.search_string();
+1
View File
@@ -282,6 +282,7 @@ public:
std::vector<std::string>& types,
std::vector<size_t>* config_indices = nullptr);
Search::OptionsSearcher& get_searcher();
Search::SettingsIndex& settings_index();
std::string& get_search_line();
void update_printer_thumbnail();
+6 -213
View File
@@ -62,107 +62,12 @@ static char marker_by_type(Preset::Type type, PrinterTechnology pt)
}
}
std::string Option::opt_key() const { return into_u8(key).substr(2); }
void FoundOption::get_marked_label_and_tooltip(const char **label_, const char **tooltip_) const
{
*label_ = marked_label.c_str();
*tooltip_ = tooltip.c_str();
}
template<class T>
// void change_opt_key(std::string& opt_key, DynamicPrintConfig* config)
void change_opt_key(std::string &opt_key, DynamicPrintConfig *config, int &cnt)
{
T *opt_cur = static_cast<T *>(config->option(opt_key));
cnt = opt_cur->values.size();
return;
if (opt_cur->values.size() > 0) opt_key += "#" + std::to_string(0);
}
static std::string get_key(const std::string &opt_key, Preset::Type type) { return std::to_string(int(type)) + ";" + opt_key; }
void OptionsSearcher::append_options(DynamicPrintConfig *config, Preset::Type type, ConfigOptionMode mode)
{
auto emplace = [this, type](std::vector<Option> &dst, const std::string &key, const wxString &label, ConfigOptionMode opt_mode, std::string tooltip) {
const GroupAndCategory &gc = groups_and_categories[key];
if (gc.group.IsEmpty() || gc.category.IsEmpty()) return;
wxString suffix;
wxString suffix_local;
if (gc.category == "Machine limits") {
//suffix = key.back() == '1' ? L("Stealth") : L("Normal");
suffix = key.back() == '1' ? wxEmptyString : wxEmptyString;
suffix_local = " " + _(suffix);
suffix = " " + suffix;
}
if (!label.IsEmpty())
dst.emplace_back(Option{boost::nowide::widen(key), type, (label + suffix).ToStdWstring(), (_(label) + suffix_local).ToStdWstring(), gc.group.ToStdWstring(),
_(gc.group).ToStdWstring(), into_u8(gc.icon), gc.category.ToStdWstring(), GUI::Tab::translate_category(gc.category, type).ToStdWstring(),
false, opt_mode, std::move(tooltip), gc.path});
};
for (std::string opt_key : config->keys()) {
const ConfigOptionDef &opt = config->def()->options.at(opt_key);
const bool in_filtered = opt.mode <= mode;
int cnt = 0;
if ((type == Preset::TYPE_SLA_MATERIAL || type == Preset::TYPE_PRINTER || type == Preset::TYPE_PRINT) && opt_key != "printable_area")
switch (config->option(opt_key)->type()) {
case coInts: change_opt_key<ConfigOptionInts>(opt_key, config, cnt); break;
case coBools: change_opt_key<ConfigOptionBools>(opt_key, config, cnt); break;
case coFloats: change_opt_key<ConfigOptionFloats>(opt_key, config, cnt); break;
case coStrings: change_opt_key<ConfigOptionStrings>(opt_key, config, cnt); break;
case coPercents: change_opt_key<ConfigOptionPercents>(opt_key, config, cnt); break;
case coPoints: change_opt_key<ConfigOptionPoints>(opt_key, config, cnt); break;
// BBS
case coEnums: change_opt_key<ConfigOptionInts>(opt_key, config, cnt); break;
default: break;
}
if (type == Preset::TYPE_FILAMENT && filament_options_with_variant.find(opt_key) != filament_options_with_variant.end())
opt_key += "#0";
wxString label = opt.full_label.empty() ? opt.label : opt.full_label;
std::string key = get_key(opt_key, type);
auto add = [&](const std::string &k) {
if (in_filtered)
emplace(options, k, label, opt.mode, into_u8(_(opt.tooltip)));
emplace(options_all_modes, k, label, opt.mode, into_u8(_(opt.tooltip)));
};
if (cnt == 0)
add(key);
else
for (int i = 0; i < cnt; ++i)
// ! It's very important to use "#". opt_key#n is a real option key used in GroupAndCategory
add(key + "#" + std::to_string(i));
}
}
void OptionsSearcher::sort_options()
{
// Both views are label-sorted and multi_category-marked. They are separate consumers (the sidebar
// search and the Speed Dial); keeping them in sync here prevents the all-modes view from silently
// diverging in order or flags.
auto sort_and_mark = [](std::vector<Option> &v) {
std::sort(v.begin(), v.end(), [](const Option &o1, const Option &o2) { return o1.label < o2.label; });
Option *last = nullptr;
for (auto &opt : v) {
if (last && last->label == opt.label && last->group == opt.group && last->type == opt.type && last->category != opt.category) {
last->multi_category = true;
opt.multi_category = true;
}
last = &opt;
}
};
sort_and_mark(options);
sort_and_mark(options_all_modes);
}
// Mark a string using ColorMarkerStart and ColorMarkerEnd symbols
static std::wstring mark_string(const std::wstring &str, const std::vector<uint16_t> &matches, Preset::Type type, PrinterTechnology pt)
{
@@ -247,7 +152,8 @@ bool OptionsSearcher::search(const std::string &search, bool force /* = false*/,
return wxString(marker_by_type(opt.type, printer_technology)) + opt.category_local + sep + opt.group_local + sep + opt.label_local;
};
std::vector<uint16_t> matches, matches2;
std::vector<uint16_t> matches, matches2;
const std::vector<Option> &options = m_index.options();
for (size_t i = 0; i < options.size(); i++) {
const Option &opt = options[i];
if (full_list) {
@@ -319,117 +225,21 @@ OptionsSearcher::~OptionsSearcher() {}
void OptionsSearcher::init(std::vector<InputInfo> input_values)
{
options.clear();
options_all_modes.clear();
for (auto i : input_values) append_options(i.config, i.type, i.mode);
sort_options();
m_index.init(std::move(input_values));
search(search_line, true, search_type);
}
void OptionsSearcher::apply(DynamicPrintConfig *config, Preset::Type type, ConfigOptionMode mode)
{
// options_all_modes is a separate consumer (the Speed Dial), so "nothing initialised yet" means
// both views are empty - the mode-filtered options can be empty while the all-modes view is not.
if (options.empty() && options_all_modes.empty()) return;
options.erase(std::remove_if(options.begin(), options.end(), [type](Option opt) { return opt.type == type; }), options.end());
options_all_modes.erase(std::remove_if(options_all_modes.begin(), options_all_modes.end(), [type](Option opt) { return opt.type == type; }),
options_all_modes.end());
append_options(config, type, mode);
sort_options();
search(search_line, true, search_type);
if (m_index.apply(config, type, mode))
search(search_line, true, search_type);
}
const Option &OptionsSearcher::get_option(size_t pos_in_filter) const
{
assert(pos_in_filter != size_t(-1) && found[pos_in_filter].option_idx != size_t(-1));
return options[found[pos_in_filter].option_idx];
}
const Option &OptionsSearcher::get_option(const std::string &opt_key, Preset::Type type, int &variant_index) const
{
std::string opt_key2 = opt_key;
if (auto n = opt_key.find('#'); n != std::string::npos) {
variant_index = std::atoi(opt_key.c_str() + n + 1);
opt_key2 = opt_key.substr(0, n);
}
auto it = std::lower_bound(options.begin(), options.end(), Option({boost::nowide::widen(get_key(opt_key2, type))}));
// BBS: return the 0th option when not found in searcher caused by mode difference
// assert(it != options.end());
if (it == options.end()) { variant_index = -2 ; return options[0]; }
if (it->opt_key() == opt_key2) {
variant_index = -1;
} else {
const std::string opt_key3 = opt_key2 + "#";
it = std::lower_bound(it, options.end(), Option({boost::nowide::widen(get_key(opt_key3, type))}));
if (it == options.end() || it->opt_key().compare(0, opt_key3.length(), opt_key3) != 0) {
variant_index = -2; // Not found
return options[0];
}
auto it2 = it;
++it2;
if (it2 != options.end() && it2->opt_key().compare(0, opt_key3.length(), opt_key3) == 0
&& printer_options_with_variant_1.find(opt_key2) == printer_options_with_variant_1.end())
variant_index = -2;
}
return options[it - options.begin()];
}
static Option create_option(const std::string &opt_key, const wxString &label, Preset::Type type, const GroupAndCategory &gc)
{
wxString suffix;
wxString suffix_local;
if (gc.category == "Machine limits") {
//suffix = opt_key.back() == '1' ? L("Stealth") : L("Normal");
suffix = opt_key.back() == '1' ? wxEmptyString : wxEmptyString;
suffix_local = " " + _(suffix);
suffix = " " + suffix;
}
wxString category = gc.category;
if (type == Preset::TYPE_PRINTER && category.Contains("Extruder ")) {
std::string opt_idx = opt_key.substr(opt_key.find("#") + 1);
category = wxString::Format("%s %d", "Extruder", atoi(opt_idx.c_str()) + 1);
}
return Option{boost::nowide::widen(get_key(opt_key, type)),
type,
(label + suffix).ToStdWstring(),
(_(label) + suffix_local).ToStdWstring(),
gc.group.ToStdWstring(),
_(gc.group).ToStdWstring(),
into_u8(gc.icon),
gc.category.ToStdWstring(),
GUI::Tab::translate_category(category, type).ToStdWstring()};
}
Option OptionsSearcher::get_option(const std::string &opt_key, const wxString &label, Preset::Type type) const
{
std::string key = get_key(opt_key, type);
auto it = std::lower_bound(options.begin(), options.end(), Option({boost::nowide::widen(key)}));
// BBS: return the 0th option when not found in searcher caused by mode difference
if (it == options.end()) return options[0];
if (it->key == boost::nowide::widen(key)) return options[it - options.begin()];
if (groups_and_categories.find(key) == groups_and_categories.end()) {
size_t pos = key.find('#');
if (pos == std::string::npos) return options[it - options.begin()];
std::string zero_opt_key = key.substr(0, pos + 1) + "0";
if (groups_and_categories.find(zero_opt_key) == groups_and_categories.end()) return options[it - options.begin()];
return create_option(opt_key, label, type, groups_and_categories.at(zero_opt_key));
}
const GroupAndCategory &gc = groups_and_categories.at(key);
if (gc.group.IsEmpty() || gc.category.IsEmpty()) return options[it - options.begin()];
return create_option(opt_key, label, type, gc);
return m_index.option_at(found[pos_in_filter].option_idx);
}
void OptionsSearcher::show_dialog(Preset::Type type, wxWindow *parent, TextInput *input, wxWindow* ssearch_btn)
@@ -456,23 +266,6 @@ void OptionsSearcher::dlg_msw_rescale()
{
if (search_dialog) search_dialog->msw_rescale();
}
void OptionsSearcher::add_key(const std::string &opt_key, Preset::Type type, const wxString &group, const wxString &category, const wxString &icon)
{
// Update fields in place so a page rebuild (get_option after set_path) doesn't drop the
// previously recorded wiki path.
GroupAndCategory &gc = groups_and_categories[get_key(opt_key, type)];
gc.group = group;
gc.category = category;
gc.icon = icon;
}
void OptionsSearcher::set_path(const std::string &opt_key, Preset::Type type, const std::string &path)
{
if (path.empty())
return;
groups_and_categories[get_key(opt_key, type)].path = path;
}
//------------------------------------------
// SearchItem
//------------------------------------------
+10 -72
View File
@@ -19,6 +19,7 @@
#include "wxExtensions.hpp"
#include "GUI_Utils.hpp"
#include "libslic3r/Preset.hpp"
#include "SettingsIndex.hpp"
#include "Widgets/ScrolledWindow.hpp"
#include "Widgets/TextInput.hpp"
#include "Widgets/PopupWindow.hpp"
@@ -34,45 +35,6 @@ namespace Search {
class SearchDialog;
struct InputInfo
{
DynamicPrintConfig *config{nullptr};
Preset::Type type{Preset::TYPE_INVALID};
ConfigOptionMode mode{comSimple};
};
struct GroupAndCategory
{
wxString group;
wxString category;
wxString icon; // icon of the group's own header, or empty
std::string path; // wiki path (Line::label_path) of the option's line, or empty
};
struct Option
{
// bool operator<(const Option& other) const { return other.label > this->label; }
bool operator<(const Option &other) const { return other.key > this->key; }
// Fuzzy matching works at a character level. Thus matching with wide characters is a safer bet than with short characters,
// though for some languages (Chinese?) it may not work correctly.
std::wstring key;
Preset::Type type{Preset::TYPE_INVALID};
std::wstring label;
std::wstring label_local;
std::wstring group;
std::wstring group_local;
std::string group_icon; // SVG base name of the group's own header icon, or empty
std::wstring category;
std::wstring category_local;
bool multi_category { false };
ConfigOptionMode mode{comSimple}; // option's visibility threshold; drives the Speed Dial's mode prompt
std::string tooltip; // localized ConfigOptionDef::tooltip, or empty
std::string wiki_path; // Line::label_path for the option's row, or empty
std::string opt_key() const;
};
struct FoundOption
{
// UTF8 encoding, to be consumed by ImGUI by reference.
@@ -96,28 +58,19 @@ struct OptionViewParameters
class OptionsSearcher
{
std::string search_line;
Preset::Type search_type = Preset::TYPE_INVALID;
SettingsIndex m_index;
std::map<std::string, GroupAndCategory> groups_and_categories;
PrinterTechnology printer_technology;
std::vector<Option> options{};
// Every option regardless of the current UI mode (Simple/Advanced/Expert/Developer), for the
// Speed Dial. The sidebar search keeps using the mode-filtered `options`.
std::vector<Option> options_all_modes{};
std::string search_line;
Preset::Type search_type = Preset::TYPE_INVALID;
PrinterTechnology printer_technology;
std::vector<FoundOption> found{};
void append_options(DynamicPrintConfig *config, Preset::Type type, ConfigOptionMode mode);
void sort_options();
void sort_found()
{
std::sort(found.begin(), found.end(),
[](const FoundOption &f1, const FoundOption &f2) { return f1.outScore > f2.outScore || (f1.outScore == f2.outScore && f1.label < f2.label); });
};
size_t options_size() const { return options.size(); }
size_t found_size() const { return found.size(); }
public:
@@ -128,44 +81,29 @@ public:
OptionsSearcher();
~OptionsSearcher();
SettingsIndex & index() { return m_index; }
const SettingsIndex &index() const { return m_index; }
// Rebuild the catalog and re-run the current query so the cached results track it.
void init(std::vector<InputInfo> input_values);
void apply(DynamicPrintConfig *config, Preset::Type type, ConfigOptionMode mode);
bool search();
bool search(const std::string &search, bool force = false, Preset::Type type = Preset::TYPE_INVALID);
void add_key(const std::string &opt_key, Preset::Type type, const wxString &group, const wxString &category,
const wxString &icon = wxEmptyString);
// Records the wiki path of an option's row (Line::label_path) so the Speed Dial can offer a
// "open wiki" affordance. Empty paths are ignored.
void set_path(const std::string &opt_key, Preset::Type type, const std::string &path);
size_t size() const { return found_size(); }
const FoundOption &operator[](const size_t pos) const noexcept { return found[pos]; }
const Option & get_option(size_t pos_in_filter) const;
const Option & get_option(const std::string &opt_key, Preset::Type type, int &variant_index) const;
Option get_option(const std::string &opt_key, const wxString &label, Preset::Type type) const;
const std::vector<FoundOption> &found_options() { return found; }
const GroupAndCategory & get_group_and_category(const std::string &opt_key) { return groups_and_categories[opt_key]; }
std::string & search_string() { return search_line; }
void set_printer_technology(PrinterTechnology pt) { printer_technology = pt; }
void sort_options_by_key()
{
std::sort(options.begin(), options.end(), [](const Option &o1, const Option &o2) { return o1.key < o2.key; });
}
void sort_options_by_label() { sort_options(); }
void show_dialog(Preset::Type type, wxWindow *parent, TextInput *input, wxWindow *ssearch_btn);
void dlg_sys_color_changed();
void dlg_msw_rescale();
// Every option across all UI modes (Developer included), regardless of the current mode.
// Used by the Speed Dial so it can list settings the user would have to switch mode to edit.
const std::vector<Option>& all_modes_options() const { return options_all_modes; }
};
//------------------------------------------
+229
View File
@@ -0,0 +1,229 @@
#include "SettingsIndex.hpp"
#include <algorithm>
#include <cstddef>
#include <cstdlib>
#include <string>
#include <vector>
#include <boost/nowide/convert.hpp>
#include "GUI.hpp"
#include "I18N.hpp"
#include "Tab.hpp"
#include "libslic3r/PrintConfig.hpp"
namespace Slic3r {
using GUI::into_u8;
namespace Search {
static std::string get_key(const std::string &opt_key, Preset::Type type) { return std::to_string(int(type)) + ";" + opt_key; }
std::string Option::opt_key() const { return into_u8(key).substr(2); }
template<class T>
// void change_opt_key(std::string& opt_key, DynamicPrintConfig* config)
void change_opt_key(std::string &opt_key, DynamicPrintConfig *config, int &cnt)
{
T *opt_cur = static_cast<T *>(config->option(opt_key));
cnt = opt_cur->values.size();
return;
if (opt_cur->values.size() > 0) opt_key += "#" + std::to_string(0);
}
// Single assembler for an indexed Option, shared by append_options() and create_option(), so a new
// Option field is only wired up in one place.
static Option make_option(const std::string &key, Preset::Type type, const wxString &label, const GroupAndCategory &gc,
ConfigOptionMode mode, const std::string &tooltip, bool rewrite_extruder_category)
{
wxString suffix;
wxString suffix_local;
if (gc.category == "Machine limits") {
//suffix = key.back() == '1' ? L("Stealth") : L("Normal");
suffix = key.back() == '1' ? wxEmptyString : wxEmptyString;
suffix_local = " " + _(suffix);
suffix = " " + suffix;
}
wxString category = gc.category;
if (rewrite_extruder_category && type == Preset::TYPE_PRINTER && category.Contains("Extruder ")) {
std::string opt_idx = key.substr(key.find("#") + 1);
category = wxString::Format("%s %d", "Extruder", atoi(opt_idx.c_str()) + 1);
}
return Option{boost::nowide::widen(key), type, (label + suffix).ToStdWstring(), (_(label) + suffix_local).ToStdWstring(),
gc.group.ToStdWstring(), _(gc.group).ToStdWstring(), into_u8(gc.icon), gc.category.ToStdWstring(),
GUI::Tab::translate_category(category, type).ToStdWstring(), false, mode, tooltip, gc.path};
}
void SettingsIndex::append_options(DynamicPrintConfig *config, Preset::Type type, ConfigOptionMode mode)
{
for (std::string opt_key : config->keys()) {
const ConfigOptionDef &opt = config->def()->options.at(opt_key);
const bool in_filtered = opt.mode <= mode;
int cnt = 0;
if ((type == Preset::TYPE_SLA_MATERIAL || type == Preset::TYPE_PRINTER || type == Preset::TYPE_PRINT) && opt_key != "printable_area")
switch (config->option(opt_key)->type()) {
case coInts: change_opt_key<ConfigOptionInts>(opt_key, config, cnt); break;
case coBools: change_opt_key<ConfigOptionBools>(opt_key, config, cnt); break;
case coFloats: change_opt_key<ConfigOptionFloats>(opt_key, config, cnt); break;
case coStrings: change_opt_key<ConfigOptionStrings>(opt_key, config, cnt); break;
case coPercents: change_opt_key<ConfigOptionPercents>(opt_key, config, cnt); break;
case coPoints: change_opt_key<ConfigOptionPoints>(opt_key, config, cnt); break;
// BBS
case coEnums: change_opt_key<ConfigOptionInts>(opt_key, config, cnt); break;
default: break;
}
if (type == Preset::TYPE_FILAMENT && filament_options_with_variant.find(opt_key) != filament_options_with_variant.end())
opt_key += "#0";
wxString label = opt.full_label.empty() ? opt.label : opt.full_label;
std::string key = get_key(opt_key, type);
auto add = [&](const std::string &k) {
const GroupAndCategory &gc = m_groups_and_categories[k];
if (gc.group.IsEmpty() || gc.category.IsEmpty() || label.IsEmpty()) return;
const std::string tooltip = into_u8(_(opt.tooltip));
if (in_filtered)
m_options.emplace_back(make_option(k, type, label, gc, opt.mode, tooltip, false));
m_all_modes.emplace_back(make_option(k, type, label, gc, opt.mode, tooltip, false));
};
if (cnt == 0)
add(key);
else
for (int i = 0; i < cnt; ++i)
// ! It's very important to use "#". opt_key#n is a real option key used in GroupAndCategory
add(key + "#" + std::to_string(i));
}
}
void SettingsIndex::sort_options()
{
// Both views are label-sorted and multi_category-marked. They are separate consumers (the sidebar
// search and the Speed Dial); keeping them in sync here prevents the all-modes view from silently
// diverging in order or flags.
auto sort_and_mark = [](std::vector<Option> &v) {
std::sort(v.begin(), v.end(), [](const Option &o1, const Option &o2) { return o1.label < o2.label; });
Option *last = nullptr;
for (auto &opt : v) {
if (last && last->label == opt.label && last->group == opt.group && last->type == opt.type && last->category != opt.category) {
last->multi_category = true;
opt.multi_category = true;
}
last = &opt;
}
};
sort_and_mark(m_options);
sort_and_mark(m_all_modes);
}
void SettingsIndex::init(std::vector<InputInfo> input_values)
{
m_options.clear();
m_all_modes.clear();
for (auto i : input_values) append_options(i.config, i.type, i.mode);
sort_options();
}
bool SettingsIndex::apply(DynamicPrintConfig *config, Preset::Type type, ConfigOptionMode mode)
{
// m_all_modes is a separate consumer (the Speed Dial), so "nothing initialised yet" means both
// views are empty - the mode-filtered m_options can be empty while m_all_modes is not.
if (m_options.empty() && m_all_modes.empty()) return false;
m_options.erase(std::remove_if(m_options.begin(), m_options.end(), [type](Option opt) { return opt.type == type; }), m_options.end());
m_all_modes.erase(std::remove_if(m_all_modes.begin(), m_all_modes.end(), [type](Option opt) { return opt.type == type; }), m_all_modes.end());
append_options(config, type, mode);
sort_options();
return true;
}
const Option &SettingsIndex::get_option(const std::string &opt_key, Preset::Type type, int &variant_index) const
{
std::string opt_key2 = opt_key;
if (auto n = opt_key.find('#'); n != std::string::npos) {
variant_index = std::atoi(opt_key.c_str() + n + 1);
opt_key2 = opt_key.substr(0, n);
}
auto it = std::lower_bound(m_options.begin(), m_options.end(), Option({boost::nowide::widen(get_key(opt_key2, type))}));
// BBS: return the 0th option when not found in searcher caused by mode difference
// assert(it != options.end());
if (it == m_options.end()) { variant_index = -2 ; return m_options[0]; }
if (it->opt_key() == opt_key2) {
variant_index = -1;
} else {
const std::string opt_key3 = opt_key2 + "#";
it = std::lower_bound(it, m_options.end(), Option({boost::nowide::widen(get_key(opt_key3, type))}));
if (it == m_options.end() || it->opt_key().compare(0, opt_key3.length(), opt_key3) != 0) {
variant_index = -2; // Not found
return m_options[0];
}
auto it2 = it;
++it2;
if (it2 != m_options.end() && it2->opt_key().compare(0, opt_key3.length(), opt_key3) == 0
&& printer_options_with_variant_1.find(opt_key2) == printer_options_with_variant_1.end())
variant_index = -2;
}
return m_options[it - m_options.begin()];
}
static Option create_option(const std::string &opt_key, const wxString &label, Preset::Type type, const GroupAndCategory &gc)
{
return make_option(get_key(opt_key, type), type, label, gc, comSimple, std::string(), true);
}
Option SettingsIndex::get_option(const std::string &opt_key, const wxString &label, Preset::Type type) const
{
std::string key = get_key(opt_key, type);
auto it = std::lower_bound(m_options.begin(), m_options.end(), Option({boost::nowide::widen(key)}));
// BBS: return the 0th option when not found in searcher caused by mode difference
if (it == m_options.end()) return m_options[0];
if (it->key == boost::nowide::widen(key)) return m_options[it - m_options.begin()];
if (m_groups_and_categories.find(key) == m_groups_and_categories.end()) {
size_t pos = key.find('#');
if (pos == std::string::npos) return m_options[it - m_options.begin()];
std::string zero_opt_key = key.substr(0, pos + 1) + "0";
if (m_groups_and_categories.find(zero_opt_key) == m_groups_and_categories.end()) return m_options[it - m_options.begin()];
return create_option(opt_key, label, type, m_groups_and_categories.at(zero_opt_key));
}
const GroupAndCategory &gc = m_groups_and_categories.at(key);
if (gc.group.IsEmpty() || gc.category.IsEmpty()) return m_options[it - m_options.begin()];
return create_option(opt_key, label, type, gc);
}
void SettingsIndex::add_key(const std::string &opt_key, Preset::Type type, const wxString &group, const wxString &category, const wxString &icon)
{
// Update fields in place so a page rebuild (get_option after set_path) doesn't drop the
// previously recorded wiki path.
GroupAndCategory &gc = m_groups_and_categories[get_key(opt_key, type)];
gc.group = group;
gc.category = category;
gc.icon = icon;
}
void SettingsIndex::set_path(const std::string &opt_key, Preset::Type type, const std::string &path)
{
if (path.empty())
return;
m_groups_and_categories[get_key(opt_key, type)].path = path;
}
} // namespace Search
} // namespace Slic3r
+98
View File
@@ -0,0 +1,98 @@
#ifndef slic3r_SettingsIndex_hpp_
#define slic3r_SettingsIndex_hpp_
#include <algorithm>
#include <cstddef>
#include <map>
#include <string>
#include <vector>
#include <wx/string.h>
#include <libslic3r/Config.hpp>
#include <libslic3r/Preset.hpp>
namespace Slic3r {
namespace Search {
struct InputInfo
{
DynamicPrintConfig *config{nullptr};
Preset::Type type{Preset::TYPE_INVALID};
ConfigOptionMode mode{comSimple};
};
struct GroupAndCategory
{
wxString group;
wxString category;
wxString icon; // icon of the group's own header, or empty
std::string path; // wiki path (Line::label_path) of the option's line, or empty
};
struct Option
{
// bool operator<(const Option& other) const { return other.label > this->label; }
bool operator<(const Option &other) const { return other.key > this->key; }
// Fuzzy matching works at a character level. Thus matching with wide characters is a safer bet than with short characters,
// though for some languages (Chinese?) it may not work correctly.
std::wstring key;
Preset::Type type{Preset::TYPE_INVALID};
std::wstring label;
std::wstring label_local;
std::wstring group;
std::wstring group_local;
std::string group_icon; // SVG base name of the group's own header icon, or empty
std::wstring category;
std::wstring category_local;
bool multi_category { false };
ConfigOptionMode mode{comSimple}; // option's visibility threshold; drives the Speed Dial's mode prompt
std::string tooltip; // localized ConfigOptionDef::tooltip, or empty
std::string wiki_path; // Line::label_path for the option's row, or empty
std::string opt_key() const;
};
// Catalog of settings and their metadata. Owns the group/category registry populated by the
// settings pages, plus two views of the options: the mode-filtered view the sidebar search
// queries, and every option regardless of mode for the Speed Dial.
class SettingsIndex
{
std::map<std::string, GroupAndCategory> m_groups_and_categories;
std::vector<Option> m_options; // mode-filtered view used by the sidebar search
std::vector<Option> m_all_modes; // every option regardless of mode, for the Speed Dial
void append_options(DynamicPrintConfig *config, Preset::Type type, ConfigOptionMode mode);
void sort_options();
public:
void init(std::vector<InputInfo> input_values);
// Rebuild the given type's options; returns false when the index was never initialised.
bool apply(DynamicPrintConfig *config, Preset::Type type, ConfigOptionMode mode);
void add_key(const std::string &opt_key, Preset::Type type, const wxString &group, const wxString &category,
const wxString &icon = wxEmptyString);
void set_path(const std::string &opt_key, Preset::Type type, const std::string &path);
const std::vector<Option> &options() const { return m_options; }
const std::vector<Option> &all_options() const { return m_all_modes; }
const Option & option_at(size_t pos) const { return m_options[pos]; }
const Option &get_option(const std::string &opt_key, Preset::Type type, int &variant_index) const;
Option get_option(const std::string &opt_key, const wxString &label, Preset::Type type) const;
const GroupAndCategory &get_group_and_category(const std::string &opt_key) { return m_groups_and_categories[opt_key]; }
void sort_options_by_key()
{
std::sort(m_options.begin(), m_options.end(), [](const Option &o1, const Option &o2) { return o1.key < o2.key; });
}
void sort_options_by_label() { sort_options(); }
};
} // namespace Search
} // namespace Slic3r
#endif // slic3r_SettingsIndex_hpp_
+8 -8
View File
@@ -5049,8 +5049,8 @@ void TabPrinter::build_fff()
}
// Register by hand so the UnsavedChanges dialog can render a row for it.
wxGetApp().sidebar().get_searcher().add_key("printer_agent", m_type, optgroup->title,
optgroup->config_category(), optgroup->icon);
wxGetApp().sidebar().settings_index().add_key("printer_agent", m_type, optgroup->title,
optgroup->config_category(), optgroup->icon);
}
}
@@ -5761,11 +5761,11 @@ if (is_marlin_flavor)
} else if (m_extruders_count_old == 1) {
first_extruder_title = wxString::Format("Extruder %d", 1);
}
auto & searcher = wxGetApp().sidebar().get_searcher();
auto & index = wxGetApp().sidebar().settings_index();
for (auto &group : m_pages[n_before_extruders]->m_optgroups) {
group->set_config_category_and_type(first_extruder_title, m_type);
for (auto &opt : group->opt_map())
searcher.add_key(opt.first + "#0", m_type, group->title, first_extruder_title, group->icon);
index.add_key(opt.first + "#0", m_type, group->title, first_extruder_title, group->icon);
}
Thaw();
@@ -7867,10 +7867,10 @@ wxSizer* TabPrinter::create_bed_shape_widget(wxWindow* parent)
}));
{
Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher();
const Search::GroupAndCategory& gc = searcher.get_group_and_category("printable_area");
searcher.add_key("bed_custom_texture", m_type, gc.group, gc.category, gc.icon);
searcher.add_key("bed_custom_model", m_type, gc.group, gc.category, gc.icon);
Search::SettingsIndex& index = wxGetApp().sidebar().settings_index();
const Search::GroupAndCategory& gc = index.get_group_and_category("printable_area");
index.add_key("bed_custom_texture", m_type, gc.group, gc.category, gc.icon);
index.add_key("bed_custom_model", m_type, gc.group, gc.category, gc.icon);
}
return sizer;
+16 -16
View File
@@ -1485,12 +1485,12 @@ std::string UnsavedChangesDialog::subreplace(std::string resource_str, std::stri
void UnsavedChangesDialog::update_tree(Preset::Type type, DynamicConfig * config, int from, int to)
{
Search::OptionsSearcher &searcher = wxGetApp().sidebar().get_searcher();
searcher.sort_options_by_key();
Search::SettingsIndex &index = wxGetApp().sidebar().settings_index();
index.sort_options_by_key();
for (const std::string &opt_key : config->keys()) {
int variant_index = -2;
const Search::Option &option = searcher.get_option(opt_key, type, variant_index);
const Search::Option &option = index.get_option(opt_key, type, variant_index);
auto category = option.category_local;
auto opt = dynamic_cast<ConfigOptionVectorBase*>(config->option(opt_key));
std::string value_from = opt->vserialize()[from];
@@ -1502,8 +1502,8 @@ void UnsavedChangesDialog::update_tree(Preset::Type type, DynamicConfig * config
void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* presets_)
{
Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher();
searcher.sort_options_by_key();
Search::SettingsIndex& index = wxGetApp().sidebar().settings_index();
index.sort_options_by_key();
// list of the presets with unsaved changes
std::vector<PresetCollection*> presets_list;
@@ -1558,11 +1558,11 @@ void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* pres
for (const std::string& opt_key : dirty_options) {
int variant_index = -2;
const Search::Option &option = searcher.get_option(opt_key, type, variant_index);
const Search::Option &option = index.get_option(opt_key, type, variant_index);
if (option.opt_key() != opt_key && variant_index < -1) {
// When founded option isn't the correct one.
// It can be for dirty_options: "default_print_profile", "printer_model", "printer_settings_id",
// because of they don't exist in searcher
// because of they don't exist in the index
continue;
}
auto category = option.category_local;
@@ -1590,8 +1590,8 @@ void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* pres
}
}
// Revert sort of searcher back
searcher.sort_options_by_label();
// Revert sort of index back
index.sort_options_by_label();
}
void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect)
@@ -2043,8 +2043,8 @@ void DiffPresetDialog::update_bottom_info(wxString bottom_info)
void DiffPresetDialog::update_tree()
{
Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher();
searcher.sort_options_by_key();
Search::SettingsIndex& index = wxGetApp().sidebar().settings_index();
index.sort_options_by_key();
m_tree->Clear();
wxString bottom_info = "";
@@ -2124,14 +2124,14 @@ void DiffPresetDialog::update_tree()
wxString right_val = get_string_value(opt_key, right_congig);
const std::string lookup_key = get_pure_opt_key(opt_key);
Search::Option option = searcher.get_option(lookup_key, get_full_label(lookup_key, left_config), type);
Search::Option option = index.get_option(lookup_key, get_full_label(lookup_key, left_config), type);
if (get_pure_opt_key(option.opt_key()) != lookup_key)
option = searcher.get_option(opt_key, get_full_label(opt_key, left_config), type);
option = index.get_option(opt_key, get_full_label(opt_key, left_config), type);
if (get_pure_opt_key(option.opt_key()) != lookup_key) {
// When the found option is not the requested one.
// This can happen for dirty_options such as:
// "default_print_profile", "printer_model", "printer_settings_id",
// because they do not exist in the searcher.
// because they do not exist in the index.
continue;
}
m_tree->Append(opt_key, type, option.category_local, option.group_local, option.label_local,
@@ -2155,8 +2155,8 @@ void DiffPresetDialog::update_tree()
Refresh();
}
// Revert sort of searcher back
searcher.sort_options_by_label();
// Revert sort of index back
index.sort_options_by_label();
}
void DiffPresetDialog::on_dpi_changed(const wxRect&)