Two small "bugs" I've noticed - nothing particularly wrong with the code though.
1) Some languages have the first three letters the same in 2 or more months. For example in French: Juin and Juillet would both become just "Jui" after being trimmed to three letters by date_i18n(). The French often use "Jul" for Juillet instead.
2) It's a little more difficult to translate (due to special rules in some languages) but date("S") returns "English ordinal suffix for the day of the month, 2 characters" (i.e. st, nd, rd, th). In Norwegian at least, they should all just be "e". It's a lot less common to use, but is there any reason why date("S") was left out?