--- kdecore/kconfigbase.h
+++ kdecore/kconfigbase.h
@@ -1985,6 +1985,7 @@ public:
 
 protected:
   QCString readEntryUtf8( const char *pKey) const;
+  bool hasTranslatedKey( const char *pKey ) const;
 
   /**
    * The currently selected group. */
--- kdecore/kconfigbase.cpp
+++ kdecore/kconfigbase.cpp
@@ -131,6 +131,24 @@ bool KConfigBase::hasKey(const char *pKe
   return !entry.mValue.isNull();
 }
 
+bool KConfigBase::hasTranslatedKey(const char* pKey) const
+{
+  KEntryKey aEntryKey(mGroup, 0);
+  aEntryKey.c_key = pKey;
+  aEntryKey.bDefault = readDefaults();
+
+  if (!locale().isNull()) {
+    // try the localized key first
+    aEntryKey.bLocal = true;
+    KEntry entry = lookupData(aEntryKey);
+    if (!entry.mValue.isNull())
+       return true;
+    aEntryKey.bLocal = false;
+  }
+
+  return false;
+}
+
 bool KConfigBase::hasGroup(const QString &group) const
 {
   return internalHasGroup( group.utf8());
--- kdecore/kdesktopfile.h
+++ kdecore/kdesktopfile.h
@@ -236,6 +236,8 @@ private:
 
 private:
 
+  QString translatedEntry(const char*) const;
+
   // copy-construction and assignment are not allowed
   KDesktopFile( const KDesktopFile& );
   KDesktopFile& operator= ( const KDesktopFile& );
--- kdecore/kdesktopfile.cpp
+++ kdecore/kdesktopfile.cpp
@@ -34,6 +34,8 @@
 #include "kapplication.h"
 #include "kstandarddirs.h"
 #include "kmountpoint.h"
+#include "kcatalogue.h"
+#include "klocale.h"
 
 #include "kdesktopfile.h"
 #include "kdesktopfile.moc"
@@ -145,6 +147,27 @@ bool KDesktopFile::isAuthorizedDesktopFi
   return false;
 }
 
+QString KDesktopFile::translatedEntry(const char* key) const
+{
+  if (hasTranslatedKey(key))
+    return readEntry(key);
+
+  if (hasKey(key)) {
+    QString value = readEntryUntranslated(key);
+    QString fName = fileName();
+    fName = fName.mid(fName.findRev('/')+1);
+    QString po_lookup_key = QString::fromLatin1(key) + "(" + fName + "): " + value;
+    QString po_value = KGlobal::locale()->translate(po_lookup_key.utf8().data());
+
+    if (po_value == po_lookup_key)
+      return value;
+
+    return po_value;
+  }
+
+  return QString::null;
+} 
+
 QString KDesktopFile::readType() const
 {
   return readEntry("Type");
@@ -157,17 +180,17 @@ QString KDesktopFile::readIcon() const
 
 QString KDesktopFile::readName() const
 {
-  return readEntry("Name");
+  return translatedEntry("Name");
 }
 
 QString KDesktopFile::readComment() const
 {
-  return readEntry("Comment");
+  return translatedEntry("Comment");
 }
 
 QString KDesktopFile::readGenericName() const
 {
-  return readEntry("GenericName");
+  return translatedEntry("GenericName");
 }
 
 QString KDesktopFile::readPath() const
@@ -342,5 +365,3 @@ KDesktopFile* KDesktopFile::copyTo(const
   config->setDesktopGroup();
   return config;
 }
-
-
--- kio/kio/kservice.cpp
+++ kio/kio/kservice.cpp
@@ -113,7 +113,7 @@ KService::init( KDesktopFile *config )
     return;
   }
 
-  m_strName = config->readEntry( "Name" );
+  m_strName = config->readName();
   entryMap.remove("Name");
   if ( m_strName.isEmpty() )
   {
@@ -131,7 +131,7 @@ KService::init( KDesktopFile *config )
        m_strName = m_strName.left(i);
   }
 
-  m_strType = config->readEntry( "Type" );
+  m_strType = config->readType();
   entryMap.remove("Type");
   if ( m_strType.isEmpty() )
   {
@@ -200,11 +200,11 @@ KService::init( KDesktopFile *config )
   entryMap.remove("Terminal");
   m_strTerminalOptions = config->readEntry( "TerminalOptions" ); // should be a property IMHO
   entryMap.remove("TerminalOptions");
-  m_strPath = config->readPathEntry( "Path" );
+  m_strPath = config->readPath();
   entryMap.remove("Path");
-  m_strComment = config->readEntry( "Comment" );
+  m_strComment = config->readComment();
   entryMap.remove("Comment");
-  m_strGenName = config->readEntry( "GenericName" );
+  m_strGenName = config->readGenericName();
   entryMap.remove("GenericName");
   QString untranslatedGenericName = config->readEntryUntranslated( "GenericName" );
   entryMap.insert("UntranslatedGenericName", untranslatedGenericName);
--- kio/kio/kservicegroup.cpp
+++ kio/kio/kservicegroup.cpp
@@ -64,13 +64,11 @@ KServiceGroup::KServiceGroup( const QStr
 
   d->directoryEntryPath = cfg;
 
-  KConfig config( cfg, true, false, "apps" );
+  KDesktopFile config( cfg, true, "apps" );
 
-  config.setDesktopGroup();
-
-  m_strCaption = config.readEntry( "Name" );
-  m_strIcon = config.readEntry( "Icon" );
-  m_strComment = config.readEntry( "Comment" );
+  m_strCaption = config.readName();
+  m_strIcon = config.readIcon();
+  m_strComment = config.readComment();
   m_bDeleted = config.readBoolEntry( "Hidden", false );
   d->m_bNoDisplay = config.readBoolEntry( "NoDisplay", false );
   QStringList tmpList;
--- kio/kio/kmimetype.cpp
+++ kio/kio/kmimetype.cpp
@@ -677,9 +677,8 @@ QString KFolderType::comment( const KURL
   KURL u( _url );
   u.addPath( ".directory" );
 
-  KSimpleConfig cfg( u.path(), true );
-  cfg.setDesktopGroup();
-  QString comment = cfg.readEntry( "Comment" );
+  KDesktopFile cfg( u.path(), true );
+  QString comment = cfg.readComment();
   if ( comment.isEmpty() )
     return KMimeType::comment( _url, _is_local );
 
@@ -772,9 +771,8 @@ QString KDEDesktopMimeType::comment( con
   if ( !_is_local )
     return KMimeType::comment( _url, _is_local );
 
-  KSimpleConfig cfg( _url.path(), true );
-  cfg.setDesktopGroup();
-  QString comment = cfg.readEntry( "Comment" );
+  KDesktopFile cfg( _url.path(), true );
+  QString comment = cfg.readComment();
   if ( comment.isEmpty() )
     return KMimeType::comment( _url, _is_local );
 
