From 20e951b95073ef5c1b76e9336c6281928e5c5a4d Mon Sep 17 00:00:00 2001 From: dimitri Date: Tue, 16 Feb 2010 21:11:17 +0000 Subject: Release-1.6.2-20100216 --- INSTALL | 4 +- README | 4 +- addon/doxywizard/config.h | 18 ++ addon/doxywizard/config.l | 555 ++++++++++++++++++++++++++++++++++++++++++++++ configure | 2 +- doc/language.doc | 2 +- doc/translator.py | 43 +++- doc/translator_report.txt | 72 +++++- src/config.xml | 2 +- src/configoptions.cpp | 2 +- src/define.cpp | 8 +- src/definition.cpp | 2 + src/diagram.cpp | 2 +- src/doxygen.cpp | 13 +- src/doxygen.css | 53 +++-- src/doxygen_css.h | 53 +++-- src/filedef.cpp | 21 ++ src/filedef.h | 3 + src/latexgen.cpp | 2 + src/mangen.cpp | 3 +- src/memberdef.cpp | 2 +- src/memberlist.cpp | 2 + src/pre.l | 109 +++++++-- src/scanner.l | 10 +- src/util.cpp | 2 +- 25 files changed, 898 insertions(+), 91 deletions(-) create mode 100644 addon/doxywizard/config.h create mode 100644 addon/doxywizard/config.l diff --git a/INSTALL b/INSTALL index 1170423..438146d 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ -DOXYGEN Version 1.6.2-20100208 +DOXYGEN Version 1.6.2-20100216 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (08 February 2010) +Dimitri van Heesch (16 February 2010) diff --git a/README b/README index 758e5e7..9cdab5a 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -DOXYGEN Version 1.6.2_20100208 +DOXYGEN Version 1.6.2_20100216 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) (08 February 2010) +Dimitri van Heesch (dimitri@stack.nl) (16 February 2010) diff --git a/addon/doxywizard/config.h b/addon/doxywizard/config.h new file mode 100644 index 0000000..d40f1f4 --- /dev/null +++ b/addon/doxywizard/config.h @@ -0,0 +1,18 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include +#include + +class Input; +class QTextStream; +class QTextCodec; + +bool parseConfig( + const QString &fileName, + const QHash &options + ); + +void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s); + +#endif diff --git a/addon/doxywizard/config.l b/addon/doxywizard/config.l new file mode 100644 index 0000000..2b94ea8 --- /dev/null +++ b/addon/doxywizard/config.l @@ -0,0 +1,555 @@ +/****************************************************************************** + * + * $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $ + * + * Copyright (C) 1997-2007 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 + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + */ + +%{ + +/* + * includes + */ +#include "config.h" +#include "input.h" +#include + +#define MAX_INCLUDE_DEPTH 10 + + +/* ----------------------------------------------------------------- + * + * static variables + */ + +struct ConfigFileState +{ + int lineNr; + FILE *file; + YY_BUFFER_STATE oldState; + YY_BUFFER_STATE newState; + QString fileName; +}; + +static const QHash *g_options; +static FILE *g_file; +static QString g_yyFileName; +static QString g_includeName; +static QVariant g_includePathList; +static QStack g_includeStack; +static int g_includeDepth; +static QVariant *g_arg; +static Input *g_curOption=0; +static QString g_elemStr; +static QTextCodec *g_codec = QTextCodec::codecForName("UTF-8"); +static QString g_codecName = QString::fromAscii("UTF-8"); +static int g_lastState; +static QByteArray g_tmpString; + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int maxSize) +{ + // no file included + if (g_includeStack.isEmpty()) + { + return fread(buf,1,maxSize,g_file); + } + else + { + return fread(buf,1,maxSize,g_includeStack.top()->file); + } +} + +void config_err(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} +void config_warn(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} + +static void substEnvVarsInStrList(QStringList &sl); +static void substEnvVarsInString(QString &s); + +static void checkEncoding() +{ + Input *option = g_options->value(QString::fromAscii("DOXYFILE_ENCODING")); + if (option && option->value().toString()!=g_codecName) + { + QTextCodec *newCodec = QTextCodec::codecForName(option->value().toString().toAscii()); + if (newCodec) + { + g_codec = newCodec; + g_codecName = option->value().toString(); + } + } +} + +static FILE *tryPath(const QString &path,const QString &fileName) +{ + QString absName=!path.isEmpty() ? path+QString::fromAscii("/")+fileName : fileName; + QFileInfo fi(absName); + if (fi.exists() && fi.isFile()) + { + FILE *f = fopen(absName.toLocal8Bit(),"r"); + if (f==NULL) + config_err("Error: could not open file %s for reading\n",absName.toLatin1().data()); + else + return f; + } + return NULL; +} + +static FILE *findFile(const QString &fileName) +{ + if (QFileInfo(fileName).isAbsolute()) // absolute path + { + return tryPath(QString(), fileName); + } + + // relative path, try with include paths in the list + QStringList sl = g_includePathList.toStringList(); + substEnvVarsInStrList(sl); + foreach (QString s, sl) + { + FILE *f = tryPath(s,fileName); + if (f) return f; + } + // try cwd if g_includePathList fails + return tryPath(QString::fromAscii("."),fileName); +} + +static void readIncludeFile(const QString &incName) +{ + if (g_includeDepth==MAX_INCLUDE_DEPTH) + { + config_err("Error: maximum include depth (%d) reached, %s is not included. Aborting...\n", + MAX_INCLUDE_DEPTH,qPrintable(incName)); + exit(1); + } + + QString inc = incName; + substEnvVarsInString(inc); + inc = inc.trimmed(); + uint incLen = inc.length(); + if (inc.at(0)==QChar::fromAscii('"') && + inc.at(incLen-1)==QChar::fromAscii('"')) // strip quotes + { + inc=inc.mid(1,incLen-2); + } + + FILE *f = findFile(inc); + if (f) // see if the include file can be found + { + // For debugging +#if SHOW_INCLUDES + for (i=0;ioldState=YY_CURRENT_BUFFER; + fs->fileName=g_yyFileName; + fs->file=f; + // push the state on the stack + g_includeStack.push(fs); + // set the scanner to the include file + yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE)); + fs->newState=YY_CURRENT_BUFFER; + g_yyFileName=inc; + g_includeDepth++; + } + else + { + config_err("Error: @INCLUDE = %s: not found!\n",inc.toLatin1().data()); + exit(1); + } +} + + +%} + +%option nounput +%option noyywrap +%option yylineno + +%x Start +%x SkipComment +%x SkipInvalid +%x GetString +%x GetStrList +%x GetQuotedString +%x GetEnvVar +%x Include + +%% + +<*>\0x0d +"#" { BEGIN(SkipComment); } +[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" { QString cmd = g_codec->toUnicode(yytext); + cmd=cmd.left(cmd.length()-1).trimmed(); + g_curOption = g_options->value(cmd); + if (g_curOption==0) // oops not known + { + config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n", + qPrintable(cmd),yylineno,qPrintable(g_yyFileName)); + BEGIN(SkipInvalid); + } + else // known tag + { + //option->setEncoding(encoding); + g_arg = &g_curOption->value(); + switch(g_curOption->kind()) + { + case Input::StrList: + g_elemStr = QString(); + *g_arg = QStringList(); + BEGIN(GetStrList); + break; + case Input::String: + BEGIN(GetString); + break; + case Input::Int: + BEGIN(GetString); + break; + case Input::Bool: + BEGIN(GetString); + break; + case Input::Obsolete: + config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n" + "To avoid this warning please update your configuration " + "file using \"doxygen -u\"\n", qPrintable(cmd), + yylineno,qPrintable(g_yyFileName)); + BEGIN(SkipInvalid); + break; + } + } + } +[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+=" { QString cmd=g_codec->toUnicode(yytext); + cmd=cmd.left(cmd.length()-2).trimmed(); + g_curOption = g_options->value(cmd); + if (g_curOption==0) // oops not known + { + config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n", + yytext,yylineno,qPrintable(g_yyFileName)); + BEGIN(SkipInvalid); + } + else // known tag + { + switch(g_curOption->kind()) + { + case Input::StrList: + g_arg = &g_curOption->value(); + g_elemStr=QString(); + BEGIN(GetStrList); + break; + case Input::String: + case Input::Int: + case Input::Bool: + config_err("Warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n", + yytext,yylineno,qPrintable(g_yyFileName)); + BEGIN(SkipInvalid); + break; + case Input::Obsolete: + config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n" + "To avoid this warning please update your configuration " + "file using \"doxygen -u\"\n", + qPrintable(cmd),yylineno,qPrintable(g_yyFileName)); + BEGIN(SkipInvalid); + break; + } + } + } +"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); g_arg=&g_includePathList; *g_arg = QStringList(); g_elemStr=QString(); } + /* include a config file */ +"@INCLUDE"[ \t]*"=" { BEGIN(Include);} +([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") { + readIncludeFile(g_codec->toUnicode(yytext)); + BEGIN(Start); + } +<> { + //printf("End of include file\n"); + //printf("Include stack depth=%d\n",g_includeStack.count()); + if (g_includeStack.isEmpty()) + { + //printf("Terminating scanner!\n"); + yyterminate(); + } + else + { + ConfigFileState *fs = g_includeStack.pop(); + fclose(fs->file); + YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER; + yy_switch_to_buffer( fs->oldState ); + yy_delete_buffer( oldBuf ); + g_yyFileName=fs->fileName; + delete fs; + g_includeDepth--; + } + } + +[a-z_A-Z0-9]+ { config_err("Warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yylineno,qPrintable(g_yyFileName)); } +\n { BEGIN(Start); } +\n { + if (!g_elemStr.isEmpty()) + { + //printf("elemStr1=`%s'\n",elemStr.toLatin1().data()); + *g_arg = QVariant(g_arg->toStringList() << g_elemStr); + } + BEGIN(Start); + } +[ \t]+ { + if (!g_elemStr.isEmpty()) + { + //printf("elemStr2=`%s'\n",elemStr.toLatin1().data()); + *g_arg = QVariant(g_arg->toStringList() << g_elemStr); + } + g_elemStr = QString(); + } +[^ \"\t\r\n]+ { + *g_arg = QVariant(g_codec->toUnicode(yytext)); + checkEncoding(); + } +"\"" { g_lastState=YY_START; + BEGIN(GetQuotedString); + g_tmpString=""; + } +"\""|"\n" { + // we add a bogus space to signal that the string was quoted. This space will be stripped later on. + g_tmpString+=" "; + //printf("Quoted String = `%s'\n",tmpString.toLatin1().data()); + if (g_lastState==GetString) + { + *g_arg = g_codec->toUnicode(g_tmpString); + checkEncoding(); + } + else + { + g_elemStr+=g_codec->toUnicode(g_tmpString); + } + if (*yytext=='\n') + { + config_err("Warning: Missing end quote (\") on line %d, file %s\n",yylineno, + qPrintable(g_yyFileName)); + } + BEGIN(g_lastState); + } +"\\\"" { + g_tmpString+='"'; + } +. { g_tmpString+=*yytext; } +[^ \#\"\t\r\n]+ { + g_elemStr+=g_codec->toUnicode(yytext); + } +\n { BEGIN(Start); } +\\[ \r\t]*\n { BEGIN(Start); } +<*>\\[ \r\t]*\n { } +<*>\n +<*>. + +%% + +/*@ ---------------------------------------------------------------------------- + */ + +static void substEnvVarsInString(QString &s) +{ + static QRegExp re(QString::fromAscii("\\$\\([a-z_A-Z0-9]+\\)")); + if (s.isEmpty()) return; + int p=0; + int i,l; + //printf("substEnvVarInString(%s) start\n",s.toLatin1().data()); + while ((i=re.indexIn(s,p))!=-1) + { + l = re.matchedLength(); + //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).toLatin1().data()); + QString env=g_codec->toUnicode(getenv(s.mid(i+2,l-3).toLatin1())); + substEnvVarsInString(env); // recursively expand variables if needed. + s = s.left(i)+env+s.right(s.length()-i-l); + p=i+env.length(); // next time start at the end of the expanded string + } + s=s.trimmed(); // to strip the bogus space that was added when an argument + // has quotes + //printf("substEnvVarInString(%s) end\n",s.toLatin1().data()); +} + +static void substEnvVarsInStrList(QStringList &sl) +{ + QStringList out; + + foreach (QString result, sl) + { + // an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE. + bool wasQuoted = (result.indexOf(QChar::fromAscii(' '))!=-1) || + (result.indexOf(QChar::fromAscii('\t'))!=-1); + // here we strip the quote again + substEnvVarsInString(result); + + //printf("Result %s was quoted=%d\n",result.toLatin1().data(),wasQuoted); + + if (!wasQuoted) /* as a result of the expansion, a single string + may have expanded into a list, which we'll + add to sl. If the orginal string already + contained multiple elements no further + splitting is done to allow quoted items with spaces! */ + { + int l=result.length(); + int i,p=0; + // skip spaces + // search for a "word" + for (i=0;i &options + ) +{ + QHashIterator i(options); + g_file = fopen(fileName.toLocal8Bit(),"r"); + if (g_file==NULL) return false; + + // reset all values + i.toFront(); + while (i.hasNext()) + { + i.next(); + if (i.value()) + { + i.value()->reset(); + } + } + + // parse config file + g_options = &options; + g_yyFileName = fileName; + g_includeStack.clear(); + g_includeDepth = 0; + configrestart( configin ); + BEGIN( Start ); + configlex(); + + // update the values in the UI + i.toFront(); + while (i.hasNext()) + { + i.next(); + if (i.value()) + { + //printf("Updating: %s\n",qPrintable(i.key())); + i.value()->update(); + } + else + { + printf("Invalid option: %s\n",qPrintable(i.key())); + } + } + fclose(g_file); + return true; +} + +void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s) +{ + QChar c; + bool needsEscaping=FALSE; + // convert the string back to it original encoding + //QByteArray se = codec->fromUnicode(s); + t.setCodec(codec); + const QChar *p=s.data(); + if (!s.isEmpty() && !p->isNull()) + { + while (!(c=*p++).isNull() && !needsEscaping) + { + needsEscaping = (c==QChar::fromAscii(' ') || + c==QChar::fromAscii('\n') || + c==QChar::fromAscii('\t') || + c==QChar::fromAscii('"')); + } + if (needsEscaping) + { + t << "\""; + p=s.data(); + while (!p->isNull()) + { + if (*p ==QChar::fromAscii(' ') && + *(p+1)==QChar::fromAscii('\0')) break; // skip inserted space at the end + if (*p ==QChar::fromAscii('"')) t << "\\"; // escape quotes + t << *p++; + } + t << "\""; + } + else + { + t << s; + } + } +} + diff --git a/configure b/configure index e4807ff..809c4cf 100755 --- a/configure +++ b/configure @@ -20,7 +20,7 @@ doxygen_version_minor=6 doxygen_version_revision=2 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package. -doxygen_version_mmn=20100208 +doxygen_version_mmn=20100216 bin_dirs=`echo $PATH | sed -e "s/:/ /g"` diff --git a/doc/language.doc b/doc/language.doc index 484f9ee..43f1eaa 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.6.1), 38 languages +Currently (version 1.6.2), 38 languages are supported (sorted alphabetically): Afrikaans, Arabic, Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto, diff --git a/doc/translator.py b/doc/translator.py index 95ee485..409b9ec 100644 --- a/doc/translator.py +++ b/doc/translator.py @@ -173,7 +173,7 @@ class Transl: self.missingMethods = None # list of prototypes to be implemented self.implementedMethods = None # list of implemented required methods self.adaptMinClass = None # The newest adapter class that can be used - + self.isDecodedTranslator = None # Flag related to internal usage of UTF-8 def __tokenGenerator(self): """Generator that reads the file and yields tokens as 4-tuples. @@ -1094,6 +1094,13 @@ class Transl: else: self.missingMethods.append(p) + # Set the least important note first if the translator is decoded. + # If yes, then it means that the implementation should be switched + # to UTF-8 later (suggestion). + self.isDecodedTranslator = self.classId in self.manager.decodedTranslators + if self.isDecodedTranslator: + self.note = 'Reimplementation using UTF-8 suggested.' + # Check whether adapter must be used or suggest the newest one. # Change the status and set the note accordingly. if self.baseClassId != 'Translator': @@ -1277,10 +1284,44 @@ class TrManager: self.numLang = None # excluding coupled En-based self.doxVersion = None # Doxygen version + # Capture the knowledge about translators that are not implemented + # to use UTF-8 internally. + self.decodedTranslators = self.getDecodedTranslators() + # Build objects where each one is responsible for one translator. self.__build() + def getDecodedTranslators(self): + """Parses language.cpp to find what translators do not use UTF-8 yet""" + decodedTranslators = [] + + # Regular expression to detect the lines like + # theTranslator=new TranslatorDecoder(new TranslatorSwedish); + rex = re.compile(r'^\s*theTranslator\s*=\s*new\s+.*$') + + # Regular expression to get the (optional) TranslatorDecoder and TranslatorXXX + rex2 = re.compile(r'\bTranslator\w+') + + # Parse the lines in the specific source code. + f = open(os.path.join(self.src_path, 'language.cpp'), 'rU') + for line in f: + if rex.match(line): + lst = rex2.findall(line) + if lst[0] == 'TranslatorDecoder': + decodedTranslators.append(lst[1]) + f.close() + + # Display warning when all translator implementations were converted + # to UTF-8. + if len(decodedTranslators) == 0: + print 'This script should be updated. All translators do use UTF-8' + print 'internally. The TranslatorDecoder adapter should be removed' + print 'from the code and its usage should not be checked any more.' + + return decodedTranslators + + def __build(self): """Find the translator files and build the objects for translators.""" diff --git a/doc/translator_report.txt b/doc/translator_report.txt index 40ad6d0..08458e4 100644 --- a/doc/translator_report.txt +++ b/doc/translator_report.txt @@ -1,4 +1,4 @@ -(1.6.1) +(1.6.2) Doxygen supports the following 38 languages (sorted alphabetically): @@ -19,13 +19,13 @@ alphabetically). This means that they derive from the Translator class and they implement all 221 of the required methods. Anyway, there still may be some details listed even for them: - TranslatorBrazilian + TranslatorBrazilian -- Reimplementation using UTF-8 suggested. TranslatorCzech TranslatorDutch TranslatorEnglish - TranslatorFrench -- The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs() - TranslatorKorean - TranslatorPolish -- Remove the obsolete methods (never used). + TranslatorFrench -- Reimplementation using UTF-8 suggested. + TranslatorKorean -- Reimplementation using UTF-8 suggested. + TranslatorPolish -- Reimplementation using UTF-8 suggested. ---------------------------------------------------------------------- The following translator classes need some maintenance (the most @@ -36,34 +36,80 @@ must be implemented to become up-to-date: TranslatorVietnamese 1.6.0 5 methods to implement (2 %) TranslatorTurkish 1.6.0 5 methods to implement (2 %) TranslatorSwedish 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorSpanish 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorSerbian 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorSerbianCyrilic 1.6.0 5 methods to implement (2 %) TranslatorRussian 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorRomanian 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorPersian 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorMacedonian 1.6.0 5 methods to implement (2 %) TranslatorJapanese 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorItalian 1.6.0 5 methods to implement (2 %) TranslatorGerman 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorFinnish 1.6.0 5 methods to implement (2 %) TranslatorEsperanto 1.6.0 5 methods to implement (2 %) TranslatorCroatian 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorChinese 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorChinesetraditional 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorCatalan 1.6.0 5 methods to implement (2 %) TranslatorAfrikaans 1.6.0 5 methods to implement (2 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorGreek 1.5.4 27 methods to implement (12 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorDanish 1.5.4 27 methods to implement (12 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorSlovene 1.4.6 29 methods to implement (13 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorNorwegian 1.4.6 28 methods to implement (12 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorLithuanian 1.4.6 29 methods to implement (13 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorIndonesian 1.4.6 28 methods to implement (12 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorHungarian 1.4.6 29 methods to implement (13 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorArabic 1.4.6 28 methods to implement (12 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorUkrainian 1.4.1 29 methods to implement (13 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorPortuguese 1.3.3 40 methods to implement (18 %) + Note: Reimplementation using UTF-8 suggested. + TranslatorSlovak 1.2.18 49 methods to implement (22 %) + Note: Reimplementation using UTF-8 suggested. + ---------------------------------------------------------------------- The following translator classes derive directly from the @@ -71,8 +117,8 @@ TranslatorEnglish. The class identifier has the suffix 'En' that says that this is intentional. Usually, there is also a non-English based version of the translator for the language: - TranslatorJapaneseEn implements 5 methods - TranslatorKoreanEn implements 5 methods + TranslatorJapaneseEn implements 5 methods -- Reimplementation using UTF-8 suggested. + TranslatorKoreanEn implements 5 methods -- Reimplementation using UTF-8 suggested. ====================================================================== WARNING: The following translator methods are declared in the @@ -154,6 +200,12 @@ TranslatorArabic (TranslatorAdapter_1_4_6) 28 methods to implement (12 %) virtual QCString trNoDescriptionAvailable() +TranslatorBrazilian (Translator) +------------------- + + Implements 221 of the required methods (100 %). + + TranslatorCatalan (TranslatorAdapter_1_6_0) 5 methods to implement (2 %) ----------------- @@ -483,6 +535,12 @@ TranslatorJapaneseEn (TranslatorEnglish) 216 methods to implement (97 %) virtual QCString latexLanguageSupportCommand() +TranslatorKorean (Translator) +---------------- + + Implements 221 of the required methods (100 %). + + TranslatorKoreanEn (TranslatorEnglish) 216 methods to implement (97 %) ------------------ diff --git a/src/config.xml b/src/config.xml index 62b3438..0c00f5e 100644 --- a/src/config.xml +++ b/src/config.xml @@ -773,7 +773,7 @@ stylesheet in the HTML output directory as well, or it will be erased! If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML page will contain the date and time when the page was generated. Setting this to NO can help when comparing the output of multiple runs. -' defval='0' depends='GENERATE_HTML'/> +' defval='1' depends='GENERATE_HTML'/>