[kde-linux] Wrong language detection in KDE since 3.1
Ingo Klöcker
kloecker at kde.org
Fri Mar 28 16:01:01 GMT 2003
Sergey M. Serov wrote:
> Hello, KDE!
> You guys doing a good job, keep it going, but I have some problem....
>
> How does KDE determinate a user language?
> It seems that it did use LANG or LC_MESSAGES before 3.1 but now it
> uses LC_CTYPE.
> I think it's a bug.
Me too (see below).
> I need to have LANG and LC_MESSAGES to be set to en_US but I need
> LC_CTYPE an LC_COLLATE to be set ru_RU.CP1251.
> But when I set LC_CTYPE to ru_RU.CP1251 every KDE apps starts with
> Russian interface.
> What I should gonna do?
Wait until KDE is fixed.
Why is KDE's behavior wrong? Let's have a look at the man page for
locale(7):
=====
If the second argument to setlocale() is empty string, "", for the
default locale, it is determined using the following steps:
1. If there is a non-null environment variable LC_ALL, the value of
LC_ALL is used.
2. If an environment variable with the same name as one of the
categories above exists and is non-null, its value is used for that
category.
3. If there is a non-null environment variable LANG, the value of LANG
is used.
=====
Excerpt of kdelibs/kdecore/klocale.cpp:
=====
void KLocale::initLanguage(KConfig * config, bool useEnv)
{
KConfigGroupSaver saver(config, "Locale");
m_country = config->readEntry( "Country" );
if ( m_country.isEmpty() )
m_country = defaultCountry();
// Reset the list and add the new languages
QStringList languageList;
if ( useEnv )
languageList += QStringList::split
(':', QFile::decodeName( ::getenv("KDE_LANG") ));
languageList += config->readListEntry("Language", ':');
// same order as setlocale use
if ( useEnv )
{
// HPB: Only run splitLocale on the environment variables..
QStringList langs;
langs << QFile::decodeName( ::getenv("LC_CTYPE") );
langs << QFile::decodeName( ::getenv("LC_MESSAGES") );
langs << QFile::decodeName( ::getenv("LC_ALL") );
langs << QFile::decodeName( ::getenv("LANG") );
=====
According to the aforementioned man page to following change would
correct KDE's language determination:
=====
- langs << QFile::decodeName( ::getenv("LC_CTYPE") );
- langs << QFile::decodeName( ::getenv("LC_MESSAGES") );
langs << QFile::decodeName( ::getenv("LC_ALL") );
+ langs << QFile::decodeName( ::getenv("LC_MESSAGES") );
langs << QFile::decodeName( ::getenv("LANG") );
=====
The line
langs << QFile::decodeName( ::getenv("LC_CTYPE") );
was added by lukas with the cvs comment:
=====
respect LC_CTYPE as well, fixes #32485
=====
Bug 32485 (http://bugs.kde.org/show_bug.cgi?id=32485) is
=====
KDE should take also LC_CTYPE contents
during the first start if LC_ALL or LANG
is not set.
=====
Obviously the fix is wrong (because it prefers LC_CTYPE over the other
environment variables). The correct fix would have been to add
langs << QFile::decodeName( ::getenv("LC_CTYPE") );
_after_ the three other lines.
Does anyone object against the following change:
=====
- langs << QFile::decodeName( ::getenv("LC_CTYPE") );
- langs << QFile::decodeName( ::getenv("LC_MESSAGES") );
langs << QFile::decodeName( ::getenv("LC_ALL") );
+ langs << QFile::decodeName( ::getenv("LC_MESSAGES") );
langs << QFile::decodeName( ::getenv("LANG") );
+ langs << QFile::decodeName( ::getenv("LC_CTYPE") );
=====
Regards,
Ingo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: signature
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20030328/76997890/attachment.sig>
More information about the kde-core-devel
mailing list