[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Linux internationalization page



> А про симлинки и алиасы он просто не знает.

Кстати, я тут буквально вчера нарыл весьма тонкий
момент в POSIX и locale... Если строго следовать POSIX,
то ЛЮБЫЕ Aliases нарушают стандарт.

Дело в том, что setlocale(3) определена так :
      char * setlocale(int category, const char *locale)


То есть, функция ВОЗВРАЩАЕТ указатель на string.

Теперь предположим, что у нас работает Alias
ru_RU.KOI8-R  --->  ru_SU

================
##include <stdio.h>
#include <locale.h>
#include <string.h>

main () {
char * reqlcname="ru_RU.KOI8-R";
char * gotlcname;

printf("We req = %s\n",reqlcname);
gotlcname=setlocale(LC_CTYPE, reqlcname);
printf("We got = %s\n",gotlcname);

if ( strcmp(gotlcname, reqlcname))
   printf("We can't set REQUIRED locale !\n");
else
   printf("Great! All OK.\n");
}
=========

То есть, если имя locale пропушено через locale.alias или
даже через symlink, у нас есть полное право считать что
setlocale() не сработала. Других способов определить,
сработала ли установка locale *просто нет*, потому что, если мы
запросим действительно НЕСУЩЕСТВУЮЩУЮ locale :
      setlocale(LC_CTYPE, "un_KNOWN.Locale");
мы по стандарту POSIX должны получить указатель на "C" !


 (Представляю, как кисло будет Ulrich-у Drepper-у ;-)

 Отсюда вытекает правило : если вы хотите точно следовать
POSIX, используйте ПОЛНОЕ длинное имя locale :
language_TERRITORY.Codeset и сделайте чтобы данный
"объект локализации" РЕАЛЬНО существовал.

--
-=AV=-