[devel] Заметки о локализации программ

Vitaly Lipatov =?iso-8859-1?q?lav_=CE=C1_altlinux=2Eru?=
Ср Ноя 10 02:21:27 MSK 2004


В процессе доработки некоторых программ у меня появился
опыт, который я в итоге записал. Если у кого-то будут
дополнения или замечания, жду.

Замечания по локализации GTK2-программ
=======================================

Введение
========

Как показывает практика, в большинстве программ, 
написанных на gtk2, вывод в консоль осуществляется
с помощью функции g_printf, которая есть ни что иное, как обёртка 
для
printf. Поскольку внутри программ на gtk2 используется 
кодировка UTF8 (обратных примеров не знаю), на консоль
выводится нечитаемая UTF8, без всякого перекодирования.
Но gtk имеется функция g_print, которая осуществляет
перекодирование в кодировку консоли.

Подлежат проверке сообщения выводимые на консоль
- в ходе работы программы
- при запуске с ключом --help
- сообщения в системных журналах. Это так?: Сейчас
все сообщения Гнома пишутся в журнал в UTF-8, и прочесть их
затруднительно.


Перекодировка строк
===================

Чтобы преобразовать строку в текущую локаль,
используйте:
gchar* g_locale_from_utf8(строка,-1,NULL,NULL,NULL)
и из локали в utf8:
gchar* g_locale_to_utf8(строка,-1,NULL,NULL,NULL)
получаемые с помощью этих функций строки желательно
освобождать после использования с помощью g_free(указатель)


Десятичный разделитель
======================

Если программа формирует выходные файлы, в которых
неверно указывается десятичный разделитель
(запятая вместо точки), то рекомендуется применить
setlocale(LC_NUMERIC, "C");

Локализация сообщений
=====================

Типовые строки для локализации сообщений в программе
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset(GETTEXT_PACKAGE,"UTF-8");
textdomain(GETTEXT_PACKAGE);


Общие рекомендации
==================

- вместо функций printf/g_printf для вывода в консоль
  использовать g_print
- вместо конструкций fprintf(stderr...) использовать g_error


Работа с файлами и файловыми диалогами
======================================
gchar* g_filename_from_utf8(строка,-1,NULL,NULL,NULL)
gchar* g_filename_to_utf8(строка,-1,NULL,NULL,NULL)
получаемые с помощью этих функций строки желательно
освобождать после использования с помощью g_free(указатель)

Во внутренних структурах программы рекомендуется хранить
название файла в filesystem encoding (которая получается
с помощью g_filename_from_utf8), но выдавать на редактирование
и сохранять в конфигурационные файлы - в utf8.

Возможно использование функции
g_filename_from_uri
в чём преимущества пока не знаю.

Для дублирование строк используется функция
g_strdup

Файловому диалогу передаётся название файла в filesystem 
encoding.
Устанавливается название файла такой конструкцией:
gtk_file_selection_set_filename(GTK_FILE_SELECTION(opendlg), 
filename);
Получается название файла так:
filename = 
gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs));

Вот типичный код получения названия файла в кодировке UTF8 (взят 
из dia):
const char *filename;
struct stat stat_struct;
filename = 
gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs));
if (stat(filename, &stat_struct) == 0) { // File already exist
    char buffer[300];
    char *utf8filename = NULL;
    if (!g_utf8_validate(filename, -1, NULL)) {
        utf8filename = g_filename_to_utf8(filename, -1, NULL, 
NULL, NULL);
        if (utf8filename == NULL) {
            message_warning(_("Some characters in the filename 
are neither UTF-8 nor you local encoding"));
        }
    }
    if (utf8filename == NULL) utf8filename = g_strdup(filename);
    g_snprintf(buffer, 300,
        _("The file '%s' already exists.\n"
        "Do you want to overwrite it?"), utf8filename);
    ....
    g_free(utf8filename);
}


Замечания по локализации QT/KDE программ
========================================

Работа с файлами и файловыми диалогами
======================================

Как нельзя получать название файла:
       result.second = string(dlg.selectedFile().data());
Как надо:
       result.second = fromqstr(dlg.selectedFile());

       
Порядок испытания программы на корректную работу с локалью
==========================================================

Проблема работы с файлами, названными по-русски, может
возникнуть в любой программе. Вот примерный план проверки:

1. Сохранение файла с русским названием в английский каталог

2. Сохранение файла с русским путём к файлу

3. Корректное название вновь создаваемого файла
   (в диалоге Создать)

4. Открытие файла по русскому пути (во всех возможных
  диалогах вставки и открытия файла)

5. Проверка экспортируемых файлов (например EPS на предмет
  корректности оформления цифр (десятичный
  разделитель), проверяется через
  $ LANG=C программа

6. Запуск программы с указанием русского файла в
  качестве параметра

Дополнительное замечание: Файловые диалоги при
повторном обращении должны помнить предыдущий каталог.


Vitaly Lipatov <lav на altlinux.ru>, 2004

09.11.2004

-- 
Lav
Виталий Липатов
Санкт-Петербург
GNU! ALT Linux Team! LaTeX! LyX!



Подробная информация о списке рассылки Devel