From e305d80490e1fb2dc15eb9cf9ee13428936c8e16 Mon Sep 17 00:00:00 2001
From: dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>
Date: Sun, 25 Jul 2004 09:54:32 +0000
Subject: Release-1.3.8

---
 INSTALL                   |    4 +-
 README                    |    4 +-
 VERSION                   |    2 +-
 doc/language.doc          |   77 +--
 doc/maintainers.txt       |    5 +-
 doc/translator.py         |   75 ++-
 packages/rpm/doxygen.spec |    2 +-
 src/classdef.h            |    2 +
 src/doxygen.cpp           |   57 +-
 src/doxygen.h             |    1 -
 src/memberdef.h           |    1 +
 src/translator_jp.h       |   86 ++-
 src/translator_no.h       | 1389 ++++++++++++++++++++++++++++++++++-----------
 src/util.cpp              |   13 +-
 14 files changed, 1291 insertions(+), 427 deletions(-)

diff --git a/INSTALL b/INSTALL
index 0fb122f..ea70031 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.3.7-20040718
+DOXYGEN Version 1.3.8
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (18 July 2004)
+Dimitri van Heesch (25 July 2004)
diff --git a/README b/README
index c738704..8abd960 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.3.7_20040718
+DOXYGEN Version 1.3.8
 
 Please read INSTALL for compilation instructions.
 
@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
 
 Enjoy,
 
-Dimitri van Heesch (dimitri@stack.nl) (18 July 2004)
+Dimitri van Heesch (dimitri@stack.nl) (25 July 2004)
diff --git a/VERSION b/VERSION
index c6b9338..e05cb33 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.3.7-20040718
+1.3.8
diff --git a/doc/language.doc b/doc/language.doc
index dc2193f..456cf66 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other
 than English (the default). The output language is chosen through the
 configuration file (with default name and known as Doxyfile).
 
-Currently (version 1.3.8), 30 languages 
+Currently (version 1.3.7-20040719), 30 languages 
 are supported (sorted alphabetically):
 Afrikaans, Brazilian Portuguese, Catalan, Chinese, Chinese
 Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
@@ -45,7 +45,7 @@ when the translator was updated.
   <td ><b><font size=+1 color="#ffffff"> Language </font></b></td>
   <td ><b><font size=+1 color="#ffffff"> Maintainer </font></b></td>
   <td ><b><font size=+1 color="#ffffff"> Contact address </font>
-          <font size=-2 color="#ffffff">(remove the NOSPAM.)</font></b></td>
+          <font size=-2 color="#ffffff">(replace the at and dot)</font></b></td>
   <td ><b><font size=+1 color="#ffffff"> Status </font></b></td>
   </tr>
   <!-- table content begin -->
@@ -53,104 +53,104 @@ when the translator was updated.
   <tr bgcolor="#ffffff">
     <td>Afrikaans</td>
     <td>Johan Prinsloo</td>
-    <td>johan@NOSPAM.zippysnoek.com</td>
+    <td>johan at zippysnoek dot com</td>
     <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Brazilian Portuguese</td>
     <td>Fabio "FJTC" Jun Takada Chino</td>
-    <td>chino@NOSPAM.icmc.sc.usp.br</td>
+    <td>chino at icmc dot sc dot usp dot br</td>
     <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Catalan</td>
     <td>Albert Mora</td>
-    <td>amora@NOSPAM.iua.upf.es</td>
+    <td>amora at iua dot upf dot es</td>
     <td>1.2.17</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Chinese</td>
     <td>Li Daobing<br>Wei Liu</td>
-    <td>lidaobing@NOSPAM.gmail.com<br>liuwei@NOSPAM.asiainfo.com</td>
+    <td>lidaobing at gmail dot com<br>liuwei at asiainfo dot com</td>
     <td>1.3.08</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Chinese Traditional</td>
     <td>Daniel YC Lin<br>Gary Lee</td>
-    <td>daniel@NOSPAM.twpda.com<br>garylee@NOSPAM.ecosine.com.tw</td>
+    <td>daniel at twpda dot com<br>garylee at ecosine dot com dot tw</td>
     <td>1.3.8</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Croatian</td>
     <td>Boris Bralo</td>
-    <td>boris.bralo@NOSPAM.zg.tel.hr</td>
+    <td>boris.bralo at zg dot htnet dot hr</td>
     <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Czech</td>
     <td>Petr P&#x0159;ikryl</td>
-    <td>prikrylp@NOSPAM.skil.cz</td>
+    <td>prikrylp at skil dot cz</td>
     <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Danish</td>
     <td>Erik S&oslash;e S&oslash;rensen</td>
-    <td>erik@NOSPAM.mail.nu</td>
+    <td>erik at mail dot nu</td>
     <td>1.3.8</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Dutch</td>
     <td>Dimitri van Heesch</td>
-    <td>dimitri@NOSPAM.stack.nl</td>
+    <td>dimitri at stack dot nl</td>
     <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>English</td>
     <td>Dimitri van Heesch</td>
-    <td>dimitri@NOSPAM.stack.nl</td>
+    <td>dimitri at stack dot nl</td>
     <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Finnish</td>
     <td>Olli Korhonen</td>
-    <td>Olli.Korhonen@NOSPAM.ccc.fi</td>
+    <td>Olli.Korhonen at ccc dot fi</td>
     <td>obsolete</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>French</td>
     <td>Xavier Outhier</td>
-    <td>xouthier@NOSPAM.yahoo.fr</td>
+    <td>xouthier at yahoo dot fr</td>
     <td>1.3.8</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>German</td>
     <td>Jens Seidel</td>
-    <td>jensseidel@NOSPAM.users.sf.net</td>
+    <td>jensseidel at users dot sf dot net</td>
     <td>1.3.8</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Greek</td>
     <td>Harry Kalogirou</td>
-    <td>harkal@NOSPAM.rainbow.cs.unipi.gr</td>
+    <td>harkal at rainbow dot cs dot unipi dot gr</td>
     <td>1.2.11</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Hungarian</td>
     <td>F&ouml;ldv&aacute;ri Gy&ouml;rgy<br>&Aacute;kos Kiss</td>
-    <td>foldvari@NOSPAM.diatronltd.com<br>akiss@NOSPAM.users.sourceforge.net</td>
+    <td>foldvari at diatronltd dot com<br>akiss at users dot sourceforge dot net</td>
     <td>1.3.8</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Italian</td>
     <td>Alessandro Falappa<br>Ahmed Aldo Faisal</td>
-    <td>alessandro@NOSPAM.falappa.net<br>aaf23@NOSPAM.cam.ac.uk</td>
+    <td>alessandro at falappa dot net<br>aaf23 at cam dot ac dot uk</td>
     <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Japanese</td>
-    <td>Ryunosuke Satoh<br>Kenji Nagamatsu</td>
-    <td>sun594@NOSPAM.hotmail.com<br>naga@NOSPAM.joyful.club.ne.jp</td>
-    <td>1.3.3</td>
+    <td>Ryunosuke Satoh<br>Kenji Nagamatsu<br>Iwasa Kazmi</td>
+    <td>sun594 at hotmail dot com<br>naga at joyful dot club dot ne dot jp<br>iwasa at cosmo-system dot jp</td>
+    <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>JapaneseEn</td>
@@ -161,7 +161,7 @@ when the translator was updated.
   <tr bgcolor="#ffffff">
     <td>Korean</td>
     <td>Richard Kim</td>
-    <td>ryk@NOSPAM.dspwiz.com</td>
+    <td>ryk at dspwiz dot com</td>
     <td>1.3.8</td>
   </tr>
   <tr bgcolor="#ffffff">
@@ -173,73 +173,73 @@ when the translator was updated.
   <tr bgcolor="#ffffff">
     <td>Lithuanian</td>
     <td>Tomas Simonaitis<br>Mindaugas Radzius<br>Aidas Berukstis</td>
-    <td>haden@NOSPAM.homelan.lt<br>mindaugasradzius@NOSPAM.takas.lt<br>aidasber@NOSPAM.takas.lt</td>
+    <td>haden at homelan dot lt<br>mindaugasradzius at takas dot lt<br>aidasber at takas dot lt</td>
     <td>1.3.8</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Norwegian</td>
     <td>Lars Erik Jordet</td>
-    <td>lej@NOSPAM.circuitry.no</td>
-    <td>1.2.2</td>
+    <td>lejordet at gmail dot com</td>
+    <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Polish</td>
     <td>Piotr Kaminski<br>Grzegorz Kowal</td>
-    <td>Piotr.Kaminski@NOSPAM.ctm.gdynia.pl<br>g_kowal@NOSPAM.poczta.onet.pl</td>
+    <td>Piotr.Kaminski at ctm dot gdynia dot pl<br>g_kowal at poczta dot onet dot pl</td>
     <td>1.3</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Portuguese</td>
     <td>Rui Godinho Lopes</td>
-    <td>ruiglopes@NOSPAM.yahoo.com</td>
+    <td>ruiglopes at yahoo dot com</td>
     <td>1.3.3</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Romanian</td>
     <td>Alexandru Iosup</td>
-    <td>aiosup@NOSPAM.yahoo.com</td>
+    <td>aiosup at yahoo dot com</td>
     <td>1.2.16</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Russian</td>
     <td>Alexandr Chelpanov</td>
-    <td>cav@NOSPAM.cryptopro.ru</td>
+    <td>cav at cryptopro dot ru</td>
     <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Serbian</td>
     <td>Dejan Milosavljevic</td>
-    <td>dmilos@NOSPAM.email.com</td>
+    <td>dmilos at email dot com</td>
     <td>1.3.8</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Slovak</td>
     <td>Stanislav Kudl&aacute;&#x010d;</td>
-    <td>skudlac@NOSPAM.pobox.sk</td>
+    <td>skudlac at pobox dot sk</td>
     <td>1.2.18</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Slovene</td>
     <td>Matjaz Ostroversnik</td>
-    <td>matjaz.ostroversnik@NOSPAM.zrs-tk.si</td>
+    <td>matjaz.ostroversnik at zrs-tk dot si</td>
     <td>1.2.16</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Spanish</td>
     <td>Francisco Oltra Thennet</td>
-    <td>foltra@NOSPAM.puc.cl</td>
+    <td>foltra at puc dot cl</td>
     <td>1.3.8</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Swedish</td>
     <td>Mikael Hallin</td>
-    <td>mikaelhallin@NOSPAM.yahoo.se</td>
+    <td>mikaelhallin at yahoo dot se</td>
     <td>1.3.3</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Ukrainian</td>
     <td>Olexij Tkatchenko</td>
-    <td>olexij.tkatchenko@NOSPAM.gmx.de</td>
+    <td>olexij.tkatchenko at gmx dot de</td>
     <td>1.2.11</td>
   </tr>
   <!-- table content end -->
@@ -269,7 +269,7 @@ when the translator was updated.
   Chinese Traditional & Daniel YC Lin & {\tt\tiny daniel@twpda.com} & 1.3.8 \\
   ~ & Gary Lee & {\tt\tiny garylee@ecosine.com.tw} & ~ \\
   \hline
-  Croatian & Boris Bralo & {\tt\tiny boris.bralo@zg.tel.hr} & up-to-date \\
+  Croatian & Boris Bralo & {\tt\tiny boris.bralo@zg.htnet.hr} & up-to-date \\
   \hline
   Czech & Petr P\v{r}ikryl & {\tt\tiny prikrylp@skil.cz} & up-to-date \\
   \hline
@@ -293,8 +293,9 @@ when the translator was updated.
   Italian & Alessandro Falappa & {\tt\tiny alessandro@falappa.net} & up-to-date \\
   ~ & Ahmed Aldo Faisal & {\tt\tiny aaf23@cam.ac.uk} & ~ \\
   \hline
-  Japanese & Ryunosuke Satoh & {\tt\tiny sun594@hotmail.com} & 1.3.3 \\
+  Japanese & Ryunosuke Satoh & {\tt\tiny sun594@hotmail.com} & up-to-date \\
   ~ & Kenji Nagamatsu & {\tt\tiny naga@joyful.club.ne.jp} & ~ \\
+  ~ & Iwasa Kazmi & {\tt\tiny iwasa@cosmo-system.jp} & ~ \\
   \hline
   JapaneseEn & see the Japanese language & {\tt\tiny ~} & English based \\
   \hline
@@ -306,7 +307,7 @@ when the translator was updated.
   ~ & Mindaugas Radzius & {\tt\tiny mindaugasradzius@takas.lt} & ~ \\
   ~ & Aidas Berukstis & {\tt\tiny aidasber@takas.lt} & ~ \\
   \hline
-  Norwegian & Lars Erik Jordet & {\tt\tiny lej@circuitry.no} & 1.2.2 \\
+  Norwegian & Lars Erik Jordet & {\tt\tiny lejordet@gmail.com} & up-to-date \\
   \hline
   Polish & Piotr Kaminski & {\tt\tiny Piotr.Kaminski@ctm.gdynia.pl} & 1.3 \\
   ~ & Grzegorz Kowal & {\tt\tiny g\_kowal@poczta.onet.pl} & ~ \\
diff --git a/doc/maintainers.txt b/doc/maintainers.txt
index 2022a32..e627f5c 100644
--- a/doc/maintainers.txt
+++ b/doc/maintainers.txt
@@ -27,7 +27,7 @@ Daniel YC Lin: daniel@twpda.com
 Gary Lee: garylee@ecosine.com.tw
 
 TranslatorCroatian
-Boris Bralo: boris.bralo@zg.tel.hr
+Boris Bralo: boris.bralo@zg.htnet.hr
 
 TranslatorCzech 
 Petr P&rcaron;ikryl: prikrylp@skil.cz
@@ -64,6 +64,7 @@ Ahmed Aldo Faisal: aaf23@cam.ac.uk
 TranslatorJapanese 
 Ryunosuke Satoh: sun594@hotmail.com
 Kenji Nagamatsu: naga@joyful.club.ne.jp
+Iwasa Kazmi: iwasa@cosmo-system.jp
 
 TranslatorKorean
 Richard Kim: ryk@dspwiz.com
@@ -74,7 +75,7 @@ Mindaugas Radzius: mindaugasradzius@takas.lt
 Aidas Berukstis: aidasber@takas.lt
 
 TranslatorNorwegian
-Lars Erik Jordet: lej@circuitry.no
+Lars Erik Jordet: lejordet@gmail.com
 
 TranslatorPolish 
 Piotr Kaminski: Piotr.Kaminski@ctm.gdynia.pl
diff --git a/doc/translator.py b/doc/translator.py
index b2da2a6..c103b1b 100644
--- a/doc/translator.py
+++ b/doc/translator.py
@@ -22,27 +22,26 @@
                                
   History:
   --------
-  2002/05/21
-   - This was the last Perl version. 
-  2003/05/16
-   - If the script is given list of languages, only the translator report
-     is generated and only for those languages.
-  2004/01/24
-   - Total reimplementation just started: classes TrManager, and Transl.
-  2004/02/05
-   - First version that produces translator report. The documentation 
-     in the language.doc is not generated yet.
-  2004/02/10
-   - First fully functional version that generates both the translator
-     report and the documentation. It is a bit slower than the Perl version,
-     but is much less tricky and much more flexible. It also solves some
-     problems that were not solved by the Perl version. The translator report
-     content should be more useful for developers.
+  2002/05/21 - This was the last Perl version. 
+  2003/05/16 - List of language marks can be passed as arguments.
+  2004/01/24 - Total reimplementation started: classes TrManager, and Transl.
+  2004/02/05 - First version that produces translator report. No language.doc yet.
+  2004/02/10 - First fully functional version that generates both the translator
+               report and the documentation. It is a bit slower than the
+               Perl version, but is much less tricky and much more flexible.
+               It also solves some problems that were not solved by the Perl
+               version. The translator report content should be more useful
+               for developers.
   2004/02/11 - Some tuning-up to provide more useful information.
   2004/04/16 - Added new tokens to the tokenizer (to remove some warnings).
   2004/05/25 - Added from __future__ import generators not to force Python 2.3.
   2004/06/03 - Removed dependency on textwrap module.
   2004/07/07 - Fixed the bug in the fill() function.
+  2004/07/21 - Better e-mail mangling for HTML part of language.doc.
+             - Plural not used for reporting a single missing method.
+             - Removal of not used translator adapters is suggested only
+               when the report is not restricted to selected languages
+               explicitly via script arguments
   """                               
 
 from __future__ import generators
@@ -1115,8 +1114,12 @@ class Transl:
         fout.write('\n\n\n')
         fout.write(self.classId + '   (' + self.baseClassId + ')')
         if self.missingMethods:
-            fout.write('  %d' % len(self.missingMethods))
-            fout.write(' methods to implement')
+            num = len(self.missingMethods)
+            fout.write('  %d' % num)
+            fout.write(' method')
+            if num > 1:
+                fout.write('s')
+            fout.write(' to implement')
         fout.write('\n' + '-' * len(self.classId))
         
         # Write the info about the implemented required methods.
@@ -1420,7 +1423,10 @@ class TrManager:
                 obj = self.__translDic[x]
                 f.write('  %-30s' % obj.classId)
                 f.write('  %-6s' % obj.readableStatus)
-                f.write('\t%2d methods to implement' % len(obj.missingMethods))
+                numimpl = len(obj.missingMethods)
+                pluralS = ''
+                if numimpl > 1: pluralS = 's'
+                f.write('\t%2d method%s to implement' % (numimpl, pluralS))
                 if obj.note:
                     f.write('\n\tNote: ' + obj.note + '\n')
                 f.write('\n')
@@ -1430,11 +1436,14 @@ class TrManager:
                     adaptMinVersion = obj.status
                 
             # Set the note if some old translator adapters are not needed 
-            # any more.
-            for version, adaptClassId in self.adaptMethodsDic.values():
-                if version < adaptMinVersion:
-                    f.write('\nNote: The %s class ' % adaptClassId)
-                    f.write('is not used and can be removed.\n')
+            # any more. Do it only when the script is called without arguments,
+            # i.e. all languages were checked against the needed translator 
+            # adapters. 
+            if not self.script_argLst:
+                for version, adaptClassId in self.adaptMethodsDic.values():
+                    if version < adaptMinVersion:
+                        f.write('\nNote: The %s class ' % adaptClassId)
+                        f.write('is not used and can be removed.\n')
                 
         # Write the list of the English-based classes.
         if self.EnBasedIdLst:
@@ -1583,7 +1592,7 @@ class TrManager:
               <td ><b><font size=+1 color="#ffffff"> Language </font></b></td>
               <td ><b><font size=+1 color="#ffffff"> Maintainer </font></b></td>
               <td ><b><font size=+1 color="#ffffff"> Contact address </font>
-                      <font size=-2 color="#ffffff">(remove the NOSPAM.)</font></b></td>
+                      <font size=-2 color="#ffffff">(replace the at and dot)</font></b></td>
               <td ><b><font size=+1 color="#ffffff"> Status </font></b></td>
               </tr>
               <!-- table content begin -->
@@ -1628,11 +1637,21 @@ class TrManager:
                 ee = '<br>'.join(le)
             
             # Mangle the e-mail and replace the entity references.
-            if ee:
-                ee = ee.replace('@', '@NOSPAM.')
+            if ee and ee != '&nbsp;':
+                # More than one maintainer address separated by <br> can be used.
+                emails = ee.split('<br>')
+                mangled_list = []
+                for email in emails:
+                    name, domain = email.split('@')
+                    domain = domain.replace('.', ' dot ')
+                    mangled_list.append(name + ' at ' + domain)
+                ee = '<br>'.join(mangled_list)
+                
             if mm:
                 mm = mm.replace('&ccaron;', '&#x010d;')
                 mm = mm.replace('&rcaron;', '&#x0159;')
+                mm = mm.replace('&scaron;', '&#x0161;')
+                mm = mm.replace('&zcaron;', '&#x017e;')
             
             # Append the maintainer and e-mail elements.
             lst.append(htmlTdTpl % mm)
@@ -1717,6 +1736,8 @@ class TrManager:
         latexTable = latexTable.replace('&oslash;', '\\o{}')
         latexTable = latexTable.replace('&ccaron;', '\\v{c}')
         latexTable = latexTable.replace('&rcaron;', '\\v{r}')
+        latexTable = latexTable.replace('&scaron;', '\\v{s}')
+        latexTable = latexTable.replace('&zcaron;', '\\v{z}')
         latexTable = latexTable.replace('_',        '\\_')
         
         # Put the HTML and LaTeX parts together and define the dic item.
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index 7c38345..ac3640a 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,6 +1,6 @@
 Summary: A documentation system for C/C++.
 Name: doxygen
-Version: 1.3.7_20040718
+Version: 1.3.8
 Release: 1
 Epoch: 1
 Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
diff --git a/src/classdef.h b/src/classdef.h
index 3f6bf8e..f73a7d1 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -161,6 +161,8 @@ class ClassDef : public Definition
      */
     ClassDef *templateMaster() const { return m_templateMaster; } 
 
+    bool isTemplate() const { return m_tempArgs!=0; }
+
     IncludeInfo *includeInfo() const { return m_incInfo; }
     
     UsesClassDict *usedImplementationClasses() const 
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 98bb3ac..cd5d557 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -120,7 +120,6 @@ SDict<DefinitionList> *Doxygen::symbolMap;
 bool           Doxygen::outputToWizard=FALSE;
 QDict<int> *   Doxygen::htmlDirMap = 0;
 QCache<LookupInfo> Doxygen::lookupCache(20000,20000);
-bool           Doxygen::lookupCacheEnabled=FALSE;
 
 static StringList     inputFiles;         
 static StringDict     excludeNameDict(1009);   // sections
@@ -6193,6 +6192,54 @@ static void findSectionsInDocumentation()
   if (Doxygen::mainPage) Doxygen::mainPage->findSectionsInDocumentation();
 }
 
+static void flushCachedTemplateRelations()
+{
+  // remove all references to template classes from the cache
+  // as there can be new template instances that should be linked
+  // to instead.
+  QCacheIterator<LookupInfo> ci(Doxygen::lookupCache);
+  LookupInfo *li=0;
+  for (ci.toFirst();(li=ci.current());++ci)
+  {
+    if (li->classDef && li->classDef->isTemplate())
+    {
+      Doxygen::lookupCache.remove(ci.currentKey());
+    }
+  }
+  // remove all cached typedef resolutions whose target is a
+  // template class as this may now be a template instance
+  MemberNameSDict::Iterator fnli(Doxygen::functionNameSDict);
+  MemberName *fn;
+  for (;(fn=fnli.current());++fnli) // for each global function name
+  {
+    MemberNameIterator fni(*fn);
+    MemberDef *fmd;
+    for (;(fmd=fni.current());++fni) // for each function with that name
+    {
+      if (fmd->isTypedefValCached())
+      {
+        ClassDef *cd = fmd->getCachedTypedefVal();
+        if (cd->isTemplate()) fmd->invalidateTypedefValCache();
+      }
+    }
+  }
+  MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
+  for (;(fn=mnli.current());++mnli) // for each class method name
+  {
+    MemberNameIterator mni(*fn);
+    MemberDef *fmd;
+    for (;(fmd=mni.current());++mni) // for each function with that name
+    {
+      if (fmd->isTypedefValCached())
+      {
+        ClassDef *cd = fmd->getCachedTypedefVal();
+        if (cd->isTemplate()) fmd->invalidateTypedefValCache();
+      }
+    }
+  }
+}
+
+
 //----------------------------------------------------------------------------
 
 static void findDefineDocumentation(Entry *root)
@@ -7437,7 +7484,6 @@ void initDoxygen()
   Doxygen::memGrpInfoDict.setAutoDelete(TRUE);
   Doxygen::tagDestinationDict.setAutoDelete(TRUE);
   Doxygen::lookupCache.setAutoDelete(TRUE);
-  Doxygen::lookupCacheEnabled=FALSE;
 }
 
 void cleanUpDoxygen()
@@ -8227,6 +8273,9 @@ void parseInput()
   findInheritedTemplateInstances();       
   findUsedTemplateInstances();       
 
+  msg("Flushing cached template relations that have become invalid...\n");
+  flushCachedTemplateRelations();
+  
   msg("Creating members for template instances...\n");
   createTemplateInstanceMembers();
 
@@ -8235,10 +8284,6 @@ void parseInput()
   computeClassRelations();        
   classEntries.clear();          
 
-  // from now on the class relations are fixed and we can
-  // start to cache them to improve performance
-  Doxygen::lookupCacheEnabled=TRUE;
-  
   msg("Searching for enumerations...\n");
   findEnums(root);
   findEnumDocumentation(root);
diff --git a/src/doxygen.h b/src/doxygen.h
index 32d2cbf..404ac22 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -112,7 +112,6 @@ class Doxygen
     static bool                      outputToWizard;
     static QDict<int>               *htmlDirMap;
     static QCache<LookupInfo>        lookupCache;
-    static bool                      lookupCacheEnabled;    
 };
 
 void initDoxygen();
diff --git a/src/memberdef.h b/src/memberdef.h
index 736dc2d..0208746 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -273,6 +273,7 @@ class MemberDef : public Definition
     QCString getCachedTypedefTemplSpec() const { return m_cachedTypedefTemplSpec; }
     void cacheTypedefVal(ClassDef *val,const QCString &templSpec) 
     { m_isTypedefValCached=TRUE; m_cachedTypedefValue=val; m_cachedTypedefTemplSpec=templSpec; }
+    void invalidateTypedefValCache() { m_isTypedefValCached=FALSE; }
     
     // declaration <-> definition relation
     void setMemberDefinition(MemberDef *md) { memDef=md; }
diff --git a/src/translator_jp.h b/src/translator_jp.h
index 2ed60ff..ec74b1e 100644
--- a/src/translator_jp.h
+++ b/src/translator_jp.h
@@ -29,7 +29,7 @@
 #ifndef TRANSLATOR_JP_H
 #define TRANSLATOR_JP_H
 
-class TranslatorJapanese : public TranslatorAdapter_1_3_3
+class TranslatorJapanese : public Translator
 {
  private:
   /*! The decode() can change euc into sjis */
@@ -600,13 +600,13 @@ class TranslatorJapanese : public TranslatorAdapter_1_3_3
         case ClassDef::Class:      result+=decode("ĽŻĽéĽš "); break;
         case ClassDef::Struct:     result+=decode("š˝Â¤ÂÎ "); break;
         case ClassDef::Union:      result+=decode("śŚÍŃÂÎ "); break;
-        case ClassDef::Interface:  result+=decode("Ľ¤ĽóĽżĽŐĽ§ĄźĽš"); break;
-        case ClassDef::Protocol:   result+=decode("Protocol"); break; // translate me!
-        case ClassDef::Category:   result+=decode("Category"); break; // translate me!
-        case ClassDef::Exception:  result+=decode("Îăł°"); break; //TODO:fixme
+        case ClassDef::Interface:  result+=decode("Ľ¤ĽóĽżĽŐĽ§ĄźĽš "); break;
+        case ClassDef::Protocol:   result+=decode("Ľ×ĽíĽČĽłĽë "); break;
+        case ClassDef::Category:   result+=decode("ĽŤĽĆĽ´Ľę "); break;
+        case ClassDef::Exception:  result+=decode("Îăł° "); break;
       }
-      if (isTemplate) result+=decode(" ĽĆĽóĽ×ĽěĄźĽČ");
-		result+=(QCString)clName;
+      if (isTemplate) result+=decode("ĽĆĽóĽ×ĽěĄźĽČ ");
+      result+=(QCString)clName;
       return result;
     }
 
@@ -759,9 +759,9 @@ class TranslatorJapanese : public TranslatorAdapter_1_3_3
         case ClassDef::Struct:     result+=decode("š˝Â¤ÂÎ"); break;
         case ClassDef::Union:      result+=decode("śŚÍŃÂÎ"); break;
         case ClassDef::Interface:  result+=decode("Ľ¤ĽóĽżĽŐĽ§ĄźĽš"); break;
-        case ClassDef::Protocol:   result+=decode("Protocol"); break; // translate me!
-        case ClassDef::Category:   result+=decode("Category"); break; // translate me!
-        case ClassDef::Exception:  result+=decode("Îăł°"); break; //TODO:fixme
+        case ClassDef::Protocol:   result+=decode("Ľ×ĽíĽČĽłĽë"); break;
+        case ClassDef::Category:   result+=decode("ĽŤĽĆĽ´Ľę"); break;
+        case ClassDef::Exception:  result+=decode("Îăł°"); break;
       }
       result+=decode("¤ÎŔâĚŔ¤ĎźĄ¤ÎĽŐĽĄĽ¤Ľë¤Ť¤éŔ¸ŔŽ¤ľ¤ě¤Ţ¤ˇ¤ż:");
       return result;
@@ -1341,7 +1341,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_3_3
      */
     virtual QCString trImplementedFromList(int numEntries)
     {
-      return trWriteList(numEntries)+decode("¤ËźÂÁő¤ľ¤ě¤Ć¤¤¤Ţ¤š")+".";
+      return trWriteList(numEntries)+decode("¤ňźÂÁő¤ˇ¤Ć¤¤¤Ţ¤š")+".";
     }
 
     /*! used in member documentation blocks to produce a list of
@@ -1349,7 +1349,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_3_3
      */
     virtual QCString trImplementedInList(int numEntries)
     {
-      return trWriteList(numEntries)+decode("¤ňźÂÁő¤ˇ¤Ć¤¤¤Ţ¤š")+".";
+      return trWriteList(numEntries)+decode("¤ÇźÂÁő¤ľ¤ě¤Ć¤¤¤Ţ¤š")+".";
     }
 //////////////////////////////////////////////////////////////////////////
 // new since 1.2.16
@@ -1447,5 +1447,67 @@ class TranslatorJapanese : public TranslatorAdapter_1_3_3
     {
       return decode("´Řżô¤Î¸Ć¤Ó˝Đ¤ˇĽ°ĽéĽŐ:");
     }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! When the search engine is enabled this text is put in the header 
+     *  of each page before the field where one can enter the text to search 
+     *  for. 
+     */
+    virtual QCString trSearchForIndex()
+    {
+      return decode("¸Ąş÷");
+    }
+    /*! This string is used as the title for the page listing the search
+     *  results.
+     */
+    virtual QCString trSearchResultsTitle()
+    {
+      return decode("¸Ąş÷ˇë˛Ě");
+    }
+    /*! This string is put just before listing the search results. The
+     *  text can be different depending on the number of documents found.
+     *  Inside the text you can put the special marker $num to insert
+     *  the number representing the actual number of search results.
+     *  The @a numDocuments parameter can be either 0, 1 or 2, where the 
+     *  value 2 represents 2 or more matches. HTML markup is allowed inside
+     *  the returned string.
+     */
+    virtual QCString trSearchResults(int numDocuments)
+    {
+      if (numDocuments==0)
+      {
+        return decode("ĆţÎĎ¤ľ¤ě¤żžňˇď¤ËĽŢĽĂĽÁ¤š¤ëĽÉĽ­ĽĺĽáĽóĽČ¤Ź¤˘¤ę¤Ţ¤ť¤ó¤Ç¤ˇ¤ż.");
+      }
+      else if (numDocuments==1)
+      {
+        return decode("ĆţÎĎ¤ľ¤ě¤żžňˇď¤ËĽŢĽĂĽÁ¤š¤ëĽÉĽ­ĽĺĽáĽóĽČ¤Ź <b>1</b> ˇď¤ß¤Ä¤Ť¤ę¤Ţ¤ˇ¤ż.");
+      }
+      else 
+      {
+        return decode("ĆţÎĎ¤ľ¤ě¤żžňˇď¤ËĽŢĽĂĽÁ¤š¤ëĽÉĽ­ĽĺĽáĽóĽČ¤Ź <b>$num</b> ˇď¤ß¤Ä¤Ť¤ę¤Ţ¤ˇ¤ż. "
+                      "şÇ¤â°ěĂ×¤ˇ¤Ć¤¤¤ë¤â¤Î¤Ť¤éÉ˝ź¨¤ľ¤ě¤Ţ¤š.");
+      }
+    }
+    /*! This string is put before the list of matched words, for each search 
+     *  result. What follows is the list of words that matched the query.
+     */
+    virtual QCString trSearchMatches()
+    {
+      return decode("ĽŢĽĂĽÁ¤ˇ¤żĂą¸ě:");
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in HTML as the title of page with source code for file filename
+     */
+    virtual QCString trSourceFile(QCString& filename)
+    {
+      return filename + decode(" Ľ˝ĄźĽšĽŐĽĄĽ¤Ľë");
+    }
 };
 #endif
diff --git a/src/translator_no.h b/src/translator_no.h
index 3fd21ee..1fcadc1 100644
--- a/src/translator_no.h
+++ b/src/translator_no.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2004 by Dimitri van Heesch.
+ * Copyright (C) 1997-2003 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -15,482 +15,801 @@
  *
  */
 
-/*
-==================================================================================
-
-==================================================================================
-*/
+/******************************************************************************
+ * Norwegian translation by Lars Erik Jordet <lejordet@gmail.com>
+ * 
+ * This is a new translation made from scratch, not based on my older Norwegian translation (for 1.2.2)
+ *
+ * Translation notes (in Norwegian)
+ *
+ * Jeg har stort sett brukt ord som ligger ganske nćr de engelske ekvivalentene,
+ * for eksempel "enumeration" -> "enumerasjon", og i enkelte tilfeller det engelske
+ * ordet direkte, der jeg finner det mer naturlig enn ĺ prřve ĺ stable en setning
+ * pĺ beina pĺ norsk, eller jeg selv foretrekker det engelske ordet (eks: "Header-fil").
+ * Om noen ikke skulle like disse valgene, kontakt meg pĺ mailadressen over.
+ *
+ * Doxygen har mange strings som bestĺr av sammensatte ord ("Member function description", for eksempel),
+ * som ikke alltid ser like ryddig ut pĺ norsk. Jeg har brukt bindestrek for ĺ fĺ
+ * det til ĺ se presentabelt ut, men om noen har en bedre idé, send til mailadressen over.
+ *
+ * Changelog
+ *
+ * 2003-12-18: Initial translation 
+ * 2004-07-19: Fixup to prepare for 1.3.8 (I had forgotten some functions)
+ */
 
 #ifndef TRANSLATOR_NO_H
 #define TRANSLATOR_NO_H
 
-#include "translator_adapter.h"
-
-class TranslatorNorwegian : public TranslatorAdapter_1_2_2
+class TranslatorNorwegian : public Translator
 {
   public:
-    QCString idLanguage()
-    { return "norwegian"; }
-    QCString latexBabelPackage()
-    { return "norwegian"; }
 
-    QCString trRelatedFunctions()
-    { return "Beslektede funksjoner"; }
+    // --- Language control methods -------------------
+    
+    /*! Used for identification of the language. The identification 
+     * should not be translated. It should be replaced by the name 
+     * of the language in English using lower-case characters only
+     * (e.g. "czech", "japanese", "russian", etc.). It should be equal to 
+     * the identification used in language.cpp.
+     */
+    virtual QCString idLanguage()
+    { return "norwegian"; }
+    
+    /*! Used to get the LaTeX command(s) for the language support. 
+     *  This method should return string with commands that switch
+     *  LaTeX to the desired language.  For example 
+     *  <pre>"\\usepackage[german]{babel}\n"
+     *  </pre>
+     *  or
+     *  <pre>"\\usepackage{polski}\n"
+     *  "\\usepackage[latin2]{inputenc}\n"
+     *  "\\usepackage[T1]{fontenc}\n"
+     *  </pre>
+     */
+    virtual QCString latexLanguageSupportCommand()
+    {
+      return
+        "\\usepackage[norwegian]{babel}\n"
+        "\\usepackage[latin1]{inputenc}\n"
+        "\\usepackage[T1]{fontenc}\n";
+    }
 
-    QCString trRelatedSubscript()
-    { return "(Observer at disse ikke er medlemsfunksjoner)"; }
+    /*! return the language charset. This will be used for the HTML output */
+    virtual QCString idLanguageCharset()
+    {
+      return "iso-8859-1";
+    }
 
-    QCString trDetailedDescription()
-    { return "Detaljert beskrivelse"; }
+    // --- Language translation methods -------------------
 
-    QCString trMemberTypedefDocumentation()
-    { return "Dokumentasjon over typedefinerte medlemmer"; }
+    /*! used in the compound documentation before a list of related functions. */
+    virtual QCString trRelatedFunctions()
+    { return "Relaterte Funksjoner"; }
 
-    QCString trMemberEnumerationDocumentation()
-    { return "Dokumentasjon over enumererte medlemmer"; }
+    /*! subscript for the related functions. */
+    virtual QCString trRelatedSubscript()
+    { return "(Merk at disse ikke er medlemsfunksjoner.)"; }
 
-    QCString trMemberFunctionDocumentation()
-    { return "Dokumentasjon over medlemsfunksjoner"; }
+    /*! header that is put before the detailed description of files, classes and namespaces. */
+    virtual QCString trDetailedDescription()
+    { return "Detaijert Beskrivelse"; }
 
-    QCString trMemberDataDocumentation()
-    { return "Dokumentasjon over datamedlemmer"; }
+    /*! header that is put before the list of typedefs. */
+    virtual QCString trMemberTypedefDocumentation()
+    { return "Medlemstypedef-dokumentasjon"; }
+    
+    /*! header that is put before the list of enumerations. */
+    virtual QCString trMemberEnumerationDocumentation()
+    { return "Medlemsenumerasjons-dokumentasjon"; }
+    
+    /*! header that is put before the list of member functions. */
+    virtual QCString trMemberFunctionDocumentation()
+    { return "Medlemsfunksjons-dokumentasjon"; }
+    
+    /*! header that is put before the list of member attributes. */
+    virtual QCString trMemberDataDocumentation()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Feltdokumentasjon"; 
+      }
+      else
+      {
+        return "Medlemsdata-dokumentasjon"; 
+      }
+    }
 
-    QCString trMore()
+    /*! this is the text of a link put after brief descriptions. */
+    virtual QCString trMore() 
     { return "Mer..."; }
 
-    QCString trListOfAllMembers()
+    /*! put in the class documentation */
+    virtual QCString trListOfAllMembers()
     { return "Liste over alle medlemmer."; }
 
-    QCString trMemberList()
+    /*! used as the title of the "list of all members" page of a class */
+    virtual QCString trMemberList()
     { return "Medlemsliste"; }
 
-    QCString trThisIsTheListOfAllMembers()
-    { return "Det her er en fullstendig liste over medlemmer for "; }
+    /*! this is the first part of a sentence that is followed by a class name */
+    virtual QCString trThisIsTheListOfAllMembers()
+    { return "Dette er den fullstendige listen over medlemmer for "; }
 
-    QCString trIncludingInheritedMembers()
-    { return " med alle nedarvede medlemmer."; }
-
-    QCString trGeneratedAutomatically(const char *s)
-    { QCString result="Automatisk generert av Doxygen";
+    /*! this is the remainder of the sentence after the class name */
+    virtual QCString trIncludingInheritedMembers()
+    { return ", alle arvede medlemmer inkludert."; }
+    
+    /*! this is put at the author sections at the bottom of man pages.
+     *  parameter s is name of the project name.
+     */
+    virtual QCString trGeneratedAutomatically(const char *s)
+    { QCString result="Generert automatisk av Doxygen";
       if (s) result+=(QCString)" for "+s;
       result+=" fra kildekoden."; 
       return result;
     }
 
-    QCString trEnumName()
-    { return "enum navn"; }
-
-    QCString trEnumValue()
-    { return "enum verdi"; }
-
-    QCString trDefinedIn()
+    /*! put after an enum name in the list of all members */
+    virtual QCString trEnumName()
+    { return "enumnavn"; }
+    
+    /*! put after an enum value in the list of all members */
+    virtual QCString trEnumValue()
+    { return "enumverdi"; }
+    
+    /*! put after an undocumented member in the list of all members */
+    virtual QCString trDefinedIn()
     { return "definert i"; }
 
+    // quick reference sections
 
-    QCString trVerbatimText(const char *f)
-    { return (QCString)"Dette er den ordrette teksten fra inkluderingsfilen "+f; }
-
-    QCString trModules()
+    /*! This is put above each page as a link to the list of all groups of 
+     *  compounds or files (see the \\group command).
+     */
+    virtual QCString trModules()
     { return "Moduler"; }
-
-    QCString trClassHierarchy()
+    
+    /*! This is put above each page as a link to the class hierarchy */
+    virtual QCString trClassHierarchy()
     { return "Klassehierarki"; }
+    
+    /*! This is put above each page as a link to the list of annotated classes */
+    virtual QCString trCompoundList()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datastrukturer";
+      }
+      else
+      {
+        return "Klasseliste"; 
+      }
+    }
+    
+    /*! This is put above each page as a link to the list of documented files */
+    virtual QCString trFileList()
+    { return "Fil-liste"; }
+
+    /*! This is put above each page as a link to the list of all verbatim headers */
+    virtual QCString trHeaderFiles()
+    { return "Header-filer"; }
+
+    /*! This is put above each page as a link to all members of compounds. */
+    virtual QCString trCompoundMembers()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datafelt"; 
+      }
+      else
+      {
+        return "Klassemedlemmer"; 
+      }
+    }
 
-    QCString trCompoundList()
-    { return "Sammensatt klasseliste"; }
-
-    QCString trFileList()
-    { return "Filliste"; }
-
-    QCString trHeaderFiles()
-    { return "Headerfiler"; }
-
-    QCString trCompoundMembers()
-    { return "Sammensatte klassemedlemmer"; }
-
-    QCString trFileMembers()
-    { return "Filmedlemmer"; }
+    /*! This is put above each page as a link to all members of files. */
+    virtual QCString trFileMembers()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Globale"; 
+      }
+      else
+      {
+        return "Filmedlemmer"; 
+      }
+    }
 
-    QCString trRelatedPages()
-    { return "Beslektede sider"; }
+    /*! This is put above each page as a link to all related pages. */
+    virtual QCString trRelatedPages()
+    { return "Relaterte Sider"; }
 
-    QCString trExamples()
-    { return "Eksempel"; }
+    /*! This is put above each page as a link to all examples. */
+    virtual QCString trExamples()
+    { return "Eksempler"; }
 
-    QCString trSearch()
+    /*! This is put above each page as a link to the search engine. */
+    virtual QCString trSearch()
     { return "Sřk"; }
 
-    QCString trClassHierarchyDescription()
-    { return "Denne listen over arv er grovt, men ikke helt, "
-             "sortert i alfabetisk rekkefřlge:";
+    /*! This is an introduction to the class hierarchy. */
+    virtual QCString trClassHierarchyDescription()
+    { return "Denne arvelisten er sortert grovt, "
+             "men ikke fullstendig, alfabetisk:";
     }
 
-    QCString trFileListDescription(bool extractAll)
+    /*! This is an introduction to the list with all files. */
+    virtual QCString trFileListDescription(bool extractAll)
     {
-      QCString result="Her fřlger en liste over alle ";
+      QCString result="Her er en liste over alle ";
       if (!extractAll) result+="dokumenterte ";
-      result+="filer, med en kort beskrivelse:";
+      result+="filer med korte beskrivelser:";
       return result;
     }
 
-    QCString trCompoundListDescription()
-     { return "Her fřlger klassene, struktene og "
-             "unionene med en kort beskrivelse:"; 
+    /*! This is an introduction to the annotated compound list. */
+    virtual QCString trCompoundListDescription()
+    { 
+      
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+	return "Her er datastrukturene med korte beskrivelser:";
+      }
+      else
+      {
+	return "Her er klasser, structer, "
+	       "unioner og interfacer med korte beskrivelser:";
+      }
     }
 
-    QCString trCompoundMembersDescription(bool extractAll)
+    /*! This is an introduction to the page with all class members. */
+    virtual QCString trCompoundMembersDescription(bool extractAll)
     {
-
-    QCString result="Her fřlger en liste over alle ";
-      if (!extractAll) result+="dokumenterte ";
-      result+="klassemedlemmer med lenker til ";
-      if (!extractAll) result+="klassedokumentasjonen for hvert medlem:";
-      else result+="klassene som de tilhřrer:";
+      QCString result="Her er en liste over alle ";
+      if (!extractAll)
+      {
+        result+="dokumenterte ";
+      }
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        result+="struct- og unionfelter";
+      }
+      else
+      {
+        result+="klassemedlemmer";
+      }
+      result+=" med koblinger til ";
+      if (!extractAll) 
+      {
+        if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+        {
+          result+="struct-/union-dokumentasjon for hvert felt:";
+        }
+        else
+        {
+	  result+="klassedokumentasjonen for hvert medlem:";
+        }
+      }
+      else 
+      {
+        if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+        {
+	  result+="structene/unionene de hřrer til:";
+        }
+        else
+        {
+	  result+="klassene de hřrer til:";
+        }
+      }
       return result;
     }
-
-    QCString trFileMembersDescription(bool extractAll)
+    /*! This is an introduction to the page with all file members. */
+    virtual QCString trFileMembersDescription(bool extractAll)
     {
-      QCString result="Her fřlger en liste over alle ";
+      QCString result="Her er en liste over alle ";
       if (!extractAll) result+="dokumenterte ";
-      result+="filmedlemmer med lenker til ";
-      if (extractAll) result+="dokumentasjonsfilen for hvert medlem:";
-      else result+="filene som de tilhřrer:";
+      
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        result+="funksjoner, variable, definerte, enumer, and typedefer";
+      }
+      else
+      {
+        result+="filmedlemmer";
+      }
+      result+=" med koblinger til ";
+      if (extractAll) 
+        result+="filene de hřrer til:";
+      else 
+        result+="dokumentasjonen:";
       return result;
     }
 
-    QCString trHeaderFilesDescription()
-    { return "Her fřlger headerfilene som API bestĺr av:"; }
+    /*! This is an introduction to the page with the list of all header files. */
+    virtual QCString trHeaderFilesDescription()
+    { return "Her er alle header-filene som utgjřr API:"; }
+
+    /*! This is an introduction to the page with the list of all examples */
+    virtual QCString trExamplesDescription()
+    { return "Her er en liste over alle eksemplene:"; }
 
-    QCString trExamplesDescription()
-    { return "Her fřlger en liste med alle eksempler:"; }
+    /*! This is an introduction to the page with the list of related pages */
+    virtual QCString trRelatedPagesDescription()
+    { return "Her er en liste over alle relaterte dokumentasjonssider:"; }
 
-    QCString trRelatedPagesDescription()
-    { return "Her fřlger en liste over alle beslektede dokumentasjonssider:";}
+    /*! This is an introduction to the page with the list of class/file groups */
+    virtual QCString trModulesDescription()
+    { return "Her er en liste over alle moduler:"; }
 
-    QCString trModulesDescription()
-    { return "Her fřlger en liste over alle moduler:"; }
+    /*! This sentences is used in the annotated class/file lists if no brief
+     * description is given. 
+     */
+    virtual QCString trNoDescriptionAvailable()
+    { return "Ingen beskrivelse tilgjengelig"; }
+    
+    // index titles (the project name is prepended for these) 
 
-    QCString trNoDescriptionAvailable()
-    { return "Beskrivelse mangler"; }
 
-    QCString trDocumentation()
+    /*! This is used in HTML as the title of index.html. */
+    virtual QCString trDocumentation()
     { return "Dokumentasjon"; }
 
-    QCString trModuleIndex()
-    { return "Modulindex"; }
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * index of all groups.
+     */
+    virtual QCString trModuleIndex()
+    { return "Modulindeks"; }
 
-    QCString trHierarchicalIndex()
-    { return "Hierarkisk Indeks"; }
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * class hierarchy.
+     */
+    virtual QCString trHierarchicalIndex()
+    { return "Hierarkisk indeks"; }
 
-    QCString trCompoundIndex()
-    { return "Sammensatt Indeks"; }
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * annotated compound index.
+     */
+    virtual QCString trCompoundIndex()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      { 
+        return "Datastrukturindeks";
+      }
+      else
+      {
+        return "Klasse-indeks"; 
+      }
+    }
 
-    QCString trFileIndex()
-    { return "Filindeks"; }
+    /*! This is used in LaTeX as the title of the chapter with the
+     * list of all files.
+     */
+    virtual QCString trFileIndex() 
+    { return "Fil-indeks"; }
 
-    QCString trModuleDocumentation()
-    { return "Dokumentasjon av moduler"; }
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all groups.
+     */
+    virtual QCString trModuleDocumentation()
+    { return "Moduldokumentasjon"; }
 
-    QCString trClassDocumentation()
-    { return "Dokumentasjon av klasser"; }
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all classes, structs and unions.
+     */
+    virtual QCString trClassDocumentation()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datastruktur-dokumentasjon"; 
+      }
+      else
+      {
+        return "Klassedokumentasjon"; 
+      }
+    }
 
-    QCString trFileDocumentation()
-    { return "Dokumentasjon av filer"; }
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all files.
+     */
+    virtual QCString trFileDocumentation()
+    { return "Fildokumentasjon"; }
 
-    QCString trExampleDocumentation()
-    { return "Dokumentasjon av eksempler"; }
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all examples.
+     */
+    virtual QCString trExampleDocumentation()
+    { return "Eksempeldokumentasjon"; }
 
-    QCString trPageDocumentation()
-    { return "Dokumentasjon av sider"; }
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all related pages.
+     */
+    virtual QCString trPageDocumentation()
+    { return "Sidedokumentasjon"; }
 
-    QCString trReferenceManual()
+    /*! This is used in LaTeX as the title of the document */
+    virtual QCString trReferenceManual()
     { return "Referansemanual"; }
+    
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of defines
+     */
+    virtual QCString trDefines()
+    { return "Definerte"; }
 
-    QCString trDefines()
-    { return "Definisjoner"; }
-    QCString trFuncProtos()
-    { return "Funksjonsprototyper"; }
-    QCString trTypedefs()
-    { return "Typedefinisjoner"; }
-    QCString trEnumerations()
-    { return "Enumererte typer"; }
-    QCString trFunctions()
-    { return "Funksjoner"; }
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of function prototypes
+     */
+    virtual QCString trFuncProtos()
+    { return "Funksjonprototyper"; }
 
-    QCString trVariables()
-    { return "Variable"; }
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of typedefs
+     */
+    virtual QCString trTypedefs()
+    { return "Typedefer"; }
 
-    QCString trEnumerationValues()
-    { return "Enumererte typers verdier"; }
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of enumerations
+     */
+    virtual QCString trEnumerations()
+    { return "Enumerasjoner"; }
 
-    QCString trAuthor()
-    { return "Forfatter"; }
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) functions
+     */
+    virtual QCString trFunctions()
+    { return "Funksjoner"; }
 
-    QCString trDefineDocumentation()
-    { return "Dokumentasjon over definisjoner"; }
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
+    virtual QCString trVariables()
+    { return "Variable"; }
 
-    QCString trFunctionPrototypeDocumentation()
-    { return "Dokumentasjon over funksjonsprototyper"; }
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
+    virtual QCString trEnumerationValues()
+    { return "Enumerasjonsverdier"; }
+    
+    /*! This is used in the documentation of a file before the list of
+     *  documentation blocks for defines
+     */
+    virtual QCString trDefineDocumentation()
+    { return "Define-dokumentasjon"; }
 
-    QCString trTypedefDocumentation()
-    { return "Dokumentasjon over typedefinisjoner"; }
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for function prototypes
+     */
+    virtual QCString trFunctionPrototypeDocumentation()
+    { return "Funksjonsprototype-dokumentasjon"; }
 
-    QCString trEnumerationTypeDocumentation()
-    { return "Dokumentasjon over enumererte typer"; }
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for typedefs
+     */
+    virtual QCString trTypedefDocumentation()
+    { return "Typedef-dokumentasjon"; }
 
-    QCString trEnumerationValueDocumentation()
-    { return "Dokumentasjon over enumererte typers verdier"; }
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration types
+     */
+    virtual QCString trEnumerationTypeDocumentation()
+    { return "Enumerert type-dokumentasjon"; }
 
-    QCString trFunctionDocumentation()
-    { return "Dokumentasjon over funksjoner"; }
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration values
+     */
+    virtual QCString trEnumerationValueDocumentation()
+    { return "Enumerert verdi-dokumentasjon"; }
 
-    QCString trVariableDocumentation()
-    { return "Dokumentasjon over variable"; }
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for functions
+     */
+    virtual QCString trFunctionDocumentation()
+    { return "Funksjonsdokumentasjon"; }
 
-    QCString trCompounds()
-    { return "Sammensetning"; }
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for variables
+     */
+    virtual QCString trVariableDocumentation()
+    { return "Variabeldokumentasjon"; }
 
-    QCString trFiles()
-    { return "Filer"; }
+    /*! This is used in the documentation of a file/namespace/group before 
+     *  the list of links to documented compounds
+     */
+    virtual QCString trCompounds()
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datastrukturer"; 
+      }
+      else
+      {
+        return "Klasser"; 
+      }
+    }
 
-    QCString trGeneratedAt(const char *date,const char *projName)
-    {
-      QCString result=(QCString)"Generert "+date;
+    /*! This is used in the standard footer of each page and indicates when 
+     *  the page was generated 
+     */
+    virtual QCString trGeneratedAt(const char *date,const char *projName)
+    { 
+      QCString result=(QCString)"Generert pĺ "+date;
       if (projName) result+=(QCString)" for "+projName;
       result+=(QCString)" av";
       return result;
     }
-
-    QCString trWrittenBy()
+    /*! This is part of the sentence used in the standard footer of each page.
+     */
+    virtual QCString trWrittenBy()
     {
       return "skrevet av";
     }
 
-    QCString trClassDiagram(const char *clName)
+    /*! this text is put before a class diagram */
+    virtual QCString trClassDiagram(const char *clName)
     {
-      return (QCString)"Klassediagram for "+clName;
+      return (QCString)"Arvediagram for "+clName+":";
     }
+    
+    /*! this text is generated when the \\internal command is used. */
+    virtual QCString trForInternalUseOnly()
+    { return "Kun for intern bruk."; }
 
-    QCString trForInternalUseOnly()
-    { return "Kun for internt bruk."; }
-
-    QCString trReimplementedForInternalReasons()
-    { return "Omskrevet av interne grunner ; API pĺvirkes ikke.";}
+    /*! this text is generated when the \\reimp command is used. */
+    virtual QCString trReimplementedForInternalReasons()
+    { return "Reimplementert av interne grunner; API er ikke pĺvirket."; }
 
-    QCString trWarning()
+    /*! this text is generated when the \\warning command is used. */
+    virtual QCString trWarning()
     { return "Advarsel"; }
 
-    QCString trBugsAndLimitations()
-    { return "Feil och begrensninger"; }
+    /*! this text is generated when the \\bug command is used. */
+    virtual QCString trBugsAndLimitations()
+    { return "Bugs og begrensninger"; }
 
-    QCString trVersion()
+    /*! this text is generated when the \\version command is used. */
+    virtual QCString trVersion()
     { return "Versjon"; }
 
-    QCString trDate()
+    /*! this text is generated when the \\date command is used. */
+    virtual QCString trDate()
     { return "Dato"; }
 
-    QCString trAuthors()
-    { return "Forfatter(e)"; }
-
-    QCString trReturns()
+    /*! this text is generated when the \\return command is used. */
+    virtual QCString trReturns()
     { return "Returnerer"; }
 
-    QCString trSeeAlso()
+    /*! this text is generated when the \\sa command is used. */
+    virtual QCString trSeeAlso()
     { return "Se ogsĺ"; }
 
-    QCString trParameters()
+    /*! this text is generated when the \\param command is used. */
+    virtual QCString trParameters()
     { return "Parametre"; }
 
-    QCString trExceptions()
+    /*! this text is generated when the \\exception command is used. */
+    virtual QCString trExceptions()
     { return "Unntak"; }
-
-    QCString trGeneratedBy()
+    
+    /*! this text is used in the title page of a LaTeX document. */
+    virtual QCString trGeneratedBy()
     { return "Generert av"; }
 
+//////////////////////////////////////////////////////////////////////////
 // new since 0.49-990307
-
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! used as the title of page containing all the index of all namespaces. */
     virtual QCString trNamespaceList()
-    { return "Navneomrĺdeliste"; }
+    { return "Navneromliste"; }
 
+    /*! used as an introduction to the namespace list */
     virtual QCString trNamespaceListDescription(bool extractAll)
     {
       QCString result="Her er en liste over alle ";
-      if (!extractAll) result+="dokumenterade ";
-      result+="navneomrĺder med en kort forklaring:";
+      if (!extractAll) result+="dokumenterte ";
+      result+="navnerom med korte beskrivelser:";
       return result;
     }
 
+    /*! used in the class documentation as a header before the list of all
+     *  friends of a class
+     */
     virtual QCString trFriends()
     { return "Venner"; }
-
+    
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990405
 //////////////////////////////////////////////////////////////////////////
-
+    
+    /*! used in the class documentation as a header before the list of all
+     * related classes 
+     */
     virtual QCString trRelatedFunctionDocumentation()
-    { return "Venners och beslektede funksjoners dokumentasjon"; }
-
+    { return "Venner Og Relaterte Funksjoner-dokumentasjon"; }
+    
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990425
 //////////////////////////////////////////////////////////////////////////
 
+    /*! used as the title of the HTML page of a class/struct/union */
     virtual QCString trCompoundReference(const char *clName,
                                     ClassDef::CompoundType compType,
-                                    bool /*isTemplate*/)
+                                    bool isTemplate)
     {
-      QCString result=(QCString)clName+" ";
+      QCString result=(QCString)clName;
       switch(compType)
       {
-        case ClassDef::Class:  result+=" klasse"; break;
-        case ClassDef::Struct: result+=" struktur"; break;
-        case ClassDef::Union:  result+=" union"; break;
-        case ClassDef::Interface:  result+=" grensesnitt"; break;
-        case ClassDef::Protocol:  result+=" protocol"; break; // translate me!
-        case ClassDef::Category:  result+=" category"; break; // translate me!
-        case ClassDef::Exception:  result+=" unntak"; break;
+        case ClassDef::Class:      result+=" Klasse"; break;
+        case ClassDef::Struct:     result+=" Struct"; break;
+        case ClassDef::Union:      result+=" Union"; break;
+        case ClassDef::Interface:  result+=" Grensesnitt"; break;
+        case ClassDef::Exception:  result+=" Unntak"; break;
+        case ClassDef::Protocol:   result+=" Protocol"; break;
+        case ClassDef::Category:   result+=" Category"; break;
       }
-      result+="referanse";
+      if (isTemplate) result+=" Mal";
+      result+=" Referanse";
       return result;
     }
 
+    /*! used as the title of the HTML page of a file */
     virtual QCString trFileReference(const char *fileName)
     {
       QCString result=fileName;
-      result+=" filreferanse";
+      result+=" Filreferanse"; 
       return result;
     }
 
+    /*! used as the title of the HTML page of a namespace */
     virtual QCString trNamespaceReference(const char *namespaceName)
     {
       QCString result=namespaceName;
-      result+=" navneomrĺdereferanse";
+      result+=" Navneromsreferanse";
       return result;
     }
-
+    
     virtual QCString trPublicMembers()
-    { return "Public medlemmer"; }
+    { return "Public Medlemsfunksjoner"; }
     virtual QCString trPublicSlots()
-    { return "Public slots"; }
+    { return "Public Slots"; }
     virtual QCString trSignals()
     { return "Signaler"; }
     virtual QCString trStaticPublicMembers()
-    { return "Statiske public medlemmer"; }
+    { return "Statiske Public Medlemsfunksjoner"; }
     virtual QCString trProtectedMembers()
-    { return "Beskyttede medlemmer"; }
+    { return "Protected Memdlemsfunksjoner"; }
     virtual QCString trProtectedSlots()
-    { return "Beskyttede slots"; }
+    { return "Protected Slots"; }
     virtual QCString trStaticProtectedMembers()
-    { return "Statiska beskyttede medlemmer"; }
+    { return "Statiske Protected Medlemsfunksjoner"; }
     virtual QCString trPrivateMembers()
-    { return "Private medlemmer"; }
+    { return "Private Medlemsfunksjoner"; }
     virtual QCString trPrivateSlots()
-    { return "Private slots"; }
+    { return "Private Slots"; }
     virtual QCString trStaticPrivateMembers()
-    { return "Statiske private medlemmer"; }
-    // end of member secsjons
-
+    { return "Statiske Private Medlemsfunksjoner"; }
+    
+    /*! this function is used to produce a comma-separated list of items.
+     *  use generateMarker(i) to indicate where item i should be put.
+     */
     virtual QCString trWriteList(int numEntries)
     {
-      // this funcsjon is used to produce a comma-separated list of items.
-      // use generateMarker(i) to indicate where item i should be put.
       QCString result;
       int i;
       // the inherits list contain `numEntries' classes
-      for (i=0;i<numEntries;i++)
+      for (i=0;i<numEntries;i++) 
       {
         // use generateMarker to generate placeholders for the class links!
-        result+=generateMarker(i); // generate marker for entry i in the list
+        result+=generateMarker(i); // generate marker for entry i in the list 
                                    // (order is left to right)
-
+        
         if (i!=numEntries-1)  // not the last entry, so we need a separator
         {
-          if (i<numEntries-2) // not the fore last entry
+          if (i<numEntries-2) // not the fore last entry 
             result+=", ";
           else                // the fore last entry
             result+=", og ";
         }
       }
-      return result;
+      return result; 
     }
-
+    
+    /*! used in class documentation to produce a list of base classes,
+     *  if class diagrams are disabled.
+     */
     virtual QCString trInheritsList(int numEntries)
-      // used in class documentasjon to produce a list of base classes,
-      // if class diagrams are disabled.
     {
       return "Arver "+trWriteList(numEntries)+".";
     }
+
+    /*! used in class documentation to produce a list of super classes,
+     *  if class diagrams are disabled.
+     */
     virtual QCString trInheritedByList(int numEntries)
-      // used in class documentasjon to produce a list of super classes,
-      // if class diagrams are disabled.
     {
-      return "Arvet fra "+trWriteList(numEntries)+".";
+      return "Arvet av "+trWriteList(numEntries)+".";
     }
+
+    /*! used in member documentation blocks to produce a list of 
+     *  members that are hidden by this one.
+     */
     virtual QCString trReimplementedFromList(int numEntries)
-      // used in member documentasjon blocks to produce a list of
-      // members that are hidden by this one.
     {
       return "Reimplementert fra "+trWriteList(numEntries)+".";
     }
+
+    /*! used in member documentation blocks to produce a list of
+     *  all member that overwrite the implementation of this member.
+     */
     virtual QCString trReimplementedInList(int numEntries)
     {
-      // used in member documentasjon blocks to produce a list of
-      // all member that overwrite the implementasjon of this member.
       return "Reimplementert i "+trWriteList(numEntries)+".";
     }
 
+    /*! This is put above each page as a link to all members of namespaces. */
     virtual QCString trNamespaceMembers()
-    { return "Navneomrĺdemedlemmer"; }
+    { return "Navneromsmedlemmer"; }
+
+    /*! This is an introduction to the page with all namespace members */
     virtual QCString trNamespaceMemberDescription(bool extractAll)
-    {
+    { 
       QCString result="Her er en liste over alle ";
       if (!extractAll) result+="dokumenterte ";
-      result+="navneomrĺdemedlemmer med lenker til ";
-      if (extractAll)
-        result+=" navneomrĺde-dokumentasjonen for hvert medlem:";
-      else
-        result+="de navneomrĺder de tilhřrer:";
+      result+="navneromsmedlemmer med koblinger til ";
+      if (extractAll) 
+        result+="navneromsdokumentasjonen for hvert medlem:";
+      else 
+        result+="navnerommet de hřrer til:";
       return result;
     }
-
+    /*! This is used in LaTeX as the title of the chapter with the 
+     *  index of all namespaces.
+     */
     virtual QCString trNamespaceIndex()
-    { return "Navneomrĺdeindeks"; }
+    { return "Navneromsindeks"; }
 
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all namespaces.
+     */
     virtual QCString trNamespaceDocumentation()
-      { return "Navneomrĺde-dokumentasjon"; }
-    //////////////////////////////////////////////////////////////////////////
+    { return "Navneromsdokumentasjon"; }
+
+//////////////////////////////////////////////////////////////////////////
 // new since 0.49-990522
 //////////////////////////////////////////////////////////////////////////
 
-    /*! This is used in the documentasjon before the list of all
+    /*! This is used in the documentation before the list of all
      *  namespaces in a file.
      */
     virtual QCString trNamespaces()
-    { return "Navneomrĺder"; }
+    { return "Navnerom"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990728
 //////////////////////////////////////////////////////////////////////////
 
-    /*! This is put at the bottom of a class documentasjon page and is
+    /*! This is put at the bottom of a class documentation page and is
      *  followed by a list of files that were used to generate the page.
      */
     virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
         bool single)
     { // here s is one of " Class", " Struct" or " Union"
       // single is true implies a single file
-      QCString result=(QCString)"Dokumentasjonen for ";
+      QCString result=(QCString)"The documentation for this ";
       switch(compType)
       {
-        case ClassDef::Class:      result+="denne klasse "; break;
-        case ClassDef::Struct:     result+="denne strukt "; break;
-        case ClassDef::Union:      result+="denne union "; break;
-        case ClassDef::Interface:  result+="dette grensesnittet "; break;
-        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
-        case ClassDef::Category:   result+="category"; break; // translate me!
-        case ClassDef::Exception:  result+="unntak "; break;
+        case ClassDef::Class:      result+="klasse"; break;
+        case ClassDef::Struct:     result+="struct"; break;
+        case ClassDef::Union:      result+="union"; break;
+        case ClassDef::Interface:  result+="interface"; break;
+        case ClassDef::Exception:  result+="unntak"; break;
+        case ClassDef::Protocol:   result+="protocol"; break;
+        case ClassDef::Category:   result+="category"; break;
       }
-      result+="var generert fra fřlgende fil";
+      result+=" ble generert fra fřlgende fil";
       if (single) result+=":"; else result+="er:";
       return result;
     }
@@ -499,9 +818,8 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
      * list.
      */
     virtual QCString trAlphabeticalList()
-    {
-      return "Alfabetisk liste";
-    }
+    { return "Alfabetisk Liste"; }
+
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990901
 //////////////////////////////////////////////////////////////////////////
@@ -516,7 +834,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
     { return "Hovedside"; }
 
     /*! This is used in references to page that are put in the LaTeX 
-     *  documentasjon. It should be an abbreviasjon of the word page.
+     *  documentation. It should be an abbreviation of the word page.
      */
     virtual QCString trPageAbbreviation()
     { return "s."; }
@@ -531,12 +849,13 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
     }
     virtual QCString trDefinedAtLineInSourceFile()
     {
-      return "Definisjon pĺ rad @0 i filen @1.";
+      return "Definisjon pĺ linje @0 i filen @1.";
     }
     virtual QCString trDefinedInSourceFile()
     {
       return "Definisjon i filen @0.";
     }
+
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-991205
 //////////////////////////////////////////////////////////////////////////
@@ -553,37 +872,38 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
     /*! this text is put before a collaboration diagram */
     virtual QCString trCollaborationDiagram(const char *clName)
     {
-      return (QCString)"Samarbeidsdiagram for "+clName+":";
+      return (QCString)"Kollaborasjonsdiagram for "+clName+":";
     }
     /*! this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
     {
-      return (QCString)"Include-avhengighetsgraf for "+fName+":";
+      return (QCString)"Inkluderingsavhengighetsgraf for "+fName+":";
     }
+
     /*! header that is put before the list of constructor/destructors. */
     virtual QCString trConstructorDocumentation()
     {
-      return "Konstruktřr- og Destruktřrdokumentasjon"; 
+      return "Konstruktřr- & Destruktřr-dokumentasjon"; 
     }
     /*! Used in the file documentation to point to the corresponding sources. */
     virtual QCString trGotoSourceCode()
     {
-      return "Gĺ til kildekoden for denne filen.";
+      return "Gĺ til kildekoden til denne filen.";
     }
     /*! Used in the file sources to point to the corresponding documentation. */
     virtual QCString trGotoDocumentation()
     {
-      return "Gĺ til dokumentasjonen for denne filen.";
+      return "Gĺ til dokumentasjonen til denne filen.";
     }
     /*! Text for the \\pre command */
     virtual QCString trPrecondition()
     {
-      return "Fřr-kondisjon";
+      return "Fřrbetingelse";
     }
     /*! Text for the \\post command */
     virtual QCString trPostcondition()
     {
-      return "Etter-kondisjon";
+      return "Etterbetingelse";
     }
     /*! Text for the \\invariant command */
     virtual QCString trInvariant()
@@ -593,7 +913,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
     /*! Text shown before a multi-line variable/enum initialization */
     virtual QCString trInitialValue()
     {
-      return "Initializer:";
+      return "Startverdi:";
     }
     /*! Text used the source code in the file index */
     virtual QCString trCode()
@@ -602,19 +922,19 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
     }
     virtual QCString trGraphicalHierarchy()
     {
-      return "Graphical Class Hierarchy";
+      return "Grafisk klassehierarki";
     }
     virtual QCString trGotoGraphicalHierarchy()
     {
-      return "Go to the graphical class hierarchy";
+      return "Gĺ til det grafiske klasse hierarkiet";
     }
     virtual QCString trGotoTextualHierarchy()
     {
-      return "Go to the textual class hierarchy";
+      return "Gĺ til tekst-klassehierarki";
     }
     virtual QCString trPageIndex()
     {
-      return "Sideindeks";
+      return "Innhold";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -627,39 +947,46 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
     }
     virtual QCString trPublicTypes()
     {
-      return "Public Typer";
+      return "Public typer";
     }
     virtual QCString trPublicAttribs()
     {
-      return "Public Attributter";
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datafelt";
+      }
+      else
+      {
+        return "Public attributter";
+      }
     }
     virtual QCString trStaticPublicAttribs()
     {
-      return "Statiske Public Attributter";
+      return "Statiske public attributter";
     }
     virtual QCString trProtectedTypes()
     {
-      return "Beskyttede Typer";
+      return "Protected typer";
     }
     virtual QCString trProtectedAttribs()
     {
-      return "Beskyttede Attributter";
+      return "Protected attributter";
     }
     virtual QCString trStaticProtectedAttribs()
     {
-      return "Statiske Beskyttede Attributter";
+      return "Statiske protected attributter";
     }
     virtual QCString trPrivateTypes()
     {
-      return "Private Typer";
+      return "Private typer";
     }
     virtual QCString trPrivateAttribs()
     {
-      return "Private Attributter";
+      return "Private attributter";
     }
     virtual QCString trStaticPrivateAttribs()
     {
-      return "Statiske Private Attributter";
+      return "Statiske private attributter";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -683,7 +1010,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
 
     virtual QCString trReferencedBy()
     {
-      return "Referert at";
+      return "Referert av";
     }
     virtual QCString trRemarks()
     {
@@ -691,12 +1018,12 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
     }
     virtual QCString trAttention()
     {
-      return "Attention";
+      return "Viktig";
     }
     virtual QCString trInclByDepGraph()
     {
-      return "This graph shows which files directly or "
-             "indirectly include this file:";
+      return "Denne grafen viser hvilke filer som direkte eller "
+             "indirekte inkluderer denne filen:";
     }
     virtual QCString trSince()
     {
@@ -710,69 +1037,68 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
     /*! title of the graph legend page */
     virtual QCString trLegendTitle()
     {
-      return "Graph Legend";
+      return "Symbolforklaring";
     }
     /*! page explaining how the dot graph's should be interpreted */
     virtual QCString trLegendDocs()
     {
       return 
-        "This page explains how to interpret the graphs that are generated "
-        "by doxygen.<p>\n"
-        "Consider the following example:\n"
-        "\\code\n"
-        "/*! Invisible class because of truncation */\n"
-        "class Invisible { };\n\n"
-        "/*! Truncated class, inheritance relation is hidden */\n"
-        "class Truncated : public Invisible { };\n\n"
-        "/* Class not documented with doxygen comments */\n"
-        "class Undocumented { };\n\n"
-        "/*! Class that is inherited using public inheritance */\n"
+	"Denne siden forklarer hvordan man tolker grafene doxygen genererer.<p>\n"
+	"Vi baserer oss pĺ fřlgende eksempel:\n"
+        "\\code\n" 
+        "/*! Usynlig klasse pga. trunkasjon */\n" 
+        "class Invisible { };\n\n" 
+        "/*! Trunkert klasse, arve-relasjon er skjult */\n"
+        "class Truncated : public Invisible { };\n\n" 
+        "/* Klasse som ikke er dokumentert med doxygen-kommentarer */"
+        "class Undocumented { };\n\n" 
+        "/*! Klasse med public-arv */\n" 
         "class PublicBase : public Truncated { };\n\n"
-        "/*! Class that is inherited using protected inheritance */\n"
+        "/*! Klasse med protected-arv */\n"
         "class ProtectedBase { };\n\n"
-        "/*! Class that is inherited using private inheritance */\n"
+        "/*! Klasse med private-arv */\n"
         "class PrivateBase { };\n\n"
-        "/*! Class that is used by the Inherited class */\n"
+        "/*! Klasse som blir brukt av klassen Inherited */\n" 
         "class Used { };\n\n"
-        "/*! Super class that inherits a number of other classes */\n"
+        "/*! Super-klasse som arver flere andre klasser */\n"
         "class Inherited : public PublicBase,\n"
         "                  protected ProtectedBase,\n"
         "                  private PrivateBase,\n"
         "                  public Undocumented\n"
+        "                  public Templ<int>\n"
         "{\n"
         "  private:\n"
         "    Used *m_usedClass;\n"
         "};\n"
-        "\\endcode\n"
-        "If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
-        "is set to 200 this will result in the following graph:"
+        "\\endcode\n" 
+        "Hvis \\c MAX_DOT_GRAPH_HEIGHT er satt til 200 i "
+        "konfigurasjonsfila vil dette resultere i fřlgende graf:"
         "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
         "<p>\n"
-        "The boxes in the above graph have the following meaning:\n"
-        "<ul>\n"
-        "<li>A filled black box represents the struct or class for which the "
-        "graph is generated.\n"
-        "<li>A box with a black border denotes a documented struct or class.\n"
-        "<li>A box with a grey border denotes an undocumented struct or class.\n"
-        "<li>A box with a red border denotes a documented struct or class for\n"
-        "which not all inheritance/containment relations are shown. A graph is "
-        "truncated if it does not fit within the specified boundaries."
-        "</ul>\n"
-        "The arrows have the following meaning:\n"
+        "Boksene i grafen over betyr fřlgende:\n"
         "<ul>\n"
-        "<li>A dark blue arrow is used to visualize a public inheritance "
-        "relation between two classes.\n"
-        "<li>A dark green arrow is used for protected inheritance.\n"
-        "<li>A dark red arrow is used for private inheritance.\n"
-        "<li>A purple dashed arrow is used if a class is contained or used "
-        "by another class. The arrow is labeled with the variable(s) "
-        "through which the pointed class or struct is accessible. \n"
-        "</ul>\n";
+        "<li>En fylt svart boks representerer klassen grafen "
+        "er generert for.\n"
+	"<li>En boks med svart ramme angir en dokumentert struct eller klasse.\n"
+	"<li>En boks med grĺ ramme angir en udokumentert struct eller klasse.\n"
+	"<li>En boks med rřd ramme angir en dokumentert struct eller klasse "
+	"der ikke alle relasjoner er vist. En graf blir trunkert om den ikke "
+	"passer innenfor de spesifiserte rammene.\n"
+	"</ul>\n"
+	"Pilene i grafen har fřlgende betydning:\n"
+	"</ul>\n"
+	"<li>En mřrk blĺ pil brukes til ĺ visualisere public-arv mellom to klasser.\n"
+	"<li>En mřrk grřnn pil brukes for protected-arv.\n"
+	"<li>En mřrk rřd pil angir private-arv.\n"
+	"<li>En stiplet lilla pil angir at en klasse er inkludert eller brukt "
+	"i en annen klasse. Pilen er merket med variablen(e) klassen "
+	"er tilgjengelig gjennom.\n"
+	"</ul>\n";
     }
     /*! text for the link to the legend page */
     virtual QCString trLegend()
     {
-      return "legend";
+      return "symbolforklaring";
     }
     
 //////////////////////////////////////////////////////////////////////////
@@ -797,17 +1123,430 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
     /*! Used as a section header for KDE-2 IDL methods */
     virtual QCString trDCOPMethods()
     {
-      return "DCOP Methods";
+      return "DCOP-metoder";
     }
-};
 
-#endif
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
 
+    /*! Used as a section header for IDL properties */
+    virtual QCString trProperties()
+    {
+      return "Egenskaper";
+    }
+    /*! Used as a section header for IDL property documentation */
+    virtual QCString trPropertyDocumentation()
+    {
+      return "Egenskaps-dokumentasjon";
+    }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
 
+    /*! Used for Java interfaces in the summary section of Java packages */
+    virtual QCString trInterfaces()
+    {
+      return "Grensesnitt";
+    }
+    /*! Used for Java classes in the summary section of Java packages */
+    virtual QCString trClasses()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Datastrukturer";
+      }
+      else
+      {
+        return "Klasser";
+      }
+    }
+    /*! Used as the title of a Java package */
+    virtual QCString trPackage(const char *name)
+    {
+      return (QCString)"Package "+name;
+    }
+    /*! Title of the package index page */
+    virtual QCString trPackageList()
+    {
+      return "Pakke-liste";
+    }
+    /*! The description of the package index page */
+    virtual QCString trPackageListDescription()
+    {
+      return "Her er pakkene med korte beskrivelser (om tilgjengelig):";
+    }
+    /*! The link name in the Quick links header for each page */
+    virtual QCString trPackages()
+    {
+      return "Pakker";
+    }
+    /*! Used as a chapter title for Latex & RTF output */
+    virtual QCString trPackageDocumentation()
+    {
+      return "Pakke-dokumentasjon";
+    }
+    /*! Text shown before a multi-line define */
+    virtual QCString trDefineValue()
+    {
+      return "Verdi:";
+    }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! Used as a marker that is put before a \\bug item */
+    virtual QCString trBug()
+    {
+      return "Bug";
+    }
+    /*! Used as the header of the bug list */
+    virtual QCString trBugList()
+    {
+      return "Bug-liste";
+    }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.6
+//////////////////////////////////////////////////////////////////////////
 
+    /*! Used as ansicpg for RTF file 
+     * 
+     * The following table shows the correlation of Charset name, Charset Value and 
+     * <pre>
+     * Codepage number:
+     * Charset Name       Charset Value(hex)  Codepage number
+     * ------------------------------------------------------
+     * DEFAULT_CHARSET           1 (x01)
+     * SYMBOL_CHARSET            2 (x02)
+     * OEM_CHARSET             255 (xFF)
+     * ANSI_CHARSET              0 (x00)            1252
+     * RUSSIAN_CHARSET         204 (xCC)            1251
+     * EE_CHARSET              238 (xEE)            1250
+     * GREEK_CHARSET           161 (xA1)            1253
+     * TURKISH_CHARSET         162 (xA2)            1254
+     * BALTIC_CHARSET          186 (xBA)            1257
+     * HEBREW_CHARSET          177 (xB1)            1255
+     * ARABIC _CHARSET         178 (xB2)            1256
+     * SHIFTJIS_CHARSET        128 (x80)             932
+     * HANGEUL_CHARSET         129 (x81)             949
+     * GB2313_CHARSET          134 (x86)             936
+     * CHINESEBIG5_CHARSET     136 (x88)             950
+     * </pre>
+     * 
+     */
+    virtual QCString trRTFansicp()
+    {
+      return "1252";
+    }
+    
 
+    /*! Used as ansicpg for RTF fcharset 
+     *  \see trRTFansicp() for a table of possible values.
+     */
+    virtual QCString trRTFCharSet()
+    {
+      return "0";
+    }
 
+    /*! Used as header RTF general index */
+    virtual QCString trRTFGeneralIndex()
+    {
+      return "Indeks";
+    }
+   
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trClass(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Klasse" : "klasse"));
+      if (!singular)  result+="r";
+      return result; 
+    }
 
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trFile(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Fil" : "fil"));
+      if (!singular)  result+="er";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trNamespace(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Navnerom" : "navnerom"));
+      if (!singular)  result+="";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trGroup(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Gruppe" : "gruppe"));
+      if (!singular)  result+="r";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trPage(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Side" : "side"));
+      if (!singular)  result+="r";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trMember(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Medlem" : "medlem"));
+      if (!singular)  result+="mer";
+      return result; 
+    }
+   
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trField(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Felt" : "felt"));
+      if (!singular)  result+="";
+      return result; 
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trGlobal(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Global" : "global"));
+      if (!singular)  result+="e";
+      return result; 
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.7
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This text is generated when the \\author command is used and
+     *  for the author section in man pages. */
+    virtual QCString trAuthor(bool first_capital, bool singular)
+    {                                                                         
+      QCString result((first_capital ? "Forfatter" : "forfatter"));
+      if (!singular)  result+="e";
+      return result; 
+    }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.11
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This text is put before the list of members referenced by a member
+     */
+    virtual QCString trReferences()
+    {
+      return "Referanser";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.13
+//////////////////////////////////////////////////////////////////////////
+
+    /*! used in member documentation blocks to produce a list of 
+     *  members that are implemented by this one.
+     */
+    virtual QCString trImplementedFromList(int numEntries)
+    {
+      return "Implementerer "+trWriteList(numEntries)+".";
+    }
+
+    /*! used in member documentation blocks to produce a list of
+     *  all members that implement this abstract member.
+     */
+    virtual QCString trImplementedInList(int numEntries)
+    {
+      return "Implementert i "+trWriteList(numEntries)+".";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.16
+//////////////////////////////////////////////////////////////////////////
+
+    /*! used in RTF documentation as a heading for the Table
+     *  of Contents.
+     */
+    virtual QCString trRTFTableOfContents()
+    {
+      return "Innholdsfortegnelse";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.17
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as the header of the list of item that have been 
+     *  flagged deprecated 
+     */
+    virtual QCString trDeprecatedList()
+    {
+      return "Liste over foreldede enheter";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.18
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a header for declaration section of the events found in 
+     * a C# program
+     */
+    virtual QCString trEvents()
+    {
+      return "Hendelser";
+    }
+    /*! Header used for the documentation section of a class' events. */
+    virtual QCString trEventDocumentation()
+    {
+      return "Hendelsesdokumentasjon";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a heading for a list of Java class types with package scope.
+     */
+    virtual QCString trPackageTypes()
+    { 
+      return "Pakketyper";
+    }
+    /*! Used as a heading for a list of Java class functions with package 
+     * scope. 
+     */
+    virtual QCString trPackageMembers()
+    { 
+      return "Pakkefunksjoner";
+    }
+    /*! Used as a heading for a list of static Java class functions with 
+     *  package scope.
+     */
+    virtual QCString trStaticPackageMembers()
+    { 
+      return "Statiske Pakkefunksjoner";
+    }
+    /*! Used as a heading for a list of Java class variables with package 
+     * scope.
+     */
+    virtual QCString trPackageAttribs()
+    { 
+      return "Pakkeattributter";
+    }
+    /*! Used as a heading for a list of static Java class variables with 
+     * package scope.
+     */
+    virtual QCString trStaticPackageAttribs()
+    { 
+      return "Statiske Pakkeattributter";
+    }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.1
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used in the quick index of a class/file/namespace member list page 
+     *  to link to the unfiltered list of all members.
+     */
+    virtual QCString trAll()
+    {
+      return "Alle";
+    }
+    /*! Put in front of the call graph for a function. */
+    virtual QCString trCallGraph()
+    {
+      return "Her er kall-grafen for denne funksjonen:";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! When the search engine is enabled this text is put in the header 
+     *  of each page before the field where one can enter the text to search 
+     *  for. 
+     */
+    virtual QCString trSearchForIndex()
+    {
+      return "Sřk etter";
+    }
+    /*! This string is used as the title for the page listing the search
+     *  results.
+     */
+    virtual QCString trSearchResultsTitle()
+    {
+      return "Sřkeresultater";
+    }
+    /*! This string is put just before listing the search results. The
+     *  text can be different depending on the number of documents found.
+     *  Inside the text you can put the special marker $num to insert
+     *  the number representing the actual number of search results.
+     *  The @a numDocuments parameter can be either 0, 1 or 2, where the 
+     *  value 2 represents 2 or more matches. HTML markup is allowed inside
+     *  the returned string.
+     */
+    virtual QCString trSearchResults(int numDocuments)
+    {
+      if (numDocuments==0)
+      {
+        return "Beklager, men ingen dokumenter ble funnet.";
+      }
+      else if (numDocuments==1)
+      {
+        return "Fant <b>ett</b> dokument som passet ditt sřk.";
+      }
+      else 
+      {
+        return "Fant <b>$num</b> dokumenter som passet ditt sřk. "
+               "Viser beste treff fřrst.";
+      }
+    }
+    /*! This string is put before the list of matched words, for each search 
+     *  result. What follows is the list of words that matched the query.
+     */
+    virtual QCString trSearchMatches()
+    {
+      return "Treff:";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in HTML as the title of page with source code for file filename
+         */
+    virtual QCString trSourceFile(QCString& filename)
+    {
+       	return "Kildefil " + filename;
+    }
+};
+
+#endif
diff --git a/src/util.cpp b/src/util.cpp
index c1cd269..193dded 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -662,7 +662,7 @@ ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,QCString *pTemplSpe
   }
 
   // remember computed value for next time
-  if (Doxygen::lookupCacheEnabled && result && result->getDefFileName()!="<code>") 
+  if (result && result->getDefFileName()!="<code>") 
     // this check is needed to prevent that temporary classes that are 
     // introduced while parsing code fragments are being cached here.
   {
@@ -1045,7 +1045,7 @@ ClassDef *getResolvedClassRec(Definition *scope,
   QCString key=scope->name()+"+"+name+"+"+explicitScopePart;
   LookupInfo *pval=Doxygen::lookupCache.find(key);
   //printf("Searching for %s result=%p\n",key.data(),pval);
-  if (Doxygen::lookupCacheEnabled && pval)
+  if (pval)
   {
     if (pTemplSpec) *pTemplSpec=pval->templSpec;
     if (pTypeDef)   *pTypeDef=pval->typeDef;
@@ -1143,14 +1143,7 @@ ClassDef *getResolvedClassRec(Definition *scope,
   }
   else
   {
-    if (Doxygen::lookupCacheEnabled)
-    {
-      Doxygen::lookupCache.insert(key,new LookupInfo(bestMatch,bestTypedef,bestTemplSpec));
-    }
-    else // remove the 0 key from the cache
-    {
-      Doxygen::lookupCache.remove(key);
-    }
+    Doxygen::lookupCache.insert(key,new LookupInfo(bestMatch,bestTypedef,bestTemplSpec));
   }
   //printf("] bestMatch=%s distance=%d\n",
   //    bestMatch?bestMatch->name().data():"<none>",minDistance);
-- 
cgit v0.12

