LINUX.ORG.RU

Вопрос про gettext


0

1

Есть ли в gettext возможность перезагрузки языка без перезапуска программы?

В Qt, например, есть очень удобный механизм для данной задачи. И многие программы используют его.

А прог на Gtk+, умеющих обновлять локализацию на лету, я что-то не припомню. Может быть кто-нибудь здесь подскажет такие проги...

Во всех исходниках программ, использующих gettext, которые я смотрел, либо надо изменять переменные окружения перед запуском программы, либо они изменяются в самой программе при ее инициализации. Оба варианта мне не подходят...

★★

> Есть ли в gettext возможность перезагрузки языка без перезапуска программы?
Есть

А прог на Gtk+, умеющих обновлять локализацию на лету, я что-то не припомню

man HIG

Во всех исходниках программ, использующих gettext, которые я смотрел,

либо надо изменять переменные окружения перед запуском программы,


либо они изменяются в самой программе при ее инициализации.


Чушь полная, ничего такого нету. man setlocale, man bindtextdomain, info gettext.

GArik ★★★
()

Тебе прийдется городить костыли, чтобы «перевести» весь гуй. В Qt для этого есть специальное событие, кажись. А gettext это библиотека на гуй не завязанная.

P.S. Тут походу проявляются истинные причины Gnome HIG.

Kosyak ★★★★
()
Ответ на: комментарий от GArik

Есть ли в gettext возможность перезагрузки языка без перезапуска программы?

Есть

Голословное утверждение.

А прог на Gtk+, умеющих обновлять локализацию на лету, я что-то не припомню

man HIG

Без пруфлинка на соответсвующий раздел или пример исходников не принимается.

Во всех исходниках программ, использующих gettext, которые я смотрел, либо надо изменять переменные окружения перед запуском программы, либо они изменяются в самой программе при ее инициализации.

Чушь полная, ничего такого нету. man setlocale

Сам себе противоречишь: LC_ALL, LC_COLLATE, LANG и т.п. --- это и есть переменные окружения.

info gettext

Это базовая информация про gettext, которую я конечно же посмотрел. Но ответа на свой вопрос не нашел. Кстати, в этой документации название раздела «2.3.2 Locale Environment Variables» как бы намекает...

man bindtextdomain

Это вообще не в тему. Данная функция лишь указызывает имя *.mo-файлов к программе и общий путь к файлам локализации (например, /usr/share/locale/). Язык (используемая локаль) определяется только переменными окружения.

Tehnick ★★
() автор топика

Может кому-то пригодится. Нагуглил простой и доступный пример:
http://linuxland.itam.nsc.ru/misc/other09/node24.html
Понял причину того, что у меня в сложной программе не работало переключение: у LANG самый низкий приоритет.

Но это решает лишь часть проблемы. Для гуя придется ваять костыль...

Tehnick ★★
() автор топика
Ответ на: комментарий от Tehnick

Параметры локализации устанавливаются через параметры к setlocale(), а не через переменные окружения. Да, можно с помощью setlocale() установить в своей программе настройки такие же как в системе через переменные окружения. Но! Путём считывания переменных окружения, а не их установки. Тот пример по ссылке явно от такого же товарища, который манов не читает. Посмотрите в пакете gettext-tools, там должны быть нормальные примеры использования. Если у вас нет их, то скачайте тарболл с исходными текстами и смотрите в gettext-tools/examples/.

GArik ★★★
()
Ответ на: комментарий от GArik

/usr/share/doc/gettext-doc/examples

$ grep -wr setlocale .
./hello-objc/hello.m:/* Get setlocale() declaration. */
./hello-objc/hello.m: setlocale (LC_ALL, "");
./hello-c/hello.c:/* Get setlocale() declaration. */
./hello-c/hello.c: setlocale (LC_ALL, "");
./hello-guile/hello.scm:(catch #t (lambda () (setlocale LC_ALL "")) (lambda args #f))
./hello-c++-gnome/hello.cc: setlocale (LC_ALL, "");
./hello-c++/hello.cc:// Get setlocale() declaration.
./hello-c++/hello.cc: setlocale (LC_ALL, "");
./hello-c++-kde/admin/acinclude.m4.in: AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \
./hello-php/hello.php: setlocale (LC_ALL, "");

Где?

Tehnick ★★
() автор топика
Ответ на: комментарий от GArik

> Код то на каком ЯП? Мне кажется тут не такая хитрая загадка.

Подразумевался C++. Зря не указал видимо...

Tehnick ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.