Linux - статьи

Как вылечить локализацию в Linux


From: Ales Popov


NM) libc-5.2.18, ld.so-1.7.14...


Вот в этой библиотеке дело ^^^^^^^^^^ !


Можно просто взять ее с CD Linux.Yes или пересобрать эту библиотеку.


Только надо в сырцах исправить, - это вот с того сидюка:

=== Begin 11.r ===

Eugene Shakhtarin


Локализация koi8-r для версии libc 5.2.18 (ELF).


Сделано в Linux kernel 1.3.57, gcc 2.7.2.

  • Описание механизма генерации locale находится здесь:

    http://es-sun2.fernuni-hagen.de/public/mirrors/GCC-experimental/Intro

  • Стандарты charmap и locale находятся здесь:
  • В дистрибутиве libc 5.2.18 функция libc/locale/ctype.c неисправна, а именно, в операторе (is_upper ? toupper_done : tolower_done) |= BIT (token); выражение BIT (token) равно 0 вместо необходимой 1 и tolower_done получает значение 0, даже когда tolower таблица сформирована. ctype.c далее принимает решение заменить tolower на умолчание.




    Для починки требуется замена в libc/locale/ctype.c:

    /*

    static unsigned short toupper_done = 0;

    static unsigned short tolower_done = 0;

    */

    static unsigned toupper_done = 0;

    static unsigned tolower_done = 0;


    Вот соответствующий патч:

    *** ctype.c.orig Tue Jan 16 19:02:43 1996

    --- ctype.c Tue Jan 16 19:03:23 1996

    ***************

    *** 54,59 ****

    --- 54,63 ----

    /* Remember which class or conversion is already done. */

    static unsigned short class_done = 0;

    + /*

    static unsigned short toupper_done = 0;

    static unsigned short tolower_done = 0;

    + */

    + static unsigned toupper_done = 0;

    + static unsigned tolower_done = 0;

    #define SYNTAX_ERROR \


    Здесь находятся http://eugene.mplik.ru/pub/Linux/utils/nls/locale/libc-5.2.18.fix/:


    ctype.c -- 6534 исправленный вариант ctype.c


    localedef.gz -- 53833 программа, оттранслированная для отладчика с ключем -g

  • Трансляция localedef.c (и locale.c):

    make SHARED= programs

  • В libc 5.2.18 поддержка LC_COLLATE не реализована вообще.
  • Для генерации базы данных locale для koi8-r в депозитарии

    нет готовых исходных данных.


    Исходные данные для генерации koi8-r находятся здесь:


    http://eugene.mplik.ru/pub/Linux/utils/nls/locale/share/nls/charmap/KOI8-R



    http://eugene.mplik.ru/pub/Linux/utils/nls/locale/share/nls/locale/ru_RU

    Эти данные подготовлены на основе стандартов ISO 10646 (Unicode), RFC-1489 и депозитария

    Файлы KOI8-R и ru_RU не являются официальными документами и не обладают никаким формальным статусом. Они сделаны для личного употребления, не имеют ограничений на тиражирование, и гарантия их пригодности для каких-либо определенных целей абсолютно

    отсутствует.


  • Генерация базы данных locale для koi8-r.

    7.1) Создать каталоги

    mkdirhier /usr/share/nls/charmap

    mkdir /usr/share/nls/locale

    mkdir /usr/share/locale

    7.1) Разместить описания KOI8-R и ru_RU в каталогах

    /usr/share/nls/charmap/KOI8-R

    /usr/share/nls/locale/ru_RU

    7.2) Построить описание категорий koi8-r в каталоге /usr/share/locale/koi8-r/

    localedef -c -i /usr/share/nls/locale/ru_RU -f KOI8-R koi8-r

    Уже готовый набор описаний категорий koi8-r, полученный описанным методом, находится в http://eugene.mplik.ru/pub/Linux/utils/nls/locale/share/locale/koi8-r/


  • Использование построенной локализации koi8-r.

    8.1) Определить переменную командной среды

    export LANG=koi8-r

    После этого программы, созданные на базе libc 5.2.18 с учетом locale,

    будут локализованы соответствующим образом.

    8.2) Для интернационализации создаваемой программы необходимо применить

    функцию setlocale (см. man setlocale), например:

    #include

    #include

    main()

    {

    int c, C;

    setlocale(LC_ALL, "");

    c='й';

    C=toupper(c);

    printf("%c\n", C);

    C='Й';

    c=tolower(C);

    printf("%c\n", c);

    }



  • Содержание раздела