Menu

#45 Linux LC_ALL

v0.8
closed-fixed
Mezomish
GUI (13)
5
2010-11-14
2010-11-13
Natrio
No

Язык интерфейса под Linux автоматически определяется, но для этого используется неподходящая переменная окружения LC_ALL
Обычно в таких случаях проверяют переменную LANG, но JuffEd почему-то читает только LC_ALL, которую во всех руководствах категорически не рекомендуется устанавливать из-за возможных побочных эффектов.

Discussion

  • Mezomish

    Mezomish - 2010-11-13

    Переменные окружения не читаются напрямую, используется Qt-шный механизм определения локали QLocale::system().name(), которая возвращает локаль в формате "язык_страна". Думаю, для этого используется LC_NAME. Можете проверить, так ли это, или действительно читается LC_NAME?

     
  • Mezomish

    Mezomish - 2010-11-13

    *или действительно читается LC_ALL?

     
  • Natrio

    Natrio - 2010-11-14

    Проверил, LC_NAME тоже игнорится. Помогает только LC_ALL .
    В сети проблема упоминается. Пишут, что Qt4 игнорит всё, кроме LC_ALL .
    Буду смотреть код Qt4

     
  • Natrio

    Natrio - 2010-11-14

    В исходниках 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-системах используются только в крайнем случае.

     
  • Mezomish

    Mezomish - 2010-11-14

    Видимо, при разработке Qmmp возник тот же вопрос.
    Спасибо, я сделаю определение языка аналогичным образом.

     
  • Mezomish

    Mezomish - 2010-11-14

    Fixed in trunk

     
  • Mezomish

    Mezomish - 2010-11-14
    • status: open --> closed-fixed
     

Log in to post a comment.