On Christians suggestion I have made the syntax a little cleaner for translators and others to read by removing the numbers between the percentage signs and passing in an array list rather than a plain list. Now the example becomes:
set msg_subst_list [list subject [parameter::get -localize -parameter classes_pretty_name]
class_instances [parameter::get -localize -parameter class_instances_pretty_plural]]
ad_return_complaint 1 [_ [ad_conn locale] dotlrn.class_may_not_be_deleted "" $msg_subst_list]
and the message in the catalog file is:
_mr en_US dotlrn.class_may_not_be_deleted {Error: A %subject% must have no %class_instances% to be deleted}
The reason I'm using percentage signs rather than @-signs is that I want to make it clear that those variables are not adp variables.