Index: src/bytebuf.cpp
===================================================================
--- src/bytebuf.cpp	(revision 3620)
+++ src/bytebuf.cpp	(working copy)
@@ -291,8 +291,8 @@
     ASSERT (BufferSize >= length+offset);
     Current = Buffer;
     ReadPos = 0;
-    register byte * from, * to;
-    register uint i = length;
+    byte * from, * to;
+    uint i = length;
     from = source; to = Buffer+offset;
     while (i) {
         *to++ = *from++;
Index: src/cql/gamesortinfo.cpp
===================================================================
--- src/cql/gamesortinfo.cpp	(revision 3620)
+++ src/cql/gamesortinfo.cpp	(working copy)
@@ -16,7 +16,7 @@
 }
 
 void GameSortInfo::output(FILE* os, const vector<GameSortInfo>& v){
-  for (const auto gs : v)
+  for (const auto &gs : v)
     gs.output(os);
 }
 
Index: src/cql/origChanges.cpp
===================================================================
--- src/cql/origChanges.cpp	(revision 3620)
+++ src/cql/origChanges.cpp	(working copy)
@@ -22,7 +22,7 @@
 errorT
 Game::WritePGN_CQL (TextBuffer * tb, uint stopLocation)
 {
-    char temp [255];
+    char temp [512];
     char dateStr [20];
     const char * newline = "\n";
     tb->NewlinesToSpaces (false);
Index: src/crosstab.cpp
===================================================================
--- src/crosstab.cpp	(revision 3620)
+++ src/crosstab.cpp	(working copy)
@@ -617,7 +617,7 @@
 				 "-", ResultCount[RESULT_Black],
 				 "=", ResultCount[RESULT_Draw]);
 	  } else {
-		sprintf (stemp, "%u games: %s%u %s%u %s%u",
+		sprintf (stemp, "%u Partien: %s%u %s%u %s%u",
 				 GameCount,
 				 "+", ResultCount[RESULT_White],
 				 "-", ResultCount[RESULT_Black],
Index: src/game.cpp
===================================================================
--- src/game.cpp	(revision 3620)
+++ src/game.cpp	(working copy)
@@ -1446,8 +1446,8 @@
 calcHomePawnMask (pieceT pawn, pieceT * board)
 {
     ASSERT (pawn == WP  ||  pawn == BP);
-    register pieceT * bd = &(board[ (pawn == WP ? H2 : H7) ]);
-    register int result = 0;
+    pieceT * bd = &(board[ (pawn == WP ? H2 : H7) ]);
+    int result = 0;
     if (*bd == pawn) { result |= 128; }  bd--;   // H-fyle pawn
     if (*bd == pawn) { result |=  64; }  bd--;   // G-fyle pawn
     if (*bd == pawn) { result |=  32; }  bd--;   // F-fyle pawn
@@ -1465,7 +1465,7 @@
 inline uint
 updateHomePawnMask (uint oldMask, fyleT f)
 {
-    register uint newMask = oldMask;
+    uint newMask = oldMask;
     newMask &= ~((uint) 1 << f);
     return newMask;
 }
@@ -2275,7 +2275,6 @@
     char *drawColor = NULL;
     bool inCode = false;
     char *startLocation = NULL;
-    char *endLocation = NULL;
     char **tabmark;
     char **tabarg;
     char **arg;
@@ -2299,7 +2298,6 @@
             // See a code-ending ']', so end the code.
             inCode = false;
             startLocation += 2;
-            endLocation = in;
             *in = 0;
             tabmark = strExplode(startLocation, ' ');
 
@@ -2423,8 +2421,8 @@
     // const char *diagramStr = "\\begin{center}\n\\vspace{1ex}\n\\chessboard\n\\vspace{1ex}\n\\end{center}\n";
     const char *diagramStrStart = "\\begin{center}\n\\vspace{1ex}\n\\chessboard[showmover=true";
     const char *diagramStrStop = "]\\vspace{1ex}\n\\end{center}\n";
-    char temp[1000];
-    char fenStr[1000];
+    char temp[FEN_MAX_LEN + 30];
+    char fenStr[FEN_MAX_LEN];
 
     // chessboard is only available from mainline :-(
     //
@@ -2523,12 +2521,8 @@
     const char *postCommentStr = "";
     const char *preVariationBlockStr = "\n\\begin{longfbox}[margin-left=2em, breakable=true, border-right-style=none, border-top-style=none,]\n";
     const char *postVariationBlockStr = "\\end{longfbox}\n";
-    // const char *preVariationStr = "\\textcolor{VariationColor}{ ( \\variation{";
-    // const char *postVariationStr = "} }\n";
     const char *restartVariationStr = "\\textcolor{VariationColor}{ \\variation{";
     const char *stopVariationStr = "} }\n\n";
-    // const char *preSubVariationStr = "\\textcolor{VariationColor}{ ( \\variation[invar]{";
-    // const char *postSubVariationStr = "} }\n";
     const char *restartSubVariationStr = "\\textcolor{VariationColor}{ \\variation[invar]{";
     const char *stopSubVariationStr = "} }\n\n";
 
@@ -2870,7 +2864,7 @@
     date_DecodeToString(Date, dateStr);
     tb->PrintString("\\twocolumn[\n\\begin{@twocolumnfalse}\n");
     tb->PrintLine("{\n\\center\n\\begin{tabularx}{0.9\\textwidth}{rllXr}\n");
-    tb->PrintString("White:");
+    tb->PrintString("Weiß:");
     tb->PauseTranslations();
     tb->PrintString(" & ");
     tb->ResumeTranslations();
@@ -2894,7 +2888,7 @@
         tb->PrintString(")");
     }
     tb->PrintString("\\\\\n");
-    tb->PrintString("Black:");
+    tb->PrintString("Schwarz:");
     tb->PauseTranslations();
     tb->PrintString(" & ");
     tb->ResumeTranslations();
@@ -2917,7 +2911,7 @@
     tb->PrintString("\\\\\n");
     if (EcoCode != 0)
     {
-        tb->PrintString("Opening ECO:");
+        tb->PrintString("Eröffnungs-ECO:");
         tb->PauseTranslations();
         tb->PrintString(" & ");
         tb->ResumeTranslations();
@@ -2945,7 +2939,7 @@
     }
     tb->PrintString(dateStr);
     tb->PrintString("\\\\\n");
-    tb->PrintString("Result:");
+    tb->PrintString("Ergebnis:");
     tb->PauseTranslations();
     tb->PrintString(" & ");
     tb->ResumeTranslations();
@@ -3805,14 +3799,11 @@
         const uint arrcnt = (!NumHalfMoves)? 1 : NumHalfMoves;
 #ifdef _MSC_VER /* no support for C99 VLAs */
         double * scores = (double *) _alloca(arrcnt * sizeof(double));
-        char   * events = (char   *) _alloca(arrcnt * sizeof(char));
 #else
         double scores[arrcnt];
-        char   events[arrcnt];
 #endif
         for (uint i = 0; i < arrcnt; i++) {
                 scores[i] = 0;
-                events[i] = ' ';
         }
 
         double maxScore = 0;
@@ -3863,9 +3854,6 @@
                     // maxScore = (scores[x] > maxScore) ? scores[x] : maxScore;
                     // minScore = (scores[x] < minScore) ? scores[x] : minScore;
                 }
-                if (strstr(m->comment, "BLUNDER") != NULL) {
-                        events[x] = 'B';
-                }
             }
             MoveForward();
             m = CurrentMove;
@@ -3931,28 +3919,20 @@
         }
         */
 
-        int maxY = 5;
-        int minY = -5;
-        // int minX = 1;
-
         double yscale=0.014;
 
         if (maxScore > 10) {
-           maxY = 15;
            yscale+=0.008;
         } else {
            if (maxScore > 3) {
-              maxY = 10;
               yscale+=0.004;
            }
         }
 
         if (minScore < -10) {
-           minY = -15;
            yscale+=0.008;
         } else {
            if (minScore < -3) {
-              minY = -10;
               yscale+=0.004;
            }
         }
@@ -3966,7 +3946,7 @@
 
         if (scoresFound) {
                 tb->PrintString("\\begin{minipage}{\\textwidth/2}\n");
-                tb->PrintString("Analysis Scoregraph:\n");
+                tb->PrintString("Analysebewertungsgrafik:\n");
                 tb->PrintString("\\begin{center}\n");
                 tb->PrintString("\\begin{tikzpicture}\n");
                 tb->PrintString("\\begin{axis}[\n");
Index: src/gfile.cpp
===================================================================
--- src/gfile.cpp	(revision 3620)
+++ src/gfile.cpp	(working copy)
@@ -30,7 +30,7 @@
 clearBlockData (gfBlockT * blk)
 {
     blk->length = 0;
-    register byte * b = blk->data;
+    byte * b = blk->data;
     memset( b, 0, GF_BLOCKSIZE );
 //     for (register uint i = GF_BLOCKSIZE; i > 0; i--, b++) { *b = 0; } 
 }
Index: src/matsig.cpp
===================================================================
--- src/matsig.cpp	(revision 3620)
+++ src/matsig.cpp	(working copy)
@@ -91,7 +91,7 @@
 matSigT
 matsig_Make (byte * materialCounts)
 {
-    register matSigT m = 0;
+    matSigT m = 0;
     m |= ::min(3, static_cast<uint>(materialCounts[WQ])) << SHIFT_WQ;
     m |= ::min(3, static_cast<uint>(materialCounts[WR])) << SHIFT_WR;
     m |= ::min(3, static_cast<uint>(materialCounts[WB])) << SHIFT_WB;
Index: src/namebase.h
===================================================================
--- src/namebase.h	(revision 3620)
+++ src/namebase.h	(working copy)
@@ -33,10 +33,10 @@
 const uint NUM_NAME_TYPES = 4;
 
 const char NAME_TYPE_STRING [NUM_NAME_TYPES][8] = {
-    "player",
-    "event",
-    "site",
-    "round"
+    "Spieler",
+    "Turnier",
+    "Ort",
+    "Runde"
 };
 
 
Index: src/optable.cpp
===================================================================
--- src/optable.cpp	(revision 3620)
+++ src/optable.cpp	(working copy)
@@ -1186,7 +1186,7 @@
     MakeRows();
     NumNotes = 0;
     const uint cellBytes = 9;
-    char cell [16];
+    char cell [17];
     const char * hrule = "-------------------------------------------------------------------------------\n";
     DString * dtemp = new DString;
 
Index: src/pgnparse.cpp
===================================================================
--- src/pgnparse.cpp	(revision 3620)
+++ src/pgnparse.cpp	(working copy)
@@ -376,7 +376,7 @@
             value[length-7] = 0;
             elo = strGetUnsigned (&(value[length-5]));
             if (elo > MAX_ELO) {
-                LogError ("Warning: rating too large: ", value);
+                LogError ("Warnung: Rating zu groß: ", value);
                 elo = MAX_ELO;
             }
             game->SetWhiteElo (elo);
@@ -398,7 +398,7 @@
             value[length-7] = 0;
             elo = strGetUnsigned (&(value[length-5]));
             if (elo > MAX_ELO) {
-                LogError ("Warning: rating too large: ", value);
+                LogError ("Warnung: Rating zu groß: ", value);
                 elo = MAX_ELO;
             }
             game->SetBlackElo (elo);
@@ -445,9 +445,9 @@
         if (game->SetStartFen (value) != OK) {
             // Not too sure about storing game comment prior to parsing moves, but seems to be ok S.A.
             char tempStr [500];
-            snprintf (tempStr, sizeof(tempStr), "Error Invalid FEN: %s", value);
+            snprintf (tempStr, sizeof(tempStr), "Fehler, ungültige FEN: %s", value);
             game->AppendMoveComment (tempStr);
-            LogError ("Error Invalid FEN: ", value);
+            LogError ("Fehler, ungültige FEN: ", value);
             return ERROR_InvalidFEN;
         }
 
@@ -465,7 +465,7 @@
                 if (strEqual (tagSuffix, ratingTypeNames[i])) {
                     uint elo = strGetUnsigned (value);
                     if (elo > MAX_ELO) {
-                        LogError ("Warning: rating too large: ", value);
+                        LogError ("Warnung: Rating zu groß: ", value);
                         elo = MAX_ELO;
                     }
                     game->SetWhiteElo (elo);
@@ -483,7 +483,7 @@
                 if (strEqual (tagSuffix, ratingTypeNames[i])) {
                     uint elo = strGetUnsigned (value);
                     if (elo > MAX_ELO) {
-                        LogError ("Warning: rating too large: ", value);
+                        LogError ("Warnung: Rating zu groß: ", value);
                         elo = MAX_ELO;
                     }
                     game->SetBlackElo (elo);
@@ -530,8 +530,8 @@
     *outPtr = 0; // must be nul-terminated
     if (ch == EndChar) {
         char tempStr[80];
-        sprintf (tempStr, "started on line %u\n", startLine);
-        LogError ("Error: Open Comment at end of input", tempStr);
+        sprintf (tempStr, "gestartet in Zeile %u\n", startLine);
+        LogError ("Fehler: offener Kommentar am Eingabeende", tempStr);
     }
     if (CharDetector)
         CharDetector->detect(buffer, outPtr - buffer);
@@ -965,7 +965,7 @@
 static inline char *
 firstNonBlank (char * s)
 {
-    register char *x = s;
+    char *x = s;
     while (*x) {
         if (! charIsSpace(*x))  { return x; }
         x++;
@@ -1091,10 +1091,10 @@
                 // worked, but still print a warning about it:
                 if (err == OK) {
                     char tempStr[500];
-                    snprintf (tempStr, sizeof(tempStr), "(%s) in game %s - %s, %u",
+                    snprintf (tempStr, sizeof(tempStr), "(%s) in Partie %s - %s, %u",
                              buffer, game->GetWhiteStr(), game->GetBlackStr(),
                              date_GetYear (game->GetDate()));
-                    LogError ("Warning: illegal castling ", tempStr);
+                    LogError ("Warnung: ungültige Rochade ", tempStr);
                 }
             }
 
@@ -1108,9 +1108,9 @@
                 if (moveErrorCount <= maxMoveErrorsPerGame) {
                     char tempStr [500];
                     // Add an error comment to the game:
-                    snprintf (tempStr, sizeof(tempStr), "Error reading move: %s", buffer);
+                    snprintf (tempStr, sizeof(tempStr), "Fehler beim Lesen des Zuges: %s", buffer);
                     game->AppendMoveComment (tempStr);
-                    snprintf (tempStr, sizeof(tempStr), "Error reading move in game %s - %s, %u: ",
+                    snprintf (tempStr, sizeof(tempStr), "Fehler beim Lesen des Zuges in Partie %s - %s, %u: ",
                              game->GetWhiteStr(), game->GetBlackStr(),
                              date_GetYear (game->GetDate()));
                     LogError (tempStr, buffer);
@@ -1132,7 +1132,7 @@
         case TOKEN_Suffix:
             nag = game_parseNag (buffer);
             if (nag == 0) {
-                LogError ("Warning: Invalid annotation symbol: ", buffer);
+                LogError ("Warnung: ungültiges Kommentarsymbol: ", buffer);
             } else {
                 if (moveErrorCount == 0) {
                     game->AddNag (nag);
@@ -1142,7 +1142,7 @@
 
         case TOKEN_VarStart:
             if (game->AddVariation() != OK) {
-                LogError ("Error: Unable to add variation", "");
+                LogError ("Fehler: Variante kann nicht hinzugefügt werden", "");
                 return ERROR_Game;
             }
             break;
@@ -1170,7 +1170,7 @@
                 snprintf (tempStr, sizeof(tempStr), " in game %s - %s, %u: ",
                     game->GetWhiteStr(), game->GetBlackStr(),
                     date_GetYear (game->GetDate()));
-                LogError ("Warning: \"}\" seen outside a comment", tempStr);
+                LogError ("Warnung: \"}\" außerhalb eines Kommentars gefunden", tempStr);
                 commentErrorCount++;
             }
             break;
@@ -1177,12 +1177,12 @@
 
         case TOKEN_Tag:
             // This is often seen when missing TOKEN_Result
-            LogError ("PGN header '[' seen inside game (result missing ?)", "");
+            LogError ("PGN-Kopf '[' innerhalb einer Partie gefunden (fehlendes Ergebnis?)", "");
             return ERROR_Game;
 
         case TOKEN_EndOfInput:
             if (EndOfInputWarnings) {
-                LogError ("End of input reached in game (result missing ?)", "");
+                LogError ("Eingabeende in Partie erreicht (fehlendes Ergebnis?)", "");
                 return ERROR_Game;
             } else {
                 return OK;
@@ -1189,7 +1189,7 @@
             }
 
         default:
-            LogError ("Error: Unexpected symbol: ", buffer);
+            LogError ("Fehler: unerwartetes Symbol: ", buffer);
         }
 
         token = GetNextToken (buffer, bufSize);
@@ -1210,7 +1210,7 @@
         // Use the end-of-game result instead of the header tag result:
         game->SetResult (r);
         if (ResultWarnings) {
-            LogError ("Result did not match the header result", "");
+            LogError ("Ergebnis paßte nicht zum Kopfergebnis", "");
         }
     }
     return OK;
@@ -1253,7 +1253,7 @@
             errorT pgnRes = ExtractPgnTag (buffer, game);
             // Don't throw errors for null pgn tags - too verbose
             if (pgnRes != OK && pgnRes != ERROR_PGNTagNull && pgnRes != ERROR_InvalidFEN ) {
-                LogError ("Error reading tag: ", buffer);
+                LogError ("Fehler beim Lesen des Tags: ", buffer);
             }
 
         } else if (token == TOKEN_LineComment) {
@@ -1279,7 +1279,7 @@
             break;
         } else {
             // Any other token is invalid here:
-            LogError ("Warning: Invalid text in PGN game header: ", buffer);
+            LogError ("Warnung: ungültiger Text im PGN-Partiekopf: ", buffer);
         }
 
         token = GetNextToken (buffer, MAX_COMMENT_SIZE);
@@ -1300,7 +1300,7 @@
 
     if (ParseMode == PARSE_Header) {
         if (EndOfInputWarnings) {
-            LogError ("Warning: End of input in PGN header tags section", "");
+            LogError ("Warnung: Ende der Eingabe im Bereich der Kennzeichen in den PGN-Kopfdaten", "");
             err = ERROR_Game;
         } else {
             err = OK;
Index: src/polyglot/book.cpp
===================================================================
--- src/polyglot/book.cpp	(revision 3620)
+++ src/polyglot/book.cpp	(working copy)
@@ -332,7 +332,7 @@
    int move;
    int score;
    char move_string[256];
-	 char tmp[256];
+   char tmp[300]; // must be larger than move_string, see sprintf below
 	 
 	 // keep board in memory to ease book update	 
 	 memcpy(scid_board[BookNumber], board, sizeof(board_t));
@@ -375,7 +375,7 @@
 
    int move;
    char move_string[256];
-   char tmp[256];
+   char tmp[300]; // must be larger than move_string, see sprintf below
    list_t /*book_moves[1],*/ legal_moves[1];
    board_t new_board[1];
    int i;
Index: src/position.cpp
===================================================================
--- src/position.cpp	(revision 3620)
+++ src/position.cpp	(working copy)
@@ -34,7 +34,8 @@
 
 Position::Position(const Position& p)
 {
-    memcpy (this, &p, sizeof(Position));
+    // memcpy (this, &p, sizeof(Position));
+    *this = p;
 }
 
 inline void
@@ -667,7 +668,8 @@
             startPositionTemplate = new Position();
             startPositionTemplate->StdStart();
         }
-        memcpy (this, startPositionTemplate, sizeof(Position));
+        // memcpy (this, startPositionTemplate, sizeof(Position));
+		*this = *startPositionTemplate;
 	}
     return;
 }
@@ -819,7 +821,8 @@
 
 	if (LegalMoves.Size() > 0 && pieceType == EMPTY && genType == GEN_ALL_MOVES) {
 		if(mlist != NULL)
-			memcpy (mlist, &LegalMoves, sizeof(MoveList));
+		  //memcpy (mlist, &LegalMoves, sizeof(MoveList));
+		  mlist = &LegalMoves;
 		return;
 	}
 
@@ -902,7 +905,8 @@
     }
 
 	if (pieceType == EMPTY && genType == GEN_ALL_MOVES && mlist != NULL)
-		memcpy (&LegalMoves, mlist, sizeof(MoveList));
+	  // memcpy (&LegalMoves, mlist, sizeof(MoveList));
+	  LegalMoves = *mlist;
 }
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -3212,7 +3216,8 @@
 void
 Position::CopyFrom (Position * src)
 {
-  memcpy (this, src, sizeof(Position));
+  // memcpy (this, src, sizeof(Position));
+  *this = *src;
 }
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Index: src/position.h
===================================================================
--- src/position.h	(revision 3620)
+++ src/position.h	(working copy)
@@ -45,7 +45,8 @@
     FEN_COMPACT = 0,
     FEN_BOARD = 1,
     FEN_CASTLING_EP = 2,
-    FEN_ALL_FIELDS = 3;
+    FEN_ALL_FIELDS = 3,
+    FEN_MAX_LEN = 100; // https://chess.stackexchange.com/questions/30004/longest-possible-fen
 
 
 // Flags that Position::GenerateMoves() recognises:
@@ -79,7 +80,7 @@
 
     pieceT          Board[66];      // the actual board + a color square
                                     // and a NULL square.
-    uint            Count[2];       // count of pieces & pawns each
+    uint            Count[3];       // count of pieces & pawns each
     byte            Material[16];   // count of each type of piece
     byte            ListPos[64];    // ListPos stores the position in
                                         // List[][] for the piece on
Index: src/tkscid.cpp
===================================================================
--- src/tkscid.cpp	(revision 3626)
+++ src/tkscid.cpp	(working copy)
@@ -88,8 +88,8 @@
                 const char ** minorCmds)
 {
     ASSERT (majorCmd != NULL);
-    Tcl_AppendResult (ti, "Invalid command: ", majorCmd,
-                      " has the following minor commands:\n", NULL);
+    Tcl_AppendResult (ti, "Ungültiger Befehl: ", majorCmd,
+                      " hat folgende untergeordnete Befehle:\n", NULL);
     while (*minorCmds != NULL) {
         Tcl_AppendResult (ti, "   ", *minorCmds, "\n", NULL);
         minorCmds++;
@@ -549,7 +549,7 @@
 str_is_prefix (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: strIsPrefix <shortStr> <longStr>");
+        return errorResult (ti, "Aufruf: strIsPrefix <shortStr> <longStr>");
     }
 
     return setBoolResult (ti, strIsPrefix (argv[1], argv[2]));
@@ -563,7 +563,7 @@
 str_prefix_len (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: strPrefixLen <str> <str>");
+        return errorResult (ti, "Aufruf: strPrefixLen <str> <str>");
     }
 
     return setUintResult (ti, strPrefix (argv[1], argv[2]));
@@ -715,7 +715,7 @@
                 // Querying if base argv[2] is read-only
 	        baseNum = strGetInteger (argv[2]);
 		if (baseNum < 1 || baseNum > MAX_BASES) {
-		    return errorResult (ti, "Invalid database number.");
+		    return errorResult (ti, "Ungültige Datenbanknummer.");
 		}
 		basePtr = &(dbList[baseNum - 1]);
 
@@ -728,11 +728,11 @@
               basePtr = db;
 	    } else {
               if (argc != 4 || !strEqual (argv[2], "set")) {
-		return errorResult (ti, "Usage: sc_base isReadOnly [set] [basenumber]");
+		return errorResult (ti, "Aufruf: sc_base isReadOnly [set] [basenumber]");
               }
 	      baseNum = strGetInteger (argv[3]);
 	      if (baseNum < 1 || baseNum > MAX_BASES) {
-	        return errorResult (ti, "Invalid database number.");
+	        return errorResult (ti, "Ungültige Datenbanknummer.");
 	      }
 	      basePtr = &(dbList[baseNum - 1]);
             }
@@ -741,10 +741,10 @@
                 return errorResult (ti, errMsgNotOpen(ti));
             }
             if (basePtr->fileMode == FMODE_ReadOnly) {
-                return errorResult (ti, "This database is already read-only.");
+                return errorResult (ti, "Diese Datenbank kann nur gelesen werden.");
             }
             if (basePtr->idx->SetReadOnly () != OK) {
-                return errorResult (ti, "Unable to make this database read-only.");
+                return errorResult (ti, "Diese Datenbank kann nicht auf 'Nur Lesen' gesetzt werden.");
             }
             basePtr->fileMode = FMODE_ReadOnly;
             return TCL_OK;
@@ -833,7 +833,7 @@
     if (argc > 2) {
         int baseNum = strGetInteger (argv[2]);
         if (baseNum < 1 || baseNum > MAX_BASES) {
-            return errorResult (ti, "Invalid database number.");
+            return errorResult (ti, "Ungültige Datenbanknummer.");
         }
         basePtr = &(dbList[baseNum - 1]);
     }
@@ -850,7 +850,7 @@
     if (argc > 2) {
         int baseNum = strGetInteger (argv[2]);
         if (baseNum < 1 || baseNum > MAX_BASES) {
-            return errorResult (ti, "Invalid database number.");
+            return errorResult (ti, "Ungültige Datenbanknummer.");
         }
         basePtr = &(dbList[baseNum - 1]);
     }
@@ -876,7 +876,7 @@
     if (argc > 2) {
         int baseNum = strGetInteger (argv[2]);
         if (baseNum < 1 || baseNum > MAX_BASES) {
-            return errorResult (ti, "Invalid database number.");
+            return errorResult (ti, "Ungültige Datenbanknummer.");
         }
         basePtr = &(dbList[baseNum - 1]);
     }
@@ -898,7 +898,7 @@
 sc_base_slot (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_base slot <filename>");
+        return errorResult (ti, "Aufruf: sc_base slot <filename>");
     }
     fileNameT fname;
     strCopy (fname, argv[2]);
@@ -944,7 +944,7 @@
 
     bool readOnly = false;  // Open database read-only.
     bool fastOpen = false;  // Fast open (no flag counts, etc)
-    const char * usage = "Usage: sc_base open [-readonly] [-fast] <filename>";
+    const char * usage = "Aufruf: sc_base open [-readonly] [-fast] <filename>";
 
     // Check options:
     const char * options[] = { "-fast", "-readonly", NULL };
@@ -968,7 +968,7 @@
     strCopy (realFileName, filename);
     strAppend (realFileName, INDEX_SUFFIX);
     if (base_opened (realFileName) >= 0) {
-        return errorResult (ti, "The database you selected is already opened.");
+        return errorResult (ti, "Die gewählte Datenbank ist bereits geöffnet.");
     }
 
     // Find an empty database slot to use:
@@ -976,7 +976,7 @@
     if (db->inUse) {
         int newBaseNum = findEmptyBase();
         if (newBaseNum == -1) {
-            return errorResult (ti, "Too many databases are open; close one first.");
+            return errorResult (ti, "Zuviele Datenbanken sind geöffnet, bitte erst eine schließen.");
         }
         currentBase = newBaseNum;
         db = &(dbList[currentBase]);
@@ -1003,12 +1003,12 @@
     if (err != OK) {
         currentBase = oldBaseNum;
         db = &(dbList[currentBase]);
-        setResult (ti, "Error opening index file");
+        setResult (ti, "Fehler beim Öffnen der Indexdatei");
         if (err == ERROR_FileVersion) {
-            setResult (ti, "Old format Scid file, now out of date.");
+            setResult (ti, "Altes Scid-Dateiformat, jetzt überholt");
         }
         if (err == ERROR_OldScidVersion) {
-            setResult (ti, "Database version newer than Scid; please upgrade Scid.");
+            setResult (ti, "Datenbankversion ist neuer als Scid; bitte für Scid Upgrade durchführen");
         }
         return TCL_ERROR;
     }
@@ -1015,7 +1015,7 @@
 
     if (db->nb->ReadNameFile() != OK) {
         base_open_failure(oldBaseNum);
-        return errorResult (ti, "Error opening name file.");
+        return errorResult (ti, "Fehler beim Öffnen der Namendatei.");
     }
 
     err = db->gfile->Open (filename, db->fileMode);
@@ -1027,7 +1027,7 @@
 
     if (err != OK) {
         base_open_failure(oldBaseNum);
-        return errorResult (ti, "Error opening game file.");
+        return errorResult (ti, "Fehler beim Öffnen der Partiendatei.");
     }
 
     // Read entire index, showing progress every 20,000 games if applicable:
@@ -1039,7 +1039,7 @@
 
     if (db->idx->VerifyFile (db->nb) != OK) {
         db->idx->CloseIndexFile();
-        return errorResult (ti, "Error: name corruption in index file.\nRun \"scidt -N\" on this database to fix it.");
+        return errorResult (ti, "Fehler: Namensverfälschung in der Indexdatei.\nStarten Sie \"scidt -N\" für diese Datenbank, um dies zu beheben.");
     }
 
     db->numGames = db->idx->GetNumGames();
@@ -1096,17 +1096,17 @@
 
     } else {
         if (base->idx->CreateIndexFile (FMODE_Both) != OK) {
-            return errorResult (ti, "Error creating index file.");
+            return errorResult (ti, "Fehler beim Erstellen der Indexdatei.");
         }
 
         base->idx->WriteHeader();
         if (base->nb->WriteNameFile() != OK) {
-            return errorResult (ti, "Error creating name file.");
+            return errorResult (ti, "Fehler beim Erstellen der Namendatei.");
         }
         base->idx->ReadEntireFile();
 
         if (base->gfile->Create (filename, FMODE_Both) != OK) {
-            return errorResult (ti, "Error creating game file.");
+            return errorResult (ti, "Fehler beim Erstellen der Partiendatei.");
         }
     }
 
@@ -1140,7 +1140,7 @@
 {
     // argc should be 3 or 4, e.g. "sc_base create <myfile> [<boolean>]"
     if (argc != 3  &&  argc != 4) {
-        return errorResult (ti, "No file selected");
+        return errorResult (ti, "Keine Datei ausgewählt");
     }
     bool memoryOnly = false;
     if (argc == 4) {
@@ -1149,7 +1149,7 @@
 
     // Check that this base is not already opened:
     if (base_opened (argv[2]) >= 0) {
-        return errorResult (ti, "The database you selected is already opened.");
+        return errorResult (ti, "Die gewählte Datenbank ist bereits geöffnet.");
     }
 
     // Find another slot if current slot is used:
@@ -1157,7 +1157,7 @@
     if (db->inUse) {
         newBaseNum = findEmptyBase();
         if (newBaseNum == -1) {
-            return errorResult (ti, "You have too many open databases; close one first.");
+            return errorResult (ti, "Sie haben zuviele offene Datenbanken; bitte zuerst eine schließen.");
         }
     }
 
@@ -1189,7 +1189,7 @@
     if (argc > 2) {
         int baseNum = strGetInteger (argv[2]);
         if (baseNum < 1 || baseNum > MAX_BASES) {
-            return errorResult (ti, "Invalid database number.");
+            return errorResult (ti, "Ungültige Datenbanknummer.");
         }
         basePtr = &(dbList[baseNum - 1]);
     }
@@ -1239,7 +1239,7 @@
         optionMode = strUniqueMatch (argv[2], options);
 
         if (optionMode < OPT_FREE || argc > 3) {
-            return errorResult (ti, "Usage: sc_base count [free|used|total]");
+            return errorResult (ti, "Aufruf: sc_base count [free|used|total]");
         }
     }
 
@@ -1261,7 +1261,7 @@
 sc_base_description (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc < 2  ||  argc > 3) {
-        return errorResult (ti, "Usage: sc_base description [<text>]");
+        return errorResult (ti, "Aufruf: sc_base description [<text>]");
     }
     if (argc == 2) {
         // Get description:
@@ -1293,7 +1293,7 @@
     bool limitToFilter = false;
 
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_base check <bool:all_games>");
+        return errorResult (ti, "Aufruf: sc_base check <bool:all_games>");
     }
 
     Game *g = new Game();
@@ -1407,7 +1407,7 @@
     gameFormatT outputFormat = PGN_FORMAT_Plain;
     const char * startText = "";
     const char * endText = "";
-    const char * usage = "Usage: sc_base export current|filter PGN|HTML|Latex <pgn_filename> options...";
+    const char * usage = "Aufruf: sc_base export current|filter PGN|HTML|Latex <pgn_filename> options...";
     uint pgnStyle = PGN_STYLE_TAGS;
 
     const char * options[] = {
@@ -1518,7 +1518,7 @@
     }
     exportFile = fopen (exportFileName, (appendToFile ? "r+" : "w"));
     if (exportFile == NULL) {
-        return errorResult (ti, "Error opening file for exporting games.");
+        return errorResult (ti, "Fehler beim Öffnen der Datei für den Partienexport.");
     }
 
     CharsetConverter* charsetConverter = NULL;
@@ -1633,7 +1633,7 @@
 int
 sc_base_import (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_base import file|data <pgnFile|pgnData>";
+    const char * usage = "Aufruf: sc_base import file|data <pgnFile|pgnData>";
     static const char * options[] = { "data", "file", NULL };
     enum { IMPORT_OPT_DATA, IMPORT_OPT_FILE };
 
@@ -1656,7 +1656,7 @@
 
     if (index == IMPORT_OPT_FILE) {
         if (pgnFile.Open (argv[3], FMODE_ReadOnly) != OK) {
-            return errorResult (ti, "Error opening PGN file.");
+            return errorResult (ti, "Fehler beim Öffnen der PGN-Datei.");
         }
         parser.Reset (&pgnFile);
         inputLength = fileSize (argv[3], "");
@@ -1681,7 +1681,7 @@
           recalcFlagCounts (db);
           if (! db->memoryOnly) removeFile (db->fileName, TREEFILE_SUFFIX);
 
-          Tcl_AppendResult (ti, "Error saving game in database.\n", NULL);
+          Tcl_AppendResult (ti, "Fehler beim Speichern der Partie in die Datenbank.\n", NULL);
           return TCL_ERROR;
         }
         // Update the progress bar:
@@ -1697,11 +1697,11 @@
 
     // Now write the Index file header and the name file:
     if (db->idx->WriteHeader() != OK) {
-        return errorResult (ti, "Error writing index file.");
+        return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
     }
     if (! db->memoryOnly) {
         if (db->nb->WriteNameFile() != OK) {
-            return errorResult (ti, "Error writing name file.");
+            return errorResult (ti, "Fehler beim Schreiben der Namendatei.");
         }
     }
 
@@ -1729,7 +1729,7 @@
     bool showProgress = startProgressBar();
 
     const char * usage =
-        "Usage: sc_base piecetrack [-g|-t] <minMoves> <maxMoves> <startSquare ...>";
+        "Aufruf: sc_base piecetrack [-g|-t] <minMoves> <maxMoves> <startSquare ...>";
 
     if (argc < 5) {
         return errorResult (ti, usage);
@@ -1923,10 +1923,10 @@
     bool showProgress = startProgressBar();
 
     if (argc < 3 || argc > 4) {
-        return errorResult (ti, "Usage: sc_base sort <criteria> [script]");
+        return errorResult (ti, "Aufruf: sc_base sort <criteria> [script]");
     }
     if (db->idx->ParseSortCriteria (argv[2]) != OK) {
-        return errorResult (ti, "Invalid sorting criteria.");
+        return errorResult (ti, "Ungültige Sortierkriterien.");
     }
     if (! db->inUse) {
         return errorResult (ti, errMsgNotOpen(ti));
@@ -1945,7 +1945,7 @@
     // if (status == ERROR )
     // ERROR define seems broken with mingwx
     if (status != OK ) {
-      return errorResult (ti, "Sort Failed.");
+      return errorResult (ti, "Sortierung fehlgeschlagen.");
     }
 
     if (showProgress) { updateProgressBar (ti, 1, 1); }
@@ -2031,7 +2031,7 @@
     if (argc > 3) {
         int baseNum = strGetInteger (argv[3]);
         if (baseNum < 1 || baseNum > MAX_BASES) {
-            return errorResult (ti, "Invalid database number.");
+            return errorResult (ti, "Ungültige Datenbanknummer.");
         }
         basePtr = &(dbList[baseNum - 1]);
     }
@@ -2086,7 +2086,7 @@
 sc_base_ecoStats (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_base ecoStats <ECO-prefix>");
+        return errorResult (ti, "Aufruf: sc_base ecoStats <ECO-prefix>");
     }
     const char * eco = argv[2];
     uint length = strLength (eco);
@@ -2116,7 +2116,7 @@
         }
     }
     if (invalid) {
-        return errorResult (ti, "Invalid ECO prefix");
+        return errorResult (ti, "Ungültiges ECO-Präfix");
     }
 
     ecoStatsT * result = NULL;
@@ -2149,7 +2149,7 @@
             + result->results[RESULT_Draw] + result->results[RESULT_None];
         score = score * 500 / result->count;
         char str[10];
-        sprintf (str, "%u.%u", score / 10, score % 10);
+        sprintf (str, "%u.%u", (unsigned short)score / 10, (unsigned short)score % 10);
         Tcl_AppendElement (ti, str);
     } else {
         Tcl_AppendElement (ti, "0.0");
@@ -2165,7 +2165,7 @@
 sc_base_switch (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_base switch <number>");
+        return errorResult (ti, "Aufruf: sc_base switch <number>");
     }
     int baseNum = strGetInteger (argv[2]);
     if (tolower(argv[2][0]) == 'c'  &&  strIsCasePrefix (argv[2], "clipbase")) {
@@ -2172,7 +2172,7 @@
         baseNum = CLIPBASE_NUM + 1;
     }
     if (baseNum < 1  ||  baseNum > MAX_BASES) {
-        return errorResult (ti, "sc_base switch: Invalid base number.");
+        return errorResult (ti, "sc_base switch: ungültige Datenbanknummer.");
     }
 
     // Should we do this check here ? Some places (eg file::Exit)
@@ -2196,12 +2196,12 @@
 sc_base_type (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3  &&  argc != 4) {
-        return errorResult (ti, "Usage: sc_base type <number> [<type>]");
+        return errorResult (ti, "Aufruf: sc_base type <number> [<type>]");
     }
 
     int baseNum = strGetInteger (argv[2]);
     if (baseNum < 1 || baseNum > MAX_BASES) {
-        return errorResult (ti, "Invalid database number.");
+        return errorResult (ti, "Ungültige Datenbanknummer.");
     }
     scidBaseT * basePtr = &(dbList[baseNum - 1]);
 
@@ -2422,7 +2422,7 @@
     bool showProgress = startProgressBar();
 
     if ((argc % 2) != 0) {
-        return errorResult (ti, "Usage: sc_base duplicates [-option value ...]");
+        return errorResult (ti, "Aufruf: sc_base duplicates [-option value ...]");
     }
     if (! db->inUse) {
         return errorResult (ti, errMsgNotOpen(ti));
@@ -2508,7 +2508,7 @@
                 } else if (strIsCasePrefix (valueStr, "newer")) {
                     deleteStrategy = DELETE_NEWER;
                 } else {
-                    return errorResult (ti, "Invalid option.");
+                    return errorResult (ti, "Ungültige Option.");
                 }
                 break;
             default:
@@ -2676,7 +2676,7 @@
 int
 sc_base_tag (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_base tag [list | [find | strip] <tagname> [filter|all] | add <tagname> <tagvalue> [filter|all]]";
+    const char * usage = "Aufruf: sc_base tag [list | [find | strip] <tagname> [filter|all] | add <tagname> <tagvalue> [filter|all]]";
     const char * options[] = {
         "find", "list", "strip", "add", NULL
     };
@@ -2800,10 +2800,10 @@
     if ((cmd == TAG_STRIP || cmd == TAG_ADD)  &&  nEditedGames > 0) {
         db->gfile->FlushAll();
         if (db->idx->WriteHeader() != OK) {
-            return errorResult (ti, "Error writing index file.");
+            return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
         }
         if (! db->memoryOnly  &&  db->nb->WriteNameFile() != OK) {
-            return errorResult (ti, "Error writing name file.");
+            return errorResult (ti, "Fehler beim Schreiben der Namendatei.");
         }
     }
 
@@ -3213,7 +3213,7 @@
 int
 sc_base_tournaments (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_base tournaments [-<option> <value> ...]";
+    const char * usage = "Aufruf: sc_base tournaments [-<option> <value> ...]";
 
     uint i;
     uint maxTourneys = 100;
@@ -3458,7 +3458,7 @@
     bool showProgress = startProgressBar();
 
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_base upgrade <old-database>");
+        return errorResult (ti, "Aufruf: sc_base upgrade <old-database>");
     }
     const char * fname = argv[2];
     Index * oldIndex = new Index;
@@ -3471,13 +3471,13 @@
         newIndex->CloseIndexFile();
         delete oldIndex;
         delete newIndex;
-        return errorResult (ti, "An upgraded version of this database already exists.");
+        return errorResult (ti, "Eine neuere Version dieser Datenbank existiert bereits.");
     }
 
     if (oldIndex->OpenOldIndexFile (FMODE_ReadOnly) != OK) {
         delete oldIndex;
         delete newIndex;
-        return errorResult (ti, "Error opening the old database.");
+        return errorResult (ti, "Fehler beim Öffnen der alten Datenbank.");
     }
 
     if (newIndex->CreateIndexFile (FMODE_WriteOnly) != OK) {
@@ -3484,7 +3484,7 @@
         oldIndex->CloseIndexFile();
         delete oldIndex;
         delete newIndex;
-        return errorResult (ti, "Error creating the new dataabse.");
+        return errorResult (ti, "Fehler beim Erstellen der neuen Datenbank.");
     }
 
     MFile * oldMFile = oldIndex->GetMFile();
@@ -3541,7 +3541,7 @@
     newIndex->CloseIndexFile(true); // don't write again the header
 
     if (err == OK  &&  !interruptedProgress()) {
-        if (err != OK) { setResult (ti, "Error writing name file"); }
+        if (err != OK) { setResult (ti, "Fehler beim Schreiben der Namendatei"); }
     }
 
     delete oldIndex;
@@ -3549,7 +3549,7 @@
 
     if (interruptedProgress()) {
         removeFile (fname, INDEX_SUFFIX);
-        return errorResult (ti, "Upgrading was cancelled.");
+        return errorResult (ti, "Upgrade wurde abgebrochen.");
     }
 
     if (err != OK) {
@@ -3585,7 +3585,7 @@
     if ( nb->ReadNameFile() != OK) {
         delete nb;
         delete idx;
-        errorResult (ti, "Error opening name file.");
+        errorResult (ti, "Fehler beim Öffnen der Namendatei.");
     }
 
     Index * idxTemp = new Index;
@@ -3594,7 +3594,7 @@
         delete idxTemp;
         delete nb;
         delete idx;
-        return errorResult (ti, "Error opening index file.");
+        return errorResult (ti, "Fehler beim Öffnen der Indexdatei.");
     }
     recalcNameFrequencies (nb, idxTemp);
     idxTemp->CloseIndexFile();
@@ -3619,7 +3619,7 @@
             if (frequency > 0) {
                 uint newID;
                 if (nbNew->AddName (nt, name, &newID) != OK) {
-                    errorResult (ti, "Error compacting namebase.");
+                    errorResult (ti, "Fehler beim Komprimieren der Namendatenbank.");
                     break;
                 }
                 if (newID >= numEntries)
@@ -3645,25 +3645,25 @@
     printf ("Renaming %s%s to %s%s in case of error...\n",
             filename, INDEX_SUFFIX, tempName, INDEX_SUFFIX);
     if (renameFile (filename, tempName, INDEX_SUFFIX) != OK) {
-        errorResult (ti, "Unable to rename the index file!");
+        errorResult (ti, "Indexdatei kann nicht umbenannt werden!");
     }
     printf ("Renaming %s%s to %s%s in case of error...\n",
             filename, NAMEBASE_SUFFIX, tempName, NAMEBASE_SUFFIX);
     if (renameFile (filename, tempName, NAMEBASE_SUFFIX) != OK) {
-        errorResult (ti, "Unable to rename the namebase file!");
+        errorResult (ti, "Namendatenbank kann nicht umbenannt werden!");
     }
     if (idxOld->OpenIndexFile (FMODE_ReadOnly) != OK) {
         renameFile (tempName, filename, INDEX_SUFFIX);
-        errorResult (ti, "Error renaming index file");
+        errorResult (ti, "Fehler beim Umbenennen der Indexdatei");
     }
 
     if (idxNew->CreateIndexFile (FMODE_WriteOnly) != OK) {
         renameFile (tempName, filename, INDEX_SUFFIX);
-        errorResult (ti , "Error creating index file");
+        errorResult (ti , "Fehler beim Erstellen der Indexdatei");
     }
     idxNew->SetType (idxOld->GetType());
 
-    printf ("Writing new name and index files...\n");
+    printf ("Schreibe neue Namen- und Indexdatei ...\n");
 
     // For each entry in old index: read it, alter its name ID
     // values to match the new namebase, and write the entry to
@@ -3779,8 +3779,8 @@
     int epdID = -1;
     if (argc >= 3) { epdID = strGetInteger (argv[2]) - 1; }
     if (epdID < 0  ||  epdID >= MAX_EPD  ||  pbooks[epdID] == NULL) {
-        Tcl_AppendResult (ti, "Error: sc_epd ", options[index],
-                          ": invalid EPD ID number", NULL);
+        Tcl_AppendResult (ti, "Fehler: sc_epd ", options[index],
+                          ": ungültige EPD-ID-Nummer", NULL);
         return TCL_ERROR;
     }
 
@@ -3810,7 +3810,7 @@
     case EPD_LOAD:
         {
           if (argc != 4) {
-            return errorResult (ti, "Usage: sc_epd load <epdID> <index>");
+            return errorResult (ti, "Aufruf: sc_epd load <epdID> <index>");
           }
           int idx = strGetInteger (argv[3]);
           PBook * pb = pbooks[epdID];
@@ -3842,7 +3842,7 @@
 
     case EPD_SET:   // Sets the text for the current position:
         if (argc != 4) {
-            return errorResult (ti, "Usage: sc_epd set <epdID> <text>");
+            return errorResult (ti, "Aufruf: sc_epd set <epdID> <text>");
         }
         return sc_epd_set (ti, epdID, argv[3]);
 
@@ -3851,7 +3851,7 @@
 
     case EPD_STRIP:
         if (argc != 4) {
-            return errorResult (ti, "Usage: sc_epd strip <epdID> <epdcode>");
+            return errorResult (ti, "Aufruf: sc_epd strip <epdID> <epdcode>");
         }
         return setUintResult (ti, pbooks[epdID]->StripOpcode (argv[3]));
 
@@ -3875,7 +3875,7 @@
           } else if (argc == 4) {
             return setIntResult (ti, pb->SetIndex(strGetUnsigned(argv[3])));
           } else {
-            return errorResult (ti, "Usage: sc_epd index <epdID> [<index>]");
+            return errorResult (ti, "Aufruf: sc_epd index <epdID> [<index>]");
           }
         }
 
@@ -3962,7 +3962,7 @@
 sc_epd_open (Tcl_Interp * ti, int argc, const char ** argv, bool create)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_epd create|open <filename>");
+        return errorResult (ti, "Aufruf: sc_epd create|open <filename>");
     }
 
     const char * filename = argv[2];
@@ -3972,7 +3972,7 @@
     for (epdID = 0; epdID < MAX_EPD; epdID++) {
         if (pbooks[epdID] != NULL  &&
                 strEqual (filename, pbooks[epdID]->GetFileName())) {
-            return errorResult (ti, "The EPD file you selected is already open.");
+            return errorResult (ti, "Die gewählte EPD-Datei ist bereits geöffnet.");
         }
     }
 
@@ -3982,7 +3982,7 @@
         if (pbooks[epdID] == NULL) { freeID = epdID; break; }
     }
     if (freeID == -1) {
-        return errorResult (ti, "Too many EPD files are open; close one first.");
+        return errorResult (ti, "Zuviele EPD-Dateien geöffnet; bitte zuerst eine schließen.");
     }
 
     PBook * pb = new PBook;
@@ -3993,8 +3993,8 @@
     if (err != OK) {
         delete pb;
         pbooks[freeID] = NULL;
-        Tcl_AppendResult (ti, "Unable to ", (create ? "create" : "open"),
-                          " EPD file: ", filename, PBOOK_SUFFIX, NULL);
+        Tcl_AppendResult (ti, "Kann EPD-Datei nicht ", (create ? "erstellen: " : "öffnen: "),
+                          filename, PBOOK_SUFFIX, NULL);
         return TCL_ERROR;
     }
     return setIntResult (ti, freeID + 1);
@@ -4017,7 +4017,7 @@
 {
     PBook * pb = pbooks[epdID];
     if (pb->WriteFile() != OK) {
-        return errorResult (ti, "Error writing EPD file.");
+        return errorResult (ti, "Fehler beim Schreiben der EPD-Datei.");
     }
     return TCL_OK;
 }
@@ -4067,7 +4067,7 @@
 sc_clipbase_clear (Tcl_Interp * ti)
 {
     if (! clipbase->inUse) {
-        return errorResult (ti, "The clipbase is not open.");
+        return errorResult (ti, "Die Ablagedatenbank ist nicht geöffnet.");
     }
     clipbase->game->Clear();
     clipbase->nb->Clear();
@@ -4100,10 +4100,10 @@
 {
     // Hmmm - errors currently caught
     if (! clipbase->inUse) {
-        return errorResult (ti, "The clipbase is not open.");
+        return errorResult (ti, "Die Ablagedatenbank ist nicht geöffnet.");
     }
     if (db == clipbase) {
-        return errorResult (ti, "You are already in the clipbase database.");
+        return errorResult (ti, "Sie sind bereits in der Ablagedatenbank.");
     }
     if (clipbase->fileMode == FMODE_ReadOnly) {
          return errorResult (ti, errMsgReadOnly(ti));
@@ -4119,7 +4119,7 @@
     db->bbuf->Empty();
     db->game->SaveState();
     if (db->game->Encode (db->bbuf, NULL) != OK) {
-        return errorResult (ti, "Error encoding game.");
+        return errorResult (ti, "Fehler beim Kodieren der Partie.");
     }
     db->game->RestoreState();
     db->bbuf->BackToStart();
@@ -4126,7 +4126,7 @@
     clipbase->game->Clear();
 
     if (clipbase->game->Decode (db->bbuf, GAME_DECODE_ALL) != OK) {
-        return errorResult (ti, "Error decoding game.");
+        return errorResult (ti, "Fehler beim Dekodieren der Partie.");
     }
 
     // Copy the standard tag values to the clipbase game:
@@ -4170,7 +4170,7 @@
     uint location = clipbase->game->GetPgnOffset (0);
     db->bbuf->Empty();
     if (clipbase->game->Encode (db->bbuf, NULL) != OK) {
-        return errorResult (ti, "Error encoding game.");
+        return errorResult (ti, "Fehler beim Kodieren der Partie.");
     }
 
     // db changes get discarded
@@ -4182,7 +4182,7 @@
     db->gameAltered = true;
 
     if (db->game->Decode (db->bbuf, GAME_DECODE_ALL) != OK) {
-        return errorResult (ti, "Error decoding game.");
+        return errorResult (ti, "Fehler beim Dekodieren der Partie.");
     }
 
     // Copy the standard tag values from the clipbase game:
@@ -4216,7 +4216,7 @@
         return errorResult (ti, errMsgNotOpen(ti));
     }
     if (db->memoryOnly) {
-        return errorResult (ti, "This is a memory-only database, it cannot be compacted.");
+        return errorResult (ti, "Dies ist eine Nur-Speicher-Datenbank, die nicht komprimiert werden kann.");
     }
 
     if (argc > 1) { index = strUniqueMatch (argv[1], options); }
@@ -4271,11 +4271,11 @@
 
     if (newIdx->CreateIndexFile (FMODE_WriteOnly) != OK) {
         CLEANUP;
-        return errorResult (ti, "Error creating temporary file; compaction cancelled");
+        return errorResult (ti, "Fehler beim Erstellen einer temporären Datei; Komprimierung abgebrochen.");
     }
     if (newGfile->Create (newName, FMODE_WriteOnly) != OK) {
         CLEANUP;
-        return errorResult (ti, "Error creating temporary file; compaction cancelled.");
+        return errorResult (ti, "Fehler beim Erstellen einer temporären Datei; Komprimierung abgebrochen.");
     }
 
     gameNumberT newNumGames = 0;
@@ -4470,7 +4470,7 @@
                 const char * name = nb->GetName (nt, oldID);
                 err = nbNew->AddName (nt, name, &newID);
                 if (err != OK) {
-                    errorResult (ti, "Error compacting namebase.");
+                    errorResult (ti, "Fehler beim Komprimieren der Namendatenbank.");
                     break;
                 }
                 nbNew->IncFrequency (nt, newID, frequency);
@@ -4505,7 +4505,7 @@
             ieNew.SetRound (idMapping [NAME_ROUND] [ie->GetRound()]);
             err = db->idx->WriteEntries (&ieNew, i, 1);
             if (err != OK) {
-                errorResult (ti, "Error writing index file.");
+                errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
                 break;
             }
         }
@@ -4518,7 +4518,7 @@
         nbNew->SetFileName (db->fileName);
         err = nbNew->WriteNameFile();
         if (err != OK) {
-            errorResult (ti, "Error writing name file.");
+            errorResult (ti, "Fehler beim Schreiben der Namendatei.");
         }
         delete db->nb;
         db->nb = nbNew;
@@ -4551,7 +4551,7 @@
 sc_compact_stats (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_compact stats games|names");
+        return errorResult (ti, "Aufruf: sc_compact stats games|names");
     }
 
     if (argv[2][0] == 'n') {
@@ -4567,7 +4567,7 @@
         }
     } else {
         if (argv[2][0] != 'g') {
-          Tcl_AppendResult (ti, "Usage: sc_compact stats [games|names]", NULL);
+          Tcl_AppendResult (ti, "Aufruf: sc_compact stats [games|names]", NULL);
           return TCL_ERROR;
         }
 
@@ -4698,9 +4698,9 @@
 sc_eco_base (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 4) {
-        return errorResult (ti, "Usage: sc_eco <bool:all_games> <bool:extensions>");
+        return errorResult (ti, "Aufruf: sc_eco <bool:all_games> <bool:extensions>");
     }
-    if (!ecoBook) { return errorResult (ti, "No ECO Book is loaded."); }
+    if (!ecoBook) { return errorResult (ti, "Es wurde kein ECO-Buch geladen."); }
     if (! db->inUse) {
         return errorResult (ti, errMsgNotOpen(ti));
     }
@@ -4817,7 +4817,7 @@
         if (db->fileMode != FMODE_ReadOnly
                 &&  ie->GetEcoCode() != oldEcoCode) {
             if (db->idx->WriteEntries (ie, i, 1) != OK) {
-                return errorResult (ti, "Error writing index file.");
+                return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
             }
         }
     }
@@ -4825,7 +4825,7 @@
     // Update the index file header:
     if (db->fileMode != FMODE_ReadOnly) {
         if (db->idx->WriteHeader() != OK) {
-            return errorResult (ti, "Error writing index file.");
+            return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
         }
     }
 
@@ -4834,8 +4834,8 @@
 
     int centisecs = timer.CentiSecs();
     char tempStr [100];
-    sprintf (tempStr, "Classified %d game%s in %d%c%02d seconds",
-             countClassified, strPlural (countClassified),
+    sprintf (tempStr, "%d Partien in %d%c%02d Sekunden klassifiziert",
+             countClassified,
              centisecs / 100, decimalPointChar, centisecs % 100);
     Tcl_AppendResult (ti, tempStr, NULL);
     return TCL_OK;
@@ -4856,7 +4856,7 @@
         if (argc == 3  &&  strIsPrefix (argv[2], "ply")) {
             returnPly = 1;
         } else {
-            return errorResult (ti, "Usage: sc_game eco [ply]");
+            return errorResult (ti, "Aufruf: sc_game eco [ply]");
         }
     }
     if (!ecoBook) { return TCL_OK; }
@@ -4903,12 +4903,12 @@
     errorT err = ecoBook->ReadEcoFile();
     if (err != OK) {
         if (err == ERROR_FileOpen) {
-            Tcl_AppendResult (ti, "Unable to open the ECO file:\n",
+            Tcl_AppendResult (ti, "ECO-Datei kann nicht geöffnet werden:\n",
                               argv[2], NULL);
         } else {
-            Tcl_AppendResult (ti, "Unable to load the ECO file:\n",
+            Tcl_AppendResult (ti, "ECO-Datei kann nicht geladen werden:\n",
                               argv[2], NULL);
-            Tcl_AppendResult (ti, "\n\nError at line ", NULL);
+            Tcl_AppendResult (ti, "\n\nFehler bei Zeile ", NULL);
             appendUintResult (ti, ecoBook->GetLineNumber());
         }
         delete ecoBook;
@@ -4927,7 +4927,7 @@
 {
     bool color = 0;
     if (argc != 3  &&  argc != 4) {
-        return errorResult (ti, "Usage: sc_eco summary <ECO-prefix> [<bool:color>]");
+        return errorResult (ti, "Aufruf: sc_eco summary <ECO-prefix> [<bool:color>]");
     }
     if (argc == 4) { color = strGetBoolean (argv[3]); }
     if (!ecoBook) { return TCL_OK; }
@@ -4990,7 +4990,7 @@
 sc_eco_find (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3 && argc != 4) {
-        return errorResult (ti, "Usage: sc_eco find <string> [color]");
+        return errorResult (ti, "Aufruf: sc_eco find <string> [color]");
     }
     if (!ecoBook) { return TCL_OK; }
 
@@ -5057,7 +5057,7 @@
 sc_eco_translate (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 5) {
-        return errorResult (ti, "Usage: sc_eco translate <lang> <from> <to>");
+        return errorResult (ti, "Aufruf: sc_eco translate <lang> <from> <to>");
     }
 
     ecoTranslateT * trans = new ecoTranslateT;
@@ -5230,7 +5230,7 @@
     if (argc > 2) {
         int baseNum = strGetInteger (argv[2]);
         if (baseNum < 1 || baseNum > MAX_BASES) {
-            return errorResult (ti, "Invalid database number.");
+            return errorResult (ti, "Ungültige Datenbanknummer.");
         }
         basePtr = &(dbList[baseNum - 1]);
     }
@@ -5245,7 +5245,7 @@
 {
     bool showProgress = startProgressBar();
     if (argc != 4 && argc != 5) {
-        return errorResult (ti, "Usage: sc_filter copy <fromBase> <toBase> [items]");
+        return errorResult (ti, "Aufruf: sc_filter copy <fromBase> <toBase> [items]");
     }
     uint updateStart, update;
     updateStart = update = 1000;  // Update progress bar every 100 games
@@ -5253,21 +5253,21 @@
     int sourceBaseNum = strGetInteger (argv[2]);
     int targetBaseNum = strGetInteger (argv[3]);
     if (sourceBaseNum < 1  ||  sourceBaseNum > MAX_BASES) {
-        return errorResult (ti, "Invalid source base number.");
+        return errorResult (ti, "Ungültige Quelldatenbanknummer.");
     }
     if (targetBaseNum < 1  ||  targetBaseNum > MAX_BASES) {
-        return errorResult (ti, "Invalid target base number.");
+        return errorResult (ti, "Ungültige Zieldatenbanknummer.");
     }
     scidBaseT * sourceBase = &(dbList[sourceBaseNum - 1]);
     scidBaseT * targetBase = &(dbList[targetBaseNum - 1]);
     if (! sourceBase->inUse) {
-        return errorResult (ti, "The source database is not open.");
+        return errorResult (ti, "Die Quelldatenbank ist nicht geöffnet.");
     }
     if (! targetBase->inUse) {
-        return errorResult (ti, "The target database is not open.");
+        return errorResult (ti, "Die Zieldatenbank ist nicht geöffnet.");
     }
     if (targetBase->fileMode == FMODE_ReadOnly) {
-        return errorResult (ti, "The target database is read-only.");
+        return errorResult (ti, "Die Zieldatenbank kann nur gelesen werden.");
     }
 
     // Currently only used by gamelist context menu gamelist::CopyFilter "Copy to filter", but could be expanded
@@ -5278,11 +5278,11 @@
 
     if (listMode) {
 	if (Tcl_SplitList (ti, (char *)argv[4], &largc, (CONST84 char ***) &largv) != TCL_OK) {
-	    return errorResult (ti, "Error parsing filter list.");
+	    return errorResult (ti, "Fehler beim Parsen der Filterliste.");
 	}
         if (largc <= 0) {
 	   Tcl_Free ((char *) largv);
-           return errorResult (ti, "Zero args when parsing filter list.");
+           return errorResult (ti, "Null Argumente beim Parsen der Filterliste.");
         }
         targetCount = (uint)largc;
      } else {
@@ -5307,7 +5307,7 @@
 	    IndexEntry * ie = sourceBase->idx->FetchEntry (atoi(largv[i])-1);
 	    sourceBase->bbuf->Empty();
 	    if (sourceBase->gfile->ReadGame (sourceBase->bbuf, ie->GetOffset(), ie->GetLength()) != OK) {
-		return errorResult (ti, "Error reading game file.");
+		return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
 	    }
 	    if (sc_savegame (ti, sourceBase, sourceBase->bbuf, ie, targetBase) != TCL_OK) {
 		    return TCL_ERROR;
@@ -5332,7 +5332,7 @@
         sourceBase->bbuf->Empty();
         if (sourceBase->gfile->ReadGame (sourceBase->bbuf, ie->GetOffset(),
                                          ie->GetLength()) != OK) {
-            return errorResult (ti, "Error reading game file.");
+            return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
         }
 
 	if (sc_savegame (ti, sourceBase, sourceBase->bbuf, ie, targetBase) != TCL_OK) {
@@ -5346,10 +5346,10 @@
 
     // Now write the Index file header and the name file:
     if (targetBase->idx->WriteHeader() != OK) {
-        return errorResult (ti, "Error writing index file.");
+        return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
     }
     if (! targetBase->memoryOnly  &&  targetBase->nb->WriteNameFile() != OK) {
-        return errorResult (ti, "Error writing name file.");
+        return errorResult (ti, "Fehler beim Schreiben der Namendatei.");
     }
 
     // Ensure that the Index is still all in memory:
@@ -5383,7 +5383,7 @@
 // sc_filter_freq:
 //    Returns a two-integer list showing how many filter games,
 //    and how many total database games, meet the specified criteria.
-//    Usage:
+//    Aufruf:
 //        sc_filter freq date <startdate> [<endDate>]
 //        sc_filter freq elo <lowerMeanElo> [<upperMeanElo>]
 //     or sc_filter freq move <lowerhalfMove> <higherhalfMove>
@@ -5399,7 +5399,7 @@
 sc_filter_freq (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     const char * usage =
-        "Usage: sc_filter freq date|elo|move <startDate|minElo|lowerhalfMove> [<endDate|maxElo|higherhalfMove>][GuessElo]";
+        "Aufruf: sc_filter freq date|elo|move <startDate|minElo|lowerhalfMove> [<endDate|maxElo|higherhalfMove>][GuessElo]";
 
     bool eloMode = false;
     bool moveMode = false;
@@ -5549,7 +5549,7 @@
 sc_filter_locate (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_filter locate <gameNumber>");
+        return errorResult (ti, "Aufruf: sc_filter locate <gameNumber>");
     }
     uint filteredCount = 0;
     if (db->inUse) {
@@ -5634,7 +5634,7 @@
 sc_filter_remove (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3  &&  argc != 4) {
-        return errorResult (ti, "Usage: sc_filter remove <from> [<to>]");
+        return errorResult (ti, "Aufruf: sc_filter remove <from> [<to>]");
     }
     if (! db->inUse) { return TCL_OK; }
     uint from = strGetUnsigned (argv[2]);
@@ -5668,7 +5668,7 @@
     if (argc > 2) {
         int baseNum = strGetInteger (argv[2]);
         if (baseNum < 1 || baseNum > MAX_BASES) {
-            return errorResult (ti, "Invalid database number.");
+            return errorResult (ti, "Ungültige Datenbanknummer.");
         }
         basePtr = &(dbList[baseNum - 1]);
     } else {
@@ -5691,7 +5691,7 @@
     if (argc > 2) {
         int baseNum = strGetInteger (argv[2]);
         if (baseNum < 1 || baseNum > MAX_BASES) {
-            return errorResult (ti, "Invalid database number.");
+            return errorResult (ti, "Ungültige Datenbanknummer.");
         }
         basePtr = &(dbList[baseNum - 1]);
     }
@@ -5716,7 +5716,7 @@
     if (argc > 2) {
         int baseNum = strGetInteger (argv[2]);
         if (baseNum < 1 || baseNum > MAX_BASES) {
-            return errorResult (ti, "Invalid database number.");
+            return errorResult (ti, "Ungültige Datenbanknummer.");
         }
         basePtr = &(dbList[baseNum - 1]);
     }
@@ -5733,7 +5733,7 @@
     enum {STATS_ALL, STATS_ELO, STATS_YEAR};
 
     if (argc < 2 || argc > 5) {
-        return errorResult (ti, "Usage: sc_filter stats [all | elo <xx> | year <xx>]");
+        return errorResult (ti, "Aufruf: sc_filter stats [all | elo <xx> | year <xx>]");
     }
     int statType = STATS_ALL;
     uint min = 0;
@@ -5745,7 +5745,7 @@
     }
     if (statType == STATS_ELO  ||  statType == STATS_YEAR) {
         if (argc < 4) {
-            return errorResult (ti, "Incorrect number of parameters.");
+            return errorResult (ti, "Ungültige Parameteranzahl.");
         }
         min = strGetUnsigned (argv[3]);
         max = strGetUnsigned (argv[4]);
@@ -5822,7 +5822,7 @@
     bool (*stringcompare)(const char*, const char*);
 
     if (argc != 5) {
-        return errorResult (ti, "Usage: sc_filter textfind <case_bool> <startGame> <searchText>");
+        return errorResult (ti, "Aufruf: sc_filter textfind <case_bool> <startGame> <searchText>");
     }
 
     if (strGetUnsigned(argv[2])==0)
@@ -5872,7 +5872,7 @@
     uint number_removed = 0;
 
     if (argc != 4) {
-        return errorResult (ti, "Usage: sc_filter textfilter <case_bool> <searchText>");
+        return errorResult (ti, "Aufruf: sc_filter textfilter <case_bool> <searchText>");
     }
 
     if (strGetUnsigned(argv[2])==0)
@@ -5929,13 +5929,13 @@
         if (argc == 4) {
             int baseNum = strGetInteger (argv[3]);
             if (baseNum < 1  ||  baseNum > MAX_BASES || !((base = &(dbList[baseNum - 1]))->inUse) )
-              return errorResult (ti, "sc_filter_value: Illegal base");
+              return errorResult (ti, "sc_filter_value: ungültige Datenbank");
         }
         gnum = strGetUnsigned (argv[2]);
     }
 
     if (gnum < 1  ||  gnum > base->numGames)
-      return errorResult (ti, "sc_filter_value: game out of range");
+      return errorResult (ti, "sc_filter_value: Partie außerhalb des Bereichs");
 
     gnum--;
 
@@ -5962,13 +5962,13 @@
 	if (argc == 4) {
 	    int baseNum = strGetInteger (argv[3]);
 	    if (baseNum < 1  ||  baseNum > MAX_BASES || !((base = &(dbList[baseNum - 1]))->inUse) )
-	      return errorResult (ti, "sc_filter_value: Illegal base");
+	      return errorResult (ti, "sc_filter_value: ungültige Datenbank");
 	}
         gnum = strGetUnsigned (argv[2]);
     } 
 
     if (gnum < 1  ||  gnum > base->numGames)
-      return errorResult (ti, "sc_filter_value: game out of range");
+      return errorResult (ti, "sc_filter_value: Partie außerhalb des Bereichs");
 
     gnum--;
 
@@ -6045,7 +6045,7 @@
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // sc_flags
-// Usage: sc_flags <gameNum> [verbose]
+// Aufruf: sc_flags <gameNum> [verbose]
 // returns a string with all set flags for this game
 //
 // Could be incorporated into sc_game
@@ -6058,7 +6058,7 @@
     gameNumberT gnum;
 
     if (argc < 2 || argc > 3) {
-      return errorResult (ti, "Usage: sc_flags <gamenumber> [verbose]");
+      return errorResult (ti, "Aufruf: sc_flags <gamenumber> [verbose]");
     }
 
     gnum = strGetUnsigned (argv[1]);
@@ -6206,7 +6206,7 @@
 
     case GAME_SET_ALTERED:
         if (argc != 3 ) {
-          return errorResult (ti, "Usage: sc_game setaltered [0|1]");
+          return errorResult (ti, "Aufruf: sc_game setaltered [0|1]");
         }
         db->gameAltered = strGetUnsigned (argv[2]);
         break;
@@ -6316,7 +6316,7 @@
 
     case GAME_UNDO:
 	if (trialMode) 
-	    return errorResult (ti, "'undo' disabled in trial mode");
+	    return errorResult (ti, "'Rückgängig' im Testmodus ist deaktiviert.");
 
 	if (db->undoIndex <= -1)
 	    return setResult (ti, "0");
@@ -6383,7 +6383,7 @@
 
     case GAME_REDO:
 	if (trialMode)
-	    return errorResult (ti, "'redo' disabled in trial mode");
+	    return errorResult (ti, "'Wiederherstellen' im Testmodus ist deaktiviert.");
 
 	if (db->undoIndex >= db->undoMax)
 	    return setResult (ti, "0");
@@ -6447,7 +6447,7 @@
     char stemp[1000];
 
     const char * usageMsg =
-        "Usage: sc_game crosstable plain|html|hypertext|filter|count [name|rating|score|country] [allplay|swiss] [(+|-)(colors|countries|tallies|ratings|titles|groups|breaks|numcolumns)] [-gameNumber GAME|-round ROUND]";
+        "Aufruf: sc_game crosstable plain|html|hypertext|filter|count [name|rating|score|country] [allplay|swiss] [(+|-)(colors|countries|tallies|ratings|titles|groups|breaks|numcolumns)] [-gameNumber GAME|-round ROUND]";
 
     static const char * extraOptions [] = {
         "allplay", "knockout", "swiss", "auto",
@@ -6581,7 +6581,7 @@
         g = scratchGame;
         g->Clear();
         if (gameNumber > db->numGames) {
-            return setResult (ti, "Invalid game number");
+            return setResult (ti, "Ungültige Partienummer");
         }
         IndexEntry * ie = db->idx->FetchEntry (gameNumber - 1);
         if (ie->GetLength() == 0) {
@@ -6589,10 +6589,10 @@
         }
         if (db->gfile->ReadGame (db->bbuf, ie->GetOffset(),
                                    ie->GetLength()) != OK) {
-            return errorResult (ti, "Error reading game file.");
+            return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
         }
         if (g->Decode (db->bbuf, GAME_DECODE_ALL) != OK) {
-            return errorResult (ti, "Error decoding game.");
+            return errorResult (ti, "Fehler beim Dekodieren der Partie.");
             }
         g->LoadStandardTags (ie, db->nb);
     }
@@ -6739,7 +6739,7 @@
     if (mode == CROSSTABLE_AllPlayAll  &&
             ctable->NumPlayers() > apaLimit  &&
             !tableFullMessage) {
-        Tcl_AppendResult (ti, "Warning: Too many players for all-play-all; try displaying as a swiss tournament.\n\n", NULL);
+        Tcl_AppendResult (ti, "Warnung: zuviele Spieler für jeder gegen jeden; versuchen Sie, dies als Turnier nach Schweizer System darzustellen.\n\n", NULL);
     }
 
     sprintf (stemp, "%s%s%s, ", g->GetEventStr(), newlineStr, g->GetSiteStr());
@@ -6796,7 +6796,7 @@
 sc_game_find (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 9) {
-        return errorResult (ti, "sc_game_find: Incorrect parameters");
+        return errorResult (ti, "sc_game_find: Inkorrekte Parameter");
     }
 
     uint gnum = strGetUnsigned (argv[2]);
@@ -6866,7 +6866,7 @@
 sc_game_firstMoves (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 4) {
-        return errorResult (ti, "Usage: sc_game firstMoves <gameNum> <numMoves>");
+        return errorResult (ti, "Aufruf: sc_game firstMoves <gameNum> <numMoves>");
     }
     if (!db->inUse) {
         return errorResult (ti, errMsgNotOpen(ti));
@@ -6874,7 +6874,7 @@
 
     uint gNum = strGetUnsigned (argv[2]);
     if (gNum > db->numGames) {
-        return errorResult (ti, "Invalid game number.");
+        return errorResult (ti, "Ungültige Partienummer.");
     }
 
     int plyCount = strGetInteger (argv[3]);
@@ -6886,17 +6886,17 @@
         db->bbuf->Empty();
         IndexEntry * ie = db->idx->FetchEntry (gNum - 1);
         if (ie->GetLength() == 0) {
-            return setResult (ti, "(This game has no move data)");
+            return setResult (ti, "(Diese Partie hat keine Zugdaten)");
         }
 
         if (db->gfile->ReadGame (db->bbuf, ie->GetOffset(),
                                  ie->GetLength()) != OK) {
-            return errorResult (ti, "Error reading game.");
+            return errorResult (ti, "Fehler beim Lesen der Partie.");
         }
 
         g->Clear();
         if (g->Decode (db->bbuf, GAME_DECODE_NONE) != OK) {
-            return errorResult (ti, "Error decoding game.");
+            return errorResult (ti, "Fehler beim Dekodieren der Partie.");
         }
     }
 
@@ -6927,7 +6927,7 @@
 int
 sc_game_flag (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_game flag <flag> <gameNum> [0|1]";
+    const char * usage = "Aufruf: sc_game flag <flag> <gameNum> [0|1]";
     if (argc < 4  ||  argc > 5) {
         return errorResult (ti, usage);
     }
@@ -6950,7 +6950,7 @@
         char desc[CUSTOM_FLAG_DESC_LENGTH+1];
         uint num = IndexEntry::CharToFlag (argv[2][0]) - 15;
         if (num < 1 || num > CUSTOM_FLAG_MAX )
-          return errorResult (ti, "Custom flag number out of range");
+          return errorResult (ti, "Benutzerdefinierte Flag-Nummer außerhalb des Bereichs");
         db->idx->GetCustomFlagDesc(desc, num);
         Tcl_AppendResult (ti, desc, NULL);
         return TCL_OK;
@@ -6961,7 +6961,7 @@
       } else {
         uint num = IndexEntry::CharToFlag (argv[2][0]) - 15;
         if (num < 1 || num > CUSTOM_FLAG_MAX )
-          return errorResult (ti, "Custom flag number out of range");
+          return errorResult (ti, "Benutzerdefinierte Flag-Nummer außerhalb des Bereichs");
         db->idx->SetCustomFlagDesc( argv[4], num);
         return TCL_OK;
       }
@@ -6984,7 +6984,7 @@
         // specified number exceeds the number of games, return an error:
         if (gNum == 0) { return TCL_OK; }
         if (gNum > db->numGames) {
-            return errorResult (ti, "Invalid game number.");
+            return errorResult (ti, "Ungültige Partienummer.");
         }
         gNum--;   // Set numbering to be from 0, rather than 1.
         if (argc == 4) {  // Get current flag value:
@@ -7027,7 +7027,7 @@
 sc_game_import (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_game import <pgn-text>");
+        return errorResult (ti, "Aufruf: sc_game import <pgn-text>");
     }
     PgnParser parser (argv[2]);
     errorT err = parser.ParseGame (db->game);
@@ -7041,13 +7041,13 @@
     }
     db->gameAltered = true;
     if (err == OK  &&  parser.ErrorCount() == 0) {
-        return setResult (ti, "PGN text imported with no errors or warnings.");
+        return setResult (ti, "PGN-Text ohne Fehler oder Warnungen importiert");
     }
-    Tcl_AppendResult (ti, "Errors/warnings importing PGN text:\n",
+    Tcl_AppendResult (ti, "Fehler/Warnungen beim Import des PGN-Texts:\n",
                           parser.ErrorMessages(), NULL);
     if (err == ERROR_NotFound) {
-        Tcl_AppendResult (ti, "ERROR: No PGN header tag (e.g. ",
-                          "[Result \"1-0\"]) found.", NULL);
+        Tcl_AppendResult (ti, "FEHLER: Kein Kennzeichen für den PGN-Kopf gefunden (z.B. ",
+                          "[Result \"1-0\"]).", NULL);
     }
     return (err == OK ? TCL_OK : TCL_ERROR);
 }
@@ -7873,7 +7873,7 @@
 {
     bool showProgress = startProgressBar();
     if (argc < 5  &&  argc > 7) {
-        return errorResult (ti, "Usage: sc_game list <start> <count> <format> [<bool> [<file>]]");
+        return errorResult (ti, "Aufruf: sc_game list <start> <count> <format> [<bool> [<file>]]");
     }
     if (! db->inUse) { return TCL_OK; }
 
@@ -7889,7 +7889,7 @@
     if (argc == 7) {
 	fp = fopen (argv[6], "w");
 	if (fp == NULL) {
-	    Tcl_AppendResult (ti, "Error opening file: ", argv[6], NULL);
+	    Tcl_AppendResult (ti, "Fehler beim Öffnen der Datei: ", argv[6], NULL);
 	    return TCL_ERROR;
 	}
     }
@@ -8018,7 +8018,7 @@
         return errorResult (ti, errMsgNotOpen(ti));
     }
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_game load <gameNumber>");
+        return errorResult (ti, "Aufruf: sc_game load <gameNumber>");
     }
 
     sc_game_undo_reset(db);
@@ -8039,7 +8039,7 @@
 
     // Check the game number is valid::
     if (gnum < 1  ||  gnum > db->numGames) {
-        return errorResult (ti, "Invalid game number.");
+        return errorResult (ti, "Ungültige Partienummer.");
     }
 
     // We number games from 0 internally, so subtract one:
@@ -8052,7 +8052,7 @@
         return errorResult (ti, errorStr);
     }
     if (db->game->Decode (db->bbuf, GAME_DECODE_ALL) != OK) {
-        sprintf (errorStr, "Error decoding game %u.", gnum+1);
+        sprintf (errorStr, "Fehler beim Dekodieren der Partie %u.", gnum+1);
         return errorResult (ti, errorStr);
     }
 
@@ -8084,7 +8084,7 @@
 int
 sc_game_merge (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_game merge <baseNum> <gameNum> [<endPly>]";
+    const char * usage = "Aufruf: sc_game merge <baseNum> <gameNum> [<endPly>]";
     scidBaseT * base = db;
     if (argc < 4  ||  argc > 5) { return errorResult (ti, usage); }
 
@@ -8098,10 +8098,10 @@
 
     // Check we have a valid database and game number:
     if (! base->inUse) {
-        return errorResult (ti, "The selected database is not open.");
+        return errorResult (ti, "Die gewählte Datenbank ist nicht geöffnet.");
     }
     if (gnum < 1  ||  gnum > base->numGames) {
-        return errorResult (ti, "Invalid game number.");
+        return errorResult (ti, "Ungültige Partienummer.");
     }
     // Number games from 0 internally:
     gnum--;
@@ -8108,13 +8108,13 @@
 
     // Check that the specified game can be merged:
     if (base == db  &&  (int)gnum == db->gameNumber) {
-        return errorResult (ti, "Game cannot be merged into itself.");
+        return errorResult (ti, "Partie kann nicht mit sich selbst verschmolzen werden.");
     }
     if (db->game->AtStart()  &&  db->game->AtEnd()) {
-        return errorResult (ti, "The current game has no moves.");
+        return errorResult (ti, "Die aktuelle Partie hat keine Züge.");
     }
     if (db->game->HasNonStandardStart()) {
-        return errorResult (ti, "The current game has a non-standard start position.");
+        return errorResult (ti, "Die aktuelle Partie hat keine Standardausgangsstellung.");
     }
 
     // Load the merge game:
@@ -8123,12 +8123,12 @@
     base->bbuf->Empty();
     if (base->gfile->ReadGame (base->bbuf, ie->GetOffset(),
                                ie->GetLength()) != OK) {
-        return errorResult (ti, "Error loading game.");
+        return errorResult (ti, "Fehler beim Laden der Partie.");
     }
     Game * merge = scratchGame;
     merge->Clear();
     if (merge->Decode (base->bbuf, GAME_DECODE_NONE) != OK) {
-        return errorResult (ti, "Error decoding game.");
+        return errorResult (ti, "Fehler beim Dekodieren der Partie.");
     }
     merge->LoadStandardTags (ie, base->nb);
 
@@ -8164,7 +8164,7 @@
     delete[] mergeBoards;
 
     if (matchPly == 0) {
-        return errorResult (ti, "No matching position found.");
+        return errorResult (ti, "Keine passende Stellung gefunden.");
     }
 
     // Now the games match at the locations matchPly in the current
@@ -8237,7 +8237,7 @@
     uint MAXMOVES = g->GetCurrentPly() + 10; // overhead
     sanStringT * moveStrings = new sanStringT [MAXMOVES];
 
-    const char * usage = "Usage: sc_game moves [coord | nonums]";
+    const char * usage = "Aufruf: sc_game moves [coord | nonums]";
 
     if (argc > 3) {
         return errorResult (ti, usage);
@@ -8349,7 +8349,7 @@
         translate (ti, "NoveltyNone", "No novelty was found for this game");
 
     const char * usage =
-        "Usage: sc_game novelty [-older|-all] [-updatelabel <label>] [base]";
+        "Aufruf: sc_game novelty [-older|-all] [-updatelabel <label>] [base]";
 
     bool olderGamesOnly = false;
     dateT currentDate = db->game->GetDate();
@@ -8385,11 +8385,11 @@
     }
 
     if (! base->inUse) {
-        return errorResult (ti, "The selected database is not open.");
+        return errorResult (ti, "Die gewählte Datenbank ist nicht geöffnet.");
     }
 
     if (db->game->HasNonStandardStart()) {
-        return errorResult (ti, "This game has a non-standard start position.");
+        return errorResult (ti, "Diese Partie hat keine Standardausgangsstellung.");
     }
 
     if (updateLabel != NULL) {
@@ -8491,7 +8491,7 @@
 
             if (base->gfile->ReadGame (db->bbuf, ie->GetOffset(),
                                      ie->GetLength()) != OK) {
-                return errorResult (ti, "Error reading game file.");
+                return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
             }
             if (g->ExactMatch (pos, db->bbuf, NULL)) {
                 foundMatch = true;
@@ -8571,8 +8571,8 @@
     while (thisArg < argc) {
         int index = strUniqueMatch (argv[thisArg], options);
         if (index == -1) {
-            Tcl_AppendResult (ti, "Invalid option to sc_game pgn: ",
-                              argv[thisArg], "; valid options are: ", NULL);
+            Tcl_AppendResult (ti, "Ungültige Option für sc_game pgn: ",
+                              argv[thisArg], "; gültige Optionen sind: ", NULL);
             for (const char ** s = options; *s != NULL; s++) {
                 Tcl_AppendResult (ti, *s, " ", NULL);
             }
@@ -8581,8 +8581,8 @@
 
         // Check that our option has a value:
         if (thisArg+1 == argc) {
-            Tcl_AppendResult (ti, "Invalid option value: sc_game pgn ",
-                              options[index], " requires a value.", NULL);
+            Tcl_AppendResult (ti, "Ungültige Option: sc_game pgn ",
+                              options[index], " erfordert einen Wert.", NULL);
             return TCL_ERROR;
         }
 
@@ -8596,7 +8596,7 @@
                 base = &(dbList[value - 1]);
             }
             if (! base->inUse) {
-                return setResult (ti, "The selected database is not in use.");
+                return setResult (ti, "Die gewählte Datenbank ist nicht in Benutzung.");
             }
             g = base->game;
 
@@ -8606,7 +8606,7 @@
             g = scratchGame;
             g->Clear();
             if (value < 1  ||  value > base->numGames) {
-                return setResult (ti, "Invalid game number");
+                return setResult (ti, "Ungültige Partienummer");
             }
             IndexEntry * ie = base->idx->FetchEntry (value - 1);
             if (ie->GetLength() == 0) {
@@ -8614,10 +8614,10 @@
             }
             if (base->gfile->ReadGame (base->bbuf, ie->GetOffset(),
                                      ie->GetLength()) != OK) {
-                return errorResult (ti, "Error reading game file.");
+                return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
             }
             if (g->Decode (base->bbuf, GAME_DECODE_ALL) != OK) {
-                return errorResult (ti, "Error decoding game.");
+                return errorResult (ti, "Fehler beim Dekodieren der Partie.");
             }
             g->LoadStandardTags (ie, base->nb);
 
@@ -8624,7 +8624,7 @@
         } else if (index == OPT_FORMAT) {
             // The option value should be "plain", "html" or "latex".
             if (! g->SetPgnFormatFromString (argv[thisArg+1])) {
-                return errorResult (ti, "Invalid -format option.");
+                return errorResult (ti, "Ungültige -format-Option.");
             }
 
         } else {
@@ -8658,7 +8658,7 @@
                 case OPT_STRIPBRACES:
                     bitmask = PGN_STYLE_STRIP_BRACES;    break;
                 default: // unreachable!
-                    return errorResult (ti, "Invalid option.");
+                    return errorResult (ti, "Ungültige Option.");
             };
             if (bitmask > 0) {
                 if (value) {
@@ -8748,7 +8748,7 @@
 int
 sc_game_reorder (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_game reorder GameNum GameDest.";
+    const char * usage = "Aufruf: sc_game reorder GameNum GameDest.";
 
     if ( argc != 4 ) {
         Tcl_AppendResult (ti, usage, NULL);
@@ -8757,7 +8757,7 @@
 
     // unneeded  / wrong ?
     if (!db->idx->AllInMemory()) {
-      Tcl_AppendResult (ti, "NOT in memory", NULL);
+      Tcl_AppendResult (ti, "NICHT im Speicher", NULL);
       return TCL_ERROR;
     }
 
@@ -8765,19 +8765,19 @@
     int direction;
 
     if (sscanf (argv[2], "%u", &gnum ) != 1 || gnum == 0) {
-	Tcl_AppendResult (ti, "Game Reorder: invalid game number.", NULL);
+	Tcl_AppendResult (ti, "Neuordnung Partie: ungültige Partienummer.", NULL);
         return TCL_ERROR;
     }
     gnum--;
 
     if (sscanf (argv[3], "%u", &newgame ) != 1 || newgame == 0 || newgame > db->numGames ) {
-	Tcl_AppendResult (ti, "Game Reorder: invalid destination.", NULL);
+	Tcl_AppendResult (ti, "Neuordnung Partie: ungültiges Ziel.", NULL);
         return TCL_ERROR;
     }
     newgame--;
 
     if (newgame == gnum) {
-	Tcl_AppendResult (ti, "Game Reorder: game and destination are the same.", NULL);
+	Tcl_AppendResult (ti, "Neuordnung Partie: Partie und Ziel sind gleich", NULL);
         return TCL_ERROR;
     }
 
@@ -8805,12 +8805,12 @@
 	ie_next_Filter = db->filter->Get(i + direction);
 
 	if (ie_next == NULL) {
-	  Tcl_AppendResult (ti, "Game Reorder: game out of bounds, bad.", NULL);
+	  Tcl_AppendResult (ti, "Neuordnung Partie: Partie außerhalb Grenzen, schlecht.", NULL);
 	  return TCL_ERROR;
 	}
 
         if (db->idx->WriteEntries (ie_next, i, 1) != OK) {
-          Tcl_AppendResult (ti, "Game Reorder: error writing index file.", NULL);
+          Tcl_AppendResult (ti, "Neuordnung Partie: Fehler beim Schreiben der Indexdatei.", NULL);
           return TCL_ERROR;
         }
 
@@ -8820,7 +8820,7 @@
     // Write original game to new position
 
     if (db->idx->WriteEntries (&ie_gnum, newgame, 1) != OK) {
-      Tcl_AppendResult (ti, "Game Reorder: error writing source game into index file.", NULL);
+      Tcl_AppendResult (ti, "Neuordnung Partie: Fehler beim Schreiben der Ursprungspartie in die Indexdatei.", NULL);
       return TCL_ERROR;
     }
 
@@ -8873,10 +8873,10 @@
     errorT result;
     if ((result = game->Encode (base->bbuf, &iE)) != OK) {
       if (result == ERROR_GameFull) {
-	sprintf (temp, "Error encoding game. Game size %u, Max game size %u. \n", base->bbuf->GetByteCount(), MAX_GAME_LENGTH);
+	sprintf (temp, "Fehler beim Kodieren der Partie. Game size %u, Max game size %u. \n", base->bbuf->GetByteCount(), MAX_GAME_LENGTH);
         Tcl_AppendResult (ti, temp, NULL);
       } else {
-        Tcl_AppendResult (ti, "Error encoding game.\n", NULL);
+        Tcl_AppendResult (ti, "Fehler beim Kodieren der Partie.\n", NULL);
       }
       return TCL_ERROR;
     }
@@ -8905,7 +8905,7 @@
     // Now try writing the game to the gfile:
     uint offset = 0;
     if (base->gfile->AddGame (base->bbuf, &offset) != OK) {
-        Tcl_AppendResult (ti, "Error writing game file.", NULL);
+        Tcl_AppendResult (ti, "Fehler beim Schreiben der Partiedatei.", NULL);
         return TCL_ERROR;
     }
     iE.SetOffset (offset);
@@ -8986,7 +8986,7 @@
     // writing them now would then be a waste of time.
 
     if (base->idx->WriteEntries (&iE, gNumber, 1) != OK) {
-        Tcl_AppendResult (ti, "Error writing index file.", NULL);
+        Tcl_AppendResult (ti, "Fehler beim Schreiben der Indexdatei.", NULL);
         return TCL_ERROR;
     }
 
@@ -9052,7 +9052,7 @@
     // Now try writing the game to the gfile:
     uint offset = 0;
     if (base->gfile->AddGame (bbuf, &offset) != OK) {
-        Tcl_AppendResult (ti, "Error writing game file.", NULL);
+        Tcl_AppendResult (ti, "Fehler beim Schreiben der Partiedatei.", NULL);
         return TCL_ERROR;
     }
     iE.SetOffset (offset);
@@ -9066,7 +9066,7 @@
     // WHITE:
 	s = srcIe->GetWhiteName( sourceBase->nb);  if (!s) { s = "?"; }
     if (base->nb->AddName (NAME_PLAYER, s, &id) == ERROR_NameBaseFull) {
-        Tcl_AppendResult (ti, "Too many player names.", NULL);
+        Tcl_AppendResult (ti, "Zuviele Spielernamen.", NULL);
         return TCL_ERROR;
     }
     base->nb->IncFrequency (NAME_PLAYER, id, 1);
@@ -9075,7 +9075,7 @@
     // BLACK:
     s = srcIe->GetBlackName( sourceBase->nb);  if (!s) { s = "?"; }
     if (base->nb->AddName (NAME_PLAYER, s, &id) == ERROR_NameBaseFull) {
-        Tcl_AppendResult (ti, "Too many player names.", NULL);
+        Tcl_AppendResult (ti, "Zuviele Spielernamen.", NULL);
         return TCL_ERROR;
     }
     base->nb->IncFrequency (NAME_PLAYER, id, 1);
@@ -9084,7 +9084,7 @@
     // EVENT:
     s = srcIe->GetEventName( sourceBase->nb);  if (!s) { s = "?"; }
     if (base->nb->AddName (NAME_EVENT, s, &id) == ERROR_NameBaseFull) {
-        Tcl_AppendResult (ti, "Too many event names.", NULL);
+        Tcl_AppendResult (ti, "Zuviele Veranstaltungsnamen.", NULL);
         return TCL_ERROR;
     }
     base->nb->IncFrequency (NAME_EVENT, id, 1);
@@ -9093,7 +9093,7 @@
     // SITE:
     s = srcIe->GetSiteName( sourceBase->nb);  if (!s) { s = "?"; }
     if (base->nb->AddName (NAME_SITE, s, &id) == ERROR_NameBaseFull) {
-        Tcl_AppendResult (ti, "Too many site names.", NULL);
+        Tcl_AppendResult (ti, "Zuviele Ortsnamen.", NULL);
         return TCL_ERROR;
     }
     base->nb->IncFrequency (NAME_SITE, id, 1);
@@ -9102,7 +9102,7 @@
     // ROUND:
     s = srcIe->GetRoundName( sourceBase->nb);  if (!s) { s = "?"; }
     if (base->nb->AddName (NAME_ROUND, s, &id) == ERROR_NameBaseFull) {
-        Tcl_AppendResult (ti, "Too many round names.", NULL);
+        Tcl_AppendResult (ti, "Zuviele Rundennamen.", NULL);
         return TCL_ERROR;
     }
     base->nb->IncFrequency (NAME_ROUND, id, 1);
@@ -9113,7 +9113,7 @@
     // writing them now would then be a waste of time.
 
     if (base->idx->WriteEntries (&iE, gNumber, 1) != OK) {
-        Tcl_AppendResult (ti, "Error writing index file.", NULL);
+        Tcl_AppendResult (ti, "Fehler beim Schreiben der Indexdatei.", NULL);
         return TCL_ERROR;
     }
 
@@ -9143,7 +9143,7 @@
 {
 
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_game save <gameNumber>");
+        return errorResult (ti, "Aufruf: sc_game save <gameNumber>");
     }
     if (! db->inUse) {
         return errorResult (ti, errMsgNotOpen(ti));
@@ -9157,8 +9157,8 @@
     if (gnum > db->numGames) {
         char tempStr[20];
         sprintf (tempStr, "%u", db->numGames);
-        Tcl_AppendResult (ti, "Invalid game number; there are only ",
-                          tempStr, " games in this database.", NULL);
+        Tcl_AppendResult (ti, "Ungültige Partienummer; es gibt nur ",
+                          tempStr, " Partien in dieser Datenbank.", NULL);
         return TCL_ERROR;
     }
 
@@ -9167,10 +9167,10 @@
     db->gfile->FlushAll();
     db->game->RestoreState ();
     if (db->idx->WriteHeader() != OK) {
-        return errorResult (ti, "Error writing index file.");
+        return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
     }
     if (! db->memoryOnly  &&  db->nb->WriteNameFile() != OK) {
-        return errorResult (ti, "Error writing name file.");
+        return errorResult (ti, "Fehler beim Schreiben der Namendatei.");
     }
 
     if (gnum == 0) {
@@ -9258,7 +9258,7 @@
     bool inv_b = false;
 
     if (argc != 4)
-        return errorResult (ti, "Usage: sc_game scores invert_white invert_black");
+        return errorResult (ti, "Aufruf: sc_game scores invert_white invert_black");
 
     inv_w = atoi (argv[2]);
     inv_b = atoi (argv[3]);
@@ -9283,7 +9283,7 @@
 sc_game_values (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3)
-        return errorResult (ti, "Usage: sc_game values <type>");
+        return errorResult (ti, "Aufruf: sc_game values <type>");
 
     int moveCounter = 0;
 
@@ -9333,7 +9333,7 @@
     if (argc == 2) {
         return setBoolResult (ti, db->game->HasNonStandardStart());
     } else if (argc != 3) {
-        return errorResult (ti, "Usage: sc_game startBoard <fenString>");
+        return errorResult (ti, "Aufruf: sc_game startBoard <fenString>");
     }
     const char * str = argv[2];
     if (strIsPrefix ("random:", str)) {
@@ -9342,12 +9342,12 @@
         // set of material is generated. For example, "random:krpkr"
         // generates a random legal Rook+Pawn-vs-Rook position.
         if (scratchPos->Random (str+7) != OK) {
-            return errorResult (ti, "Invalid material string.");
+            return errorResult (ti, "Ungültiger String für Material.");
         }
     } else {
         if (scratchPos->ReadFromFEN (str) != OK) {
             if (scratchPos->ReadFromLongStr (str) != OK) {
-                return errorResult (ti, "Invalid FEN string.");
+                return errorResult (ti, "Ungültiger FEN-String.");
             }
         }
         // ReadFromFEN checks that there is one king of each side, but it
@@ -9357,10 +9357,10 @@
            squareT wk = scratchPos->GetKingSquare (WHITE);
            squareT bk = scratchPos->GetKingSquare (BLACK);
            if (square_Adjacent (wk, bk)) {
-               return errorResult (ti, "Illegal position: adjacent kings.");
+               return errorResult (ti, "Ungültige Stellung: beisammenstehende Könige.");
            }
            // No adjacent kings, so enemy king must be in check.
-           return errorResult (ti, "Illegal position: enemy king in check.");
+           return errorResult (ti, "Ungültige Stellung: gegnerischer König im Schach.");
         }
     }
     db->game->SetStartPos (scratchPos);
@@ -9386,7 +9386,7 @@
 sc_game_strip (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     const char * usage =
-        "Usage: sc_game strip [comments|variations] [all|filter]";
+        "Aufruf: sc_game strip [comments|variations] [all|filter]";
 
     const char * options[] = { "comments", "variations", NULL };
     enum { OPT_COMS, OPT_VARS };
@@ -9430,7 +9430,7 @@
 	parser.Reset ((const char *) db->tbuf->GetBuffer());
 	scratchGame->Clear();
 	if (parser.ParseGame (scratchGame)) {
-	    return errorResult (ti, "Error: unable to strip this game.");
+	    return errorResult (ti, "Fehler: kann für diese Partie nichts entfernen.");
 	}
 	parser.Reset ((const char *) db->tbuf->GetBuffer());
 	db->game->Clear();
@@ -9500,7 +9500,7 @@
 
 	    // Load the game.
 	    if (db->gfile->ReadGame (db->bbuf, ie->GetOffset(), ie->GetLength()) != OK) {
-		return errorResult (ti, "Error reading game file.");
+		return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
 	    }
 	    g->Clear();
 	    if (g->Decode (db->bbuf, GAME_DECODE_ALL) != OK)
@@ -9521,7 +9521,7 @@
 // necessary ??
 	    db->gfile->FlushAll();
 	    if (db->idx->WriteHeader() != OK) {
-		return errorResult (ti, "Error writing index file.");
+		return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
 	    }
 
 	}
@@ -9532,7 +9532,7 @@
 // 
 // !!!!!!!!!!!!!!!!!!! S.A. 28/9/2020
     if (! db->memoryOnly  &&  db->nb->WriteNameFile() != OK) {
-        return errorResult (ti, "Error writing name file.");
+        return errorResult (ti, "Fehler beim Schreiben der Namendatei.");
     }
 
     db->gameAltered = false;
@@ -9573,7 +9573,7 @@
 int
 sc_game_summary (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_game summary [-base <baseNum>] [-gameNumber <gameNum>] header|boards|moves";
+    const char * usage = "Aufruf: sc_game summary [-base <baseNum>] [-gameNumber <gameNum>] header|boards|moves";
 
     const char * options[] = {
         "-base", "-gameNumber", NULL
@@ -9618,20 +9618,20 @@
         g = scratchGame;
         // Load the specified game number:
         if (! base->inUse) {
-            return errorResult (ti, "This database is not in use.");
+            return errorResult (ti, "Diese Datenbank ist nicht in Benutzung.");
         }
         if (gnum > base->numGames) {
-            return errorResult (ti, "Invalid game number.");
+            return errorResult (ti, "Ungültige Partienummer.");
         }
         gnum--;
         IndexEntry * ie = base->idx->FetchEntry (gnum);
         base->bbuf->Empty();
         if (base->gfile->ReadGame (base->bbuf, ie->GetOffset(), ie->GetLength()) != OK) {
-            return errorResult (ti, "Error loading game.");
+            return errorResult (ti, "Fehler beim Laden der Partie.");
         }
         g->Clear();
         if (g->Decode (base->bbuf, GAME_DECODE_COMMENTS) != OK) {
-            return errorResult (ti, "Error decoding game.");
+            return errorResult (ti, "Fehler beim Dekodieren der Partie.");
         }
         g->LoadStandardTags (ie, base->nb);
     }
@@ -9809,7 +9809,7 @@
         T_EDate, T_EYear, T_EMonth, T_EDay, T_Extra
     };
 
-    const char * usage = "Usage: sc_game tags get [-last] <tagName>";
+    const char * usage = "Aufruf: sc_game tags get [-last] <tagName>";
     const char * tagName;
     Game * g = db->game;
 
@@ -9832,10 +9832,10 @@
             IndexEntry * ie = db->idx->FetchEntry (prevgame);
             if (db->gfile->ReadGame (db->bbuf, ie->GetOffset(),
                                      ie->GetLength()) != OK) {
-                return errorResult (ti, "Error reading game file.");
+                return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
             }
             if (g->Decode (db->bbuf, GAME_DECODE_ALL) != OK) {
-                return errorResult (ti, "Error decoding game.");
+                return errorResult (ti, "Fehler beim Dekodieren der Partie.");
             }
             g->LoadStandardTags (ie, db->nb);
         }
@@ -9971,7 +9971,7 @@
 
     int arg = 3;
     if (((argc-arg) % 2) != 0) {
-        return errorResult (ti, "Odd number of parameters.");
+        return errorResult (ti, "Ungerade Anzahl Parameter.");
     }
 
     // Process each pair of parameters:
@@ -10012,7 +10012,7 @@
                     if (Tcl_SplitList (ti, value, &largc,
                                        (CONST84 char ***) &largv) != TCL_OK) {
                         // Error from Tcl_SplitList!
-                        return errorResult (ti, "Error parsing extra tags.");
+                        return errorResult (ti, "Fehler beim Parsen von Extra-Tags.");
                     }
 
                     // Extract each tag-value pair and add it to the game:
@@ -10073,7 +10073,7 @@
 sc_game_tags_share (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     const char * usage =
-        "Usage: sc_game tags share [check|update] <gameNumber1> <gameNumber2>";
+        "Aufruf: sc_game tags share [check|update] <gameNumber1> <gameNumber2>";
     if (argc != 6) { return errorResult (ti, usage); }
     bool updateMode = false;
     if (strIsPrefix (argv[3], "check")) {
@@ -10372,7 +10372,7 @@
 
     case INFO_VALIDDATE:
         if (argc != 3) {
-            return errorResult (ti, "Usage: sc_info validDate <datestring>");
+            return errorResult (ti, "Aufruf: sc_info validDate <datestring>");
         }
         setBoolResult (ti, date_ValidString (argv[2]));
         break;
@@ -10386,7 +10386,7 @@
         break;
     case INFO_LANGUAGE:
       if (argc != 3) {
-        return errorResult (ti, "Usage: sc_info language <lang>");
+        return errorResult (ti, "Aufruf: sc_info language <lang>");
       }
       if ( strcmp(argv[2], "en") == 0) {language = 0;}
       if ( strcmp(argv[2], "fr") == 0) {language = 1;}
@@ -10421,7 +10421,7 @@
 sc_info_fsize (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_info fsize <filename>");
+        return errorResult (ti, "Aufruf: sc_info fsize <filename>");
     }
     const char * fname = argv[2];
     const char * lastSuffix = strFileSuffix (fname);
@@ -10460,7 +10460,7 @@
 
     MFile pgnFile;
     if (pgnFile.Open (fname, FMODE_ReadOnly) != OK) {
-        return errorResult (ti, "Error opening file");
+        return errorResult (ti, "Fehler beim Öffnen der Datei");
     }
 
     const uint maxBytes = 65536;
@@ -10470,7 +10470,7 @@
     if (pgnFile.ReadNBytes (buffer, bytes) != OK) {
         pgnFile.Close();
         delete[] buffer;
-        return errorResult (ti, "Error reading file");
+        return errorResult (ti, "Fehler beim Lesen der Datei");
     }
     pgnFile.Close();
 
@@ -10592,7 +10592,7 @@
 sc_info_priority (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
 #ifdef _WIN32
-    const char * usage = "Usage: sc_info priority <pid> [normal|idle]";
+    const char * usage = "Aufruf: sc_info priority <pid> [normal|idle]";
     if (argc < 3  ||  argc > 4) { return errorResult (ti, usage); }
 
     int pid = strGetInteger(argv[2]);
@@ -10609,7 +10609,7 @@
         // Try to obtain a process handle for setting the priority class:
         HANDLE hProcess = OpenProcess (PROCESS_SET_INFORMATION, false, pid);
         if (hProcess == NULL) {
-            return errorResult (ti, "Unable to set process priority.");
+            return errorResult (ti, "Prozeßpriorität kann nicht gesetzt werden.");
         }
 
         // Set the process class to NORMAL or IDLE:
@@ -10620,7 +10620,7 @@
     // Now return the process priority:
     HANDLE hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, false, pid);
     if (hProcess == NULL) {
-        return errorResult (ti, "Unable to get process priority.");
+        return errorResult (ti, "Prozeßpriorität kann nicht ermittelt werden.");
     }
     uint priorityClass = GetPriorityClass (hProcess);
     CloseHandle (hProcess);
@@ -10637,7 +10637,7 @@
 
 #else  // #ifdef _WIN32
 
-    const char * usage = "Usage: sc_info priority <pid> [<priority>]";
+    const char * usage = "Aufruf: sc_info priority <pid> [<priority>]";
     if (argc < 3  ||  argc > 4) { return errorResult (ti, usage); }
 
     int pid = strGetInteger(argv[2]);
@@ -10646,7 +10646,7 @@
         // Try to assign a new priority:
         int newpriority = strGetInteger(argv[3]);
         if (setpriority (PRIO_PROCESS, pid, newpriority) != 0) {
-            return errorResult (ti, "Unable to set process priority.");
+            return errorResult (ti, "Prozeßpriorität kann nicht gesetzt werden.");
         }
     }
     // Now return the process priority:
@@ -10695,7 +10695,7 @@
 sc_info_tb (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     const char * usage =
-        "Usage: sc_info tb [<directory>|available <material>|cache <size-kb>]";
+        "Aufruf: sc_info tb [<directory>|available <material>|cache <size-kb>]";
 
     if (argc == 2) {
         // Command: sc_info tb
@@ -10808,7 +10808,7 @@
 
     case MOVE_PLY:
         if (argc != 3) {
-            return errorResult (ti, "Usage: sc_move ply <plynumber>");
+            return errorResult (ti, "Aufruf: sc_move ply <plynumber>");
         }
         {
             uint ply = strGetUnsigned (argv[2]);
@@ -10835,7 +10835,7 @@
 {
 
     if (argc != 5) {
-        return errorResult (ti, "Usage: sc_move add <sq> <sq> <promo>");
+        return errorResult (ti, "Aufruf: sc_move add <sq> <sq> <promo>");
     }
 
     uint sq1 = strGetUnsigned (argv[2]);
@@ -10864,7 +10864,7 @@
             return TCL_OK;
         }
     }
-    return errorResult (ti, "Error adding move.");
+    return errorResult (ti, "Fehler beim Hinzufügen eines Zuges.");
 }
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -10889,7 +10889,7 @@
         parser.SetResultWarnings (false);
         errorT err = parser.ParseMoves (db->game, buf, 1000);
         if (err != OK  ||  parser.ErrorCount() > 0) {
-            Tcl_AppendResult (ti, "Error reading move(s): ", *argPtr, NULL);
+            Tcl_AppendResult (ti, "Fehler beim Lesen von Zug/Zügen: ", *argPtr, NULL);
             return TCL_ERROR;
         }
         db->gameAltered = true;
@@ -11014,7 +11014,7 @@
 sc_move_pgn (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_move pgn <offset>");
+        return errorResult (ti, "Aufruf: sc_move pgn <offset>");
     }
     db->tbuf->Empty();
     db->tbuf->SetWrapColumn (99999);
@@ -11218,7 +11218,7 @@
 sc_pos_addNag (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_pos addNag <nagvalue>");
+        return errorResult (ti, "Aufruf: sc_pos addNag <nagvalue>");
     }
     const char * nagStr = argv[2];
     byte nag = game_parseNag (nagStr);
@@ -11241,7 +11241,7 @@
 int
 sc_pos_analyze (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_pos analyze [<option> <value> ...]";
+    const char * usage = "Aufruf: sc_pos analyze [<option> <value> ...]";
 
     uint searchTime = 1000;   // Default = 1000 milliseconds
     uint hashTableKB = 1024;  // Default: one-megabyte hash table.
@@ -11335,7 +11335,7 @@
 sc_pos_bestSquare (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_pos bestSquare <square>");
+        return errorResult (ti, "Aufruf: sc_pos bestSquare <square>");
     }
 
     Position * pos = db->game->GetCurrentPos();
@@ -11347,7 +11347,7 @@
       if (sqInt >= 0  &&  sqInt <= 63) { sq = sqInt; }
     }
     if (sq == NULL_SQUARE) {
-        return errorResult (ti, "Usage: sc_pos bestSquare <square>");
+        return errorResult (ti, "Aufruf: sc_pos bestSquare <square>");
     }
 
     // Generate all legal moves:
@@ -11447,7 +11447,7 @@
 int
 sc_pos_hash (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_pos hash [full|pawn]";
+    const char * usage = "Aufruf: sc_pos hash [full|pawn]";
     bool pawnHashOnly = false;
     if (argc > 3) { return errorResult (ti, usage); }
     if (argc == 3) {
@@ -11476,7 +11476,7 @@
 int
 sc_pos_html (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_pos html [-flip <boolean>] [-path <path>] [<style:0|1>]";
+    const char * usage = "Aufruf: sc_pos html [-flip <boolean>] [-path <path>] [<style:0|1>]";
     uint style = htmlDiagStyle;
     bool flip = false;
     int arg = 2;
@@ -11534,7 +11534,7 @@
         return setBoolResult (ti, db->game->AtVarEnd());
 
     default:
-        return errorResult (ti, "Usage: sc_pos isAt start|end|vstart|vend");
+        return errorResult (ti, "Aufruf: sc_pos isAt start|end|vstart|vend");
     }
     return TCL_OK;
 }
@@ -11547,7 +11547,7 @@
 sc_pos_isPromo (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 4) {
-        return errorResult (ti, "Usage: sc_move isPromo <square> <square>");
+        return errorResult (ti, "Aufruf: sc_move isPromo <square> <square>");
     }
 
     Position * pos = db->game->GetCurrentPos();
@@ -11555,7 +11555,7 @@
     int toSq = strGetInteger (argv[3]);
 
     if (fromSq < A1  ||  fromSq > H8  ||  toSq < A1  ||  toSq > H8) {
-        return errorResult (ti, "Usage: sc_move isPromo <square> <square>");
+        return errorResult (ti, "Aufruf: sc_move isPromo <square> <square>");
     }
 
     setBoolResult (ti, pos->IsPromoMove ((squareT) fromSq, (squareT) toSq));
@@ -11567,7 +11567,7 @@
 sc_pos_isInsufficient (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 2)
-        return errorResult (ti, "Usage: sc_pos isInsufficient");
+        return errorResult (ti, "Aufruf: sc_pos isInsufficient");
 
     Position * pos = db->game->GetCurrentPos();
     uint numPieces = pos->TotalMaterial();
@@ -11589,7 +11589,7 @@
 sc_pos_isLegal (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 4) {
-        return errorResult (ti, "Usage: sc_pos isLegal <square> <square>");
+        return errorResult (ti, "Aufruf: sc_pos isLegal <square> <square>");
     }
 
     Position * pos = db->game->GetCurrentPos();
@@ -11620,7 +11620,7 @@
 sc_pos_matchMoves (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3  &&  argc != 4) {
-        return errorResult (ti, "Usage: sc_pos matchMoves <movetext-prefix>");
+        return errorResult (ti, "Aufruf: sc_pos matchMoves <movetext-prefix>");
     }
     bool coordMoves = false;
     const char * prefix = argv[2];
@@ -11711,7 +11711,7 @@
 sc_pos_moves (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 2) {
-        return errorResult (ti, "Usage: sc_pos moves");
+        return errorResult (ti, "Aufruf: sc_pos moves");
     }
     Position * p = db->game->GetCurrentPos();
     sanListT sanList;
@@ -11727,7 +11727,7 @@
 sc_pos_moves_uci (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 2) {
-        return errorResult (ti, "Usage: sc_pos moves");
+        return errorResult (ti, "Aufruf: sc_pos moves");
     }
     Position * p = db->game->GetCurrentPos();
     sanListT sanList;
@@ -11749,7 +11749,7 @@
 sc_pos_pgnBoard (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_pos pgnBoard <pgn-text>");
+        return errorResult (ti, "Aufruf: sc_pos pgnBoard <pgn-text>");
     }
 
     Game * g = scratchGame;
@@ -11784,7 +11784,7 @@
 int
 sc_pos_probe (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_pos probe [score|report|optimal|board <sq>]";
+    const char * usage = "Aufruf: sc_pos probe [score|report|optimal|board <sq>]";
     static const char * options[] = {
         "score", "report", "optimal", "board", NULL
     };
@@ -11833,7 +11833,7 @@
 int
 sc_pos_probe_board (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_pos probe board <square>";
+    const char * usage = "Aufruf: sc_pos probe board <square>";
 
     Position * pos = scratchPos;
     pos->CopyFrom (db->game->GetCurrentPos());
@@ -11885,7 +11885,7 @@
 sc_pos_setComment (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_pos setComment <comment-text>");
+        return errorResult (ti, "Aufruf: sc_pos setComment <comment-text>");
     }
     const char * str = argv[2];
     const char * oldComment = db->game->GetMoveComment();
@@ -11944,7 +11944,7 @@
 
     default:
         return errorResult (ti,
-                "Usage: sc_progressBar [canvas tagName width height]");
+                "Aufruf: sc_progressBar [canvas tagName width height]");
     }
     return TCL_OK;
 }
@@ -12014,7 +12014,7 @@
 
     if (! NameBase::IsValidNameType(nt)) {
         return errorResult (ti,
-                "Usage: sc_name correct p|e|s|r <corrections>");
+                "Aufruf: sc_name correct p|e|s|r <corrections>");
     }
     if (!db->inUse) {
         return errorResult (ti, errMsgNotOpen(ti));
@@ -12085,7 +12085,7 @@
         delete[] startDate;
         delete[] endDate;
 
-        return setResult (ti, "No valid corrections were found.");
+        return setResult (ti, "Es wurden keine gültigen Korrekturen gefunden.");
     }
 
     // Write the name file first, for safety:
@@ -12093,7 +12093,7 @@
         delete[] newIDs;
         delete[] startDate;
         delete[] endDate;
-        return errorResult (ti, "Error writing name file.");
+        return errorResult (ti, "Fehler beim Schreiben der Namendatei.");
     }
 
     // Now go through the index making each necessary change:
@@ -12183,7 +12183,7 @@
 		delete[] newIDs;
 		delete[] startDate;
 		delete[] endDate;
-                return errorResult (ti, "Error writing index file.");
+                return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
             }
         }
     }
@@ -12193,16 +12193,13 @@
     delete[] endDate;
 
     if (db->idx->WriteHeader() != OK) {
-        return errorResult (ti, "Error writing index file.");
+        return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
     }
 
     recalcNameFrequencies (db->nb, db->idx);
     char temp[100];
-    sprintf (temp, "%u %s name%s occurring %u time%s in total were corrected.",
-             correctionCount,
-             NAME_TYPE_STRING[nt],
-             strPlural (correctionCount),
-             instanceCount, strPlural (instanceCount));
+    sprintf (temp, "%u %snamen, die insgesamt %u mal vorkamen, wurden berichtigt.",
+             correctionCount, NAME_TYPE_STRING[nt], instanceCount);
     Tcl_AppendResult (ti, temp, NULL);
     if (datefailedCount > 0) {
       sprintf (temp, "\n\n%u player name changes were ignored because of player age/game date considerations.", datefailedCount);
@@ -12225,7 +12222,7 @@
 int
 sc_name_edit (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_name edit <type> <editSelection> <oldName> <newName> <useStringMatch>";
+    const char * usage = "Aufruf: sc_name edit <type> <editSelection> <oldName> <newName> <useStringMatch>";
 
     if (!db->inUse) {
         return errorResult (ti, errMsgNotOpen(ti));
@@ -12301,11 +12298,11 @@
 
     // dont' allow globbing player names or EDIT_ALL
     if (glob && (option == OPT_PLAYER || option == OPT_RATING)) {
-      Tcl_AppendResult (ti, "Using '*' to match Player names is not allowed.",NULL);
+      Tcl_AppendResult (ti, "Verwendung von '*' für die Abdeckung von Spielernamen ist nicht erlaubt.",NULL);
       return TCL_ERROR;
     }
     if (glob && editSelection == EDIT_ALL) {
-      Tcl_AppendResult (ti, "Using '*' to match names is potentially harmful, and not allowed with 'All games'." , NULL);
+      Tcl_AppendResult (ti, "Verwendung von '*' für die Abdeckung von Namen ist eventuell gefährlich und nicht mit 'Alle Partien' erlaubt." , NULL);
       return TCL_ERROR;
     }
 
@@ -12314,7 +12311,7 @@
     // skip this check is we useStringMatch or option == OPT_DATE ||  option == OPT_EVENTDATE
     if (! useStringMatch && option != OPT_DATE && option != OPT_EVENTDATE) {
         if (db->nb->FindExactName (nt, oldName, &oldID) != OK) {
-            Tcl_AppendResult (ti, "The ", NAME_TYPE_STRING[nt], " name \"", oldName, "\" does not exist.", NULL);
+            Tcl_AppendResult (ti, "Der ", NAME_TYPE_STRING[nt], " Name \"", oldName, "\" existiert nicht", NULL);
             return TCL_ERROR;
         }
     }
@@ -12325,10 +12322,10 @@
     if (editSelection == EDIT_CTABLE) {
         Game * g = db->game;
         if (db->nb->FindExactName (NAME_EVENT, g->GetEventStr(), &eventId) != OK) {
-            return errorResult (ti, "There are no crosstable games.");
+            return errorResult (ti, "Es gibt keine Partien für die Kreuztabelle.");
         }
         if (db->nb->FindExactName (NAME_SITE, g->GetSiteStr(), &siteId) != OK) {
-            return errorResult (ti, "There are no crosstable games.");
+            return errorResult (ti, "Es gibt keine Partien für die Kreuztabelle.");
         }
 
         if (date_GetMonthDay (g->GetDate()) == 0) {
@@ -12346,12 +12343,12 @@
     idNumberT newID = 0;
     if (option != OPT_RATING  &&  option != OPT_DATE  &&  option != OPT_EVENTDATE) {
         if (db->nb->AddName (nt, newName, &newID) == ERROR_NameBaseFull) {
-            return errorResult (ti, "Name file is full; cannot add name.");
+            return errorResult (ti, "Namendatei ist voll; Name kann nicht hinzugefügt werden.");
         }
 
         // Write the namebase to disk, if this is not a memory-only database:
         if (! db->memoryOnly  &&  db->nb->WriteNameFile() != OK) {
-            return errorResult (ti, "Error writing name file.");
+            return errorResult (ti, "Fehler beim Schreiben der Namendatei.");
         }
     }
 
@@ -12500,7 +12497,7 @@
         // Write this entry if any edits were made:
         if (edits != 0) {
             if (db->idx->WriteEntries (&newIE, i, 1) != OK) {
-                return errorResult (ti, "Error writing index file.");
+                return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
             }
             if (option != OPT_RATING  &&  option != OPT_DATE && option != OPT_EVENTDATE) {
                 db->nb->IncFrequency (nt, newID, edits);
@@ -12511,7 +12508,7 @@
     }
 
     if (db->idx->WriteHeader() != OK) {
-        return errorResult (ti, "Error writing index file.");
+        return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
     }
 
     char temp[500];
@@ -12532,7 +12529,7 @@
 int
 sc_name_retrievename (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usageStr = "Usage: sc_name retrievename <player>";
+    const char * usageStr = "Aufruf: sc_name retrievename <player>";
     SpellChecker * spChecker = spellChecker[NAME_PLAYER];
 
     if (argc != 3 ) { return errorResult (ti, usageStr); }
@@ -12571,7 +12568,7 @@
 {
     static char * lastPlayerName = NULL;
     // this needs overhauling S.A
-    const char * usageStr = "Usage: sc_name info [-ratings[:YEAR] -elo:ELO|-htext] <player> ";
+    const char * usageStr = "Aufruf: sc_name info [-ratings[:YEAR] -elo:ELO|-htext] <player> ";
     uint startYear = 1900;
     uint startElo = 0;
     extern spellingT countryTable[];
@@ -12834,7 +12831,7 @@
 
 	    // Birthyear
 	    if (*t_year) {
-	      Tcl_AppendResult (ti, startHeading, "Born:	", endHeading, t_year, newline, NULL);
+	      Tcl_AppendResult (ti, startHeading, "Geboren:	", endHeading, t_year, newline, NULL);
 	    }
 
 	}
@@ -13469,7 +13466,7 @@
 sc_name_match (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     const char * usage = \
-        "Usage: sc_name match [-elo] <nameType> <prefix> <maxMatches>";
+        "Aufruf: sc_name match [-elo] <nameType> <prefix> <maxMatches>";
 
     int arg = 2;
     int argsleft = argc - 2;
@@ -13598,7 +13595,7 @@
 int
 sc_name_plist (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
-    const char * usage = "Usage: sc_name plist [-<option> <value> ...]";
+    const char * usage = "Aufruf: sc_name plist [-<option> <value> ...]";
 
     const char * namePrefix = "";
     const char * country = "";
@@ -13608,7 +13605,6 @@
     uint minElo = 0;
     uint maxElo = MAX_ELO;
     uint maxListSize = db->nb->GetNumNames(NAME_PLAYER);
-    extern spellingT countryTable[];
 
     if (! db->inUse) { return errorResult (ti, errMsgNotOpen(ti)); }
     if (db->numGames == 0) { return TCL_OK; }
@@ -13829,14 +13825,14 @@
         return errorResult (ti, errMsgReadOnly(ti));
     }
     if (sp == NULL) {
-        Tcl_AppendResult (ti, "A spellcheck file has not been loaded.\n\n",
-                          "You can load one from the Options menu.", NULL);
+        Tcl_AppendResult (ti, "Eine Schreibkorrekturdatei wurde nicht geladen\n\n",
+                          "Sie können eine aus dem Optionenmenü wählen.", NULL);
         return TCL_ERROR;
     }
     if (! sp->HasEloData()) {
-        Tcl_AppendResult (ti, "The current spelling file does not have Elo ratings.\n\n",
-                          "Please load \"ratings.ssp\" (available from the Scid website) ",
-                          "as your spellcheck file.", NULL);
+        Tcl_AppendResult (ti, "Die aktuelle Schreibkorrekturdatei hat keine ELO-Ratings.\n\n",
+                          "Bitte laden Sie \"ratings.ssp\" (auf der Scid-Webseite verfügbar) ",
+                          "als Ihre Schreibkorrekturdatei", NULL);
 
         return TCL_ERROR;
     }
@@ -13908,7 +13904,7 @@
                     newIE.SetBlackRatingType (RATING_Elo);
                 }
                 if (db->idx->WriteEntries (&newIE, gnum, 1) != OK) {
-                    return errorResult (ti, "Error writing index file.");
+                    return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
                 }
             }
         }
@@ -13940,7 +13936,7 @@
     }
 
     if (argc > 5) {
-        return errorResult (ti, "Usage: sc_name read <spellcheck-file> [-checkPlayerOrder <bool>]");
+        return errorResult (ti, "Aufruf: sc_name read <spellcheck-file> [-checkPlayerOrder <bool>]");
     }
     const char * filename = argv[2];
     bool checkPlayerOrder = false;
@@ -13961,7 +13957,7 @@
         if (temp_spellChecker->ReadSpellCheckFile (filename, checkPlayerOrder) != OK) {
             delete temp_spellChecker;
             Tcl_ResetResult (ti);
-            return errorResult (ti, "Error reading name spellcheck file.");
+            return errorResult (ti, "Fehler beim Lesen der Schreibkorrekturdatei.");
         }
         if (spellChecker[nt] != NULL) { delete spellChecker[nt]; }
         spellChecker[nt] = temp_spellChecker;
@@ -14007,7 +14003,7 @@
     nameT nt = NAME_INVALID;
     bool doSurnames = false;
     bool ambiguous = true;
-    const char * usage = "Usage: sc_name spellcheck [-surnames <boolean>] [-ambiguous <boolean>] players|events|sites|rounds";
+    const char * usage = "Aufruf: sc_name spellcheck [-surnames <boolean>] [-ambiguous <boolean>] players|events|sites|rounds";
 
     const char * options[] = {
         "-surnames", "-ambiguous", NULL
@@ -14049,14 +14045,14 @@
         return errorResult (ti, errMsgReadOnly(ti));
     }
     if (spellChecker[nt] == NULL) {
-        Tcl_AppendResult (ti, "A spellcheck file has not been loaded.\n\n",
-                          "You can load one from the Options menu.", NULL);
+        Tcl_AppendResult (ti, "Eine Schreibkorrekturdatei wurde nicht geladen\n\n",
+                          "Sie können eine aus dem Optionenmenü wählen.", NULL);
         return TCL_ERROR;
     }
 
     NameBase * nb = db->nb;
     DString * dstr = new DString;
-    char tempStr[1024];
+    char tempStr[1100]; // must be larger than tempName, see sprintf below
     char tempName [1024];
     const char * prevCorrection = "";
     idNumberT id = 0;
@@ -14220,9 +14216,8 @@
 
     // Generate message
 
-    sprintf (tempStr, "Scid found %u %s name correction%s.",
-             correctionCount, NAME_TYPE_STRING[nt],
-             strPlural (correctionCount));
+    sprintf (tempStr, "Scid hat %u %snamenskorrekturen gefunden.",
+             correctionCount, NAME_TYPE_STRING[nt]);
     Tcl_AppendResult (ti, tempStr, NULL);
     Tcl_AppendResult (ti, "\n", dstr->Data(), NULL);
 
@@ -14266,7 +14261,7 @@
     };
 
     static const char * usage =
-        "Usage: sc_report opening|player <command> [<options...>]";
+        "Aufruf: sc_report opening|player <command> [<options...>]";
     OpTable * report = NULL;
     if (argc < 2) {
         return errorResult (ti, usage);
@@ -14285,11 +14280,11 @@
         return errorResult (ti, errMsgNotOpen(ti));
     }
     if (index >= 0  &&  index != OPT_CREATE  &&  report == NULL) {
-        return errorResult (ti, "No report has been created yet.");
+        return errorResult (ti, "Es wurde noch kein Bericht erstellt.");
     }
 
     if (index != OPT_CREATE && report->GetBase() != (uint) currentBase) {
-      return errorResult (ti, "sc_report: please select report base.");
+      return errorResult (ti, "sc_report: bitte eine Berichtsdatenbank wählen.");
       // Automatically switching requires updating gui
       // db = &(dbList[report->GetBase()]);
     }
@@ -14297,7 +14292,7 @@
     switch (index) {
     case OPT_AVGLENGTH:
         if (argc != 4) {
-            return errorResult (ti, "Usage: sc_report player|opening avgLength 1|=|0|*");
+            return errorResult (ti, "Aufruf: sc_report player|opening avgLength 1|=|0|*");
         } else {
             resultT result = strGetResult (argv[3]);
             appendUintElement (ti, report->AvgLength (result));
@@ -14307,7 +14302,7 @@
 
     case OPT_BEST:
         if (argc != 5) {
-            return errorResult (ti, "Usage: sc_report opening|player best w|b|a|o|n <count>");
+            return errorResult (ti, "Aufruf: sc_report opening|player best w|b|a|o|n <count>");
         }
         dstr = new DString;
         report->BestGames (dstr, strGetUnsigned(argv[4]), argv[3]);
@@ -14334,7 +14329,7 @@
 
     case OPT_ELO:
         if (argc != 4) {
-            return errorResult (ti, "Usage: sc_report opening|player elo white|black");
+            return errorResult (ti, "Aufruf: sc_report opening|player elo white|black");
         } else {
             colorT color = WHITE;
             uint count = 0;
@@ -14359,7 +14354,7 @@
 
     case OPT_FORMAT:
         if (argc != 4) {
-            return errorResult (ti, "Usage: sc_report opening|player format latex|html|text|ctext");
+            return errorResult (ti, "Aufruf: sc_report opening|player format latex|html|text|ctext");
         }
         report->SetFormat (argv[3]);
         break;
@@ -14366,7 +14361,7 @@
 
     case OPT_FREQ:
         if (argc != 4) {
-            return errorResult (ti, "Usage: sc_report opening|player frequency 1|=|0|*");
+            return errorResult (ti, "Aufruf: sc_report opening|player frequency 1|=|0|*");
         } else {
             resultT result = strGetResult (argv[3]);
             appendUintElement (ti, report->PercentFreq (result));
@@ -14388,11 +14383,11 @@
         } else if (argc == 4  &&  argv[3][0] == 'r') {
             return setUintResult (ti, OPTABLE_MAX_ROWS);
         }
-        return errorResult (ti, "Usage: sc_report opening|player max games|rows");
+        return errorResult (ti, "Aufruf: sc_report opening|player max games|rows");
 
     case OPT_MOVEORDERS:
         if (argc != 4) {
-            return errorResult (ti, "Usage: sc_report opening|player moveOrders <count>");
+            return errorResult (ti, "Aufruf: sc_report opening|player moveOrders <count>");
         }
         dstr = new DString;
         report->PopularMoveOrders (dstr, strGetUnsigned(argv[3]));
@@ -14401,7 +14396,7 @@
 
     case OPT_NOTES:
         if (argc < 4  ||  argc > 5) {
-            return errorResult (ti, "Usage: sc_report opening|player notes <0|1> [numrows]");
+            return errorResult (ti, "Aufruf: sc_report opening|player notes <0|1> [numrows]");
         }
         report->ClearNotes ();
         if (strGetBoolean (argv[3])  &&  report->GetNumLines() > 0) {
@@ -14419,7 +14414,7 @@
 
     case OPT_PLAYERS:
         if (argc != 5) {
-            return errorResult (ti, "Usage: sc_report opening|player players w|b <count>");
+            return errorResult (ti, "Aufruf: sc_report opening|player players w|b <count>");
         } else {
             colorT color = WHITE;
             if (argv[3][0] == 'B'  ||  argv[3][0] == 'b') { color = BLACK; }
@@ -14431,7 +14426,7 @@
 
     case OPT_PRINT:
         if (argc < 3  ||  argc > 6) {
-            return errorResult (ti, "Usage: sc_report opening|players print [numrows] [title] [comment]");
+            return errorResult (ti, "Aufruf: sc_report opening|players print [numrows] [title] [comment]");
         }
         report->GuessNumRows ();
         if (argc > 3) {
@@ -14494,7 +14489,7 @@
     uint maxTableLines = OPTABLE_MAX_TABLE_LINES;
     uint maxLines = OPTABLE_MAX_LINES;
     static const char * usage =
-        "Usage: sc_report opening|player create [maxExtraMoves] [maxTableGames] [maxGames] [excludeMove]";
+        "Aufruf: sc_report opening|player create [maxExtraMoves] [maxTableGames] [maxGames] [excludeMove]";
 
     uint reportType = 0;
     if (argc < 2) {
@@ -14560,10 +14555,10 @@
         IndexEntry * ie = db->idx->FetchEntry (gnum);
         if (ply != 0) {
             if (db->gfile->ReadGame (db->bbuf, ie->GetOffset(), ie->GetLength()) != OK) {
-                return errorResult (ti, "Error reading game file.");
+                return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
             }
             if (scratchGame->Decode (db->bbuf, GAME_DECODE_ALL) != OK) {
-                return errorResult (ti, "Error decoding game.");
+                return errorResult (ti, "Fehler beim Dekodieren der Partie.");
             }
             scratchGame->LoadStandardTags (ie, db->nb);
             scratchGame->MoveToPly (ply - 1);
@@ -14594,7 +14589,7 @@
 sc_report_select (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     static const char * usage =
-        "Usage: sc_report opening|player select <eg|note|mo|theme|all> <number>";
+        "Aufruf: sc_report opening|player select <eg|note|mo|theme|all> <number>";
     if (argc != 5) {
         return errorResult (ti, usage);
     }
@@ -14694,7 +14689,7 @@
 sc_tree_best (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 7) {
-        return errorResult (ti, "Usage: sc_tree best <baseNum> <count> <results> <sort> <formatStr>");
+        return errorResult (ti, "Aufruf: sc_tree best <baseNum> <count> <results> <sort> <formatStr>");
     }
 
     scidBaseT * base = db;
@@ -14870,7 +14865,7 @@
 sc_tree_clean (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc < 3 || argc > 4) {
-        return errorResult (ti, "Usage: sc_tree clean <baseNum> [updateFilter]");
+        return errorResult (ti, "Aufruf: sc_tree clean <baseNum> [updateFilter]");
     }
 
     scidBaseT * base = db;
@@ -14922,7 +14917,7 @@
 sc_tree_move (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 4) {
-        return errorResult (ti, "Usage: sc_tree move <baseNum> <lineNum>");
+        return errorResult (ti, "Aufruf: sc_tree move <baseNum> <lineNum>");
     }
 
     scidBaseT * base = db;
@@ -15009,7 +15004,7 @@
     }
 
     if (base->treeCache->WriteFile (base->fileName) != OK) {
-        return errorResult (ti, "Error writing Scid tree cache file.");
+        return errorResult (ti, "Fehler beim Schreiben der Cache-Datei für den Scid-Baum.");
     }
     return setUintResult (ti, fileSize (base->fileName, TREEFILE_SUFFIX));
 }
@@ -15072,7 +15067,7 @@
 sc_tree_search (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     static const char * usageStr =
-	"Usage: sc_tree search [-hideMoves <0|1>] [-sort alpha|eco|frequency|score] [-time <0|1>] [-epd <0|1>] [-list <0|1>] [-fastmode <0|1>] [-adjust <0|1>] [-short <0|1>] [-base <baseNumber>]";
+	"Aufruf: sc_tree search [-hideMoves <0|1>] [-sort alpha|eco|frequency|score] [-time <0|1>] [-epd <0|1>] [-list <0|1>] [-fastmode <0|1>] [-adjust <0|1>] [-short <0|1>] [-base <baseNumber>]";
 
       // Sort options: these should match the moveSortE enumerated type.
       static const char * sortOptions[] = {
@@ -15322,7 +15317,7 @@
 		    // Check for exceeding max number of nodes:
 		    if (search >= MAX_TREE_NODES) {
 			    search_pool.erase(&base);
-			    return errorResult (ti, "Too many moves.");
+			    return errorResult (ti, "Zuviele Züge.");
 		    }
 
 		    if (search == tree->moveCount) {
@@ -15693,7 +15688,7 @@
 sc_tree_cachesize (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
   if (argc != 4) {
-    return errorResult (ti, "Usage: sc_tree cachesize <base> <size>");
+    return errorResult (ti, "Aufruf: sc_tree cachesize <base> <size>");
   }
   scidBaseT * base = NULL;
   int baseNum = strGetInteger (argv[2]);
@@ -15712,7 +15707,7 @@
 sc_tree_cacheinfo (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
   if (argc != 3) {
-    return errorResult (ti, "Usage: sc_tree cacheinfo <base>");
+    return errorResult (ti, "Aufruf: sc_tree cacheinfo <base>");
   }
   scidBaseT * base = NULL;
   int baseNum = strGetInteger (argv[2]);
@@ -15804,7 +15799,7 @@
 sc_search_board (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     const char * usageStr =
-	"Usage: sc_search board <filterOp> <searchType> <searchInVars> <flip> [<base>]";
+	"Aufruf: sc_search board <filterOp> <searchType> <searchInVars> <flip> [<base>]";
     bool showProgress = startProgressBar();
     if (!db->inUse) {
         return errorResult (ti, errMsgNotOpen(ti));
@@ -15976,7 +15971,7 @@
         // At this point, the game needs to be loaded:
         if (db->gfile->ReadGame (db->bbuf, ie->GetOffset(),
                                  ie->GetLength()) != OK) {
-            return errorResult (ti, "Error reading game file.");
+            return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
         }
         uint ply = 0;
         if (useVars) {
@@ -16057,7 +16052,7 @@
 sc_search_moves (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     const char * usageStr =
-	"Usage: sc_search moves <filterOp> <moves> <checkTest> <sideToMove>";
+	"Aufruf: sc_search moves <filterOp> <moves> <checkTest> <sideToMove>";
     bool showProgress = startProgressBar();
     char **m_argv;
     int m_argc;
@@ -16070,7 +16065,7 @@
 
     filterOpT filterOp = strGetFilterOp (argv[2]);
 
-    // argv[3] is move list
+    // argv[3] is move list Hier weiter
     if (Tcl_SplitList (ti, argv[3], &m_argc, (CONST84 char ***) &m_argv) != TCL_OK) {
 	Tcl_AppendResult (ti, "Error splitting movelist.", NULL);
 	return TCL_ERROR;
@@ -16150,7 +16145,7 @@
         // At this point, the game needs to be loaded:
         if (db->gfile->ReadGame (db->bbuf, ie->GetOffset(),
                                  ie->GetLength()) != OK) {
-            return errorResult (ti, "Error reading game file.");
+            return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
         }
 
 	g->Decode (db->bbuf, GAME_DECODE_NONE);
@@ -16195,7 +16190,7 @@
 {
     uint gameNum;
     const char * usageStr =
-      "Usage: sc_search cql <filterOp> <stripSwitch> <silentSwitch> <syntax>";
+      "Aufruf: sc_search cql <filterOp> <stripSwitch> <silentSwitch> <syntax>";
     bool showProgress = startProgressBar();
 
     if (argc != 6)
@@ -16317,7 +16312,7 @@
 
         // Load the game.
         if (db->gfile->ReadGame (db->bbuf, ie->GetOffset(), ie->GetLength()) != OK) {
-            return errorResult (ti, "Error reading game file.");
+            return errorResult (ti, "Fehler beim Lesen der Partiendatei.");
         }
 
         g->Decode (db->bbuf, GAME_DECODE_ALL); // variations, comments and non-standards
@@ -16378,13 +16373,13 @@
     if (dirtyFlag) {
         db->gfile->FlushAll();
         if (db->idx->WriteHeader() != OK) {
-            return errorResult (ti, "Error writing index file.");
+            return errorResult (ti, "Fehler beim Schreiben der Indexdatei.");
         }
         // Not sure this is absolutely necessary, only that counts are
         // bumped up and down when game is replaced.  But why should that
         // matter... it's a wash.
         if (! db->memoryOnly  &&  db->nb->WriteNameFile() != OK) {
-            return errorResult (ti, "Error writing name file.");
+            return errorResult (ti, "Fehler beim Schreiben der Namendatei.");
         }
     }
 
@@ -16539,7 +16534,7 @@
 {
     bool showProgress = startProgressBar();
     if (! db->inUse) {
-        return errorResult (ti, "Not an open database.");
+        return errorResult (ti, "Keine geöffnete Datenbank.");
     }
 
     uint minMoves = 0;
@@ -16667,7 +16662,7 @@
             return InvalidCommand (ti, "sc_search material", options);
         }
     }
-    if (arg != argc) { return errorResult (ti, "Odd number of parameters."); }
+    if (arg != argc) { return errorResult (ti, "Ungerade Anzahl Parameter."); }
 
     // Sanity check of values:
     if (max[WQ] < min[WQ]) { max[WQ] = min[WQ]; }
@@ -18022,12 +18017,12 @@
 {
 
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_var deletefree <number>");
+        return errorResult (ti, "Aufruf: sc_var deletefree <number>");
     }
 
     uint varNumber = strGetUnsigned (argv[2]);
     if (varNumber >= db->game->GetNumVariations()) {
-        return errorResult (ti, "No such variation!");
+        return errorResult (ti, "Keine solche Variante!");
     }
     db->game->DeleteVariationAndFree (varNumber);
     db->gameAltered = true;
@@ -18042,12 +18037,12 @@
 {
 
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_var delete <number>");
+        return errorResult (ti, "Aufruf: sc_var delete <number>");
     }
 
     uint varNumber = strGetUnsigned (argv[2]);
     if (varNumber >= db->game->GetNumVariations()) {
-        return errorResult (ti, "No such variation!");
+        return errorResult (ti, "Keine solche Variante!");
     }
     db->game->DeleteVariation (varNumber);
     db->gameAltered = true;
@@ -18061,12 +18056,12 @@
 sc_var_first (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_var first <number>");
+        return errorResult (ti, "Aufruf: sc_var first <number>");
     }
 
     uint varNumber = strGetUnsigned (argv[2]);
     if (varNumber >= db->game->GetNumVariations()) {
-        return errorResult (ti, "No such variation!");
+        return errorResult (ti, "Keine solche Variante!");
     }
     db->game->FirstVariation (varNumber);
     db->gameAltered = true;
@@ -18100,12 +18095,12 @@
 sc_var_enter (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_var enter <number>");
+        return errorResult (ti, "Aufruf: sc_var enter <number>");
     }
 
     uint varNumber = strGetUnsigned (argv[2]);
     if (varNumber >= db->game->GetNumVariations()) {
-        return errorResult (ti, "No such variation!");
+        return errorResult (ti, "Keine solche Variante!");
     }
 
     db->game->MoveIntoVariation (varNumber);
@@ -18126,12 +18121,12 @@
 sc_var_promote (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_var promote <number>");
+        return errorResult (ti, "Aufruf: sc_var promote <number>");
     }
 
     uint varNumber = strGetUnsigned (argv[2]);
     if (varNumber >= db->game->GetNumVariations()) {
-        return errorResult (ti, "No such variation!");
+        return errorResult (ti, "Keine solche Variante!");
     }
     db->game->MainVariation (varNumber);
     db->gameAltered = true;
@@ -18186,7 +18181,7 @@
 sc_book_load (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 4) {
-        return errorResult (ti, "Usage: sc_book load bookfile slot");
+        return errorResult (ti, "Aufruf: sc_book load bookfile slot");
     }
 
     uint slot = strGetUnsigned (argv[3]);
@@ -18194,7 +18189,7 @@
     int bookstate = polyglot_open(argv[2], slot);
 
     if (bookstate == -1 ) {
-       return errorResult (ti, "Unable to load book");
+       return errorResult (ti, "Buch kann nicht geladen werden");
     }
     if (bookstate  >  0 ) {
        // state == 1: book is read only
@@ -18215,11 +18210,11 @@
 sc_book_close (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_book close slot");
+        return errorResult (ti, "Aufruf: sc_book close slot");
     }
     uint slot = strGetUnsigned (argv[2]);
     if (polyglot_close(slot) == -1 ) {
-        return errorResult (ti, "Error closing book");
+        return errorResult (ti, "Fehler beim Schließen des Buches");
     }
     return TCL_OK;
 }
@@ -18234,7 +18229,7 @@
     char boardStr[100];
 
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_book moves slot");
+        return errorResult (ti, "Aufruf: sc_book moves slot");
     }
     uint slot = strGetUnsigned (argv[2]);
     db->game->GetCurrentPos()->PrintFEN (boardStr, FEN_ALL_FIELDS);
@@ -18253,7 +18248,7 @@
     char boardStr[100];
 
     if (argc != 3) {
-        return errorResult (ti, "Usage: sc_book positions slot");
+        return errorResult (ti, "Aufruf: sc_book positions slot");
     }
     uint slot = strGetUnsigned (argv[2]);
     db->game->GetCurrentPos()->PrintFEN (boardStr, FEN_ALL_FIELDS);
@@ -18270,7 +18265,7 @@
 sc_book_update (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 4) {
-        return errorResult (ti, "Usage: sc_book update <probs> slot");
+        return errorResult (ti, "Aufruf: sc_book update <probs> slot");
     }
     uint slot = strGetUnsigned (argv[3]);
     scid_book_update( (char*) argv[2], slot );
@@ -18284,7 +18279,7 @@
 sc_book_movesupdate (ClientData cd, Tcl_Interp * ti, int argc, const char ** argv)
 {
     if (argc != 6) {
-        return errorResult (ti, "Usage: sc_book movesupdate <moves> <probs> slot tempfile");
+        return errorResult (ti, "Aufruf: sc_book movesupdate <moves> <probs> slot tempfile");
     }
     uint slot = strGetUnsigned (argv[4]);
     scid_book_movesupdate( (char*) argv[2], (char*) argv[3], slot, (char*) argv[5] );
Index: tcl/bitmaps.tcl
===================================================================
--- tcl/bitmaps.tcl	(revision 3620)
+++ tcl/bitmaps.tcl	(working copy)
@@ -71,19 +71,19 @@
 ### Process custom chess pieces
 
 if {[file isdirectory $scidPiecesDir]} {
-  ::splash::add "User Pieces: reading $scidPiecesDir"
+  ::splash::add "Benutzerfiguren: lese $scidPiecesDir"
   set pwd [pwd]
   cd $scidPiecesDir
   foreach i [glob -nocomplain *] {
       if {[ catch {source $i}]} {
-        ::splash::add "Loading file $i failed"
+        ::splash::add "Laden der Datei $i fehlgeschlagen"
       } else {
-        ::splash::add "Loaded file $i"
+        ::splash::add "Datei $i geladen"
       }
   }
   cd $pwd
 } else {
-  ::splash::add "User Pieces: no such directory $scidPiecesDir"
+  ::splash::add "Benutzerfiguren: kein Verzeichnis $scidPiecesDir vorhanden"
 }
 
 # To test images use -
@@ -104978,7 +104978,7 @@
         # probably better to have a blank image than program fail
         $p$size copy $p[expr {$size/2}] -zoom 2 2
       }]} {
-        ::splash::add "Error creating $font piece size $size" error
+        ::splash::add "Fehler beim Erstellen von $font Figurengröße $size" error
       }
       incr x $size
     }
@@ -106666,7 +106666,7 @@
 set user_textures 0
 set jpg_loaded 0
 if {[file isdirectory $scidTexturesDir]} {
-  ::splash::add "User Textures: processing $scidTexturesDir"
+  ::splash::add "Benutzertexturen: verarbeite $scidTexturesDir"
   set pwd [pwd]
   cd $scidTexturesDir
   foreach i [glob -nocomplain *_l.*] {
@@ -106674,9 +106674,9 @@
     set ext  [file extension $i]
     if {[string match .jp* $ext] && !$jpg_loaded} {
       if {[ catch {package require img::jpeg}]} {
-	::splash::add "Loading package img::jpeg failed"
+	::splash::add "Laden des Pakets img::jpeg fehlgeschlagen"
       } else {
-	::splash::add "Loaded package img::jpeg"
+	::splash::add "Paket img::jpeg geladen"
       }
       set jpg_loaded 1
     }
@@ -106688,15 +106688,15 @@
 	image create photo temptexture -file $i
 	image create photo temptexture -file $j
       }]} {
-	::splash::add "   Texture $base unhandled."
+	::splash::add "   Texturen $base unbearbeitet."
 	continue
      }
       image create photo ${k}-l -file $i
       image create photo ${k}-d -file $j
-      ::splash::add "   Adding texture $base"
+      ::splash::add "   Füge Textur $base hinzu"
       incr user_textures
       if {$user_textures == 10} {
-	::splash::add "   10 user textures found (max)."
+	::splash::add "   10 Benutzertexturen gefunden (max)."
         break
       }
     }
@@ -106703,7 +106703,7 @@
   }
   cd $pwd
 } else {
-  ::splash::add "User Textures: no such directory $scidTexturesDir"
+  ::splash::add "Benutzertexturen: kein Verzeichnis $scidTexturesDir vorhanden"
 }
 
 ### end of bitmaps.tcl
Index: tcl/board.tcl
===================================================================
--- tcl/board.tcl	(revision 3621)
+++ tcl/board.tcl	(working copy)
@@ -28,7 +28,7 @@
 proc SetBackgroundColour {} {
   global defaultBackground enableBackground
 
-  set temp [tk_chooseColor -initialcolor $defaultBackground -title {Background Colour}]
+  set temp [tk_chooseColor -initialcolor $defaultBackground -title {Hintergrundfarbe}]
   if {$temp != {}} {
     set defaultBackground $temp
     if {!$enableBackground} {
@@ -949,7 +949,7 @@
     foreach i [array names toolbar_temp] { set toolbar_temp($i) 0 }
     changeToolbar 0
   }
-  checkbutton $w.big -text "Big Icons" -variable ::bigToolbar -command toggleBigToolbar
+  checkbutton $w.big -text "Große Icons" -variable ::bigToolbar -command toggleBigToolbar
 
   dialogbutton $w.ok -text OK -command {
     array set toolbar [array get toolbar_temp]
@@ -3115,7 +3115,7 @@
   if {[catch {
   package require img::window
   } result ]} {
-    set result "Screenshot requires Tcl package TkImg (libtk-img).\n\n$result"
+    set result "Bildschirmfoto erfordert Tcl-Paket TkImg (libtk-img).\n\n$result"
     tk_messageBox -type ok -icon error -title Scid -message $result
     return
   }
@@ -3163,7 +3163,7 @@
         -initialfile $filename.$format \
         -initialdir $::env(HOME) \
         -defaultextension .$format \
-        -title {Board Screenshot}]
+        -title {Schachbrettfoto}]
   }
 
   if {[llength $filename]} {
Index: tcl/config.tcl
===================================================================
--- tcl/config.tcl	(revision 3620)
+++ tcl/config.tcl	(working copy)
@@ -44,18 +44,18 @@
 
 ### Display directories
 
-::splash::add "scidShareDir is $scidShareDir"
+::splash::add "scidShareDir ist $scidShareDir"
 
 if {[file isdirectory $::scidBasesDir]} {
-  ::splash::add "scidBasesDir is $scidBasesDir"
+  ::splash::add "scidBasesDir ist $scidBasesDir"
 } else {
-  ::splash::add "scidBasesDir $scidBasesDir not found!" error
+  ::splash::add "scidBasesDir $scidBasesDir nicht gefunden!" error
 }
 
 if {[file isdirectory $::scidBooksDir]} {
-  ::splash::add "scidBooksDir is $scidBooksDir"
+  ::splash::add "scidBooksDir ist $scidBooksDir"
 } else {
-  ::splash::add "scidBooksDir $scidBooksDir not found!" error
+  ::splash::add "scidBooksDir $scidBooksDir nicht gefunden!" error
 }
 
 ### Setup for truetype (and PGN figurine) support
@@ -93,9 +93,9 @@
 }
 
 if {$graphFigurineAvailable} {
-  ::splash::add "PGN chess figures (True type fonts) enabled."
+  ::splash::add "PGN-Schachfiguren (True Type-Fonts) sind aktiv."
 } else {
-  ::splash::add "PGN chess figures (True type fonts) disabled."
+  ::splash::add "PGN-Schachfiguren (True Type-Fonts) sind nicht aktiv."
 }
 
 if {$graphFigurineAvailable} {
@@ -105,7 +105,7 @@
 
 if {$unixOS && !$macOS} {
   if {![catch {package require BWidget}]} {
-    ::splash::add "BWidget found! Enabling custom Colour Selector"
+    ::splash::add "BWidget gefunden! Aktiviere selbsterstellte Farbauswahl."
     set i 0
     foreach c $::bwidgetBackgrounds {
       ::SelectColor::setcolor $i $c
Index: tcl/contrib/ezsmtp/install.tcl
===================================================================
--- tcl/contrib/ezsmtp/install.tcl	(revision 3620)
+++ tcl/contrib/ezsmtp/install.tcl	(working copy)
@@ -22,7 +22,7 @@
     frame .f -relief raised -bd 1
     pack .f -anchor c -padx 10 -pady 10 -fill both -expand 1
 
-    label .f.lt -text "Installation Messages:"
+    label .f.lt -text "Installationsmeldungen:"
     set inst(w.t) [text .f.t -width 80 -height 14 -state disabled \
             -relief flat -bd 0]
     frame .f.sep1 -bd 1 -height 2 -relief raised
@@ -34,9 +34,9 @@
     set inst(w.ef) [frame .f.ef]
     set inst(w.e) [entry $inst(w.ef).e -width 40]
     set inst(w.yn) [frame $inst(w.ef).yn]
-    set inst(w.yn.y) [radiobutton $inst(w.yn).y -text "Yes" -value 1 \
+    set inst(w.yn.y) [radiobutton $inst(w.yn).y -text "Ja" -value 1 \
             -variable inst(radio_yn)]
-    set inst(w.yn.n) [radiobutton $inst(w.yn).n -text "No" -value 0 \
+    set inst(w.yn.n) [radiobutton $inst(w.yn).n -text "Nein" -value 0 \
             -variable inst(radio_yn)]
     pack $inst(w.yn.y) $inst(w.yn.n) -side left -padx 5
     pack $inst(w.l) -side top -padx 3 -pady 0 -anchor w
@@ -45,8 +45,8 @@
 
     frame .f.btns
     pack .f.btns -side top -anchor c -padx 3 -pady 5 -ipadx 3 -ipady 3
-    set inst(w.q) [button .f.btns.q -text " Quit " -width 12 -command exit]
-    set inst(w.b) [button .f.btns.b -text " Next > " -width 12 -command {
+    set inst(w.q) [button .f.btns.q -text " Abbruch " -width 12 -command exit]
+    set inst(w.b) [button .f.btns.b -text " Nächste > " -width 12 -command {
         set inst(response) [$inst(w.e) get]
     }]
     bind $inst(w.b) <Return> [list $inst(w.b) invoke]
Index: tcl/edit.tcl
===================================================================
--- tcl/edit.tcl	(revision 3620)
+++ tcl/edit.tcl	(working copy)
@@ -60,7 +60,7 @@
   catch {set fen [sanityCheckFENCastling [string trim $fen]]}
 
   if {$fen == ""} {
-    fenErrorDialog "The clipboard is empty.\n"
+    fenErrorDialog "Die Ablagedatenbank ist leer.\n"
     return
   }
 
@@ -88,7 +88,7 @@
 
     fenErrorDialog "\"$fen\" is not a valid FEN.
 
-FEN is the standard representation of a chess position, for example:
+FEN ist die Standarddarstellung einer Schachposition, z.B.:
 rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
 
   }
@@ -471,7 +471,7 @@
   updateBoard -pgn
 
   toplevel $w
-  wm title $w "Setup Board"
+  wm title $w "Brett aufstellen"
   setWinLocation $w
 
   set selectedSq -1
@@ -517,9 +517,9 @@
 
   if {!$::macOS} {
   frame $sl.hints
-  label $sl.hints.label2 -text {Left button - Paste} -font font_SmallItalic
-  label $sl.hints.label3 -text {Middle - Select} -font font_SmallItalic
-  label $sl.hints.label4 -text {Right button - Clear} -font font_SmallItalic
+  label $sl.hints.label2 -text {Linke Maustaste - Einfügen} -font font_SmallItalic
+  label $sl.hints.label3 -text {Mittlere Maustaste - Auswählen} -font font_SmallItalic
+  label $sl.hints.label4 -text {Rechte Maustaste - Löschen} -font font_SmallItalic
   pack $sl.hints -side top -fill x
   pack $sl.hints.label2 $sl.hints.label3 $sl.hints.label4 -side left -expand yes -fill x
   }
@@ -675,7 +675,7 @@
   # Are these bullet-proof and correct ?
   # but make them a little smaller, as they are hardly used
 
-  button $sr.b.swap -text {Swap Colours} -command {
+  button $sr.b.swap -text {Farben tauschen} -command {
     set tmp {}
     foreach char [split $setupBd {}] {
       append tmp [::utils::string::invertcase $char]
@@ -699,7 +699,7 @@
     makeSetupFen
   } -width 10 -font font_Small
 
-  button $sr.b.invert -text Invert -command {
+  button $sr.b.invert -text Invertieren -command {
     # reverse line order
     set tmp [lindex $setupBd 0] ; # sometimes setupBd has trailing side-to-move. Correct ???
     set setupBd {}
@@ -713,7 +713,7 @@
     makeSetupFen
   } -width 10 -font font_Small
 
-  button $sr.b.transpose -text Transpose -command {
+  button $sr.b.transpose -text Umstellen -command {
     # reverse each line
     set tmp [lindex $setupBd 0] ; # sometimes setupBd has trailing side-to-move. Correct ???
     set setupBd {}
Index: tcl/end.tcl
===================================================================
--- tcl/end.tcl	(revision 3621)
+++ tcl/end.tcl	(working copy)
@@ -123,7 +123,7 @@
   sc_game pop
   if {$err} {
     tk_messageBox -title Scid -type ok -icon info \
-        -message "Unable to merge the selected game:\n$result"
+        -message "Kann die gewählte Partie nicht zusammenfügen:\n$result"
     return
   }
   set merge(base) $base
@@ -146,7 +146,7 @@
   pack $w.f.text -side left -fill both -expand yes
   pack $w.f -fill both -expand yes
 
-  label $w.b.label -text "Up to move  " -font font_Regular
+  label $w.b.label -text "Am Zug      " -font font_Regular
   pack $w.b.label -side left -padx 2
   foreach i {5 10 15 20 25 30 35 40} {
     radiobutton $w.b.m$i -text [format "%2i" $i] -variable merge(ply) -value [expr {$i * 2}] \
@@ -203,9 +203,9 @@
     return 1
   } else {
     if {[winfo exists $w]} {
-      tk_messageBox -type ok -icon error -title "Error" -message "Base $base is no longer open." -parent $w
+      tk_messageBox -type ok -icon error -title "Fehler" -message "Datenbank $base ist nicht länger geöffnet." -parent $w
     } else {
-      tk_messageBox -type ok -icon error -title "Error" -message "Base $base is no longer open."
+      tk_messageBox -type ok -icon error -title "Fehler" -message "Datenbank $base ist nicht länger geöffnet."
     }
     return 0
   }
@@ -225,7 +225,7 @@
 
   toplevel $w
   wm withdraw $w
-  wm title $w "Set $exportType file export text"
+  wm title $w "Dateiexporttext für $exportType setzen"
   if {$exportType == "Latex"} {
       bind $w <F1> {helpWindow LaTeX}
   }
@@ -236,8 +236,8 @@
   set pane [::utils::pane::Create $w.pane start end 500 400 0.7]
   ::utils::pane::SetRange $w.pane 0.3 0.7
   pack $pane -side top -expand true -fill both
-  foreach f [list $pane.start $pane.end] type {start end} {
-    label $f.title -font font_Bold -text "Text at $type of $exportType file"
+  foreach f [list $pane.start $pane.end] type {Anfang Ende} {
+    label $f.title -font font_Bold -text "Text am $type der ${exportType}-Datei"
     text $f.text -wrap none  \
         -yscroll "$f.ybar set" -xscroll "$f.xbar set"
     scrollbar $f.ybar -orient vertical -command "$f.text yview"
@@ -255,18 +255,18 @@
 
   # Additional Latex options
   if {$exportType == "Latex"} {
-    label $w.descr -font font_Bold -text "LaTeX System Options"
+    label $w.descr -font font_Bold -text "LaTeX-Systemoptionen"
     pack $w.descr -side top
 
     foreach f {rendering viewer} {
       pack [frame $w.$f] -fill x -side top -pady 3
-      pack [label $w.$f.label -text "Command for $f:"] -side left
+      pack [label $w.$f.label -text "Befehl für $f:"] -side left
       pack [entry $w.$f.entry -width 30] -side right -padx 2
     }
     $w.rendering.entry insert 0  $latexRendering(engine)
     $w.viewer.entry    insert 0  $latexRendering(viewer)
 
-    button $w.buttons.default -text "Reset to Default" -command "
+    button $w.buttons.default -text "Auf Voreinstellung zurücksetzen" -command "
       $pane.start.text delete 1.0 end
       $pane.start.text insert end \$default_exportStartFile(Latex)
       $pane.end.text delete 1.0 end
@@ -286,7 +286,7 @@
     "
     addHorizontalRule $w
   } else {
-    button $w.buttons.default -text "Reset to Default" -command "
+    button $w.buttons.default -text "Auf Voreinstellung zurücksetzen" -command "
     $pane.start.text delete 1.0 end
     $pane.start.text insert end \$default_exportStartFile($exportType)
     $pane.end.text delete 1.0 end
@@ -464,7 +464,7 @@
 
   # Extra option for PGN format: handling of null moves
   if {$exportType == "PGN"} {
-    label $w.o.nullMoves -text "Convert null moves to comments"
+    label $w.o.nullMoves -text "Nullzüge in Kommentare umwandeln"
     radiobutton $w.o.convertNullMoves -text $::tr(Yes) -variable exportFlags(convertNullMoves) -value 1
     radiobutton $w.o.keepNullMoves -text $::tr(No) -variable exportFlags(convertNullMoves) -value 0
     grid $w.o.nullMoves        -row $row -column 0 -sticky w
@@ -473,7 +473,7 @@
     incr row
   }
 
-    label $w.o.utf8 -text "Character encoding"
+    label $w.o.utf8 -text "Zeichenkodierung"
     radiobutton $w.o.utf8True -text Utf-8 -variable exportFlags(utf8) -value 1
     radiobutton $w.o.utf8False -text Latin-1 -variable exportFlags(utf8) -value 0
     grid $w.o.utf8       -row $row -column 0 -sticky w
@@ -484,7 +484,7 @@
   # Extra option for HTML format: diagram image set
   if {$exportType == "HTML"} {
     label $w.o.space3 -text ""
-    label $w.o.hdiag -text "Diagram"
+    label $w.o.hdiag -text "Diagramm"
     radiobutton $w.o.hb0 -text "bitmaps" -variable exportFlags(htmldiag) -value 0
     radiobutton $w.o.hb1 -text "bitmaps2" -variable exportFlags(htmldiag) -value 1
     label $w.o.hl0 -image htmldiag0
@@ -530,13 +530,13 @@
   if {$exportFilter} {
     # Check that we have some games to export:
     if {![sc_base inUse]} {
-      tk_messageBox -title "Scid: Empty database" -type ok -icon info \
-          -message "This is an empty database, there are no games to export."
+      tk_messageBox -title "Scid: leere Datenbank" -type ok -icon info \
+          -message "Dies ist eine leere Datenbank, es gibt keine Partien zu exportieren."
       return
     }
     if {[sc_filter count] == 0} {
-      tk_messageBox -title "Scid: Filter empty" -type ok -icon info \
-          -message "The filter contains no games."
+      tk_messageBox -title "Scid: Filter leer" -type ok -icon info \
+          -message "Der Filter enthält keine Partien."
       return
     }
   }
@@ -546,10 +546,10 @@
   switch -- $exportType {
     "PGN" {
       set ftype {
-        { "PGN files" {".pgn"} }
-        { "All files" {"*"} }
+        { "PGN-Dateien" {".pgn"} }
+        { "Alle Dateien" {"*"} }
       }
-      set title "a PGN file"
+      set title "eine PGN-Datei"
       set idir $initialDir(pgn)
       set default ".pgn"
     }
@@ -556,19 +556,19 @@
     "HTML" {
       sc_info html $exportFlags(htmldiag)
       set ftype {
-        { "HTML files" {".html" ".htm"} }
-        { "All files" {"*"} }
+        { "HTML-Dateien" {".html" ".htm"} }
+        { "Alle Dateien" {"*"} }
       }
-      set title "an HTML file"
+      set title "eine HTML-Datei"
       set idir $initialDir(html)
       set default ".html"
     }
     "Latex" {
       set ftype {
-        { "LaTeX files" {".tex" ".ltx"} }
-        { "All files" {"*"} }
+        { "LaTeX-Dateien" {".tex" ".ltx"} }
+        { "Alle Dateien" {"*"} }
       }
-      set title "a LaTeX file"
+      set title "eine LaTeX-Datei"
       set idir $initialDir(tex)
       set default ".tex"
     }
@@ -577,13 +577,12 @@
   if {! [file isdirectory $idir] } {
     set idir $::env(HOME)
   }
-
   if {$exportFlags(append)} {
     set getfile tk_getOpenFile
-    set title "Add games to $title"
+    set title "Füge Partien zu $title hinzu"
   } else {
     set getfile tk_getSaveFile
-    set title "Create $title"
+    set title "Erstelle $title"
   }
   if {$fName == ""} {
     set fName [$getfile -initialdir $idir -filetypes $ftype \
@@ -616,7 +615,6 @@
       -column $exportFlags(column) -noMarkCodes $exportFlags(stripMarks) -scidFlags $exportFlags(scidFlags) \
       -convertNullMoves $exportFlags(convertNullMoves) -utf8 $exportFlags(utf8)
   }]
-
   if {$exportFilter} {
     closeProgressWindow
   }
@@ -623,7 +621,7 @@
   unbusyCursor .
 
   if {$error} {
-    tk_messageBox -title "Scid: Oops" -type ok -icon error -message "File export/save failed."
+    tk_messageBox -title "Scid: Hoppla" -type ok -icon error -message "Dateiexport/-speichern fehlgeschlagen."
   }
 
   if {$exportType == "HTML"} {
@@ -643,7 +641,7 @@
 
   if {[sc_filter count] < 1} {
     tk_messageBox -type ok -icon info -title Scid \
-      -message "There are no games in the filter."
+      -message "Es gibt keine Partien im Filter."
     return
   }
 
@@ -684,7 +682,7 @@
   pack $w.preview -side top -fill x
   pack $w.xbar -side top -fill x
   pack [frame $w.b] -side bottom -fill x -pady 5
-  dialogbutton $w.b.default -text "Default" -command {set glexport $glexportDefault}
+  dialogbutton $w.b.default -text "Voreinstellung" -command {set glexport $glexportDefault}
   dialogbutton $w.b.ok -text "OK" -command saveExportGList
   dialogbutton $w.b.close -textvar ::tr(Cancel) -command "destroy $w"
   bind $w <Escape> "destroy $w"
@@ -719,14 +717,14 @@
 
 proc saveExportGList {} {
   global glexport env
-  set ftypes {{"Text files" {.txt}} {"All files" *}}
+  set ftypes {{"Textdateien" {.txt}} {"Alle Dateien" *}}
   set fname [tk_getSaveFile -filetypes $ftypes -parent .glexport \
-               -title "Save Game List" -initialdir $env(HOME)]
+               -title "Speichere Partienliste" -initialdir $env(HOME)]
   if {$fname == ""} { return }
   set showProgress 0
   if {[sc_filter count] >= 20000} { set showProgress 1 }
   if {$showProgress} {
-    progressWindow Scid "Saving game list" $::tr(Cancel) sc_progressBar
+    progressWindow Scid "Speichere Partienliste" $::tr(Cancel) sc_progressBar
   }
   busyCursor .
 
@@ -1067,20 +1065,20 @@
 
   if {![sc_base inUse]} {
     # We can't load a game, no database is open
-    tk_messageBox -title "Scid: No database open" -type ok -icon info \
-        -message "No database is open; open or create one first."
+    tk_messageBox -title "Scid: keine Datenbank geöffnet" -type ok -icon info \
+        -message "Keine Datenbank geöffnet; öffnen oder erstellen Sie eine zuerst."
     return
   }
 
   if {[sc_base isReadOnly]} {
-    tk_messageBox -type ok -icon error -title "Scid: Oops" \
-      -message "Database \"[file tail [sc_base filename]]\" is read-only."
+    tk_messageBox -type ok -icon error -title "Scid: Hoppla" \
+      -message "Datenbank \"[file tail [sc_base filename]]\" kann nur gelesen werden."
     return
   }
 
   if {$::trialMode} {
-    tk_messageBox -type ok -icon error -title "Scid: Trial Mode" \
-      -message "Game Saves disabled in Trial Mode."
+    tk_messageBox -type ok -icon error -title "Scid: Testmodus" \
+      -message "Partie speichern ist im Testmodus nicht aktiv."
     return
   }
 
@@ -1228,7 +1226,7 @@
 
   # Eco
 
-  label $f.ecolabel -text "ECO Code"
+  label $f.ecolabel -text "ECO-Code"
   ttk::entry $f.ecoentry -width 6  -textvariable eco -justify right
   grid $f.ecolabel -row 10 -column 0 -sticky w
   grid $f.ecoentry -row 10 -column 2 -sticky w
@@ -1350,13 +1348,13 @@
 
   frame $w.buttons
   if {$gnum == 0} {
-    button $w.buttons.prev -text "As last game" -command {
+    button $w.buttons.prev -text "Als letzte Partie" -command {
     }
   }
   dialogbutton $w.buttons.save -textvar ::tr(Save) -underline 0 -command {
     if {[string is integer -strict $eyear] && ![string is integer -strict $year]} {
-      tk_messageBox -type ok -icon error -title "Scid: Oops" \
-	-message "Event date can't exist without Game date." -parent .save
+      tk_messageBox -type ok -icon error -title "Scid: Hoppla" \
+	-message "Turnierdatum kann nicht ohne Partiedatum vorhanden sein." -parent .save
     } else {
       set extraTags [.save.g.extratext get 1.0 end-1c]
       if {[gsave $gsaveNum]} {
@@ -1445,13 +1443,13 @@
       set $i "?"
     }
     if {[string bytelength [set $i]] > 255} {
-      tk_messageBox -type ok -icon info -parent .save -title "Oops" -message "\"[string totitle $i]\" is larger than 255 bytes."
+      tk_messageBox -type ok -icon info -parent .save -title "Hoppla" -message "\"[string totitle $i]\" ist größer als 255 Bytes."
       return 0
     }
     foreach j $extraTagsList {
       if {[string trim $j] != {} && ![regexp {^[^ ]*  *".*"$} [string trim $j]]} {
-	tk_messageBox -type ok -icon info -parent .save -title "Oops" -message \
-        "Tag\n  $j\nis not in format\n  TagName \"TagData\""
+	tk_messageBox -type ok -icon info -parent .save -title "Hoppla" -message \
+        "Kennzeichen\n  $j\nist nicht im Format\n  TagName \"TagData\""
 	return 0
       }
     }
@@ -1909,7 +1907,7 @@
         }
         "f"    -
         "fast" {
-          set message "Fast Database opens enabled. No Tablebases, ECO or Spelling files loaded."
+          set message "Schnelles Öffnen der Datenbank aktiviert. Keine Endspieldatenbanken, ECO- oder Rechtschreibdateien geladen."
           ::splash::add $message error
 
           set ::fastDBopen 1
@@ -1944,7 +1942,7 @@
         "dock" -
         "nodock" {} ; # handled later
         default {
-          ::splash::add "Warning: unknown option: \"$arg\"" error
+          ::splash::add "Warnung: unbekannte Option: \"$arg\"" error
         }
       }
     } else {
@@ -1973,7 +1971,7 @@
 # Try to find tablebases:
 if {$loadAtStart(tb)} {
   if {[sc_info tb]} {
-    ::splash::add "Checking for endgame tablebase files."
+    ::splash::add "Prüfe auf Dateien für Endspieldatenbank."
     set tbDirs {}
     foreach i {1 2 3 4} {
       if {$initialDir(tablebase$i) != ""} {
@@ -1987,9 +1985,9 @@
       set result [sc_info tb $tbDirs]
     }
     if {$result == 0} {
-      ::splash::add "    No tablebases were found."
+      ::splash::add "    Keine Endspieldatenbanken gefunden."
     } else {
-      ::splash::add "    Tablebases with up to $result pieces were found."
+      ::splash::add "    Endspieldatenbanken mit bis zu $result Steinen gefunden."
     }
   }
 }
@@ -2002,12 +2000,12 @@
   if {[catch { sc_eco read $ecoFile_fullname } result]} {
     # Hmmm - failed. So try "scid.eco" in the current directory:
     if {[catch {sc_eco read "scid.eco"} result]} {
-      ::splash::add "Unable to open the ECO file: $ecoFile" error
+      ::splash::add "Kann ECO-Datei nicht öffnen: $ecoFile" error
     } else {
-      ::splash::add "ECO file \"./scid.eco\" loaded: $result positions."
+      ::splash::add "ECO-Datei \"./scid.eco\" geladen: $result Stellungen."
     }
   } else {
-    ::splash::add "ECO file \"$ecoFile_fullname\"  loaded: $result positions."
+    ::splash::add "ECO-Datei \"$ecoFile_fullname\"  geladen: $result Stellungen."
   }
 }
 
@@ -2016,16 +2014,16 @@
 set spellCheckFileExists 0
 if {$loadAtStart(spell)} {
   if {[catch {sc_name read $spellCheckFile} result]} {
-    ::splash::add "Unable to load the default spellcheck file: $spellCheckFile" error
+    ::splash::add "Kann Rechtschreibdatei nicht laden: $spellCheckFile" error
   } else {
-    ::splash::add "Spellcheck file \"$spellCheckFile\" loaded:"
-    ::splash::add "    [lindex $result 0] players, [lindex $result 1] events, [lindex $result 2] sites, [lindex $result 3] rounds."
+    ::splash::add "Rechtschreibdatei \"$spellCheckFile\" geladen:"
+    ::splash::add "    [lindex $result 0] Spieler, [lindex $result 1] Turniere, [lindex $result 2] Orte, [lindex $result 3] Runden."
     set spellCheckFileExists 1
   }
 
   ### Custom photos (must be processed after spellcheck init)
   if {[file isdirectory $scidPhotosDir]} {
-    ::splash::add "Searching for custom photos (gifs) in $scidPhotosDir"
+    ::splash::add "Suche nach benutzerdefinierten Fotos (gifs) in $scidPhotosDir"
     set pwd [pwd]
     cd $scidPhotosDir
     set count 0
@@ -2064,15 +2062,15 @@
 if {$defaultDBs != {}} {
   if {$argc == 0 && $mac_args == 0} {
     if {[file readable [lindex $defaultDBs 0]] || [file readable "[lindex $defaultDBs 0].si4"]} {
-      ::splash::add "Using default bases: $defaultDBs"
+      ::splash::add "Verwende Standarddatenbanken: $defaultDBs"
       set argv $defaultDBs
       set argc [llength $argv]
     } else {
-      ::splash::add "Not loading default bases as file [lindex $defaultDBs 0] not readble." error
+      ::splash::add "Standarddatenbanken nicht geladen, da Datei [lindex $defaultDBs 0] nicht gelesen werden kann." error
       set defaultDBs {}
     }
   } else {
-    ::splash::add "Not loading default bases as other command line args."
+    ::splash::add "Standarddatenbanken aufgrund anderer Kommandozeilenargumente nicht geladen."
   }
 }
 
@@ -2097,22 +2095,22 @@
     break
   }
   if {[string match "*.epd*" $startbase]} {
-    ::splash::add "Opening EPD file: $startbase"
+    ::splash::add "Öffne EPD-Datei: $startbase"
     if {![::epd::newEpdWin openSilent $startbase]} {
-      ::splash::add "   Error opening EPD file: $startbase" error
+      ::splash::add "   Fehler beim Öffnen der EPD-Datei: $startbase" error
     }
     set initialDir(epd) [file dirname $startbase]
     ::recentFiles::add $startbase
   } elseif {[string match "*.sso" $startbase]} {
-    ::splash::add "Opening search file: $startbase"
+    ::splash::add "Öffne Suchdatei: $startbase"
     if {[catch {uplevel "#0" source $startbase} err]} {
-      ::splash::add "   Error opening $startbase: $err" error
+      ::splash::add "   Fehler beim Öffnen von $startbase: $err" error
     } else {
       after idle {::search::usefile $startbase}
     }
   } else {
     busyCursor .
-    ::splash::add "Opening database: $startbase"
+    ::splash::add "Öffne Datenbank: $startbase"
     set errMessage ""
     set err [catch { ::file::Open $startbase} errMessage]
     if {$err} {
@@ -2120,9 +2118,9 @@
       ### Umm... they are. ? S.A.
       set errMessage "$errMessage\nCould not open database \"$startbase\""
       ::splash::add $errMessage error
-      tk_messageBox -title "Scid: Oops" -type ok -icon error -message $errMessage
+      tk_messageBox -title "Scid: Hoppla" -type ok -icon error -message $errMessage
     } else {
-      ::splash::add "   Database \"$startbase\" opened: [sc_base numGames] games."
+      ::splash::add "   Datenbank \"$startbase\" geöffnet: [sc_base numGames] Partien."
       set initialDir(base) [file dirname $startbase]
       set initialDir(file) [file tail $startbase]
       # this sets initialDir(file) for all files, not just pgn...
@@ -2243,7 +2241,7 @@
 ### Hack to extract gif images out of Scid
 
 proc dumpImagesBase64 {dir} {
-  ::splash::add "Dumping images as base64 to $dir" error
+  ::splash::add "Speichere Bilder als Base64 nach $dir" error
   package require base64
   file mkdir $dir
   set images [image names]
@@ -2263,7 +2261,7 @@
 }
 
 proc dumpImages {dir} {
-  ::splash::add "Dumping images to $dir" error
+  ::splash::add "Speichere Bilder nach $dir" error
   file mkdir $dir
   set images [image names]
   foreach i $images {
Index: tcl/file/bookmark.tcl
===================================================================
--- tcl/file/bookmark.tcl	(revision 3620)
+++ tcl/file/bookmark.tcl	(working copy)
@@ -230,7 +230,7 @@
     if {[catch {set success [::file::Open $fname . 0]} result]} {
       unbusyCursor .
       tk_messageBox -icon warning -type ok -parent . \
-        -title Scid -message "Unable to load the database:\n$fname\n\n$result"
+        -title Scid -message "Datenbank kann nicht geladen werden:\n$fname\n\n$result"
       return
     }
     unbusyCursor .
@@ -259,7 +259,7 @@
   # don't reload current game if not necessary
   if {[sc_game number] != $best} {
     if {[catch {set success [::game::Load $best 0]}]} {
-      tk_messageBox -icon warning -type ok -parent . -title Scid -message "Unable to load game number: $best"
+      tk_messageBox -icon warning -type ok -parent . -title Scid -message "Kann Partie Nummer $best nicht laden"
       return
     } else {
       if {$success == -1} {
@@ -381,7 +381,7 @@
   button $w.b1.up -image bookmark_up -command {::bookmarks::EditMove up} -borderwidth 1
   button $w.b1.down -image bookmark_down -command {::bookmarks::EditMove down}
 
-  checkbutton $w.b2.displaytype -text {Nest Folders} -var bookmarks(subMenus) -command ::bookmarks::Refresh
+  checkbutton $w.b2.displaytype -text {Verzeichnisse verschachteln} -var bookmarks(subMenus) -command ::bookmarks::Refresh
 
   dialogbutton $w.b2.ok     -text OK -command ::bookmarks::EditDone
   dialogbutton $w.b2.help   -text $::tr(Help) -command {helpWindow Bookmarks}
@@ -580,7 +580,7 @@
   if  {[catch {open $filename w} f]} {
     if {$reportError} {
       tk_messageBox -title Scid -type ok -icon warning \
-        -message "Unable to write bookmarks file: $filename\n$f"
+        -message "Kann Lesezeichendatei nicht schreiben: $filename\n$f"
     }
     return
   }
Index: tcl/file/epd.tcl
===================================================================
--- tcl/file/epd.tcl	(revision 3620)
+++ tcl/file/epd.tcl	(working copy)
@@ -107,8 +107,8 @@
 
     if {[sc_epd available] < 1} {
       if {$showErrors} {
-        tk_messageBox -type ok -icon info -title "Too many EPD files open" \
-            -message "You already have $maxEpd EPD files open; close one first."
+        tk_messageBox -type ok -icon info -title "Zuviele EPD-Dateien geöffnet" \
+            -message "Sie haben schon $maxEpd EPD-Dateien geöffnet; bitte zuerst eine schließen."
       }
       return 0
     }
@@ -124,9 +124,9 @@
         set ::initialDir(epd) $::env(HOME)
       }
       if {$cmd == "create"} {
-        set fname [tk_getSaveFile -initialdir $::initialDir(epd) -filetypes $new_types -title "Create an EPD file"]
+        set fname [tk_getSaveFile -initialdir $::initialDir(epd) -filetypes $new_types -title "EPD-Datei erstellen"]
       } elseif {$cmd == "open"} {
-        set fname [tk_getOpenFile -initialdir $::initialDir(epd) -filetypes $open_types -title "Open an EPD file"]
+        set fname [tk_getOpenFile -initialdir $::initialDir(epd) -filetypes $open_types -title "EPD-Datei öffnen"]
       } else {
         return 0
       }
@@ -136,7 +136,7 @@
     # initialize the pbook internals
     if {[catch {sc_epd $cmd $fname} result]} {
       if {$showErrors} {
-        tk_messageBox -type ok -icon error -title "Scid: EPD file error" \
+        tk_messageBox -type ok -icon error -title "Scid: EPD-Dateifehler" \
             -message $result
       }
       # TODO - Handle case when fname is already open.  Currently, "epd open" fails,
@@ -154,7 +154,7 @@
     setWinLocation $w
     setWinSize $w
 
-    wm title $w "EPD file: $epdName($id)"
+    wm title $w "EPD-Datei: $epdName($id)"
     wm minsize $w 40 1
 
     frame $w.grid
@@ -191,8 +191,8 @@
     set m $w.menu.file
     $m add command -label [tr FileNew] -underline 0 -command {::epd::newEpdWin create}
     $m add command -label [tr FileOpen] -underline 0 -command {::epd::newEpdWin open}
-    $m add command -label $tr(Save) -acc "control-s" -underline 0 -command "::epd::saveEpdWin $id"
-    $m add command -label $tr(Close) -acc "control-w" -underline 0 -command "::epd::closeEpdWin $id"
+    $m add command -label $tr(Save) -acc "Strg-s" -underline 0 -command "::epd::saveEpdWin $id"
+    $m add command -label $tr(Close) -acc "Strg-w" -underline 0 -command "::epd::closeEpdWin $id"
     wm protocol $w WM_DELETE_WINDOW "::epd::closeEpdWin $id"
     bind $w <Destroy> "
       wm protocol $w WM_DELETE_WINDOW {}
@@ -200,14 +200,14 @@
     "
 
     set m $w.menu.tools
-    $m add command -label $tr(PasteAnal) -accelerator "control-P" -underline 0 -command "::epd::pasteAnalysis $id"
-    $m add command -label $tr(SortOpcodes) -accel "control-S" -underline 0 -command "::epd::sortEpdText $id"
-    $m add command -label $tr(AddPosition) -accel "control-A" -underline 0 -command "::epd::addPosition $id"
-    $m add command -label $tr(FindPos) -underline 5 -command "::epd::moveToDeepestMatch $id"
+    $m add command -label $tr(PasteAnal) -accelerator "Strg-P" -underline 0 -command "::epd::pasteAnalysis $id"
+    $m add command -label $tr(SortOpcodes) -accel "Strg-S" -underline 0 -command "::epd::sortEpdText $id"
+    $m add command -label $tr(AddPosition) -accel "Strg-A" -underline 0 -command "::epd::addPosition $id"
+    $m add command -label $tr(FindPos) -underline 0 -command "::epd::moveToDeepestMatch $id"
     $m add separator
 
     $m add command -label $tr(AnalPosition) -underline 5 -command "::epd::configAnnotateEpd $id"
-    $m add command -label $tr(StripOpcodes) -accel "control-O" -underline 6 -command "::epd::chooseStripField $id"
+    $m add command -label $tr(StripOpcodes) -accel "Strg-O" -underline 8 -command "::epd::chooseStripField $id"
 
     $w.menu.help add command -label "EPD [tr Help]" -underline 0 -acc "F1" -command "helpWindow EPD"
     $w.menu.help add command -label [tr HelpIndex] -underline 0 -command "helpWindow Index"
@@ -227,9 +227,9 @@
 
     # Right-mouse button cut/copy/paste menu:
     menu $w.text.edit -tearoff 0
-    $w.text.edit add command -label "Cut"  -command "tk_textCut $w.text"
-    $w.text.edit add command -label "Copy" -command "tk_textCopy $w.text"
-    $w.text.edit add command -label "Paste" -command "tk_textPaste $w.text"
+    $w.text.edit add command -label "Ausschneiden"  -command "tk_textCut $w.text"
+    $w.text.edit add command -label "Kopieren" -command "tk_textCopy $w.text"
+    $w.text.edit add command -label "Einfügen" -command "tk_textPaste $w.text"
     bind $w.text <ButtonPress-3> "tk_popup $w.text.edit %X %Y"
 
     bind $w <F1> { helpWindow EPD }
@@ -294,7 +294,7 @@
       addHorizontalRule $w
       pack [frame $w.bottom] -expand 1 -fill x -side bottom
 
-      label $w.top.txt -text "This EPD file has been altered.\nDo you wish to save it?"
+      label $w.top.txt -text "Diese EPD-Datei wurde geändert.\nWollen Sie sie speichern?"
       pack $w.top.txt -padx 5 -pady 5 -side right
 
       button $w.bottom.b1 -width 10 -text $::tr(Save)     -command {destroy .confirmEPDExit ; set ::epd::answer 0}
@@ -335,8 +335,8 @@
     #if { [.epd$id.text edit modified] } { storeEpdText $id }
 
     if {[sc_epd readonly $id]} {
-      tk_messageBox -type ok -icon error -title "EPD file error" \
-        -message "Save failed\nEPD file is read-only."
+      tk_messageBox -type ok -icon error -title "EPD-Dateifehler" \
+        -message "Speichern fehlgeschlagen\nDie EPD-Datei ist nur lesbar."
     } else {
       sc_epd write $id
     }
@@ -547,7 +547,7 @@
       return
     }
     toplevel $w
-    wm title $w "Analyze EPD"
+    wm title $w "EPD-Analyse"
     placeWinOverParent $w .epd$id
 
     frame $w.seconds
@@ -582,7 +582,7 @@
       set i \[$w.engine.combo current\]
       set isUCI \[lindex \[lindex \$engines(list) \$i\] 7\]
       if {!\$isUCI} {
-        tk_messageBox -type ok -icon info -title Oops -message {Only UCI engines supported} -parent .epdAnnotateConfig
+        tk_messageBox -type ok -icon info -title Hoppla -message {Es werden nur UCI-Engines unterstützt} -parent .epdAnnotateConfig
         return
       }
       set name \[$w.engine.combo get\]
@@ -611,7 +611,7 @@
     set epdEngineName [string map {{ } _} $name]
 
     set epdAnnotation 1
-    $w.bottom.status configure -text "Analyzing with $epdEngineName ($epdDelay secs/move)"
+    $w.bottom.status configure -text "Analysiere mit $epdEngineName ($epdDelay sek/Zug)"
     update
 
     if {$epdAnnotateMode != 1} {
@@ -790,16 +790,16 @@
 
     if {! [winfo exists .epd$id]} { return }
     set w [toplevel .epdStrip]
-    wm title $w "Strip EPD Opcode"
+    wm title $w "EPD-Opcode entfernen"
     placeWinOverParent $w .epd$id
     wm resizable $w false false
-    label $w.label -text "EPD opcode to be removed from $epdName($id)"
+    label $w.label -text "Von $epdName($id) zu entfernender EPD-Opcode:"
     entry $w.e -width 10  -textvariable stripField
     pack $w.label $w.e -side top -pady 5 -padx 5
     addHorizontalRule $w
     set b [frame $w.buttons]
     pack $b -side bottom -pady 5
-    button $b.ok -text "Strip EPD field" -command "
+    button $b.ok -text "EPD-Feld entfernen" -command "
       destroy $w
       ::epd::stripEpdField $id \$stripField
     "
@@ -821,8 +821,8 @@
     if {$field == ""} {return}
     set result [sc_epd strip $id $field]
     updateEpdWin $id
-    tk_messageBox -type ok -icon info -title "Scid: EPD field stripped" \
-        -message "Scid stripped EPD field \"$field\" from $result positions." -parent .epd$id
+    tk_messageBox -type ok -icon info -title "Scid: EPD-Feld entfernt" \
+        -message "Scid entfernte das EPD-Feld \"$field\" von $result Stellungen." -parent .epd$id
   }
 
   ################################################################################
@@ -837,8 +837,8 @@
     if {[sc_epd exists $id]} {
       # get the node list index of the existing position
       set idx [sc_epd index $id]
-      #tk_messageBox -type ok -icon info -title "Position Already Exists" \
-          -message "The position already exists at line [expr $idx + 1]."
+      #tk_messageBox -type ok -icon info -title "Stellung existiert bereits" \
+          -message "Die Stellung gibt es schon in Zeile [expr $idx + 1]."
     } else {
       # add the position internally...
       sc_epd set $id ""
Index: tcl/file/finder.tcl
===================================================================
--- tcl/file/finder.tcl	(revision 3620)
+++ tcl/file/finder.tcl	(working copy)
@@ -319,7 +319,7 @@
   if { $ext == ".si4" } {
     if { [catch { file copy "$r.sg4" "$r$d.sg4" ; file copy "$r.sn4" "$r$d.sn4" } err ] } {
       unbusyCursor .
-      tk_messageBox -title Scid -icon error -type ok -message "File copy error $err"
+      tk_messageBox -title Scid -icon error -type ok -message "Dateikopierfehler $err"
       return
     }
     catch { file copy "$r.stc" "$r$d.stc" }
@@ -327,7 +327,7 @@
 
   if { [catch { file copy "$r[file extension $f]" "$r$d[file extension $f]" } err ] } {
     unbusyCursor .
-    tk_messageBox -title Scid -icon error -type ok -message "File copy error $err"
+    tk_messageBox -title Scid -icon error -type ok -message "Dateikopierfehler $err"
     return
   }
 
@@ -337,7 +337,7 @@
 
 proc ::file::finder::copy { f } {
   if {[sc_base slot $f] != 0} {
-    tk_messageBox -title Scid -icon error -type ok -message "Close base first" -parent .finder
+    tk_messageBox -title Scid -icon error -type ok -message "Schließen Sie zuerst die Datenbank" -parent .finder
     return
   }
   set dir [tk_chooseDirectory -initialdir [file dirname $f] -parent .finder]
@@ -344,7 +344,7 @@
   if {$dir != ""} {
     if { [string tolower [file extension $f]] == ".si4" } {
       if { [catch { file copy "[file rootname $f].sg4" "[file rootname $f].sn4" $dir } err ] } {
-        tk_messageBox -title Scid -icon error -type ok -message "File copy error $err" -parent .finder
+        tk_messageBox -title Scid -icon error -type ok -message "Dateikopierfehler $err" -parent .finder
         return
       }
 
@@ -352,7 +352,7 @@
     }
 
     if { [catch { file copy $f $dir } err ] } {
-      tk_messageBox -title Scid -icon error -type ok -message "File copy error $err" -parent .finder
+      tk_messageBox -title Scid -icon error -type ok -message "Dateikopierfehler $err" -parent .finder
       return
     }
 
@@ -361,7 +361,7 @@
 
 proc ::file::finder::move { f } {
   if {[sc_base slot $f] != 0} {
-    tk_messageBox -title Scid -icon error -type ok -message "Close base first" -parent .finder
+    tk_messageBox -title Scid -icon error -type ok -message "Schließen Sie zuerst die Datenbank" -parent .finder
     return
   }
   set dir [tk_chooseDirectory -initialdir [file dirname $f] -parent .finder ]
@@ -369,7 +369,7 @@
     if { [string tolower [file extension $f]] == ".si4" } {
 
       if { [catch { file rename "[file rootname $f].sg4" "[file rootname $f].sn4" $dir } err ] } {
-        tk_messageBox -title Scid -icon error -type ok -message "File rename error $err" -parent .finder
+        tk_messageBox -title Scid -icon error -type ok -message "Fehler bei der Dateinamensumbenennung $err" -parent .finder
         return
       }
       catch { file rename "[file rootname $f].stc" $dir }
@@ -376,7 +376,7 @@
     }
 
     if { [catch { file rename $f $dir } err ] } {
-      tk_messageBox -title Scid -icon error -type ok -message "File rename error $err" -parent .finder
+      tk_messageBox -title Scid -icon error -type ok -message "Fehler bei der Dateinamensumbenennung $err" -parent .finder
       return
     }
   }
@@ -385,7 +385,7 @@
 
 proc ::file::finder::rename { f } {
   if {[sc_base slot $f] != 0} {
-    tk_messageBox -title Scid -icon error -type ok -message "Close base first" -parent .finder
+    tk_messageBox -title Scid -icon error -type ok -message "Schließen Sie zuerst die Datenbank" -parent .finder
     return
   }
 
@@ -410,7 +410,7 @@
 
   if { [string tolower [file extension $f]] == {.si4} } {
     if {[file exists "$newname.si4"]} {
-      tk_messageBox -title Scid -icon error -type ok -message "$newname.si4 already exists" -parent .finder
+      tk_messageBox -title Scid -icon error -type ok -message "$newname.si4 existiert bereits" -parent .finder
       return
     }
 
@@ -418,7 +418,7 @@
 	    file rename "$r.sg4" "$n.sg4"
 	    file rename "$r.sn4" "$n.sn4"
 	 } err ] } {
-      tk_messageBox -title Scid -icon error -type ok -message "File copy error $err"
+      tk_messageBox -title Scid -icon error -type ok -message "Dateikopierfehler $err"
       return
     }
     catch { file rename "$r.stc" "$n.stc" }
@@ -426,7 +426,7 @@
   if { [catch {
           file rename "$r[file extension $f]" "$n[file extension $f]"
        } err ] } {
-    tk_messageBox -title Scid -icon error -type ok -message "File copy error $err"
+    tk_messageBox -title Scid -icon error -type ok -message "Dateikopierfehler $err"
     return
   }
 
@@ -439,7 +439,7 @@
   wm title $w "Scid: Rename"
   grab $w
 
-  label $w.label -text {New name}
+  label $w.label -text {Neuer Name}
   pack $w.label -side top -pady 5 -padx 5
 
   entry $w.entry -width 16 -borderwidth 0
@@ -471,11 +471,11 @@
 
 proc ::file::finder::delete { f } {
   if {[sc_base slot $f] != 0} {
-    tk_messageBox -title Scid -icon error -type ok -message "Close base first" -parent .finder
+    tk_messageBox -title Scid -icon error -type ok -message "Schließen Sie zuerst die Datenbank" -parent .finder
     return
   }
   set answer [tk_messageBox -title Scid -icon warning -type yesno -parent .finder \
-                -message "Do you want to permanently delete $f ?"]
+                -message "Wollen Sie $f dauerhaft löschen?"]
   if {$answer == "yes"} {
     if { [string tolower [file extension $f]] == ".si4" } {
       file delete "[file rootname $f].sg4" "[file rootname $f].sn4" "[file rootname $f].stc"
Index: tcl/file/maint.tcl
===================================================================
--- tcl/file/maint.tcl	(revision 3626)
+++ tcl/file/maint.tcl	(working copy)
@@ -14,12 +14,12 @@
   set ftype {
     { "Scid databases" {".si4"} }
   }
-  set fName [tk_getOpenFile -initialdir $::initialDir(base) -filetypes $ftype -title "Open a Scid file"]
+  set fName [tk_getOpenFile -initialdir $::initialDir(base) -filetypes $ftype -title "Eine Scid-Datei öffnen"]
   if {$fName == ""} { return }
   set fName [file rootname $fName]
 
   if {[sc_base slot $fName] != 0} {
-    tk_messageBox -type ok -icon info -title Scid -message "$fName is already opened.\nClose it first"
+    tk_messageBox -type ok -icon info -title Scid -message "$fName ist bereits geöffnet.\nBitte zuerst schließen."
     return
   }
 
@@ -29,9 +29,9 @@
   unbusyCursor .
   closeProgressWindow
   if {$err} {
-    tk_messageBox -type ok -icon warning -title "Scid: Error compacting file" -message $result
+    tk_messageBox -type ok -icon warning -title "Scid: Fehler bei der Dateikomprimierung" -message $result
   } else {
-    tk_messageBox -type ok -icon info -title Scid -message "Base $fName was repaired"
+    tk_messageBox -type ok -icon info -title Scid -message "Datenbank $fName wurde repariert"
   }
 
 }
@@ -825,7 +825,7 @@
 
 proc stripCommentsVars {arg {parent .}} {
   if {$arg != "comments" && $arg != "variations"} {
-    tk_messageBox -type ok -icon info -title Scid -message "stripCommentsVars: must be 'comments' or 'variations'"
+    tk_messageBox -type ok -icon info -title Scid -message "stripCommentsVars: muß entweder 'comments' oder 'variations' sein"
     return
   }
   set w .stripCommentsVars
@@ -841,7 +841,7 @@
 
   pack [frame $w.f] -expand 1
 
-  label $w.f.label -text "Stripping $arg cannot be undone."
+  label $w.f.label -text "Entfernen von $arg kann nicht rückgängig gemacht werden."
   frame $w.f.g
   radiobutton $w.f.g.all -textvar ::tr(SelectAllGames) -variable checkOption(AllGames) -value all
   radiobutton $w.f.g.filter -textvar ::tr(SelectFilterGames) -variable checkOption(AllGames) -value filter
@@ -1689,7 +1689,7 @@
   set w .compactWin
   if {$err} {
     tk_messageBox -type ok -icon warning -parent $w \
-        -title "Scid: Error compacting file" -message $result
+        -title "Scid: Fehler bei der Dateikomprimierung" -message $result
   } else {
     sc_game new
     updateBoard -pgn
@@ -1742,7 +1742,7 @@
   set numberDeleted [expr {[lindex $stats 0] - [lindex $stats 2]}]
   if {[tk_messageBox -title "$::tr(CompactDatabase): [file tail [sc_base filename]]" -parent $parent \
       -icon question -type yesno -message \
-      "$numberDeleted games will be permanently deleted.\nAre you sure ?"] != {yes}} {
+      "$numberDeleted Partien werden unwiderruflich gelöscht.\nSind Sie sicher?"] != {yes}} {
     return
   }
 
@@ -1753,7 +1753,7 @@
   closeProgressWindow
   if {$err} {
     tk_messageBox -type ok -icon warning -parent $parent \
-        -title "Scid: Error compacting file" -message $result
+        -title "Scid: Fehler bei der Dateikomprimierung" -message $result
   } else {
     sc_game new
     updateBoard -pgn
@@ -1902,15 +1902,15 @@
   global sortCriteria
   set w .sortWin
   if {! [sc_base inUse]} {
-    tk_messageBox -type ok -icon info -parent $w -title "Scid: Sort results" \
-        -message "This is not an open database; there are no games to sort."
+    tk_messageBox -type ok -icon info -parent $w -title "Scid: Sortierergebnisse" \
+        -message "Dies ist keine geöffnete Datenbank, es gibt keine Partien zu sortieren."
     return
   }
-  progressWindow Scid "Sorting the database."
+  progressWindow Scid "Sortierung der Datenbank"
   busyCursor .
   # can be messed up by gamelist sort
   sc_base sortup
-  set err [catch {sc_base sort $sortCriteria(real) {changeProgressWindow "Storing results."} } result]
+  set err [catch {sc_base sort $sortCriteria(real) {changeProgressWindow "Speichere Ergebnisse."} } result]
   unbusyCursor .
   closeProgressWindow
 
@@ -1920,11 +1920,11 @@
   ::maint::Refresh
   if {$err} {
     tk_messageBox -type ok -icon warning -parent $w \
-        -title "Scid: Sort results" -message $result
+        -title "Scid: Sortierergebnisse" -message $result
   } else {
     tk_messageBox -type ok -icon info -parent $w \
-        -title "Scid: Sort results" \
-        -message "The database was successfully sorted."
+        -title "Scid: Sortierergebnisse" \
+        -message "Die Datenbank wurde erfolgreich sortiert."
   }
 }
 
@@ -1968,7 +1968,7 @@
     return
   }
   toplevel $w
-  wm title $w "Allocate Ratings"
+  wm title $w "Zuweisung Ratings"
   wm withdraw $w
 
   label $w.lab -wraplength 3i -justify left -text $::tr(AllocRatingDescription)
@@ -2011,7 +2011,7 @@
     tk_messageBox -type ok -icon info -parent $parent -title Scid -message $result
     return
   }
-  progressWindow Scid "Adding Elo ratings."
+  progressWindow Scid "Hinzufügung Elo-Ratings."
   busyCursor .
   if {[catch {sc_name ratings -change $addRatings(overwrite) -filter $addRatings(filter)} result]} {
     closeProgressWindow
@@ -2052,13 +2052,13 @@
   }
 
   set ::interrupt 0
-  progressWindow Scid "Searching for Extra PGN tags." $::tr(Cancel) "set ::interrupt 1; sc_progressBar"
+  progressWindow Scid "Suche nach Extramarkierungen." $::tr(Cancel) "set ::interrupt 1; sc_progressBar"
   busyCursor .
   set err [catch {sc_base tag list} result]
   unbusyCursor .
   closeProgressWindow
   if {$::interrupt} {
-    tk_messageBox -title Scid -icon warning -type ok -message "Searching cancelled.\n\nTag list and counts are not correct." -parent $parent
+    tk_messageBox -title Scid -icon warning -type ok -message "Suchen abgebrochen.\n\nMarkierungsliste und Zähler sind nicht korrekt." -parent $parent
   }
   if {$err} {
     tk_messageBox -title Scid -icon warning -type ok -message $result -parent $parent
@@ -2160,7 +2160,7 @@
   toplevel $w
   wm title $w "Scid: $::tr(StripTags)"
 
-  label $w.label -text "Enter Tag Name and Value"
+  label $w.label -text "Markierungsbezeichnung und Wert eingeben"
   pack $w.label -side top -pady 5 -padx 5
 
   frame $w.entries
@@ -2190,7 +2190,7 @@
       tk_messageBox -title Oops -icon warning -type ok -message $errorMsg -parent .exTagDialog
     } else {
       destroy .exTagDialog
-      progressWindow Scid "Adding tag pair \[$tmp1 \"$tmp2\"\]." $::tr(Stop) sc_progressBar
+      progressWindow Scid "Füge Markierung \[$tmp1 \"$tmp2\"\] hinzu." $::tr(Stop) sc_progressBar
       busyCursor .
 
       set err [catch {
@@ -2201,7 +2201,7 @@
       closeProgressWindow
 
       if {!$err} {
-	set result "$result \[$tmp1 \"$tmp2\"\] tags added."
+	set result "$result \[$tmp1 \"$tmp2\"\] Markierungen hinzugefügt."
       }
       tk_messageBox -title Scid -parent .extratags -type ok -icon info -message $result
 
@@ -2232,11 +2232,16 @@
 proc doStripTags {tag} {
   global checkOption
 
-  set msg "Do you want to remove all occurences of \"$tag\" from $checkOption(AllGames) games?"
+  if {$checkOption(AllGames) eq "filter"} {
+      set msg "Wollen Sie in den gefilterten Partien alle Vorkommen von \"$tag\" entfernen?"
+  } else {
+      set msg "Wollen Sie in allen Partien alle Vorkommen von \"$tag\" entfernen?"
+  }
+
   set result [tk_messageBox -title Scid -parent .extratags \
       -icon question -type yesno -message $msg]
   if {$result == "no"} { return 0 }
-  progressWindow Scid "Removing the PGN tag $tag." $::tr(Stop) sc_progressBar
+  progressWindow Scid "Entferne die PGN-Markierung $tag." $::tr(Stop) sc_progressBar
   busyCursor .
   set err [catch {
     sc_base tag strip $tag $checkOption(AllGames)
@@ -2407,7 +2412,7 @@
     } else {
       set r [::utils::thousands [lindex $result 0]]
       set g [::utils::thousands [lindex $result 1]]
-      $t insert end "   Scid added $r Elo ratings in $g games.\n"
+      $t insert end "   Scid hat $r Elo-Ratings in $g Partien hinzugefügt.\n"
     }
   }
 
@@ -2431,8 +2436,8 @@
             -delete $twinSettings(delete)} result]} {
       set message $result
     } else {
-      set message "Scid found $result twin games"
-      if {$result > 0} {append message " and set their delete flags"}
+      set message "Scid hat $result Dubletten gefunden"
+      if {$result > 0} {append message " und ihr Löschkennzeichen gesetzt."}
     }
     $t insert end "   $message.\n"
   }
@@ -2443,13 +2448,13 @@
     set stats [sc_compact stats names]
     if {[lindex $stats 1] == 0  &&  [lindex $stats 3] == 0  && \
           [lindex $stats 5] == 0  &&  [lindex $stats 7] == 0} {
-      $t insert end "   Name file already compacted.\n"
+      $t insert end "   Namensdatei ist bereits komprimiert.\n"
     } else {
       set err [catch {sc_compact names} result]
       if {$err} {
         $t insert end "   $result\n"
       } else {
-        $t insert end "   Done.\n"
+        $t insert end "   Fertig.\n"
       }
     }
     $t see end
@@ -2459,13 +2464,13 @@
     mtoolAdd $t "$count: $::tr(CompactGames)..."
     incr count
     if {[compactGamesEmpty]} {
-      $t insert end "   Game file already compacted.\n"
+      $t insert end "   Partiendatei ist bereits komprimiert.\n"
     } else {
       set err [catch {sc_compact games} result]
       if {$err} {
         $t insert end "   $result\n"
       } else {
-        $t insert end "   Done.\n"
+        $t insert end "   Fertig.\n"
       }
     }
     $t see end
@@ -2487,10 +2492,10 @@
       ::tree::mutex_refresh
     }
     ::tree::treeFileSave $base
-    $t insert end "   Done.\n"
+    $t insert end "   Fertig.\n"
   }
 
-  mtoolAdd $t "Done."
+  mtoolAdd $t "fertig."
   sc_game new
   updateBoard
   ::windows::stats::Refresh
Index: tcl/file/recent.tcl
===================================================================
--- tcl/file/recent.tcl	(revision 3620)
+++ tcl/file/recent.tcl	(working copy)
@@ -23,7 +23,7 @@
   if  {[catch {open $filename w} f]} {
     if {$reportError} {
       tk_messageBox -title Scid -type ok -icon warning \
-          -message "Unable to write file: $filename\n$f"
+          -message "Kann Datei nicht schreiben: $filename\n$f"
     }
     return
   }
@@ -186,13 +186,13 @@
 
   frame $w.sep2 -height 4
 
-  label $w.lgames -text {Number of games in Game History}
+  label $w.lgames -text {Anzahl Partien in der Historie}
   scale $w.games -variable recentFiles(temp_gamehistory) -from 0 -to 20 -length 250 \
       -orient horizontal -showvalue 0 -tickinterval 2 -font font_Small
 
   frame $w.sep3 -height 4
 
-  label $w.lplayers -text {Number of players in History}
+  label $w.lplayers -text {Anzahl Spieler in der Historie}
   scale $w.players -variable recentFiles(temp_playernames) -from 0 -to 20 -length 250 \
       -orient horizontal -showvalue 0 -tickinterval 2 -font font_Small
 
Index: tcl/file/spellchk.tcl
===================================================================
--- tcl/file/spellchk.tcl	(revision 3620)
+++ tcl/file/spellchk.tcl	(working copy)
@@ -27,8 +27,8 @@
   }
   if {![file isfile $fullname] || [catch {sc_name read $fullname} result]} {
       if {$message} {
-        tk_messageBox -title "ERROR: Unable to read file" -type ok \
-          -icon error -message "Scid could not correctly read the spellcheck file you selected:\n\n$result"
+        tk_messageBox -title "Fehler: kann Datei nicht lesen" -type ok \
+          -icon error -message "Scid konnte die gewählte Rechtschreibdatei nicht richtig lesen:\n\n$result"
       }
     return 0
   }
@@ -35,8 +35,8 @@
   set spellCheckFile $fullname
   set spellCheckFileExists 1
   if {$message} {
-    tk_messageBox -title "Spellcheck file loaded." -type ok -icon info \
-      -message "Spellcheck file [file tail $fullname] loaded:\n\n[lindex $result 0] players, [lindex $result 1] events, [lindex $result 2] sites, [lindex $result 3] rounds.\n\nTo automatically load this file at start-up, select \"Save Options\" from the Options menu before exiting."
+    tk_messageBox -title "Rechtschreibdatei geladen." -type ok -icon info \
+      -message "Rechtschreibdatei [file tail $fullname] geladen:\n\n[lindex $result 0] Spieler, [lindex $result 1] Veranstaltungen, [lindex $result 2] Orte, [lindex $result 3] Runden.\n\nUm diese Datei automatisch beim Start zu laden, wählen Sie \"Optionen speichern\" im Optionenmenü bevor Sie beenden."
   }
   return 1
 }
@@ -120,7 +120,7 @@
   button $f.ok -textvar ::tr(MakeCorrections) -underline 0 -command {
     if {[sc_base current] != 9} {
       set result [tk_messageBox -title Scid -parent .spellcheckWin -icon question \
-	-type yesno -message "Please confirm making Name corrections.\nThis cannot be undone."]
+	-type yesno -message "Bitte die Durchführung der Namenskorrekturen bestätigen.\nDies kann nicht rückgängig gemacht werden."]
       if {$result == "no"} {return 0}
     }
 
Index: tcl/file.tcl
===================================================================
--- tcl/file.tcl	(revision 3620)
+++ tcl/file.tcl	(working copy)
@@ -36,11 +36,11 @@
 
   if {$unsavedCount > 0 || [winfo exists .comp]} {
     if {$unsavedCount == 0} {
-      set msg {A Computer Tournament is running.}
+      set msg {Ein Computerturnier läuft.}
     }
     append msg "\n$::tr(ExitDialog)"
 
-    set answer [tk_dialog .unsaved "Scid: Confirm Quit" $msg question {} "   [tr FileExit]   " [tr Cancel]]
+    set answer [tk_dialog .unsaved "Scid: Verlassen bestätigen" $msg question {} "   [tr FileExit]   " [tr Cancel]]
 
     if {$answer != 0} {
       wm protocol . WM_DELETE_WINDOW {::file::Exit}
@@ -97,7 +97,7 @@
 proc ::file::New {} {
   if {[sc_base count free] == 0} {
     tk_messageBox -title Scid -type ok -icon info \
-        -message "Too many databases open; close one first"
+        -message "Zuviele Datenbanken geöffnet; bitte erst eine schließen"
     return
   }
   set ftype {
@@ -108,7 +108,7 @@
   if {! [file isdirectory $::initialDir(base)] } {
     set ::initialDir(base) $::env(HOME)
   }
-  set fName [tk_getSaveFile -initialdir $::initialDir(base) -filetypes $ftype -title "Create a Scid database"]
+  set fName [tk_getSaveFile -initialdir $::initialDir(base) -filetypes $ftype -title "Erstelle eine Scid-Datenbank"]
   if {$fName == {}} {
     return
   } elseif {[file extension $fName] == ".epd"} {
@@ -121,7 +121,7 @@
     }
     if {[catch {sc_base create $fName} result]} {
       tk_messageBox -icon warning -type ok -parent . \
-          -title "Scid: error" -message "$result\nCan't create $fName"
+          -title "Scid: Fehler" -message "$result\nKann $fName nicht erstellen"
       return
     }
     # set default icon
@@ -144,7 +144,7 @@
 
   if {[sc_base count free] == 0} {
     tk_messageBox -type ok -icon info -title Scid \
-        -message "Too many databases are open; close one first" -parent $parent
+        -message "Zuviele Datenbanken geöffnet; bitte erst eine schließen" -parent $parent
     return
   }
 
@@ -168,7 +168,7 @@
       set ::file::finder::data(dir) $::env(HOME)
     }
     set fName [tk_getOpenFile -initialdir $::file::finder::data(dir) -filetypes $ftype \
-                 -title "Open a Scid file" -parent $parent]
+                 -title "Eine Scid-Datei öffnen" -parent $parent]
     if {$fName == ""} { return }
   }
 
@@ -215,7 +215,7 @@
       }
       unbusyCursor .
       tk_messageBox -icon warning -type ok -parent $parent \
-          -title "Scid: Error opening file" -message "$result"
+          -title "Scid: Fehler beim Öffnen der Datei" -message "$result"
       ::recentFiles::remove "$fName.si4"
       return -1
     } else {
@@ -239,7 +239,7 @@
       ::recentFiles::remove $fName
       unbusyCursor .
       tk_messageBox -icon warning -type ok -parent $parent \
-          -title "Scid: Error opening file" -message "File $fName doesn't exist."
+          -title "Scid: Fehler beim Öffnen der Datei" -message "Datei $fName nicht vorhanden."
     } else {
       if {$ext != ".pgn" && $ext != ".PGN"} {
 	puts {Unknown file type, assuming PGN.}
@@ -246,15 +246,15 @@
       }
       ## note : .zip isn't supported by zlib. Only .pgn.gz is supported.
 
-      set result "File $fName is not readable."
+      set result "Datei $fName ist nicht lesbar."
       if {(![file readable $fName])  || \
 	    [catch {sc_base create $fName true} result]} {
 	set err 1
 	unbusyCursor .
 	tk_messageBox -icon warning -type ok -parent $parent \
-	    -title "Scid: Error opening file" -message $result
+	    -title "Scid: Fehler beim Öffnen der Datei" -message $result
       } else {
-	doPgnFileImport $fName "Opening [file tail $fName] read-only\n"
+	doPgnFileImport $fName "Öffne [file tail $fName] im Nur-Lesen-Modus\n"
 	sc_base type [sc_base current] 3
 	::recentFiles::add $fName
 	set ::initialDir(pgn) [file dirname $fName]
@@ -423,7 +423,7 @@
   closeProgressWindow
   if {$err} {
     tk_messageBox -title Scid -type ok -icon warning \
-        -message "Unable to upgrade the database:\n$res"
+        -message "Kann Datenbank nicht aktualisieren:\n$res"
     return
   } else  {
     # rename game and name files, delete old .si3
@@ -450,7 +450,7 @@
   # We don't want to open this twice somehow
 
   if {$::windowsOS && [string range $name 1 2] == ":\\"} {
-    ::splash::add "Translating \"\\\" filename separators for $name"
+    ::splash::add "Übersetze Dateinamenstrenner \"\\\" für $name"
     set name [string map {\\ /} $name]
   }
 
@@ -576,7 +576,7 @@
 
   if {[sc_base count free] == 0} {
     tk_messageBox -type ok -icon info -title Scid \
-        -message "Too many databases are open; close one first"
+        -message "Zuviele Datenbanken geöffnet; bitte erst eine schließen"
     return
   }
 
@@ -597,7 +597,7 @@
     if {! [file isdirectory $::initialDir(base)] } {
       set ::initialDir(base) $::env(HOME)
     }
-    set fName [tk_getOpenFile -initialdir $::initialDir(base) -filetypes $ftype -title "Open a Scid file"]
+    set fName [tk_getOpenFile -initialdir $::initialDir(base) -filetypes $ftype -title "Eine Scid-Datei öffnen"]
     if {$fName == ""} { return }
 
     set fName [fullname $fName]
@@ -636,7 +636,7 @@
     if {[catch {openBase $fName} result]} {
       unbusyCursor .
       set err 1
-      tk_messageBox -icon warning -type ok -parent . -title "Scid: Error opening file" -message $result
+      tk_messageBox -icon warning -type ok -parent . -title "Scid: Fehler beim Öffnen der Datei" -message $result
       return
     } else {
       set ::initialDir(base) [file dirname $fName]
@@ -650,10 +650,10 @@
           [catch {sc_base create $fName true} result]} {
       unbusyCursor .
       set err 1
-      tk_messageBox -icon warning -type ok -parent . -title "Scid: Error opening file" -message $result
+      tk_messageBox -icon warning -type ok -parent . -title "Scid: Fehler beim Öffnen der Datei" -message $result
       return
     } else {
-      doPgnFileImport $fName "Opening [file tail $fName] read-only\n"
+      doPgnFileImport $fName "Öffne [file tail $fName] im Nur-Lesen-Modus\n"
       sc_base type [sc_base current] 3
       set ::initialDir(pgn) [file dirname $fName]
       set ::initialDir(file) [file tail $fName]
Index: tcl/game.tcl
===================================================================
--- tcl/game.tcl	(revision 3623)
+++ tcl/game.tcl	(working copy)
@@ -125,16 +125,16 @@
 proc ::game::LoadNextPrev {action {raise 1}} {
   global pgnWin statusBar
   if {![sc_base inUse]} {
-    set statusBar "  There is no $action game: this is an empty database."
+    set statusBar "  In dieser Richtung gibt es keine Partie: dies ist eine leere Datenbank."
     return
   }
   set number [sc_filter $action]
   if {$number == 0} {
-    set statusBar "  There is no $action game in the current filter."
+    set statusBar "  In dieser Richtung gibt es keine weitere Partie im aktuellen Filter."
     return
   }
   if {$number == [sc_game number]} {
-    set statusBar "  Game $number already loaded."
+    set statusBar "  Partie $number bereits geladen."
     return
   }
   ::game::Load $number 1 $raise
Index: tcl/language.tcl
===================================================================
--- tcl/language.tcl	(revision 3620)
+++ tcl/language.tcl	(working copy)
@@ -125,8 +125,8 @@
 
   lassign $args lang tag label underline helpMsg
   if {![string is integer -strict $underline]} {
-    tk_messageBox -icon error -type ok -title "$::scidName Menu Error" \
-      -message "menuText $args\n\nNot enough args, or fourth arg is not an integer."
+    tk_messageBox -icon error -type ok -title "$::scidName Menüfehler" \
+      -message "menuText $args\n\nNicht genügend Argumente oder das vierte Argument ist kein Integer."
     exit
   }
 
Index: tcl/main.tcl
===================================================================
--- tcl/main.tcl	(revision 3623)
+++ tcl/main.tcl	(working copy)
@@ -1030,7 +1030,7 @@
   catch {source $fname}
   set newcount [expr {[array size ::photo] - $oldcount}]
   if {$newcount > 0} {
-    ::splash::add "    Found $newcount photos in [file tail $fname]"
+    ::splash::add "    $newcount Fotos in [file tail $fname] gefunden"
   }
 }
 
@@ -1050,7 +1050,7 @@
 
 ### Read all Scid photo files (*.spf) in the data/user/config directories
 
-::splash::add "Searching for player photos."
+::splash::add "Suche nach Spielerfotos."
 
 foreach photofile [glob -nocomplain -directory $scidDataDir "*.spf"] {
   readPhotoFile $photofile
@@ -1205,7 +1205,7 @@
   if {$::macOS} {
     wm transient $w .
   }
-  wm title $w "Promotion"
+  wm title $w "Umwandlung"
   wm resizable $w 0 0
 
   set col "w"
@@ -1315,7 +1315,7 @@
   }
   if {$nullmove && [sc_pos isCheck]} {
       # dont add null move in check or mate
-      tk_messageBox -type ok -message {Null Move while in Check is not allowed.} -parent .main.board -icon info
+      tk_messageBox -type ok -message {Nullzug während Schachgebot nicht erlaubt.} -parent .main.board -icon info
       return
   }
 
@@ -1611,7 +1611,7 @@
 
   toplevel $w
   wm state $w withdrawn
-  wm title $w {Move Delay}
+  wm title $w {Zugverzögerung}
 
   label $w.label -text $::tr(AnnotateTime)
   pack $w.label -side top -pady 5 -padx 5
Index: tcl/menus.tcl
===================================================================
--- tcl/menus.tcl	(revision 3622)
+++ tcl/menus.tcl	(working copy)
@@ -84,7 +84,7 @@
 $m add command -label FileNew -command ::file::New
 set helpMessage($m,[incr menuindex]) FileNew
 
-$m add command -label FileOpen -acc "control-o" -command ::file::Open
+$m add command -label FileOpen -acc "Strg-o" -command ::file::Open
 bind .main <Control-o> ::file::Open
 set helpMessage($m,[incr menuindex]) FileOpen
 
@@ -91,7 +91,7 @@
 $m add command -label FileSavePgn  -command {::pgn::savePgn .}
 set helpMessage($m,[incr menuindex]) FileSavePgn
 
-$m add command -label FileClose -acc "control-w" -command ::file::Close
+$m add command -label FileClose -acc "Strg-w" -command ::file::Close
 bind .main <Control-w> ::file::Close
 set helpMessage($m,[incr menuindex]) FileClose
 
@@ -98,7 +98,7 @@
 $m add command -label FileReadOnly -command makeBaseReadOnly
 set helpMessage($m,[incr menuindex]) FileReadOnly
 
-$m add command -label FileFinder -acc "control-/" -command ::file::finder::Open
+$m add command -label FileFinder -acc "Strg-/" -command ::file::finder::Open
 bind .main <Control-slash> ::file::finder::Open
 set helpMessage($m,[incr menuindex]) FileFinder
 
@@ -134,7 +134,7 @@
 $m add separator
 incr menuindex
 
-$m add command -label FileExit -accelerator "control-q" -command ::file::Exit
+$m add command -label FileExit -accelerator "Strg-q" -command ::file::Exit
 bind .main <Control-q> ::file::Exit
 set helpMessage($m,[incr menuindex]) FileExit
 
@@ -144,19 +144,19 @@
 set menuindex -1
 set m .menu.edit
 
-$m add command -label EditSetup -command setupBoard -accelerator "control-B"
+$m add command -label EditSetup -command setupBoard -accelerator "Strg-B"
 set helpMessage($m,[incr menuindex]) EditSetup
 
-$m add command -label EditCopyBoard -accelerator "control-C" -command copyFEN
+$m add command -label EditCopyBoard -accelerator "Strg-C" -command copyFEN
 set helpMessage($m,[incr menuindex]) EditCopyBoard
 
 $m add command -label EditCopyPGN -command ::pgn::copyPgn
 set helpMessage($m,[incr menuindex]) EditCopyPGN
 
-$m add command -label EditPasteBoard -accelerator "control-V" -command pasteFEN
+$m add command -label EditPasteBoard -accelerator "Strg-V" -command pasteFEN
 set helpMessage($m,[incr menuindex]) EditPasteBoard
 
-$m add command -label EditPastePGN -command importPgnGame -accelerator "control-I"
+$m add command -label EditPastePGN -command importPgnGame -accelerator "Strg-I"
 set helpMessage($m,[incr menuindex]) EditPastePGN
 
 $m add separator
@@ -170,11 +170,11 @@
 }
 set helpMessage($m,[incr menuindex]) EditReset
 
-$m add command -label EditCopy -accelerator "control-c" -command copyGame
+$m add command -label EditCopy -accelerator "Strg-c" -command copyGame
 bind .main <Control-c> copyGame
 set helpMessage($m,[incr menuindex]) EditCopy
 
-$m add command -label EditPaste -accelerator "control-v" -command pasteGame
+$m add command -label EditPaste -accelerator "Strg-v" -command pasteGame
 bind .main <Control-v> pasteGame
 set helpMessage($m,[incr menuindex]) EditPaste
 
@@ -207,7 +207,7 @@
 $m add separator
 incr menuindex
 
-$m add command -label EditAdd -accel "control-a" -command {sc_var create; updateBoard -pgn}
+$m add command -label EditAdd -accel "Strg-a" -command {sc_var create; updateBoard -pgn}
 set helpMessage($m,[incr menuindex]) EditAdd
 
 $m add command -label EditPasteVar -command importVar
@@ -226,7 +226,7 @@
 set helpMessage($m,[incr menuindex]) EditMain
 
 $m add checkbutton -label EditTrial -variable trialMode \
-    -accelerator "control-space" -command {setTrialMode menu}
+    -accelerator "Strg-Leer" -command {setTrialMode menu}
 bind .main <Control-space> { setTrialMode toggle }
 set helpMessage($m,[incr menuindex]) EditTrial
 
@@ -285,26 +285,26 @@
 $m add separator
 incr menuindex
 
-$m add command -label GameFirst -accelerator "control-home" \
+$m add command -label GameFirst -accelerator "Strg-Pos1" \
     -command {::game::LoadNextPrev first}
 set helpMessage($m,[incr menuindex]) GameFirst
 
-$m add command -label GameLast -accelerator "control-end" \
+$m add command -label GameLast -accelerator "Strg-Ende" \
     -command {::game::LoadNextPrev last}
 set helpMessage($m,[incr menuindex]) GameLast
 
-$m add command -label GameNext -accelerator "control-down" \
+$m add command -label GameNext -accelerator "Strg-↓" \
     -command {::game::LoadNextPrev next}
 set helpMessage($m,[incr menuindex]) GameNext
 
-$m add command -label GamePrev -accelerator "control-up" \
+$m add command -label GamePrev -accelerator "Strg-↑" \
     -command {::game::LoadNextPrev previous}
 set helpMessage($m,[incr menuindex]) GamePrev
 
-$m add command -label GameRandom -command ::game::LoadRandom -accelerator "control-?"
+$m add command -label GameRandom -command ::game::LoadRandom -accelerator "Strg-?"
 set helpMessage($m,[incr menuindex]) GameRandom
 
-$m add command -label GameNumber -command ::game::LoadNumber -accelerator "control-u"
+$m add command -label GameNumber -command ::game::LoadNumber -accelerator "Strg-u"
 set helpMessage($m,[incr menuindex]) GameNumber
 
 $m add separator
@@ -322,7 +322,7 @@
 
 set helpMessage($m,[incr menuindex]) GameDeepest
 
-$m add command -label GameGotoMove -accelerator "control-g" \
+$m add command -label GameGotoMove -accelerator "Strg-g" \
     -command ::game::GotoMoveNumber
 set helpMessage($m,[incr menuindex]) GameGotoMove
 bind .main <Control-g> ::game::GotoMoveNumber
@@ -334,12 +334,12 @@
 ### Search menu:
 set menuindex -1
 set m .menu.search
-$m  add command -label SearchReset -acc "control-r" \
+$m  add command -label SearchReset -acc "Strg-r" \
     -command ::search::filter::reset
 bind .main <Control-r> ::search::filter::reset
 set helpMessage($m,[incr menuindex]) SearchReset
 
-$m  add command -label SearchNegate -acc "control-n" \
+$m  add command -label SearchNegate -acc "Strg-n" \
     -command ::search::filter::negate
 bind .main <Control-n> ::search::filter::negate
 set helpMessage($m,[incr menuindex]) SearchNegate
@@ -351,7 +351,7 @@
 incr menuindex
 
 $m  add command -label SearchHeader \
-    -command ::search::header -accelerator "control-G"
+    -command ::search::header -accelerator "Strg-G"
 set helpMessage($m,[incr menuindex]) SearchHeader
 
 $m  add command -label SearchCurrent -command ::search::board
@@ -358,7 +358,7 @@
 set helpMessage($m,[incr menuindex]) SearchCurrent
 
 $m  add command -label SearchMaterial \
-    -command ::search::material -accelerator "control-M"
+    -command ::search::material -accelerator "Strg-M"
 bind .main <Control-M> ::search::material
 set helpMessage($m,[incr menuindex]) SearchMaterial
 
@@ -371,10 +371,10 @@
 $m  add separator
 incr menuindex
 
-$m add command -label WindowsPList -command ::plist::Open -accelerator "control-P"
+$m add command -label WindowsPList -command ::plist::Open -accelerator "Strg-P"
 set helpMessage($m,[incr menuindex]) WindowsPList
 
-$m add command -label WindowsTmt -command ::tourney::Open -accelerator "control-T"
+$m add command -label WindowsTmt -command ::tourney::Open -accelerator "Strg-T"
 set helpMessage($m,[incr menuindex]) WindowsTmt
 
 $m  add separator
@@ -496,14 +496,14 @@
 bind .main <Control-i> ::windows::stats::Open
 set helpMessage($m,[incr menuindex]) WindowsStats
 
-$m add command -label WindowsTree -command ::tree::Open -accelerator "control-t"
+$m add command -label WindowsTree -command ::tree::Open -accelerator "Strg-t"
 set helpMessage($m,[incr menuindex]) WindowsTree
 
-$m add command -label WindowsTB -command ::tb::Open -accelerator "control-="
+$m add command -label WindowsTB -command ::tb::Open -accelerator "Strg-="
 bind .main <Control-equal> ::tb::Open
 set helpMessage($m,[incr menuindex]) WindowsTB
 
-$m add command -label WindowsBook -command ::book::Open -accelerator "control-b"
+$m add command -label WindowsBook -command ::book::Open -accelerator "Strg-b"
 set helpMessage($m,[incr menuindex]) WindowsBook
 
 $m add command -label WindowsCorrChess -command ::CorrespondenceChess::CCWindow
@@ -513,7 +513,7 @@
 set menuindex -1
 set m .menu.tools
 $m  add command -label ToolsAnalysis \
-    -command ::enginelist::choose -accelerator "control-A"
+    -command ::enginelist::choose -accelerator "Strg-A"
 bind .main <Control-A> ::enginelist::choose
 set helpMessage($m,[incr menuindex]) ToolsAnalysis
 
@@ -537,7 +537,7 @@
 $m add cascade -label ToolsMaint -menu .menu.tools.utils
 set helpMessage($m,[incr menuindex]) ToolsMaint
 
-$m.utils add command -label ToolsMaintWin -accelerator "control-m" -command ::maint::Open
+$m.utils add command -label ToolsMaintWin -accelerator "Strg-m" -command ::maint::Open
 set helpMessage($m.utils,0) ToolsMaintWin
 
 $m.utils add command -label ToolsMaintNameEditor -command nameEditor
@@ -620,7 +620,7 @@
 $m add command -label ToolsFilterGraph -command tools::graphs::filter::Open
 set helpMessage($m,[incr menuindex]) ToolsFilterGraph
 
-$m add command -label ToolsAbsFilterGraph -accelerator "control-J" -command ::tools::graphs::absfilter::Open
+$m add command -label ToolsAbsFilterGraph -accelerator "Strg-J" -command ::tools::graphs::absfilter::Open
 bind .main <Control-J> ::tools::graphs::absfilter::Open
 set helpMessage($m,[incr menuindex]) ToolsAbsFilterGraph
 
@@ -628,7 +628,7 @@
 set helpMessage($m,[incr menuindex]) ToolsRating
 
 $m add command -label ToolsScore \
-    -accelerator "control-Z" -command ::tools::graphs::score::Raise
+    -accelerator "Strg-Z" -command ::tools::graphs::score::Raise
 bind .main <Control-Z> ::tools::graphs::score::Raise
 set helpMessage($m,[incr menuindex]) ToolsScore
 
@@ -682,8 +682,8 @@
 
 $m.exportfilter add command -label ToolsExpFilterLatex -command {
   if {[sc_filter count] > 5} {
-    tk_messageBox -type ok -icon info -title "Scid: Latex Preview" \
-	-message {Latex Preview has a maximum of 5 games.}
+    tk_messageBox -type ok -icon info -title "Scid: LaTeX-Vorschau"\
+	-message {Die LaTeX-Vorschau hat ein Maximum von fünf Partien.}
   } else {
     set latexFilename Games-Preview
     if {[exportGames filter Latex [file join $::scidLogDir $latexFilename.tex]] != "0"} {
@@ -696,13 +696,13 @@
 $m.exportfilter add command -label ToolsExpFilterEPD -command {
   # Check that we have some games to export:
   if {![sc_base inUse]} {
-    tk_messageBox -title "Scid: Empty database" -type ok -icon info \
-	-message "This is an empty database, there are no games to export."
+    tk_messageBox -title "Scid: leere Datenbank" -type ok -icon info \
+	-message "Dies ist eine leere Datenbank, es gibt keine Partien zu exportieren."
     return
   }
   if {[sc_filter count] == 0} {
-    tk_messageBox -title "Scid: Filter empty" -type ok -icon info \
-	-message "The filter contains no games."
+    tk_messageBox -title "Scid: Filter leer" -type ok -icon info \
+	-message "Der Filter enthält keine Partien."
     return
   }
   set confirm [::game::ConfirmDiscard]
@@ -711,11 +711,11 @@
     ::game::Save
   }
   set ftype {
-    { "EPD files" {".epd" ".txt"} }
-    { "All files" {"*"} }
+    { "EPD-Dateien" {".epd" ".txt"} }
+    { "Alle Dateien" {"*"} }
   }
   set idir $::initialDir(epd)
-  set fName [tk_getSaveFile -initialdir $idir -filetypes $ftype -defaultextension ".epd" -title "Create an EPD file"]
+  set fName [tk_getSaveFile -initialdir $idir -filetypes $ftype -defaultextension ".epd" -title "Eine EPD-Datei erstellen"]
   if {$fName == ""} {
     return
   }
@@ -724,8 +724,8 @@
   }
 
   if {[catch {open $fName w} epdFile]} {
-    tk_messageBox -title "Scid: Unable to write file" -type ok -icon warning \
-	-message "Unable to write file: $fName"
+    tk_messageBox -title "Scid: kann Datei nicht schreiben" -type ok -icon warning \
+	-message "Kann Datei nicht schreiben: $fName"
     return
   }
 
@@ -763,7 +763,7 @@
 $m add separator
 incr menuindex
 
-$m add command -label ToolsImportOne -accelerator "control-I" -command importPgnGame
+$m add command -label ToolsImportOne -accelerator "Strg-I" -command importPgnGame
 bind .main <Control-I> importPgnGame
 set helpMessage($m,[incr menuindex]) ToolsImportOne
 
@@ -830,9 +830,9 @@
   set w .tablebaseDialog
   toplevel $w
   wm state $w withdrawn
-  wm title $w Tablebases
+  wm title $w Endspieldatenbanken
 
-  label $w.title -text "Select up to 4 tablebase directories:"
+  label $w.title -text "Wählen Sie bis zu 4 Endspieldatenbankverzeichnisse:"
   pack $w.title -side top
   foreach i {1 2 3 4} {
     set tempDir(tablebase$i) $initialDir(tablebase$i)
@@ -876,7 +876,7 @@
   } else {
     set msg "Tablebases with up to $npieces pieces found.\n\nTo use these tablebases whenever you start Scid, select \"Save Options\" from the Options menu."
   }
-  tk_messageBox -type ok -icon info -title "Scid: Tablebase results" \
+  tk_messageBox -type ok -icon info -title "Scid: Endspieldatenbankergebnisse" \
       -message $msg
 
 }
@@ -888,7 +888,7 @@
   if {$idir == ""} { set idir [pwd] }
 
   set fullname [tk_chooseDirectory -mustexist 1 -initialdir $idir -parent .tablebaseDialog \
-      -title "Select a Tablebase directory"]
+      -title "Ein Endspieldatenbankverzeichnis auswählen"]
   if {$fullname == ""} { return }
 
   set tempDir(tablebase$i) $fullname
@@ -918,7 +918,7 @@
 
 proc setTacticsBasesDir {} {
   global scidBasesDir
-  set dir [tk_chooseDirectory -initialdir $scidBasesDir -mustexist 1 -title "Bases [tr Directory]"]
+  set dir [tk_chooseDirectory -initialdir $scidBasesDir -mustexist 1 -title "Datenbanken [tr Directory]"]
   if {$dir != ""} {
     set scidBasesDir $dir
   }
@@ -955,8 +955,8 @@
 $m add command -label OptionsSave -command {
   set optionF ""
   if {[catch {open [scidConfigFile options] w} optionF]} {
-    tk_messageBox -title "Scid: Unable to write file" -type ok -icon warning \
-        -message "Unable to write options file: [scidConfigFile options]\n$optionF"
+    tk_messageBox -title "Scid: kann Datei nicht schreiben" -type ok -icon warning \
+        -message "Kann Optionendatei nicht schreiben:" [scidConfigFile options]\n$optionF"
   } else {
     puts $optionF "# Scid vs. PC (version $scidVersion) Options file"
     puts $optionF "# This file contains commands in the Tcl language format."
@@ -1088,7 +1088,7 @@
     }
 
     close $optionF
-    set ::statusBar "Options saved to [scidConfigFile options]"
+    set ::statusBar "Optionen nach [scidConfigFile options] gespeichert"
   }
 }
 set helpMessage($m,[incr menuindex]) OptionsSave
@@ -1099,7 +1099,7 @@
 if {$::macOS} {
 # God-fucking-awful hack to fix broken OS X non-handling of magic mouse wheel
 # The hardware has a very sensitive wheel, but nowhere to disable it. S.A
-$m add checkbutton -label "Enable Wheelmouse " -variable macWheelMouse -command {
+$m add checkbutton -label "Aktiviere Mausrad " -variable macWheelMouse -command {
   if {$::macWheelMouse} {
     bind .main <MouseWheel> {
       if {[expr -%D] < 0} { ::move::Back }
@@ -1371,7 +1371,7 @@
 
 $m.back add radiobutton -label Global -variable enableBackground -value 2 -command {
     initBackgroundColour $defaultBackground
-    tk_messageBox -type ok -icon info -title Scid -message {Unsetting Global background colours will not work until you restart Scid.}
+    tk_messageBox -type ok -icon info -title Scid -message {Das Zurücksetzen der globalen Hintergrundfarben funktioniert nicht, bis Scid neu gestartet wurde.}
 }
 set helpMessage($m.back,3) Global
 
@@ -1614,7 +1614,7 @@
     # Only show menu items for open database slots
     if {$fname != {[empty]} } {
       $m.file.switch add command -command "set ::currentSlot $i" \
-	  -label "$fname" -underline 5 -accelerator "control-$i" \
+	  -label "$fname" -underline 5 -accelerator "Strg-$i" \
           -command "::file::SwitchToBase $i"
       bind .main <Control-Key-$i> "::file::SwitchToBase $i"
 
@@ -1645,7 +1645,7 @@
   }
   set idx [$m.file index end]
   incr idx
-  $m.file add command -label [tr FileExit] -accelerator "control-q" \
+  $m.file add command -label [tr FileExit] -accelerator "Strg-q" \
       -command ::file::Exit
   set helpMessage($m.file,$idx) FileExit
 
@@ -1942,7 +1942,7 @@
     foreach m {file edit game search windows tools options help} {
       set list [checkMenuUnderline .menu.$m]
       if {[llength $list] > 0} {
-        ::splash::add "Menu $m has duplicate underline letters: $list" error
+        ::splash::add "Menü $m hat doppelte Buchstaben mit Unterstrich: $list" error
       }
     }
   }
Index: tcl/misc/misc.tcl
===================================================================
--- tcl/misc/misc.tcl	(revision 3620)
+++ tcl/misc/misc.tcl	(working copy)
@@ -12,7 +12,7 @@
 
   proc trigger {var warn} {
     if {$warn == "warnuser"} {
-      tk_messageBox -type ok -icon error -parent . -title "Protocol error" -message "vwait timeout for $var"
+      tk_messageBox -type ok -icon error -parent . -title "Protokollfehler" -message "vwait Zeitablauf für $var"
     }
     set $var 1
   }
@@ -349,7 +349,7 @@
     set command [lindex $args 3]
     set b 1
   } else {
-    ::splash::add "progressWindow: wrong number of args" error
+    ::splash::add "progressWindow: falsche Anzahl Argumente" error
     return
   }
   wm title $w $title
@@ -736,21 +736,21 @@
   proc exportCurrentFilter {} {
     # Check that we have some games to export:
     if {![sc_base inUse]} {
-      tk_messageBox -title "Scid: Empty database" -type ok -icon info \
-          -message "This is an empty database, there are no games to export."
+      tk_messageBox -title "Scid: leere Datenbank" -type ok -icon info \
+          -message "Dies ist eine leere Datenbank, es gibt keine Partien zu exportieren."
       return
     }
     if {[sc_filter count] == 0} {
-      tk_messageBox -title "Scid: Filter empty" -type ok -icon info \
-          -message "The filter contains no games."
+      tk_messageBox -title "Scid: Filter leer" -type ok -icon info \
+          -message "Der Filter enthält keine Partien."
       return
     }
     set ftype {
-      { "HTML files" {".html" ".htm"} }
-      { "All files" {"*"} }
+      { "HTML-Dateien" {".html" ".htm"} }
+      { "Alle Dateien" {"*"} }
     }
     set idir $::initialDir(html)
-    set fName [tk_getSaveFile -initialdir $idir -filetypes $ftype -defaultextension ".html" -title "Create an HTML file"]
+    set fName [tk_getSaveFile -initialdir $idir -filetypes $ftype -defaultextension ".html" -title "Erstelle eine HTML-Datei"]
     if {$fName == ""} { return }
     set prefix [file rootname [file tail $fName] ]
     set dirtarget [file dirname $fName]
@@ -760,7 +760,7 @@
     catch { file copy -force [file join $sourcedir scid.js] $dirtarget }
     catch { file copy -force [file join $sourcedir scid.css] $dirtarget }
     writeIndex "[file join $dirtarget $prefix].html" $prefix
-    progressWindow Scid "Exporting games..." $::tr(Stop) sc_progressBar
+    progressWindow Scid "Exportiere Partien..." $::tr(Stop) sc_progressBar
     busyCursor .
     set savedGameNum [sc_game number]
     set gn [sc_filter first]
@@ -800,11 +800,11 @@
   proc exportCurrentGame {} {
 
     set ftype {
-      { "HTML files" {".html" ".htm"} }
-      { "All files" {"*"} }
+      { "HTML-Dateien" {".html" ".htm"} }
+      { "Alle Dateien" {"*"} }
     }
     set idir $::initialDir(html)
-    set fName [tk_getSaveFile -initialdir $idir -filetypes $ftype -defaultextension ".html" -title "Create an HTML file"]
+    set fName [tk_getSaveFile -initialdir $idir -filetypes $ftype -defaultextension ".html" -title "Erstelle eine HTML-Datei"]
     if {$fName == ""} { return }
     set prefix [file rootname [file tail $fName] ]
     set dirtarget [file dirname $fName]
@@ -1180,8 +1180,8 @@
     file delete $fname.tex
 
     if {[catch {set filedes [open $fname.tex w]}]} {
-      tk_messageBox -title "Scid: Error writing report" -type ok -icon warning \
-	  -message "Unable to write the file: $fname.tex" -parent pw
+      tk_messageBox -title "Scid: Fehler beim Schreiben des Berichts" -type ok -icon warning \
+	  -message "Kann nicht in die Datei $fname.tex schreiben" -parent pw
       unbusyCursor .
       return
     }
Index: tcl/search/board.tcl
===================================================================
--- tcl/search/board.tcl	(revision 3620)
+++ tcl/search/board.tcl	(working copy)
@@ -211,7 +211,7 @@
 
   ### Check test
   pack [frame $w.mate] -side top -fill x -expand 1
-  label $w.mate.label -text {Check Test} -font font_Bold
+  label $w.mate.label -text {Test auf Schachgebot} -font font_Bold
   pack $w.mate.label -side top
   pack [frame $w.mate.radio ] -side top
 
@@ -219,8 +219,8 @@
   # (should we do it automaticslly if '+' or '#' are in entry field ?
   # SAN_NO_CHECKTEST = 0, SAN_CHECKTEST  = 1, SAN_MATETEST = 2;
   radiobutton $w.mate.radio.no -textvar ::tr(No) -variable checkTest -value 0
-  radiobutton $w.mate.radio.check -text Check -variable checkTest -value 1
-  radiobutton $w.mate.radio.mate -text Mate   -variable checkTest -value 2
+  radiobutton $w.mate.radio.check -text Schach -variable checkTest -value 1
+  radiobutton $w.mate.radio.mate -text Matt   -variable checkTest -value 2
   pack $w.mate.radio.no $w.mate.radio.check $w.mate.radio.mate -side left -padx 15
 
   addHorizontalRule $w
@@ -431,7 +431,7 @@
     { "CQL file" {".cql"} }
   }
   set fName [tk_getSaveFile -initialdir $::initialDir(sso) -filetypes $ftype \
-             -parent $w -title {Save a CQL Query}]
+             -parent $w -title {Eine CQL-Abfrage speichern}]
   if {$fName == ""} { return }
   set ::initialDir(sso) [file dirname $fName]
 
@@ -440,7 +440,7 @@
   }
 
   if {[catch {set searchF [open $fName w]}]} {
-    tk_messageBox -title Error -type ok -icon error -message "Unable to create CQL file: $fName"
+    tk_messageBox -title Error -type ok -icon error -message "Kann CQL-Datei nicht erstellen: $fName"
     return
   }
   puts $searchF [$w.g.syntax get 0.0 end]
@@ -451,14 +451,14 @@
   set w .scql
 
   set ftype {
-    {{CQL files}  {.cql} }
-    {{Text files} {.txt} }
-    {{All files}       * }
+    {{CQL-Dateien}  {.cql} }
+    {{Textdateien} {.txt} }
+    {{Alle Dateien}       * }
   }
   if {! [file isdirectory $::initialDir(sso)] } {
     set ::initialDir(sso) $::env(HOME)
   }
-  set fName [tk_getOpenFile -initialdir $::initialDir(sso) -filetypes $ftype -title "Select a CQL query file"]
+  set fName [tk_getOpenFile -initialdir $::initialDir(sso) -filetypes $ftype -title "Eine CQL-Abfragedatei wählen"]
 
   if {$fName != ""} {
     if {![catch {open $fName r} fd]} {
@@ -470,11 +470,9 @@
       close $fd
       set ::initialDir(sso) [file dirname $fName]
     } else {
-      tk_messageBox -title Error -type ok -icon error -message "Unable to open CQL file $fName for reading."
+      tk_messageBox -title Error -type ok -icon error -message "Kann CQL-Datei $fName nicht zum Lesen öffnen."
     }
   }
-
-
 }
 
 ### Validate/set configure status of some CQL widgets
Index: tcl/search/header.tcl
===================================================================
--- tcl/search/header.tcl	(revision 3620)
+++ tcl/search/header.tcl	(working copy)
@@ -93,7 +93,7 @@
   set sIgnoreCol No
   set sSideToMove wb
   set sPgncase 0
-  set sGameEnd Any
+  set sGameEnd Beliebig
   set preComment 0
   set postComment 0
   set sTag ""
@@ -182,7 +182,7 @@
   if {[lindex [sc_name read] 0] == 0} { set spellstate disabled }
   foreach c {w b} name {White Black} {
     pack $w.t$c -side top -fill x
-    label $w.t$c.label -text "$tr($name) FIDE title" -font $bold -width 18 -anchor w
+    label $w.t$c.label -text "$tr($name) FIDE-Titel" -font $bold -width 18 -anchor w
     pack $w.t$c.label -side left
     foreach i $sTitleList {
       set name [string toupper $i]
@@ -295,7 +295,7 @@
   entry $w.eco.emax -textvariable sEcoMax -width 5 -font $regular
   bindFocusColors $w.eco.emin
   bindFocusColors $w.eco.emax
-  button $w.eco.range -text Choose -font $regular -pady 2 -padx 6 -width 7 -command {
+  button $w.eco.range -text Wähle -font $regular -pady 2 -padx 6 -width 7 -command {
     set tempResult [chooseEcoRange]
     if {[scan $tempResult "%\[A-E0-9a-z\]-%\[A-E0-9a-z\]" sEcoMin_tmp sEcoMax_tmp] == 2} {
       set sEcoMin $sEcoMin_tmp
@@ -326,7 +326,7 @@
   # Checkmate ?
 
   label $w.ends.endslabel -textvar tr(GameEnd) -font $bold
-  ttk::combobox $w.ends.ending -font $regular -width 12 -values {Any Checkmate Stalemate} -textvariable sGameEnd -state readonly
+  ttk::combobox $w.ends.ending -font $regular -width 12 -values {Beliebig Matt Patt} -textvariable sGameEnd -state readonly
   pack $w.ends.ending -side right
   pack $w.ends.endslabel -side right -padx 3
 
@@ -575,7 +575,7 @@
     pack forget .sh.b.stop
     unbusyCursor .
 
-    .sh.status configure -text "Result: $str"
+    .sh.status configure -text "Ergebnis: $str"
     set glstart 1
 
     ::search::loadFirstGame
@@ -615,7 +615,7 @@
        global sHeaderFlags sPgntext sTitles glstart ; # arrays, etc
 
   set ftype { { "Scid SearchOptions files" {".sso"} } }
-  set fName [tk_getSaveFile -initialdir $::initialDir(sso) -filetypes $ftype -title "Create a SearchOptions file" -parent .sh]
+  set fName [tk_getSaveFile -initialdir $::initialDir(sso) -filetypes $ftype -title "Eine Suchoptionendatei erstellen" -parent .sh]
   if {$fName == ""} { return }
   set ::initialDir(sso) [file dirname $fName]
 
@@ -624,8 +624,8 @@
   }
 
   if {[catch {set searchF [open [file nativename $fName] w]} ]} {
-    tk_messageBox -title "Error: Unable to open file" -type ok -icon error \
-        -message "Unable to create SearchOptions file: $fName"
+    tk_messageBox -title "Fehler: Datei kann nicht geöffnet werden" -type ok -icon error \
+        -message "Suchoptionendatei kann nicht erstellt werden: $fName"
     return
   }
   puts $searchF "# $::scidName search options file"
@@ -647,8 +647,8 @@
     puts $searchF "set sTitles($i) [list $sTitles($i)]"
   }
 
-  tk_messageBox -type ok -icon info -title "Search Options saved" \
-      -message "Header search options saved to: $fName"
+  tk_messageBox -type ok -icon info -title "Suchoptionen gespeichert" \
+      -message "Partiedatensuchoptionen gespeichert nach: $fName"
   close $searchF
 }
 
@@ -737,7 +737,7 @@
   toplevel $w
   wm withdraw $w
 
-  wm title $w "Choose ECO Range"
+  wm title $w "ECO-Bereich wählen"
   wm minsize $w 30 5
 
   listbox $w.list -yscrollcommand "$w.ybar set" -height 20 -width 60 \
Index: tcl/search/material.tcl
===================================================================
--- tcl/search/material.tcl	(revision 3620)
+++ tcl/search/material.tcl	(working copy)
@@ -368,7 +368,7 @@
   set f [frame $w.mp.material.mdiff2]
   pack $f -side top
   label $f.explan -font $small \
-      -text "($::tr(MaterialDiff) = $::tr(White) - $::tr(Black); Q=9 R=5 B=3 N=3 P=1)"
+      -text "($::tr(MaterialDiff) = $::tr(White) - $::tr(Black); D=9 T=5 L=3 S=3 B=1)"
   pack $f.explan -side top
 
   addVerticalRule $w.mp
@@ -629,7 +629,7 @@
 
   set ftype { { "Scid SearchOptions files" {".sso"} } }
   set fName [tk_getSaveFile -initialdir $::initialDir(sso) -filetypes $ftype \
-             -parent .sm -title {Create a SearchOptions file}]
+             -parent .sm -title {Erstelle eine Suchoptionendatei}]
   if {$fName == ""} { return }
   set ::initialDir(sso) [file dirname $fName]
 
Index: tcl/start.tcl
===================================================================
--- tcl/start.tcl	(revision 3621)
+++ tcl/start.tcl	(working copy)
@@ -64,14 +64,18 @@
 if {[string compare [sc_info version] $scidVersion]} {
   wm withdraw .
   if {$windowsOS} {
-    set msg "This is $::scidName version [sc_info version], but the scid.gui data\n"
-    append msg "file has the version number $scidVersion.\n"
+    set msg "Dies ist $::scidName Version [sc_info version], aber die scid.gui-Datendatei\n"
+    append msg "hat die Versionsnummer $scidVersion.\n"
   } else {
     set msg "This is $::scidName version $scidVersion,\nbut the "
     append msg "tkscid program \nit uses is version [sc_info version].\n"
     append msg "Check that the path to tkscid is correct."
+
+	  set msg "Dies ist $::scidName Version $scidVersion,\naber das "
+    append msg "tkscid-Programm, das verwendet wird, ist Version [sc_info version].\n"
+    append msg "Prüfen Sie, ob der Pfad zu tkscid stimmt."
   }
-  tk_messageBox -type ok -icon error -title "Scid: version error" -message $msg
+  tk_messageBox -type ok -icon error -title "Scid: Versionsfehler" -message $msg
   exit 1
 }
 
@@ -340,7 +344,7 @@
 set boardSize 60
 
 # language for help pages and messages:
-set language E
+set language D
 set oldLang X
 
 # Toolbar configuration/default visibility
@@ -895,7 +899,8 @@
 \usepackage[svgnames]{xcolor}
 \usepackage{xskak}
 \usepackage{lmodern}
-\usepackage[T1]{fontenc}
+% uncomment next line if utf8 is not supported
+% \usepackage[T1]{fontenc}
 \usepackage{latexsym}
 \usepackage{pgfplots}
 \pgfplotsset{compat=1.8}
@@ -927,6 +932,9 @@
 \addtokomafont{section}{\color{blue}}
 \addtokomafont{subsection}{\color{red}}
 
+% comment out next line for default style (= styleC from package skak/xskak)
+\xskakset{style = UF}
+
 \begin{document}
 }
 set default_exportEndFile(Latex) {\end{document}
@@ -1417,7 +1425,7 @@
     if {$isMacBaseReady == 0} {
       if {$mac_args != 0} {
         tk_messageBox -type ok -icon info -title Scid -message \
-            "Please, wait until Scid finish starting up."
+            "Bitte warten, bis Scid den Startvorgang beendet hat."
         return
       } else {
         # Save file names for later use:
@@ -1429,7 +1437,7 @@
     # Are we busy opening files? if so, display message and do nothing
     if {$mac_busy != 0} {
       tk_messageBox -type ok -icon info -title Scid -message \
-          "Please, wait until the previous database(s) are opened and try again."
+          "Bitte warten bis die vorherige(n) Datenbank(en) geöffnet sind und versuchen Sie dann nochmal."
       return
     }
 
@@ -1446,8 +1454,8 @@
       # Check for available slots:
       if {[sc_base count free] == 0} {
         tk_messageBox -type ok -icon info -title Scid \
-            -message "Too many databases are open; close at least one \n\
-            before opening more databases"
+            -message "Zuviele Datenbanken geöffnet; bitte wenigstens eine schließen \n\
+            bevor weitere Datenbanken geöffnet werden"
         #::splash::add "No slot available."
         return
       }
@@ -1461,8 +1469,8 @@
       if {$ext == ".sso"} {
         set ::fName $file
         if {[catch {uplevel "#0" {source $::fName}} errmsg]} {
-          tk_messageBox -title "Scid: Error reading file" -type ok -icon warning \
-              -message "Unable to open or read SearchOptions file: $file"
+          tk_messageBox -title "Scid: Fehler beim Lesen der Datei" -type ok -icon warning \
+              -message "Kann Suchoptionendatei nicht öffnen oder lesen: $file"
         } else {
           switch -- $::searchType {
             "Material" { ::search::material }
@@ -1562,7 +1570,7 @@
 # Since the options file used to be ".scid", rename it:
 if {! [file isdirectory $scidUserDir]} {
   if {[catch {file mkdir $scidUserDir} err]} {
-    ::splash::add "Error creating $scidUserDir directory: $err" error
+    ::splash::add "Fehler beim Erstellen des Verzeichnisses $scidUserDir: $err" error
   } else {
     catch {file rename "$scidUserDir.old" $optionsFile}
   }
@@ -1572,9 +1580,9 @@
 proc makeScidDir {dir} {
   if {![file isdirectory $dir] || ![file writable $dir]} {
     if {[catch {file mkdir $dir} err]} {
-      ::splash::add "Error creating directory $dir: $err" error
+      ::splash::add "Fehler beim Erstellen des Verzeichnisses $dir: $err" error
     } else {
-      ::splash::add "Created directory: $dir"
+      ::splash::add "Verzeichnis erstellt: $dir"
     }
   }
 }
@@ -1607,9 +1615,9 @@
 set useGraphFigurine 1
 
 if {[catch {source $optionsFile} ]} {
-  ::splash::add "Error loading options file \"$optionsFile\"" error
+  ::splash::add "Fehler beim Laden der Datei \"$optionsFile\"" error
 } else {
-  ::splash::add "Loaded options from \"$optionsFile\"."
+  ::splash::add "Einstellungen von  \"$optionsFile\" geladen."
 }
 
 # Hack to unset previous exportStartFile(Latex)
@@ -1933,7 +1941,7 @@
 
   wm withdraw $w
   wm protocol $w WM_DELETE_WINDOW [list wm withdraw $w]
-  wm title $w "Welcome to $::scidName $::scidVersion"
+  wm title $w "Willkommen zu $::scidName $::scidVersion"
 
   ### Pack in this order to resize nicely
   # buttons
@@ -1956,9 +1964,9 @@
   scrollbar $w.ybar -command [list $w.t yview]
 
   # Translations aren't set up yet, but these are handled in setLanguage
-  checkbutton $w.auto -text "Keep open after startup" \
+  checkbutton $w.auto -text "Nach Programmstart geöffnet halten" \
       -variable ::splash::keepopen -font font_Small -pady 5 -padx 5
-  button $w.dismiss -text Close -width 8 -command [list wm withdraw $w] \
+  button $w.dismiss -text Schließen -width 8 -command [list wm withdraw $w] \
       -font font_Small
 
   entry $w.find -width 10 -textvariable ::splash::find(find) -highlightthickness 0
@@ -1971,8 +1979,8 @@
       ::splash::add {}
       ::splash::add "$scidName $scidVersion Console"
       ::splash::add {------------------------------------}
-      ::splash::add {Here you can enter commands to the Scid interpreter for execution.}
-      ::splash::add {Try - "time {foreach i [array names helpText] {helpWindow $i}}" for a simple test and benchmark.}
+      ::splash::add {Hier können Sie Befehle für den Scid-Interpreter zur Ausführung eingeben.}
+      ::splash::add {Versuchen Sie - "time {foreach i [array names helpText] {helpWindow $i}}" für einen einfachen Test.}
     }
     set command [string trim [.splash.command get]]
     ::splash::add "# $command"
@@ -2033,8 +2041,8 @@
 ::splash::add "(C) Steven Atkinson (stevenaaus@yahoo.com) 2008-2025"
 ::splash::add "(C) Pascal Georges 2006-2008"
 ::splash::add "(C) Shane Hudson 1999-2004"
-::splash::add "(C) Gregor Cramer, Fulvio Benini and others."
-::splash::add "Licenced under the GNU General Public License."
+::splash::add "(C) Christian Opitz, Gregor Cramer, Fulvio Benini und andere."
+::splash::add "Lizenziert unter GNU General Public License."
 ::splash::add ""
 
 # add cached splash comments
@@ -2046,15 +2054,15 @@
 # lotsa stuff may break if this is not the case.
 
 if {[catch {.splash.t configure -insertforeground blue}]} {
-  set result No
+  set result Nein
 } else {
-  set result Yes
+  set result Ja
 }
-::splash::add "Using Tcl/Tk version: [info patchlevel] (with Gregor's tk::text - $result)"
+::splash::add "Verwende Tcl/Tk-Version: [info patchlevel] (mit Gregors tk::text - $result)"
 
-::splash::add "$tcl_platform(os) operating system, version $tcl_platform(osVersion)"
+::splash::add "$tcl_platform(os) Betriebssystem, Version $tcl_platform(osVersion)"
 if {(! $windowsOS)  &&  (! $unixOS)} {
-  ::splash::add "Operating System may not be supported"
+  ::splash::add "Betriebssystem wird nicht unterstützt"
 }
 if {[string match -nocase Linux $tcl_platform(os)]} {
   catch {
@@ -2063,7 +2071,7 @@
 }
 
 catch {
-  ::splash::add "LANG environment var is $::env(LANG)"
+  ::splash::add "LANG-Umgebungsvariable ist $::env(LANG)"
 }
 
 ::splash::add ""
@@ -2073,7 +2081,7 @@
 
 set buggyttk [expr {[info patchlevel] == {8.5.10}}]
 if {$buggyttk} {
-      ::splash::add "Warning - Disabling Tk-8.5.10's buggy ttk::scale widget." error
+      ::splash::add "Warnung - deaktiviere Tk-8.5.10, ttk::scale Widget ist fehlerhaft." error
 }
 
 
Index: tcl/tools/analysis.tcl
===================================================================
--- tcl/tools/analysis.tcl	(revision 3625)
+++ tcl/tools/analysis.tcl	(working copy)
@@ -237,7 +237,7 @@
   if {$::windowsOS} {
     ### Windows comes with it's own custom engines.dat, so shoul dnever reach here.
     tk_messageBox -type ok -icon info -title Scid \
-		  -message "No engines.dat found. Please reinstall or add engines manually."
+		  -message "Datei engines.dat nicht gefunden. Bitte neu installieren oder Engines manuell hinzufügen."
     return
   }
 
@@ -452,9 +452,9 @@
 
   label       $w.buttons3.seqLabel -text {Seq Count}
   spinbox $w.buttons3.seqCount -from 1 -to 8 -increment 1 -textvar analysis(boardSeqCount) -justify center -width 2
-  ::utils::tooltip::Set $w.buttons3.seqCount "MainPV visualisation length"
+  ::utils::tooltip::Set $w.buttons3.seqCount "MainPV-Visualisierungslänge"
 
-  checkbutton $w.buttons3.trafficlights -variable ::board::enableMPVTls -text "Colour Bar"
+  checkbutton $w.buttons3.trafficlights -variable ::board::enableMPVTls -text "Farbleiste"
 
   checkbutton $w.buttons3.lowpriority -variable analysis(lowPriority) -textvar tr(LowPriority)
 
@@ -507,8 +507,8 @@
   if {$index == ""  ||  $index < 0} { return }
   set e [lindex $engines(list) $index]
   set msg "Name: [lindex $e 0]
-Command: [lindex $e 1]\n
-Confirm delete\n"
+Befehl: [lindex $e 1]\n
+Löschen bestätigen\n"
   set answer [tk_messageBox -title Scid -icon question -type okcancel \
       -message $msg -parent .enginelist]
   if {$answer == "ok"} {
@@ -559,7 +559,7 @@
   lassign $e dummy0 engines(newCmd) engines(newArgs) engines(newDir) engines(newElo) dummy5 engines(newURL) engines(newUCI) engines(newUCIoptions)
 
   toplevel $w
-  wm title $w {Configure Engine}
+  wm title $w {Engine konfigurieren}
   wm state $w withdrawn
 
   set f [frame $w.frame]
@@ -580,16 +580,16 @@
       button $f.b$i -textvar tr(Browse) -command {
         if {$::windowsOS} {
           set scid_temp(filetype) {
-            {"Applications" {".bat" ".exe"} }
-            {"All files" {"*"} }
+            {"Programme" {".bat" ".exe"} }
+            {"Alle Dateien" {"*"} }
           }
         } else {
           set scid_temp(filetype) {
-            {"All files" {"*"} }
+            {"Alle Dateien" {"*"} }
           }
         }
         set scid_temp(cmd) [tk_getOpenFile -initialdir $engines(newDir) -parent .engineEdit \
-            -title "Scid: Select Executable" -filetypes $scid_temp(filetype)]
+            -title "Scid: Programmdatei auswählen" -filetypes $scid_temp(filetype)]
         if {$scid_temp(cmd) != ""} {
           set engines(newCmd) $scid_temp(cmd)
           # if {[string first " " $scid_temp(cmd)] >= 0} {
@@ -619,7 +619,7 @@
     }
 
     if {$i == "URL"} {
-      $f.l$i configure -text Webpage
+      $f.l$i configure -text Webseite
       button $f.bURL -text [tr FileOpen] -command {
         if {$engines(newURL) != ""} { openURL $engines(newURL) }
       }
@@ -631,7 +631,7 @@
 
   grid columnconfigure $f 1 -weight 1
 
-  label $f.lUCI -text Protocol
+  label $f.lUCI -text Protokoll
   frame $f.rb
   radiobutton $f.rb.uci -variable engines(newUCI) -value 1 -text UCI \
     -command "checkState ::engines(newUCI) $f.bUCI"
@@ -664,11 +664,11 @@
   incr row
 
   frame $w.radio
-  label $w.radio.label -text {Hot Key}
+  label $w.radio.label -text {Kurzbefehl}
   radiobutton $w.radio.f2	-text F2 -variable hotkey -value F2
   radiobutton $w.radio.f3	-text F3 -variable hotkey -value F3
   radiobutton $w.radio.f4	-text F4 -variable hotkey -value F4
-  radiobutton $w.radio.none	-text none -variable hotkey -value none
+  radiobutton $w.radio.none	-text Nichts -variable hotkey -value none
   # have to use "none" instead of "" to stop radio button ghosting bug
   bind $w <F2> {set hotkey F2}
   bind $w <F3> {set hotkey F3}
@@ -695,7 +695,7 @@
     if { $engines(newElo) == "" } { set engines(newElo) 0 }
     if {$engines(newName) == "" || $engines(newCmd) == "" || $engines(newDir) == ""} {
       tk_messageBox -title Scid -icon info -parent .engineEdit \
-        -message "The Name, Command and Directory fields must not be empty."
+        -message "Die Felder Name, Befehl und Verzeichnis dürfen nicht leer sein."
     } else {
       # Ok - now set time to file modification (mtime) of executable
       set engines(newTime) 0
@@ -825,9 +825,9 @@
   }
   if {$flag != {}} {
     if {$parent != ".enginelist"} {
-      set message "Due to possible file locking, please close $flag first."
+      set message "Wegen möglicher Dateisperre bitte zuerst $flag schließen."
     } else {
-      set message "Please close $flag first"
+      set message "Bitte zuerst $flag schließen."
     }
     tk_messageBox -title Scid -icon warning -type ok -parent $parent -message $message
     return 0
@@ -1176,8 +1176,8 @@
     return
   }
   if {$annotate(isBatch) && [sc_base isReadOnly]} {
-    set answer [tk_messageBox -title Tournanment -icon question -type okcancel \
-        -message "Database is read only, and batch annotations can't be saved.\n\nContinue ?" -parent .configAnnotation]
+    set answer [tk_messageBox -title Turnier -icon question -type okcancel \
+        -message "Datenbank kann nur gelesen und Kommentare können nicht gespeichert werden.\n\nFortsetzen?" -parent .configAnnotation]
     if {$answer != "ok"} {
       return
     }
@@ -1604,7 +1604,7 @@
       sc_var create
 
       if {$isBlunder == "2"} {
-	sc_pos setComment "Mate in [expr {abs($analysis(prevmate$n))}]"
+	sc_pos setComment "Matt in [expr {abs($analysis(prevmate$n))}]"
       }
 
       set moves $analysis(prevmoves$n)
@@ -1653,7 +1653,7 @@
 	sc_var create
 
 	if {$isBlunder == "2"} {
-	  sc_pos setComment "Mate in [expr {abs($analysis(prevmate$n))}]..."
+	  sc_pos setComment "Matt in [expr {abs($analysis(prevmate$n))}]..."
 	}
 
 	set moves $analysis(prevmoves$n)
@@ -2289,9 +2289,9 @@
     } else {
       set parent .
     }
-    tk_messageBox -title "Scid: error starting analysis" \
+    tk_messageBox -title "Scid: Fehler beim Start der Analyse" \
         -icon warning -type ok -parent $parent \
-        -message "Unable to start the program:\n$analysisCommand $analysisArgs\n$result"
+        -message "Kann das Programm nicht starten:\n$analysisCommand $analysisArgs\n$result"
 
     set analysisWin$n 0
     resetEngine $n
@@ -2517,10 +2517,10 @@
   $w.hist.text tag configure gray -foreground $color -lmargin2 [font measure font_Small xxxxxxxxxxxxxxxxxx]
 
   $w.hist.text tag configure blue -foreground darkblue
-  $w.text insert end "Please wait a few seconds for engine initialisation \
-      (with some engines, you will not see any analysis until the board \
-      changes. So if you see this message, try changing the board \
-      by moving backward or forward or making a new move.)"
+  $w.text insert end "Bitte ein paar Sekunden für die Engine-Initialisierung warten \
+      (bei einigen Engines sieht man keine Analyse, bis das Brett \
+      sich ändert. Wenn Sie also diese Nachricht sehen, versuchen Sie, das Brett zu verändern \
+      durch rückwärts oder vorwärts ziehen oder mit einem neuen Zug.)"
   $w.text configure -state disabled
   bind $w <Destroy> "if {\"%W\" == \"$w\"} {destroyAnalysisWin $n}"
   bind $w <Escape> "focus .main ; destroy $w"
@@ -3205,11 +3205,11 @@
     if { $exit_status != 0 } {
 	logEngineNote $n {Engine terminated with exit code $exit_status: "\"$standard_error\""}
 	tk_messageBox -type ok -icon info -parent $parent -title Scid \
-		      -message "The analysis engine terminated with exit code $exit_status: \"$standard_error\""
+		      -message "Die Analyse-Engine terminierte mit dem Exitcode $exit_status: \"$standard_error\""
     } else {
 	logEngineNote $n {Engine terminated without exit code: "\"$standard_error\""}
 	tk_messageBox -type ok -icon info -parent $parent -title Scid \
-		      -message "The analysis engine terminated without exit code: \"$standard_error\""
+		      -message "Die Analyse-Engine terminierte ohne Exitcode: \"$standard_error\""
     }
 
   }
@@ -4221,7 +4221,7 @@
   toplevel $w
   #wm transient $w .analysisWin
   wm state $w withdrawn
-  wm title $w "Engine thinking time"
+  wm title $w "Engine-Bedenkzeit"
   wm resizable $w 0 0
   label $w.label -textvar tr(AnnotateTime)
   pack $w.label -side top -pady 5 -padx 5
Index: tcl/tools/calvar.tcl
===================================================================
--- tcl/tools/calvar.tcl	(revision 3620)
+++ tcl/tools/calvar.tcl	(working copy)
@@ -102,7 +102,7 @@
 
     # if no engines defined, bail out
     if {$i == 0} {
-      tk_messageBox -type ok -message "No UCI engine defined" -icon error
+      tk_messageBox -type ok -message "Keine UCI-Engine definiert" -icon error
       destroy $w
       return
     }
@@ -112,12 +112,12 @@
     frame $w.parameters
     pack $f
 
-    label $f.lTime2 -text "Initial thinking time"
+    label $f.lTime2 -text "Anfängliche Bedenkzeit"
     spinbox $f.sbTime2  -width 3 -textvariable ::calvar::thinkingTimePosition -from 5 -to 300 -increment 5 -validate all -vcmd {string is int %P}
     grid $f.lTime2 -row 0 -column 0
     grid $f.sbTime2 -row 0 -column 1
 
-    label $f.lTime -text "Variation thinking time"
+    label $f.lTime -text "Bedenkzeit Variante"
     spinbox $f.sbTime  -width 3 -textvariable ::calvar::thinkingTimePerLine -from 5 -to 120 -increment 5 -validate all -vcmd {string is int %P}
     grid $f.lTime -row 1 -column 0
     grid $f.sbTime -row 1 -column 1
@@ -186,7 +186,7 @@
 
     set f $w.fPieces
     frame $f
-    label $f.lPromo -text "Promotion"
+    label $f.lPromo -text "Umwandlung"
     pack $f.lPromo -side left
     foreach piece { "q" "r" "b" "n" } {
       button $f.p$piece -image w${piece}20 -command "::calvar::promo $piece"
Index: tcl/tools/correspondence.tcl
===================================================================
--- tcl/tools/correspondence.tcl	(revision 3620)
+++ tcl/tools/correspondence.tcl	(working copy)
@@ -90,7 +90,7 @@
 		global ::Xfcc::xfccrc ::Xfcc::xfccrcfile
 		# file delete $xfccrcfile
 		if {[catch {open $xfccrcfile w} optionF]} {
-			::splash::add "$xfccrcfile can not be created" error
+			::splash::add "$xfccrcfile kann nicht erstellt werden" error
 		} else {
 			# devide by 4 as the size function returns all subarray entries
 			set size [expr [ array size ::Xfcc::xfccsrv ] / 4]
@@ -937,7 +937,7 @@
 	set scidConfigFiles(xfccstate) "xfccstate.dat"
 	if {[catch {source [scidConfigFile xfccstate]} ]} {
 	} else {
-	  ::splash::add "Xfcc state found and restored."
+	  ::splash::add "Xfcc-Status gefunden und wiederhergestellt."
 	}
 
 }
@@ -1356,7 +1356,7 @@
 	# $filespecs: the specs of the file (currently ignored)
 	#----------------------------------------------------------------------
 	proc chooseFile {i filespecs} {
-		set fullname [tk_getOpenFile -initialdir $::env(HOME) -title "Scid Correspondence Chess: Select $i"]
+		set fullname [tk_getOpenFile -initialdir $::env(HOME) -title "Scid Fernschach: $i auswählen"]
 		if {$fullname == ""} { return }
 	  
 		return $fullname
@@ -1383,7 +1383,7 @@
 	proc chooseInbox    {} {
 		global ::CorrespondenceChess::Inbox
 
-		set filetype { "All files" {".*"} }
+		set filetype { "Alle Dateien" {".*"} }
 		set Inbox [file dirname [chooseFile "default correspondence chess Inbox..." $filetype]]
 	}
 
@@ -1395,7 +1395,7 @@
 	proc chooseOutbox   {} {
 		global ::CorrespondenceChess::Outbox               \
 
-		set filetype { "All files" {".*"} }
+		set filetype { "Alle Dateien" {".*"} }
 		set Outbox [file dirname [chooseFile "default correspondence chess Outbox..." $filetype]]
 	}
 
@@ -1410,7 +1410,7 @@
 	proc chooseFetch    {} {
 		global ::CorrespondenceChess::XfccFetchcmd
 
-		set filetype { "All files" {".*"} }
+		set filetype { "Alle Dateien" {".*"} }
 		set XfccFetchcmd [chooseFile "default correspondence chess Fetch Tool..." $filetype]
 	}
 
@@ -1421,7 +1421,7 @@
 	proc chooseSend     {} {
 		global ::CorrespondenceChess::XfccSendcmd
 
-		set filetype { "All files" {".*"} }
+		set filetype { "Alle Dateien" {".*"} }
 		set XfccSendcmd [chooseFile "default correspondence chess Send Tool..." $filetype]
 	}
 
@@ -1433,8 +1433,8 @@
 
 		if {![file exists $xfccrcfile]} {
 			if {[catch {open $xfccrcfile w} optionF]} {
-				tk_messageBox -title "Scid: Unable to write file" -type ok -icon warning \
-					-message "Unable to write options file: $xfccrcfile\n$optionF"
+				tk_messageBox -title "Scid: kann Datei nicht schreiben" -type ok -icon warning \
+					-message "Kann Optionendatei nicht schreiben:" $xfccrcfile\n$optionF"
 			} else {
 				puts $optionF "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
 				puts $optionF "<xfcc>"
@@ -1463,7 +1463,7 @@
 			set fName [file rootname $CorrBase]
 			if {[catch {sc_base create $fName} result]} {
 					tk_messageBox -icon warning -type ok \
-						-title "Scid: Unable to create base" -message $result
+						-title "Scid: Datenbank kann nicht erstellt werden" -message $result
 			}
 			# Type 6 == Correspondence chess
 			sc_base type [sc_base current] 6
@@ -1510,8 +1510,8 @@
 	proc saveCCoptions {} {
 		set optionF ""
 		if {[catch {open [scidConfigFile correspondence] w} optionF]} {
-			tk_messageBox -title "Scid: Unable to write file" -type ok -icon warning \
-				-message "Unable to write options file: [scidConfigFile correspondence]\n$optionF"
+			tk_messageBox -title "Scid: kann Datei nicht schreiben" -type ok -icon warning \
+				-message "Kann Optionendatei nicht schreiben:" [scidConfigFile correspondence]\n$optionF"
 		} else {
 			# Check all paths etc. exist and contain valid data
 			::CorrespondenceChess::checkInOutbox
@@ -2722,7 +2722,7 @@
 				return
 			}
 
-			set typeCorr [lsearch $base_types {Correspondence chess} ]
+			set typeCorr [lsearch $base_types {Fernschach} ]
 			for {set x 1} {$x <= [ expr [sc_base count]-1 ]} {incr x} {
 					set type [sc_base type $x]
 					if {$type == $typeCorr} {
@@ -2752,7 +2752,7 @@
 		if {[catch {::file::Open $fName} result]} {
 			set err 1
 			tk_messageBox -icon warning -type ok \
-				-title "Scid: Error opening file" -message $result
+				-title "Scid: Fehler beim Öffnen der Datei" -message $result
 		} else {
 			if {[file extension $fName] == ".si3"} {
 				# file has been converted to si4
@@ -3922,10 +3922,10 @@
 
 		if {[regexp -nocase ^(https://)(.*) $uri]} {
 			if {[catch {package require tls} tls_version]} {
-				tk_messageBox -title "Xfcc Oops" -type ok -icon warning -message $::CorrespondenceChess::NoHTTPS
+				tk_messageBox -title "Xfcc Hoppla" -type ok -icon warning -message $::CorrespondenceChess::NoHTTPS
 				return 0
 			} else {
-				::splash::add "Loaded package tls, version $tls_version"
+				::splash::add "tls-Paket geladen, Version $tls_version"
 				::tls::init -ssl3 false -ssl2 false -tls1 true
 				http::register https 443 ::tls::socket
 				set ::CorrespondenceChess::SeenHTTPS 1
@@ -3943,22 +3943,22 @@
 
 	set scidConfigFiles(correspondence) "correspondence.dat"
 	if {[catch {source [scidConfigFile correspondence]} ]} {
-	  ::splash::add "Unable to load Correspondence options file correspondence.dat"
+	  ::splash::add "Kann Fernschachoptionendatei correspondence.dat nicht laden"
 	} else {
-	  ::splash::add "Correspondence Chess: correspondence.dat loaded."
+	  ::splash::add "Fernschach: correspondence.dat geladen."
 	}
 
 	if {[catch {set version [package require http]}]} {
-	  ::splash::add "http package not found, disabling internal Xfcc support"
+	  ::splash::add "http-Paket nicht gefunden, interne Xfcc-Unterstützung nicht aktiv"
 		set XfccInternal -1
 	} else {
-		::splash::add "http package $version found"
+		::splash::add "http-Paket $version gefunden"
 		::http::config -useragent $::Xfcc::useragent
 		if {[catch {set version [package require tdom]}]} {
-			::splash::add "tDOM package not found, disabling internal Xfcc support"
+			::splash::add "tDOM-Paket nicht gefunden, interne Xfcc-Unterstützung nicht aktiv"
 			set XfccInternal -1
 		} else {
-			::splash::add "tDOM package $version found, internal Xfcc support enabled"
+			::splash::add "tDOM-Paket $version gefunden, interne Xfcc-Unterstützung aktiviert"
 		}
 	}
 
Index: tcl/tools/email.tcl
===================================================================
--- tcl/tools/email.tcl	(revision 3620)
+++ tcl/tools/email.tcl	(working copy)
@@ -14,12 +14,12 @@
   }
   if {! [sc_base inUse] || [sc_base current] == 9} {
     tk_messageBox -icon info -type ok \
-       -title "Oops" -message "No database open."
+       -title "Hoppla" -message "Keine Datenbank geöffnet."
     return
   }
 
   toplevel $w
-  wm title $w "Scid: Email Manager"
+  wm title $w "Scid: E-Mail-Manager"
   wm minsize $w 25 10
 
   bind $w <Destroy> {set .emailWin 0}
@@ -32,7 +32,7 @@
   pack $w.b -side right -fill y
 
   set f $w.f
-  label $f.title -text "Opponent list" -font font_Bold
+  label $f.title -text "Gegnerliste" -font font_Bold
   listbox $f.list -height 16 -width 40 -exportselection false \
     -selectmode browse -font font_Fixed \
     -yscrollcommand "$f.scroll set"  -setgrid 1
@@ -56,7 +56,7 @@
 
   set b .emailWin.b
 
-  button $b.add -text "Add" -underline 0 -command {
+  button $b.add -text "Hinzufügen" -underline 0 -command {
     set idx [llength $emailData]
     lappend emailData [list "" "" "" "" ""]
     modifyEmailDetails $idx
@@ -63,21 +63,21 @@
     ::tools::email::refresh
   }
 
-  button $b.edit -text "Edit..." -underline 0 -command ::tools::email::EditButton
-  button $b.delete -text "Delete..." -underline 0 -command ::tools::email::DeleteButton
-  button $b.load -text "Load game" -underline 0 -command ::tools::email::LoadButton
-  button $b.send -text "Send email..." -underline 0 -command ::tools::email::SendButton
-  menubutton $b.time -text "Time" -underline 0 -indicatoron 1 \
+  button $b.edit -text "Bearbeiten..." -underline 0 -command ::tools::email::EditButton
+  button $b.delete -text "Löschen..." -underline 0 -command ::tools::email::DeleteButton
+  button $b.load -text "Lade Partie" -underline 0 -command ::tools::email::LoadButton
+  button $b.send -text "Sende E-Mail..." -underline 0 -command ::tools::email::SendButton
+  menubutton $b.time -text "Zeit" -underline 0 -indicatoron 1 \
     -menu $b.time.m -relief raised
   menu $b.time.m
-  $b.time.m add command -label "Received today" -underline 0 \
+  $b.time.m add command -label "Heute erhalten" -underline 0 \
     -command {::tools::email::TimesButton r}
-  $b.time.m add command -label "Sent today" -underline 0 \
+  $b.time.m add command -label "Heute gesendet" -underline 0 \
     -command {::tools::email::TimesButton s}
-  $b.time.m add command -label "Edit..." -underline 0 \
+  $b.time.m add command -label "Editieren ..." -underline 0 \
     -command {::tools::email::TimesButton e}
 
-  button $b.config -text "Settings" -command ::tools::email::config
+  button $b.config -text "Einstellungen" -command ::tools::email::config
   button $b.help -text $::tr(Help) -command { helpWindow Email }
   button $b.close -text $::tr(Close) -command { destroy .emailWin }
 
@@ -107,12 +107,12 @@
   wm withdraw $w
 
   wm title $w Scid
-  label $w.use -text "Send email using:" -font font_Bold
+  label $w.use -text "Sende E-Mail mit:" -font font_Bold
   frame $w.smtp
-  radiobutton $w.smtp.b -text "SMTP server:" -variable email(smtp) -value 1
+  radiobutton $w.smtp.b -text "SMTP-Server:" -variable email(smtp) -value 1
   entry $w.smtp.s -width 30 -textvar email(server) 
   frame $w.sm
-  radiobutton $w.sm.b -text "sendmail process:" -variable email(smtp) -value 0
+  radiobutton $w.sm.b -text "Sendmailprozeß:" -variable email(smtp) -value 0
   entry $w.sm.s -width 30 -textvar email(smproc) 
   pack $w.use -side top
   pack $w.smtp $w.sm -side top -fill x
@@ -119,9 +119,9 @@
   pack $w.smtp.s $w.smtp.b -side right
   pack $w.sm.s $w.sm.b -side right
   addHorizontalRule $w
-  label $w.addr -text "Email address fields:" -font font_Bold
+  label $w.addr -text "E-Mail-Adressfelder:" -font font_Bold
   frame $w.from
-  label $w.from.lab -text "From:"
+  label $w.from.lab -text "Von:"
   entry $w.from.e -textvar email(from) -width 30 
   frame $w.bcc
   label $w.bcc.lab -text "Bcc:"
@@ -162,8 +162,8 @@
   set idx [lindex $sel 0]
   if {[llength $emailData] <= $idx} { return }
   set confirm [tk_messageBox -icon question -type yesno -default yes \
-                 -parent .emailWin -title "Really delete opponent?" \
-                 -message "Do you really want to delete this opponent?"]
+                 -parent .emailWin -title "Wirklich Gegner löschen?" \
+                 -message "Wollen Sie wirklich diesen Gegner löschen?"]
   if {$confirm == "yes"} {
       set emailData [lreplace $emailData $idx $idx]
     ::tools::email::writeOpponentFile $emailData
@@ -221,7 +221,7 @@
   if {[winfo exists $w]} { return }
   toplevel $w
   wm title $w "Scid: Email Times"
-  label $w.title -text "Email Times for [lindex $details 0]"
+  label $w.title -text "E-Mail-Zeiten für [lindex $details 0]"
   frame $w.t
   text $w.t.text -height 15 -width 30 -font font_Fixed -setgrid 1 \
     -yscrollcommand "$w.t.ybar set"
@@ -360,15 +360,15 @@
   wm title $w "Send email to $name"
   set f [frame $w.fields]
 
-  label $f.fromlab -text "From: "
+  label $f.fromlab -text "Von: "
   entry $f.from 
   $f.from insert end $email(from)
 
-  label $f.tolab -text "To: "
+  label $f.tolab -text "An: "
   entry $f.to 
   $f.to insert end $addr
 
-  label $f.subjlab -text "Subject: "
+  label $f.subjlab -text "Betreff: "
   entry $f.subj 
   $f.subj insert end $subj
 
@@ -376,8 +376,8 @@
   entry $f.bcc 
   $f.bcc insert end $email(bcc)
 
-  button $f.send -text "Send" -command "::tools::email::processMessage $w $idx"
-  button $f.cancel -text "Cancel" -command "destroy $w"
+  button $f.send -text "Senden" -command "::tools::email::processMessage $w $idx"
+  button $f.cancel -text "Abbrechen" -command "destroy $w"
 
   grid $f.send -row 0 -column 3 -rowspan 2 -sticky nesw
   grid $f.cancel -row 2 -column 3 -rowspan 2 -sticky nesw
@@ -434,14 +434,14 @@
   set bcc [$w.fields.bcc get]
   set message [$w.message.text get 1.0 end]
   if {[string trim $to] == ""} {
-    tk_messageBox -icon error -type ok -title "Empty email address" \
-      -message "You must specify an email address."
+    tk_messageBox -icon error -type ok -title "Leere E-Mail-Adresse" \
+      -message "Sie müssen eine E-Mail-Adresse angeben."
     return
   }
   set cmd {::tools::email::sendMessage $from $to $subj $bcc $message}
   if {[catch $cmd result] != 0} {
-    tk_messageBox -icon error -type ok -title "Error sending email" \
-      -message "Error sending email: $result"
+    tk_messageBox -icon error -type ok -title "Fehler beim Senden der E-Mail" \
+      -message "Fehler beim Senden der E-Mail: $result"
   } else {
     ::tools::email::addSentReceived $idx s
     tk_messageBox -icon info -type ok -title Scid -message $result
@@ -499,7 +499,7 @@
   puts $copy_id  ""
   puts $copy_id $message
   close $copy_id
-  return "The email message was sent; a copy was appended to $email(logfile)"
+  return "Die E-Mail-Nachricht wurde abgesandt; eine Kopie wurde an $email(logfile) angehängt"
 }
 
 proc modifyEmailDetails {i} {
@@ -521,15 +521,15 @@
   entry $f.entry -width 30  -textvariable emailData_name
 
   set f [frame $w.addr]
-  label $f.label -text "Email address: "
+  label $f.label -text "E-Mailadresse: "
   entry $f.entry -width 30  -textvariable emailData_addr
 
   set f [frame $w.subj]
-  label $f.label -text "Subject: "
+  label $f.label -text "Betreff: "
   entry $f.entry -width 30  -textvariable emailData_subj
 
   set f [frame $w.glist]
-  label $f.label -text "Game Numbers: "
+  label $f.label -text "Partienummern: "
   entry $f.entry -width 30  -textvariable emailData_glist
 
   foreach f {name addr subj glist} {
@@ -541,7 +541,7 @@
   addHorizontalRule $w
 
   set f [frame $w.sig]
-  label $f.label -text "Signature: " -anchor n
+  label $f.label -text "Signatur: " -anchor n
   text $f.entry -width 30 -height 5 
 
   pack $f -side top -fill x
@@ -550,11 +550,11 @@
   addHorizontalRule $w
 
   set f [frame $w.buttons]
-  button $w.buttons.save -text "Save" -command {
+  button $w.buttons.save -text "Speichern" -command {
     set gNumberErr [::tools::email::validGameNumbers $emailData_glist]
     if {$gNumberErr != -1} {
-      tk_messageBox -icon error -type ok -title "Invalid data" \
-        -message "The games list contains an invalid game number: $gNumberErr; there are only [sc_base numGames] games in this database."
+      tk_messageBox -icon error -type ok -title "Ungültige Daten" \
+        -message "Die Partienliste enthält eine ungültige Partienummer: $gNumberErr; es gibt nur [sc_base numGames] Partien in dieser Datenbank."
     } else {
       set emailData [lreplace $emailData $emailData_index \
                        $emailData_index \
@@ -566,7 +566,7 @@
       ::tools::email::refresh
     }
   }
-  button $f.cancel -text "Cancel" -command {
+  button $f.cancel -text "Abbrechen" -command {
     set emailData [::tools::email::readOpponentFile]
     destroy .emailEditor
     ::tools::email::refresh
Index: tcl/tools/fics.tcl
===================================================================
--- tcl/tools/fics.tcl	(revision 3620)
+++ tcl/tools/fics.tcl	(working copy)
@@ -77,7 +77,7 @@
 
     toplevel $w
     wm state $w withdrawn
-    wm title $w "Configure Fics"
+    wm title $w "FICS konfigurieren"
     label $w.lLogin -text "$tr(CCDlgLoginName)"
     entry $w.login -width 20 -textvariable ::fics::login
     label $w.lPwd -text [tr "CCDlgPassword"]
@@ -161,7 +161,7 @@
     button $w.button.help -text $tr(Help) -command {helpWindow FICS}
 
     button $w.button.defaults -textvar tr(Defaults) -command {
-      if {[tk_dialog .ficsConfig.dialog Abort "This will reset all FICS options. Do you wish to continue ?" question {} [tr Yes] [tr No]] == 0} {
+      if {[tk_dialog .ficsConfig.dialog Abort "Dies setzt alle FICS-Optionen zurück. Wollen Sie weitermachen?" question {} [tr Yes] [tr No]] == 0} {
 	initFICSDefaults
 	raiseWin .ficsConfig
       }
@@ -256,7 +256,7 @@
        } err ]} {
 	  ::fics::unbusy_config
 	  $b configure -state normal
-          tk_messageBox -icon error -type ok -title "Unable to contact $::fics::server" -message $err -parent .ficsConfig
+          tk_messageBox -icon error -type ok -title "Kann nicht $::fics::server kontaktieren" -message $err -parent .ficsConfig
           return
     }
 
@@ -270,7 +270,7 @@
 
       if { [catch {set peer [ fconfigure $sockChan -peername ]} err]} {
         if {$i == $timeOut} {
-          tk_messageBox -icon error -type ok -title "Unable to contact $::fics::server" -message $err -parent .ficsConfig
+          tk_messageBox -icon error -type ok -title "Kann nicht $::fics::server kontaktieren" -message $err -parent .ficsConfig
 	  $b configure -state normal
 	  unbusyCursor .
           return
@@ -301,8 +301,8 @@
     global ::fics::sockchan ::fics::seeklist ::fics::graph fontOptions tr
 
     if { $guest=="no" && $::fics::reallogin == ""} {
-      tk_messageBox -title "Error" -icon error -type ok -parent .ficsConfig \
-        -message "No login name specified" -parent .ficsConfig
+      tk_messageBox -title "Fehler" -icon error -type ok -parent .ficsConfig \
+        -message "Kein Anmeldename angegeben" -parent .ficsConfig
       return
     }
 
@@ -309,13 +309,13 @@
     # check timeseal configuration
     if {$::fics::use_timeseal} {
       if {![file executable $::fics::timeseal_exec] || ![file isfile $::fics::timeseal_exec]} {
-        tk_messageBox -title "Error" -icon error -type ok -message "Timeseal error : \"$::fics::timeseal_exec\" not executable" -parent .ficsConfig
+        tk_messageBox -title "Fehler" -icon error -type ok -message "Timeseal-Fehler: \"$::fics::timeseal_exec\" ist nicht ausführbar" -parent .ficsConfig
         return
       }
     }
     if {$::fics::use_zseal} {
       if {![file executable $::fics::zseal_exec] || ![file isfile $::fics::zseal_exec]} {
-        tk_messageBox -title "Error" -icon error -type ok -message "Zseal error : \"$::fics::zseal_exec\" not executable" -parent .ficsConfig
+        tk_messageBox -title "Fehler" -icon error -type ok -message "Zseal-Fehler: \"$::fics::zseal_exec\" not executable" -parent .ficsConfig
         return
       }
     }
@@ -533,7 +533,7 @@
     incr row
     button $w.bottom.buttons.offers  -text "$tr(FICSOffers) $tr(Graph)" -command {
       if {$::fics::playing == 1 || $::fics::playing == -1} {
-	::fics::updateConsole "Scid: Offers Graph disabled while playing a game"
+	::fics::updateConsole "Scid: Grafikangebot ist während Partie deaktiviert"
 	return
       }
       set ::fics::graph(on) [expr {! $::fics::graph(on)}]
@@ -607,7 +607,7 @@
     }
     if {[catch $command result]} {
       unbusyCursor .
-      tk_messageBox -title "Error" -icon error -type ok -message "Network error\nError executing $command" -parent .fics
+      tk_messageBox -title "Fehler" -icon error -type ok -message "Netzwerkfehler\nFehler beim Ausführen von $command" -parent .fics
       return
     }
 
@@ -687,7 +687,7 @@
       smoves {
 	  # smoves recreates a game without any further announcment
 	  if {$::fics::playing == 1 || $::fics::playing == -1} {
-	    ::fics::updateConsole "Scid: smoves disabled while playing a game"
+	    ::fics::updateConsole "Scid: smoves ist während einer Partie deaktiviert"
 	    return
 	  }
 
@@ -721,13 +721,13 @@
           set plus [expr {[string index [lindex $c 0] end] == "+"}]
 
 	  if {$plus && $::fics::playing == 1 || $::fics::playing == -1} {
-	    updateConsole "Scid: follow+ disabled while playing a game"
+	    updateConsole "Scid: follow+ ist während einer Partie deaktiviert"
 	    return
 	  }
 
           set l2 [lindex $l 1]
           if {$plus && ($l2 == {} || [string index $l2 0] == {/})} {
-	    updateConsole "Scid: follow+ needs a player name"
+	    updateConsole "Scid: follow+ benötigt einen Spielernamen"
 	    return
           }
 
@@ -830,7 +830,7 @@
     }
     toplevel $w
     wm state $w withdrawn
-    wm title $w "Find Opponent"
+    wm title $w "Suche Gegner"
 
     set row 0
 
@@ -914,8 +914,8 @@
       ::fics::writechan $cmd
       catch {destroy .ficsfindopp}
       ::fics::initOffers
-    } -width 10
-    button $w.help   -text $tr(Help) -command "helpWindow FICSfindopp" -width 10
+    } -width 13
+    button $w.help   -text $tr(Help) -command "helpWindow FICSfindopp" -width 13
     button $w.cancel -text $tr(Cancel) -command "catch \{destroy $w\}" -width 10
 
     bind $w <F1> {helpWindow FICSfindopp}
@@ -935,7 +935,7 @@
     variable logged
     if {[eof $::fics::sockchan]} {
       fileevent $::fics::sockchan readable {}
-      tk_messageBox -title "Read error" -icon error -type ok -message "Network error\nFics will exit." -parent .fics
+      tk_messageBox -title "Lesefehler" -icon error -type ok -message "Netzwerkfehler\nFics wird beendet." -parent .fics
       ::fics::close error
       return
     }
@@ -1236,7 +1236,7 @@
         set t2 [::gameclock::getSec 2]
 	if {$t1 < 0} {set t1 0}
 	if {$t2 < 0} {set t2 0}
-	::commenteditor::appendComment "$resultcomment\nWhiteclock [expr $t1 / 60]:[format {%02i} [expr $t1 % 60]] Blackclock [expr $t2 / 60]:[format {%02i} [expr $t2 % 60]]"
+	::commenteditor::appendComment "$resultcomment\nUhr Weiß [expr $t1 / 60]:[format {%02i} [expr $t1 % 60]] Uhr Schwarz [expr $t2 / 60]:[format {%02i} [expr $t2 % 60]]"
         sc_game tags set -result $res
         # if {![string match  {*Game aborted*} $line]}
         if {[sc_pos moveNumber] > 2} {
@@ -1256,11 +1256,11 @@
 	    ::utils::sound::PlayMove sound_end
 	  }
 	  if {! $::fics::no_results && ($res != "*" || [sc_pos moveNumber] > 1)} {
-	    if {[string match "1/2*" $res]} {set res Draw}
+	    if {[string match "1/2*" $res]} {set res Remis}
 	    ::fics::killDialogs
             # pause a second to allow the move animation to complete
             after [expr {2 * $::animateDelay}] "
-	      tk_messageBox -title \"Game result\" -icon info -type ok -message \"$res\"
+	      tk_messageBox -title \"Partieergebnis\" -icon info -type ok -message \"$res\"
             "
 	    # Game can end while dragging a piece, this can carry over, so try to handle
 	    clearAllMoves
@@ -1487,7 +1487,7 @@
         writechan decline
       } else {
 	::fics::killDialogs
-	set ans [tk_dialog .fics_dialog Abort "$line\nDo you accept ?" question {} Yes No Ignore]
+	set ans [tk_dialog .fics_dialog Abbrechen "$line\nNehmen Sie an?" question {} Ja Nein Ignorieren]
 	switch -- $ans {
 	  0 {writechan accept}
 	  1 {writechan decline}
@@ -1499,7 +1499,7 @@
     # takeback
     if {[string match "* would like to take back *" $line] && ! $::fics::no_requests && ! $::fics::ignore_takeback} {
       ::fics::killDialogs
-      set ans [tk_dialog .fics_dialog {Take Back} "$line\nDo you accept ?" question {} Yes No Ignore]
+      set ans [tk_dialog .fics_dialog {Zurücknehmen} "$line\nNehmen Sie an?" question {} Ja Nein Ignorieren]
       switch -- $ans {
         0 {
             writechan accept
@@ -1518,13 +1518,13 @@
     # draw
     if {[string match "*offers you a draw*" $line] && ! $::fics::ignore_draw} {
       if {[regexp {(.*) offers you a draw} $line t1 t2]} {
-	::commenteditor::appendComment "$t2 offers draw"
+	::commenteditor::appendComment "$t2 bietet Remis"
       }
       if {$::fics::no_requests} {
         writechan decline
       } else {
         ::fics::killDialogs
-	set ans [tk_dialog .fics_dialog {Draw Offered} "$line\nDo you accept ?" question {} Yes No Ignore]
+	set ans [tk_dialog .fics_dialog {Remis wird angeboten} "$line\nNehmen Sie an?" question {} Ja Nein Ignorieren]
 	switch -- $ans {
 	  0 {writechan accept}
 	  1 {writechan decline}
@@ -1539,7 +1539,7 @@
         writechan decline
       } else {
         ::fics::killDialogs
-	set ans [tk_dialog .fics_dialog {Adjourn Offered} "$line\nDo you accept ?" question {} Yes No Ignore]
+	set ans [tk_dialog .fics_dialog {Aufschieben wird angeboten} "$line\nNehmen Sie an?" question {} Ja Nein Ignorieren]
 	switch -- $ans {
 	  0 {writechan accept}
 	  1 {writechan decline}
@@ -1716,7 +1716,7 @@
                             switch -glob $t2 {
                               mamer* {
 				      if {! $::fics::no_results} {
-					tk_messageBox -title Mamer -icon info -type ok -parent .fics -message "$t2 tells you" -detail $t3
+					tk_messageBox -title Mamer -icon info -type ok -parent .fics -message "$t2 sagt Ihnen" -detail $t3
 				      }
 				    }
                               ROBO* {
@@ -1821,8 +1821,8 @@
 
     toplevel $w
     wm state $w withdrawn
-    wm title $w "Fics Offers"
-    pack [label $w.title -text "$::tr(FICSOffers) for $::fics::reallogin" -font font_Regular] -side top -padx 20 -pady 5
+    wm title $w "FICS-Angebote"
+    pack [label $w.title -text "$::tr(FICSOffers) für $::fics::reallogin" -font font_Regular] -side top -padx 20 -pady 5
 
     pack [button $w.cancel -text $::tr(Cancel) \
 	-command "::fics::writechan unseek ; catch \{destroy $w\}"] -side bottom -pady 5
@@ -2158,8 +2158,8 @@
 	updateBoard -pgn
       }
       if {$::fics::examNotify} {
-	wm title $::dot_w "$::scidName: $white - $black (examining game $game)"
-	updateConsole "Now examining game $game"
+	wm title $::dot_w "$::scidName: $white - $black (untersuche Partie $game)"
+	updateConsole "Untersuche jetzt Partie $game"
 	set ::fics::examNotify 0
       }
       return
@@ -2250,7 +2250,7 @@
     }
 
     if {$fen == [sc_pos fen]} {
-      wm title $::dot_w "$::scidName: $white - $black (game $game: $::fics::timecontrol)"
+      wm title $::dot_w "$::scidName: $white - $black (Partie $game: $::fics::timecontrol)"
       updateBoard -pgn -animate
     } elseif {$whiteTime > 0 && $blackTime > 0} {
       ### Game out of sync, probably due to player takeback request (or opponent take back 2).
@@ -2317,7 +2317,7 @@
 
       set ::fics::mutex 0
       updateBoard -pgn
-      wm title $::dot_w "$::scidName: $white - $black (game $game: $::fics::timecontrol)"
+      wm title $::dot_w "$::scidName: $white - $black (Partie $game: $::fics::timecontrol)"
       after idle ::tools::graphs::score::Refresh
 
       if {$::fics::playing != 1 && $::fics::playing != -1 && $::fics::observedGames != {}} {
@@ -2517,7 +2517,7 @@
   proc writechan {line {echo "noecho"}} {
     after cancel ::fics::stayConnected
     if {[eof $::fics::sockchan]} {
-      tk_messageBox -title "Write error" -icon error -type ok -message "Network error\nFics will exit"
+      tk_messageBox -title "Schreibfehler" -icon error -type ok -message "Netzwerkfehler\nFics wird beendet"
       ::fics::close error
       return
     }
@@ -2559,7 +2559,7 @@
     # Unused
     if {$mode == "safe"} {
       ::fics::killDialogs
-      set ans [tk_dialog .fics_dialog Abort "You are playing a game\nDo you want to exit ?" question {} Exit Cancel ]
+      set ans [tk_dialog .fics_dialog Abbrechen "Sie spielen eine Partie\nWollen Sie aufhören?" question {} Ende Abbrechen ]
       if {$ans == 1} {
 	bind .fics <Destroy> ::fics::close
         return
@@ -2577,7 +2577,7 @@
         set t2 [::gameclock::getSec 2]
 	if {$t1 < 0} {set t1 0}
 	if {$t2 < 0} {set t2 0}
-	::commenteditor::appendComment "Disconnected\nWhiteclock [expr $t1 / 60]:[format {%02i} [expr $t1 % 60]] Blackclock [expr $t2 / 60]:[format {%02i} [expr $t2 % 60]]"
+	::commenteditor::appendComment "Unterbrochen\nUhr Weiß [expr $t1 / 60]:[format {%02i} [expr $t1 % 60]] Uhr Schwarz [expr $t2 / 60]:[format {%02i} [expr $t2 % 60]]"
         if {[sc_pos moveNumber] > 2} {
           catch {::game::Save}
           updateBoard -pgn
@@ -2658,7 +2658,7 @@
   }
 
   proc setForeGround {} {
-    set fg [tk_chooseColor -initialcolor $::fics::consolefg -title {FICS Text} -parent .]
+    set fg [tk_chooseColor -initialcolor $::fics::consolefg -title {FICS-Textfarben} -parent .]
     if {![catch {.fics.console.text configure -fg $fg}]} {
       set ::fics::consolefg $fg
     }
@@ -2665,7 +2665,7 @@
   }
 
   proc setBackGround {} {
-    set bg [tk_chooseColor -initialcolor $::fics::consolebg -title {FICS Background} -parent .]
+    set bg [tk_chooseColor -initialcolor $::fics::consolebg -title {FICS-Hintergrundfarben} -parent .]
     if {![catch {.fics.console.text configure -bg $bg}]} {
       set ::fics::consolebg $bg
     }
Index: tcl/tools/graphs.tcl
===================================================================
--- tcl/tools/graphs.tcl	(revision 3620)
+++ tcl/tools/graphs.tcl	(working copy)
@@ -12,14 +12,14 @@
 
 proc ::tools::graphs::Save {mode w} {
   if {! [winfo exists $w]} { return }
-  set ftypes {{"PostScript files" {.eps .ps}} {"All files" *}}
+  set ftypes {{"PostScript-Dateien" {.eps .ps}} {"Alle Dateien" *}}
   set fname [tk_getSaveFile -initialdir $::env(HOME) -filetypes $ftypes -parent $w \
-               -defaultextension ".eps" -title "Scid: Save Graph"]
+               -defaultextension ".eps" -title "Scid: Grafik speichern"]
   if {$fname == ""} {
     return
   }
   if {![file writable [file dirname $fname]]} {
-    tk_messageBox -icon info -parent $w -title Scid -message "File $fname not writeable."
+    tk_messageBox -icon info -parent $w -title Scid -message "Datei $fname nicht schreibbar."
     return
   }
   if {[catch {$w postscript -file $fname -colormode $mode} result]} {
@@ -675,31 +675,31 @@
     Score {
       set lineGraph 0
       set values $scoreValues
-      set title "[tr Score] [tr Graph]"
+      set title "Bewertungsgrafik"
     }
     Time {
       set lineGraph 0
       set values $emtValues
-      set title "[tr Time] [tr Graph] ([tr seconds])"
+      set title "Zeitgrafik (Sekunden)"
     }
     {Score Combo} {
       set lineGraph 1
       set values $scoreValues
-      set title "[tr Score] [tr Graph]"
+      set title "Bewertungsgrafik"
     }
     {Time Combo} {
       set lineGraph 1
       set values $emtValues
-      set title "[tr Time] [tr Graph] ([tr seconds])"
+      set title "Zeitgrafik (Sekunden)"
     }
     Auto {
       set lineGraph 1
       if {[llength $scoreValues] < 10 && [llength $scoreValues] < [llength $emtValues]} {
         set values $emtValues
-        set title "[tr Time] [tr Graph] ([tr seconds])"
+        set title "Zeitgrafik (Sekunden)"
       } else {
         set values $scoreValues
-        set title "[tr Score] [tr Graph]"
+        set title "Bewertungsgrafik"
       }
     }
   }
@@ -892,10 +892,10 @@
     $w.menu.options add checkbutton -label GraphOptionsSpelling \
       -variable ::tools::graphs::spelling -command ::tools::graphs::rating::Refresh
 
-    $w.menu add cascade -label {Start Year} -menu $w.menu.year
+    $w.menu add cascade -label {Startjahr} -menu $w.menu.year
     menu $w.menu.year
     foreach i {1900 1980 1985 1990 1995 2000 2005 2010 2015 2020} {
-      $w.menu.year add radiobutton -label "Since $i" \
+      $w.menu.year add radiobutton -label "Seit $i" \
         -variable ::tools::graphs::rating::year -value $i \
         -command ::tools::graphs::rating::Refresh
     }
Index: tcl/tools/import.tcl
===================================================================
--- tcl/tools/import.tcl	(revision 3620)
+++ tcl/tools/import.tcl	(working copy)
@@ -21,7 +21,7 @@
 
   toplevel $w
   wm state $w withdrawn
-  wm title $w "Scid: Import PGN game"
+  wm title $w "Scid: Import PGN-Partie"
 
   frame $w.b
   pack $w.b -side bottom -pady 6
@@ -137,8 +137,8 @@
   }
 
   if {![info exists ::tmp] || $::tmp == {}} {
-    tk_messageBox -type ok -icon error -title "Scid: Oops" \
-      -message "No text in clipboard."
+    tk_messageBox -type ok -icon error -title "Scid: Hoppla" \
+      -message "Kein Text in der Ablage."
     return
   }
 
@@ -177,8 +177,8 @@
       catch {sc_var delete [sc_var number]}
     }
     updateBoard -pgn
-    tk_messageBox -type ok -icon error -title "Scid: Oops" \
-      -message "Error adding variation \"$::tmp\""
+    tk_messageBox -type ok -icon error -title "Scid: Hoppla" \
+      -message "Fehler beim Variante hinzufügen \"$::tmp\""
   } else {
     # Now go back to the previous place
     if {$create_var} {
@@ -236,28 +236,28 @@
 
   set err ""
   if {[sc_base isReadOnly]} { set err "Database \"[file tail [sc_base filename]]\" is read-only." }
-  if {![sc_base inUse]} { set err "This is not an open database." }
+  if {![sc_base inUse]} { set err "Dies ist keine geöffnete Datenbank." }
   if {$err != ""} {
-    tk_messageBox -type ok -icon error -title "Scid: Error" -message $err
+    tk_messageBox -type ok -icon error -title "Scid: Fehler" -message $err
     return
   }
   if {[sc_info gzip]} {
     set ftypes {
-      { "Portable Game Notation files" {".pgn" ".PGN" ".pgn.gz"} }
-      { "Text files" {".txt" ".TXT"} }
-      { "All files" {"*"} }
+      { "Portable Game Notation-Dateien" {".pgn" ".PGN" ".pgn.gz"} }
+      { "Textdateien" {".txt" ".TXT"} }
+      { "Alle Dateien" {"*"} }
     }
   } else {
     set ftypes {
-      { "Portable Game Notation files" {".pgn" ".PGN"} }
-      { "Text files" {".txt" ".TXT"} }
-      { "All files" {"*"} }
+      { "Portable Game Notation-Dateien" {".pgn" ".PGN"} }
+      { "Textdateien" {".txt" ".TXT"} }
+      { "Alle Dateien" {"*"} }
     }
   }
   if {! [file isdirectory $::initialDir(pgn)] } {
     set ::initialDir(pgn) $::env(HOME)
   }
-  set fnames [tk_getOpenFile -multiple 1 -initialdir $::initialDir(pgn) -filetypes $ftypes -title "Import from PGN files" ]
+  set fnames [tk_getOpenFile -multiple 1 -initialdir $::initialDir(pgn) -filetypes $ftypes -title "Import von PGN-Dateien" ]
   if {$fnames == ""} { return }
 
   set ::initialDir(pgn) [file dirname [lindex $fnames 0]]
@@ -315,7 +315,7 @@
   bind $w <Escape> "$w.buttons.stop invoke"
   $w.buttons.close configure -state disabled
   $w.tf.text insert end $text
-  $w.tf.text insert end "Importing file $fname\n"
+  $w.tf.text insert end "Importiere Datei $fname\n"
   $w.tf.text configure -state disabled
 
   set err [catch {sc_base import file $fname} result]
@@ -329,10 +329,10 @@
   } else {
     set nImported [lindex $result 0]
     set warnings [lindex $result 1]
-    set str "\nImported $nImported "
-    if {$nImported == 1} { append str "game" } else { append str "games" }
+    set str "\nImport von $nImported "
+    if {$nImported == 1} { append str "Partie" } else { append str "Partien" }
     if {$warnings == ""} {
-      append str " successfully."
+      append str " erfolgreich."
     } else {
       append str ":\n$warnings"
     }
Index: tcl/tools/inputengine.tcl
===================================================================
--- tcl/tools/inputengine.tcl	(revision 3620)
+++ tcl/tools/inputengine.tcl	(working copy)
@@ -170,8 +170,8 @@
 
   proc saveHardwareOptions {} {
     if {[catch {open [scidConfigFile ExtHardware] w} optionF]} {
-       tk_messageBox -title "Scid: Unable to write file" -type ok -icon warning \
-	  -message "Unable to write options file: [scidConfigFile ExtHardware]\n$optionF"
+       tk_messageBox -title "Scid: kann Datei nicht schreiben" -type ok -icon warning \
+	  -message "Kann Optionendatei nicht schreiben:" [scidConfigFile ExtHardware]\n$optionF"
     } else {
        puts $optionF "# $::scidName options file"
        puts $optionF "# Version: $::scidVersion, $::scidVersionDate"
@@ -186,7 +186,7 @@
 	  puts $optionF "set $i [list [set $i]]"
        }
       close $optionF
-      set ::statusBar "External hardware options were saved to: [scidConfigFile ExtHardware]"
+      set ::statusBar "Externe Hardware-Optionen wurden nach [scidConfigFile ExtHardware] gespeichert."
     }
   }
 
@@ -309,12 +309,12 @@
 
 if {[catch {source [scidConfigFile ExtHardware]} ]} {
   # don't spam splash because this file normally doesnt exist
-  # ::splash::add "Unable to read External Hardware options file: $scidConfigFiles(ExtHardware)"
+  # ::splash::add "Datei für externe Hardware-Optionen kann nicht gelesen werden: $scidConfigFiles(ExtHardware)"
 } else {
    if {$::ExtHardware::showbutton} {
       pack .main.button.space4 .main.button.exthardware -side left -pady 1 -padx 0 -ipadx 2 -ipady 2
    }
-  ::splash::add "External hardware configuration found and loaded."
+  ::splash::add "Externe Hardware-Konfiguration gefunden und geladen."
 }
 
 .main.button.exthardware configure -command $::ExtHardware::bindbutton
@@ -394,7 +394,7 @@
 
 
     # Store the time as comment
-    checkbutton $w.bStoreClock -text "Store Clock" -variable ::inputengine::StoreClock
+    checkbutton $w.bStoreClock -text "Uhr speichern" -variable ::inputengine::StoreClock
 
     grid rowconfigure $w 0 -weight 1
     grid rowconfigure $w 11 -pad 10
@@ -432,7 +432,7 @@
     grid $w.comms -sticky ew -column 1 -columnspan 13 -row 12 -pady 10
 
     pack [entry $w.comms.command -width 60] -side left -padx 20
-    pack [button $w.comms.send -text Send -width 10 -command {
+    pack [button $w.comms.send -text Sende -width 10 -command {
       ::inputengine::sendToEngine [.inputengineconsole.comms.command get]
       .inputengineconsole.comms.command delete 0 end
     }] -side right -padx 30
@@ -739,7 +739,7 @@
           } \
           "!enter setup mode!" {
             .inputengineconsole.bPiece configure -background yellow
-            .inputengineconsole.bMove  configure -background yellow -text "Setup"
+            .inputengineconsole.bMove  configure -background yellow -text "Einrichtung"
             ::inputengine::setPieceImage wk80
             logEngine "< info $event"
           } \
Index: tcl/tools/novag.tcl
===================================================================
--- tcl/tools/novag.tcl	(revision 3620)
+++ tcl/tools/novag.tcl	(working copy)
@@ -20,7 +20,7 @@
     toplevel $w
     text $w.output -width 40 -height 30
     entry $w.input -width 20
-    button $w.send -text Send -command {
+    button $w.send -text Sende -command {
       ::novag::send [.novag.input get]
       .novag.input delete 0 end
     }
@@ -36,7 +36,7 @@
     
     if {[catch { set fd [open $serial r+ ] } err]} {
 	::ExtHardware::HWbuttonImg tb_eng_disconnected
-        tk_messageBox -type ok -icon error -parent . -title "Novag Citrine" -message "Connection error for $serial \n $err"
+        tk_messageBox -type ok -icon error -parent . -title "Novag Citrine" -message "Verbindungsfehler für $serial \n $err"
         destroy $w
         return
     }
Index: tcl/tools/optable.tcl
===================================================================
--- tcl/tools/optable.tcl	(revision 3620)
+++ tcl/tools/optable.tcl	(working copy)
@@ -68,7 +68,7 @@
     set w .progress
     toplevel $w
     wm withdraw $w
-    wm title $w "Generating Report"
+    wm title $w "Erstelle Bericht"
 
     pack [frame $w.b] -side bottom -fill x
     set ::optable::_interrupt 0
@@ -78,7 +78,7 @@
     }
     pack $w.b.cancel -side right -pady 5 -padx 2
 
-    foreach i {1 2} name { "Searching database for report games" "Generating report information" } {
+    foreach i {1 2} name { "Durchsuche Datenbank für Partienbericht" "Erzeuge Berichtsinformationen" } {
       label $w.text$i -text "$i. $name"
       pack $w.text$i -side top
       canvas $w.c$i -width 400 -height 20  -relief solid -border 1
@@ -264,11 +264,11 @@
     if {$g == "" } {continue}
     set res [scan $g "%d:  <g_%d>" d1 game_number]
     if {$res != 2} {
-      set message "Error merging game"
+      set message "Fehler beim Zusammenführen der Partie"
       if {[info exists game_number]} {
         set message "$message $game_number"
       }
-      tk_messageBox -title "Error writing report" -type ok -icon warning -message $message
+      tk_messageBox -title "Fehler beim Schreiben des Berichts" -type ok -icon warning -message $message
       break
     }
     # dont merge current game with itself
@@ -275,11 +275,11 @@
     if {$game_number == $current} {continue}
     set err [ catch { sc_game merge $base $game_number $ply } result ]
     if {$err} {
-      tk_messageBox -title Scid -type ok -icon info -message "Unable to merge the selected game:\n$result"
+      tk_messageBox -title Scid -type ok -icon info -message "Kann die gewählte Partie nicht zusammenfügen:\n$result"
       break
     }
   }
-  tk_messageBox -title "Merge Complete" -type ok -icon info -message "Merge Complete."
+  tk_messageBox -title "Zusammenführen komplett" -type ok -icon info -message "Merge Complete."
   updateBoard -pgn
 }
 
@@ -402,8 +402,8 @@
   set tmpfile TempOpeningReport.html
   set fname [file nativename [file join $tmpdir $tmpfile]]
   if {[catch {set tempfile [open $fname w]}]} {
-    tk_messageBox -title "Scid: Error writing report" -type ok -icon warning \
-        -message "Unable to write the file: $fname"
+    tk_messageBox -title "Scid: Fehler beim Schreiben des Berichts" -type ok -icon warning \
+        -message "Kann Datei nicht schreiben: $fname"
   }
   puts $tempfile [::optable::report html 1 $::optable::_flip]
   close $tempfile
@@ -418,32 +418,32 @@
 #   "type" is the report type: report, table, or both.
 
 proc ::optable::saveReport {fmt} {
-  set t [tk_dialog .oprepWin.dialog "Select report type" \
-      "Select Report Type\n\nFull report (includes theory table), Compact report (no theory table) or theory table by itself." \
-      question 0 "Full report" "Compact report" \
-      "Theory table" "Cancel"]
+  set t [tk_dialog .oprepWin.dialog "Berichtstyp auswählen" \
+      "Wählen Sie den Berichtstyp\n\nVoller Bericht (einschließlich Theorietabelle), kompakter Bericht (ohne Theorietabelle) oder nur die Theorietabelle." \
+      question 0 "Voller Bericht" "Kompakter Bericht" \
+      "Theorietabelle" "Abbruch"]
   if {$t == 3} { return }
   set default ".txt"
   set ftype {
-    { "Text files" {".txt"} }
-    { "All files"  {"*"}    }
+    { "Textdateien" {".txt"} }
+    { "Alle Dateien"  {"*"}  }
   }
   if {$fmt == "latex"} {
     set default ".tex"
     set ftype {
-      { "LaTeX files" {".tex" ".ltx"} }
-      { "All files"  {"*"}    }
+      { "LaTeX-Dateien" {".tex" ".ltx"} }
+      { "Alle Dateien"  {"*"}  }
     }
   } elseif {$fmt == "html"} {
     set default ".html"
     set ftype {
-      { "HTML files" {".html" ".htm"} }
-      { "All files"  {"*"}    }
+      { "HTML-Dateien" {".html" ".htm"} }
+      { "Alle Dateien"  {"*"}  }
     }
   }
 
   set fname [tk_getSaveFile -initialdir $::env(HOME) -filetypes $ftype -parent .oprepWin \
-      -defaultextension $default -title "Save Opening Report"]
+      -defaultextension $default -title "Speichere Eröffnungsbericht"]
   if {$fname == ""} { return }
   if {$::macOS && ![string match *$default $fname] && ![string match *.* $fname]} {
       append fname $default
@@ -451,8 +451,8 @@
 
   busyCursor .
   if {[catch {set tempfile [open $fname w]}]} {
-    tk_messageBox -title "Scid: Error writing report" -type ok -icon warning \
-        -message "Unable to write the file: $fname\n\n"
+    tk_messageBox -title "Scid: Fehler beim Schreiben des Berichts" -type ok -icon warning \
+        -message "Kann Datei nicht schreiben: $fname\n\n"
   } else {
     if {$t == 2} {
       set report [::optable::table $fmt]
@@ -1201,13 +1201,13 @@
   toplevel $w
   wm withdraw $w
 
-  wm title $w "Add Opening Report Favorite"
-  label $w.name -text "Enter a name for this position"
+  wm title $w "Hinzufügung Eröffnungsberichtfavorit"
+  label $w.name -text "Geben Sie einen Namen für diese Stellung ein"
   pack $w.name -side top
   entry $w.e -width 40
   pack $w.e -side top -fill x -padx 2
   addHorizontalRule $w
-  label $w.old -text "Existing favorite report names"
+  label $w.old -text "Vorhandene Favoritenberichtsnamen"
   pack $w.old -side top
   pack [frame $w.existing] -side top -fill x -padx 2
   text $w.existing.list -width 30 -height 10 -yscrollcommand [list $w.existing.ybar set]
@@ -1422,7 +1422,7 @@
   global reportFavorites
   if {[llength $reportFavorites] == 0} {
     tk_messageBox -title Scid -type ok -icon info \
-        -message "You have no favorite report positions."
+        -message "Sie haben keine bevorzugten Berichtspositionen."
     return
   }
   set ::reportDir $::initialDir(report)
@@ -1434,16 +1434,16 @@
   }
   toplevel $w
   wm withdraw $w
-  wm title $w "Generate Reports..."
+  wm title $w "Erstelle Berichte..."
 
-  pack [label $w.typelabel -text "Select the report type:" -font font_Bold] -side top
+  pack [label $w.typelabel -text "Wählen Sie den Berichtstyp aus:" -font font_Bold] -side top
   pack [frame $w.type] -side top -padx 2
-  radiobutton $w.type.full -text "Full" -variable reportType -value full
-  radiobutton $w.type.compact -text "Compact (no theory table)" -variable reportType -value compact
-  radiobutton $w.type.theory -text "Theory table only" -variable reportType -value theory
+  radiobutton $w.type.full -text "Alles" -variable reportType -value full
+  radiobutton $w.type.compact -text "Komprimiert (ohne Theorietabelle)" -variable reportType -value compact
+  radiobutton $w.type.theory -text "Nur Theorietabelle" -variable reportType -value theory
   pack $w.type.full $w.type.compact $w.type.theory -side left -padx 4
   addHorizontalRule $w
-  pack [label $w.fmtlabel -text "Select the report file format:" -font font_Bold] -side top
+  pack [label $w.fmtlabel -text "Wählen Sie das Format der Berichtsdatei:" -font font_Bold] -side top
   pack [frame $w.fmt] -side top -padx 2
   radiobutton $w.fmt.text -text "Text" -variable reportFormat -value text
   radiobutton $w.fmt.html -text "HTML" -variable reportFormat -value html
@@ -1451,11 +1451,11 @@
   pack $w.fmt.text $w.fmt.html $w.fmt.latex -side left -padx 4
   addHorizontalRule $w
   pack [frame $w.dir] -side top -padx 2 -pady 2
-  label $w.dir.label -text "Save reports in the folder" -font font_Bold
+  label $w.dir.label -text "Speichere Berichte im Verzeichnis" -font font_Bold
   entry $w.dir.entry  -textvariable ::reportDir
   dialogbutton $w.dir.choose -text $::tr(Browse) -command {
     set tmpdir [tk_chooseDirectory -parent .reportFavoritesDlg \
-        -title "Scid: Choose Report Folder"]
+        -title "Scid: wählen Sie das Berichtsverzeichnis"]
     if {$tmpdir != ""} {
       set ::reportDir [file nativename $tmpdir]
     }
@@ -1495,8 +1495,8 @@
   set w .reportsProgress
   toplevel $w
   wm withdraw $w
-  wm title $w "Generating Reports"
-  pack [label $w.t -width 40 -text "Generating reports. Please wait..." -font font_Bold] -side top -pady 5
+  wm title $w "Erstelle Berichte"
+  pack [label $w.t -width 40 -text "Erstelle Berichte, bitte warten..." -font font_Bold] -side top -pady 5
   pack [label $w.report] -side top -pady 5
   placeWinCenter $w
   wm deiconify $w
@@ -1511,7 +1511,7 @@
     set fname [file join $reportDir "$name$suffix"]
     if {[catch {open $fname w} f]} {
       tk_messageBox -title Scid -icon warning -type ok \
-          -message "Unable to write file: $fname\n$f"
+          -message "Kann nicht in Datei schreiben: $fname\n$f"
       grab release $w
       destroy $w
       return
Index: tcl/tools/pinfo.tcl
===================================================================
--- tcl/tools/pinfo.tcl	(revision 3620)
+++ tcl/tools/pinfo.tcl	(working copy)
@@ -56,7 +56,7 @@
       } else {
 	::plist::Open
       }
-    } -width 10
+    } -width 13
     button $w.b.nedit -text [tr PinfoEditName] -command {
       nameEditor .playerInfoWin
       setNameEditorType player
@@ -63,7 +63,7 @@
       set editName $playerInfoName
       set editNameNew $playerInfoName
       set editNameSelect all
-    } -width 10
+    } -width 13
 
     button $w.b.report -text [tr ToolsPlayerReport] -command {::preport::preportDlg $playerInfoName}
     button $w.b.tourney -text [tr WindowsTmt] -command {::tourney::Open $playerInfoName}
@@ -71,9 +71,9 @@
     button $w.b.update -textvar ::tr(Update) -command {
       playerInfo $playerInfoName
       playerInfoRefresh
-    } -width 10
+    } -width 13
     # button $w.b.help -textvar ::tr(Help) -command {helpWindow PInfo} -width 10
-    button $w.b.close -textvar ::tr(Close) -command "destroy $w" -width 10
+    button $w.b.close -textvar ::tr(Close) -command "destroy $w" -width 13
 
     ### The rightmost four buttons are already set width 10
     ### If English, we can set the other four buttons likewise (and allign nicely)
Index: tcl/tools/preport.tcl
===================================================================
--- tcl/tools/preport.tcl	(revision 3620)
+++ tcl/tools/preport.tcl	(working copy)
@@ -19,7 +19,7 @@
 proc ::preport::preportDlg {{player {}}} {
 
   if {[sc_base numGames] == 0} {
-    tk_messageBox -title Scid -type ok -icon warning -message "No games in current base"
+    tk_messageBox -title Scid -type ok -icon warning -message "Keine Partien in aktueller Datenbank"
     return
   }
 
@@ -41,11 +41,11 @@
   wm withdraw $w
   wm title $w "[tr ToolsPlayerReport]"
 
-  pack [label $w.plabel -text "Generate Player Report"]
+  pack [label $w.plabel -text "Erstelle Spielerbericht"]
   pack [frame $w.space -height 10]
   pack [frame $w.g] -side top -fill x -expand yes -padx 2
 
-  label $w.g.where -text "Player:"
+  label $w.g.where -text "Spieler:"
   grid $w.g.where -row 0 -column 0 -sticky w
   ttk::combobox $w.g.player -width 30 -textvariable ::preport::_player
 
@@ -55,7 +55,7 @@
 
   grid $w.g.player -row 0 -column 1 -columnspan 2 -padx 10
 
-  label $w.g.has -text "Color:"
+  label $w.g.has -text "Farbe"
   grid $w.g.has -row 1 -column 0 -sticky w
   radiobutton $w.g.white -text $::tr(White) -variable ::preport::_color -value white
   radiobutton $w.g.black -text $::tr(Black) -variable ::preport::_color -value black
@@ -62,10 +62,10 @@
   grid $w.g.white -row 1 -column 1 -sticky w
   grid $w.g.black -row 1 -column 2 -sticky w
 
-  label $w.g.pos -text "Start position:"
+  label $w.g.pos -text "Ausgangsstellung:"
   grid $w.g.pos -row 2 -column 0
-  radiobutton $w.g.start -text "Game start" -variable ::preport::_pos -value start
-  radiobutton $w.g.current -text "Current position" -variable ::preport::_pos -value current
+  radiobutton $w.g.start -text "Partiestart" -variable ::preport::_pos -value start
+  radiobutton $w.g.current -text "Aktuelle Stellung" -variable ::preport::_pos -value current
   grid $w.g.start   -row 2 -column 1 -sticky w
   grid $w.g.current -row 2 -column 2 -sticky w
 
@@ -153,8 +153,8 @@
     }
     pack $w.b.cancel -side right -pady 5 -padx 2
 
-    foreach i {1 2} name {"Searching database for report games"
-                        "Generating report information"} {
+    foreach i {1 2} name {"Durchsuche Datenbank für Partienbericht"
+                        "Erzeuge Berichtsinformationen"} {
       label $w.text$i -text "$i. $name"
       pack $w.text$i -side top
       canvas $w.c$i -width 400 -height 20  -relief solid -border 1
@@ -414,8 +414,8 @@
   set tmpfile TempPlayerReport.html
   set fname [file nativename [file join $tmpdir $tmpfile]]
   if {[catch {set tempfile [open $fname w]}]} {
-    tk_messageBox -title "Scid: Error writing report" -type ok -icon warning \
-        -message "Unable to write the file: $fname"
+    tk_messageBox -title "Scid: Fehler beim Schreiben des Berichts" -type ok -icon warning \
+        -message "Kann Datei nicht schreiben: $fname"
   }
   puts $tempfile [::preport::report html 1]
   close $tempfile
@@ -426,25 +426,25 @@
 proc ::preport::saveReport {fmt} {
   set default ".txt"
   set ftype {
-    { "Text files" {".txt"} }
-    { "All files"  {"*"}    }
+    { "Textdateien" {".txt"} }
+    { "Alle Dateien"  {"*"}  }
   }
   if {$fmt == "latex"} {
     set default ".tex"
     set ftype {
-      { "LaTeX files" {".tex" ".ltx"} }
-      { "All files"  {"*"}    }
+      { "LaTeX-Dateien" {".tex" ".ltx"} }
+      { "Alle Dateien"  {"*"}  }
     }
   } elseif {$fmt == "html"} {
     set default ".html"
     set ftype {
-      { "HTML files" {".html" ".htm"} }
-      { "All files"  {"*"}    }
+      { "HTML-Dateien" {".html" ".htm"} }
+      { "Alle Dateien"  {"*"}  }
     }
   }
 
   set fname [tk_getSaveFile -initialdir $::env(HOME) -filetypes $ftype -parent .preportWin \
-               -defaultextension $default -title "Save Opening Report"]
+               -defaultextension $default -title "Speichere Eröffnungsbericht"]
   if {$fname == ""} { return }
   if {$::macOS && ![string match *$default $fname] && ![string match *.* $fname]} {
       append fname $default
@@ -452,8 +452,8 @@
 
   busyCursor .
   if {[catch {set tempfile [open $fname w]}]} {
-    tk_messageBox -title "Scid: Error writing report" -type ok -icon warning \
-      -message "Unable to write the file: $fname\n\n"
+    tk_messageBox -title "Scid: Fehler beim Schreiben des Berichts" -type ok -icon warning \
+      -message "Kann Datei nicht schreiben: $fname\n\n"
   } else {
     set report [::preport::report $fmt 1]
     # if {$::hasEncoding  &&  $::langEncoding($::language) != ""} { catch {set report [encoding convertto $::langEncoding($::language) $report]} }
Index: tcl/tools/sergame.tcl
===================================================================
--- tcl/tools/sergame.tcl	(revision 3620)
+++ tcl/tools/sergame.tcl	(working copy)
@@ -91,7 +91,7 @@
 
     # if no engines defined, bail out
     if {$i == 0} {
-      tk_messageBox -type ok -message "No UCI engines found" -icon error -parent .
+      tk_messageBox -type ok -message "Keine UCI-Engines gefunden" -icon error -parent .
       destroy $w
       return
     }
@@ -550,12 +550,12 @@
     ::gameclock::stop 2
     if {![sc_pos isCheck]} {
       sc_game tags set -result =
-      set message Stalemate
+      set message Patt
     } else {
       if {1} {
         # mate dialog
         if { [::board::opponentColor] == [sc_pos side] } {
-          set side Player
+          set side Spieler
         } else {
           set side $::sergame::engineName
         }
@@ -564,7 +564,7 @@
         } else {
           sc_game tags set -result 0
         }
-        set message "$side wins"
+        set message "$side gewinnt"
       }
     }
     updateBoard -pgn
Index: tcl/tools/tablebase.tcl
===================================================================
--- tcl/tools/tablebase.tcl	(revision 3620)
+++ tcl/tools/tablebase.tcl	(working copy)
@@ -8,13 +8,13 @@
 set ::tb::online_available 0
 
 if {[catch {package require http}]} {
-  ::splash::add "Package 'http' not found. Disabling online tablebases."
+  ::splash::add "Paket 'http' nicht gefunden. Online Tablebases deaktiviert."
 } else {
-  ::splash::add "Package 'http' found."
+  ::splash::add "Paket 'http' gefunden."
   if {[catch {package require tls}]} {
-    ::splash::add "Package 'tls' not found. Disabling online tablebases."
+    ::splash::add "Paket 'tls' nicht gefunden. Online Tablebases deaktiviert."
   } else {
-    ::splash::add "Package 'tls' found. Enabling online tablebases."
+    ::splash::add "Paket 'tls' gefunden. Online Tablebases aktiviert."
     set ::tb::online_available 1
   }
 }
@@ -195,7 +195,7 @@
 
   pack [frame $f.results] -side top -pady 3
 
-  pack [label $f.results.label -text Results] -side left -padx 30
+  pack [label $f.results.label -text Ergebnisse] -side left -padx 30
 
   if { $::tb::online_available } {
     menubutton $f.results.online -text $tbOnline -menu $f.results.online.menu -relief raised -indicatoron 1
@@ -240,7 +240,7 @@
   ### Buttons
 
   checkbutton $w.b.training -text $::tr(Training) -variable tbTraining -command ::tb::training -relief raised -padx 4 -pady 5
-  button $w.b.random -text "Random" -command ::tb::random
+  button $w.b.random -text "Zufall" -command ::tb::random
   button $w.b.showboard -image tb_coords -command ::tb::showBoard
   button $w.b.help -text $::tr(Help) -command { helpWindow TB }
   button $w.b.close -text $::tr(Close) -command "destroy $w"
@@ -405,22 +405,22 @@
   $t configure -state normal
   $t insert end [format "%-6s" [::tb::name $material]] fen
   if {! [info exists tbs($material)]} {
-    $t insert end "\nNo summary for this tablebase."
+    $t insert end "\nKeine Zusammenfassung für diese Endspieldatenbank."
     $t configure -state disabled
     return
   }
   set data $tbs($material)
 
-  $t insert end [format "    %5u games per million\n\n" [lindex $data 0]]
+  $t insert end [format "    %5u Partien pro Million\n\n" [lindex $data 0]]
 
   # Longest-mate and result-percentage stats:
 
-  $t insert end "Side    Longest    %     %     %\n"
-  $t insert end "to move   mate    Win  Draw  Loss\n"
+  $t insert end "Seite    Längstes   %    %    %\n"
+  $t insert end "am Zug     Matt  gew   Remis verl\n"
   $t insert end "---------------------------------\n"
 
   # Stats for White:
-  $t insert end "White     "
+  $t insert end "Weiß      "
   set len [lindex $data 1]
   set fen [lindex $data 2]
   if {$len == "0"} { set len "-" }
@@ -442,7 +442,7 @@
   $t insert end "\n"
 
   # Stats for Black:
-  $t insert end "Black     "
+  $t insert end "Schwarz   "
   set len [lindex $data 3]
   set fen [lindex $data 4]
   if {$len == "0"} { set len "-" }
@@ -464,7 +464,7 @@
   $t insert end "\n\n"
 
   set mzugs [lindex $data 11]
-  $t insert end "Mutual zugzwangs: "
+  $t insert end "Beiderseitige Zugzwangzüge: "
   if {$mzugs >= 0} { $t insert end "$mzugs\n" } else { $t insert end "?\n" }
   if {$mzugs <= 0} {
     $t configure -state disabled
@@ -475,20 +475,20 @@
   set nBtmLoses [lindex $data 12]
   set nWtmLoses [lindex $data 14]
   set nBothLose [lindex $data 16]
-  set zugnames [list " White draws, Black loses: " \
-      " Black draws, White loses: " \
-      " Whoever moves loses:      "]
+  set zugnames [list "Weiß Remis, Schwarz verliert: " \
+      " Schwarz Remis, Weiß verliert: " \
+      " Egal wer am Zug ist, verliert:      "]
   if {$nBtmLoses > 0} {
     $t insert end [lindex $zugnames 0]
-    $t insert end [format "%5d\n" $nBtmLoses]
+    $t insert end [format "%d\n" $nBtmLoses]
   }
   if {$nWtmLoses > 0} {
     $t insert end [lindex $zugnames 1]
-    $t insert end [format "%5d\n" $nWtmLoses]
+    $t insert end [format "%d\n" $nWtmLoses]
   }
   if {$nBothLose > 0} {
     $t insert end [lindex $zugnames 2]
-    $t insert end [format "%5d\n" $nBothLose]
+    $t insert end [format "%d\n" $nBothLose]
   }
 
   # Selected zugzwang positions:
@@ -548,7 +548,7 @@
   # Update results panel:
   if {$tbTraining} {
     ::tb::clearText $t
-    ::tb::insertText "\n (Training mode; results are hidden)"
+    ::tb::insertText "\n (Trainingsmodus; Ergebnisse werden nicht angezeigt)"
   } else {
     if { $tbOnline == "Lichess" || $tbOnline == "Shredder" || $tbOnline == "K4it-Nalimov"} {
       if {!$::tb::noresult} {
@@ -775,7 +775,7 @@
       foreach l [split $result "\n"] {
         if {![string match {*\?\?\?*} $l]} {
           if {$empty} {
-          # $t insert end "All results; empty is $empty"
+          # $t insert end "Alle Ergebnisse: ; empty is $empty"
             set empty 0
           }
         }
@@ -784,9 +784,9 @@
       if {$empty} {
         variable hash
         if {[info exists hash($fen)]} {
-          set hash($fen) [list "No Result" ""]
+          set hash($fen) [list "Keine Ergebnisse" ""]
         }
-        $t insert end "Online: No result"
+        $t insert end "Online: keine Ergebnisse"
       }
 
 ####################################################################
Index: tcl/tools/tacgame.tcl
===================================================================
--- tcl/tools/tacgame.tcl	(revision 3624)
+++ tcl/tools/tacgame.tcl	(working copy)
@@ -127,7 +127,7 @@
     }
 
     if { $phalanx == -1 } {
-      tk_messageBox -title Scid -icon warning -type ok -message "Could not find Phalanx in Engine List"
+      tk_messageBox -title Scid -icon warning -type ok -message "Konnte Phalanx nicht in Engine-Liste finden"
       return
     }
       
@@ -144,7 +144,7 @@
     }
 
     if { $toga == -1 } {
-      tk_messageBox -title Scid -icon warning -type ok -message "Could not find Toga in Engline List"
+      tk_messageBox -title Scid -icon warning -type ok -message "Konnte Toga nicht in Engine-Liste finden"
       return
     }
 
@@ -180,13 +180,13 @@
     pack $w.flimit -side top -fill x
     pack $w.fbuttons -side top -fill x -pady 3
 
-    radiobutton $w.flevel.diff_random.cb -text $::tr(RandomLevel) -variable ::tacgame::randomLevel -value 1 -width 15  -anchor w
+    radiobutton $w.flevel.diff_random.cb -text $::tr(RandomLevel) -variable ::tacgame::randomLevel -value 1 -width 25  -anchor w
     scale $w.flevel.diff_random.lMin -orient horizontal -from 1400 -to 2400 -length 100 -variable ::tacgame::levelMin -tickinterval 0 -resolution 50
     scale $w.flevel.diff_random.lMax -orient horizontal -from 1400 -to 2400 -length 100 -variable ::tacgame::levelMax -tickinterval 0 -resolution 50
     pack $w.flevel.diff_random.cb -side left
     pack $w.flevel.diff_random.lMin $w.flevel.diff_random.lMax -side left -expand 1
 
-    radiobutton $w.flevel.diff_fixed.cb -text "$::tr(FixedLevel)\n($::tr(easy) - $::tr(hard))" -variable ::tacgame::randomLevel -value 0 -width 15  -anchor w
+    radiobutton $w.flevel.diff_fixed.cb -text "$::tr(FixedLevel)\n($::tr(easy) - $::tr(hard))" -variable ::tacgame::randomLevel -value 0 -width 25  -anchor w
     scale $w.flevel.diff_fixed.scale -orient horizontal -from 1400 -to 2400 -length 200 \
         -variable ::tacgame::levelFixed -tickinterval 0 -resolution 50
     pack $w.flevel.diff_fixed.cb -side left
@@ -202,10 +202,10 @@
     radiobutton $w.fopening.cbPosition -text $::tr(StartFromCurrentPosition) -variable ::tacgame::openingType -value current
 
     # fischer chess
-    radiobutton $w.fopening.cbFischer -text {Fischer Chess} -variable ::tacgame::openingType -value fischer
+    radiobutton $w.fopening.cbFischer -text {Fischer-Schach} -variable ::tacgame::openingType -value fischer
 
     # random pawn chess
-    radiobutton $w.fopening.cbPawn -text {Random Pawns} -variable ::tacgame::openingType -value pawn
+    radiobutton $w.fopening.cbPawn -text {Zufällige Bauern} -variable ::tacgame::openingType -value pawn
 
     # or choose a specific opening
     radiobutton $w.fopening.cbSpecific -text $::tr(SpecificOpening) -variable ::tacgame::openingType -value specific \
@@ -248,8 +248,8 @@
     # Time limit per move
 
     checkbutton $w.flimit.blimit -text $::tr(limitanalysis) -variable ::tacgame::isLimitedAnalysisTime -relief flat
-    scale $w.flimit.analysisTime -orient horizontal -from 1 -to 30 -length 200 -label $::tr(seconds) -variable ::tacgame::analysisTime -resolution 1
-    pack $w.flimit.blimit $w.flimit.analysisTime -side left -expand yes -pady 5
+    scale $w.flimit.analysisTime -orient horizontal -from 1 -to 30 -length 230 -label $::tr(seconds) -variable ::tacgame::analysisTime -resolution 1
+    pack $w.flimit.blimit $w.flimit.analysisTime -side left -expand yes -pady 5 -padx 10
 
     dialogbutton $w.fbuttons.play -text $::tr(Play) -command {
       set ::tacgame::chosenOpening [.configWin.fopening.fOpeningList.lbOpening curselection]
@@ -617,9 +617,9 @@
     # Try to execute the analysis program:
     if {[catch {set analysisCoach(pipe$n) [open "| [list $analysisCommand] $analysisArgs" "r+"]} result]} {
       if {$oldpwd != ""} { catch {cd $oldpwd} }
-      tk_messageBox -title "Scid: error starting analysis" \
+      tk_messageBox -title "Scid: Fehler beim Start der Analyse" \
           -icon warning -type ok \
-          -message "Unable to start the program:\n$analysisCommand"
+          -message "Kann das Programm nicht starten:\n$analysisCommand"
       ::tacgame::resetEngine $n
       return
     }
@@ -732,7 +732,7 @@
       catch {close $analysisCoach(pipe$phalanx)}
       set analysisCoach(pipe$phalanx) ""
       tk_messageBox -type ok -icon info -parent . -title Scid \
-          -message "Phalanx terminated without warning; it probably crashed or had an internal error."
+          -message "Phalanx ohne Warnung beendet; es ist wahrscheinlich abgestürzt oder hatte einen internen Fehler."
     }
 
     if {! $analysisCoach(seen$phalanx)} {
@@ -783,7 +783,7 @@
     ::gameclock::stop 2
     if {![sc_pos isCheck]} {
       sc_game tags set -result =
-      set message Stalemate
+      set message Patt
     } else {
       # if {!$::tacgame::mateShown} 
       if {1} {
@@ -790,7 +790,7 @@
         # mate dialog
         # set ::tacgame::mateShown 1
         if { [::board::opponentColor] == [sc_pos side] } {
-          set side Player
+          set side Spieler
         } else {
           set side Phalanx
         }
@@ -799,7 +799,7 @@
         } else {
           sc_game tags set -result 0
         }
-        set message "$side wins"
+        set message "$side gewinnt"
       }
     }
     updateBoard -pgn
Index: tcl/tools/tactics.tcl
===================================================================
--- tcl/tools/tactics.tcl	(revision 3620)
+++ tcl/tools/tactics.tcl	(working copy)
@@ -52,7 +52,7 @@
     set found 0
 
     if {![sc_base inUse] || [sc_base numGames] == 0} {
-      tk_messageBox -type ok -icon info -title {Find Best Move} -message "No games in database"
+      tk_messageBox -type ok -icon info -title {Finde besten Zug} -message "Keine Partien in der Datenbank"
       return
     }
 
@@ -96,7 +96,7 @@
     unbusyCursor .
 
     if { ! $found } {
-      tk_messageBox -type ok -icon info -title {Find Best Move} -message "No (more) relevant games found."
+      tk_messageBox -type ok -icon info -title {Finde besten Zug} -message "Keine (weiteren) relevante Partien gefunden."
       sc_game load 1
     } else  {
       sideToMoveAtBottom
@@ -147,7 +147,7 @@
     setWinLocation $w
 
     if {[sc_base count free] == 0} {
-      tk_messageBox -type ok -icon info -title Scid -message "Too many databases are open; close one first"
+      tk_messageBox -type ok -icon info -title Scid -message "Zuviele Datenbanken geöffnet; bitte erst eine schließen"
       return
     }
 
@@ -205,7 +205,7 @@
       set name [lindex $::tactics::baseList [expr $current * 2 ] ]
       set desc [lindex $::tactics::baseDesc $current]
       if {[tk_messageBox -type yesno -parent .configTactics -icon question \
-	     -title {Confirm Reset} -message "Confirm resetting \"$desc\" database"] == {yes}} {
+	     -title {Zurücksetzen bestätigen} -message "Zurücksetzen \"$desc\" Datenbank bestätigen"] == {yes}} {
 	::tactics::resetScores $name .configTactics
       }
     }
@@ -373,7 +373,7 @@
     set wasOpened 0
 
     if {[sc_base count free] == 0} {
-      tk_messageBox -type ok -icon info -title Scid -message "Too many databases are opened\nClose one first" -parent $parent
+      tk_messageBox -type ok -icon info -title Scid -message "Es sind zuviele Datenbanken geöffnet.\nBitte erst eine schließen." -parent $parent
       return
     }
     # check if the base is already opened
@@ -382,12 +382,12 @@
       set wasOpened 1
     } else  {
       if { [catch { sc_base open $base }] } {
-        tk_messageBox -type ok -icon warning -title Scid -message "Unable to open base" -parent $parent
+        tk_messageBox -type ok -icon warning -title Scid -message "Kann Datenbank nicht öffnen." -parent $parent
         return
       }
     }
     if {[sc_base isReadOnly]} {
-        tk_messageBox -type ok -icon warning -title Scid -message "Base $base is read-only" -parent $parent
+        tk_messageBox -type ok -icon warning -title Scid -message "Datenbank $base kann nur gelesen werden." -parent $parent
         return
     }
 
@@ -675,7 +675,7 @@
   proc loadBase {name parent} {
 
     if {[sc_base count free] == 0} {
-      tk_messageBox -type ok -icon info -title Scid -message "Too many databases are open; close one first" -parent $parent
+      tk_messageBox -type ok -icon info -title Scid -message "Zuviele Datenbanken geöffnet; bitte erst eine schließen" -parent $parent
       return 0
     }
     # check if the base is already opened
@@ -683,12 +683,12 @@
       sc_base switch [sc_base slot $name]
     } else  {
       if { [catch { sc_base open $name }] } {
-        tk_messageBox -type ok -icon warning -title Scid -message "Unable to open base" -parent $parent
+        tk_messageBox -type ok -icon warning -title Scid -message "Kann Datenbank nicht öffnen." -parent $parent
         return 0
       }
     }
     if {[sc_base isReadOnly]} {
-        tk_messageBox -type ok -icon warning -title Scid -message "Base $name is read-only" -parent $parent
+        tk_messageBox -type ok -icon warning -title Scid -message "Datenbank $name kann nur gelesen werden" -parent $parent
         return 0
     }
 
@@ -755,7 +755,7 @@
     set ::tactics::engineSlot 0
 
     tk_messageBox -type ok -icon warning -parent . -title Scid \
-      -message "Unable to find engine.\nPlease configure engine with Toga as name"
+      -message "Kann Engine nicht finden.\nBitte konfigurieren Sie Engine mit Toga als Name."
     return 0
 
   }
@@ -920,9 +920,9 @@
     }
 
     set repBase -1
-    set typeW [lsearch $base_types {Openings for White} ]
-    set typeB [lsearch $base_types {Openings for Black} ]
-    set typeWB [lsearch $base_types {Openings for either color} ]
+    set typeW [lsearch $base_types {Eröffnungen für Weiß} ]
+    set typeB [lsearch $base_types {Eröffnungen für Schwarz} ]
+    set typeWB [lsearch $base_types {Eröffnungen für beide Farben} ]
 
     for {set x 1} {$x <= [ expr [sc_base count total]-1 ]} {incr x} {
       if {![sc_base inUse $x]} {
@@ -945,7 +945,7 @@
     sc_base switch clipbase
 
     if {$::opening::movesLoaded == 0} {
-      tk_messageBox -title $::tr(Repertoirenotfound) -type ok -icon error -message "No moves loaded."
+      tk_messageBox -title $::tr(Repertoirenotfound) -type ok -icon error -message "Keine Züge geladen."
     }
 
     # add a blank game for training in clipbase
@@ -1376,7 +1376,7 @@
 	set ::opening::allLinesHashList $hash
 	set ::opening::allLinesFenList $fen
 	if {[llength $::opening::allLinesHashList] == 0} {
-	  tk_messageBox -type ok -icon info -title {Scid} -message "All games finished"
+	  tk_messageBox -type ok -icon info -title {Scid} -message "Alle Partien beendet."
           ::opening::endTraining
           return
 	}
@@ -1467,9 +1467,9 @@
   proc loadStats {} {
     set optionsFile [scidConfigFile optrainer]
     if {[catch {source $optionsFile} ]} {
-      ::splash::add "Unable to find the options file: [file tail $optionsFile]"
+      ::splash::add "Kann Optionendatei nicht finden: [file tail $optionsFile]"
     } else {
-      ::splash::add "Your options file \"[file tail $optionsFile]\" was found and loaded."
+      ::splash::add "Die Optionendatei \"[file tail $optionsFile]\" wurde gefunden und geladen."
     }
   }
   ################################################################################
Index: tcl/tools/uci.tcl
===================================================================
--- tcl/tools/uci.tcl	(revision 3620)
+++ tcl/tools/uci.tcl	(working copy)
@@ -495,7 +495,7 @@
     }
     set engineData [lindex $engines(list) $n]
     if {![lindex $engineData 7]} {
-      tk_messageBox -title "Engine Error" -icon warning -type ok -message {Engine is not UCI} -parent $parent
+      tk_messageBox -title "Engine-Fehler" -icon warning -type ok -message {Engine ist nicht UCI} -parent $parent
       return
     }
     set name [lindex $engineData 0]
@@ -516,7 +516,7 @@
 
     if {[info exists ::uci::uciInfo(pipe$n)]} {
       if {$::uci::uciInfo(pipe$n) != ""} {
-        tk_messageBox -title Scid -icon warning -type ok -message "An engine is already running"
+        tk_messageBox -title Scid -icon warning -type ok -message "Eine Engine läuft bereits."
         return
       }
     }
@@ -537,8 +537,8 @@
         set parent .
       }
       # This is broke on OS X... messageBox does not draw until user destroys .splash
-      tk_messageBox -title "Error starting UCI engine" \
-          -icon warning -type ok -message "Unable to start program \n$cmd $arg" -parent $parent
+      tk_messageBox -title "Fehler beim Start der UCI-Engine" \
+          -icon warning -type ok -message "Programm kann nicht gestartet werden \n$cmd $arg" -parent $parent
       return
     }
 
@@ -607,7 +607,7 @@
     setWinLocation $w
     setWinSize $w
 
-    wm title $w "UCI Configure $::uci::name"
+    wm title $w "UCI-Konfiguration $::uci::name"
 
     pack [label $w.title -text $::uci::name] -side top -pady 5
     addHorizontalRule $w
@@ -984,8 +984,8 @@
     # Try to execute the analysis program:
     if {[catch {set uciInfo(pipe$n) [open "| [list $analysisCommand] $analysisArgs" "r+"]} result]} {
       if {$oldpwd != ""} { catch {cd $oldpwd} }
-      tk_messageBox -title "Error starting engine" -icon warning -type ok \
-          -message "Unable to start the program:\n$analysisCommand:\n$result"
+      tk_messageBox -title "Fehler beim Start der Engine" -icon warning -type ok \
+          -message "Kann das Programm nicht starten:\n$analysisCommand:\n$result"
       return 0
     }
 
@@ -1043,11 +1043,11 @@
     if { $exit_status != 0 } {
 	# logEngineNote $n {Engine terminated with exit code $exit_status: "\"$standard_error\""}
 	tk_messageBox -type ok -icon info -parent . -title Scid \
-		      -message "The uci engine terminated with exit code $exit_status: \"$standard_error\""
+		      -message "Die UCI-Engine terminierte mit dem Exitcode $exit_status: \"$standard_error\""
     } else {
 	# logEngineNote $n {Engine terminated without exit code: "\"$standard_error\""}
 	tk_messageBox -type ok -icon info -parent . -title Scid \
-		      -message "The uci engine terminated without exit code: \"$standard_error\""
+		      -message "Die UCI-Engine terminierte ohne Exitcode: \"$standard_error\""
     }
     return 0
   }
@@ -1071,8 +1071,8 @@
 	  set parent $pparent
 	}
       }
-      tk_messageBox -title "Engine Error" -icon warning -type ok \
-                    -message "File not executable,\nor not an UCI engine." -parent $parent
+      tk_messageBox -title "Engine-Fehler" -icon warning -type ok \
+                    -message "Datei ist nicht ausführbar\noder es ist keine UCI-Engine." -parent $parent
     }
 
     # Some engines in analyze(gui?) mode may not react as expected to "quit"
Index: tcl/utils/font.tcl
===================================================================
--- tcl/utils/font.tcl	(revision 3620)
+++ tcl/utils/font.tcl	(working copy)
@@ -177,13 +177,13 @@
     FontDialogRegen $font_name
     set fd_close 1
   "
-  button $w.buttons.cancel  -text Cancel -command {
+  button $w.buttons.cancel  -text Abbruch -command {
     set fd_close 0
   }
 
   frame $w.buttons.space -bd 0 -height 30
 
-  button $w.buttons.default -text Default -command "
+  button $w.buttons.default -text Voreinstellung -command "
     reinitFont $name
     if {\"$name\" == {Regular}} {
       # reset bold italic to straight
@@ -204,7 +204,7 @@
 
   set fr $w.sample
   frame $w.sample -bd 3 -relief groove
-  label $w.sample.l_sample -text "Sample" -anchor w
+  label $w.sample.l_sample -text "Beispiel" -anchor w
 
   label $w.sample.sample -font $font_name -relief sunken -text $::tr(FontSelectDialog)
 
Index: tcl/utils/sound.tcl
===================================================================
--- tcl/utils/sound.tcl	(revision 3620)
+++ tcl/utils/sound.tcl	(working copy)
@@ -55,7 +55,7 @@
 
   set numSounds [::utils::sound::ReadFolder]
   set numSought [llength $soundFiles]
-  ::splash::add "   Found $numSounds of $numSought sound files in $soundFolder"
+  ::splash::add "   $numSounds von $numSought Tondateien in $soundFolder gefunden"
 }
 
 
@@ -138,7 +138,7 @@
   # foreach v {soundFolder announceNew announceForward announceBack announceTock}
 
   toplevel $w
-  wm title $w "Scid: Sound Options"
+  wm title $w "Scid: Optionen für Ton"
   wm withdraw $w
   wm resizable $w 0 0
 
@@ -145,7 +145,7 @@
   pack [frame $w.b] -side bottom -fill x -pady 2
 
   if {! $::utils::sound::hasSnackPackage} {
-    label $w.status -text "Scid could not find the Snack audio package at startup. Sound is disabled."
+    label $w.status -text "Scid konnte das Snack-Audiopaket beim Start nicht finden. Ton ist deaktiviert."
     pack $w.status -side bottom
   }
 
@@ -196,7 +196,7 @@
 
   grid [frame $f.gap$r -height 5] -row $r -column -0; incr r
 
-  checkbutton $f.announceTock -text {Play Tick-Tock sound instead of move} \
+  checkbutton $f.announceTock -text {Spiele Tick-Tack-Ton anstelle des Zuges} \
       -variable ::utils::sound::announceTock
   grid $f.announceTock -row $r -column 0 -columnspan 2 -sticky w
   incr r
@@ -205,7 +205,7 @@
 
   ### device combobox
 
-  label $f.deviceLabel -text "Sound Device" -font font_Bold
+  label $f.deviceLabel -text "Tongerät" -font font_Bold
   grid  $f.deviceLabel -row $r -column 0 -columnspan 3 -pady 4
   incr r
 
@@ -254,8 +254,8 @@
   variable soundFolder
 
     set numSoundFiles [::utils::sound::ReadFolder]
-    tk_messageBox -title "Scid: Sound Files" -type ok -icon info \
-        -message "Found $numSoundFiles of [llength $::utils::sound::soundFiles] sound files in $::utils::sound::soundFolder"
+    tk_messageBox -title "Scid: Tondateien" -type ok -icon info \
+        -message "$numSoundFiles von [llength $::utils::sound::soundFiles] Tondateien in $::utils::sound::soundFolder gefunden"
 }
 
 ### Read sound files from the specified directory.
@@ -283,9 +283,9 @@
 proc ::utils::sound::SetDevice {args} {
 
   if {[catch {snack::audio selectOutput $::utils::sound::device}]} {
-    ::splash::add "   Failure setting Snack output device to $::utils::sound::device"
+    ::splash::add "   Fehler beim Setzen des Snack-Ausgabegeräts nach $::utils::sound::device"
   } else {
-    ::splash::add "   Succesfully set Snack output device to $::utils::sound::device"
+    ::splash::add "   Snack-Ausgabegerät erfolgreich nach $::utils::sound::device gesetzt"
   }
 }
 
Index: tcl/utils/win.tcl
===================================================================
--- tcl/utils/win.tcl	(revision 3620)
+++ tcl/utils/win.tcl	(working copy)
@@ -928,7 +928,7 @@
 
 
 if {$::docking::USE_DOCKING} {
-  ::splash::add "Docking mode enabled."
+  ::splash::add "Docking-Modus aktiviert."
   pack [ttk::panedwindow .pw -orient vertical] -fill both -expand true
   .pw add [ttk::notebook .nb] -weight 1
   set docking::tbs(.nb) .pw
@@ -938,7 +938,7 @@
 ::docking::setTabStatus
 
 if {!$::docking::USE_DOCKING} {
-  ::splash::add "Docking mode disabled."
+  ::splash::add "Docking-Modus deaktiviert."
   wm withdraw .main ; # gets remapped later
 }
 
Index: tcl/windows/book.tcl
===================================================================
--- tcl/windows/book.tcl	(revision 3620)
+++ tcl/windows/book.tcl	(working copy)
@@ -144,7 +144,7 @@
       destroy $w
       set ::book::currentBook1 {}
       set ::book::currentBook2 {}
-      tk_messageBox -title Scid -type ok -icon error -message "No books found in books directory \"$bookPath\""
+      tk_messageBox -title Scid -type ok -icon error -message "Keine Bücher im Bücherverzeichnis \"$bookPath\" gefunden"
       return
     }
 
@@ -235,7 +235,7 @@
 if {0} {
     # we make a redundant check here, another one is done a few line above
     if { [catch {bookSelect} ] } {
-      tk_messageBox -title Scid -type ok -icon error -message "No books found. Check books directory"
+      tk_messageBox -title Scid -type ok -icon error -message "Keine Bücher gefunden. Prüfen Sie das Bücherverzeichnis."
       set ::book::currentBook1 ""
       set ::book::currentBook2 ""
       destroy  .bookWin
@@ -439,7 +439,7 @@
     }
 
     ::createToplevel $w
-    ::setTitle $w "$::tr(Book) Tuning"
+    ::setTitle $w "$::tr(Book) anpassen"
     # wm resizable $w 0 0
 
     bind $w <F1> { helpWindow BookTuningWindow }
@@ -456,7 +456,7 @@
     set bookList [  lsort -dictionary [ glob -nocomplain -directory $bookPath *.bin ] ]
     # No book found
     if { [llength $bookList] == 0 } {
-      tk_messageBox -title Scid -type ok -icon error -message "No books found. Check books directory"
+      tk_messageBox -title Scid -type ok -icon error -message "Keine Bücher gefunden. Prüfen Sie das Bücherverzeichnis."
       set ::book::currentBook ""
       destroy $w
       return
@@ -480,7 +480,7 @@
     menubutton $w.left.add -text $::tr(AddMove) -menu $w.left.add.otherMoves -indicatoron 1
     menu $w.left.add.otherMoves
 
-    menubutton $w.left.remove -text "$::tr(GlistRemoveThisGameFromFilter) $::tr(GlistMoveField)" -menu $w.left.remove.otherMoves -indicatoron 1
+    menubutton $w.left.remove -text "Partie aus Filter entfernen/verschieben" -menu $w.left.remove.otherMoves -indicatoron 1
     menu $w.left.remove.otherMoves
 
     button $w.left.addline -text $::tr(AddLine) -relief flat -command ::book::addLine
@@ -753,7 +753,7 @@
     if { $::book::isReadonly > 0 } { return }
 
     set reply [ tk_messageBox -title $::tr(AddLine) -type yesno -icon info -parent .bookTuningWin -message \
-     {Remove this line (from current position onwards) ?} ]
+     {Diese Variante löschen (ab der aktuellen Position)?} ]
     if {$reply != {yes}} {return}
 
     busyCursor .
Index: tcl/windows/crosstab.tcl
===================================================================
--- tcl/windows/crosstab.tcl	(revision 3620)
+++ tcl/windows/crosstab.tcl	(working copy)
@@ -89,15 +89,15 @@
 
   $w.menu.file add command -label CrosstabFileText -command {
     set ftype {
-      { "Text files" {".txt"} }
-      { "All files"  {"*"}    }
+      { "Textdateien" {".txt"} }
+      { "Alle Dateien"  {"*"}    }
     }
-    set fname [tk_getSaveFile -initialdir $::env(HOME) -filetypes $ftype  -title "Save Crosstable" -parent .crosstabWin]
+    set fname [tk_getSaveFile -initialdir $::env(HOME) -filetypes $ftype  -title "Kreuztabelle speichern" -parent .crosstabWin]
     if {$fname != ""} {
       if {[catch {set tempfile [open $fname w]}]} {
-        tk_messageBox -title "Scid: Error saving file" \
+        tk_messageBox -title "Scid: Fehler beim Speichern" \
           -type ok -icon warning -parent .crosstabWin \
-          -message "Unable to save the file: $fname\n\n"
+          -message "Kann Datei nicht speichern: $fname\n\n"
       } else {
         puts -nonewline $tempfile [.crosstabWin.f.text get 1.0 end]
         close $tempfile
@@ -106,15 +106,15 @@
   }
   $w.menu.file add command -label CrosstabFileHtml -command {
     set ftype {
-      { "HTML files" {".html" ".htm"} }
-      { "All files"  {"*"}    }
+      { "HTML-Dateien" {".html" ".htm"} }
+      { "Alle Dateien"  {"*"}    }
     }
-    set fname [tk_getSaveFile -initialdir $::initialDir(html) -filetypes $ftype  -title "Save Crosstable as HTML" -parent .crosstabWin]
+    set fname [tk_getSaveFile -initialdir $::initialDir(html) -filetypes $ftype  -title "Kreuzstabelle als HTML speichern" -parent .crosstabWin]
     if {$fname != ""} {
       if {[catch {set tempfile [open $fname w]}]} {
-        tk_messageBox -title "Scid: Error saving file" \
+        tk_messageBox -title "Scid: Fehler beim Speichern" \
           -type ok -icon warning -parent .crosstabWin \
-          -message "Unable to save the file: $fname\n\n"
+          -message "Kann Datei nicht speichern: $fname\n\n"
       } else {
         catch {sc_game crosstable html $crosstab(sort) $crosstab(type) \
                  $crosstab(ratings) $crosstab(countries) $crosstab(tallies) $crosstab(titles) \
@@ -128,15 +128,15 @@
   }
   $w.menu.file add command -label CrosstabFileLaTeX -command {
     set ftype {
-      { "LaTeX files" {".tex" ".ltx"} }
-      { "All files"  {"*"}    }
+      { "LaTeX-Dateien" {".tex" ".ltx"} }
+      { "Alle Dateien"  {"*"}    }
     }
-    set fname [tk_getSaveFile -initialdir $::initialDir(tex) -filetypes $ftype  -title "Save Crosstable as LaTeX" -parent .crosstabWin]
+    set fname [tk_getSaveFile -initialdir $::initialDir(tex) -filetypes $ftype  -title "Kreuztabelle als LaTeX speichern" -parent .crosstabWin]
     if {$fname != ""} {
       if {[catch {set tempfile [open $fname w]}]} {
-        tk_messageBox -title "Scid: Error saving file" \
+        tk_messageBox -title "Scid: Fehler beim Speichern" \
           -type ok -icon warning -parent .crosstabWin \
-          -message "Unable to save the file: $fname\n\n"
+          -message "Kann Datei nicht speichern: $fname\n\n"
       } else {
         catch {sc_game crosstable latex $crosstab(sort) $crosstab(type) \
                  $crosstab(ratings) $crosstab(countries) $crosstab(tallies) $crosstab(titles) \
Index: tcl/windows/eco.tcl
===================================================================
--- tcl/windows/eco.tcl	(revision 3620)
+++ tcl/windows/eco.tcl	(working copy)
@@ -203,7 +203,7 @@
   set fname [file tail $fname]
   # if {$fname == ""} { set fname "<none>" }
 
-  $w.title insert end "$::tr(Database) $fname ([lindex [sc_base eco {}] 0] / [sc_base numGames [sc_base current]] games classified)" center
+  $w.title insert end "$::tr(Database) $fname ([lindex [sc_base eco {}] 0] von [sc_base numGames [sc_base current]] Partien klassifiziert)" center
   $w.title configure -state disabled
   set ::windows::eco::count $count
 }
@@ -251,7 +251,7 @@
   if {[sc_info gzip]} {
     set ftype { { "Scid ECO files" {".eco" ".eco.gz"} } }
   }
-  set fullname [tk_getOpenFile -initialdir [pwd] -filetypes $ftype -title "Load ECO file"]
+  set fullname [tk_getOpenFile -initialdir [pwd] -filetypes $ftype -title "Lade ECO-Datei"]
   if {[string compare $fullname ""]} {
     if {[catch {sc_eco read $fullname} result]} {
       tk_messageBox -title Scid -type ok \
@@ -258,8 +258,8 @@
           -icon warning -message $result
     } else {
       set ecoFile $fullname
-      tk_messageBox -title "Scid: ECO file loaded." -type ok -icon info \
-          -message "ECO file $fullname loaded: $result positions.\n\nTo have this file automatically loaded when you start Scid, select \"Save Options\" from the Options menu before exiting."
+      tk_messageBox -title "Scid: ECO-Datei geladen." -type ok -icon info \
+          -message "ECO-Datei $fullname geladen: $result Stellungen.\n\nUm diese Datei automatisch beim Scid-Start zu laden, wählen Sie \"Optionen speichern\" im Optionenmenü bevor Sie beenden."
     }
   }
 }
Index: tcl/windows/gamelist.tcl
===================================================================
--- tcl/windows/gamelist.tcl	(revision 3620)
+++ tcl/windows/gamelist.tcl	(working copy)
@@ -1076,7 +1076,7 @@
         set name $col
       }
       set answer [tk_messageBox -parent $w -title Scid -type yesno -default yes -icon question \
-          -message "[tr GlistSort] \"[file tail [sc_base filename]]\" by $name ?"]
+          -message "[tr GlistSort] \"[file tail [sc_base filename]]\" nach $name?"]
       if {$answer != "yes"} { return }
     }
 
@@ -1430,10 +1430,10 @@
 
 proc ::windows::gamelist::ReorderGameN {} {
   set w [toplevel .glreorderDialog]
-  wm title $w "Scid: Move to Game N"
+  wm title $w "Scid: Gehe zu Partie N"
   wm state $w withdrawn
 
-  label $w.label -text {Move to Game N}
+  label $w.label -text {Gehe zu Partie N}
   pack $w.label -side top -pady 5 -padx 5
 
   entry $w.entry  -width 10 -textvariable ::game::entryLoadNumber
Index: tcl/windows/pgn.tcl
===================================================================
--- tcl/windows/pgn.tcl	(revision 3620)
+++ tcl/windows/pgn.tcl	(working copy)
@@ -295,9 +295,9 @@
     global env initialDir
 
     set ftype {
-      { "PGN files"  {".pgn"} }
-      { "Text files" {".txt"} }
-      { "All files"  {"*"}    }
+      { "PGN-Dateien"  {".pgn"} }
+      { "Textdateien" {".txt"} }
+      { "Alle Dateien"  {"*"}    }
     }
 
     ### Only suggest a filename if this is not a multiple pgn file
@@ -319,14 +319,14 @@
     }
     set fname [tk_getSaveFile -parent $parent \
                  -initialdir $initialDir(pgn) -initialfile $tail \
-                 -filetypes $ftype -defaultextension .pgn -title {Save PGN}]
+                 -filetypes $ftype -defaultextension .pgn -title {PGN speichern}]
     if {$fname != ""} {
       if {[file extension $fname] != ".txt" && [file extension $fname] != ".pgn" } {
 	append fname ".pgn"
       }
       if {[catch {set tempfile [open $fname w]}]} {
-	tk_messageBox -title "Scid: Error saving file" -parent $parent -type ok \
-                      -icon warning -message "Unable to save file $fname\n\n"
+	tk_messageBox -title "Scid: Fehler beim Speichern" -parent $parent -type ok \
+                      -icon warning -message "Kann Datei $fname nicht speichern\n\n"
       } else {
         ### This currently only saves a single game,
         ### ... possibily/easily overwriting a multiple game pgn file S.A
Index: tcl/windows/stats.tcl
===================================================================
--- tcl/windows/stats.tcl	(revision 3620)
+++ tcl/windows/stats.tcl	(working copy)
@@ -23,14 +23,14 @@
   menu $w.menu.file
   $w.menu.file add command -label StatsFilePrint -command {
     set ftype {
-      { "Text files" {".txt"} }
-      { "All files"  {"*"}    }
+      { "Textdateien" {".txt"} }
+      { "Alle Dateien"  {"*"}    }
     }
-    set fname [tk_getSaveFile -initialdir $::env(HOME) -filetypes $ftype -title "Save Statistics"]
+    set fname [tk_getSaveFile -initialdir $::env(HOME) -filetypes $ftype -title "Speichere Statistiken"]
     if {$fname != ""} {
       if {[catch {set tempfile [open $fname w]}]} {
-        tk_messageBox -title "Scid: Error saving file" -type ok -icon warning \
-          -message "Unable to save the file: $fname\n\n"
+        tk_messageBox -title "Scid: Fehler beim Speichern" -type ok -icon warning \
+          -message "Kann Datei $fname nicht speichern\n\n"
       } else {
         puts $tempfile [.statsWin.stats get 1.0 end-1c]
         close $tempfile
Index: tcl/windows/switcher.tcl
===================================================================
--- tcl/windows/switcher.tcl	(revision 3620)
+++ tcl/windows/switcher.tcl	(working copy)
@@ -13,13 +13,13 @@
 # tactics.tcl:  if {[sc_game flag T [sc_game number]]}
 
 set icons {
-{Unknown}
+{Unbekannt}
 {
 R0lGODlhIAAgAIAAAFpaWlpaWiH5BAEKAAEALAAAAAAgACAAAAIejI+py+0P
 o5y02ouz3rz7D4biSJbmiabqyrbuC5sFADs=
 }
 
-{Temporary database}
+{Temporäre Datenbank}
 {
 R0lGODlhIAAgAOfkAEpLSUpMSkxOS01PTE9RTlBST1FTUFJUUVNUUlRVU1VW
 VFZXVVZYVVdZVllbWFpcWVtdWlxeW11fXF5gXTpmojtno2BiXzVsqGJkYWNl
@@ -93,7 +93,7 @@
 t+DyJIQBBAUwQE3opquuSQMAINK7IgUEADs=
 }
 
-{PGN file}
+{PGN-Datei}
 {
 R0lGODlhIAAgAOeiADMzM0tLS0xMTE5OTk9PT1BQUFFRUVJSUlNTU1RUVFVV
 VVZWVldXV1hYWFlZWVpaWltbW1xcXH5YHV1dXX9ZH4BaIGBgYIFbIoJdJINe
@@ -128,7 +128,7 @@
 JZCYasm01FZrrSUGIKTAttwu4O234Ia7AAMAMGTuueieGxAAOw==
 }
 
-{My games}
+{Meine Partien}
 {
 R0lGODlhIAAgAMZkACEhISYmJioqKi4uLjQ0NDU1NTg4ODk5OTs7Ozw8PD4+
 PkBAQEFBQUJCQkZGRkdHR0pKSktLS09PT1BQUFJSUlNTU1RUVFdXV1hYWFlZ
@@ -150,7 +150,7 @@
 H068uHHfgihUWM68ufPnzzNJn069uvVGgQAAOw==
 }
 
-{Large database}
+{Große Datenbank}
 {
 R0lGODlhIAAgAOf/AC4jCjMjDB41ADooBDwrD0UsBR9JA0M4BipGAlA1AVQ0
 A0o2FShQAVo5CF07A0s+JT1CRF48DCxaAWE/B2M8FWY6G1NGFV9CEGVBCmNB
@@ -190,7 +190,7 @@
 hxlvHLGD3AlmU40xYSMgwAEiaCC5AyU00AAGJeCgggrsEuv5QAEBADs=
 }
 
-{Correspondence chess}
+{Fernschach}
 {
 R0lGODlhIAAgAOesAGVkYGxrZ21saW5taG5tanBvbHFvbHFwbXJxbXNzb3V0
 cXZ2c3d2cnl4c3p6dXx6d3x7d359eYGAeoGAfIKBfIODfoSDfYSDfoWEgIaF
@@ -226,7 +226,7 @@
 BhZQIEEEEDjQAAMKJIBAAQQAsNTABBds8MEIFxQQADs=
 }
 
-{Computer Chess}
+{Computer-Schach}
 {
 R0lGODlhIAAgAOf/ACEkUBcjhyYoVSkqVyosWSstWi0vXC8wXjAxXy4tejEy
 YC40ZzExdzM0YjIwfTM2XjY0aTA3ajY3ZS82gTM5bDY1fDg4ZzQ6bTU7bjs5
@@ -268,7 +268,7 @@
 BPEsG4HEFSzn+/D01GcUEAA7
 }
 
-{Index of games}
+{Index der Partien}
 {
 R0lGODlhIAAgAOcIAEVFRUdHR0hISE1NTVFRUVJSUlRUVFdXV1paWl1dXV9f
 X2FhYWNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3Bw
@@ -313,7 +313,7 @@
 gg/+EQAVrIAFKtABDnBggxuq4AYWO/QNC1ZAgx3q4IYsgEEOcKADFPwjIAA7
 }
 
-{Player collection}
+{Spielersammlung}
 {
 R0lGODlhIAAgAOfBAEhISE5OTlFRUTlbiFZWVldXV1pbXVxcXDVkojRlpDZl
 oTRmpDVmpTZmpDdmpV9fXzloozhopjlopDlop2FhYTdqpz1poGJiYj5poTpq
@@ -346,7 +346,7 @@
 Chg0AGaMMorATJBGKumklFZqaUAAOw==
 }
 
-{Tournament}
+{Turnier}
 {
 R0lGODlhIAAgAMIDAAAAAAAA/zw8PMi9vci9vci9vci9vci9vSH5BAEKAAQA
 LAAAAAAgACAAAANoOLrc/jDKCaqt497JO9WZFYpeaZ5oFCjr0L5sKs9SYNsK
@@ -393,7 +393,7 @@
 DFJILfbYZJctUkAAOw==
 }
 
-{GM games}
+{GM-Partien}
 {
 R0lGODlhIAAgAOevACAgICUlJSoqKi4uLjEwMDMzMzY2Njg4ODo6Ojw8PD09
 PT49PT8+Pj8/P0BAQEREREZEREVFRUlHR0lISEpKSk1KSk1LS0xMTE5OTlFR
@@ -427,7 +427,7 @@
 AVjQiREiqnZigEAMAGDrrbjmquuuswqUAXLABivssLlJZOyxyB4bEAA7
 }
 
-{IM games}
+{IM-Partien}
 {
 R0lGODlhIAAgAOeNACAgICUlJSoqKi4uLjMzMzQ0NDY2Njg4ODo6Ojw8PD09
 PT49PT8+Pj8/P0BAQEJCQkREREVFRUZGRklISEpKSk1LS05OTk9PT1FRUVVS
@@ -461,7 +461,7 @@
 rLbq6qsJ+2Uk66y0QhQQADs=
 }
 
-{Blitz games}
+{Blitzpartien}
 {
 R0lGODlhIAAgAOf/AAABAA8RDRMSCRIUERoXChocGh4fHSYiEycoJismLzMw
 HzYtPDoxQTU3NEY9GEA6T0M9UUdAVURGQ0lDWEtEWVVLK05LZVNJZVVPZFlP
@@ -502,7 +502,7 @@
 OUQUaLCB6h5YEEECp8cu++yXBwQAOw==
 }
 
-Tactics
+Taktiken
 {
 R0lGODlhIAAgAOeKACAgICUlJSoqKi4uLjMzMzQ0NDY2Njg4ODo6Ojw8PD09
 PT8/P0A/P0BAQEJCQkREREZEREVFRUZGRkpKSkxLS05OTk9PT1VSUlNTU1RU
@@ -535,7 +535,7 @@
 iCYaQUaMNuooRAEBADs=
 }
 
-{End games}
+{Endspiele}
 { R0lGODlhIAAgAKUJAAoKChERESgoKCkpKS4uLjAwMDExMTc3Nzg4ODw8PD8/
 P0REREdHR05OTlFRUVJSUlZWVlxcXF1dXV5eXmBgYGFhYWJiYmRkZGVlZWZm
 ZmhoaGtra2xsbG5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXd3d3h4eHp6enx8
@@ -549,7 +549,7 @@
 qJpJaeBSAgoCADs=
 }
 
-{Openings for White}
+{Eröffnungen für Weiß}
 {
 R0lGODlhIAAgAOfuACs5X8sAAMwAAM0AAMwBAC8+Z84BAc8CAs4DA88DA8YN
 AzZFdFQ8YTZIeDdIeDdJdTZJeDhIeTdJeDdJeTdKeTlJejhKeThKejlKeThL
@@ -583,7 +583,7 @@
 CbXq6qsEsMIaEAA7
 }
 
-{Openings for Black}
+{Eröffnungen für Schwarz}
 {
 R0lGODlhIAAgAOfvADU1NSs5X8sAAMwAAM0AAMwBAC8+Z84BAc8CAs4DA88D
 A8YNAzZFdFQ8YTZIeDdIeDdJdTZJeDhIeTdJeDdJeTdKeTlJejhKeThKejlK
@@ -617,7 +617,7 @@
 CbXq6qsEsMIaEAA7
 }
 
-{Openings for either color}
+{Eröffnungen für beide Farben}
 {
 R0lGODlhIAAgAOfRADU1NSs5Xy8+ZzZFdDZIeDdIeDdJdTZJeDhIeTdJeDdJ
 eTdKeTlJejhKeThKejlKeThLejlLeTlLejlLeztNez5Ofj5Rfj9RfT9RfkRX
@@ -651,7 +651,7 @@
 AiA0QAETE0V0QKwEwBprAQnlquuuvPIaEAA7
 }
 
-{Theory: 1.c4}
+{Theorie: 1.c4}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACfYRvoauIzNyBSyYaLMDZcv15
   GDiKFHmaELqqkVvBXCN3UniXebq3/fuLBWlDmwN31CV5S18T+BRqokSqTSCYKB8lwWCQ3Wy1
   PCzZyU15wRdmerX+ZpHvCPY+H7fRZ2h9VvUX2CclaGTI4kc4uKfYWLh4GJkI+cgo5jZZo1EA
@@ -658,7 +658,7 @@
   ADs=
 }
 
-{Theory: 1.d4}
+{Theorie: 1.d4}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACf4RvoauIzNyBSyYaLMDZcv15
   GDiKFHmaELqqkVvBXCN3UniXebq3/fuLBWlDmwN31CV5S18T+BRqokSq8aEQCKRYJlYwGGyv
   E2VXyy17y2Bxtet8tMNbFlSuzZMva35cPXMHKOhHuGE2mFaoeNjX+Lf4ligZufdoiASHiVip
@@ -665,7 +665,7 @@
   UQAAOw==
 }
 
-{Theory: 1.d4 d5}
+{Theorie: 1.d4 d5}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACh4RvoauIzNyBSyYaLMDZcv15
   GDiKFHmaELqqkVvBXCN3UggIwlTepa67pHzDoLBFbAF3m57jswzinqPobvpwZocaKneL9Opi
   yZdPMBgIaGWyeM32hrNodRxsftbTa1b+YWUj98fzVThDeJTYZKjohvd4uIglGel4V4l5KQip
@@ -672,7 +672,7 @@
   yTiXyRnqZwlQAAA7
 }
 
-{Theory: QGD}
+{Theorie: abgel. Damengambit}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACmYRvoauIzNyB6wgxaZBJm3t1
   FAdo24eJEGmiYelxLQjCo+zRYYvfksn7xYS+l23VQ9JUkWQTYAw6eMvjc5rTWSvOig4jfQyx
   PhIZSURHFRduuikYDFJsuaDRxUNTtrb+DGfXETf3JzZCKBiQWMiStbSoc/LmBlh5CHSFqZlR
@@ -679,7 +679,7 @@
   tnnZiWZpGMrJBHpKmjo5yvqpugUbVooa63pQAAA7
 }
 
-{Theory: Slav}
+{Theorie: Slawisch}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACmIRvoauIzI4QBy5XbTBzJo19
   lkSJUAhoG9CVKvq23hvGcgrWOUbz6u7oBXceU0Q3YnWMF+SJU8IlfckWs+GMyCjCB2grfVLF
   wymqTPZOi9JJc3wUDAaugJyOhb/ZC3ceHTdXdyfwp3ZyJ5iSiAfzdWMns6JnmGF2+PMGqInJ
@@ -686,7 +686,7 @@
   aZn2eUQ5uVl5RdppGiZaihrqeep4+aradVAAADs=
 }
 
-{Theory: 1.d4 Nf6}
+{Theorie: 1.d4 Nf6}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACioRvoauIKqJoLrFVrYwhg4tl
   wcZ5IFWNZCeeJiexqdtCZX29q0lXZNxznGTC4MN4GPJAyxyO0YQ+QzPmFFW0Vp1baZfqyXLF
   3iwHe9QWBYPBhJgep8/wJFLTfkfBD3bbXWeh1rdzFfhxhzg0aMcoKNcI+VgWRxlpOcl3qZmJ
@@ -693,7 +693,7 @@
   tunZeahkuAeqKAlQAAA7
 }
 
-{Theory: 1.e4}
+{Theorie: 1.e4}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACfYRvoauIzNyBSyYaLMDZcv15
   GDiKFHmaELqqkVvBXCN3UniXebq3/fuLBWlDmwN31CV5S18T+BRqokSq8aETCCZKbEowGGw3
   XS5Pa3Z6W2DxhbmOtMNbZLyizdfLb3V6JnVXJXj1F2g4iFjYB0XI0qj4eMg4SQYXWSOZaFAA
@@ -700,7 +700,7 @@
   ADs=
 }
 
-{Theory: Sicilian}
+{Theorie: Sizilianisch}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAAChYRvoauIzNyBSyYaLMDZcv15
   GDiKFHmaELqqkVvBXCN30iII8V3yeU7jpYTAoCPk+xkfveNPyXrdnsDo7thkDjXYrbYlBOcm
   WXJKMBgILl6zeM0Gd1todVw6j9TTa2S+QtVXdnf1NVPohmeISLiUyLgxGNnWaPPnWGmFOSm3
@@ -707,7 +707,7 @@
   uOnnaRmqUQAAOw==
 }
 
-{Theory: Sicilian 1.e4 c5 2.Nd3 d6 3.d4}
+{Theorie: Sizilianisch 1.e4 c5 2.Nd3 d6 3.d4}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACo4RvoauIzNxZQiyZYMOq1i1p
   oENZ4yNiQOedU8p5rSoGtPzRcLiTdY/S6AIfV0bIIbZsSSRPeWlCdDLjCjjBWYbTGI757IYj
   UrJqHEVbS+nKy+kTDAYmg5x+FPugIHfeHDdXB3An8JdGcidoo4hXc/NFiHMFF6Rn+YOIGSVz
@@ -714,7 +714,7 @@
   uJbSaPhYRjFnKorlSURXSHn5BuFB6JjqatY6qsaoiFoJy6BVUQAAOw==
 }
 
-{Theory: Caro-Kann}
+{Theorie: Caro-Kann}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACh4RvoauIzI4QBy5XbTBzJo19
   lkSJUAhoG9CVKvq23hvGcgrWOUbz6u7oBYEPYmakQ/qUQ2bReTwlpUtq0/rERiNTLqrqvYaz
   Xo9pvL2wBgOX8axmlXBQeGPdtq/AFwGbTSFE1ncjmHbH97MnFseI6Lg4+CgZeVipB/NGp4XZ
@@ -721,7 +721,7 @@
   1UiZWbeJ1olRAAA7
 }
 
-{Theory: French}
+{Theorie: Französisch}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACiIRvoauIzNyB6wgxaZBJm3t1
   FAdo24eJEGmiYelxLQjCo+zRYYvfksn7xYQ+R9A4RBYfSeYy81RFeivqlFjFXpVZ7pbk7Ia/
   0OzLJi5PBYNB6jiuoNRyrZztlta9FXwbA0fXoAPYJHhiB4TI12C1F9eYuAg5echiqBfJWJnJ
@@ -728,7 +728,7 @@
   iUbWeRn1+WjJUQAAOw==
 }
 
-{Theory: Open Games}
+{Theorie: Offene Spiele}
 { R0lGODdhIAAgAKEAAP/739jGpgAAAP///ywAAAAAIAAgAAACh4RvoauIzNyBSyYaLMDZcv15
   GDiKFHmaELqqkVvBXCN3UngrghDnab7b0Xwtn3DowCUDQZ5t+Us2hazXbcqr9qBFDdf63T5K
   gN2EHKYJBgPBJTr+md/deGvdpoPtETzbrcRXgbWBJoh0OKOFeAbXWPe4Fyk2yahHeWlZ6Jj5
@@ -966,8 +966,8 @@
       $f.menu.show add checkbutton -label [tr ShowIcons] -variable ::windows::switcher::icons -command ::windows::switcher::Refresh
       $f.menu.show add checkbutton -label [tr ConfirmCopy] -variable ::windows::switcher::confirmCopy
       $f.menu.show add separator
-      $f.menu.show add command -label "Switcher Colour" -command SetSwitcherColour
-      $f.menu.show add command -label "Current Game Colour" -command SetGamelistColour
+      $f.menu.show add command -label "Datenbankwechselfarbe" -command SetSwitcherColour
+      $f.menu.show add command -label "Aktuelle Partiefarbe" -command SetGamelistColour
       $f.menu.show add checkbutton -label [tr TreeOptSmallFont] -variable ::windows::gamelist::customFont -command {
         ::windows::gamelist::configFont
         ::windows::gamelist::Configure .glistWin.tree
@@ -1166,7 +1166,7 @@
 
   if {$err != ""} {
     tk_messageBox -type ok -icon info -title Scid \
-        -message "$::tr(CopyErr) \nfrom \"$fromName\" to \"$targetName\".\n$err" -parent $parent
+        -message "$::tr(CopyErr) \nvon \"$fromName\" nach \"$targetName\".\n$err" -parent $parent
     return
   }
 
@@ -1231,7 +1231,7 @@
     set initialDir(sff) $env(HOME)
   }
   set fName [tk_getSaveFile -initialdir $initialDir(sff) -initialfile [file tail [sc_base filename $base]].sff \
-                -filetypes $ftype -title "Create a Filter file" -parent .glistWin]
+                -filetypes $ftype -title "Erstelle eine Filterdatei" -parent .glistWin]
   if {$fName == ""} {
     return
   }
@@ -1250,7 +1250,7 @@
     set initialDir(sff) $env(HOME)
   }
   set fName [tk_getOpenFile -initialdir $initialDir(sff) -parent .glistWin \
-		 -filetypes $ftype -title "Select a Filter file"]
+		 -filetypes $ftype -title "Wähle eine Filterdatei"]
   if {$fName == ""} {
     return
   }
@@ -1258,8 +1258,8 @@
   set initialDir(sff) [file dirname $fName]
 return
   if {[catch {uplevel "#0" {source $fName} } ]} {
-    tk_messageBox -title "Scid: Error reading file" -type ok -icon warning \
-                -message "Unable to open or read SearchOptions file: $fName"
+    tk_messageBox -title "Scid: Fehler beim Lesen einer Datei" -type ok -icon warning \
+                -message "Kann Suchoptionendatei nicht öffnen oder lesen: $fName"
   } else {
     switch -- $::searchType {
       "Material" { ::search::material }
Index: tcl/windows/tree.tcl
===================================================================
--- tcl/windows/tree.tcl	(revision 3620)
+++ tcl/windows/tree.tcl	(working copy)
@@ -47,7 +47,7 @@
 
 proc ::tree::treeFileSave {base} {
   if {[catch {sc_tree write $base} result]} {
-    tk_messageBox -type ok -icon warning -title "Scid: Error writing file" -message $result -parent .treeWin$base
+    tk_messageBox -type ok -icon warning -title "Scid: Fehler beim Schreiben der Datei" -message $result -parent .treeWin$base
   }
 }
 
@@ -86,7 +86,7 @@
     status	""
     bestMax	100
     order	frequency
-    bestRes	All
+    bestRes	Alle
   } {
    set tree($i$baseNumber) $j
   }
@@ -156,7 +156,7 @@
   $w.menu.mask add command -label TreeMaskFillWithLine -command "::tree::mask::fillWithLine"
   $w.menu.mask add command -label TreeMaskFillWithGame -command "::tree::mask::fillWithGame"
   $w.menu.mask add command -label TreeMaskFillWithBase -command "::tree::mask::fillWithBase $baseNumber"
-  $w.menu.mask add command -label Help -command {helpWindow TreeMasks}
+  $w.menu.mask add command -label Hilfe -command {helpWindow TreeMasks}
 
   foreach {label value} {
     Alpha alpha
@@ -387,8 +387,8 @@
 ################################################################################
 proc ::tree::doTrace { prefix name1 name2 op} {
   if {[scan $name2 "$prefix%d" baseNumber] !=1 } {
-    tk_messageBox -parent . -icon error -type ok -title "Fatal Error" \
-        -message "Scan failed in trace code\ndoTrace $prefix $name1 $name2 $op"
+    tk_messageBox -parent . -icon error -type ok -title "Fataler Fehler" \
+        -message "Scan fehlgeschlagen in trace code\ndoTrace $prefix $name1 $name2 $op"
     return
   }
   if {[winfo exists .treeBest$baseNumber]} {
@@ -1105,7 +1105,7 @@
   set fname [sc_base filename $base]
   if {[string index $fname 0] == "\["  ||  [file extension $fname] == ".pgn"} {
     tk_messageBox -parent .treeWin$baseNumber -icon info -type ok -title Scid \
-        -message "Sorry, only Scid-format database files can have a tree cache file." -parent .treeWin$baseNumber
+        -message "Sorry, nur Datenbankdateien im Scid-Format können eine Baum-Cache-Datei haben." -parent .treeWin$baseNumber
     return
   }
 
@@ -1293,7 +1293,7 @@
     grid columnconfig $w.blist 0 -weight 1 -minsize 0
 
     label $w.b.result -text " $::tr(Result)" -font font_Small
-    tk_optionMenu $w.b.res tree(bestRes$baseNumber) All 1-0 0-1 {1-0 0-1} {1/2-1/2}
+    tk_optionMenu $w.b.res tree(bestRes$baseNumber) Alle 1-0 0-1 {1-0 0-1} {1/2-1/2}
     $w.b.res configure -font font_Small -direction right
 
     if {$::tree::sortBest} {
@@ -1302,7 +1302,7 @@
       set tree(sortBest$baseNumber) Order
     }
     label $w.b.sort -text " $::tr(Sort)" -font font_Small
-    tk_optionMenu $w.b.sortMenu tree(sortBest$baseNumber) Best Order
+    tk_optionMenu $w.b.sortMenu tree(sortBest$baseNumber) Beste Reihenfolge
     $w.b.sortMenu configure -font font_Small -direction right
 
     button $w.b.close -text $::tr(Close) -command "destroy $w" -width 9 -font font_Small
@@ -1501,8 +1501,8 @@
         $menu.addcol add command -label $tr(Glist$h) -command "::tree::bestInsertCol $w $i $col"
       incr i
     }
-    $menu add cascade -label $tr(GlistAddField) -menu $menu.addcol
-    $menu add command -label $tr(GlistRemoveThisGameFromFilter) -command "::tree::bestRemoveCol $w $col"
+    $menu add cascade -label "Spalte hinzufügen" -menu $menu.addcol
+    $menu add command -label "Spalte entfernen" -command "::tree::bestRemoveCol $w $col"
 
     $menu add separator
 
@@ -1626,9 +1626,9 @@
 
 proc ::tree::getCacheInfo { base } {
   set ci [sc_tree cacheinfo $base]
-  tk_messageBox -title "Cache Info" -type ok -icon info \
-      -message "Base: [file tail [sc_base filename $base]]
-Cache used : [lindex $ci 0] / [lindex $ci 1]" -parent .treeWin$base
+  tk_messageBox -title "Cache-Information" -type ok -icon info \
+      -message "Datenbank: [file tail [sc_base filename $base]]
+Benutzter Zwischen- speicher: [lindex $ci 0]/[lindex $ci 1]" -parent .treeWin$base
 
 }
 
@@ -1835,9 +1835,9 @@
   if {$filename != ""} {
     if {![file readable $filename]} {
       if {$parent == "autoLoad"} {
-	::splash::add "Can't read mask file $filename" error
+	::splash::add "Kann Maskendatei $filename nicht lesen." error
       } else {
-	tk_messageBox -title Oops -type ok -icon info -message "Mask: no such file \"$filename\""
+	tk_messageBox -title Hoppla -type ok -icon info -message "Maske: keine Datei \"$filename\" vorhanden."
       }
     } else {
       set ::initialDir(stm) [file dirname $filename]
@@ -1928,7 +1928,7 @@
       array set ::tree::mask::mask {}
       ::tree::refresh
     } else {
-      tk_messageBox -title "Oops" -type ok -icon warning -message "File '$filename' not writeable."
+      tk_messageBox -title "Hoppla" -type ok -icon warning -message "Datei '$filename' ist nicht beschreibbar."
     }
   }
 }
@@ -2407,15 +2407,15 @@
   }
 
   if {[sc_var level] > 0} {
-    tk_messageBox -title Scid -type ok -icon warning -message "Can't add lne from inside a variation."
+    tk_messageBox -title Scid -type ok -icon warning -message "Kann Zug nicht von innerhalb einer Variante hinzufügen."
     return
   }
 
   if {$op == ""} {
     set reply [tk_dialog .booktune $::tr(AddLine) \
-      {Add all/white/black moves (to current position) to mask ?} \
+      {Alle weißen/schwarzen Züge der Maske hinzufügen (bis zur aktuellen Stellung)?} \
       question 0 \
-      {  All  } $::tr(White) $::tr(Black) $::tr(Cancel) ]
+      {  Alle  } $::tr(White) $::tr(Black) $::tr(Cancel) ]
 
     if {$reply == 3} {return}
     if {$reply == 1} {set reply white}
@@ -2566,9 +2566,9 @@
   frame $w.fcb
   pack $w.fcb -fill x -side bottom
 
-  checkbutton $w.fcb.unfold -font font_Small -text Unfold -variable ::tree::mask::displayMask_unfold \
+  checkbutton $w.fcb.unfold -font font_Small -text Entfalten -variable ::tree::mask::displayMask_unfold \
     -command ::tree::mask::updateDisplayMask
-  checkbutton $w.fcb.nag -font font_Small -text Nags/Markers -variable ::tree::mask::displayMask_showNag \
+  checkbutton $w.fcb.nag -font font_Small -text NAGs/Marker -variable ::tree::mask::displayMask_showNag \
     -command ::tree::mask::updateDisplayMask
   checkbutton $w.fcb.comment -font font_Small -text [::tr Comments] -variable ::tree::mask::displayMask_showComment \
     -command ::tree::mask::updateDisplayMask
@@ -2723,7 +2723,7 @@
       set id [ $tree insert $parent end -text "$posComment[::trans $move]$move_comment" -tags dblClickTree -open $::tree::mask::displayMask_unfold]
     }
   }]} {
-    tk_messageBox -icon error -type ok -title Oops -message "Error in populateDisplayMask.\nPossibly you are using an old mask ?? Some images have been changed."
+    tk_messageBox -icon error -type ok -title Oops -message "Fehler in populateDisplayMask.\nMöglicherweise benutzen Sie eine alte Maske? Einige Bilder wurden geändert."
     return
   }
 
