Проблема: переключение на русский язык

Обсуждение вопросов, связанных с системой проведения турниров ejudge.
cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:
Re: Проблема: переключение на русский язык

Post by cher » 31 March 2008, 18:00

Покажите, пожалуйста, содержимое файла config.h

GinKage
Posts:12
Joined:27 March 2008, 17:47

Re: Проблема: переключение на русский язык

Post by GinKage » 01 April 2008, 10:18

/* config.h. Generated from config.h.in by configure. */
/* -*- mode:c -*- */
/* $Id: config.h.in 4763 2008-03-07 20:49:26Z cher $ */

#ifndef __CONFIG_H__
#define __CONFIG_H__

/* a suffix for CGI programs */
#define CGI_PROG_SUFFIX ""

/* whether internalization is enabled */
#define CONF_HAS_LIBINTL 1

/* the installation prefix directory */
#define EJUDGE_PREFIX_DIR "/home/ejudge/inst-ejudge"

/* the default path to the l10n_dir */
#define EJUDGE_LOCALE_DIR "/home/ejudge/inst-ejudge/share/locale"

/* the path to the ejudge server binaries (bin or libexec/ejudge) */
#define EJUDGE_SERVER_BIN_PATH "/home/ejudge/inst-ejudge/bin"

/* the path to the `serve' program */
#define EJUDGE_SERVE_PATH "/home/ejudge/inst-ejudge/bin/serve"

/* the path to the `run' program */
#define EJUDGE_RUN_PATH "/home/ejudge/inst-ejudge/bin/run"

/* the path to the script directory */
#define EJUDGE_SCRIPT_DIR "/home/ejudge/inst-ejudge/libexec/ejudge"

/* the path to the ejudge's cgi programs */
#define EJUDGE_CGI_BIN_DIR "/home/ejudge/inst-ejudge/libexec/ejudge/cgi-bin"

/* the default charset */
#define EJUDGE_CHARSET "utf-8"

/* the default path to the userlist-serve socket */
#define EJUDGE_SOCKET_PATH "/tmp/userlist-socket"

/* the default path to the super-server control socket */
#define EJUDGE_SUPER_SERVE_SOCKET "/tmp/super-serve-socket"

/* the default path to the new-server control socket */
#define EJUDGE_NEW_SERVER_SOCKET "/tmp/new-server-socket"

/* the path to the ejudge configuration directory */
#define EJUDGE_CONF_DIR "/home/judges/data"

/* the default location of the ejudge.xml configuration file */
#define EJUDGE_XML_PATH "/home/judges/data/ejudge.xml"

/* the default path to the contests configuration directory */
#define EJUDGE_CONTESTS_DIR "/home/judges/data/contests"

/* the path to the contests home directory */
#define EJUDGE_CONTESTS_HOME_DIR "/home/judges"

/* the path to the local state directory */
/* #undef EJUDGE_LOCAL_DIR */

/* path (absolute or relative) to CGI configuration files */
#define CGI_DATA_PATH "../cgi-data"

/* whether libcap and CAP_SYS_OPERATIONS is ok */
/* #undef CONF_HAS_LIBCAP */

/* whether kernel patch is ok (used only by ejudge-setup!) */
/* #undef CONF_HAS_SECURE_EXEC */

/* whether MySQL is detected */
/* #undef CONF_HAS_MYSQL */

/* terminal controlling facilities */
#define HAVE_TERMIOS_H 1

/* CAP_SYS_OPERATIONS bit */
/* #undef HAVE_CAP_SYS_OPERATIONS */

/* new reuse features */
#define HAVE_TASK_SETMAXTIMEMILLIS 1
#define HAVE_TASK_GETREALTIME 1
#define HAVE_TASK_ISMEMORYLIMIT 1
#define HAVE_TASK_ENABLEMEMORYLIMITERROR 1
#define HAVE_TASK_ENABLESECUREEXEC 1
#define HAVE_TASK_SETQUIETFLAG 1
#define HAVE_TASK_GETERRORMESSAGE 1
#define HAVE_TASK_ENABLEALLSIGNALS 1
#define HAVE_TASK_FPRINTARGS 1
#define HAVE_TASK_ISSECURITYVIOLATION 1
#define HAVE_TASK_ENABLESECURITYVIOLATIONERROR 1

/* path to the web server cgi-bin dir */
#define EJUDGE_HTTPD_CGI_BIN_DIR "/usr/lib/cgi-bin"

/* path to the web server html documents dir */
#define EJUDGE_HTTPD_HTDOCS_DIR "/var/www"

/* whether AJAX is enabled */
/* #undef CONF_ENABLE_AJAX */

/* prefix for HTML style files */
#define CONF_STYLE_PREFIX "/ejudge/"

/* compiler versions */
#define COMPILE_GCC_VERSION "4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)"
#define COMPILE_GPP_VERSION "4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)"
#define COMPILE_FPC_VERSION "2.0.4"
/* #undef COMPILE_GPC_VERSION */
/* #undef COMPILE_DCC_VERSION */
#define COMPILE_G77_VERSION "3.4.6"
/* #undef COMPILE_GFORTRAN_VERSION */
#define COMPILE_GCJ_VERSION "4.2.1"
/* #undef COMPILE_GPROLOG_VERSION */
/* #undef COMPILE_YABASIC_VERSION */
/* #undef COMPILE_MZSCHEME_VERSION */
#define COMPILE_PERL_VERSION "5.8.8"
#define COMPILE_PYTHON_VERSION "2.5.1"
#define COMPILE_JAVA_VERSION "1.5.0"
#define COMPILE_MONO_VERSION "1.2.4"
/* #undef COMPILE_MBAS_VERSION */

#endif /* __CONFIG_H__ */

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Проблема: переключение на русский язык

Post by cher » 01 April 2008, 13:47

Очень странно...

Если запустить

Code: Select all

locale -a
если ли в списке доступных ru_RU.UTF-8?

Если запустить

Code: Select all

LANG=ru_RU.UTF-8 ls --help
показывается русский текст?

GinKage
Posts:12
Joined:27 March 2008, 17:47

Re: Проблема: переключение на русский язык

Post by GinKage » 01 April 2008, 17:18

Да.
Да.

Ещё одна странность: если я залогинен умолчальным пользователем и делаю "set | grep LANG", то я получаю такой список:
GDM_LANG=en_US.UTF-8
LANG=en_US.UTF-8

а если переключиться на ejudge (su ejudge), то:
GDM_LANG=en_US.UTF-8
LANG=en_US.UTF-8
LANGUAGE=en_US:en

и сообщения идут на английском, даже если запускать через "LANG=ru_RU.UTF-8 <команда>". Лечится запуском через "LANGUAGE=ru_RU:ru <команда>".

Если я изначально залогинен под пользователем ejudge, то переменные установлены как в первом случае и "LANG=" тоже работает. Кстати, в /etc/environment переменная LANGUAGE установлена в ru_RU:ru.

В принципе, ясно, что переменная LANGUAGE переопределяет языки сообщений, но непонятно, как сделать так, чтобы она не устанавливалась в en_US:en при создании нового шелла или при переключении с помощью su. Есть подозрение, что она устанавливается всегда, а gdm потом делает unset, но как тогда задать ей значение по умолчанию?

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Проблема: переключение на русский язык

Post by cher » 01 April 2008, 17:41

Про переменные окружения LC_* (например, LC_MESSAGES) я слышал, а про LANGUAGE слышу в первый раз...

Попробуйте перед запуском ejudge сделать

Code: Select all

unset LANGUAGE
unset LC_MESSAGES
Где конкретно находится установка переменных окружения для пользователей в Ubuntu я сказать затрудняюсь.

GinKage
Posts:12
Joined:27 March 2008, 17:47

Re: Проблема: переключение на русский язык

Post by GinKage » 02 April 2008, 10:27

http://www.linux.com/feature/53781

There is one further environment variable, LANGUAGE, which is used only by GNU gettext, the system that provides translations of messages for many programs. Unlike the others, this variable can be assigned multiple locales separated by colons. The locales are tried in order until a message catalog is found. For example, the specification sv_SE:nn_NO:de_DE indicates that the user prefers Swedish, to use Norwegian if Swedish is not available, and to use German if Norwegian is not available. If defined, LANGUAGE takes precedence over LC_ALL, LC_MESSAGES, and LANG.

Увы, запуск с использованием различных unset не помогает...

GinKage
Posts:12
Joined:27 March 2008, 17:47

Re: Проблема: переключение на русский язык

Post by GinKage » 02 April 2008, 10:50

А вот и решение проблемы.

--- l10n.c 2008-03-10 18:47:07.000000000 +0300
+++ l10n.c.my 2008-04-02 11:46:30.000000000 +0400
@@ -91,6 +91,7 @@
}

snprintf(env_buf, sizeof(env_buf), "LC_ALL=%s", e);
+ unsetenv("LANGUAGE");
putenv(env_buf);
setlocale(LC_ALL, "");
#endif /* CONF_HAS_LIBINTL */

Немного грубовато, зато работает.

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Проблема: переключение на русский язык

Post by cher » 02 April 2008, 11:37

Странно, что unset LANGUAGE перед запуском не помогает...

В любом случае, принудительный сброс LANGUAGE будет в следующей версии ejudge.

GinKage
Posts:12
Joined:27 March 2008, 17:47

Re: Проблема: переключение на русский язык

Post by GinKage » 02 April 2008, 12:36

На самом деле, не настолько странно.

Переменная среды LANGUAGE появляется при создании новой пользовательской сессии, то есть при исполнении su, а также (я так думаю, во всяком случае) при запуске cgi-программы. У дефолтного пользователя (залогиненного на данный момент в среде) эта переменная сбрасывается при инициализации gdm (в скриптах его запуска есть соответствующий unset), вместо неё ставится GDM_LANG. Далее все программы работают именно в этом шелле.

Видимо, cgi (или, быть может, сервер, т.е. apache2 или lighty) порождает дополнительные шеллы (отдельные от текущего пользовательского и того, в котором запускался ejudge-control), в них эта переменная заново определяется принудительно. Поэтому и сбрасывать её приходится уже внутри cgi-программы.

В любом случае, спасибо за помощь. :)

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: Проблема: переключение на русский язык

Post by cher » 02 April 2008, 12:50

Да, только весь код, генерирующий html, работает не в контексте CGI-программы, а в контексте ejudge-сервера (new-server). В частности, принудительный сброс LANGUAGE тоже работает в контексте сервера и, соответственно, переменные окружения CGI-программы на него не влияют.

sergpet
Posts:15
Joined:28 November 2009, 09:40

Re: Проблема: переключение на русский язык

Post by sergpet » 25 January 2014, 21:43

Как правило должно помогать следующее:
1. Добавить локаль в систему используя dpkg-reconfigure locales
2. Перезапустить еджадж ./ejudge/ejudge-control stop а потом start

Post Reply