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!
next 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