ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Vitaly Lipatov <lav@altlinux.ru>
To: ALT Devel discussion list <devel@altlinux.ru>
Subject: [devel] Заметки о локализации программ
Date: Wed, 10 Nov 2004 02:21:27 +0300
Message-ID: <200411100221.27454.lav@altlinux.ru> (raw)

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

Замечания по локализации 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!


             reply	other threads:[~2004-11-09 23:21 UTC|newest]

Thread overview: 115+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-11-09 23:21 Vitaly Lipatov [this message]
2004-11-10  7:11 ` Denis Ovsienko
2004-11-10  8:28   ` Vitaly Lipatov
2004-11-10  9:08 ` Sergey V Turchin
2004-11-10  9:19   ` Vitaly Lipatov
2004-11-10  9:39     ` Sergey V Turchin
2004-11-10  9:58 ` Mikhail Zabaluev
2004-11-10 12:44   ` Вячеслав Диконов
2004-11-10 11:55     ` Alexey I. Froloff
2004-11-10 13:42       ` Вячеслав Диконов
2004-11-10 12:51         ` Dmitry V. Levin
2004-11-10 13:51           ` [devel] [JT] Re: Заметки о локализации программ -- системных vs прикладных Michael Shigorin
2004-11-10 20:13             ` Вячеслав Диконов
2004-11-10 23:16               ` Mikhail Zabaluev
2004-11-11  4:57               ` Andrey Rahmatullin
2004-11-11  7:45               ` [devel] " Michael Shigorin
2004-11-10 14:08           ` [devel] Заметки о локализации программ Вячеслав Диконов
2004-11-10 13:36             ` Sergey V Turchin
2004-11-10 13:48             ` [devel] " Michael Shigorin
2004-11-10 14:01             ` [devel] " Andrei Bulava
2004-11-10 21:06             ` Andrey Orlov
2004-11-10 23:10               ` Mikhail Zabaluev
2004-11-11  6:54                 ` Anton Farygin
2004-11-11  8:28                   ` Mikhail Zabaluev
2004-11-11 12:03                     ` Andrey Orlov
2004-11-12  2:09                       ` [JT] " Mikhail Zabaluev
2004-11-12  8:29                         ` Michael Shigorin
2004-11-12 23:48                           ` Вячеслав Диконов
2004-11-13  4:05                             ` Andrey Rahmatullin
2004-11-13 10:06                               ` Вячеслав Диконов
2004-11-15  7:49                                 ` Anton V. Boyarshinov
2004-11-16 19:19                                   ` Вячеслав Диконов
2004-11-17 12:15                                     ` Michael Shigorin
2004-11-17 16:14                                     ` Денис Смирнов
2004-11-17 17:09                                     ` Sergey V Turchin
2004-11-13 10:24                             ` Michael Shigorin
2004-11-13 10:26                             ` Michael Shigorin
2004-11-15 10:48                             ` Денис Смирнов
2004-11-15 11:06                               ` Andrey Orlov
2004-11-15 21:28                                 ` Денис Смирнов
2004-11-15 23:10                                   ` Andrey Orlov
2004-11-16 16:37                                     ` Денис Смирнов
2004-11-15 15:31                               ` Andrey Rahmatullin
2004-11-16  6:52                                 ` Alexey I. Froloff
2004-11-16 10:12                                   ` [devel] Re: [JT] " Mikhail Zabaluev
2004-11-16 17:19                                     ` Денис Смирнов
2004-11-17  0:38                                       ` Mikhail Zabaluev
2004-11-17 16:01                                         ` Денис Смирнов
2004-11-18  0:30                                           ` Mikhail Zabaluev
2004-11-18 14:25                                             ` Денис Смирнов
2004-11-16 18:38                                   ` [JT] Re: [devel] " Денис Смирнов
2004-11-16 18:37                                 ` Денис Смирнов
2004-11-16 19:46                               ` Вячеслав Диконов
2004-11-17 12:07                                 ` Nick S. Grechukh
2004-11-17 12:14                                 ` Michael Shigorin
2004-11-17 13:41                                   ` Вячеслав Диконов
2004-11-17 14:03                                     ` Michael Shigorin
2004-11-17 16:13                                     ` Денис Смирнов
2004-11-17 16:09                                 ` Денис Смирнов
2004-11-17 16:56                                 ` Andrey Rahmatullin
2004-11-12  9:12                         ` Andrey Orlov
2004-11-12 13:25                           ` Nick S. Grechukh
2004-11-12 22:21                             ` Andrey Orlov
2004-11-12 23:55                               ` Вячеслав Диконов
2004-11-12 23:18                                 ` Andrey Orlov
2004-11-13 12:11                           ` Mikhail Zabaluev
2004-11-13 12:58                             ` Andrey Orlov
2004-11-13 13:11                               ` Mikhail Zabaluev
2004-11-13 14:21                                 ` Andrey Rahmatullin
2004-11-13 20:31                                 ` Andrey Orlov
2004-11-16 12:44                                   ` Nick S. Grechukh
2004-11-11 12:04                   ` Andrey Orlov
2004-11-12 19:19                     ` Вячеслав Диконов
2004-11-12 18:57                       ` Денис Смирнов
2004-11-12 22:07                       ` Andrey Orlov
2004-11-12 16:35             ` Andrey Astafiev
2004-11-12 23:10               ` Andrey Orlov
2004-11-12 23:03                 ` Denis Klykvin
2004-11-12 23:22                   ` Andrey Orlov
2004-11-15  5:28                   ` Alexey I. Froloff
2004-11-16 20:02                     ` Вячеслав Диконов
2004-11-17 12:09                       ` Nick S. Grechukh
2004-11-17 13:06                         ` Вячеслав Диконов
2004-11-17 13:11                           ` Alexey I. Froloff
2004-11-17 13:46                             ` Вячеслав Диконов
2004-11-17 14:01                               ` [devel] " Michael Shigorin
2004-11-17 14:03                               ` [devel] " Alexey I. Froloff
2004-11-17 16:16                               ` Денис Смирнов
2004-11-17 16:38                                 ` Nick S. Grechukh
2004-11-17 18:21                                   ` Денис Смирнов
2004-11-17 18:29                                     ` Nick S. Grechukh
2004-11-17 20:30                                       ` Денис Смирнов
2004-11-17 16:52                                 ` Andrey Rahmatullin
2004-11-17 18:25                                   ` Denis Smirnov
2004-11-17 12:10                       ` Alexey I. Froloff
2004-11-17 12:38                       ` Denis Klykvin
2004-11-17 13:18                         ` Вячеслав Диконов
2004-11-17 13:24                           ` Alexey I. Froloff
2004-11-17 13:51                             ` Вячеслав Диконов
2004-11-17 14:08                               ` Alexey I. Froloff
2004-11-17 20:13                                 ` Alexander Bokovoy
2004-11-18  6:58                                   ` Alexey I. Froloff
2004-11-17 14:12                               ` Nick S. Grechukh
2004-11-17 14:16                                 ` Nick S. Grechukh
2004-11-18  0:28                                 ` Mikhail Zabaluev
2004-11-17 13:35                           ` Denis Klykvin
2004-11-18  8:57                             ` [devel][JT] " Yury Aliaev
2004-11-18 10:46                               ` Denis Klykvin
2004-11-17 21:34                           ` [devel] [JT] " Anatoly A. Yakushin
2004-11-17 21:45                             ` Andrey Rahmatullin
2004-11-18  0:24                         ` [devel] " Mikhail Zabaluev
2004-11-18  6:54                           ` Denis Klykvin
2004-11-12 23:41               ` [devel] " Вячеслав Диконов
2004-11-10 15:05   ` Yuri N. Sedunov
2004-11-10 20:30     ` Vitaly Lipatov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200411100221.27454.lav@altlinux.ru \
    --to=lav@altlinux.ru \
    --cc=devel@altlinux.ru \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git