Что значит "программа правильно написана" ?

Во-первых, программа нигде не привязана к 7-ми битным ASCII символам, и пользуется стандатрными библиотечными функциями isalpha(), isupper(), и tolower()/toupper() не полагаясь, что Upper=Lower+0x20 и т.д. Как правило, национальные алфавиты расположены начиная с кода 128, поэтому для совместимости со старыми реализациями locale можно объявить все символы как unsigned char, например ключом компилятора (для gcc -funsigned-char) или явно.

Во-вторых, программа явно начинается с вызова setlocale(LC_ALL,"") (такая форма вызова означает, что всем категориям локализации сразу будет присвоено значение переменной окружения LANG), или подобного кода.


*ПРИМЕЧАHИЕ: Во FreeBSD можно вылечить некоторые программы путем
* задания строки окружения: export ENABLE_STARTUP_LOCALE=""
* тогда setlocale(LC_ALL,"") будет вызываться автоматически при старте
* программ (без их перекомпиляции).
* В Linux libc такого нет (пока?) и по умолчанию включено "C".
* Однако можно пересобрать Linux libc, указав другое значение
* по умолчанию.

Для полной поддержки NLS весь вывод сообщений пользователю должен происходить c использованием функций NLS и должен быть создан каталог сообщений (message catalog) для данной программы (и данного языка).