setlocale() has issues in Windows that is mentioned in PHP's official documentation itself:
The locale information is maintained per process, not per thread. If you are running PHP on a multithreaded server API like IIS or Apache on Windows, you may experience sudden changes in locale settings while a script is running, though the script itself never called setlocale(). This happens due to other scripts running in different threads of the same process at the same time, changing the process-wide locale using setlocale().
Windows users will find useful information about locale strings at Microsoft's MSDN website. Supported language strings can be found in the » language strings documentation and supported country/region strings in the » country/region strings documentation.
Mainly what you need to realize is that many PHP functions are wrappers over *ix OS program APIs. So they will work well in linux and other compatible OSes - not that well in Windows.