I think if we are being strict, in XHTML, in browsers that treat the content as XML and which do not parse the DTD, then will not work, so it is always safer to use numeric entities like . Or since all lang files are UTF-8 anyway, just put the characters in them directly.
Anyway, I suppose the issue is: what do lang strings contain? Is it plain text, or HTML source? I guess it is HTML source, in which case the rule should be numeric entities only (plus the three that are included in XML: <, >, &, ', ").
However, when lang strings are output as attribute values in the HTML, it is essential that ' and " are output as ' and ", and that is certainly not the case in any language pack I have seen. Therefore the strings need to be fed through a function to escape them, and s() and p() are Moodle's standard function for doing this, and we seem to have come full circle.
Please someone explain to me!
After more inspection, it turns out that the only entities that are parsed are in the form ddd;, where the d's are digits. The & is not parsed, but printed instead.