The internationalization system supports gramatical gender in theory, but it looks like most messages, even ones that involve people, are not configured to use it properly. I tested this by adding, in a translations file:
'%s added %s project(s): %s.' => array( array( '%s he-added a project: %3$s.', '%s he-added projects: %3$s.', ), array( '%s she-added a project: %3$s.', '%s she-added projects: %3$s.', ) ),
This is similar to the example at https://secure.phabricator.com/T5267#199219, and, instead of properly inflecting on the grammatical gender of the person, produces:
[Invalid Translation!] The "en_US" language data offers variant translations for the plurality or gender of argument 1, but the value for that argument is not an integer, PhutilNumber, or PhutilPerson (it is a value of type "PhutilSafeHTML"). Raw input: <%s added %s project(s): %s.>.