In the good old days, with libc 4.*.*, if NLSPATH was set to "/usr/lib/locale/%N/%L" and LANG to "fr", then catopen("man",0) would open /usr/lib/locale/man/fr. These days, with libc 5.0.9, catopen will fail because it does a call to setlocale, and if no locale has been setup, the C locale is assumed, independent of the LANG setting. In order to preserve the possibility to say "LANG=de man fstab" for systems where no locale has been set up, I enclose here the original version of catopen. Concerning correctness: as far as I know POSIX does not specify catopen(), and X/Open specifies catopen() without mentioning any relation to locale - indeed, catopen() predates locale. So, I think catopen() in libc 5.0.9 is broken. --- Time goes on, and I just looked at glibc-2.0.5. Its catgets() contains (at least) two bugs, and will dump core. One is fixed in RedHat's glibc-2.0.5c-10; I have submitted a fix for the other. With a fixed catgets() things will work correctly. However, glibc does a secure_getenv("NLSPATH"), which means that the setting of NLSPATH is not taken into account for programs that are sgid or suid. Thus, if you make man suid or sgid, and want to use message catalogues, you have to install them in the default place - on my system that is /usr/share/locale/%L/man where %L is $LANG.