changeset 460:77c17bbe9d20

Translator: added new modules; applied fixes. Added a new directory i18n. It contains the translator project file and the language catalogue files. The translator main window has a dock widget on the left hand-side now, with a project tree widget.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Tue, 30 Oct 2007 18:12:01 +0100
parents 1b5f1ce09f38
children c78a54b2617c
files trunk/i18n/build.py trunk/i18n/de.cat trunk/i18n/dil.tproj trunk/i18n/en.cat trunk/i18n/fi.cat trunk/i18n/tr.cat trunk/src/translator/errors.py trunk/src/translator/langfile.py trunk/src/translator/make_uis.sh trunk/src/translator/msg_form.ui trunk/src/translator/project.py trunk/src/translator/translator.py trunk/src/translator/translator.ui trunk/src/translator/ui_about.py trunk/src/translator/ui_msg_form.py trunk/src/translator/ui_new_project.py trunk/src/translator/ui_project_properties.py trunk/src/translator/ui_translator.py
diffstat 18 files changed, 700 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/i18n/build.py	Tue Oct 30 18:12:01 2007 +0100
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+# Author: Aziz Köksal
+# License: GPL2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/i18n/de.cat	Tue Oct 30 18:12:01 2007 +0100
@@ -0,0 +1,87 @@
+Authors:
+- [Aziz Köksal, aziz.koeksal@gmail.com]
+LangCode: de
+License: GPL3
+Messages:
+- {Annot: '', ID: 0, LastEd: '', Text: 'illegales Zeichen gefunden: ''{0}'''}
+- {Annot: '', ID: 1, LastEd: '', Text: ungültiges Unicodezeichen.}
+- {Annot: '', ID: 2, LastEd: '', Text: ungültige UTF-8-Sequenz.}
+- {Annot: '', ID: 3, LastEd: '', Text: unterminiertes Zeichenliteral.}
+- {Annot: '', ID: 4, LastEd: '', Text: leeres Zeichenliteral.}
+- {Annot: '', ID: 5, LastEd: '', Text: erwartete 'line' nach '#'.}
+- {Annot: '', ID: 6, LastEd: '', Text: 'Ganzzahl nach #line erwartet.'}
+- {Annot: '', ID: 7, LastEd: '', Text: erwartete Dateispezifikation (z.B. "pfad\zur\datei".)}
+- {Annot: '', ID: 8, LastEd: '', Text: unterminierte Dateispezifikation (filespec.)}
+- {Annot: '', ID: 9, LastEd: '', Text: ein Special Token muss mit einem Zeilenumbruch
+    abgeschlossen werden.}
+- {Annot: '', ID: 10, LastEd: '', Text: unterminiertes Zeichenkettenliteral.}
+- {Annot: '', ID: 11, LastEd: '', Text: 'Nicht-Hexzeichen ''{0}'' in Hexzeichenkette
+    gefunden.'}
+- {Annot: '', ID: 12, LastEd: '', Text: ungerade Anzahl von Hexziffern in Hexzeichenkette.}
+- {Annot: '', ID: 13, LastEd: '', Text: unterminierte Hexzeichenkette.}
+- {Annot: '', ID: 14, LastEd: '', Text: unterminierter Blockkommentar (/* */).}
+- {Annot: '', ID: 15, LastEd: '', Text: unterminierter verschachtelter Kommentar (/+
+    +/).}
+- {Annot: '', ID: 16, LastEd: '', Text: unterminierte rohe Zeichenkette.}
+- {Annot: '', ID: 17, LastEd: '', Text: unterminierte Backquote-Zeichenkette.}
+- {Annot: '', ID: 18, LastEd: '', Text: 'undefinierte Escapesequenz ''{0}'' gefunden.'}
+- {Annot: '', ID: 19, LastEd: '', Text: 'ungültige Unicode-Escapesequenz ''{0}'' gefunden.'}
+- {Annot: '', ID: 20, LastEd: '', Text: unzureichende Anzahl von Hexziffern in Escapesequenz.}
+- {Annot: '', ID: 21, LastEd: '', Text: 'undefinierte HTML-Entität ''{0}'''}
+- {Annot: '', ID: 22, LastEd: '', Text: 'unterminierte HTML-Entität ''{0}''.'}
+- {Annot: '', ID: 23, LastEd: '', Text: HTML-Entitäten müssen mit einem Buchstaben
+    beginnen.}
+- {Annot: '', ID: 24, LastEd: '', Text: Dezimalzahl überläuft im Vorzeichenbit.}
+- {Annot: '', ID: 25, LastEd: '', Text: Überlauf in Dezimalzahl.}
+- {Annot: '', ID: 26, LastEd: '', Text: Überlauf in Hexadezimalzahl.}
+- {Annot: '', ID: 27, LastEd: '', Text: Überlauf in Binärzahl.}
+- {Annot: '', ID: 28, LastEd: '', Text: Überlauf in Oktalzahl.}
+- {Annot: '', ID: 29, LastEd: '', Text: Überlauf in Fließkommazahl.}
+- {Annot: '', ID: 30, LastEd: '', Text: die Ziffern 8 und 9 sind in Oktalzahlen unzulässig.}
+- {Annot: '', ID: 31, LastEd: '', Text: ungültige Hexzahl; mindestens eine Hexziffer
+    erforderlich.}
+- {Annot: '', ID: 32, LastEd: '', Text: ungültige Binärzahl; mindestens eine Binärziffer
+    erforderlich.}
+- {Annot: '', ID: 33, LastEd: '', Text: der Exponent einer hexadezimalen Fließkommazahl
+    ist erforderlich.}
+- {Annot: '', ID: 34, LastEd: '', Text: Hexadezimal-Exponenten müssen mit einer Dezimalziffer
+    anfangen.}
+- {Annot: '', ID: 35, LastEd: '', Text: Exponenten müssen mit einer Dezimalziffer
+    anfangen.}
+- {Annot: '', ID: 36, LastEd: '', Text: 'erwartete ''{0}'', fand aber ''{1}''.'}
+- {Annot: '', ID: 37, LastEd: '', Text: '''{0}'' ist redundant.'}
+- {Annot: '', ID: 38, LastEd: '', Text: Template-Tupel-Parameter dürfen nur am Ende
+    auftreten.}
+- {Annot: '', ID: 39, LastEd: '', Text: der 'in'-Vertrag der Funktion wurde bereits
+    geparsed.}
+- {Annot: '', ID: 40, LastEd: '', Text: der 'out'-Vertrag der Funktion wurde bereits
+    geparsed.}
+- {Annot: '', ID: 41, LastEd: '', Text: es wurde kein Verbindungstyp angegeben.}
+- {Annot: '', ID: 42, LastEd: '', Text: 'unbekannter Verbindungstyp ''{0}''; gültig
+    sind C, C++, D, Windows, Pascal und System.'}
+- {Annot: '', ID: 43, LastEd: '', Text: 'erwartete eine oder mehrere Basisklassen,
+    nicht ''{0}''.'}
+- {Annot: '', ID: 44, LastEd: '', Text: Basisklassen sind in Vorwärtsdeklarationen
+    nicht erlaubt.}
+- {Annot: '', ID: 45, LastEd: '', Text: 'dil v{0}
+
+    Copyright (c) 2007, Aziz Köksal. Lizensiert unter der GPL3.
+
+
+    Befehle:
+
+    {1}
+
+    Geben Sie ''dil help <Befehl>'' ein, um mehr Hilfe zu einem bestimmten Befehl
+    zu
+
+    erhalten.
+
+
+    Kompiliert mit {2} v{3} am {4}.'}
+- {Annot: '', ID: 46, LastEd: '', Text: "Generiere ein XML- oder HTML-Dokument aus\
+    \ einer D-Quelltextdatei.\nVerwendung:\n  dil gen datei.d [Optionen]\n\nOptionen:\n\
+    \  --syntax         : generiere Elemente für den Syntaxbaum\n  --xml         \
+    \   : verwende XML-Format (voreingestellt)\n  --html           : verwende HTML-Format\n\
+    \nBeispiel:\n  dil gen Parser.d --html --syntax > Parser.html"}
+- {Annot: '', ID: 47, LastEd: '', Text: ''}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/i18n/dil.tproj	Tue Oct 30 18:12:01 2007 +0100
@@ -0,0 +1,54 @@
+BuildScript: build.py
+CreationDate: '2007-10-12 09:41:17.868084'
+LangFiles: [en.cat, de.cat, tr.cat, fi.cat]
+MsgIDs:
+- {ID: 0, Name: IllegalCharacter, Order: 0}
+- {ID: 1, Name: InvalidUnicodeCharacter, Order: 1}
+- {ID: 2, Name: InvalidUTF8Sequence, Order: 2}
+- {ID: 3, Name: UnterminatedCharacterLiteral, Order: 3}
+- {ID: 4, Name: EmptyCharacterLiteral, Order: 4}
+- {ID: 5, Name: ExpectedIdentifierSTLine, Order: 5}
+- {ID: 6, Name: ExpectedIntegerAfterSTLine, Order: 6}
+- {ID: 7, Name: ExpectedFilespec, Order: 7}
+- {ID: 8, Name: UnterminatedFilespec, Order: 8}
+- {ID: 9, Name: UnterminatedSpecialToken, Order: 9}
+- {ID: 10, Name: UnterminatedString, Order: 10}
+- {ID: 11, Name: NonHexCharInHexString, Order: 11}
+- {ID: 12, Name: OddNumberOfDigitsInHexString, Order: 12}
+- {ID: 13, Name: UnterminatedHexString, Order: 13}
+- {ID: 14, Name: UnterminatedBlockComment, Order: 14}
+- {ID: 15, Name: UnterminatedNestedComment, Order: 15}
+- {ID: 16, Name: UnterminatedRawString, Order: 16}
+- {ID: 17, Name: UnterminatedBackQuoteString, Order: 17}
+- {ID: 18, Name: UndefinedEscapeSequence, Order: 18}
+- {ID: 19, Name: InvalidUnicodeEscapeSequence, Order: 19}
+- {ID: 20, Name: InsufficientHexDigits, Order: 20}
+- {ID: 21, Name: UndefinedHTMLEntity, Order: 21}
+- {ID: 22, Name: UnterminatedHTMLEntity, Order: 22}
+- {ID: 23, Name: InvalidBeginHTMLEntity, Order: 23}
+- {ID: 24, Name: OverflowDecimalSign, Order: 24}
+- {ID: 25, Name: OverflowDecimalNumber, Order: 25}
+- {ID: 26, Name: OverflowHexNumber, Order: 26}
+- {ID: 27, Name: OverflowBinaryNumber, Order: 27}
+- {ID: 28, Name: OverflowOctalNumber, Order: 28}
+- {ID: 29, Name: OverflowFloatNumber, Order: 29}
+- {ID: 30, Name: OctalNumberHasDecimals, Order: 30}
+- {ID: 31, Name: NoDigitsInHexNumber, Order: 31}
+- {ID: 32, Name: NoDigitsInBinNumber, Order: 32}
+- {ID: 33, Name: HexFloatExponentRequired, Order: 33}
+- {ID: 34, Name: HexFloatExpMustStartWithDigit, Order: 34}
+- {ID: 35, Name: FloatExpMustStartWithDigit, Order: 35}
+- {ID: 36, Name: ExpectedButFound, Order: 36}
+- {ID: 37, Name: RedundantStorageClass, Order: 37}
+- {ID: 38, Name: TemplateTupleParameter, Order: 38}
+- {ID: 39, Name: InContract, Order: 39}
+- {ID: 40, Name: OutContract, Order: 40}
+- {ID: 41, Name: MissingLinkageType, Order: 41}
+- {ID: 42, Name: UnrecognizedLinkageType, Order: 42}
+- {ID: 43, Name: ExpectedBaseClasses, Order: 43}
+- {ID: 44, Name: BaseClassInForwardDeclaration, Order: 44}
+- {ID: 45, Name: HelpMain, Order: 45}
+- {ID: 46, Name: HelpGenerate, Order: 46}
+- {ID: 47, Name: HelpImportGraph, Order: 47}
+Name: dil
+SourceLangFile: ''
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/i18n/en.cat	Tue Oct 30 18:12:01 2007 +0100
@@ -0,0 +1,90 @@
+Authors:
+- [Aziz Köksal, aziz.koeksal@gmail.com]
+LangCode: en
+License: GPL3
+Messages:
+- {Annot: '', ID: 0, LastEd: '', Text: 'illegal character found: ''{0}'''}
+- {Annot: '', ID: 1, LastEd: '', Text: invalid Unicode character.}
+- {Annot: '', ID: 2, LastEd: '', Text: invalid UTF-8 sequence.}
+- {Annot: '', ID: 3, LastEd: '', Text: unterminated character literal.}
+- {Annot: '', ID: 4, LastEd: '', Text: empty character literal.}
+- {Annot: '', ID: 5, LastEd: '', Text: expected 'line' after '#'.}
+- {Annot: '', ID: 6, LastEd: '', Text: 'integer expected after #line'}
+- {Annot: '', ID: 7, LastEd: '', Text: expected filespec string (e.g. "path\to\file".)}
+- {Annot: '', ID: 8, LastEd: '', Text: unterminated filespec string.}
+- {Annot: '', ID: 9, LastEd: '', Text: expected a terminating newline after special
+    token.}
+- {Annot: '', ID: 10, LastEd: '', Text: unterminated string literal.}
+- {Annot: '', ID: 11, LastEd: '', Text: 'non-hex character ''{0}'' found in hex string.'}
+- {Annot: '', ID: 12, LastEd: '', Text: odd number of hex digits in hex string.}
+- {Annot: '', ID: 13, LastEd: '', Text: unterminated hex string.}
+- {Annot: '', ID: 14, LastEd: '', Text: unterminated block comment (/* */).}
+- {Annot: '', ID: 15, LastEd: '', Text: unterminated nested comment (/+ +/).}
+- {Annot: '', ID: 16, LastEd: '', Text: unterminated raw string.}
+- {Annot: '', ID: 17, LastEd: '', Text: unterminated back quote string.}
+- {Annot: '', ID: 18, LastEd: '', Text: 'found undefined escape sequence ''{0}''.'}
+- {Annot: '', ID: 19, LastEd: '', Text: 'found invalid Unicode escape sequence ''{0}''.'}
+- {Annot: '', ID: 20, LastEd: '', Text: insufficient number of hex digits in escape
+    sequence.}
+- {Annot: '', ID: 21, LastEd: '', Text: 'undefined HTML entity ''{0}'''}
+- {Annot: '', ID: 22, LastEd: '', Text: 'unterminated HTML entity ''{0}''.'}
+- {Annot: '', ID: 23, LastEd: '', Text: HTML entities must begin with a letter.}
+- {Annot: '', ID: 24, LastEd: '', Text: decimal number overflows sign bit.}
+- {Annot: '', ID: 25, LastEd: '', Text: overflow in decimal number.}
+- {Annot: '', ID: 26, LastEd: '', Text: overflow in hexadecimal number.}
+- {Annot: '', ID: 27, LastEd: '', Text: overflow in binary number.}
+- {Annot: '', ID: 28, LastEd: '', Text: overflow in octal number.}
+- {Annot: '', ID: 29, LastEd: '', Text: overflow in float number.}
+- {Annot: '', ID: 30, LastEd: '', Text: digits 8 and 9 are not allowed in octal numbers.}
+- {Annot: '', ID: 31, LastEd: '', Text: invalid hex number; at least one hex digit
+    expected.}
+- {Annot: '', ID: 32, LastEd: '', Text: invalid binary number; at least one binary
+    digit expected.}
+- {Annot: '', ID: 33, LastEd: '', Text: the exponent of a hexadecimal float number
+    is required.}
+- {Annot: '', ID: 34, LastEd: '', Text: hexadecimal float exponents must start with
+    a digit.}
+- {Annot: '', ID: 35, LastEd: '', Text: exponents must start with a digit.}
+- {Annot: '', ID: 36, LastEd: '', Text: 'expected ''{0}'', but found ''{1}''.'}
+- {Annot: '', ID: 37, LastEd: '', Text: '''{0}'' is redundant.'}
+- {Annot: '', ID: 38, LastEd: '', Text: template tuple parameters can only be last.}
+- {Annot: '', ID: 39, LastEd: '', Text: the functions 'in' contract was already parsed.}
+- {Annot: '', ID: 40, LastEd: '', Text: the functions 'out' contract was already parsed.}
+- {Annot: '', ID: 41, LastEd: '', Text: no linkage type was specified.}
+- {Annot: '', ID: 42, LastEd: '', Text: 'unrecognized linkage type ''{0}''; valid
+    types are C, C++, D, Windows, Pascal und System.'}
+- {Annot: '', ID: 43, LastEd: '', Text: 'expected one or more base classes, not ''{0}''.'}
+- {Annot: '', ID: 44, LastEd: '', Text: base classes are not allowed in forward declarations.}
+- {Annot: '', ID: 45, LastEd: '', Text: 'dil v{0}
+
+    Copyright (c) 2007 by Aziz Köksal. Licensed under the GPL3.
+
+
+    Subcommands:
+
+    {1}
+
+    Type ''dil help <subcommand>'' for more help on a particular subcommand.
+
+
+    Compiled with {2} v{3} on {4}.'}
+- {Annot: '', ID: 46, LastEd: '', Text: "Generate an XML or HTML document from a D\
+    \ source file.\nUsage:\n  dil gen file.d [Options]\n\nOptions:\n  --syntax   \
+    \      : generate tags for the syntax tree\n  --xml            : use XML format\
+    \ (default)\n  --html           : use HTML format\n\nExample:\n  dil gen Parser.d\
+    \ --html --syntax > Parser.html"}
+- {Annot: '', ID: 47, LastEd: '', Text: "Parse a module and extract information from\
+    \ the resulting module dependency graph.\nUsage:\n  dil igraph file.d Format [Options]\n\
+    \n  The directory of file.d is implicitly added to the list of import paths.\n\
+    \nFormat:\n  --dot            : generate a dot document\n  Further options for\
+    \ --dot:\n  -gbp             : Group modules by package names\n  -gbf        \
+    \     : Group modules by full package name\n  -hle             : highlight cyclic\
+    \ edges in the graph\n  -hlv             : highlight modules in cyclic relationship\n\
+    \n  --paths          : print a list of paths to the modules imported by file.d\n\
+    \  --list           : print a list of the module names imported by file.d\n  Options\
+    \ common to --paths and --list:\n  -lN              : print N levels.\n  -m  \
+    \             : mark modules in cyclic relationships with a star.\n\nOptions:\n\
+    \  -Ipath           : add 'path' to the list of import paths where modules are\n\
+    \                     looked for\n  -rREGEXP         : exclude modules whose names\
+    \ match the regular expression\n                     REGEXP\n  -i            \
+    \   : include unlocatable modules\n\nExample:\n  dil igraph src/main.d"}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/i18n/fi.cat	Tue Oct 30 18:12:01 2007 +0100
@@ -0,0 +1,76 @@
+Authors:
+- [Jari-Matti Mäkelä, jmjm@iki.fi]
+LangCode: fi
+License: GPL3
+Messages:
+- {Annot: '', ID: 0, LastEd: '', Text: ''}
+- {Annot: '', ID: 1, LastEd: '', Text: virheellinen Unicode-merkki.}
+- {Annot: '', ID: 2, LastEd: '', Text: virheellinen UTF-8-merkkijono.}
+- {Annot: '', ID: 3, LastEd: '', Text: päättämätön merkkiliteraali.}
+- {Annot: '', ID: 4, LastEd: '', Text: tyhjä merkkiliteraali.}
+- {Annot: '', ID: 5, LastEd: '', Text: 'odotettiin rivinumeroa ''#'':n jälkeen.'}
+- {Annot: '', ID: 6, LastEd: '', Text: 'odotettiin kokonaislukua #line:n jälkeen'}
+- {Annot: '', ID: 7, LastEd: '', Text: odotettiin tiedostomäärittelyn merkkijonoa
+    (esim. "polku\tiedostoon")}
+- {Annot: '', ID: 8, LastEd: '', Text: päättämätön tiedostomäärittely.}
+- {Annot: '', ID: 9, LastEd: '', Text: odotettiin päättävää rivinvaihtoa erikoismerkin
+    jälkeen.}
+- {Annot: '', ID: 10, LastEd: '', Text: päättämätön merkkijonoliteraali.}
+- {Annot: '', ID: 11, LastEd: '', Text: 'ei-heksamerkki ''{0}'' löytyi heksajonossa.'}
+- {Annot: '', ID: 12, LastEd: '', Text: pariton määrä heksanumeroita heksajonossa.}
+- {Annot: '', ID: 13, LastEd: '', Text: päättämätön heksajono.}
+- {Annot: '', ID: 14, LastEd: '', Text: päättämätön lohkokommentti (/* */).}
+- {Annot: '', ID: 15, LastEd: '', Text: päättämätön sisäkkäinen kommentti (/+ +/).}
+- {Annot: '', ID: 16, LastEd: '', Text: päättämätön raakamerkkijono.}
+- {Annot: '', ID: 17, LastEd: '', Text: päättämätön gravisaksenttimerkkijono.}
+- {Annot: '', ID: 18, LastEd: '', Text: löydettiin määrittelemätön escape-sekvenssi.}
+- {Annot: '', ID: 19, LastEd: '', Text: 'found invalid Unicode escape sequence ''{0}''.'}
+- {Annot: '', ID: 20, LastEd: '', Text: riittämätön määrä heksanumeroita escape-sekvenssissä.}
+- {Annot: '', ID: 21, LastEd: '', Text: 'määrittelemätön HTML-entiteetti ''{0}'''}
+- {Annot: '', ID: 22, LastEd: '', Text: päättämätön HTML-entiteetti.}
+- {Annot: '', ID: 23, LastEd: '', Text: HTML-entiteettien tulee alkaa kirjaimella.}
+- {Annot: '', ID: 24, LastEd: '', Text: desimaaliluku ylivuotaa etumerkin.}
+- {Annot: '', ID: 25, LastEd: '', Text: desimaaliluvun ylivuoto.}
+- {Annot: '', ID: 26, LastEd: '', Text: heksadesimaaliluvun ylivuoto.}
+- {Annot: '', ID: 27, LastEd: '', Text: binääriluvun ylivuoto.}
+- {Annot: '', ID: 28, LastEd: '', Text: oktaaliluvun ylivuoto.}
+- {Annot: '', ID: 29, LastEd: '', Text: liukuluvun ylivuoto.}
+- {Annot: '', ID: 30, LastEd: '', Text: numerot 8 ja 9 eivät ole sallittuja oktaaliluvuissa.}
+- {Annot: '', ID: 31, LastEd: '', Text: virheellinen heksaluku; odotettiin vähintään
+    yhtä heksanumeroa.}
+- {Annot: '', ID: 32, LastEd: '', Text: virheellinen binääriluku; odotettiin vähintään
+    yhtä binäärinumeroa.}
+- {Annot: '', ID: 33, LastEd: '', Text: heksadesimaalisen liukuluvun eksponentti vaaditaan.}
+- {Annot: '', ID: 34, LastEd: '', Text: heksadesimaalisen liukuluvun eksponentista
+    puuttui numeroita.}
+- {Annot: '', ID: 35, LastEd: '', Text: eksponenttien tulee alkaa numerolla.}
+- {Annot: '', ID: 36, LastEd: '', Text: 'odotettiin ''{0}'':a, mutta löydettiin ''{1}''.'}
+- {Annot: '', ID: 37, LastEd: '', Text: '''{0}'' on redundantti.'}
+- {Annot: '', ID: 38, LastEd: '', Text: tupla voi esiintyä ainoastaan mallin viimeisenä
+    parametrina.}
+- {Annot: '', ID: 39, LastEd: '', Text: funktion alkuehto jäsennettiin jo.}
+- {Annot: '', ID: 40, LastEd: '', Text: funktion loppuehto jäsennettiin jo.}
+- {Annot: '', ID: 41, LastEd: '', Text: linkitystyyppiä ei määritelty.}
+- {Annot: '', ID: 42, LastEd: '', Text: 'tunnistamaton linkitystyyppi ''{0}''; sallittuja
+    tyyppejä ovat C, C++, D, Windows, Pascal ja System.'}
+- {Annot: '', ID: 43, LastEd: '', Text: 'expected one or more base classes, not ''{0}''.'}
+- {Annot: '', ID: 44, LastEd: '', Text: base classes are not allowed in forward declarations.}
+- {Annot: '', ID: 45, LastEd: '', Text: 'dil v{0}
+
+    Copyright (c) 2007, Aziz Köksal. GPL3-lisensöity.
+
+
+    Alikomennot:
+
+    {1}
+
+    Lisäohjeita tietystä alitoiminnosta saa kirjoittamalla ''dil help <toiminto>''.
+
+
+    Käännetty {2}:n versiolla {3} {4}.'}
+- {Annot: '', ID: 46, LastEd: '', Text: "Luo XML- tai HTML-dokumentti D-lähdekoodista.\n\
+    Käyttö:\n  dil gen tiedosto.d [Valinnat]\n\nValinnat:\n  --syntax         : luo\
+    \ elementtejä syntaksipuun mukaisesti\n  --xml            : käytä XML-muotoa (oletus)\n\
+    \  --html           : käytä HTML-muotoa\n\nEsimerkki:\n  dil gen Parser.d --html\
+    \ --syntax > Parser.html"}
+- {Annot: '', ID: 47, LastEd: '', Text: ''}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/i18n/tr.cat	Tue Oct 30 18:12:01 2007 +0100
@@ -0,0 +1,74 @@
+Authors:
+- [Aziz Köksal, aziz.koeksal@gmail.com]
+LangCode: tr
+License: GPL3
+Messages:
+- {Annot: '', ID: 0, LastEd: '', Text: 'illegal karakter bulundu: ''{0}'''}
+- {Annot: '', ID: 1, LastEd: '', Text: geçersiz Unikod karakteri.}
+- {Annot: '', ID: 2, LastEd: '', Text: geçersiz UTF-8 serisi.}
+- {Annot: '', ID: 3, LastEd: '', Text: kapanmamış karakter sabiti.}
+- {Annot: '', ID: 4, LastEd: '', Text: boş karakter sabiti.}
+- {Annot: '', ID: 5, LastEd: '', Text: '''#'' karakter''den sonra ''line'' beklendi.'}
+- {Annot: '', ID: 6, LastEd: '', Text: '''#line''''den sonra rakam beklendi.'}
+- {Annot: '', ID: 7, LastEd: '', Text: filespec dizgisi beklendi (e.g. "yol\dosya".)}
+- {Annot: '', ID: 8, LastEd: '', Text: kapanmamış filespec dizgisi.}
+- {Annot: '', ID: 9, LastEd: '', Text: özel belirtici'den (special token) sonra yeni
+    bir satır beklendi.}
+- {Annot: '', ID: 10, LastEd: '', Text: kapanmamış çift tırnak dizgisi.}
+- {Annot: '', ID: 11, LastEd: '', Text: 'heks sayı olmayan karakter ''{0}'' heks dizgisi
+    içinde bulundu.'}
+- {Annot: '', ID: 12, LastEd: '', Text: heks dizginin içindeki sayılar çifter çifter
+    olmalıdır.}
+- {Annot: '', ID: 13, LastEd: '', Text: kapanmamış heks dizgisi.}
+- {Annot: '', ID: 14, LastEd: '', Text: kapanmamış blok açıklaması (/* */).}
+- {Annot: '', ID: 15, LastEd: '', Text: kapanmamış iç içe koyulabilen açıklaması (/+
+    +/).}
+- {Annot: '', ID: 16, LastEd: '', Text: kapanmamış çiğ dizgisi.}
+- {Annot: '', ID: 17, LastEd: '', Text: kapanmamış ters tırnak dizgisi.}
+- {Annot: '', ID: 18, LastEd: '', Text: 'tanımlanmamış çıkış serisi ''{0}'' bulundu.'}
+- {Annot: '', ID: 19, LastEd: '', Text: 'geçersiz Unikod çıkış serisi ''{0}'' bulundu.'}
+- {Annot: '', ID: 20, LastEd: '', Text: heksadesimal çıkış serisi sayıları yeterli
+    değil.}
+- {Annot: '', ID: 21, LastEd: '', Text: 'tanımlanmamış HTML varlık ''{0}'''}
+- {Annot: '', ID: 22, LastEd: '', Text: 'kapanmamış HTML varlık ''{0}''.'}
+- {Annot: '', ID: 23, LastEd: '', Text: HTML varlık bir harf ile başlamalı.}
+- {Annot: '', ID: 24, LastEd: '', Text: desimal rakamın bit işareti taşdı.}
+- {Annot: '', ID: 25, LastEd: '', Text: desimal rakam taşması.}
+- {Annot: '', ID: 26, LastEd: '', Text: heksadesimal rakam taşması.}
+- {Annot: '', ID: 27, LastEd: '', Text: binari rakam taşması.}
+- {Annot: '', ID: 28, LastEd: '', Text: oktal rakam taşması.}
+- {Annot: '', ID: 29, LastEd: '', Text: float rakam taşması.}
+- {Annot: '', ID: 30, LastEd: '', Text: 8 ve 9 sayılar oktal rakamlar'da geçersizdir.}
+- {Annot: '', ID: 31, LastEd: '', Text: geçersiz heks rakam; minimum bir heks sayı
+    gereklidir.}
+- {Annot: '', ID: 32, LastEd: '', Text: geçersiz binari rakam; minimum bir binari
+    sayı gereklidir.}
+- {Annot: '', ID: 33, LastEd: '', Text: bir heksadesimal float rakamın üsü gereklidir.}
+- {Annot: '', ID: 34, LastEd: '', Text: heksadesimal float üsler desimal sayı ile
+    başlamalı.}
+- {Annot: '', ID: 35, LastEd: '', Text: üsler desimal sayı ile başlamalı.}
+- {Annot: '', ID: 36, LastEd: '', Text: '''{0}'' beklendi, ama ''{1}'' bulundu.'}
+- {Annot: '', ID: 37, LastEd: '', Text: '''{0}'' lüzumsuz.'}
+- {Annot: '', ID: 38, LastEd: '', Text: şablon tuple parametre son sırada olmalı.}
+- {Annot: '', ID: 39, LastEd: '', Text: fonksiyonun 'in' kontratı daha önceden ayrıştırılmış.}
+- {Annot: '', ID: 40, LastEd: '', Text: fonksiyonun 'out' kontratı daha önceden ayrıştırılmış.}
+- {Annot: '', ID: 41, LastEd: '', Text: bağlantı tüp (linkage type) belirtilmedi.}
+- {Annot: '', ID: 42, LastEd: '', Text: 'bilinmeyen bağlantı tüpü (linkage type) ''{0}'';
+    geçerli olanlar C, C++, D, Windows, Pascal ve System.'}
+- {Annot: '', ID: 43, LastEd: '', Text: ''}
+- {Annot: '', ID: 44, LastEd: '', Text: ''}
+- {Annot: '', ID: 45, LastEd: '', Text: 'dil v{0}
+
+    Copyright (c) 2007, Aziz Köksal. Lisans GPL3.
+
+
+    Komutlar: {1} Belirli komut''a yardım edinmek için ''dil help <komut>'' yazınız.
+
+
+    Bu yazılım {2} v{3} ile {4} tarihinde derletilmiş.'}
+- {Annot: '', ID: 46, LastEd: '', Text: "Bir D kaynak kodundan XML veya HTML dosyası\
+    \ oluştur.\nKullanım:\n  dil gen dosya.d [Seçenekler]\n\nSeçenekler:\n  --syntax\
+    \         : söz dizimi için etiketler yazdır\n  --xml            : XML biçimi\
+    \ kullan (varsayılır)\n  --html           : HTML biçimi kullan\n\nÖrnek:\n  dil\
+    \ gen Parser.d --html --syntax > Parser.html"}
+- {Annot: '', ID: 47, LastEd: '', Text: ''}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/translator/errors.py	Tue Oct 30 18:12:01 2007 +0100
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+# Author: Aziz Köksal
+# License: GPL2
+import exceptions
+
+class LoadingError(exceptions.Exception):
+  def __init__(self, msg):
+    self.msg = msg
+    return
+  def __str__(self):
+    return self.msg
--- a/trunk/src/translator/langfile.py	Tue Oct 30 16:58:17 2007 +0200
+++ b/trunk/src/translator/langfile.py	Tue Oct 30 18:12:01 2007 +0100
@@ -4,6 +4,14 @@
 import yaml
 from errors import LoadingError
 
+def newLangFile(langCode, authors, license):
+  return {
+    "LangCode":langCode,
+    "Authors":authors,
+    "License":license,
+    "Messages":[]
+  }
+
 class LangFile:
   def __init__(self, filePath):
     self.filePath = filePath
@@ -50,11 +58,3 @@
 
   def save(self):
     pass
-
-  def newLangFile(langCode, authors, license):
-    return {
-      "LangCode":langCode,
-      "Authors":authors,
-      "License":license,
-      "Messages":[]
-    }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/translator/make_uis.sh	Tue Oct 30 18:12:01 2007 +0100
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+for ui_file in *.ui; do
+  echo $ui_file \> ui_`basename $ui_file .ui`.py
+  pyuic4 $ui_file > ui_`basename $ui_file .ui`.py
+done
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/translator/msg_form.ui	Tue Oct 30 18:12:01 2007 +0100
@@ -0,0 +1,101 @@
+<ui version="4.0" >
+ <class>MsgForm</class>
+ <widget class="QWidget" name="MsgForm" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>456</width>
+    <height>512</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" >
+   <item>
+    <widget class="QSplitter" name="splitter" >
+     <property name="orientation" >
+      <enum>Qt::Vertical</enum>
+     </property>
+     <widget class="QWidget" name="layoutWidget" >
+      <layout class="QVBoxLayout" >
+       <item>
+        <widget class="QLabel" name="label" >
+         <property name="text" >
+          <string>Messages:</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QListWidget" name="listWidget" />
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="" >
+      <layout class="QGridLayout" >
+       <item row="0" column="0" >
+        <layout class="QVBoxLayout" >
+         <item>
+          <widget class="QLabel" name="label_2" >
+           <property name="text" >
+            <string>Source string:</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QTextEdit" name="sourceEdit" />
+         </item>
+        </layout>
+       </item>
+       <item row="0" column="1" >
+        <layout class="QVBoxLayout" >
+         <item>
+          <widget class="QLabel" name="label_3" >
+           <property name="text" >
+            <string>Source annotation:</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QTextEdit" name="sourceAnnotEdit" />
+         </item>
+        </layout>
+       </item>
+       <item row="1" column="0" >
+        <layout class="QVBoxLayout" >
+         <item>
+          <widget class="QLabel" name="label_4" >
+           <property name="text" >
+            <string>Translation:</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QTextEdit" name="destEdit" />
+         </item>
+        </layout>
+       </item>
+       <item row="1" column="1" >
+        <layout class="QVBoxLayout" >
+         <item>
+          <widget class="QLabel" name="label_5" >
+           <property name="text" >
+            <string>Translator's annotation:</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QTextEdit" name="destAnnotEdit" />
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
--- a/trunk/src/translator/project.py	Tue Oct 30 16:58:17 2007 +0200
+++ b/trunk/src/translator/project.py	Tue Oct 30 18:12:01 2007 +0100
@@ -7,6 +7,16 @@
 import datetime
 import yaml
 
+def newProjectData(projectName):
+  return {
+    "Name":projectName,
+    "LangFiles":[],
+    "SourceLangFile":'',
+    "MsgIDs":[],
+    "CreationDate":str(datetime.datetime.utcnow()),
+    "BuildScript":''
+  }
+
 class Project:
   # Members:
   # name
@@ -27,6 +37,7 @@
       self.langFilePaths = list(doc["LangFiles"])
       self.msgIDs = list(doc["MsgIDs"])
       self.creationDate = str(doc["CreationDate"])
+      self.buildScript = str(doc["BuildScript"])
     except KeyError, e:
       raise LoadingError("Missing member '%s' in '%s'" % (e.message, projectPath))
 
@@ -49,6 +60,7 @@
     self.langFiles = []
     for filePath in self.langFilePaths:
       if not os.path.exists(filePath):
+        # Look in project directory.
         projectDir = os.path.dirname(projectPath)
         filePath2 = os.path.join(projectDir, filePath)
         if not os.path.exists(filePath2):
@@ -62,13 +74,3 @@
 
   def save(self):
     pass
-
-  def newProjectData(projectName):
-    return {
-      "Name":projectName,
-      "LangFiles":[],
-      "SourceLangFile":'',
-      "MsgIDs":[],
-      "CreationDate":str(datetime.datetime.utcnow())
-    }
-
--- a/trunk/src/translator/translator.py	Tue Oct 30 16:58:17 2007 +0200
+++ b/trunk/src/translator/translator.py	Tue Oct 30 18:12:01 2007 +0100
@@ -11,12 +11,14 @@
 from ui_about import Ui_AboutDialog
 from ui_new_project import Ui_NewProjectDialog
 from ui_project_properties import Ui_ProjectProperties
+from ui_msg_form import Ui_MsgForm
 
-from project import Project
+from project import Project, newProjectData
 
 g_scriptDir = sys.path[0]
 g_CWD = os.getcwd()
 g_projectExt = ".tproj"
+g_catExt = ".cat"
 g_settingsFile = os.path.join(g_scriptDir, "settings.yaml")
 g_settings = {}
 
@@ -28,12 +30,19 @@
     self.project = None
     # Modifications
     self.disableMenuItems()
+    self.projectDock = QtGui.QDockWidget("Project", self)
+    self.projectTree = ProjectTree(self)
+    self.projectDock.setWidget(self.projectTree)
+    self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.projectDock)
     # Custom connections
     QtCore.QObject.connect(self.action_About, QtCore.SIGNAL("triggered()"), self.showAboutDialog)
     QtCore.QObject.connect(self.action_New_Project, QtCore.SIGNAL("triggered()"), self.createNewProject)
     QtCore.QObject.connect(self.action_Open_Project, QtCore.SIGNAL("triggered()"), self.openProjectAction)
     QtCore.QObject.connect(self.action_Close_Project, QtCore.SIGNAL("triggered()"), self.closeProject)
     QtCore.QObject.connect(self.action_Properties, QtCore.SIGNAL("triggered()"), self.showProjectProperties)
+    QtCore.QObject.connect(self.action_Add_Catalogue, QtCore.SIGNAL("triggered()"), self.addCatalogue)
+    QtCore.QObject.connect(self.action_Add_New_Catalogue, QtCore.SIGNAL("triggered()"), self.addNewCatalogue)
+    QtCore.QObject.connect(self.projectTree, QtCore.SIGNAL("currentItemChanged (QTreeWidgetItem *,QTreeWidgetItem *)"), self.projectTreeItemChanged)
 
     self.readSettings()
 
@@ -48,14 +57,20 @@
     dialog.exec_()
 
   def createNewProject(self):
-    NewProjectDialog().exec_()
+    if self.cantCloseProjectIfOpen():
+      return
+    dialog = NewProjectDialog()
+    code = dialog.exec_()
+    if code == QtGui.QDialog.Accepted:
+      self.openProject(str(dialog.projectFilePath.text()))
 
   def openProjectAction(self):
-    if self.closeProjectIfOpen():
+    if self.cantCloseProjectIfOpen():
       return
     filePath = QtGui.QFileDialog.getOpenFileName(self, "Select Project File", g_CWD, "Translator Project (*%s)" % g_projectExt);
+    filePath = str(filePath)
     if filePath:
-      self.openProject(str(filePath))
+      self.openProject(filePath)
 
   def openProject(self, filePath):
     from errors import LoadingError
@@ -65,11 +80,16 @@
       QtGui.QMessageBox.critical(self, "Error", u"Couldn't load project file:\n\n"+str(e))
       return
     self.enableMenuItems()
-    self.projectTree = ProjectTree(self)
     self.projectTree.setProject(self.project)
-    self.vboxlayout.addWidget(self.projectTree)
+
+  def addCatalogue(self):
+    filePath = QtGui.QFileDialog.getOpenFileName(self, "Select Project File", g_CWD, "Catalogue (*%s)" % g_catExt);
+    filePath = str(filePath)
 
-  def closeProjectIfOpen(self):
+  def addNewCatalogue(self):
+    pass
+
+  def cantCloseProjectIfOpen(self):
     if self.project == None:
       return False
     return self.closeProject()
@@ -85,8 +105,7 @@
     del self.project
     self.project = None
     self.disableMenuItems()
-    self.vboxlayout.removeWidget(self.projectTree)
-    self.projectTree.close()
+    self.projectTree.clear()
     return True
 
   def enableMenuItems(self):
@@ -97,6 +116,13 @@
     self.action_Close_Project.setEnabled(False)
     self.menubar.removeAction(self.menu_Project.menuAction())
 
+  def projectTreeItemChanged(self, item, column):
+    if item == None:
+      return
+    # TODO: set centralwidget to the form corresponding to the item.
+    if isinstance(item, LangFileItem):
+      print "LangFileItem"
+
   def closeEvent(self, event):
     if self.closeProject() == False:
       event.ignore()
@@ -139,6 +165,11 @@
     }
     yaml.dump(g_settings, open(g_settingsFile, "w")) #default_flow_style=False
 
+class MsgForm(QtGui.QWidget, Ui_MsgForm):
+  def __init__(self):
+    QtGui.QWidget.__init__(self)
+    self.setupUi(self)
+
 class MsgIDItem(QtGui.QTreeWidgetItem):
   def __init__(self, parent, text):
     QtGui.QTreeWidgetItem.__init__(self, parent, [text])
@@ -152,22 +183,28 @@
     QtGui.QTreeWidget.__init__(self, parent)
     self.topItem = None
     self.msgIDsItem = None
+    self.headerItem().setHidden(True)
 
   def setProject(self, project):
-   self.project = project
+    self.project = project
 
-   self.topItem = QtGui.QTreeWidgetItem([self.project.name])
-   self.addTopLevelItem(self.topItem)
+    self.topItem = QtGui.QTreeWidgetItem([self.project.name])
+    self.addTopLevelItem(self.topItem)
+
+    for langFile in self.project.langFiles:
+      langFileItem = LangFileItem(self.topItem, langFile.langCode)
 
-   self.msgIDsItem = QtGui.QTreeWidgetItem(self.topItem, ["Message IDs"])
-   for msgID in self.project.msgIDs:
-     MsgIDItem(self.msgIDsItem, msgID["Name"])
+    self.msgIDsItem = QtGui.QTreeWidgetItem(self.topItem, ["Message IDs"])
+    for msgID in self.project.msgIDs:
+      MsgIDItem(self.msgIDsItem, msgID["Name"])
 
-   for langFile in self.project.langFiles:
-     langFileItem = LangFileItem(self.topItem, langFile.langCode)
+    for x in [self.topItem, self.msgIDsItem]:
+      x.setExpanded(True)
 
-   for x in [self.topItem, self.msgIDsItem]:
-     x.setExpanded(True)
+  def clear(self):
+    self.topItem = None
+    self.msgIDsItem = None
+    QtGui.QTreeWidget.clear(self)
 
 class NewProjectDialog(QtGui.QDialog, Ui_NewProjectDialog):
   def __init__(self):
@@ -196,7 +233,7 @@
       QtGui.QMessageBox.warning(self, "Warning", "Please, choose or enter a path for the project file.")
       return
 
-    projectData = Project.newProjectData(projectName)
+    projectData = newProjectData(projectName)
 
     if os.path.splitext(filePath)[1] != g_projectExt:
       filePath += g_projectExt
--- a/trunk/src/translator/translator.ui	Tue Oct 30 16:58:17 2007 +0200
+++ b/trunk/src/translator/translator.ui	Tue Oct 30 18:12:01 2007 +0100
@@ -45,6 +45,7 @@
      <string>&amp;Project</string>
     </property>
     <addaction name="action_Add_Catalogue" />
+    <addaction name="action_Add_New_Catalogue" />
     <addaction name="action_Build_Project" />
     <addaction name="separator" />
     <addaction name="action_Properties" />
@@ -77,7 +78,7 @@
   </action>
   <action name="action_Add_Catalogue" >
    <property name="text" >
-    <string>&amp;Add catalogue</string>
+    <string>&amp;Add catalogue...</string>
    </property>
   </action>
   <action name="action_Properties" >
@@ -106,6 +107,11 @@
     <string>Ctrl+W</string>
    </property>
   </action>
+  <action name="action_Add_New_Catalogue" >
+   <property name="text" >
+    <string>Add new catalogue...</string>
+   </property>
+  </action>
  </widget>
  <resources/>
  <connections>
--- a/trunk/src/translator/ui_about.py	Tue Oct 30 16:58:17 2007 +0200
+++ b/trunk/src/translator/ui_about.py	Tue Oct 30 18:12:01 2007 +0100
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'about.ui'
 #
-# Created: Thu Oct 11 13:54:26 2007
+# Created: Sun Oct 21 17:33:29 2007
 #      by: PyQt4 UI code generator 4.1
 #
 # WARNING! All changes made in this file will be lost!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/translator/ui_msg_form.py	Tue Oct 30 18:12:01 2007 +0100
@@ -0,0 +1,104 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'msg_form.ui'
+#
+# Created: Sun Oct 21 17:33:29 2007
+#      by: PyQt4 UI code generator 4.1
+#
+# WARNING! All changes made in this file will be lost!
+
+import sys
+from PyQt4 import QtCore, QtGui
+
+class Ui_MsgForm(object):
+    def setupUi(self, MsgForm):
+        MsgForm.setObjectName("MsgForm")
+        MsgForm.resize(QtCore.QSize(QtCore.QRect(0,0,456,512).size()).expandedTo(MsgForm.minimumSizeHint()))
+
+        self.vboxlayout = QtGui.QVBoxLayout(MsgForm)
+        self.vboxlayout.setObjectName("vboxlayout")
+
+        self.splitter = QtGui.QSplitter(MsgForm)
+        self.splitter.setOrientation(QtCore.Qt.Vertical)
+        self.splitter.setObjectName("splitter")
+
+        self.layoutWidget = QtGui.QWidget(self.splitter)
+        self.layoutWidget.setObjectName("layoutWidget")
+
+        self.vboxlayout1 = QtGui.QVBoxLayout(self.layoutWidget)
+        self.vboxlayout1.setObjectName("vboxlayout1")
+
+        self.label = QtGui.QLabel(self.layoutWidget)
+        self.label.setObjectName("label")
+        self.vboxlayout1.addWidget(self.label)
+
+        self.listWidget = QtGui.QListWidget(self.layoutWidget)
+        self.listWidget.setObjectName("listWidget")
+        self.vboxlayout1.addWidget(self.listWidget)
+
+        self.widget = QtGui.QWidget(self.splitter)
+        self.widget.setObjectName("widget")
+
+        self.gridlayout = QtGui.QGridLayout(self.widget)
+        self.gridlayout.setObjectName("gridlayout")
+
+        self.vboxlayout2 = QtGui.QVBoxLayout()
+        self.vboxlayout2.setObjectName("vboxlayout2")
+
+        self.label_2 = QtGui.QLabel(self.widget)
+        self.label_2.setObjectName("label_2")
+        self.vboxlayout2.addWidget(self.label_2)
+
+        self.sourceEdit = QtGui.QTextEdit(self.widget)
+        self.sourceEdit.setObjectName("sourceEdit")
+        self.vboxlayout2.addWidget(self.sourceEdit)
+        self.gridlayout.addLayout(self.vboxlayout2,0,0,1,1)
+
+        self.vboxlayout3 = QtGui.QVBoxLayout()
+        self.vboxlayout3.setObjectName("vboxlayout3")
+
+        self.label_3 = QtGui.QLabel(self.widget)
+        self.label_3.setObjectName("label_3")
+        self.vboxlayout3.addWidget(self.label_3)
+
+        self.sourceAnnotEdit = QtGui.QTextEdit(self.widget)
+        self.sourceAnnotEdit.setObjectName("sourceAnnotEdit")
+        self.vboxlayout3.addWidget(self.sourceAnnotEdit)
+        self.gridlayout.addLayout(self.vboxlayout3,0,1,1,1)
+
+        self.vboxlayout4 = QtGui.QVBoxLayout()
+        self.vboxlayout4.setObjectName("vboxlayout4")
+
+        self.label_4 = QtGui.QLabel(self.widget)
+        self.label_4.setObjectName("label_4")
+        self.vboxlayout4.addWidget(self.label_4)
+
+        self.destEdit = QtGui.QTextEdit(self.widget)
+        self.destEdit.setObjectName("destEdit")
+        self.vboxlayout4.addWidget(self.destEdit)
+        self.gridlayout.addLayout(self.vboxlayout4,1,0,1,1)
+
+        self.vboxlayout5 = QtGui.QVBoxLayout()
+        self.vboxlayout5.setObjectName("vboxlayout5")
+
+        self.label_5 = QtGui.QLabel(self.widget)
+        self.label_5.setObjectName("label_5")
+        self.vboxlayout5.addWidget(self.label_5)
+
+        self.destAnnotEdit = QtGui.QTextEdit(self.widget)
+        self.destAnnotEdit.setObjectName("destAnnotEdit")
+        self.vboxlayout5.addWidget(self.destAnnotEdit)
+        self.gridlayout.addLayout(self.vboxlayout5,1,1,1,1)
+        self.vboxlayout.addWidget(self.splitter)
+
+        self.retranslateUi(MsgForm)
+        QtCore.QMetaObject.connectSlotsByName(MsgForm)
+
+    def retranslateUi(self, MsgForm):
+        MsgForm.setWindowTitle(QtGui.QApplication.translate("MsgForm", "Form", None, QtGui.QApplication.UnicodeUTF8))
+        self.label.setText(QtGui.QApplication.translate("MsgForm", "Messages:", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_2.setText(QtGui.QApplication.translate("MsgForm", "Source string:", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_3.setText(QtGui.QApplication.translate("MsgForm", "Source annotation:", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_4.setText(QtGui.QApplication.translate("MsgForm", "Translation:", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_5.setText(QtGui.QApplication.translate("MsgForm", "Translator\'s annotation:", None, QtGui.QApplication.UnicodeUTF8))
+
--- a/trunk/src/translator/ui_new_project.py	Tue Oct 30 16:58:17 2007 +0200
+++ b/trunk/src/translator/ui_new_project.py	Tue Oct 30 18:12:01 2007 +0100
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'new_project.ui'
 #
-# Created: Thu Oct 11 21:16:07 2007
+# Created: Sun Oct 21 17:33:29 2007
 #      by: PyQt4 UI code generator 4.1
 #
 # WARNING! All changes made in this file will be lost!
--- a/trunk/src/translator/ui_project_properties.py	Tue Oct 30 16:58:17 2007 +0200
+++ b/trunk/src/translator/ui_project_properties.py	Tue Oct 30 18:12:01 2007 +0100
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'project_properties.ui'
 #
-# Created: Tue Oct 16 21:58:58 2007
+# Created: Sun Oct 21 17:33:29 2007
 #      by: PyQt4 UI code generator 4.1
 #
 # WARNING! All changes made in this file will be lost!
--- a/trunk/src/translator/ui_translator.py	Tue Oct 30 16:58:17 2007 +0200
+++ b/trunk/src/translator/ui_translator.py	Tue Oct 30 18:12:01 2007 +0100
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'translator.ui'
 #
-# Created: Sun Oct 14 13:11:43 2007
+# Created: Sun Oct 21 17:33:29 2007
 #      by: PyQt4 UI code generator 4.1
 #
 # WARNING! All changes made in this file will be lost!
@@ -63,6 +63,9 @@
 
         self.action_Close_Project = QtGui.QAction(MainWindow)
         self.action_Close_Project.setObjectName("action_Close_Project")
+
+        self.action_Add_New_Catalogue = QtGui.QAction(MainWindow)
+        self.action_Add_New_Catalogue.setObjectName("action_Add_New_Catalogue")
         self.menu_File.addAction(self.action_Open_Project)
         self.menu_File.addAction(self.action_New_Project)
         self.menu_File.addAction(self.action_Close_Project)
@@ -70,6 +73,7 @@
         self.menu_File.addAction(self.action_Quit)
         self.menu_Help.addAction(self.action_About)
         self.menu_Project.addAction(self.action_Add_Catalogue)
+        self.menu_Project.addAction(self.action_Add_New_Catalogue)
         self.menu_Project.addAction(self.action_Build_Project)
         self.menu_Project.addSeparator()
         self.menu_Project.addAction(self.action_Properties)
@@ -91,11 +95,12 @@
         self.action_About.setText(QtGui.QApplication.translate("MainWindow", "&About", None, QtGui.QApplication.UnicodeUTF8))
         self.action_New_Project.setText(QtGui.QApplication.translate("MainWindow", "&New Project...", None, QtGui.QApplication.UnicodeUTF8))
         self.action_New_Project.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+N", None, QtGui.QApplication.UnicodeUTF8))
-        self.action_Add_Catalogue.setText(QtGui.QApplication.translate("MainWindow", "&Add catalogue", None, QtGui.QApplication.UnicodeUTF8))
+        self.action_Add_Catalogue.setText(QtGui.QApplication.translate("MainWindow", "&Add catalogue...", None, QtGui.QApplication.UnicodeUTF8))
         self.action_Properties.setText(QtGui.QApplication.translate("MainWindow", "&Properties", None, QtGui.QApplication.UnicodeUTF8))
         self.action_Build_Project.setText(QtGui.QApplication.translate("MainWindow", "&Build Project", None, QtGui.QApplication.UnicodeUTF8))
         self.action_Open_Project.setText(QtGui.QApplication.translate("MainWindow", "&Open Project...", None, QtGui.QApplication.UnicodeUTF8))
         self.action_Open_Project.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+O", None, QtGui.QApplication.UnicodeUTF8))
         self.action_Close_Project.setText(QtGui.QApplication.translate("MainWindow", "&Close Project", None, QtGui.QApplication.UnicodeUTF8))
         self.action_Close_Project.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+W", None, QtGui.QApplication.UnicodeUTF8))
+        self.action_Add_New_Catalogue.setText(QtGui.QApplication.translate("MainWindow", "Add new catalogue...", None, QtGui.QApplication.UnicodeUTF8))