Nine messages were never passed through tr(), so every user saw them in
French: the undo entries for grouping and ungrouping terminals, for
editing an arc (3), an ellipse, a rectangle and a PLC table in the
element editor, and the error box when integrating a title block
template fails. They are now wrapped, text unchanged.
qet_en.ts also lacked English for 63 messages added since the last
translations update (Customize dialog, mouse gestures, toolbar contents,
mirror, element scale, paste element information, paper format).
update_translations was run on qet_en.ts with lupdate's guessing
heuristics off, then the 72 new entries were translated. Most of the
diff is lupdate refreshing line numbers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TitleBlockTemplateLogoManager never sets read_only_: its constructor
leaves the member uninitialised, and setReadOnly() returns early when
the new value equals the member. The template editor calls
setReadOnly() right after creating the manager, so whenever the
garbage value happened to match, the call did nothing: the add, delete
and rename buttons stayed enabled on a read-only template, and
isReadOnly() returned garbage.
Give the member a default value, false, in the header, matching the
buttons' state after construction. Only
sources/titleblock/templatelogomanager.h changes.
No behaviour change for an editable template: setReadOnly(false) on a
manager that is already editable still returns early. No file-format
change.
Tests: none of their own; an uninitialised read is what a sanitizer
finds, and this one is the same kind as the BorderTitleBlock and
ConductorProfile fixes (#1358, #1359). ctest on macOS, and all
example projects through --resave and --export-svg, unchanged.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Beat Hangartner <beat@hangartners.ch>
PartLine and PartPolygon keep their rotation in m_rot, which nothing
sets until setRotation() is called. rotation() reads it, and
setRotation() computes the difference from it, so the first rotate of
a freshly drawn line or polygon in the element editor starts from
garbage: qRound(m_rot * 100.0) on an arbitrary value is undefined
behaviour, and the angle stored afterwards is arbitrary too.
PartRectangle and PartEllipse already start at 0.
Give m_rot a default value of 0 in both headers, as PartEllipse has.
Only the two headers change.
No file-format change, and no change for a part loaded from a file or
rotated once, since both set m_rot before reading it.
Tests: none of their own; an uninitialised read is what a sanitizer
finds, and this one is the same kind as the BorderTitleBlock and
ConductorProfile fixes (#1358, #1359). ctest on macOS, and all
example projects through --resave and --export-svg, unchanged.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Beat Hangartner <beat@hangartners.ch>
lupdate over sources/ adds the 164 strings merged after the last
translations update (da39ec1c8) and revives 3 entries it had wrongly
marked vanished (the issue #1366 describes for English); the mirror
script then fills the new ones. qet_fr.qm: 3792 finished, 0 unfinished,
0 null records.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
After a lupdate refresh, the same-text heuristic fills a new string with
the translation of an existing identical one and marks it unfinished.
In the source-language file that guess is the source text itself, which
is exactly what a mirror run writes, but the script left it alone as
"work in progress": 39 such entries stayed unfinished in qet_fr.ts after
refreshing it on 2026-10-07.
The script now finishes an unfinished translation (or plural with all
forms) that is identical to its source. Unfinished translations with
other text stay untouched. Two fixture messages and a test cover it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The strings in the code are French and serve as both translation key
and displayed text. lang/qet_fr.ts was almost empty: 3425 messages and
22 plural messages had no translation, so lrelease compiled them as
null-string records (3469 in qet_fr.qm) and the French UI showed the
code text through QTranslator's null fallback. Correcting French
wording therefore meant changing the key, which orphans the translation
of that string in all 33 other language files; the "Élement" typo fix
needed a key rename in 34 files for one accent.
This copies every empty French entry's source text into its own
translation, so qet_fr.qm is complete (514 KB, 0 null records, like
the other languages) and French wording can be corrected in the .ts
alone. Translations that already had text (113 French renderings of
English-written sources, 16 identical, 54 plurals) are untouched, as
are the 10 vanished entries. The file is byte-identical outside the
rewritten <translation> elements.
misc/i18n/mirror_source_language.py does the copy and is meant to run
after update_translations; --check exits 1 when a run is needed.
Forgetting it breaks nothing: an empty entry still falls back to the
code text. INSTALL.md section 10 explains the rule and that
-removeidentical must never be added to lrelease. Tests:
misc/i18n/test_mirror_source_language.py with a before/after fixture
pair covering every message class.
No visible change in the application.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Edit > Scale element... scales the whole element about its hotspot by a
factor picked from x0.5, x1.5, x2, x2.5, x3, x4. Only the factors that
leave every terminal on the 10 px folio grid are offered, so wires to a
scaled element stay straight. An element whose terminals are off the grid
today is offered only the factors that bring them on to it; if none does,
the dialog says so and OK is disabled.
Drawn parts are scaled with their existing handleUserTransformation(), as
the resize handles do. Texts, dynamic text fields and terminals are set
directly so that font sizes (whole points, 4 pt minimum), terminal name
offsets and line end sizes scale too, which the resize handles do not do.
One undo step restores the element.
Unlike "Import an element to resize", this needs no external program and
works on the element being edited.
Grew out of issue #1338.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Issue #1375: replacing a symbol meant retyping its label, manufacturer,
part number and the rest by hand. Copy the old symbol (Ctrl+C), select
the new one(s), then Edit > Paste element information, also in the
right-click menu of a selection.
Every field filled in on the copied symbol overwrites the same field on
each selected symbol; fields it leaves empty are left alone, since empty
fields are not written to the clipboard. The label and its formula move
together, so a target whose label comes from a formula takes the copied
label rather than rebuilding its own. A numbering-scheme id is kept only
if the scheme exists in the target project. Plain slaves and folio
reports are skipped: they take their information from what they are
linked to, as in the properties dialog. One undo step.
Enabled only when the clipboard holds exactly one symbol. The clipboard
is parsed once when it changes, not on every selection change.
No default shortcut: Ctrl+Shift+V, suggested in the issue, is already
"Paste at origin". It can be assigned in the shortcut settings.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The crop rectangle came back as the string "x,y,width,height", which a
script had to split and parse. elementGeometry() returns a map; the
crop now does the same, and an empty map for no such image.
Suggested in the review of #1310.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A picture remembers whether its pivot was placed by hand: a hand-placed
pivot is saved and kept through a resize, a default one is not saved
and recentres after a resize. Two actions changed that flag outside
their undo step:
- applyCrop() marked the pivot as default after moving it to the centre
of the kept region. After Ctrl+Z the pivot was back where the user
had put it, but marked as default, so the next save dropped it.
- dragging the pivot handle marked it as hand-placed. After Ctrl+Z the
pivot was back at the centre but still marked as hand-placed, so a
later resize left it at the handle's anchor corner.
pivotIsCustom becomes a property, and both actions put it into their
undo command next to rawPivot. tst_imagecropundo checks that a project
saved after undoing a crop keeps its hand-placed pivot.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The "general" tab of the element properties starts its description with
tr("Élement\n"), missing the second accent. The French UI shows the typo,
and the misspelt string is the translation key in all 34 lang/qet_*.ts
files (and from there was copied into 11 phrase books).
This fixes the source string to "Élément\n" and renames the key in the
34 .ts files so every existing translation stays attached. Without the
.ts change, the next lupdate run would mark the old entry vanished and
add an empty "Élément" entry: lupdate's similar-text heuristic does not
carry the translation over (checked with Qt 6.11 lupdate on copies of
qet_de/pl/en/fr.ts). With the change, lupdate reports the entry as
already existing and keeps the translation. qet_fr.ts also gets the
corrected spelling as its translation.
No behaviour change besides the one character in the label. The phrase
books keep their copy of the typo for now; they are cleaned up with the
other phrase-book corrections.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Four strings added on this branch rendered "maître" as "nadrzędny",
following the rest of the file. A Polish reviewer confirmed that the
phrase book's "Element główny" is the right term and "nadrzędny" is
wrong for a master element. The 14 older entries that use "nadrzędny"
are left for a separate change, so this PR does not rewrite existing
translations.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream added 154 source strings after the last translations update
(da39ec1c8), among them the Toolbars, Shortcuts, Gestures and 3D mouse
pages, DXF block export, the image dark-theme option, text width and
cross-reference stacking. That update had also marked 38 entries vanished
whose strings are still in the code (table properties, text field
properties, database model widget), so lrelease left them out and the
German UI showed French there (the same issue #1366 fixes for English).
lupdate over sources/ revives the 38 with their existing translations and
adds the new strings; the 116 that had no translation are translated with
the terms the file already uses. lupdate's same-text suggestions were
reviewed rather than accepted (e.g. "Grille des textes" had been offered
as "Textübersicht"). Most of the diff is lupdate moving line numbers.
Checked with lrelease (3782 translations, no warning) and the placeholder
check for every changed entry.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream added 154 source strings after the last translations update
(da39ec1c8), among them the Toolbars, Shortcuts, Gestures and 3D mouse
pages, DXF block export, the image dark-theme option, text width and
cross-reference stacking. That update had also marked 38 entries vanished
whose strings are still in the code (table properties, text field
properties, database model widget), so lrelease left them out and the
Polish UI showed French there (the same issue #1366 fixes for English).
lupdate over sources/ revives the 38 with their existing translations and
adds the new strings; the 116 that had no translation are translated with
the terms the file already uses. lupdate's same-text suggestions were
reviewed rather than accepted; the 20 offered for Polish were kept
after review. Most of the diff is lupdate moving line numbers.
Checked with lrelease (3782 translations, no warning) and the placeholder
check for every changed entry.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
qet_de.ts had 407 strings with no German translation (plus 7 plural
entries with only the singular filled), almost all from features merged
in the last two months: auto-numbering pages, script manager, AI
assistant dialog, live server, material list, prefix configuration,
element info widget, fillet/arc tools, alignment and grouping. A German
user saw the French source text in those places.
This fills every empty translation and the missing plural forms, using
the terms the file already uses (Bauteil, Seite, Leiter, Anschluss,
Nummerierung, Schnellzugriffsleiste). Two existing entries were wrong
and are corrected: "Exécuter un script" was translated as "v", and the
spin-box suffix " pas de grille" (grid steps) as " kein Raster".
No source code or file-format change. Checked with lrelease (3630
translations, no warning) and a script that compares source and
translation placeholders (%1, %n) for every changed entry.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
qet_pl.ts had 675 strings with no Polish translation (plus 4 plural
entries with missing forms), almost all from features merged in the last
two months: auto-numbering pages, script manager, AI assistant dialog,
live server, material list, prefix configuration, shortcut bar, element
picker, conductor and background colour buttons, fillet/arc tools,
alignment and grouping. A Polish user saw the French source text in
those places.
This fills every empty translation and the missing plural forms, using
the terms the file already uses (element, arkusz, przewód, zacisk,
numeracja, pasek skrótów). Three existing entries are corrected: the
plural of "%n action(s)" contained the placeholder "niepewne"
(uncertain) and an empty third form, the PDF page count had only its
first form, and "Borne" was translated as "Terminal" twice while the
rest of the file uses "Zacisk".
No source code or file-format change. Checked with lrelease (3630
translations, no warning) and a script that compares source and
translation placeholders (%1, %n) for every changed entry.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Brings in master's DXF blocks (#1339) through #1354. The upright texts
now live in drawSymbol() too, and a turned symbol whose texts stay
horizontal is drawn in full like a mirrored one: an INSERT would turn
its texts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts with the DXF blocks export (#1350) and the picture factory
leak fix. The mirror now lives in drawSymbol(); a mirrored symbol is
drawn in full rather than as an INSERT of its block, since a negative
INSERT scale would mirror its texts too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On GTK desktops (Mint, XFCE, GNOME) Qt hands QColorDialog to GTK's
chooser. Its "Custom" row is a recent-colours list kept by GTK: every
colour picked is pushed in on the left and the oldest drops out, so a
user's saved wire colours are lost (forum topic 3190). It also ignores
the custom colours QET saves (#918) and has no swatch grid for the
double-click to accept (#1172).
Pass DontUseNativeDialog at every colour dialog, so all platforms get
the dialog Windows already shows: 16 custom slots that change only on
"Add to Custom Colors", saved across restarts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lupdate over sources/ finds 98 new source texts. 41 are new and are
translated here: the Toolbars settings page, the new Shortcuts page
controls (category filter, search by key, Menu column, copy list), the
Edit > Selection submenu, DXF block export options, cross-reference
stacking, picture dark-theme adaptation and text width.
The other 57 were already translated but marked vanished by the
4 October translations update (da39ec1c8), so lrelease left them out
and these screens showed French in the English interface: the 3D mouse
settings page, the table properties editor and the text field
properties. They come back with their existing English.
lrelease: 3737 finished, 0 unfinished.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Configuration > Personnaliser... (also at the bottom of a toolbar's
right-click menu) opens one window with a tab for each page that sets
how the user works: Barres d'outils, Contenu des barres, Barre de
raccourcis, Raccourcis and Gestes de la souris, like SolidWorks'
Tools > Customize. The tabs are the same pages the configuration
dialog shows, which keeps them. OK applies every tab, Cancel none.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>