Linux LC_ALL
Brought to you by:
mezomish
Язык интерфейса под Linux автоматически определяется, но для этого используется неподходящая переменная окружения LC_ALL
Обычно в таких случаях проверяют переменную LANG, но JuffEd почему-то читает только LC_ALL, которую во всех руководствах категорически не рекомендуется устанавливать из-за возможных побочных эффектов.
Переменные окружения не читаются напрямую, используется Qt-шный механизм определения локали QLocale::system().name(), которая возвращает локаль в формате "язык_страна". Думаю, для этого используется LC_NAME. Можете проверить, так ли это, или действительно читается LC_NAME?
*или действительно читается LC_ALL?
Проверил, LC_NAME тоже игнорится. Помогает только LC_ALL .
В сети проблема упоминается. Пишут, что Qt4 игнорит всё, кроме LC_ALL .
Буду смотреть код Qt4
В исходниках Qt4 ("моей" версии 4.5.1 и последней 4.7.1) , в файле src/corelib/tools/qlocale.cpp :
static QByteArray envVarLocale()
{
static QByteArray lang = 0;
#ifdef Q_OS_UNIX
lang = qgetenv("LC_ALL");
if (lang.isNull())
lang = qgetenv("LC_NUMERIC");
if (lang.isNull())
#endif
lang = qgetenv("LANG");
return lang;
}
Насколько я понимаю, авторы Qt4 решили взять язык из LC_NUMERIC (который обычно рекомендуется устанавливать в "C" или "POSIX"), иначе из LANG, иначе оставить LC_ALL
То есть во-первых это неправильно, а во-вторых почему-то не работает – LC_NUMERIC тоже игнорится, по крайней мере у меня.
А вот это код из Qmmp (плеер на Qt4), который у меня определяет язык правильно:
QString Qmmp::systemLanguageID()
{
#ifdef Q_OS_UNIX
QByteArray v = qgetenv ("LC_ALL");
if (v.isEmpty())
v = qgetenv ("LC_MESSAGES");
if (v.isEmpty())
v = qgetenv ("LANG");
if (!v.isEmpty())
return QLocale (v).name();
#endif
return QLocale::system().name();
}
Здесь, как я понял, средства Qt4 для определения языка в *nix-системах используются только в крайнем случае.
Видимо, при разработке Qmmp возник тот же вопрос.
Спасибо, я сделаю определение языка аналогичным образом.
Fixed in trunk