Ok, I think I fixed it this time properly in r33362 (apologies for the earlier fix; I had an existing participation with Attended that I thought I deleted - which I didn't - and then mistook for a fixed case).
A couple of comments:
1. I fixed the API 2 massaging code used, as it's the point which translates, say, participant_role to participant_role_id, so I followed suit. The logic handling role is not ideal, but I'd rather not fix it at this point; we want API 2 frozen and minimise changes to it.
2. The code for handling participant_status_id is broken - it will only work if participant_status_id has the status's label, and breaks if someone passes the actual id. I carefully fixed it in r33366 in a way that it works when an id is passed and has a fallback when a label is passed, but might break if someone uses digit-starting labels (PHP will happily treat if ((int) '2foo')) as true). Still, I think it's better than broken import (even if it breaks some edge cases in API), but please do review.
Finally, can you elaborate on why you think it wouldn't work on multilingual installs? The SELECT id FROM civicrm_participant_status_type WHERE label = %1 query should work just fine (it'll get rewritten on-the-fly to use the current locale's civicrm_participant_status_type_xx_YY view, which then would look up the localised label).
Fixed in r33329.