The following is a bit of a kludge, but it can be done in map layouts, and avoids mucking around with locale settings.
In the layer properties, keep the legend format as %1 - %2
.
In the legend definition on your layout, edit the expression for the layer in the legend (the curly E button in the icons at the bottom when you have the layer entry selected; not the individual graduated children but the whole layer; and also not the 2nd E at the far bottom right which relates to filtering). Replace @symbol_label
with replace( @symbol_label,'.',',')
.
This works by post-processing the string generated by the %1 - %2
and doing a string replace of decimal point by comma. You could get much fancier if you needed to by changing the legend format to some format easier to re-parse into its constituents and then extracting those constituents and formating it in a more sophisticated way using full expression syntax in the layout label expression, if you needed to. I have used this, for instance, to show graduated levels both in (native) metres as well as converted to feet.